您的位置:首页 > 其它

9、过滤器和监听器

2016-06-27 23:03 459 查看
对应于书本第9章

总结:过滤器是特殊的Servlet,过滤器需要在web.xml中设置过滤范围,过滤器方法好,浏览器每一次请求都会经过过滤器转码,过滤处理特别方便

9.1 Servlet过滤器

过滤器具有拦截浏览器请求的功能。



过滤器三个接口:Filter、FilterConfig、FilterChain,意思分别是过滤器、过滤器配置、过滤器链

过滤器基本结构:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class MyFilter implements Filter {
// 过滤器
//  必须要实现接口Filter的三个方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化的一些操作
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 在下面这句以上真正的过滤处理
chain.doFilter(request, response);
}

@Override
// 销毁方法
public void destroy() {
// 释放资源
}
}


创建Filter

例:创建一个过滤器,实现网站访问计数器功能,并在web.xml中,将网站访问量的初始值设为5000。

补充说明:

过程是当index.jsp刷新时,就会引起过滤类代码执行也相当于是代码跳转。

后来自己建了一个项目还是用这里的代码,但是出错了 The requested resource is not available,原因是在创建类CountFilter2时,有一行

@WebFilter(“/CountFilter2”)

public class CountFilter2 implements Filter { }

把上面的@WebFilter(“/CountFilter2”)注释掉即可。

析:网站访问量这个是全局量,应写在web.xml中。所以先配置web.xml
################################ web.xml
在里面添加
<web-app>
<!-- 过滤器声明 -->
<filter>
<filter-name>CountFilter</filter-name>
<filter-class>com.lyq.CountFilter</filter-class>
<!-- 设置初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>count</param-name>
<!-- 参数值 -->
<param-value>5000</param-value>
</init-param>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<filter-name>CountFilter</filter-name>
<!-- 该过滤器仅对index.jsp有效,其他页面无效 -->
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>

之后自己创建Filter:
项目名右键new Filter---输入包名和过滤器名,比如分别是com.lyq和CountFilter
################################ CountFilter.java
package com.lyq;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 统计过滤器
*/
public class CountFilter implements Filter {
// 来访数量
private int count;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数,此处的参数"count"在web.xml中是Filter中的参数
String param = filterConfig.getInitParameter("count");
// 将字符串转换为int
count = Integer.valueOf(param);
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 访问数量自增
count ++;
// 将ServletRequest转换成HttpServletRequest
HttpServletRequest req = (HttpServletRequest) request;
// 获取ServletContext
ServletContext context = req.getSession().getServletContext();
// 将来访数量值放入到ServletContext中
context.setAttribute("count", count);
// 向下传递过滤器
chain.doFilter(request, response);
}

@Override
public void destroy() {

}
}

最后index.jsp
<body>
<h2>
欢迎光临,<br>
您是本站的第【
<%=application.getAttribute("count") %>
】位访客!
</h2>
</body>


例2:字符编码过滤器

就是用过滤器处理字符使得支持中文。

过滤器方法好,浏览器每一次请求都会经过过滤器转码。

题目:实现图书信息的添加功能,并创建字符编码过滤器避免中文乱码

解:

###########过滤器对象   com.lyq.CharactorFilter.java
package com.lyq;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
// 字符编码过滤器
public class CharactorFilter implements Filter {
// 字符编码
String encoding = null;
@Override
public void destroy() {
encoding = null;
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 判断字符编码是否为空
if(encoding != null){
// 设置request的编码格式
request.setCharacterEncoding(encoding);
// 设置response字符编码
response.setContentType("text/html; charset="+encoding);
}
// 传递给下一过滤器
chain.doFilter(request, response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数,在web.xml中获取
encoding = filterConfig.getInitParameter("encoding");
}
}

#######################   配置过滤器
在web.xml中添加
<filter>
<!-- 过滤器名称 -->
<filter-name>CharactorFilter</filter-name>
<!-- 过滤器的完整类名 -->
<filter-class>com.lyq.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映射 -->
<!-- /*表示匹配所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

##########################创建处理事务的  com.lyq.AddServlet.java
package com.lyq;

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;

/**
* 添加图书信息的Servlet
*/
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

// 处理GET请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}

// 处理POST请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取 PrintWriter
PrintWriter out = response.getWriter();
// 获取图书编号
String id = request.getParameter("id");
// 获取名称
String name = request.getParameter("name");
// 获取作者
String author = request.getParameter("author");
// 获取价格
String price = request.getParameter("price");
// 输出图书信息
out.print("<h2>图书信息添加成功</h2><hr>");
out.print("图书编号:" + id + "<br>");
out.print("图书名称:" + name + "<br>");
out.print("作者:" + author + "<br>");
out.print("价格:" + price + "<br>");
// 刷新流
out.flush();
// 关闭流
out.close();
}
}

注:在java web中,Servlet处理的请求都是GET或POST,所以可在doGet()中调用doPost(),也可在doPost()中调用doGet()

########################### 对Servlet类的配置
<servlet>
<!-- Servlet名称 -->
<servlet-name>AddServlet</servlet-name>
<!-- Servlet完整类名 -->
<servlet-class>com.lyq.AddServlet</servlet-class>
</servlet>
<!-- Servlet映射 -->
<servlet-mapping>
<!-- Servlet名称 -->
<servlet-name>AddServlet</servlet-name>
<!-- URL映射 -->
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>

####################### index.jsp
<body>
<form action="AddServlet" method="post">
<table align="center" border="1" width="350">
<tr>
<td class="2" align="center" colspan="2">
<h2>添加图书信息</h2>
</td>
</tr>
<tr>
<td align="right">图书编号:</td>
<td>
<input type="text" name="id">
</td>
</tr>
<tr>
<td align="right">图书名称:</td>
<td>
<input type="text" name="name">
</td>
</tr>
<tr>
<td align="right">作  者:</td>
<td>
<input type="text" name="author">
</td>
</tr>
<tr>
<td align="right">价  格:</td>
<td>
<input type="text" name="price">
</td>
</tr>
<tr>
<td class="2" align="center" colspan="2">
<input type="submit" value="添 加">
</td>
</tr>
</table>
</form>
</body>


9.2 Servlet监听器(P188)

监听的是web容器的有效事件

下面是8个监听器接口以及对应的各自监听对象



1、Servlet上下文监听:

ServletContextListener接口:监听ServletContext的创建和删除

ServletAttributeListener接口:监听ServletContext属性的增加、删除和修改

2、Http会话监听:

HttpSessionListener接口:监听Http会话的创建、销毁

HttpSessionActivationListener接口:监听Http会话active和passivate

HttpBindingListener接口:监听Http会话中对象的绑定信息

HttpSessionAttributeListener接口:监听Http会话属性的设置请求

3、Servlet请求监听:监听客户端的请求

ServletRequestListener接口

ServletRequestAttributeListener接口

例:监听器统计在线人数

代码见TM\sl\9\3

9.3 Servlet 3.0 新特性

Servlet 3.0 是Servlet规范的最新版本,引入了新增的注释、异步处理、可插性支持等内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: