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步骤
- 创建一个包
- 引入用到的包
- 定义类的基本框架并继承HttpServlet
- 编写成员方法
例题1 HelloServlet
//HelloServlet.java
package 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步)
- 将Servlet加载到Servlet引擎(也可以叫Servlet加载器)中。
- 加载完成后,立即调用其init()方法来进行初始化操作。
- 通过提供的响应方法来处理客户端的请求,如get方式的请求则调用其doGet方法,post方式的请求则调用其doPost方法。
- 调用destroy()方法进行销毁操作。
- 通过垃圾收集器进行收集清理。
例题2 ServletLifeCycle
//ServletLifeCycle.java
package 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常用方法
- Init()初始化。
- destroy()释放资源。
- doGet()处理客户端的HTTP GET请求。doGet方法只能处理客户端浏览器直接访问和表单GET方式提交的请求。
- doPost()处理客户端的HTTP POST请求。doPost方法只能处理表单POST方式提交的请求,不能处理客户端浏览器直接访问。
- 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,打开用户登录页面。在该登录页面中添加用户登录信息,单击“登录”按钮进行登录,页面跳转到在线人员列表页面,如图所示。
重复前面操作,多登录几个用户,这时在线人员列表页面,如图所示。