Java Web(一) Servlet详解!!

  • 时间:
  • 浏览:1
  • 来源:大发时时彩_时时彩单双计划_大发时时彩单双计划

    这篇文章到上一篇,距离的怪怪的遥远呀,隔了大慨有从前月把,顶端在家过了个年,哈哈~ 现在重新结速拾起。

                                        --WZY

一、那此是servlet?

    除理请求和发送响应的过程是由本身叫做Servlet的线程运行来完成的,否则Servlet是为了除理实现动态页面而衍生的东西。理解本身的前提是了解其他http协议的东西,否则知道B/S模式(浏览器/服务器)。

    B/S:浏览器/服务器。 浏览器通过网址来访问服务器,比如访问百度,在浏览器中输入www.baidu.com,本身如果浏览器就会显示百度的首页,这么本身具体的过程,步骤是要怎样的呢?本身就了解一下http请求和响应了

                  

    请求,响应:通过给的链接应该才能 知道这从前具体的内容

二、tomcat和servlet的关系

    Tomcat 是Web应用服务器,是从前Servlet/JSP容器. Tomcat 作为Servlet容器,负责除理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是本身运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品.

    从http协议中的请求和响应才能 得知,浏览器发出的请求是从前请求文本,而浏览器接收到的也应该是从前响应文本。否则在顶端本身图中,并问你是要怎样转变的,只知道浏览器发送过来的请求也什么都 request,大伙儿儿响应回去的就用response。忽略了其中的细节,现在就来探究一下。

              

      ①:Tomcat将http请求文本接收并解析,否则封装成HttpServletRequest类型的request对象,所有的HTTP头数据读才能 通过request对象调用对应的最好的措施查询到。

      ②:Tomcat同完会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就才能 控制要输出到浏览器的内容,否则将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

    Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种最好的措施,还定义了Servlet容器传送给Servlet的对象类,其中最重要的什么都 ServletRequest和ServletResponse。什么都 说大伙儿儿在编写servlet时,才能 实现Servlet接口,按照其规范进行操作。

三、编写Servlet

    在前面,大伙儿儿机会知道了servlet是那此,为那此才能 servlet?(为了实现动态网页,而都是显示静态网页,情况才能 百度查查),tomcat和servlet的关系?等问题 。现在来手动编写从前Servlet。

    3.1、手动编写servlet。

      1、创建从前MyServlet继承HttpServlet,重写doGet和doPost最好的措施,也什么都 看请求的最好的措施是get还是post,否则用不同的除理最好的措施来除理请求,

            

      2、在web.xml中配置MyServlet,为那此才能 配置?让浏览器发出的请求知道到达哪个servlet,也什么都 让tomcat将封装好的request找到对应的servlet让其使用。

            配置三个东西。

                

            配置如果,浏览器是要怎样通过大伙儿儿配置的信息来找到对应的servlet的。

                

            按照步骤,首先浏览器通过http://localhost:30003000/test01/MyServlet来找到web.xml中的url-pattern,这什么都 第一步,匹配到了url-pattern后,就会找到第二步servlet的名字MyServlet,知道了名字,就才能 通过servlet-name找到第三步,到了第三步,也就才能知道servlet的位置了。否则到其中找到对应的除理最好的措施进行除理。

       3、实验,验证顶端配置成功。

               

            

    3.2、利用向导新建MyServlet

        本身就相对简单了,web.xml无需大伙儿儿手动配置,工具直接帮大伙儿儿自动配置了

            1、右击项目,在new选项蕴含 直接新建servlet的选项

            2、配置MyServlet类中的信息

                

          3、配置web.xml中的servlet信息

                  

        4、查看MyServle01类中的代码和web.xml,其中的配置跟手动的配置是一样的,什么都 用图形化界面,让大伙儿儿更方便的创建servlet而产生的。

    3.3、详解创建servlet的原理

        1、servlet的生命周期是那此?

        2、为那此创建的servlet是继承自httpServlet,而都是直接实现Servlet接口?

        3、servlet的生命周期中,才能 看出,执行的是service最好的措施,为那此大伙儿儿就只才能 写doGet和doPost最好的措施呢?

        等本身系列的问题 ,大伙儿儿都应该知道,而不应该就单纯的知道要怎样配置和使用servlet?顶端的问题 ,一一来解答。

        1、servlet的生命周期是那此?

          服务器启动时(web.xml中配置load-on-startup=1,默认为0)机会第一次请求该servlet时,就会初始化从前Servlet对象,也什么都 会执行初始化最好的措施init(ServletConfig conf)

          该servlet对象去除理所有客户端请求,在service(ServletRequest req,ServletResponse res)最好的措施中执行

          最后服务器关闭时,才会销毁本身servlet对象,执行destroy()最好的措施。

              

        2、为那此创建的servlet是继承自httpServlet,而都是直接实现Servlet接口?

        3、servlet的生命周期中,才能 看出,执行的是service最好的措施,为那此大伙儿儿就只才能 写doGet和doPost最好的措施呢?

          查看源码,httpServlet的继承底部形态。

             httpServlet继承GenericServlet。懂的人立马就应该知道,GenericServlet(通用Servlet)的作用是那此?大慨的什么都 将实现Servlet接口的最好的措施,错综复杂编写servlet的步骤。具体下面详解

                

             GenericServlet的继承底部形态,实现了Servlet接口和ServletConfig接口,

                    

             Servlet接口内容

                  

                从这里才能 看多,Servlet生命周期的从前关键最好的措施,init、service、destroy。还有另外从前最好的措施,从前getServletConfig()最好的措施来获取ServletConfig对象,ServletConfig对象才能 获取到Servlet的其他信息,ServletName、ServletContext、InitParameter、InitParameterNames、通过查看ServletConfig本身接口就才能 知道

             ServletConfig接口内容

                 

                其中ServletContext对象是servlet上下文对象,功能有什么都 ,获得了ServletContext对象,就能获取大每段大伙儿儿才能 的信息,比如获取servlet的路径,等最好的措施。

               到此,就知道了Servlet接口中的内容和作用,总结起来什么都 ,从前生命周期运行的最好的措施,获取ServletConfig,而通过ServletConfig又才能 获取到ServletContext。而GenericServlet实现了Servlet接口后,也什么都 明大伙儿儿才能 直接继承GenericServlet,就才能 使用顶端大伙儿儿所介绍Servlet接口中的那十几次 最好的措施了,能拿到ServletConfig,只是需要 拿到ServletContext,不过那样太麻烦,能才能 直接获取ServletContext,什么都 GenericServlet除了实现Servlet接口外,还实现了ServletConfig接口,那样,就才能 直接获取ServletContext了。

              GenericServlet类的内容详解

                     

                看上图,用红色框框起来的什么都 实现Servlet和ServletConfig接口所实现的最好的措施,有9个,这很正常,否则大伙儿儿才能 发现,init最好的措施有从前,从前是蕴含 参数ServletConfig的,从前与非 参的最好的措施,为那此从前设计?这里才能 知道其中做了那此事情,来看看这从前最好的措施分别做了那此事?

                init(ServletConfig config)

                      

                init()

                      

                从前成员变量config

                      

                getServletConfig()

                      

                通过这十几次 最好的措施一并来讲解,首先看init(ServletConfig config)最好的措施,机会能才能才能 init(ServletConfig config)蕴含 晒 ServletConfig对象,为了方便才能在其他地方才能直接使用ServletConfig对象,而不仅仅局限在init(ServletConfig config)最好的措施中,什么都 创建从前私有的成员变量config,在init(ServletConfig config)最好的措施中就将其赋值给config,否则通过getServletConfig()最好的措施就才能获取ServletConfig对象了,本身才能 理解,否则在init(ServletConfig config)中,158行,还调用了从前init()最好的措施,否则本身init()最好的措施是空的,那此读这么,这是为那此呢?本身愿因 是为了除理一件事情,当大伙儿儿才能 在init最好的措施中做其他别的事情,大伙儿儿想到的最好的措施什么都 继承GenericServlet否则重写了init(ServletConfig config)最好的措施,从前依赖,就破坏了从前在GenericServlet类中init(ServletConfig config)写的代码了,也什么都 在GenericServlet类中的成员变量config会老是是null,无法得到赋值,机会被重写了,就无需在执行GenericServlet中init(ServletConfig config)最好的措施中的代码。要想赋值,就才能 在重写的init(ServletConfig config)最好的措施中调用父类的init(ServletConfig config)最好的措施,也什么都 super.init(ServletConfig config),从前一来,就很不方便,怕有过完会忘了写这句代码,什么都 在GenericServlet类中增加从前init()最好的措施,如果才能 在init最好的措施中才能 初始化别的数据,只才能 重写init()本身最好的措施,而不才能 去覆盖init(ServletConfig config)本身最好的措施,从前设计,就好什么都 ,无需在管init(ServletConfig config)本身其中的内容了。什么都 用老是出现其他的问题 。

                service(ServletRequest req, ServletResponse res)

                      

                   从前抽象最好的措施,说明在GenericServlet类中并这么实现该内容,这么大伙儿儿想到的是,在它顶端肯定还有一层,也什么都 还有从前子类继承它,实现该最好的措施,什么都 让大伙儿儿当时人写的Servlet继承GenericServlet,才能 当时人写service最好的措施,那岂都是累死,否则大伙儿儿才能 看多,service最好的措施中的参数还是ServletRequest,ServletResponse。并这么跟http相关对象挂钩,什么都 大伙儿儿接着往下面看。

           HttpServlet类详解

               继承了GenericServlet类,通过大伙儿儿顶端的推测,本身类主要的功能肯定是实现service最好的措施的各种细节和设计。否则通过类名才能 知道,该类就跟http挂钩了。

                     

                关注service(HttpServletRequest req, HttpServletResponse resp)最好的措施和service(ServletRequest req, ServletResponse res)最好的措施。

                  service(ServletRequest req, ServletResponse res)最好的措施

                        

                    该最好的措施中就做一件事情,什么都 将ServletRequest和ServletResponse这从前对象强转为HttpServletRequest和HttpServletResponse对象。为那此能从前转?

                      首先要知道req、res是那此类型,通过打印System.out.println(req),才能 知道,req实际上的类型是org.apache.catalina.connector.RequestFacade                         Tomcat中的源码。

                        

                          

                    通过图才能 得知,req的继承底部形态:RequestFacade、httpServletRequest、ServletRequest,大伙儿儿知道本身req是ServletRequest,这么从继承底部形态上看,它只是需要 看成HttpServletRequest,只是需要 看成ServletRequest,什么都 强转为HttpServletRequest是才能 的,机会不明白,我举个例子,ArrayList、List、Object 本身,Object obj = new ArrayList();  List list = new ArrayList();  从前ArrayList对象才能 看成List对象, 只是需要 看成从前Object对象,现在obj是都是才能 堪称List对象呢?答案是才能 的,机会obj什么都 ArrayList对象,既然是ArrayList对象,这么就才能 看成是List对象。一样的道理,RequestFacade 对应 ArrayList、httpServleRequest对应 List、 ServletRequest 对应 Object。

                    转换为httpServletRequest和HttpServletResponse对象如果,在调用service(HttpServletRequest req, HttpServletResponse resp)最好的措施。

                service(HttpServletRequest req, HttpServletResponse resp)

                    本身最好的措施什么都 判断浏览器过来的请求最好的措施是哪种,每段的除理最好的措施不一样,大伙儿儿常用的什么都 get,post,否则,大伙儿儿除理的最好的措施机会有什么都 的内容,什么都 ,在该最好的措施内会将get,post等其他5种请求最好的措施提取出来,变成单个的最好的措施,否则大伙儿儿才能 编写servlet时,就才能 直接重写doGet机会doPost最好的措施就行了,而都是重写service最好的措施,更加有针对性。什么都 这里就回到了大伙儿儿顶端编写servlet时的情况,继承httpServlet,而假如重写从前最好的措施,从前doGet,从前doPost,虽然什么都 service最好的措施会调用这从前最好的措施中的从前(看请求最好的措施)。什么都 也就解答了大伙儿儿一结速提的问题 3。  

四、十几次 重点的对象。ServletConfig、ServletContext,request、response

       讲解四大类,ServletConfig对象,ServletContext对象、request对象,response对象

    ServletConfig对象

        获取途径:getServletConfig(); 

        功能:顶端大慨提及了一下,能得到三个东西,

              

            getServletName();  //获取servlet的名称,也什么都 大伙儿儿在web.xml中配置的servlet-name

            getServletContext(); //获取ServletContext对象,该对象的作用看下面讲解

            getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。本身获取的什么都 在该servlet下的初始化参数

                

             getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也什么都 key值,才能 通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型

                

                

                

           注意:在顶端大伙儿儿所分析的源码过程中,大伙儿儿就知道,虽然才能 无需先获得ServletConfig,否则在获取其各种参数,才能 直接使用其最好的措施,比如顶端大伙儿儿用的ServletConfig().getServletName();才能 直接写成getServletName();而无需在先获取ServletConfig();了,愿因 什么都 在GenericServlet中,机会帮大伙儿儿获取了那此数据,大伙儿儿只才能 直接拿就行。

      ServletContext对象

           获取途径:getServletContext(); 、getServletConfig().getServletContext();  //这本身获取最好的措施的区别就跟顶端的解释一样,第本身是直接拿,在GenericServlet中机会帮大伙儿儿用getServletConfig().getServletContext();拿到了ServletContext。大伙儿儿只才能 直接获取就行了,第二种就大慨大伙儿儿当时人在获取一遍,本身读是一样的。

           功能:tomcat为每个web项目都创建从前ServletContext实例,tomcat在启动时创建,服务器关闭时销毁,在从前web项目中共享数据,管理web项目资源,为整个web配置公共信息等,通俗点讲,什么都 从前web项目,就占据 从前ServletContext实例,每个Servlet读才能 访问到它。

              1、web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

                  setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到

                  getAttribute(String name) 通过指定名称获得内容

                  removeAttribute(String name) 通过指定名称移除内容   

                   

                     

                    

              2、整个web项目初始化参数 //本身什么都 全局初始化参数,每个Servlet中都能获取到该初始化值

                  getInitPatameter(String name)  //通过指定名称获取初始化值

                  getInitParameterNames()  //获得枚举类型

                   web.xml 配置 整个web项目的初始化

                      

                      

                      

              3、获取web项目资源

                  3.1获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")

                    

                    

                  3.2获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)

                    前提知识:才能 了解流。问你的才能 去看看IO流总结的文章

                    

                    输出内容截图一每段

                    

               4、getResourcePaths(java.lang.String path)  指定路径下的所有内容。

                    

                    

                    

                5还有什么都 别的最好的措施,暂时用到的就这十几次 了,如果才能 在用的,就查看源码,看API。

      request对象

          大伙儿儿知道,request什么都 将请求文本封装而成的对象,什么都 通过request能获得请求文本中的所有内容,请求头、请求体、请求行 。

                

            1、请求行内容的获取。

              

              

                

            2请求头的获取

                随便百度从前东西,否则查看的请求头,包括以下那此内容,稍作了解。

                

                String getHeader(java.lang.String name) 获得指定头内容String【】

                  

                  

                long getDateHeader(java.lang.String name) 获得指定头内容Date

                int getIntHeader(java.lang.String name)  获得指定头内容int

                Enumeration getHeaders(java.lang.String name) 获得指定名称所有内容

            3请求体的获取 -- 请求参数的获取

               分本身,本身get请求,本身post请求

               get请求参数:http://localhost:30003000/test01/MyServlet?username=jack&password=1234

               post请求参数: <form method="post"><input type="text" name="username">

                String request.getParameter(String) 获得指定名称,从前请求参数值。

                String[] request.getParameterValues(String) 获得指定名称,所有请求参数值。相似:checkbox、select等

                Map<String , String[]> request.getParameterMap() 获得所有的请求参数  

            4请求转发

                request.getRequestDispatcher(String path).forward(request,response);  //path:转发后跳转的页面,这里不管用无需"/"开头,都是以web项目根结速,机会这是请求转发,请求转发只局限与在同从前web项目下使用,什么都 这里老是都是从web项目根下结速的,

                web项目根:

                    开发:G:\Workspaces\test01\WebRoot\..

                    运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\test01\..

                 web站点根:

                    运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\..

                从这里才能 看出,web项目根什么都 从该web项目名结速,什么都 大伙儿儿请求转发时,只才能 接着项目名顶端才能 访问的路径写就行了,

                特点:浏览器中url无需改变,也什么都 浏览器问你服务器做了那此,是服务器帮大伙儿儿跳转页面的,否则在转发后的页面,才能继续使用从前的request,机会是从前的request,什么都 request域中的属性才能 继续获取到。

      response对象

          

        常用的从前最好的措施:response.setHeader(java.lang.String name, java.lang.String value) 设置指定的头,一般常用。

             相似:设置每隔3秒就自动刷新一次,

              response.setHeader("Refresh",3);

              

              

              从前才能 看多现在时间的秒数,会发现每隔三秒就会自动刷新一次页面。

        本身最重要的从前什么都 重定向,其他的其他操作都被封装进去response对象中了,重点讲解重定向

          重定向(页面跳转)

            最好的措施一:手动方案

                response.setStatus(3002);  //情况码3002就代表重定向

                response.setHeader("location","http://www.baidu.com");

            最好的措施二:使用封装好的,通过response.sendRedirect("http://www.baidu.com");

          特点:服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起从前请求到另外从前页面,什么都 request是重新发起的,跟请求转发不一样。

            注意:response.sendRedirect(path);  //

            第本身:response.sendRedirect("/test01/MyServlet01");  //使用了"/"开头,说明是从web站点根结速,什么都 才能 写test01/MyServlet01

            第二种:response.sendRedirect("MyServlet01");  //这么使用"/"开头,说明是从web项目根结速,这么就无需写test01了。

            重定向这么任何局限,才能 重定向web项目内的任何路径,只是需要 访问别的web项目中的路径,否则这里就用"/"区分开来,机会使用了"/"开头,什么都 明我就重新结速定位了,不访问刚才的web项目,当时人写项目名,机会这么使用"/"结速,这么就知道是访问刚才那个web项目下的servlet,就才能 省略项目名了。什么都 从前来区别。

五、总结

      本身章节篇幅较长,不过理清什么都 知识点

          1、那此是servlet?机会编写servlet?

          2、分析了servlet的每段源码,知道了其中的其他设计巧妙的东西,比如,从前编写servlet是能看多其生命周期的,否则在其设计下,大伙儿儿只关注doGet和doPost最好的措施,为那此能从前呢?就才能 通过源码中得知。

          3、servlet的生命周期,web.xml的配置

          4、servlet中的ServletConfig对象,ServletContext对象,request对象,response对象的完整篇 讲解。包括其中的其他常用的最好的措施。

          5、下一篇讲解一下request、response的中文乱码问题 的除理