ch05 Servlet技术

来源:互联网 发布:斑马410网络打印设置 编辑:程序博客网 时间:2024/05/16 08:07

Servlet技术是整个JavaWeb开发中的一个核心部分,包括Servlet开发、Filter开发和Listener开发三个重要部分。

1. 什么是Servlet

Servlet一种运行于服务器端(由Web服务器来进行加载运行)的Java小应用程序,为各种各样的客户请求提供相应服务(访问数据库、用print语句生成动态的HTML页面)。

2. JSP与Servlet

从功能角度来考虑,Servlet与JSP几乎完全一样。但是,从编写角度来说,则是不一样的:从某种程度上可以将Servlet看作是含有HTML标签的Java程序;将JSP看作是含有Java代码的HTML页面。

JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求(Servlet容器------Tomcat的work目录下:xxx.jsp àxxx_jsp.javs à xxx_jsp.class)。

JSP和Servlet会有如下转换:

  • JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。
  • JSP声明部分转换成Servlet的成员部分。所有JSP声明部分可以使用private、rotected、public、static等修饰符,其他地方则不行。
  • JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。
  • 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。

Servlet可以完成的任务

  •  动态生成HTML文档。
  • 把请求转发给同一个Web应用中的其他Servlet组件。
  • 把请求转发给其他Web应用中的Servlet组件。
  • 读取客户端的Cookie,以及向客户端写入Cookie。
  • 访问其他服务器资源。

3. Servlet开发

3.1 编写Servlet步骤

  1. 创建一个包
  2. 引入用到的包
  3. 定义类的基本框架并继承HttpServlet
  4. 编写成员方法

例题1 HelloServlet


//HelloServlet.javapackage cn.duzhaojiang.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 {  protected void doGet(HttpServletRequest req,HttpServlet Response resp)throws ServletException, IOException {    resp.setContentType("text/html");    resp.setCharacterEncoding("gbk");    PrintWriter out = resp.getWriter();    out.println("Hello,你好 Servlet!");    }} 

3.2 配置Servlet

在配置文件web.xml中进行配置:Servlet的声明、访问方式

<servlet> <servlet-name>Servlet名称</servlet-name> <servlet-class>Servlet包含包名的类名</servlet-class></servlet><servlet-mapping> <servlet-name>Servlet名称</servlet-name> <url-pattern>/相当于JSP文件名的访问路径</url-pattern></servlet-mapping>

 
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>cn.duzhaojiang.servlet.HelloServlet</servlet-class></servlet><servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/servlet/HelloServlet</url-pattern></servlet-mapping>

3.3 调用Servlet

(test------web项目名, welcome------ Servlet名称)

  • 通过地址栏访问http://127.0.0.1:8080/test/welcome
  • 通过超链的形式访问<a href ="http://127.0.0.1:8080/test/welcome">第一个Servlet</a>
  • 通过表单提交的方式访问<form action="http://127.0.0.1:8080/test/welcome">或 <formaction="welcome">
http://localhost:8080/JavaWeb05/servlet/HelloServlet

3.4 Servlet生命周期(5步)

  1. 将Servlet加载到Servlet引擎(也可以叫Servlet加载器)中。
  2. 加载完成后,立即调用其init()方法来进行初始化操作。
  3. 通过提供的响应方法来处理客户端的请求,如get方式的请求则调用其doGet方法,post方式的请求则调用其doPost方法。
  4. 调用destroy()方法进行销毁操作。
  5. 通过垃圾收集器进行收集清理。

例题2 ServletLifeCycle


//ServletLifeCycle.javapackage cn.duzhaojiang.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 public class ServletLifeCycle extends HttpServlet {  public void init() throws ServletException {//初始化方法    System.out.println("Servlet初始化!");  }  protected void doGet(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    System.out.println("Servlet执行get方式请求响应!");  }  public void destroy() {    //销毁方法    System.out.println("Servlet销毁!");  }} 
配置web.xml中Servlet和在浏览器输入下列网址,然后在Tomcat服务器控制台查看输出。

http://localhost:8080/JavaWeb05/servlet/ServletLifeCycle

3.5 javax.servlet.Servlet接口的3个方法

inti(),service()和destroy()方法。

public void init(ServletConfig config)throws ServletException//Servlet容器通过ServletConfig对象把web.xml文件中所记录的的参数值传递给了Servlet。public void service(ServletRequestrequest,ServletResponse response) throws ServletException,java.io.IOException//包含了客户端的请求(ServletRequestrequest对象)及Servlet的响应(ServletResponse response对象),获得相关信息并加以处理。destroy()//当服务器要卸载Servlet实例时(Servlet容器重启,或者内存不足),将调用destory()方法并回收为该Servlet分配的资源。在调用destroy()方法之前,Servlet所有的线程的service()方法必须已返回或者超时。一旦调用了destory()方法后,Servlet将无法再调用service()方法。

3.6 HttpServlet常用方法

  1. Init()初始化。
  2. destroy()释放资源。
  3. doGet()处理客户端的HTTP GET请求。doGet方法只能处理客户端浏览器直接访问和表单GET方式提交的请求。
  4. doPost()处理客户端的HTTP POST请求。doPost方法只能处理表单POST方式提交的请求,不能处理客户端浏览器直接访问。
  5. service方法用来同时处理HTTP GET和HTTP POST请求。包括客户端浏览器直接访问和表单GET方式提交的表单以及表单POST方式提交的表单。


4. Filter过滤器开发

4.1 过滤器简介

Filter的中文译名为过滤器。从字面名称就可以看出来Filter是用来进行过滤的。通过它可以改变请求和响应信息。Filter不是一个Servlet,它不能产生响应信息,它只能够在一个请求到达之前预处理该请求,也可以在请求离开之前处理响应。借助于过滤器可以实现如下功能。

(1) 过滤非法文字和信息。

(2) 设置统一字符编码。

(3) 对用户进行登录验证。

(4) 改变图片文件格式。

(5) 对相应做压缩处理。

(6) 对XML的输出使用XSLT来进行转换。

3.2 Servlet过滤器的编写

必须实现javax.servlet.Filter接口,同时需要继承HttpServlet。主要方法:

Ø        init(FilterConfig):初始化,读取web.xml文件中Servlet过滤器的初始化参数;

Ø        doFilter(ServletRequest,ServletResponse,FilterChain):完成过滤,参数FilterChain用于访问后续的过滤器;

Ø        destory():销毁。

Filter同Servlet类似同样,也是一个Java类,所以其添加方式和普通的Java类完全相同。

 

3.3 Filter生命周期(5步)

(1) 服务器启动时就将加载Filter。

(2) init(),初始化。

(3) doFilter(),过滤用户请求。

(4) destroy(),销毁。

(5) 通过垃圾收集器进行收集清理。

Servlet过滤器配置(在web.xml中配置,过滤器的声明、对要过滤的URL的声明)

<filter>

 <filter-name>过滤器名字</filter-name>

 <filter-class>包含包名的过滤器类名</filter-class>

 <init-param>

  <param-name>参数名</param-name>

  <param-value>参数值<param-value>

 </init-param>

</filter>

<filter-mapping>

   <filter-name>过滤器名字</filter-name>

   <url-pattern>访问路径</url-pattern>

 </filter-mapping>

 

3.4 IP地址过滤器

前面提到过滤器可以过滤用户请求,下面来看一个简单的示例,创建一个IP过滤器,当一个用户发出访问请求的时候,首先通过过滤器进行判断,如果用户的IP地址被限制,则禁止访问;否则为合法的IP,则可以继续访问。

4. Listener监听器开发

4.1 监听器简介

Listener的中文译名为监听器,从字面上可以看出Listener主要用来监听之用。通过Listener可以监听容器中某一执行动作,并根据其要求做出相应的响应。到目前Servlet 2.4开始,一共包含8个Listener接口,可以将其分为三类,分别如下。

(1) 与ServletContext有关的Listener接口,即Servlet上下文监听器。

(2) 与HttpSession有关的Listener接口,即Http会话监听器,分别是HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener和HttpSessionActivationListener包 4个Listener接口。

(3) 与ServletRequest有关的Listener接口,即客户端请求监听器。

4.2 Servlet上下文监听器

Servlet上下文监听器用来ServletContext对象的创建和删除以及属性的添加、删除和修改等操作。包括ServletContextListener和ServletContextAttributeListener两个接口。

4.3 Http会话监听器和客户端请求监听器

Http会话监听器用来HttpSession对象的创建和删除以及属性的添加、删除和修改操作,还可以用来监听也可以监听HttpSession对象的有效状态。包括HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener和HttpSessionActivationListener四个接口。

5. 实训: 显示在线人员列表

5.1 在线人员列表需求描述

用户首先需要登录,当用户登录成功后,用户将跳转到在线人员列表页,在该页面中显示了所有当前在线人员的列表以及人数统计数目。

5.2 模块实现

我们用如下表的文件,来实现“在线人员列表需求”的代码。

5.3 功能测试

打开IE浏览器,在浏览器地址栏中输入http://localhost:8080/JavaWeb05/loginForm.jsp,打开用户登录页面。在该登录页面中添加用户登录信息,单击“登录”按钮进行登录,页面跳转到在线人员列表页面,如图所示。

重复前面操作,多登录几个用户,这时在线人员列表页面,如图所示。


原创粉丝点击