我正在参与掘金创作者训练营第5期,点击了解活动详情
-------20220807
我的问题,前几天因为太忙了,所以没怎么更作业,不过课程直播还是有在听的,今天更新一下作业,这也是之前其实更聊天室没更完的内容,好久没更聊天室这一块了
源码讲解
今天分享的是Action.java和ActionServlet.java
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 |