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:500500/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:500500/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(5002);  //清况 码5002就代表重定向

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