9、过滤器和监听器
2016-06-27 23:03
459 查看
对应于书本第9章
总结:过滤器是特殊的Servlet,过滤器需要在web.xml中设置过滤范围,过滤器方法好,浏览器每一次请求都会经过过滤器转码,过滤处理特别方便
过滤器三个接口:Filter、FilterConfig、FilterChain,意思分别是过滤器、过滤器配置、过滤器链
过滤器基本结构:
创建Filter
例:创建一个过滤器,实现网站访问计数器功能,并在web.xml中,将网站访问量的初始值设为5000。
补充说明:
过程是当index.jsp刷新时,就会引起过滤类代码执行也相当于是代码跳转。
后来自己建了一个项目还是用这里的代码,但是出错了 The requested resource is not available,原因是在创建类CountFilter2时,有一行
@WebFilter(“/CountFilter2”)
public class CountFilter2 implements Filter { }
把上面的@WebFilter(“/CountFilter2”)注释掉即可。
例2:字符编码过滤器
就是用过滤器处理字符使得支持中文。
过滤器方法好,浏览器每一次请求都会经过过滤器转码。
题目:实现图书信息的添加功能,并创建字符编码过滤器避免中文乱码
解:
下面是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
总结:过滤器是特殊的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规范的最新版本,引入了新增的注释、异步处理、可插性支持等内容。相关文章推荐
- linux c 获取系统时间
- php鼠标滚动加载
- 344. Reverse String
- CronTrigger
- 苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b
- 网页实现返回键直接退出,不回到登录界面
- 远程连接SQL Server 2008,服务器端和客户端配置
- Android-ViewFlipper子界面自动轮播-学习笔记
- CentOS7中安装Mysql
- 破解Paralles Desktop
- 第二章 java基础(用户自定义类型)
- JS正则表达式
- LR 4000 U-最少使用页面置换算法
- 第二章 java基础(二进制补码)
- JDK、JRE、JVM三者间的关系
- mysql sql_mode 之 NO_ENGINE_SUBSTITUTION
- in exits区别
- 浅谈Android实现3D旋转
- 73. Set Matrix Zeroes
- 第二章 java基础(二进制与十进制的转换)