这两天在学习jsp,老师布置了一个监听器作业,做完了顺便发一下博客
要求:点击前端登录超链接,服务器统计当前人数且生成一个“退出超链接”返回至浏览器前端,此时点击“退出超链接”,服务器会将当前服务器在线人数减一并返回值浏览器客户端;
前端页面
Insert title here
点击登录
前端按钮点击事件
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/https://blog.csdn.net/m0_49713747/article/details/login")
public class https://blog.csdn.net/m0_49713747/article/details/login extends HttpServlet {
private static final long serialVersionUID = 1L;
public https://blog.csdn.net/m0_49713747/article/details/login() {
super();
// TODO Auto-generated constructor stub
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();//获取请求方(浏览器)session
request.getServletContext().getAttribute("num");//获取请求方的num属性
response.setContentType("text/html;charset=utf-8");//设置响应浏览器的编码方式为utf-8
Integer num=(Integer)request.getSession().getServletContext().getAttribute("num");
System.out.println("https://blog.csdn.net/m0_49713747/article/details/login被调用,num="+num);
response.getWriter().println("当前人数为:"+num);
response.getWriter().println("点击退出!");//在前段打印的内容,同时点击标签跳转到https://blog.csdn.net/m0_49713747/article/details/loginout这个类
}
}
创建一个容器属性
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ServletContextlisten implements ServletContextListener {
public ServletContextlisten() {
// TODO Auto-generated constructor stub
}
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
//为这个东西添加一个人数属性,Servletcontext可以在web.xml里面创建新的属性,或更改属性
Integer num=0;//创建一个包装对象
arg0.getServletContext().setAttribute("num", num);//在xml里添加一个属性,以及属性值(属性值要是对象)所以才有的前面的包装对象
System.out.println("容器被创建"+num);
}
}
监听session的创建
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class HttpSessionListen implements HttpSessionListener {
public HttpSessionListen() {
// TODO Auto-generated constructor stub
}
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
//浏览器只要打开就会创建session
//只要session创建了这个监听器就会知道从而调用这个方法
Integer num=(Integer) arg0.getSession().getServletContext().getAttribute("num");
System.out.println("session被创建"+num);
//获取在全局监听器中设置的sum的值
//session创建以后
num++;
arg0.getSession().getServletContext().setAttribute("num", num);
System.out.println("session被创建修改"+num);
//改完之后重新设置一下servletcontext的属性值
//创建就结束了
//这里的sum值会被退出的https://blog.csdn.net/m0_49713747/article/details/loginout这个方法通过给servletcontext.getattbute()调用,并输出
}
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
//当访问端(浏览器)关闭之后,session会销毁,销毁之后就要人数减一;
Integer num=(Integer) arg0.getSession().getServletContext().getAttribute("num");
num--;
arg0.getSession().getServletContext().setAttribute("num",num);
System.out.println("session被删除修改"+num);
//这里的sum值会被退出的https://blog.csdn.net/m0_49713747/article/details/loginout这个方法给调用,并输出
}
}
退出事件
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;
@WebServlet("/https://blog.csdn.net/m0_49713747/article/details/loginout")
public class https://blog.csdn.net/m0_49713747/article/details/loginout extends HttpServlet {
private static final long serialVersionUID = 1L;
public https://blog.csdn.net/m0_49713747/article/details/loginout() {
super();
// TODO Auto-generated constructor stub
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.getSession().invalidate();//干掉已存在的session,干掉sessi,监听器会听到,同时在监听器里对sum做操作
Integer num=(Integer)request.getSession().getServletContext().getAttribute("num"); //获取这个属性的值
num--;
System.out.println("https://blog.csdn.net/m0_49713747/article/details/loginout被执行"+num);//num是一个对象,因为,在这个类里面没有所以要定义一下
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("你已退出,当前人数为:"+num);
}
}
xml文件没有发,是因为每个人的路径啥的都不一样,上面的所有代码都把导包给删除了