Filter/ListenerPractice

 一:实现一个日志过滤器。要求每次访问应用中的任何路径时,    日志都能记录当前访问的路径。    提示:当前访问的路径可以考虑使用HttpServletRequest中    的getRequestURI()方法。
(1)logFilter
package filter;

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;
import javax.servlet.http.HttpServletRequest;

public class LogFilter implements Filter{

	@Override
	public void init(FilterConfig filterCongig) throws ServletException {
		System.out.println("LogFilter初始化了...");
		
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		    System.out.println("LogFilter进入doFilter...");
		    HttpServletRequest req=(HttpServletRequest)request;
		    String currentPath=req.getRequestURI();
		    System.out.println("当前访问的路径是:"+currentPath);
		    chain.doFilter(request, response);
		    System.out.println("LogFilter将要离开doFilter...");		
	}

	@Override
	public void destroy() {
		   System.out.println("LoginFilter销毁了...");
	}
}
(2)first.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>first页面</title>
</head>
<body>
    <h3>欢迎访问第一页面!</h3>
</body>
</html>
(3)second.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>second页面</title>
</head>
<body>
    <h3>欢迎访问第二页面!</h3>
</body>
</html>
(4)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>FilterProject</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
     <filter-name>logFilter</filter-name>
     <filter-class>filter.LogFilter</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>logFilter</filter-name>
     <url-pattern>/path/*</url-pattern>  
  </filter-mapping>
</web-app>


二:用监听器实现一个统计网站在线人数的功能。提示:创建一个监听器类,通过ServletContextListener监听,当容器启动时,在ServletContext中添加一个List,用来准备存放在线的用户名;然后,可以通过HttpSessionAttributeListener监听,当用户登录成功把用户名设置到Session中时同时将用户名存放到ServletContext中的List列表中;最后通过HttpSessionListener监听,当会话注销时将用户名从应用上下文范围的List列表中删除。 
(1)LoginListener
package listener;

import java.util.*;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class LoginListener implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener{
	private ServletContext sc;
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		List<String> list=new ArrayList<String>();
	    sc=sce.getServletContext();
		sc.setAttribute("online", list);
		System.out.println("容器启动了,");
		
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent event) {
		
	}
	
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		List<String> online=(List<String>)sc.getAttribute("online");//取得用户名"online"的列表
		if("username".equals(event.getName())){
			online.add((String)event.getValue());//将当前用户名存放到列表中
		}
		sc.setAttribute("online", online);//将添加的用户名设置到application属性中
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
				
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {		
	}


	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		List<String> online=(List<String>)sc.getAttribute("online");//取得用户名"online"的列表
        String username=(String) event.getSession().getAttribute("username");//取得当前用户名
        online.remove(username);//将当前用户名从应用上下文范围的列表中删除。
		sc.setAttribute("online", online);//删除之后重新设置到application属性

	}
}
(2)LogServlet
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogServlet extends HttpServlet{
	 @Override 
	 public void doGet(HttpServletRequest request, HttpServletResponse response) 
	   throws ServletException, IOException { 
	  this.doPost(request, response); 
	 } 
	  
	 @Override
	 public void doPost(HttpServletRequest request, HttpServletResponse response) 
	  throws ServletException, IOException {  	    
	  String username= request.getParameter("username");//获取请求参数中的用户名 	    
	  if(username !=null) {  
	   request.getSession().setAttribute("username",username);  //往session中添加属性
	  } 
	  //从应用上下文中获取在线用户名列表 
	  List<String> online = (List<String>)getServletContext().getAttribute("online");  	    
	  PrintWriter out = response.getWriter();  
	  out.println("当前用户是:" + username); 	  
	      for (int i = 0; i < online.size(); i++) { 
	       out.println(online.get(i)); 
	      }
	      out.flush();
	      out.close();
	  } 
}
(3)DestroyServlet
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DestroyServlet extends HttpServlet{
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
	     doPost(req,resp);
   }
   
   @Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.getSession().invalidate();//销毁会话,会触发SessionLinstener中的sessionDestroyed方法 
		  List<String> online = (List<String>)getServletContext().getAttribute("online");  	    
		  PrintWriter out = resp.getWriter();  	
		  for (int i = 0; i < online.size(); i++) { 
		       out.println(online.get(i)); 
		      }
		      out.flush();
		      out.close();
    } 
}

(4)login.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>登录界面</title>
</head>
<body>
   <form action="loginListener" method="post">
   用户名:<input type="text" name="username"/><br/><br/>
       <input type="submit" value="登录"/>   
   </form>  
</body>
</html>
(5)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>FilterProject</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<filter>
		<filter-name>logFilter</filter-name>
		<filter-class>filter.LogFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>logFilter</filter-name>
		<url-pattern>/path/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>servlet.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/loginListener</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>DestroyServlet</servlet-name>
		<servlet-class>servlet.DestroyServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DestroyServlet</servlet-name>
		<url-pattern>/loginListener</url-pattern>
	</servlet-mapping>
</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值