1. 创建一个名为exp10的Web项目,编写、部署、测试一个ServletContext事件监听器。

【步骤1】编写监听器类MyServletContextListener.java,Web应用程序启动时创建一个数据源对象,并将其保存在ServletContext作用域中,Web应用销毁时将其清除;在ServletContext对象上添加属性、删除属性和替换属性时,在Tomcat日志中记录有关信息,包括提示信息、属性名和属性值等。

package edu.exp.no_1;import java.util.Date;
import javax.servlet.*;public final class MyServletContextListener implements ServletContextListener, ServletContextAttributeListener {private ServletContext context = null;public void contextInitialized(ServletContextEvent sce){context = sce.getServletContext();context.log("应用程序已启动:"+new Date());}public void contextDestroyed(ServletContextEvent sce){context = sce.getServletContext();context.log("应用程序已关闭:"+new Date());}public void attributeAdded(ServletContextAttributeEvent sce){context = sce.getServletContext();context.log("添加一个属性:"+sce.getName()+":"+sce.getValue());}public void attributeRemoved(ServletContextAttributeEvent sce){context = sce.getServletContext();context.log("删除一个属性:"+sce.getName()+":"+sce.getValue());}public void attributeReplaced(ServletContextAttributeEvent sce){context = sce.getServletContext();context.log("替换一个属性:"+sce.getName()+":"+sce.getValue());}
}

【步骤2】在web.xml文件中注册监听器类。

<listener><listener-class>edu.exp.no_1.MyServletContextListener</listener-class>
</listener>

【步骤3】编写监听器测试页面:contextListenerTest.jsp:使用监听器创建的数据源对象连接是一次实验创建的MySQL数据库test,以表格的形式显示其中books数据表的所有内容。

<%@ page import="java.io.IOException" %>
<%@ page import="java.io.PrintWriter" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%ServletContext context =null;context = getServletConfig().getServletContext();response.setContentType("text/html");out.println("<html><head><title>Event Test</title></head>");Integer anInteger =new Integer(100);Date aDate = new Date();context.setAttribute("obj",anInteger); //添加属性context.setAttribute("obj",aDate);  //替换属性context.removeAttribute("obj");  //删除属性out.println("<h3 align=center>"+ "已在ServletContext对象上添加、替换和删除了属性</h3>");out.println("</body></html>");out.close();%>
</body>
</html>

【步骤4】在Tomcat下发布该Web应用,启动Tomcat,访问测试页面。
http://localhost:8080/no_1/contextListenerTest.jsp

2. 编写一个HttpSession事件监听器用来记录当前在线人数。

【步骤1】编写MySessionListener监听器处理类,监视Web应用会话创建事件:每创建一个新的会话对象,就将其保存到会话对象的列表数组中,并将用户会话对象列表保存在ServletContext作用域中的sessionList属性中,同时向日志中写入“创建一个新会话”以及该会话的ID。当一个会话对象被删除时,从用户会话对象列表中删除该会话对象并保存,同时向日志中写入“删除一个会话”以及该会话的ID。

package edu.exp.no_2;import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public final class MySessionListener implements HttpSessionListener{private int count = 0;public void sessionCreated(HttpSessionEvent se){count++;se.getSession().getServletContext().setAttribute("onlineCount",new Integer(count));}public void sessionDestroyed(HttpSessionEvent se){count--;se.getSession().getServletContext().setAttribute("onlineCount",new Integer(count));}
}

【步骤2】在web.xml文件中注册该事件监听器。

<listener><listener-class>edu.exp.no_2.MySessionListener</listener-class>
</listener>

【步骤3】编写一个测试该监听器的页面sessionDisplay.jsp,显示当前应用所有在线的会话对象的id及创建时间。多打开几个浏览器窗口,模拟多用户访问,查看多用户会话统计出的结果。

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.* " %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<table border="1"><c:forEach var="sess" items="${applicationScope.sessionList}"><tr><td><c:out value="${sess.id}" /></td><td><c:out value="${sess.creationTime}"/></td></tr></c:forEach>
</table>
</body>
</html>
<%--Created by IntelliJ IDEA.User: 28187Date: 2019/5/6Time: 22:36To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%ServletContext context = getServletConfig().getServletContext();Integer count =(Integer)context.getAttribute("onlineCount");response.setContentType("text/html;charset=UTF-8");out.println("<html><head><title>Session Event Test</title></head>");out.println("<h3 align=center><font color=\"#ff0000\">"+"当前在线人数:"+count+"</h3>");out.println("</body></html>");out.close();
%>
</body>
</html>


3. 编写一个ServletRequestListener监听器,记录某个页面自应用程序启动以来被访问的次数。
【步骤1】编写监听器接口MyRequestListener,在对指定页面onlineCount.jsp发送请求时进行该页面访问次数计数器累加,并将计数器变量保存到应用作用域的属性中。

package edu.exp.no_3;import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;public final class MyRequestListener implements ServletRequestListener{private int count = 0;public void requestInitialized(ServletRequestEvent re){HttpServletRequest request= (HttpServletRequest)re.getServletRequest();if(request.getRequestURI().equals("/helloapp/onlineCount.jsp")){count++;re.getServletContext().setAttribute("count",new Integer(count));}}public void requestDestroyed(ServletRequestEvent re){}}

【步骤2】在web.xml文件中注册该监听器。

<listener><listener-class>edu.exp.no_3.MyRequestListener</listener-class>
</listener>

【步骤3】编写一个JSP页面onlineCount.jsp。

<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head><title>Listener test</title>
</head>
<body>
欢迎您,您的IP地址是<%= request.getRemoteAddr() %>
<p>自应用程序启动以来,该页面被访问了
<font color="blue" ><%=application.getAttribute("count")%>
</font>次<br>
</body>
</html>

【步骤4】启动多个浏览器窗口访问该jsp页面,展示并分析程序的运行结果。

4. 编写一个过滤器AuditFilter.java,审计用户对资源的访问。

【步骤1】编写过滤器AuditFilter.java,实现当用户访问应用程序任何资源时,将用户的IP地址和主机名写入日志文件中。

package edu.exp.no_4;import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;public class AuditFilter implements Filter {protected FilterConfig config;public void init(FilterConfig filterConfig) throws ServletException {this.config = filterConfig;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;String addr = req.getRemoteAddr();String user = req.getRemoteHost();config.getServletContext().log("RemoteAddress:"+addr+ ",RemoteHost:"+user);chain.doFilter(req, res);}public void destroy() {}}

【步骤2】配置过滤器。在部署描述文件web.xml中配置过滤器:

<filter><filter-name>AuditFilter</filter-name><filter-class>com.filter. AuditFilter</filter-class>
</filter>
<filter-mapping><filter-name>AuditFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

上述代码中过滤器映射使用的URL模式为/*,这表示将该过滤器映射到Web应用程序的任何资源。如果只对某些资源(如JSP页面审计,则可以指定具体的资源)。

<filter><filter-name>AuditFilter</filter-name><filter-class>edu.exp.no_4.AuditFilter</filter-class>
</filter>
<filter-mapping><filter-name>AuditFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

【步骤3】访问该应用程序中的任何一个资源,如使用下面的URL访问onlineCount.jsp:
http://localhost:8080/no_3/onlineCount.jsp

然后打开<CATALINA_HOME>\logs目录中的localhost.2012-05-15.log文件中有下面一行(访问多个资源就会有多行):
信息: RemoteAddress:127.0.0.1, RemoteHost:127.0.0.1

总结

  1. 在Servlet 2.4规范中共定义了三种对象上的6种事件类型和8个事件监听器接口,他们分别是什么?请用表格形式上表示出来。

2. 如何配置Servlet监听器程序?

<listener><listener-class>listener.MyServletContextListener</listener-class>
</listener>

3. 简述过滤器的工作原理。
a) 编写过滤器:AuditFilter.java
b) 编译:编译后的类文件存放在WEB-INF\classes目录中
c) 部署:filter

<filter-name>auditFilter</filter-name>
<filter-class>filter.AuditFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>auditFilter</filter-name>
<url-pattern>/login.do</url-pattern>
</filter-mapping>

d) 运行

4. 如何配置和访问带参数的过滤器?
filter标签声明过滤器

<!ELEMENT filter(description?, display-name?, icon?, filter-name, filter-class, init-param*)>

filter-mapping设置映射

<!ELEMENT filter-mapping(filter-name, (url-Pattern | servlet-name))>

例如:

<filter-mapping><filter-name>validatorFilter</filter-name><url-pattern> *.doc </url-pattern>
</filter-mapping>
<filter-mapping><filter-name>validatorFilter</filter-name><servlet-name>/login.do</servlet-name>
</filter-mapping>

Servlet过滤器与事件处理相关推荐

  1. (七)Servlet过滤器

    2019独角兽企业重金招聘Python工程师标准>>> Servlet过滤器简介 过滤器通过Web部署描述符(web.xml)中XML标签来声明,这样就可以允许添加和删除过滤器而无需 ...

  2. javaweb:servlet过滤器

    servlet过滤器能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查 ...

  3. Servlet过滤器介绍之原理分析(转)

    http://zhangjunhd.blog.51cto.com/113473/20629 本文主要介绍Servlet过滤器的基本原理 author: ZJ 2007-2-21 Blog: [url] ...

  4. Java web—Servlet过滤器(Filter)

    前言:         过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...

  5. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  6. java 该改变request url_如何在Java中使用servlet过滤器来更改传入的servlet请求URL?...

    如何使用servlet过滤器来更改传入的servlet请求URL web.xml 至 web.xml ? 更新:根据BalusC的以下步骤,我想出了以下代码: public class UrlRewr ...

  7. servlet过滤器 实例_Java Servlet过滤器示例教程

    servlet过滤器 实例 Java Servlet Filter is used to intercept the client request and do some pre-processing ...

  8. Servlet过滤器Filter和监听器

    一.Servlet过滤器的概念: *********************************************************************************** ...

  9. java servlet过滤器简解及实例

    在整个概念中,个人觉得有一篇文章写得不错,通俗易懂,这里就直接套用以上原博文, 一.概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术, ...

最新文章

  1. 机器学习概念 — 监督学习、无监督学习、半监督学习、强化学习、欠拟合、过拟合、后向传播、损失和优化函数、计算图、正向传播、反向传播
  2. 【seaborn】(1) 数据可视化,绘图风格、布局
  3. NLP任务非Transformer不可?
  4. 四轴飞行器实践教程第1章什么是飞行器
  5. 颜色传感器TCS230的使用
  6. zabbix监控windows主机
  7. sed、awk、xargs正则表达式
  8. ASP.NET多线程的使用
  9. windows功能_支持 AirPlay/DLNA 功能的 Windows 影音播放软件 5KPlayer
  10. uc7.5java下载,ucweb手机浏览器7.5 java版 UC浏览器Java
  11. 160413、生成随机校验码
  12. Arcgis模型导出之一
  13. 图床项目之后台框架设计
  14. 马云接班人为什么是张勇?
  15. springboot实现读取excel插入数据库
  16. 西门子plm_历年中国工业软件营收十强厂商:华为、西门子稳居前二名
  17. ma系列之-1-机器目录 系统结构
  18. java后端开发三年,你还不了解JVM,凭什么给你涨薪
  19. 打印机设置好共享名,单击确定,弹出0x000006d9错误
  20. HTML小案例: 填写简历信息页面布局

热门文章

  1. shiro登陆错误回顾
  2. 【python-docx】长度单位(毫米、厘米、英尺、磅等)的表示和转换关系
  3. 解决HTML显示中文乱码问题
  4. 更新域内计算机时间,Word2013如何自动更新文档中的日期和时间?如何设置打印前自动更新域...
  5. HTML中input输入框动态模糊匹配
  6. 当易方达张坤遇招商白酒侯昊
  7. 金融IT系统高可用运维经验总结—人员、技术、流程
  8. python选择哪个版本-Python下载哪个版本比较好?
  9. 简单的git基本命令
  10. 关于idea的debug调试