您的位置:首页 > 编程语言 > Java开发

Servlet过滤器和监听器总结

2016-10-24 17:02 351 查看

1. Servlet 过滤器

过滤器具有拦截请求的功能,可以改变请求的内容。

过滤器过滤的组件包括Servlet、html和jsp等。

过滤器链也就是多个过滤器,请求会按照web.xml中的配置的顺序进行处理。

1.1 生命周期



init(): 初始化,容器被启动时就会调用该方法。

doFilter(): 过滤处理,chain.doFilter()用于将过滤后的请求传递给下个过滤器,如果此过滤器已经是过滤链中最后一个过滤器,那么,请求将传送给目标资源。

destroy(): 释放资源

Notice: 过滤器可以在Servlet被调用之前截获该调用;能够在Servlet被调用之后截获该调用。如下图所示:



1.2 创建于配置

public class FilterOne implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("=======Filter init=======");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("=======doFilter start=======");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("=======doFilter end=======");
}

@Override
public void destroy() {
System.out.println("=======Filter Destroy=======");
}
}


<filter>
<!-- 过滤器名称 -->
<filter-name>FilterOne</filter-name>
<!-- 过滤器类名 -->
<filter-class>com.study.filter.FilterOne</filter-class>
</filter>

<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>FilterOne</filter-name>
<!-- 过滤器URL映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping>


1.3 实例:字符编码过滤器

public class CharactorFilter implements Filter {
volatile String encoding = null;  //字符编码

public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding != null){
request.setCharacterEncoding(encoding);  //设置request的编码格式
response.setContentType("text/html;charset="+encoding); //设置response字符编码
}
chain.doFilter(request, response);
}

public void destroy() {
encoding = null;
}
}


//web.xml
<filter>
<filter-name>CharactorFilter</filter-name>
<filter-class>
com.study.filter.CharactorFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharactorFilter</filter-name>
<!-- 过滤所有链接 -->
<url-pattern>/*</url-pattern>
</filter-mapping>


2. Servlet 监听器

监听器的作用是监听Web容器的有效事件,因此它是由容器管理。利用Listener接口监听在容器中的某个执行程序。

2.1 简介



2.2 创建与配置

public class MyContentListener implements ServletContextListener{
//To Do
}


//web.xml
<listener>
<listener-class>
com.study.listener.MyContentListener
</listener-class>
</listener>


2.3 实例:统计在线人数

//用来存储在线用户和对在线用户进行增加和移除的操作
public class UserInfoList {
private static UserInfoList user = new UserInfoList();

private Vector vector = null;

public UserInfoList(){
this.vector = new Vector();
}

public static UserInfoList getInstance(){
return user;
}

public boolean addUserInfo(String user){
if(user != null){
this.vector.add(user);
return true;
}else{
return false;
}
}

public Vector getList(){
return vector;
}

public void removeUserInfo(String user){
if(user != null){
vector.remove(user);
}
}
}


//有对象加入session时,会调用valueBound();有对象被移除session时,会调用valueUnbound()
public class UserInfoTrace implements HttpSessionBindingListener {

private volatile String user;
private UserInfoList list = UserInfoList.getInstance();

public UserInfoTrace(){
user = "";
}

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("上线"+this.user);

}

@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("下线"+this.user);
if(user != ""){
list.removeUserInfo(this.user);
}
}
}


//login.jsp: 登陆界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="showUser.jsp" method="post">
username: <input type="text" name="username"/><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>

</body>
</html>


//showUser.jsp  显示在线用户名单界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<%@page import="java.util.*"%>
<%@page import="com.study.listener.*" %>
<head>
<title>show user</title>
</head>
<body>
<%
UserInfoList list = UserInfoList.getInstance();
UserInfoTrace ut = new UserInfoTrace();
String name = request.getParameter("username");
ut.setUser(name);
session.setAttribute("list",ut);
list.addUserInfo(ut.getUser());
session.setMaxInactiveInterval(10);
%>
<textarea rows="8" cols="20">
<%
Vector vector = list.getList();
if(vector != null && vector.size() > 0){
for(int i = 0; i<vector.size(); i++){
out.println(vector.elementAt(i));
}
}
%>
</textarea>
</body>
</html>


//web.xml
<listener>
<listener-class>
com.study.listener.UserInfoTrace
</listener-class>
</listener>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息