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

            配置两个东西。

                

            配置都可以 ,浏览器是如保通过大伙配置的信息来找到对应的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的中文乱码大大问题的处理