1.filter
过滤器是在客户端请求Servlet路径,在进入service方法之间,可以对request和response的值进行修改,起到一个过滤的作用的组件
1.1 基本使用
a. 先建一个 class类
b. 实现一个接口 javax.servlet.Filter
c. 实现doFilter方法
放行 chain.doFilter(request,response)
d. 在web.xml中配置过滤器
配置三种方式:
a. 指定请求路径 <url-pattern>/*</url-pattern>
注意: 要以/开头 /admin/*
b. 指定以什么结尾 <url-pattern>*.do</url-pattern>
c. 指定哪些Servlet进入过滤器<servlet-name>
1.2 生命周期
a. 调用构造函数
b. init初始化方法
c. doFilter
d. destory销毁方法
注意:
a,b,d只会调用一次
每次请求只要满足filter的要求,都会调用doFilter
过滤器是服务器启动时就自动创建,自动调用init方法
当服务器重启或者关闭,servlet先死,filter后死
1.3 应用
a. 解决所有servlet乱码问题
强调 response.setContentType()要写到doFilter方法之前,
因为在servlet中已使用out对象,乱码已经产生,乱码不可改
public void doFilter(ServletRequest req, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; String method = request.getMethod(); if (method.equalsIgnoreCase("post")) { // 处理post乱码 request.setCharacterEncoding("utf-8"); } else if (method.equalsIgnoreCase("get")) { // get请求 Map<String, String[]> parameterMap = request.getParameterMap(); for (String parameterName : parameterMap.keySet()) { String[] values = parameterMap.get(parameterName); if (values != null) { for (int i = 0; i < values.length; i++) { // 处理get乱码 values[i] = new String( values[i].getBytes("ISO-8859-1"), "utf-8"); } } } } arg2.doFilter(request, arg1); }
b. 权限的验证
例admin文件下的所有jsp文件,都必须要登陆才能访问,在登陆时保存用户名到Session中
以前要每个jsp文件判断Session是否有值,现在可用过滤器来解决,只要判断一次
c. 脏字问题
属性文件.properties
在web-inf文件夹下新建一个properties属性文件
将要过滤的脏字写到属性文件中(必须要到Properties写,写完后再查看source)
properties注意:
a. 写的时候键不能是中文
b. 不能有空格
c. 注释是#
在init()方法中,将Properties文件读取到Properties对象中
2.监听器
2.1 基本概念
监听是一种事件驱动型的组件
监听器用于监听一些重要的事件,监听器对象可以在事件发生之前,之后作一些相应的处理
对服务器对象的创建,销毁,设值/取值起到监听作用
监听器用于项目中的数据统计 (访问次数,访问量,在线人数)
2.2 基本使用
1.创建一个类,并且实现Listener接口
2.实现对应接口中的方法
3.在Web.xml中注册监听类
<listener> <listener-class>com.cshr.lsn.ApplicationListener</listener-class> </listener>
2.3 三个监听器
1.request: ServletRequestListener
创建request对象时由tomcat调用:
requestInitialized(ServletRequestEvent sre){}
销毁request对象时由tomcat调用:
requestDestroyed(ServletRequestEvent sre) {}
2.session: HttpSessionListener
创建session对象时由tomcat调用:
sessionCreated(HttpSessionEvent se){}
销毁session对象时由tomcat调用:
sessionDestroyed(HttpSessionEvent se) {}
会话: 一个新的用户访问服务器,会产生一个session对象
session保存服务器端的
默认的时间30分
sessionid保存在客户端
可以跨页面,不可以跨用
3.application: ServletContextListener
tomcat启动时由tomcat调用:
contextInitialized(ServletContextEvent sce){}
tomcat停止时由tomcat调用:
contextDestroyed(ServletContextEvent sce){}
可以跨页面,又可以跨用户
2.4 Servlet、Filter、Listener
a. Servlet: 服务员
b. Filter: 保安
c. Listener: 秘书
创建顺序: Listener > Filter > Servlet
销毁顺序: Servlet > Filter > Listener
监听器是tomcat启动时会全部创建,顺序由配置文件决定
默认情况下,tomcat启动时只创建监听器,过滤器,不创建Servlet
但可以配置<load-on-startup>非负整数</load-on-startup>
让tomcat在启动时就创建Servlet