監聽器是一個專門用于對其他對象身上發生的事件或狀態改變進行監聽和相應處理的對象,當被監視的對象發生情況時,立即采取相應的行動。監聽器其實就是一個實現特定接口的普通java程序,這個程序專門用于監聽另一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件后,監聽器某個方法立即被執行。
二、監聽器統計在線人數--HttpsessionListener實現package com.pb.news.listenter;public class OnlineCounter { public static long ONLINE_USER_COUNT=0; public static long getonline(){ return ONLINE_USER_COUNT; } public static void raise() { ONLINE_USER_COUNT++; } public static void reduce() { ONLINE_USER_COUNT--; }}
package com.pb.news.listenter;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;/** * application Lifecycle Listener implementation class OnlineCounterListener * */public class OnlineCounterListener implements HttpSessionListener { /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub //session創建里用戶加1 OnlineCounter.raise(); } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent arg0) { //session銷毀里里用戶減1 OnlineCounter.reduce(); } }
只需要在頁面中寫入
在線人數:<%=OnlineCounter.getonline() %>三、監聽器統計在線人數--HttpSessionBindingListener實現綁定用戶登錄查詢在線人數
創建靜態變量類
package com.pb.news.constants;public class Constants {//統計在線人線人數靜態常量 public static int ONLINE_USER_COUNT=0;}
創建用戶類來實現-接口-HttpSessionBindingListener
package com.pb.news.listenter;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;import com.pb.news.constants.Constants;/** * Application Lifecycle Listener implementation class UserLoginCount * */public class UserLoginCount implements HttpSessionBindingListener { PRivate int id; //用戶id; private String username; //用戶姓名 private String passWord; //用戶密碼 private String email; //用戶郵箱 private int usertype; //用戶類型 //getter和setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getUsertype() { return usertype; } public void setUsertype(int usertype) { this.usertype = usertype; } /** * Default constructor. */ public UserLoginCount() { // TODO Auto-generated constructor stub } /** * @see HttpSessionBindingListener#valueBound(HttpSessionBindingEvent) */ public void valueBound(HttpSessionBindingEvent arg0) { Constants.ONLINE_USER_COUNT++; } /** * @see HttpSessionBindingListener#valueUnbound(HttpSessionBindingEvent) */ public void valueUnbound(HttpSessionBindingEvent arg0) { Constants.ONLINE_USER_COUNT--; } }
創建登錄servlet類
package com.pb.news.web.servlet;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.pb.news.dao.impl.UsersDaoImpl;import com.pb.news.entity.Users;import com.pb.news.listenter.UserLoginCount;import com.pb.news.service.impl.UsersserviceImpl;/** * Servlet implementation class UserLoginServlet */public class UserLoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UserLoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.setCharacterEncoding("utf-8"); String username=request.getParameter("username"); String password=request.getParameter("password"); UsersServiceImpl usersService=new UsersServiceImpl(); UsersDaoImpl usersDao=new UsersDaoImpl(); usersService.setUsersDao(usersDao); boolean flag=usersService.login(username, password); if(flag==true){ //request.getSession().setAttribute("user", username); //創建HttpSessio對象 /*Users users=new Users(); users.setUsername(username); users.setPassword(password);*/ UserLoginCount users= new UserLoginCount(); users.setUsername(username); users.setPassword(password); HttpSession s=request.getSession(); s.setAttribute("user", users); //s.setAttribute("pwd", password); //request.getRequestDispatcher("jsp/index.jsp").forward(request, response); response.sendRedirect("jsp/index.jsp"); }else{ request.setAttribute("msg", "用戶名或者密碼不正確"); RequestDispatcher rd=request.getRequestDispatcher("jsp/userLogin.jsp"); rd.forward(request, response); //request.getRequestDispatcher("jsp/userLogin.jsp").forward(request, response); //response.sendRedirect("jsp/userLogin.jsp"); } }}
在要顯示的頁面顯示
已登錄用戶:<%=com.pb.news.constants.Constants.ONLINE_USER_COUNT %>
相比較,第一種更簡潔,這里可能還有理簡單的輸出,暫時沒發現
四、監聽器統計在線人數--HttpSessionListener實現package com.pb.news.web.servlet;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class UserCountListener implements HttpSessionListener { private int count = 0; public void sessionCreated(HttpSessionEvent se) { // TODO Auto-generated method stub //人數加1 count++; setContext(se); } public void sessionDestroyed(HttpSessionEvent se) { // TODO Auto-generated method stub //人數減1 count--; setContext(se); } private void setContext(HttpSessionEvent se){ se.getSession().getServletContext().setAttribute("userCount",new Integer(count)); }}
創建UserCountListener監聽器,注意web.xml中要有:<listener> <listener-class>com.pb.news.web.servlet.UserCountListener</listener-class></listener>創建監聽器后,可以在需要顯示人數的頁面加入下面的語句:Object userCount=session.getServletContext().getAttribute("userCount");out.print(userCount.toString());五、不需要登錄統計在線人數
package com.pb.listenter;import javax.servlet.ServletContext;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;/** * Application Lifecycle Listener implementation class CountListenter * */@WebListenerpublic class CountListenter implements HttpSessionListener { //private int count=0; /** * Default constructor. */ public CountListenter() { // TODO Auto-generated constructor stub } /** * 創建seesion+1 */ public void sessionCreated(HttpSessionEvent se) { // TODO Auto-generated method stub ServletContext context=se.getSession().getServletContext(); Integer count=(Integer) context.getAttribute("count"); if(count==null){ //count=new Integer(1); context.setAttribute("count", 1); }else{ count++; context.setAttribute("count", count); } } /** * 銷毀session時次數-1 */ public void sessionDestroyed(HttpSessionEvent se) { // TODO Auto-generated method stub ServletContext context=se.getSession().getServletContext(); Integer count=(Integer) context.getAttribute("count"); count--; context.setAttribute("count", count); } }
在需要顯示的頁面輸入以下代碼顯示
<%ServletContext context=session.getServletContext();Integer count=(Integer)context.getAttribute("count");%> <%=count%>
新聞熱點
疑難解答