过滤器用于在请求到达Servlet之前或响应返回给客户端之前对请求或响应进行预处理或后处理操作,监听器用于监听Web应用中的事件。
实现网页计数功能。要完成两项计数:
第一,本网页历史访问人数;
第二,本站当前在线用户数。
通过浏览器请求counter.jsp,显示在线人数和历史访问人数。点击刷新按钮,访问人数会相应增加;开启两个以上浏览器,页面访问人数与在线人数均增长,如果某个浏览器打开网页后连续刷新网页,会看到访问人数在上升,但在线用户数不变。
部署好基于Maven的JavaWeb项目,将webapp目录从src目录中分离出来。
编写显示计数的counter.jsp。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Counter</title>
</head>
<body>
<h1>历史访问人数: ${empty requestScope.totalvisitors ? 1 : requestScope.totalvisitors}</h1>
<h1>当前在线用户数: ${empty requestScope.onlineusers ? 1 : requestScope.onlineusers}</h1>
<form action="/webapp/count" method="post">
<input type="submit" value="刷新">
</form>
</body>
</html>
编写处理计数请求的CounterServlet。
@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 {
HttpSession session=req.getSession();
ServletContext context=session.getServletContext();
if(context.getAttribute("totalvisitors")==null)
{
context.setAttribute("totalvisitors",1);
}
else
{
int totalvisitors=(int)context.getAttribute("totalvisitors");
totalvisitors++;
context.setAttribute("totalvisitors",totalvisitors);
}
if(session.isNew())
{
if(context.getAttribute("onlineusers")==null)
{
context.setAttribute("onlineusers",1);
}
else {
int onlineusers=(int)context.getAttribute("onlineusers");
onlineusers++;
context.setAttribute("onlineusers",onlineusers);
}
}
req.setAttribute("totalvisitors", context.getAttribute("totalvisitors"));
req.setAttribute("onlineusers", context.getAttribute("onlineusers"));
req.getRequestDispatcher("/counter.jsp").forward(req, resp);
}
}
将CounterServlet引入到web.xml中。
启动Tomcat,通过Edge浏览器访问counter.jsp页面。
不断点击刷新,历史访问人数增加,在线用户数量不增加。
打开谷歌浏览器,访问counter.jsp,历史访问人数和在线用户数量增加。