Java Web(一) Servlet详解!!

  • 时间:
  • 浏览:5

    这篇文章到上一篇,距离的有点遥远呀,隔了大慨有另另另一一三个小 月把,底下在家过了个年,哈哈~ 现在重新现在结速拾起。

                                        --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的中文乱码问题报告 的处里