zoukankan      html  css  js  c++  java
  • JSP/Servlet开发——第七章 Servel基础

    1、Servlet简介:

    Servlet是一个符合特定规范的 JAVA 程序 , 是一个基于JAVA技术的Web组件。

     ●Servlet允许在服务器端,Servlet容器所管理,用于处理客户端请求并做出响应。

         

    ●Servlet容器:Servlet容器也称为 Servlet引擎,是 WEB 服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务。

    ●管理和运行 Servlet/JSP的容器也称Web容器;

    ●Servlet容器、JSP 容器和 Web容器是同义的;

      ●Servlet主要用于生成动态的内容,他可以接受和处理请,求并动态生成 HTML 内容对客户端进行响应; 

        

    2、Servlet与 JSP 的关系:

    ●在使用JSP技术开发 WEB 程序时,我们所要做的是在 JSP 中写入 JAVA 代码,当服务器运行JSP时,将JSP转换成JAVA类并编译执行,动态获取数据生成 HTML 代码 , 最终显示在客户浏览器上。

           

     

    ●jsp和servlet的联系:

      ◆JSP 实际上是为了简化Servlet的开发而产生的,避免了编写繁杂的输出方法,更加适用于开发带有页面内容的表示层组件。

      ◆JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

    ●jsp和servlet的区别:

      1)、jsp经编译后就变成了Servlet.

          ★JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类;

      2)、jsp更擅长表现于页面显示(视图),servlet更擅长于逻辑控制(Servlet更多的是类似于一个Controller),用来做控制,

      3)、Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

      4)、Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

      5)、Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

      6)、Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容;JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容;

    ●Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差,JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的;

      ◆既然JSP和Servlet都有自身的适用环境,那么通过MVC双剑合璧能够扬长避短,让它们发挥各自的优势,MVC模式非常适合解决这一问题。

      ◆MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式:

        ★软件系统分为三个基本部分:

          ▲模型(Model):业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

          ▲视图(View):负责界面显示

          ▲控制器(Controller):负责转发请求,对请求进行处理

      ◆在JSP/Servlet开发的软件系统中,这三个部分的描述如下:

                   

        ▲Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)

        ▲Controller(Servlet)调用核心业务逻辑——Model部分,获得结果

        ▲Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容

        ▲动态生成的HTML内容返回到浏览器显示

      ◆MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。

    ●Servlet继承javax.servlet.http.HttpServlet类:

      eg

         

    分析:JSP 在运行时会被 Web容器译为一个Servlet,动态响应内容是通过运行这个Servlet类产生的,Servlet是 JAVA Web动态交互术的关键组件,也是 JSP 的技术基础,容器在运行 JSP 时,需要先将其内容翻译成 Servlet的语法,再按照Servlet的方式运行;

    ●Servlet体系结构:

         

    3、Servlet  API

    ●Servlet API包含在两个包内, javax. Servlet包中的类和接口是通用的不依赖协议的 Servlet API,包括 Servlet、ServletRequest、ServletResponse、ServletConfig、ServletContext接口及抽象类GenericServlet , javax.servlet.http包中的类和接口是用于支持 HTTP协议的Servlet API;

    ●Servlet接口:定义了所有Servlet需要实现的方法;

    方法名称

    功能描述

    public abstract void  init (ServletConfig  config)

    由 Servlet 容器调用,用于完成Servlet对象在处理客户请求前的初始化工作;

    public abstract void  service (ServletRequest  req,

                         ServletResponse  res)

    由 Servlet 容器调用,用来处理客户端的请求;

    public abstract  void  destroy ( )

    由 Servlet 容器调用,释放Servlet对象所使用的资源;

    public abstract ServletConfig getServletConfig ( )

    返回ServletConfig 对象,该对象包含此 Servlet 的初始化和启动参数。返回的 ServletConfig 对象是传递给 init( ) 方法的对象;

    public abstract String  getServletInfo ( )

    返回有关 Servlet 的信息,比如作者、版本和版权。返回的字符串是纯文本,而不是任何种类的标记(如 HTML、XML等);

    ●GenericServlet抽象类:提供了Servlet接口和ServletConfig接口,给出了方法的默认实现(service( )方法除外);定义了通用的、不依赖于协议的Servlet。

    方法名称

    功能描述

    public  void  init (ServletConfig  config )

    对Servlet接口中init(ServletConfig config)方法的实现,对ServletConfig实例进行了保存。此方法还有一个无参的重载方法,可用于子类中重写

    public  String  getInitParameter (String  name )

    返回web.xml中名称为name的初始化参数的值

    public  ServletContext getServletContext ( )

    返回ServletContext对象的引用

        ★通常只需要重写不带参的init()方法,如果重写init(ServletConfig  config)方法,则应包含super.init(config)代码;

      ★如果要编写一个通用的Servlet,只要继承自GenericServlet类,实现service()方法即可;

    ●HttpServlet抽象类:大多数的网络应用是通过 HTTP协议访问服务器资源的,因此我们编写的 Servlet大多也是应用于处理 HTTP协议的请求和响应。

      ★抽象类HttpServlet 继承自GenericServlet类,具有与GenericServlet类似的方法,并提供了与 HTTP相关的实现,支持对HTTP的POST、GET 等请求方式进行差异化处理;开发中,如果需要编写 Servlet,主要就是继承 HttpServlet 抽象;

    方法名称

    功能描述

    public  void  service (ServletRequest  req,

                          ServletResponse  res )

    对GenericServlet类中service()方法的实现,将请求分发给protected  void  service (HttpServletRequest  req,  HttpServletResponse  res )方法;

    protected  void  service (HttpServletRequest  req,

                          HttpServletResponse  res )

    接收HTTP 请求,并将它们分发给此类中定义的 doXXX( ) 方法

    protected  void  doXXX (HttpServletRequest  req,

                          HttpServletResponse  res )

    根据请求方式的不同分别调用的相应处理方法,如doGet()、doPost()等

      ★HttpServlet的service (HttpServletRequest  req,  HttpServletResponse  res )方法相当于一个分发器,可以根据请求方法的类型,调用相应的doXxx()方法。所以在编写Servlet时只需要根据应用的需要,重写doGet()或者doPost()方法即可;

    ●ServletConfig接口:Servlet容器使用ServletConfig在Servlet初始化过程中获取配置信息,一个Servlet只有一个ServletConfig对象;

    方法名称

    功能描述

    String  getInitParameter (String  name )

    获取web.xml中设置的以name命名的初始化参数值

    ServletContext  getServletContext( )

    返回Servlet的上下文对象引用

    ●ServletContext 接口:

      ★一个 ServtetContext接口的实例表示一个 Web 应用的上下文,Sewlet 使用 Servletontext 接口定义的方法与它的 Servlet 容器进行通信。JSP 内置对象application就是 ServletContext的实例。

      ★Servlet 容器厂商负责提供 ServletContext 接口的实现,容器在应用程序加载时创建ServletContext对象,ServletContext 对象被 Sefvlet 容器中的所有Sefvlet共享。

    方法名称

    功能描述

    public String  getInitParameter (String  name )

    获取名为name的系统范围的初始化参数值,系统范围的初始化参数可在部署描述符中使用<context-param>元素定义

    public void  setAttribute (String name,  Object object )

    设置名称为name的属性

    public Object  getAttribute (String  name )

    获取名称为name的属性

    public String  getRealPath (String  path )

    返回参数所代表目录的真实路径

    public void  log ( String  message )

    记录一般日志信息

    ■请求、响应相关接口:ServletRequest 和 HttpServletRequest 接口:

       

    ★ServletRequest 接口:当客户请求时,由 Servlet 容器创建 ServletRequest 对象用于封装客户的请求信息,这个对象将容器作为 service ( ) 方法的参数之一传递给 Servlet , Servlet 能够利用 ServletRequest 对象获取客户端请求数据。

      方法名称

    功能描述

    public abstract Object  getAttribute ( String name )

    获取名称为name的属性值

    public abstract void  setAttribute (String  name,  Object  object )

    在请求中保存名称为name的属性

    public abstract void  removeAttribute (String  name)

    清除请求中名字为name的属性

    public abstract String  getCharacterEncoding ( )

    返回请求体所使用的字符编码

    public abstract void  setCharacterEncoding (String charset )

    设置请求体的字符编码

    public abstract String  getParameter ( String  name )

    返回指定请求参数的值

    public abstract String[ ]  getParameterValues (String  name )

    返回指定请求参数的全部值

    RequestDispatcher getRequestDispatcher( String  path )

    返回指向指定路径的请求分发对象

    ★HttpServletRequest接口:HttpServletReqiest 位于 javax.servlet.http包中,继承自ServletRequest 接口,通过该接口同样可以获取请求中的参数。HttpServletRequest 接口除了继承了ServletRequest 接口中的方法,还增加了一些用于读取请求信息的方法;

    方法名称

    功能描述

    String  getContextPath( )

    返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分;

    Cookie[ ]  getCookies( )

    返回客户端在此次请求中发送的所有cookie对象;

    HttpSession  getSession( )

    返回和此次请求相关联的session,如果没有给客户端分配session,则创建一个新的session;

    String  getMethod( )

    返回此次请求所使用的HTTP方法的名字,如GET、POST;

    String  getHeader( String  name )

    返回指定的请求头信息;

    ■ServletResponse 和 HttpServletResponse 接口:

    ★ServletResponse接口:Servlet 容器在接收客户请求时,除了创建 ServletRequest 对象用于封装客户的请求信息外,还建了一个 ServletResponse 对象,用于封裝响应数据,并且同时将这两个对象一并作为参数传递给Servlet。Servlet利用ServletRequest 对象获取客户端的请求数据,经过处理后由 ServletResponse 对象发送响应数据;

    方法名称

    功能描述

    PrintWriter  getWriter ( )

    返回PrintWriter对象,用于向客户端发送文本

    String  getCharacterEncoding ( )

    返回在响应中发送的正文所使用的字符编码

    void  setCharacterEncoding (String charset )

    设置响应的字符编码

    void  setContentType ( String  type )

    设置发送到客户端的响应的内容类型,此时响应的状态属于尚未提交

    ★HttpServletResponse:与 HttpServletRequest 接口类似,HttpServletResponse 接口也继承自 ServletResponse 接口,用于客户端的请求执行响应。它除了具有ServletResponse接口的常用方法外、还增加了新的方法;

    方法名称

    功能描述

    void  addCookie ( Cookie  cookie )

    增加一个cookie到响应中,这个方法可多次调用,设置多个cookie

    void  addHeader ( String  name, String  value )

    将一个名称为name,值为value的响应报头添加到响应中

    void  sendRedirect(String  location)

    发送一个临时的重定向响应到客户端,以便客户端访问新的URL

    void  encodeURL ( String  url )

    使用session ID对用于重定向的URL进行编码

    4、Servlet的应用:

    创建Servlet

      继承HttpServlet

      重写doPost()或doGet()方法

     部署Servlet

      编译Servlet到/WEB-INF/classes目录

      编辑部署描述文件web.xml

          <servlet>

                <servlet-name> Servlet的名字</servlet-name>

                <servlet-class> Servlet 类的完全限定名</servlet-class>

           </servlet>

              <servlet-mapping>

                <servlet-name>给出 Servlet 的名字,必须与在< servlet >元素中声明的Servlet 名字相同</servlet-name>

                <url-pattern>指定 Servlet 的 URL</url-pattern>

              </servlet-mapping>

    启动Tomcat,访问Servlet

    ●创建Servlet:

    eg:创建一个用于获取用户名并向页面输出的Servlet;

    import java.io.IOException;

    import java.io.PrintWriter;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    public class HttpServletTest extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

            // 在Tomcat中配置URIEncoding解决GET方式的中文乱码,代码中不再做处理

            String uName = request.getParameter("username");

            if (uName == null) {

                uName = "游客";

            }

            // 设置响应内容的类型并指定字符集,以免浏览器展示中文内容时出现乱码

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

            PrintWriter out = response.getWriter();

            out.println("<html>");

            out.println("  <head><title>Servlet</title></head>");

            out.println("  <body>");

            out.println("你好,欢迎" + uName + "来到Servlet世界");

            out.println("  </body>");

            out.println("</html>");

            out.flush();

            out.close();

        }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            // 对POST方式提交的数据统一设置字符集,解决中文乱码问题

            request.setCharacterEncoding("UTF-8");

            doGet(request, response);

        }

    }

    分析:在上面的示例中,需要强调以下三点:

    ★开发 Servlet 时,首先要导入 Servlet 所需的包;

    ★自定义的 Servlet 类继承自 HttpServlet 类;

    ★实现 doGet ()或者 doPost()方法;

       ▲My Eclipse下Servlet中方法的实现:选中source——Override/Implement Methods…——选择需要实现的方法——OK;

           如图:

                         

    技巧:HTTP请求通过使用 GET 或 POST 方法提交,相应地在 Servlet 中也提供了 doGet()和 doPost()两种分别处理请求的方法,但实际的处理过程很多时候却几手是相同的,所应通常的处理方法是:分别编写 doGet )和 doPost ()方法对应不同的提交方式,同时通过相互调用避免重复编码。例如,把处理代码都写在 doGet()方法中, 然后在 doPost()方法调用 doGet ()方法。这样就能保证既能对不同提交方式进行差异化处理,又可以避免代码冗余;

    ●部署 Servlet:首先应编辑 Web 应用的部署描述文件 web.xml,添加对示例 3 中 Servlet 类的配置,该文件在程序运行Servlet时起着一个 ‘总调度" 的角色 , 它会告诉容器如何创建和访问 Servlet。在 web. xml 文件中配置 Servlet 需要使用两个 XML 元素 < servlet >和<servlet-mapping>。 其中<servlet>元素把Servlet 全类名 ( 包名+类名) 映射到一个内部名称,而< servlet –mapping>元素则将某个 URL 映射到Servlet 的内部名称;

    eg:web. xml 文件的关键代码如下:

      <servlet>

        <servlet-name>HttpServletTest</servlet-name>

        <servlet-class>cn.store.servlet.HttpServletTest</servlet-class>

      </servlet>

      <servlet-mapping>

        <servlet-name>HttpServletTest</servlet-name>

        <url-pattern>/HttpServletTest</url-pattern>

      </servlet-mapping>

    分析:在示例中,web.xml 文件中使用了< servlet >和<servlet-mapping>两个 XML 元素把用户访问的URL 映射到 Servlet,

    ◆详细介绍这两个元素及其子元素:

      1)、在 web.xml文件中, < servlet >元素可包含多个子元素,其中<servlet-name>指定 Servlet的名字 , 这个名字在同一个 Web 应用中必须唯一,<servlet-class>指定 Servlet 类的完全限定名;

      2)、<servlet-mapping>元素在 Servlet 和 URL 之间定义映射,它包含两个子元素<servlet-name>和<url-pattern>:

        ★<servlet-name>给出 Servlet 的名字,必须与在< servlet >元素中声明的Servlet 名字相同,

        ★<url-pattern>元素指定 Servlet 的 URL , 需要特别注意的是,该路径是相对于 Web 应用程序的路径,在配置Servlet 与 URL的映射后,当 Servlet 容器接收到一个请求时,对请求的路径和Servlet映射的路径进行匹配,进而调用具体Servlet类的相关方法。

        ◆下面介绍在web.xml 中常用<url-pattern>设置方法:

                  ▲<url-pattern>/xxx</url-pattern>精确匹配 , 如<url-pattern>/ helloServlet </url-pattern>;

          ▲<url-pattern>/xxx/*</url-pattern>,路径匹配,如果没有精确匹配,对/xxx/路径的所有请求将由该 Servlet 进行处理,如<url-pattern>/ helloServlet/* </url-pattern>,;

          ▲<url-pattern>*.xxx</url-pattern>如果没有精确匹配和路径匹配,则所有针对. xxx扩展名的请求将由该 Servlet 处理;

            

    ◆扩展:有时需指定在容器启动时 Servlet 的加载次序,可以在<servlet>元素中增加<load-on-startu>元素。该元素的值必须是整数,如果为负数或没有指定这个元素,容器将在客户端首次访问 Servlct 时进行加载;如果为正数或0;客器将在启动时根据值的顺序加载 Servlet,且值越小加载优先级越高;

    ●访问 Servlet:

    eg:部署完 Servlat 后,下面介绍如何访问 Servlet, 创建 index . jsP 页面代码如下:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%

    String path = request.getContextPath();

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

      <head>

        <title>ServletTest</title>

      </head>

      <body>

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

                姓名:<input type="text" name="username" />

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

        </form>

      </body>

    </html>

    分析:在上面的代码中,表单提交的路径 (action 属性 ) 指向 web.xml 文件中<url-pattern>元素所指定的URL, 即可访问对应的 Servlet。

      ★部署项目并启动 Tomcat 后,打开浏览器,在地址栏中 输入 ’ http//localhost8080/store/index. jsp" 输入用户姓名为 "小菜包',页面会显示:你好,欢迎小菜包来到 Servlet世界;

      ★如果根据 web . xml 中设置的 URL 输入 “ http//localhost : 8080/store/HttpServletTest直接访Servlet , 根据“访问Servlet”的下面的代码,在运行时如果没有传递 username 参数就会默认输出 '游客" ,页面会显示:你好,欢迎游客来到 Servlet世界;

    ◆提示:如果希望 Web 应用起始访问的是 Scrvlet, 则可以在 web.xml 文件中进行配置,

    eg:<welcome-file-list>

             <welcome-file>HttpServletTest</welcome-file>

         </welcome-file-list>

    这时在浏览器中输入 "http://localhost:8080/store’ :运行效果同样是(页面会显示):你好,欢迎游客来到 Servlet世界;

    技巧:为了方便管理,通常将创建的 Servlet 单独放在一个包中,如 cn.store.servlet。

       ★通过 IDE工具可以快速创建和部署 Servlet: 右击专门存放 Servlet 的包——New——Servlet——Name: XxxServletName (为创建的 Servlet 命名)——Next ( 此步骤的窗口信息用于部署 web.xml , 配置 Servlet 可以选择各项的默认值,也可以根据需要修改Servlet名称和 Servlet的映射路径,即修改’Servlet/JSP Name:' 和’ Servlet/JSP Mapping URL:',对于 “Display Natne:”和 “Description “后面的解释内容, 可以删除)——Finish;

       ★用工具创建的Servlet只是一个Servlet模扳,可以根据业务需求编写;

    5、使用 Servlet 实现控制器:

    ●Servlet与 JSP 的区别:

          ★JSP文件在用户第一次请求时会被编译成Servlet, 然后由这个Servlet处理用户的请求,所以 JSP 也可以看成是运行时的Servlet;

      ★JSP 和 Servlet 的区别:

        ◆JSP页面在 HTML 元素中嵌入Java脚本代码和 JSP 标记,比使用传统Servlet技术开发表示层更加容易。JSP的部署也更加简单,JSP容器 (Servlet容器)会对扩展名是.jsp的URL统一配置,将其转换为 Servlelt为客户端服务,无需为每一个 JSP 文件配置 URL 映射;

            ◆JSP 页面 HTM元素与 java脚本混合的语法 , 对于请求处理过程中编写流程控制代码,数据访问代码等却是不利的,难以模块化开发及重用,此时更适合采用传统 Java 类的形式进行开发。因此使用 Servlet 在服务器上解释和执行浏览器的请求,充当客户端和其他层之间的中间层角色更加合适;

        ◆通过上面的分祈,Servlet 和 JSP 各有所长,JSP 可以方便地开发表示层组件. 而Servlet适合编写流程控制代码. 在开发 Wab 应用时,可以针对两者的特点结合使用,合理分工;

    ●实现Servlet控制器:

      ★使用 JSP 来做控制页, 主要功能是流程控制和业务逻辑处理,现在可以将这部分代码提取出来由Servlet来完成,应用的架构如下图:

             

      ★Servlet充当控制器的角色,它接受请求、负责实例化 JavaBean 对象对业务逻辑进行处理,并为JSP页面准备封装的JavaBean对象,接着将请求分发给适当的JSP页面来产生响应;

    ◆技巧:request.getContextPath()可以获取当前web 应用的上下文路径. 对于经由浏览器请求的URL , 使用应用上下文路径进行约束,可以避免使用相对路径时可能发生的路径解析错误;

      eg: ‘location.href=“’contextPath+“ /util/topics?opr=list’” 对于转发方法使用的 URL, 可以直接以 “/” 开始以表示当前应用的根路径;

    6、Servlet的生命周期:

    ●Servlet的生命周期是通过 Servlet接口中的 init()、servicef()和 destroy()方法来表示的;即 Servlet从创建到销毀的过程,包括如何加载和实例化、初始化、处理请求以及如何被销毁;

             

      ◆加载和实例化:Servlet不能独立运行,它必须被部署至Servlet 容器中,由容器实例化和调用 Servlet 的方法,Servlet容器在 Servlet的生命周期内管理 Servlet,当Servlet容器启动或者当客户端发送一个请求时, Servlet容器会查找内存中是否存在Servlet的实例, 如果不存在,就创建一个 Servlet实例,如果存在该Servlet的实例,就直接从内存中取出该实例响应请求;

      ◆初始化:在Servlet容器完成 Servlet 实例化后,Servlet容器将调用 Servlet的 init()方法进行初始化,初始化的目的是让Servlet对象在处理客户端请求前完成一些准备或资源预加载工作,如设置数据库连接参数,建立 JDBC 连接,或者是建立对其他资源的引用。

        ★注:对于每一个Servlet实例 init()方法只能被调用一次;

      ◆服务:Servlet被初始化后 , 就处于能响应请求的就绪状态,当Servlet容器接收客户端请求时,调用Servlet的 service()方法处理客户端请求,HttpServlet 的service()方法会根据 GET 或 POST 请求转调doGet()或 doPost()方法,Servlet实例通过 ServletRequest 对象获得客户端的请求,通过调用ServletResponse 对象的方法设置响应信息;

        ◆销毁:Servlet 的实例是由 Servlet 容器创建的,所以实例的销毁也是由容器来完成的,Servlet容器判断一个 Servlet容器是否应当被释放时(容器关闭或需要回收资源),容器就会调用 Servlet 的 destroy()方法,该方法指明哪些资源可以被系统回收,而不是由 destroy()方法直接回收 Servlet 实例;

    ●Servlet 生命周期演示:

       

    eg:Servlet生命周期的各个方法的调用过程:

    import java.io.IOException;

    import java.io.PrintWriter;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    public class HelloServlet extends HttpServlet {

        //构造方法

        public HelloServlet() {

            super();

        }

         //初始化方法

        public void init() throws ServletException {

            System.out.println("初始化时,init()方法被调用!");

        }

         //doGet()方法

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

           System.out.println("处理请求时,doGet()方法被调用。");

        }

         //doPost()方法

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

             System.out.println("处理请求时,doPost()方法被调用。");

        }

         //用于释放资源

        public void destroy() {

            super.destroy();

            System.out.println("释放系统资源时,destroy()方法被调用!");

        }

    }

    分析:运行本段代码,打开浏览器,根据 web.xml 中设置的URL映射访问HelloServlet。因为HelloServlet只在控制台进行输出,

    运行效果:信息:Server startup in 2449 ms

               初始化时,init()方法被调用!

               处理请求时,doGet()方法被调用。

      重新提交一次请求,控制台显示的信息如下:

               信息:Server startup in 2449 ms

               初始化时,init()方法被调用!

               处理请求时,doGet()方法被调用。

      当再一次提交请求时, Servlet 的init()方法没有被执行,这说明 init ()方法只有在加载当前的Servlet时候被执行,并且只被执行一次。

      当停止Tomcat服务,destroy()方法被执行,显示信息:释放系统资源时,destroy()方法被调用!

    7、 初始化参数及访问应用上下文:

    ●获得 Servlet 初始化参数:

      ★配置 Servlet时,可以对该 Servlet 设置初始化参数,通过初始化参数可以更灵活地控制 Servlet的运行时行为;

        ▲设置初始化参数需要修改 web .xml文件,在<servlet>元素中增加<init-param>元素,

    eg

    <web-app version="3.0"

      <servlet>

        <servlet-name>HelloServlet</servlet-name

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

        <init-param>

            <param-name>initParam</param-name>

            <param-value>Hello Servlet</param-value>

        </init-param>

      </servlet>

      <servlet-mapping>

        <servlet-name>HelloServlet</servlet-name>

        <url-pattern>/HelloServlet</url-pattern>

      </servlet-mapping>    

      <welcome-file-list>

        <welcome-file>HelloServlet</welcome-file>

      </welcome-file-list>

    </web-app>

    说明:定义Servlet 的初始化参数时使用<init-param>元素,<init-param>元素是<servlet>元素子元素,使用<init-param>元素必须包括<param-name>元素和

    <param-value>元素;<param-name>元素定义初始化参数的名字;<param-value>元素指定初始化参数的值;

    ◆初始化参数在 servlet 的初始化环节被加载,并可通过 ServletConfig 实例的 getlnitParameter (String name)方法进行访问;

    eg

    public class HelloServlet extends HttpServlet {

        //构造方法

        public HelloServlet() {

            super();

        }

         //初始化方法

        public void init() throws ServletException {

            System.out.println("初始化时,init()方法被调用!");

        }

         //doGet()方法

       public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

           System.out.println("处理请求时,doGet()方法被调用。");

           String initParam = getInitParameter("initParam");

           System.out.println(initParam);

        }

         //doPost()方法

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

             System.out.println("处理请求时,doPost()方法被调用。");

        }

         //用于释放资源

        public void destroy() {

            super.destroy();

            System.out.println("释放系统资源时,destroy()方法被调用!");

        }

    }

    分析:通过 GenericServlet 中定义的 getlnitParameter(String nmne) 方法获取初始化数,该方法实际上是通过调用 ServletConfig 的getlnitParametcr(String name)方法来获取始化参数值,比 getServletConfig.getlnitParamater(String name)的完整写法更加简洁方便;

    部署web项目并访问HelloServlet。运行进行结果如图:

        

    ◆获得上下文参数:

    为某个Servlet定义的初始化参数只能被Servlet访问,如果该参数需要被更多的Web应用组件访问,可以使用上下文参数定义,要定义上下义参数同样需要对web. xml 文件进行修改;

    eg

    <web-app version="3.0"

      <context-param>

        <param-name>contextParam</param-name>

        <param-value>ContextParamValue</param-value>

      </context-param>

      <!--省略其他配置-->

     </web-app>

    说明:使用<context-param>元素声明 Web应用全局范围参数,<context-param>元素包括<param-name>元素和<param-value>元素;

    <param-name>素指定参数的名字 , <param-value>元素指定参数的值;

    8、 总结:

     

     

  • 相关阅读:
    Asp.net MVC 3 RTM 源代码中单元测试帮助类
    CSharp扩展方法应用之获取特性
    Asp.net MVC中防止HttpPost重复提交
    JQuery实现倒计划按钮
    JQuery防止退格键网页后退
    .net中用Action等委托向外传递参数
    linux shell 用sed命令在文本的行尾或行首添加字符
    MongoDB分片中片键的选择
    Mongodb的Replica Sets + Sharding架构
    Mongodb数据分片的维护
  • 原文地址:https://www.cnblogs.com/HQING/p/9612892.html
Copyright © 2011-2022 走看看