一:实现一个日志过滤器。要求每次访问应用中的任何路径时, 日志都能记录当前访问的路径。 提示:当前访问的路径可以考虑使用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>