Java Web(一) Servlet详解!!

  • 时间:
  • 浏览:0
  • 来源:大发pk10_pk10在线注册平台_大发pk10在线注册平台

    这篇文章到上一篇,距离的有点儿遥远呀,隔了大概有三个小 月把,顶端在家过了个年,哈哈~ 现在重新结束了拾起。

                                        --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:100100/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:100100/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(1002);  //状况码1002就代表重定向

                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的中文乱码什么的什么的问题的正确处理