servlet監(jiān)聽實現(xiàn)統(tǒng)計在線人數(shù)功能 附源碼下載
本文實例為大家分享了servlet統(tǒng)計在線人數(shù)的具體代碼,供大家參考,具體內(nèi)容如下
ServletContext事件監(jiān)聽器---->針對applicationScope
ServletContextListener(*)
對整個Web應(yīng)用的裝載和卸載進行監(jiān)聽。
ServletContextAttributeListener
對ServletContext中的信息存放、刪除和替換進行監(jiān)聽。
ServletContext就是Servlet上下文監(jiān)聽,在web中表示的是對啟動服務(wù)和銷毀服務(wù)進行監(jiān)聽,需要實現(xiàn)的接口:
ServletContextListener接口,實現(xiàn)的就是對上下午進行監(jiān)聽:
void contextInitialized(ServletContextEvent sce):啟動上下文時的監(jiān)聽
void contextDestroyed(ServletContextEvent sce):銷毀上下文時進行的監(jiān)聽
除了對上下文的啟動和銷毀進行監(jiān)聽的之外,還可以對上下文的屬性進行監(jiān)聽:ServletContextAttributeListener接口。
void attributeAdded(ServletContextAttributeEvent event):設(shè)置上下文屬性監(jiān)聽
void attributeRemoved(ServletContextAttributeEvent event):移除上下文屬性的監(jiān)聽
void attributeReplaced(ServletContextAttributeEvent event):修改上下文屬性的監(jiān)聽
ServletContextAttributeEvent:事件,可以通過事件取得屬性的內(nèi)容和名稱。
·取得屬性名稱:public java.lang.String getName()
·取得屬性的值:public java.lang.Object getValue()
效果如下圖:
當?shù)卿浺粋€賬號時

打開另一個瀏覽器,再登錄一個賬號

如上圖,我們可以看到,程序已經(jīng)完成了統(tǒng)計在線人數(shù)和顯示人員列表的功能,那么他的實現(xiàn)流程是什么呢?
我們可以通過ServletContextListener完成在線人數(shù)的統(tǒng)計和顯示在線人數(shù)列表,首先listener和filter一樣要在web.xml中進行描述。
代碼如下:
<listener> <listener-class>net.jvsun.ListenerTest</listener-class> </listener>
為了測試這個程序,我們也必須完成用戶登錄功能。
數(shù)據(jù)庫連接幫助類:
public class JDBCHelper {
public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
public static final String URL = "jdbc:oracle:thin:@localhost:1521:xxx";
public static final String DBNAME = "scott";
public static final String PASSWORD = "xxx";
public static Connection getConn() throws Exception{
Class.forName(DRIVER);
Connection conn = DriverManager.getConnection(URL, DBNAME, PASSWORD);
return conn;
}
}
用戶實體類:
public class UserPOJO implements Serializable{
private static final long serialVersionUID = 7554548269035753256L;
private int id;
private String username;
private String password;
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 UserPOJO(int id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
public UserPOJO(String username, String password) {
this.username = username;
this.password = password;
}
public UserPOJO() {
super();
// TODO Auto-generated constructor stub
}
}
數(shù)據(jù)庫處理類:
public class UserDAO {
public UserPOJO login(String username, String password) {
UserPOJO user=null;
Connection conn = null;
PreparedStatement pstate = null;
ResultSet res = null;
try {
conn=JDBCHelper.getConn();
String sql="select id,username from userinfo where username=? and password=?";
pstate = conn.prepareStatement(sql);
pstate.setString(1, username);
pstate.setString(2, password);
res = pstate.executeQuery();
while(res.next()){
user=new UserPOJO(res.getInt(1),username,null);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
res.close();
pstate.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
}
servlet類:
public class UserServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getContextPath();
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
ServletContext application = this.getServletContext();//取得application對象
List<String> list = (List<String>) application.getAttribute("allUser");
if(list.indexOf(username) == -1){
UserPOJO pojo = new UserDAO().login(username, password);
if(null != pojo){
HttpSession session = request.getSession(true);//取得session對象
session.setAttribute("userName", username);
}
}
response.sendRedirect(path+"/index.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
監(jiān)聽類:
public class ListenerTest implements ServletContextListener,HttpSessionAttributeListener,HttpSessionListener{
ServletContext application = null;
public void contextDestroyed(ServletContextEvent event) {
System.out.println("服務(wù)器關(guān)閉");
}
public void contextInitialized(ServletContextEvent event) {
List<String> list = new ArrayList<String>();
//用來保存所有已登錄的用戶
application = event.getServletContext();
//取得application對象
application.setAttribute("allUser", list);
//將集合設(shè)置到application范圍屬性中去
}
public void attributeAdded(HttpSessionBindingEvent se) {
List<String> list = (List<String>)application.getAttribute("allUser");
//假設(shè):用戶登陸成功之后,只將戶名設(shè)置到session中
String userName = (String)se.getValue();
//取得用戶名
if(list.indexOf(userName) == -1){
//表示此用戶之前沒有登陸
list.add(userName);
application.setAttribute("allUser", list);
}
}
public void attributeRemoved(HttpSessionBindingEvent se) {
List<String> list = (List<String>)application.getAttribute("allUser");
list.remove((String)se.getValue());
application.setAttribute("allUser", list);
}
public void attributeReplaced(HttpSessionBindingEvent se) {
}
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
}
}
登錄頁面
<%@page contentType="text/html; charset=utf-8"%> <%@page import="java.util.*" %> <% String path = request.getContextPath(); %> <html> <body> <form action="<%=path %>/Login" method="post"> 賬號: <input type="text" name="username" /> <br /> 密碼: <input type="password" name="password" /> <br /> <input type="submit" value="提交" /> </form> </body> </html>
顯示在線人數(shù)和在線人員的列表界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" rel="external nofollow" rel="external nofollow" >
<title></title>
</head>
<body>
<ul>
<%
System.out.println(application.getAttribute("allUser"));
if(null != application.getAttribute("allUser")){
List<String> list = (List<String>)application.getAttribute("allUser");
%>
<h2>在線人數(shù):<%=list.size() %></h2>
<%
for(String s:list){
%>
<a>姓名:</a><%=s %><a>---->此時在線</a><br>
<%
}
}
%>
</ul>
<hr/>
<a href="<%=path %>/logout.jsp" rel="external nofollow" >注銷</a>
</body>
</html>
注銷界面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>" rel="external nofollow" rel="external nofollow" >
<title>logout</title>
</head>
<body>
<%
session.removeAttribute("username");
session.invalidate();
response.sendRedirect("login.jsp");
%>
</body>
</html>
代碼下載地址:servlet統(tǒng)計在線人數(shù)
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot實現(xiàn)定時任務(wù)的四種方式小結(jié)
本文主要介紹了springboot實現(xiàn)定時任務(wù)的四種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
springboot 中整合mybatis多數(shù)據(jù)源不使用JPA
這篇文章主要介紹了springboot 中整合mybatis多數(shù)據(jù)源不使用JPA,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
深入理解Java基礎(chǔ)之try-with-resource語法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語法糖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Springboot視圖解析器ViewResolver使用實例
這篇文章主要介紹了Springboot視圖解析器ViewResolver使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

