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:150150/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:150150/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(1502);  //情形码1502就代表重定向

                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的中文乱码问題的解决