Java Web(一) Servlet详解!!

  • 时间:
  • 浏览:0

    这篇文章到上一篇,距离的怪怪的遥远呀,隔了共要有三个 多月把,后边在家过了个年,哈哈~ 现在重新如果开始拾起。

                                        --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让其使用。

            配置3个东西。

                

            配置另三个 多,浏览器是咋样通过其他人配置的信息来找到对应的servlet的。

                

            按照步骤,首先浏览器通过http://localhost:10001000/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(); 

        功能:后边共要提及了一下,能得到3个东西,

              

            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:10001000/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(10002);  //情况表码10002就代表重定向

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