大数据必学Java基础(一百一十七):三个案例开发

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据必学Java基础(一百一十七):三个案例开发相关的知识,希望对你有一定的参考价值。

文章目录

三个案例开发

一、记录请求日志

二、统计实时在线人数

三、项目重启免登录

1、序列化与反序列

2、序列化的用途

3、实现步骤

4、开发过程 


三个案例开发

一、记录请求日志

需求:记录每次请求中如下的信息并存储进入日志文件

  • 请求的来源
  • 浏览器所在电脑IP
  • 请求的资源 URL 
  • 请求发生的时间 

监听器代码

package com.lanson.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@WebListener
public class RequestLogListener implements ServletRequestListener 
    private SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public void requestDestroyed(ServletRequestEvent sre) 
    
    @Override
    public void requestInitialized(ServletRequestEvent sre) 
        // 获得请求发出的IP
        // 获得请求的URL
        // 获得请求产生的时间
        HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
        String remoteHost = request.getRemoteHost();
        String requestURL = request.getRequestURL().toString();
        String reqquestDate = simpleDateFormat.format(new Date());
        // 准备输出流
        try 
            PrintWriter pw =new PrintWriter(new FileOutputStream(new File("d:/lanson.txt"),true));
            pw.println(remoteHost+" "+requestURL+" "+reqquestDate );
            pw.close();
         catch (FileNotFoundException e) 
            e.printStackTrace();
        
    

二、统计实时在线人数

需求:

  • 当任何一个账户处于登录状态时,在线统计总数+1,离线时-1
  • 通过session监听器实现计数,但是在线人数要保存在Application域中

准备监听器

package com.lanson.listener;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@WebListener
public class OnLineNumberListener implements HttpSessionListener  
    @Override
    public void sessionCreated(HttpSessionEvent se) 
        // 向application域中 增加一个数字
        HttpSession session = se.getSession();
        ServletContext application = session.getServletContext();
        Object attribute = application.getAttribute("count");
        if(null == attribute)// 第一次放数据
            application.setAttribute("count", 1);
        else
            int count =(int)attribute;
            application.setAttribute("count", ++count);
        
    
    @Override
    public void sessionDestroyed(HttpSessionEvent se) 
        // 向application域中 减少一个数字
        HttpSession session = se.getSession();
        ServletContext application = session.getServletContext();
        int count =(int)application.getAttribute("count");
        application.setAttribute("count", --count);
    

准备销毁监听的servlet

package com.lanson.servlet;
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;
import java.io.IOException;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/logout.do")
public class Logout extends HttpServlet 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        HttpSession session = req.getSession();
        session.invalidate();
    

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title%sSourceCode%lt;/title>
  </head>
  <body>
  当前在线人数为:$applicationScope.count
  </body>
</html>

分别用不同的客户端访问index.jsp 和logout.do测试即可

三、项目重启免登录

Session序列化和反序列化

1、序列化与反序列

把对象转化为字节序列的过程称为序列化(保存到硬盘,持久化)

把字节序列转化为对象的过程称为反序列化(存放于内存)

2、序列化的用途

把对象的字节序列永久保存到硬盘上,通常放到一个文件中。

把网络传输的对象通过字节序列化,方便传输本节作业

3、实现步骤

     要想实现序列化和反序列化需要手动配置

3.1、新建文件如图所示:

3.2、Context.xml中文件如下

<?xml version="1.0" encoding="UTF-8"?>

  <Context>

       <Manager className="org.apache.catalina.session.PersistentManager">

         <Store className="org.apache.catalina.session.FileStore" directory="d:/session"/>

      </Manager>

  </Context>

3.3、注意实体类必须实现serializable接口

4、开发过程 

4.1、准备实体类

package com.lanson.pojo;
import java.io.Serializable;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class User  implements Serializable 
    private String username;
    private String pwd;

4.2、开发登录信息输入页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title%sSourceCode%lt;/title>
  </head>
  <body>
  <form action="loginController.do" method="post">
    用户名:<input type="text" name="user"> <br/>
    密码:<input type="password" name="pwd"><br/>
    <input type="submit" value="提交">
  </form>
  </body>
</html>

4.3、开发登录信息验证Servlet

package com.lanson.controller;
import com.lanson.listener.MySessionActivationListener;
import com.lanson.pojo.User;
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;
import java.io.IOException;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet("/loginController.do")
public class LoginController extends HttpServlet 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        String username = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        // user
        User user =new User(username,pwd);
        // session
        HttpSession session = req.getSession();
        session.setAttribute("user", user);
    

4.4、开发校验当前是否已经登录的Controller

package com.lanson.controller;
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;
import java.io.IOException;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/loginCheckController.do")
public class LoginCheckController extends HttpServlet 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        // 判断是否登录
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        Object listener = session.getAttribute("listener");// 获得对应的监听器
        String message ="";
        if(null != user)
            message="您已经登录过";
        else
            message="您还未登录";
        
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println(message);
    

4.5、测试,先登录

然后请求loginCheckController.do 校验是否登录过,然后重启项目,再起请求loginCheckController.do 校验是否登录过,发现重启后,仍然是登录过的。

4.6、监听钝化和活化

准备监听器

package com.lanson.listener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class MySessionActivationListener implements HttpSessionActivationListener, Serializable 
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) 
        System.out.println(se.getSession().hashCode()+"即将钝化");
    
    @Override
    public void sessionDidActivate(HttpSessionEvent se) 
        System.out.println(se.getSession().hashCode()+"已经活化");
    

登录时绑定监听器

@WebServlet("/loginController.do")
public class LoginController extends HttpServlet 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        String username = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        // user
        User user =new User(username,pwd);
        // session
        HttpSession session = req.getSession();
        session.setAttribute("user", user);
        // 绑定监听器
        session.setAttribute("listener", new MySessionActivationListener());
    

重启项目,重复测试即可。


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于大数据必学Java基础(一百一十七):三个案例开发的主要内容,如果未能解决你的问题,请参考以下文章

大数据必学Java基础(一百一十一):过滤器注解应用和开发案例

大数据必学Java基础(一百一十三):监听器概念引入

大数据必学Java基础(一百一十):过滤器初始化参数

大数据必学Java基础(一百一十四):Requet域监听器

大数据必学Java基础(一百一十五):Session域监听器

大数据必学Java基础(一百一十六):Application域监听器