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、 总结:

 

JSP/Servlet开发——第七章 Servel基础的更多相关文章

  1. 基于JSP+Servlet开发手机销售购物商城系统(前台+后台)源码

    基于JSP+Servlet开发手机销售购物商城系统(前台+后台) 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MySQL数据库 运行效果图: ...

  2. 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码

    基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境:    Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...

  3. 第七章 过滤器基础 Filter

    简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  4. Web前端框架与移动应用开发第七章

    1.练习1:焦点图切换 html: <!doctype html><html><head> <meta charset="utf-8" / ...

  5. JSP/Servlet开发——第五章 使用分层实现业务处理

    1.JNDI(Java Naming and Directory Interface)Java命名和目录接口: ●JNDI:是一个有关应用序设计的 API 为开发人员提供了查找和访问各种命名和目录服务 ...

  6. JSP/Servlet开发——第六章 JSP开发业务应用

    1. 大容量的数据显示的缺点: ●当数据量较多时,用户需要拖动页面才能浏览更多信息: ●数据定位不便: 2.分页显示: ●既能显示多条数据,又不需要拖动页面,是数据更加清晰直观,页面不再冗长,也不受数 ...

  7. JSP/Servlet开发——第十一章 Ajax交互扩展

    1. jQuery实现Ajax的方法: ●除了$.ajax()方法以外,jQuery还提供了其他多种更简单的 Ajax 实现方法,如$.get().$.post().$.getJSON().对象.lo ...

  8. windows7_下Eclipse中部署tomcat7.0进行JSP+servlet开发

    环境:windows 7+EclipseJava EE IDE for Web Developers +tomcat 7.02 插件:tomcatPluginV321.zip(百度搜索下载即可) 一. ...

  9. Head First Servlets & JSP 学习笔记 第七章 —— 作为JSP

    <%@ …… %> 这是指令 <%@ page ……import="java.util.Date" %> 这是page指令,import是page指令的一个 ...

随机推荐

  1. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    原文:http://www.cnblogs.com/JCSU/articles/1305401.html C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. ...

  2. 插入mysql语句报错:1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    插入一个很简单的sql语句时候,mysql一直报错: [SQL] INSERT INTO ORDER ( id, activity_id, order_type, phone, order_amoun ...

  3. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  4. tomcat + jdk 快速部署

    环境: apache-tomcat-7.0.73 java version "1.8.0_112" 注释:创建普通用户,使用 sudu进行操作,本文略写. 1.JDK 1.jdk配 ...

  5. Linux->ZooKeeper集群搭建

    人,总免不了有心结,限制着自己,难以前行.对于ZooKeeper的理解,以及实践也拖了很久,今天用零散时间学习一下,补点干货. 一.简述 Zookeeper是Google的Chubby一个开源的实现, ...

  6. angular2 ng build --prod 报错:Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory'

    调试页面 ng serve 正常 ng build 也正常 ng build --prod 异常:Module not found: Error: Can't resolve './$$_gendir ...

  7. QT的键值对应关系 看完开发节省时间 哈哈

    http://blog.csdn.net/wangjieest/article/details/8283656

  8. July 03rd 2017 Week 27th Monday

    Even if you are on the right track, you will get run over if you just sit there. 即使你处于正确的轨道上,但如果你只是坐 ...

  9. win10 x64 注册ZQDeviceOcx.ocx控件

    正常的方式在32位系统下可行, 但是在64位系统下是不可行的. 在64位系统中正确的注册步骤是: 1. 将对应的ocx和dll放到C:\Windows\SysWOW64目录下. 2. 然后找到C:\W ...

  10. hdu-2620 Ice Rain---数论(取模运算规律)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2620 题目大意: 给出n和k求: 解题思路: kmodi=k-i*[k/i] ,所以=nk-(1*[ ...