Filter(重点)
Filter:过滤器,用来过滤网站的数据;
处理中文乱码
登陆验证。。。
Filter开发步骤:
1导包
2编写过滤器
1导包Filter导Servlet下的
2重写三个方法
3编写要过滤的内容
4在web.xml文件中进行配置
注意这个: filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就停止了
例子:
public class CharaterEncodingFilter implements Filter {
//web服务器启动就初始化了,随时等待过滤对象
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//Chain 链
//1过滤中的所有代码,再过滤特定请求的时候都会执行
//2必须要让过滤器继续通行 filterChain.doFilter(servletRequest,servletResponse);
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("filterChain执行前");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就停止了
System.out.println("执行后");
}
//web服务器关闭才会销毁
public void destroy() {
System.out.println("销毁");
}
}
web.xml配置
<filter>
<filter-name>filter</filter-name>
<filter-class>com.xxr.filter.CharaterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!--只要是/servlet下面的任何请求,都会过滤-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
监听器
实现监听器的接口
正确代码
//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建Session就会触发一次这个事件!
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
//销毁session监听
//一旦销毁Session就会触发一次这个事件!
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
/*
Session销毁:
1. 手动销毁 getSession().invalidate();
2. 自动销毁
*/
}
我的问题代码
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
Integer onlincount = (Integer) session.getAttribute("onlincount");
System.out.println(se.getSession().getId());
// Integer onlincount = (Integer) ctx.getAttribute("onlincount");
//listener= new Integer(1);
if(onlincount==null)
// onlincount=new Integer(1);
onlincount=1;
else {
//int i = onlincount.intValue();
//onlincount= i+1;
onlincount= onlincount+1;
}
session.setAttribute("onlincount",onlincount);
}
//销毁SESSION监听
//一旦销毁session就会触发这个事件
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
Integer onlincount = (Integer) session.getAttribute("onlincount");
System.out.println(se.getSession().getId());
// Integer onlincount = (Integer) ctx.getAttribute("onlincount");
//listener= new Integer(1);
if(onlincount==null)
// onlincount=new Integer(1);
onlincount=0;
else {
//int i = onlincount.intValue();
//onlincount= i+1;
onlincount= onlincount-1;
}
session.setAttribute("onlincount",onlincount);
}
遇到的问题在自己写代码时只写了
request.getSession().getAttribute();
发现通过打开第二个浏览器人数并不增加,最终发现
ServletContext > Session > Request > Page,这是从大到小的范围
ServletContext:是全局的,所有Session都可取到。el中用 applicationScope
Session:整个会话中的。el中用 sessionScope
Request:当前请求中的。el中用 requestScope
Page:只是当前页面中的。el中用 pageScope
写request.getSession().getServletContext().setAttribute(“abc”,123);,当然从session中取不到了,用 {applicationScope.abc} 可取到
如果不指定范围,用 {abc} 也可取到,它是按 从小到大 的顺序进行查找