j2ee建立在线聊天室详细教程(第五天LoadDataAction,LoadUserAction)

199 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第十五天,点击查看活动详情

---------20220619 昨天的文章由于太晚了,并且昨天的文章也没有什么特别具有难度的知识点,所以昨天写的较为轻松。那么我们昨天讲解了五个Action里面的ExitAction,LoadDataAction,LoadUserAction,LoginAction,SendMassageAction其中的第一个ExitAction。今天就先介绍两个吧,分别是第二个和第三个LoadDataAction,LoadUserAction。 那就开始吧!大家加油呀


LoadDataAction

代码部分

package action.impl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import cn.edu.cuit.action.Action;
import cn.edu.cuit.bean.ChatMassage;
import net.sf.json.JSONObject;

/**
 * @author zzl
 *	聊天数据加载控制
 */
public class LoadDataAction implements Action {

	public Object execute(HttpServletRequest req, HttpServletResponse res) {
		
		HttpSession session = req.getSession();
		String numb = req.getParameter("num");
		int num;
		if(numb==null){
			num = Integer.valueOf(session.getAttribute("massageNumber").toString());
		}else{
			num = Integer.valueOf(numb.trim());
		}
		ChatMassage cm = ChatMassage.Instance();
		String mass = cm.getMassage(num);

		int massageNumber=cm.mass_num;
		session.setAttribute("massageNumber", massageNumber);
		JSONObject json = new JSONObject();
		json.put("massage", mass);				
		json.put("massageNumber", massageNumber);	
		return json;
	}

}

讲解部分

正如代码上面所写,这个代码的作用是聊天数据的加载与控制
那么我们这边跟着源码走一遍,首先是这边源码中写到的session,这个在我之前写的文章里面出现过 第三次war包相关问题记录含session域application域讲解(第七次J2EE学习) - 掘金 (juejin.cn),那么这边也就再讲一下

Session

什么是Session呢?这其实就是服务器为了保存用户状态而创建的一个特殊的对象,当浏览器第一次访问服务器时,服务器创建一个session对象(该 对象有一个唯一的id,一般称之为sessionId),服务器会将sessionId 以cookie的方式发送给浏览器。 当浏览器再次访问服务器时,会将sessionId发送过来,服务器依据 sessionId就可以找到对应的session对象。
那么我们这边获得session对象的方法是通过HttpSession session = req.getSession()语句,HttpSession是一个接口。
之后一步一步走,这边定义int类型变量 num,这边是在获得上次加载时客户端信息总数,使用if else语句,难度不会太大,然后之后是我们昨天就讲到的单例,定义cm(突然打小括号发言!这边就完全是一环套一环呀,大家看的时候尽量每一个系列都看哦!),通过session.setAttribute("massageNumber", massageNumber)语句,得到当前聊天信息总数,我们所得到的信息,还需要组织返回json对象。

json是什么呢

JSON: JavaScript Object Notation(JavaScript 对象表示法),指的是存储和交换文本信息的语法,类似 XML。但JSON 比 XML 更小、更快,更易解析。
通过JSONObject json = new JSONObject()语句进行返回,其中json.put("massage", mass)返回为聊天记录,json.put("massageNumber", massageNumber)为聊天记录数

LoadUserAction

现在进入下一个部分,LoadUserAction

代码部分

package action.impl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.edu.cuit.action.Action;
import cn.edu.cuit.bean.ChatMassage;
import net.sf.json.JSONObject;

/**
 * @author zzl
 *	用户数据加载控制
 */
public class LoadUserAction implements Action {

	public Object execute(HttpServletRequest req, HttpServletResponse res) {
		ChatMassage cm = ChatMassage.Instance();	
		String users = cm.getUsers();	
		int currentUserCount = cm.userNum;		
		JSONObject json = new JSONObject();
		json.put("num", currentUserCount);
		json.put("userMass", users);
		return json;
	}

}

讲解部分

这个代码的作用是对于用户数据加载控制,大家肯定都觉得没有任何难点,我这边就只讲一下我们昨天提到,但没有细致讲解的单例吧

单例

什么是单例模式?
保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

为什么要用单例模式?
1、单例模式节省公共资源

比如:大家都要喝水,但是没必要每人家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。

对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。

2、单例模式方便控制

就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种多人干扰的问题出现。
这也就是所谓的单例\


今天的内容依旧较为简单,希望我的讲解可以帮到大家,晚安呀!