Servlet技术是整个JavaWeb开发中的一个核心部分,包括Servlet开发、Filter开发和Listener开发三个重要部分。
Servlet一种运行于服务器端(由Web服务器来进行加载运行)的Java小应用程序,为各种各样的客户请求提供相应服务(访问数据库、用print语句生成动态的HTML页面)。
从功能角度来考虑,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)。
例题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!");
}
}
在配置文件web.xml中进行配置:Servlet的声明、访问方式
Servlet名称
Servlet包含包名的类名
Servlet名称
/相当于JSP文件名的访问路径
HelloServlet
cn.duzhaojiang.servlet.HelloServlet
HelloServlet
/servlet/HelloServlet
(test------web项目名, welcome------ Servlet名称)
http://localhost:8080/JavaWeb05/servlet/HelloServlet
例题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
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()方法。
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的声明)
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,打开用户登录页面。在该登录页面中添加用户登录信息,单击“登录”按钮进行登录,页面跳转到在线人员列表页面,如图所示。
重复前面操作,多登录几个用户,这时在线人员列表页面,如图所示。