• Servlet基础知识


    web开发的背景知识(了解)


           (1)主机/终端

                特点:主机负责所有的业务运算和数据的管理,终端只提供操作界面。

    优点:可靠

    缺点:昂贵,维护困难

        (1)二层的c/s:

                      特点:使用数据库当服务器(数据库不仅要保存数据,还需要编写大量的业务处理逻辑,客户端

                   负责界面及部分的业务处理逻辑)。

             优点:开发方便

                      缺点:可移值性差(比如,要换数据库,就需要重新写一次业务处理逻辑,因为数据库的编程语

                   言是不一样的)。

                   另外,要求客户端跟数据库之间保持一个数据库连接,所以,不适合开发大型的应用(数

                   据库能够提供的数据库连接的个数是有限制的)。

             (2)三层的c/s: 客户端/服务器端程序

                      特点:数据库只负责管理数据,所有的业务逻辑写在应用服务器里面,客户端负责界面。

             优点:可移植性好,适合开发大型应用

                      缺点:客户端需要单独安装,开发相对比较复杂(需要开发通讯处理模块,需要自定义协议)。

             (3) b/s:

                      特点: 数据库只负责管理数据,所有的业务逻辑写在web服务器里面,客户端使用标准的浏览器。

                       其实,b/s架构从本质上讲,是一种标准化的c/s:即使用标准化的通讯协议(http协议),标

                   准化的客户端程序(浏览器),标准化的服务器(比如tomcat)。

                      优点:客户端不再需要安装,另外,开发相对简化(通讯模块不再需要开发了,也不再需要自定

                   义协议)。

    2、什么是Servlet?

    sun公司制订的一种用于扩展web服务器功能的组件规范。

        (1)扩展web服务器功能:

                 1)早期的web服务器(比如,apache ws,iis)只能够处理静态资源(即需要事先将html文件写好)的

                请求,不能够处理动态资源(需要依据用户的请求进行计算然后生成对应的html)的请求。

                 2)早期,可以使用cgi程序来扩展web服务器: cgi程序可以使用很多语言来开发,比如perl,c

                等等都可以,但是,cgi程序有几个问题(比如,开发复杂,可移植差,性能不是特别好,因

                为会启动过多的cgi进程)。

                 3)servlet也可以扩展web服务器(即动态生成页面)功能:

                        方案一:浏览器发请求给web服务器(比如,apache ws,iis,这些web服务器本身是不能够处理静

                       态资源的请求的),web服务器判断是否需要计算,如果需要,会调用servlet容器,servlet

                       容器再去调用servlet处理请求。

                        方案二 浏览器直接发请求给servlet容器(比如tomcat,jetty),因为servlet容器除了可以运行

                       servlet之外,同时,也可以充当简单的web服务器。

       (2)组件规范

                1)组件:

                       符合一定规范,实现部分功能的,并且可以部署在相应的容器里面运行的程序模块。

              servlet就是一个组件,我们在写servlet时,不需要考虑网络编程相关的问题,这些问题都由servlet

              容器(比如:tomcat)去解决。

                2)容器:

                       符合一定规范,为组件提供运行环境和相应的基础服务(比如网络服务)的程序。并且管理组件

              的生命周期程序。

                      servlet容器(比如,tomcat或者jboss)会提供servlet的运行环境。

    3、如何开发一个servlet?

           step1、写一个java类(servlet只能够使用java语言来开发),该类需要实现Servlet接口或者继承

               HttpServlet抽象类。

             step2、编译

             step3、打包

                               appname(应用名)

                                        WEB-INF

                                                 classes(.class文件)     

                                                 lib(可选, .jar文件)

                                                 web.xml(部署描述文件)

             step4、部署

                               将step3创建的整个文件夹拷贝到servlet容器特定的文件夹(webapps)下面。或者也可以

                  将整个文件夹先使用jar命令压缩成.war文件然后再拷贝。

             step5、访问

                               启动servlet容器(web服务器),在浏览器地址栏输入http://ip:port/appname/servlet-url其中,

                  servlet-url参见web.xml。

    4、tomcat的安装和简单的使用

    windows环境

    step1、将tomcat解压到D:/  路径:D:apache-tomcat-5.5.23

    step2、配置环境变量

       (1)JAVA_HOME(JDK的主目录) 必须配置

       (2)tomcat的主目录              可以不配置

       (3)tomcat的bin目录            可以不配置

                1)“我的电脑”右击“属性”,打开“系统属性”的“高级”选项卡,找到“环境变量”

           2)新建系统变量,或用户变量

              变量名为:JAVA_HOME  变量值为:JDK目录

    step3、启动 tomcat服务器

           进入启动tomcat的bin目录下,双击“startup.bat”(windows系统)

           关闭tomcat服务器

      双击stutdown.sh

    linux环境:

             step1、找到tomcat的压缩文件(比如/opt/apache-tomcat5.5.23.tar.gz),然后解压到/home/soft01。

               (也可以去www.apache.org去下载tomcat)

             step2、配置环境变量(大家现在可以不用配置)

                       cd /home/soft01

                       vi .bash_profile

                       在该文件当中,添加

                       JAVA_HOME: JDK的安装路径,比如/opt/java6.0

                       CATALINA_HOME: tomat的安装路径,比如 /home/soft01/apache-tomcat5.5.23

                       PATH:  /home/soft01/apache-tomcat5.5.23/bin

             step3、启动tomcat

                               cd /home/soft01/apache-tomcat5.5.23/bin

                               sh startup.sh (或者 sh catalina.sh run)

                               接下来,打开浏览器,输入:http://localhost:8080

             step4,关闭tomcat

                               cd /home/soft01/apache-tomcat5.5.23/bin

                               sh shutdown.sh

    tomcat的几个主要文件夹的作用

    1)bin: 是一些可执行文件(比如,启动和关闭tomcat)

    2)common: 放置可以被部署到该服务器上面的所有的程序都可以访问的jar文件。

    3)conf:服务器的配置文件。

    4)webapps:tomcat的部署文件夹。

    5、Servlet是如何运行的?

    比如,从浏览器地址栏输入http://ip:port/firstweb/sayHello

    (1) 浏览器依据ip,port建立与servlet容器之间的连接。

    (2) 浏览器将请求资源路径("/firstweb/sayHello")      及相关的参数打包(按照http协议)发送给容器。

    (3) 容器拆包,解析请求数据包,将解析之后的结果数据存放到一个request对象里面,同时还会

          创建一个response对象。

    (4) 容器依据请求资源路径找到Servlet的配置,然后创建对应的Servlet对象(这儿,会创建

               HelloServlet对象)。

    (5) 容器调用Servlet对象的service方法(会将step3创建好的request,response对象作为参数传递进

               来),可以在该方法里面,通过访问request对象的相应方法来获取参数值,也可以将处理结果写

               到response对象里。正因为有这样两个对象,Servlet不用考虑网络相关的问题(比如获取请求

               参数,就不用拆包,同样,将结果输出给浏览器,也不需要打包)。

    (6) servlet容器从response对象里面取出处理结果,然后打包,发送给浏览器。

    (7) 浏览器拆包,解析响应数据包,取出数据,生成相应的界面。

    6、使用eclipse开发Servlet程序

    HelloServlet.java

    public class HelloServlet extends HttpServlet{

    /* 覆盖(override)HttpServlet的service方法。

    * 服务器在创建好servlet对象之后,会调用该方法来处理请求。

            */

    public void service(HttpServletRequest request,

    HttpServletResponse response) throws ServletException,IOException{

                     System.out.println("service方法正在执行...");

    //1 读取请求参数 String name = request.getParameter("name");

    //2 处理请求 String rs = "<h1>" + "hello " + name + "</h1>";

    //3 生成响应

            1)生成一个消息头content-type,告诉 浏览器,返回的数据类型。

    response.setContentType("text/html;charset=utf-8");

    2)获得一个输出流

            PrintWriter out = response.getWriter();

            3)向流中输出数据,其实质是,将处理结果存放 到response对象上。

            out.println(rs);

     4)关闭流*

    out.close(); }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.4"

    xmlns="http://java.sun.com/xml/ns/j2ee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>

    <servlet-name>helloServlet</servlet-name>

    <!--servlet-class:一定要将类的完整的名称写出来 -->

    <servlet-class>web.HelloServlet</servlet-class>

                  </servlet>

                  <servlet-mapping>

    <servlet-name>helloServlet</servlet-name>

    <url-pattern>/sayHello</url-pattern>

                  </servlet-mapping>

    </web-app>

    7、常见错误及及解决方式

       (1)404

               a,错误的原因:请求资源路径写错。

               b,解决方式:检查请求资源路径。 http://ip:port/appname/servlet-url

             (2)500

                a,错误的原因:系统出错(程序出错或者是程序所运行的环境,比如数据库、网络等出现问题)。

                b,解决方式: 检查代码(包括配置文件),检查运行环境。

             (3)405

                a,错误的原因: 找不到service方法

                b,解决方式:检查方法的签名

    8、http协议(了解)

    (1)什么是http协议(超文本传输控制协议)?

       由w3c定义的一种应用层协议,用来定义浏览器与web服务器之间通讯的过程及数据的格式。

       1)、浏览器与服务器之间通讯的过程:

              step1、浏览器建立与服务器之间的连接

              step2、浏览器打包(按照http协议的要求),发送请求

              step3、服务器处理完请求,将数据打包,发送响应

              step4、服务器关闭连接

              特点: 一次请求,一次连接。

     优点:效率非常高,服务器可以尽可能的为更多的客户端(浏览器)服务。

       2)、数据的格式

              a、请求数据包

                 请求行

    请求方式 请求资源路径协议的类型和版本

                 若干消息头

    消息头是一些键值对,通信的双方都可以发送。比如,浏览器可以发送user-agent消息头告

    诉服务器浏览器的类型和版本。

    一般来说,一般由浏览器或者服务器自动生成,表示特定的含义。有些时候,需要编程生

    成一些消息头。

                 实体内容

    如果发送get请求,实体内容为空。

    只有发送post请求时,实体内容才会有数据(即请求参数值,比如nam=tom),如果是get请

    求,请求参数会添加到请求资源路径的后面。

              b、响应数据包

                 状态行

    协议的类型和版本 状态码 状态描述

                           状态码是一个3位数字,由w3c定义的,表示服务器处理请求的一种状态,比如:

                               404:依据请求资源路径,找不到对应的资源

                               500:系统出错

                               200:正常

                 若干消息头

    比如,服务器可以向浏览器发送一个content-type的消息头,告诉浏览器返回的数据类型以

    及编码格式。浏览器按照消息头的内容打开返回的数据。

    response.setContentType(“text/html”);  返回的是一个html页面,编码格式是ISO-8859-1

    response.setContentType(“text/html;charset=utf8”);返回的是一个html页面,编码格式是utf-8

                 实体内容

    程序处理的结果  

    9、get请求与post请求

           (1)哪一些情况下,浏览器发送get请求

                      a、直接在浏览器地址栏输入某个地址

                      b、点击链接

                      c、表单默认提交 

             (2)哪一些情况下,浏览器发送post请求

                      a、表单设置了method="post"。

             (3)get请求的特点

                      a、会将请求参数添加到请求资源路径的后面,因为请求行最多只能存放大约2K左右的数据,所

                以适合提交少量的数据给服务器。优点就是提交小数据时方便

                      b、请求参数会显示在浏览器地址栏,不安全(比如,路由器会记录这个地址)。

             (4)post请求的特点

                      a、会将请求参数添加到实体内容里面,能够提供大量的数据给服务器。

                      b、请求参数不会显示在浏览器地址栏,相对安全。

       要注意的是post方式并不会对请求参数加密(这里不安全)。

       比如:姓名、密码需要加密的,需要使用HTTPS协议。 (需要服务器端进行配置)

    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全。

    10、web编程中的编码问题

             1)常识:

                      a、java语言会将所有字符以unicode编码格式保存在内存里面。

                      b、编码:将以unicode编码格式对应的字节数组转换成某种本地编码格式(gbk,gb2312,utf-8)对应

                      的字节数组。    

                  c、解码:将某种本地编码格式对应的字节数组转换成unicode编码格式对应的字节数组。   

    //encode方法先进行编码,然后将得到字节数组转换成一个字符串。

                      String str = URLEncoder.encode("过儿","utf-8");  以utf-8格式编码

                      System.out.println(str);

                      String str2 = URLDecoder.decode(str,"utf-8");   以utf-8格式解码

                      System.out.println(str2);

                 

             2)servlet如何输出中文?

                (1)产生乱码问题的原因?

                         a、out.println(中文):(编码)

                         默认采用iso-8859-1编码格式进行编码,iso-8859-1,这个编码是不支持中文的。

                         b、服务器默认情况下,会发送一个content-type消息头,该消息头指定的编码是iso-8859-1,

                   浏览器会使用该编码格式打开页面。(解码)

           (2)解决方式

                         response.setContentType("text/html;charset=支持中文的某种编码");

                         该方法有两个作用:

                    作用1:编码

     out.println时,使用正确的编码格式进行编码(unicode -- >utf-8)。

                    作用2:解码

              生成一个消息头content-type,该消息头会指定一个编码,让浏览器以该编码来打开页面。

         

    11、表单处理

             (1)如何获得表单的参数值?

                      a、String request.getParameter(String paraName);

                         注意:

       1)如果paraName与实际传递的参数名称不一致,会返回null。

                                  2)在文本输入框中,如果不输入,会获得空字符串"",需要注意对""的处理。

                      b、String[] request.getParameterValues(String paraName);

                         注意:如果有多个请求参数名称相同,使用个方法。

                         比如: city=bj&city=wh&city=hz,应该request.getParameterValues("city");

       或者

                               <form action="/web01/first" method="post">

                                                 interst:cooking<input type="checkbox" value="cooking" name="interst"/>

                                                           finshing<input type="checkbox" value="fishing" name="interst"/>

                                                          <input type="submit" value="提交"/>

                    </form>

      服务器端:采用 request.getParameterValues("interstate");获得用户的选择 

             (2)表单中如果有中文参数,如何处理?

                      a、乱码问题产生的原因

                         浏览器会对表单中的中文参数按照打开该表单时编码格式来编码

                比如,浏览器按照utf-8打开页面,则使用utf-8对该表单的中文参数进行编码。服务器端,

                默认使用iso-8859-1去解码。

                      b、解决方式:

                               step1 在html文件当中,

    使用<meta http-equiv="content-type"content="text/html;charset=支持中文的编码">,让浏

    览器以规定的编码打开页面

    表单要采用post提交方式。

                               step2 服务器端使用指定的编码格式去解码。request.setCharacterEncoding(指定的编码);

     注意:只对post请求有效

    12、中文参数传递乱码问题?

          自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码

          1)对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果

             未设置,则使用默认的iso-8859-1编码。

          2)而GET请求则不同,Tomcat对GET请求并不会考虑使用request.setCharacterEncoding方法设置的编

             码,而会永远使用iso-8859-1编码,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。

     方法一:(只适合post请求)

        1)<meta http-equiv="content-type"content="text/html;charset=支持中文的编码">

        2)request.setCharacterEncoding(支持中文的编码)

      方法二:(get/post都适用)

    new String(str.getBytes(“iso-8859-1”),”支持中文的编码”);

           方法三:(get/post都适用)

    1)在传参数之前先把参数进行转码

                       java.net.URLEncoder.encode(param);

                           <a href="ds.jsp?url=

    <%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>"

                           点击这里

                       </a>   
                           2)取值时再转回中文

       java.net.URLDecoder.decode(param);

      方法四:(只有get适用)

    在你的Tomcat目录-->conf目录-->server.xml里找出这段:
          <Connector  port="8080" maxThreads="150" minSpareThreads="25"

              maxSpareThreads="75"
                   enableLookups="false" redirectPort="8443" acceptCount="100"
                   debug="0" connectionTimeout="20000"
                   disableUploadTimeout="true"
                      <!--在里边加上这个参数-->
                      URIEncoding="utf-8"
         />

    通知tomcat对于get请求中的参数不再使用iso-8859-1解码,而是使用utf-8进行

           注意url地址后如果有参数并且参数是中文,就只能用二三四方法

    13、重定向

    1)什么是重定向?

    服务器向浏览器发送一个状态码302及一个location消息头(值是一个地址,称之为重定向地址),

    浏览器收到后,会立即向 location所指向的地址发送请求。

    2)如何重定向

    response.sendRedirect(String url); 其中,url是重定向的地址。

    3)编程要注意的问题

                 a、重定向之前,不能够有out.close()或者out.flush()操作。(否则会报错)

       有out.close或者out.flus时,请求经处理后要把处理结果打包响应给浏览器。

       而response.sendRect也是对浏览器请求的响应,这样就造成了一次请求两次响应,不符合规范.

                 b、重定向之前,如果response对象缓存有数据,则这些数据会被清空。

       重定向后,只发送一个重定向地址,不会发送实体内容。所以response对象会清空。

       response对象里装的是返回给浏览器的实体内容。

    4)重定向的特点

                 重定向的地址是任意的

                 重定向之后,浏览器地址栏的地址变成了location所指定的地址

    14、将中文数据插入到数据库

               将数据插入数据库的过程是编码:内存中的编码是unicode。 

           插入数据库的过程数据从unicode编码再变成数据库的编码进行入库。

           从数据库中取出数据是解码。

           step1 要保证数据库正确地设置了字符集,即字符集必须支持中文

           step2 要保证jdbc驱动程序正确地进行了编码和解码。

                         jdbc:mysql://localhost:3306/jd1206db?useUnicode=true&characterEncoding=utf8

                         告诉jdbc驱动程序当前数据库的字符集。

                         因为某些版本的驱动程序不能够正确地获知数据库的字符集设置。        

    15、DAO

      DAO,封装了数据访问逻辑,调用者不需要了解底层的数据访问细节就可以实现数据访问。

      这样一来,当底层的数据访问细节发生改变,不会影响到调用者。

    如何写一个DAO?

    (1)实体类:为了方便处理数据库中的记录,可以定义与记录对应的实体类,即可以将数据库中的

                      某条记录转换成一个实体类的实例。

                      比如Employee类,提供id,name,salary,age属性及相关的get/set方法,我们可以将t_emp

                      表中的记录转化成一个Employee对象。

    (2)DAO接口:

    在DAO接口当中,声明对某个表的所有操作相关的方法。

    基本原则: 接口中声明的方法不要涉及任何具体的实现。

             比如:EmployeeDAO接口,

    声明了: public void save(Employee e) throws SQLException;

    这种方式不好,因为出现了jdbc的异常类,这就要求实现该方法只能使用jdbc。

    换一种方式来声明,更好

    public void save(Employee e) throws Exception;

    public List<Employee> findAll() throws Exception;

         (3)DAO实现类

              采用具体的技术实现DAO接口

              比如:使用jdbc实现EmployeeDAO接口,写一个类EmployeeDAOIdbcImpl。

         (4)DAO工厂(工厂模式)

             什么是设计模式:是为了解决一类相似的问题提出的解决方案。

                      工厂设计模式:工厂将对象的创建过程对外屏蔽,为调用者提供符合接口要求的对象(产品)。

                      比如:Connection conn = DriverManager.get...

    16、处理请求资源路径

    比如输入:  http://ip:port/appname/abc.html  

    servlet处理请求资源路径的步骤:

           step1、依据/appname查找该应用对应的文件夹(比如查找webapps下面的文件夹是否与其匹配)

      step2、在找到的文件夹下面,找到web.xml文件,然后使用<url-pattern>与/abc.html匹配。

             匹配规则:

    精确匹配:即要求<url-pattern>与/abc.html完全一致

    通配符匹配:使用“*”代表任意的字符串

            比如在<url-pattern>中使用/*表示任意字符串,/abc/*表示有abc的字符串

    后缀匹配:不能使用“/”开头,要求“*.任意的字符串”。

    比如:*.do要求以.do为结尾   *.action要求以.action

            step3、如果都不匹配,尝试查找/abc.html静态页面,如果找到,则返回该文件,找不到,则返回

                  404状态

    17、Servlet处理多种请求

     一个servlet如何处理多种请求?

     step1、使用后缀匹配模式。<url-pattern>*.do</url-pattern>

     step2、在service()方法里加入代码:

             获得请求资源路径:String url=request.getRequestURI();

             分析请求资源路径,来决定做何种处理

    //几种地址的比较 request的方法

    ServletPath:/image.jsp

    RequestURI:/elec_qin/image.jsp

    ContextPath:/elec_qin

    RequestURL:http://localhost:8080/elec_qin/image.jsp

    18、servlet生命周期相关核心接口与类

     

    Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。

    在javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。

    在javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。

    Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口。

    (1)Servlet接口

    在Servlet接口中定义了5个方法,

    void  init(ServletConfig config): 初始化

    void  service(ServletRequest req,ServletResponse res):

    void  destory():

    ServletConfig getServletCnifg();

    String getServletInfo();

    Servlet接口依赖于ServletRequest,ServletResponse,ServletConfig接口

    (2)ServletConfig接口

         用来访问初始化参数。

         当容器读取web.xml配置文件中<servlet>配置节信息,根据<servlet-class>配置节信息创建servlet

         对象,同时根据<init-param>配置节信息创建ServletConfig对象。然后调用init方法,把创建好的

         ServletConfig对象传给servlet对象。注意是servlet容器实现了ServletConfig接口。

    ServletConfig对象封装了初始化参数。定义了如下的方法:

    public abstract String getServletName();

    public abstract ServletContext getServletContext();

    public abstract String getInitParameter(String s);

    public abstract Enumeration getInitParameterNames();

     (2)GenericServlet抽象类

      GenericServlet实现了Servlet和ServletConfig接口。拥有了两个接口的所有方法。

      实现servlet接口中的部分方法,主要是实现了init,destroy方法。

      GenericServlet类的主要结构

           1)有一个属性:private  ServletConfig config;

           2)getServletCnifg()方法,获得容器创建好的Servletconfig对象

         public ServletConfig getServletConfig(){

    return this.config;

            }

    容器调用init方法时,将容器创建好的ServletConfig对象赋值给属性config。

    再通过调用getServletConfig方法得到ServletConfig对象。

           3)init方法()的实现

                  public void init(ServletConfig config)throw ServletException{

                          this.config=config;//把对象的引用通过属性保存下来

                          this.init();

     }

             //钩子方法,存在的意义就是被覆盖。当servlet要求有复杂的初始化步骤时,覆盖此方法

     public  void init()throws ServletException(){

    //什么都没有做

     }

      4)service方法没有实现,由子类实现

     public abstract void service(ServletRequest servletrequest, ServletResponse servletresponse)

      5)实现类destroy方法

                          public void destroy(){ }

      6)也实现了ServletConfig接口的getServletName,getServletContext,getInitParameter,

         getInitParameterNames。

         实现原理是在这些方法中调用了容器创建好的ServletConfig(属性config)中相应的方法

     (3)HttpServlet抽象类 

     继承了GenericServlet,主要实现了service方法

     定义doGet(),doPost(),doHead(),doPut(),doDelete(),doOptions()方法。

     根据请求方式来调用相应的doXXX方法。

     实现了GenericServlet的service方法。

     service方法的主要逻辑是根据请求来调用相应的doXXX方法。

     (4)ServletRequest与ServletResponse接口

     (5)HttpServletRequest与HttpServletResponse接口

          HttpServletRequest接口继承ServletRequest接口

          HttpServletResponse接口继承ServletResponse接口

     这些接口由servlet容器实现,在请求到达时创建request对象和response对象传入到service方法中。

     (6)整个过程

          1、Web客户向Servlet容器(Tomcat)发出Http请求

               2、Servlet容器分析客户的请求信息

               3、Servlet容器创建一个HttpRequest对象,将客户请求的信息封装到这个对象中

               4、Servlet容器创建一个HttpResponse对象

          5、Servlet容器调用HttpServlet对象的service方法,

             把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象

               6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

               7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

          8、Servlet容器把HttpServlet的响应结果传给Web客户

    19、servlet的生命周期

           所谓生命周期,指的是servlet容器如何创建servlet对象、如何初始化、如何调用servlet对象的方法来

          处理请求以及如何销毁servlet对象的整个过程。

     1实例化(就是创建servlet对象,调用构造器)

              a、什么是实例化?

    容器调用servlet的构造器,创建一个servlet对象。(new一个对象)

      b、什么时候实例化?

              1)当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。   

              2)容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有

                 load-on-starup配置。如果有,则会创建该servlet实例。

                 load-on-starup参数要求是一个>=0的整数,值越小,优先级越高(先被实例化)。

                   注意:servlet容器在默认情况下,对于每个servlet,只会创建一个实例。(单例模式)

     2)初始化

          a、什么是初始化?

             servlet容器在创建好servlet对象之后,会立即调用该对象的init方法。

          b、GenericServlet已经提供了init方法,一般情况下,我们不再需要写init方法了。

    GenericServlet提供的init方法是这样实现的:

    将容器提供的ServletConfig对象保存下来,并且提供了getServletConfig方法用来获得ServletConfig对象。

     c、servlet的初始化参数

        1)使用<init-param>来配置初始化参数

    <init-param>

    <param-name>company</param-name>

    <param-value>北京</param-value

    </init-param>

    2)调用ServletConfig对象的getInitParameter方法获得参数值

     d、如何实现自己的初始化方法?

    建议override init()方法

     e、init方法只会执行一次

     3)就绪/调用

              a、什么是就绪?

    servlet容器在收到请求之后,会调用servlet对象的service方法来处理请求。

      b、HttpServlet的service方法是如何实现的?

         依据请求方式(get/post)分别调用doGet/doPost方法。

             可以覆盖HttpServlet提供的doGet/doPost方法,也可以直接覆盖HttpServlet提供的service方法

     4)销毁

     a、什么是销毁?

        servlet容器依据自身的算法,在不再需要servlet对象时,会调用该对象的destroy方法,

        然后,再删除该对象。

        Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。

     b、GenericServlet已经实现了destroy方法。释放资源

     c,、该方法只会执行一次。

             在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。

    20、案例

                    1)产品计价

           发送请求:http://localhost:8088/web04_2/pricing.html

                pricing.html

                   <body style="font-size:30px;font-style:italic;">

                                                 <form action="pricing" method="post">

                                                          <fieldset>

                                                                   <legend>产品计价</legend>

                                                                   原始价格:<input name="basePrice"/><br/>

                                                                   出售城市:<select name="city" style="150px;">

                                                                                              <option value="bj">北京</option>

                                                                                              <option value="sh">上海</option>

                                                                                              <option value="cs">长沙</option>

                                                                                     </select><br/>

                                                                                     <input type="submit" value="确定"/>

                                                          </fieldset>

                                                 </form>

    </body>

      点击按钮发送请求:http://localhost:8088/web04_2/pricing

      配置文件web.xml

                                      <servlet>

                                               <servlet-name>pricingServlet</servlet-name>

                                               <servlet-class>web.PricingServlet</servlet-class>

                                               <init-param>

                                                        <param-name>taxRate</param-name>

                                                        <param-value>bj,0.08;sh,0.09;cs,0.03</param-value>

                                               </init-param>

                                      </servlet>

                                      <servlet-mapping>

                                               <servlet-name>pricingServlet</servlet-name>

                                               <url-pattern>/pricing</url-pattern>

           </servlet-mapping>

     类PricingServlet.java

                      public class PricingServlet extends HttpServlet{

                                                 private HashMap<String,Double> taxRates =

                                                                                                                         new HashMap<String,Double>();

                                                 public void service(HttpServletRequest request, HttpServletResponse response)

                                                                                                                throws ServletException, IOException {

                                                          response.setContentType("text/html;charset=utf-8");

                                                          PrintWriter out = response.getWriter();

                                                          double basePrice = Double.parseDouble(request.getParameter("basePrice"));

                                                          String city = request.getParameter("city");

                                                          double taxRate = taxRates.get(city);

                                                          double price = basePrice * ( 1 + taxRate);

                                                          out.println("实际售价:" + price);

                                                 }

                                               public void init() throws ServletException {

                                                          System.out.println("init...初始化,从配置文件中读取各个城市的利率");

                                                          ServletConfig config = getServletConfig();

                                                          //bj,0.08;sh,0.09;cs,0.03

                                                          String taxRate = config.getInitParameter("taxRate");

                                                          String[] strs = taxRate.split(";");

                                                          for(int i=0;i<strs.length;i++){

                                                                   String str = strs[i];  //bj,0.08

                                                                   String[] str1 = str.split(",");

                                                                   taxRates.put(str1[0], Double.parseDouble(str1[1]));

                                                          }

                                               }

    (2)servlet生命周期

    <servlet>

                                      <servlet-name>some</servlet-name>

                                      <servlet-class>web.SomeServlet</servlet-class>

                                      <!-- 初始化参数 -->

                                      <init-param>

                                               <param-name>company</param-name>

                                               <param-value>工商银行</param-value>

                                      </init-param>

                                      <init-param>

                                               <param-name>address</param-name>

                                               <param-value>北京上地</param-value>

                                      </init-param>

                                      <!-- 启动就加载 参数值越小,优先级越高 -->

                                      <load-on-startup>1</load-on-startup>

    </servlet>

    public class SomeServlet extends HttpServlet{

                                        public SomeServlet(){

                                                 System.out.println("SomeServlet's constructor...");

                                        }

                                      public void init() throws ServletException {

                                                 System.out.println("SomeServlet's init...");

                                       }

    public void service(HttpServletRequest request,       HttpServletResponse response)

                                                                                                                         throws ServletException,IOException{

                                                 System.out.println("SomeServlet's doGet...");���ServletConfig����

                                                 ServletConfig config = getServletConfig();

                                                 String company = config.getInitParameter("company");

                                                 System.out.println("company:" + company);

                                        }

                                      public void destroy() {

                                                System.out.println("SomeServlet's destroy...");

                                       }

       

       

     

  • 相关阅读:
    机器学习笔记—Logistic回归
    Python 数据处理----对定长数据的处理
    python从Microsoft Excel文件中导入数据
    python 处理CSV数据
    Android学习(十八)Toast的使用
    Android Studio 快捷键(转)
    Android学习(十六) 通过GestureOverlayView进行手势识别
    Android学习(十七)自定义View控件 TopBar
    Android学习(十六) 通过GestureDetector进行手势识别
    Android学习(十五) 系统服务
  • 原文地址:https://www.cnblogs.com/qin-derella/p/6747728.html
Copyright © 2020-2023  润新知