index中:
当前的在线人数:<%=application.getAttribute("userCount") %>
监听器中设置数据时,名字要相同
session.getServletContext().setAttribute("userCount", userCount); session.getServletContext().setAttribute("userList", userList);
toString方法重写,日期显示我们日常所见的日期模式
public String toString() { return "User [username=" + username + ", 最近登录时间=" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(loginTime) + "]"; }
session监听器中的创建对象:
//创建session对象 HttpSession session=SessionEvent.getSession(); String username=session.getId();//session.getId();是session的唯一标识 long loginTime=session.getCreationTime();//session.getCreationTime();获取session的创建时间
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.List,java.util.ArrayList,com.hanqi.Dal.User" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>首页</h1> <hr> 当前的在线人数:<%=application.getAttribute("userCount") %> <hr> 用户列表: <hr> <% List<User> userlist=(List<User>)application.getAttribute("userlist"); if(userlist!=null){ for(User a:userlist){ out.print(a+"<br>"); } } %> </body> </html>
package com.hanqi.Listener; import java.sql.Date; import java.util.ArrayList; import java.util.Iterator; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import com.hanqi.Dal.User; /** * Application Lifecycle Listener implementation class TextSessionLisenter * */ @WebListener public class TextSessionLisenter implements HttpSessionListener { private int userCount; public ArrayList<User> userlist; /** * Default constructor. */ public TextSessionLisenter() { } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent SessionEvent) { userCount++; System.out.println(userCount); //判断userlist集合是否为空 if(userlist==null){ //是空的,实例化一个 userlist=new ArrayList<User>(); } //创建session对象 HttpSession session=SessionEvent.getSession(); String username=session.getId();//session.getId();是session的唯一标识 long loginTime=session.getCreationTime();//session.getCreationTime();获取session的创建时间 if(!CheckPram(username,userlist)){ User u=new User(); u.setUsername(username); u.setLoginTime(new Date(loginTime)); userlist.add(u); } session.getServletContext().setAttribute("userCount", userCount); session.getServletContext().setAttribute("userlist", userlist); } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent SessionEvent) { userCount--; //创建session对象 HttpSession session =SessionEvent.getSession(); String username=session.getId(); System.out.println(username+"下线了"); if(CheckPram(username,userlist)){ //迭代器遍历 Iterator<User> iter=userlist.iterator(); while(iter.hasNext()){ User u=iter.next(); if(u.getUsername().equals(iter)){ iter.remove(); } } } session.getServletContext().setAttribute("userCount", userCount); session.getServletContext().setAttribute("userlist", userlist); } public boolean CheckPram(String username,ArrayList<User> list){ for(User u:list){ if(username.equals(list)){ return true; } } return false; } }
监听器
package com.haiqi.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; import javax.servlet.http.HttpServletResponse; public class SessionFilter implements Filter { private String pages; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse) resp; //获取请求 String url=request.getRequestURI(); System.out.println("当前发送的请求"+url); //获取不需要判断的session String[] _page=pages.split(";"); //判断请求是否存在不需要判断的请求中 if(Check(_page,url)){ //放行 chain.doFilter(req, resp); }else{ //接受session Object ob=request.getSession().getAttribute("currentUser"); //判断session是否为空 if(ob==null){ response.sendRedirect("Login.jsp"); }else{ chain.doFilter(req, resp); } } } public static boolean Check(String[] page,String url){ for(String s:page){ if(url.contains(s)){ return true; } } return false; } @Override public void init(FilterConfig config) throws ServletException { String str=config.getInitParameter("page"); this.setPages(str); System.out.println(str); } public String getPages() { return pages; } public void setPages(String pages) { this.pages = pages; } }
package com.hanqi.Servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class LoginServlet */ @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username =request.getParameter("username"); String password=request.getParameter("password"); if("admin".equals(username)&&"12345".equals(password)){ request.getSession().setAttribute("currentUser","admin");//在session里面存储用户名 response.sendRedirect("index.jsp"); }else{ response.sendRedirect("fail.jsp"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
过滤器链:
不同的请求互不影响
过滤器链主要是针对多个过滤器过滤同一个url请求
过滤器的先后顺序是按照在web.xml的配置顺序来的
运行顺序: 请求--->过滤器1过滤--->过滤器2过滤--->后台处理层--->过滤器2过滤--->过滤器1过滤--->客户端接收
3.0新特性的过滤器:
使用注解的方式:
@WebFilter(filterName="", value={"",""}...等其他配置)
监听器: 运行在服务器段的程序, 主要用于监听request, application, session这三个对象, 比如这三个对象的创建和销毁, 修改属性等一系列的操作
监听器的配置
创建类实现关于监听器的那些接口
public class TestListener implements ...Listener... {
...实现其中的方法
}
web.xml中的配置
<listener>
<listener-class>定义监听器的类的全路径名</listener-class>
</listener>
使用注解的方式:
@WebListener写在类名的上面
多个监听器的加载顺序
按照web.xml的配置顺序来加载各个监听器
如果在web.xml中配置有监听器, 过滤器, Servlet时, 他们的优先级分别为
监听器 > 过滤器 > Servlet
ServletContext对象的监听
在web.xml中有这样一个标签:
<context-param>
<param-name>初始化的参数名</param-name>
<param-value>初始化的参数值</param-value>
</context-param>
在监听器中可以使用参数对象来获取这个初始化参数
String value = applicationEvent.getServletContext().getInitParameter("hanqi");
HttpSession对象的监听
session在一个用户第一次访问这个页面的时候被创建, session的实例可以创建多个, 有一个用户访问, 就会创建一个session
回忆一下session的过期时间怎么配置
用途: 统计在线人数, 网站的用户访问量
HttpServletRequest对象的监听
只要有请求发送过来, 就会执行监听器中的init()方法和destory()方法
用途: 读取参数, 记录访问历史
3.0版本之后的监听器只需要加上一个@WebListenner注解就可以使用, 但是跟之前在web.xml中配置的时候相比, 有一个缺点, 无法确定监听器的加载顺序