j2ee建立在线聊天室详细教程(第十天JSON相关)

141 阅读2分钟

我正在参与掘金创作者训练营第5期,点击了解活动详情

-------20220807
我的问题,前几天因为太忙了,所以没怎么更作业,不过课程直播还是有在听的,今天更新一下作业,这也是之前其实更聊天室没更完的内容,好久没更聊天室这一块了

源码讲解

今天分享的是Action.java和ActionServlet.java
image.png

Action.java

package cn.edu.cuit.action;

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

/**
 * 
 * @author zzl
 *
 */
public interface Action {
	public Object execute(HttpServletRequest req, HttpServletResponse res);
}

这个代码的意义在于对于控制器接口定义,这边没什么好讲的

ActionServlet.java

package cn.edu.cuit.action;

import java.io.IOException;

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

import cn.edu.cuit.action.impl.ExitAction;
import cn.edu.cuit.action.impl.LoadDataAction;
import cn.edu.cuit.action.impl.LoadUserAction;
import cn.edu.cuit.action.impl.LoginAction;
import cn.edu.cuit.action.impl.SendMassageAction;
import net.sf.json.JSONObject;

/**
 * 
 * @author fhzheng
 *
 */
public class ActionServlet extends HttpServlet {
	private static final long serialVersionUID = -3547709943224681062L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		String currentURL = req.getServletPath();
		//System.out.println(currentURL);
		req.setCharacterEncoding("utf-8");
		String path = currentURL.substring(0, currentURL.indexOf("."));

		Action action = null
		
		if ("/login".equalsIgnoreCase(path)) {
			action = new LoginAction();
		} else if ("/loadData".equalsIgnoreCase(path)) {
			action = new LoadDataAction();
		} else if ("/sendMassage".equalsIgnoreCase(path)) {
			action = new SendMassageAction();
		} else if ("/loadUser".equalsIgnoreCase(path)) {
			action = new LoadUserAction();
		} else if ("/exit".equalsIgnoreCase(path)) {
			action = new ExitAction();
		}
		
		Object result = action.execute(req, res); 

		if (result instanceof String) {
			req.getRequestDispatcher(result.toString()).forward(req, res);
		} else if (result instanceof JSONObject) {
			res.setCharacterEncoding("utf-8");
			res.getWriter().print((JSONObject) result);
		}

	}

}

代码讲解

那我们现在可以进行一下对于代码的讲解,重点是ActionServlet.java的代码,这部分代码是控制器控制逻辑实现
这边的req.setCharacterEncoding("utf-8")代码功能为得到请求路径,使用Action接口处理请求响应的代码语句为Action action = null;
那么收到请求后,会根据请求的uri生成Action实例对象,其中源码中的if、else if条件跳转为登录、加载对话信息、发送消息、加载用户列表几项,具体难度不大。
Object result = action.execute(req, res);这段代码的作用是直接获取请求响应的处理结果对象,之后返回的结果,需要进行一个判断,如果返回的结果是String类型,则转发跳转,req.getRequestDispatcher(result.toString()).forward(req, res);如果返回的结果是json对象,则直接发送到浏览器

json对象是什么

JS对象表示法,是一种轻量级的数据交换格式
使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,可以被任何编程语言读取以及作为数据格式传递。是目前服务端与客户端交换数据中使用最为广泛的标准格式

JSON的取值方式和修改方式:

如:var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ];

取值:employees[0].lastName

修改数据:employees[0].lastName="Jobs"

如:var employees = [ { "firstName":"Bill"}]

取值:employees[firstname]  或者 employees.firstname

JS对象与JSON格式的区别

JS对象JSON
不能传输可以跨平台
键值对方式,key不需要加引号键值对方式,key必须加引号
值可以是函数、对象、字符串、数字等值不能是函数、undefined、NaN