框架现在是4.0版本,相比3.×最大的变化就是前后端分离,前端页面显示和后端的逻辑设计完全分离,部署在不同的服务容器上。框架强力建议前段采用html+js(或者js框架比如 easyui、vue等等)的静态方案,但是这并不是强制,开发依然可以使用jsp、velocity等等前段解决方案,但是要求前段必须单独一个服务。这样做的目的是要求开发组将后端的业务通过接口的方式抽象出来,好处是不同平台的客户端,pc端、iOS、Android等等可以用共同的后端。减少后期的维护成本。
后端采用restful风格的接口,前后端用json的数据格式交换。后端除了返回单个数字、字符串、布尔型等标量其他的json都要符合ResponseData定义的接口标准。
//JSON有三个域,其中data
String RES_CODE_FILED="code";
String RES_MSG_FILED="message";
String RES_DATA_FILED="data";
//处理结果,0标识正常,其他的为错误号 ,具体错误好参见接口中的注释
int getCode();
//处理结果的文字说明
String getMessage();
//返回数据,可以是任何类型数据包括数组,如果返回多个结果可以用Map
Object getData();
这个接口有两个具体的实现ResponseSingleData和ResponseMapData,在客户端接受到这个JSON时可以用ResponseJSON来解析。框架中JsonResultUtils类提供了直接向HttpServletResponse写符合上述格式要求的JSON的便捷方法。所以在controller类中可以有多种方式来实现json格式的数据返回,示例代码如下:
//返回一个标量,比如:数字\字符串\布尔值等等
@RequestMapping(value = "/url", method = { RequestMethod.GET })
@ResponseBody
public boolean checkUserOptPower() {
return true;
}
//返回符合格式的JSON对象
@RequestMapping(value = "/url")
@ResponseBody
public ResponseData forExample() {
//仅仅返回成功信息
return new ResponseSingleData();
//返回错误信息
return new ResponseSingleData(ResponseData.ERROR_SESSION_TIMEOUT,
"用户没有登录或者超时,请重新登录。");
//返回单个数据对象
return ResponseSingleData.makeResponseData(new Object[]{"hello","world"});
//返回多个对象
ResponseMapData resData = new ResponseMapData();
resData.addResponseData(BaseController.OBJLIST, new Object[]{"hello","world"});
resData.addResponseData(BaseController.PAGE_DESC, new PageDesc());
return resData;
}
//用JsonResultUtils直接向 HttpServletResponse response 写json字符串的方式返回json
@GetMapping(value = "/url")
public void forExample(HttpServletResponse response) {
//返回一个标量
JsonResultUtils.writeOriginalObject(true, response);
//仅仅返回成功信息
JsonResultUtils.writeSuccessJson(response);
return;
//返回错误信息
JsonResultUtils.writeErrorMessageJson(ResponseData.ERROR_UNAUTHORIZED,
"用户没有登录或者超时,请重新登录",response);
return;
//返回单个数据对象
JsonResultUtils.writeSingleDataJson(new Object[]{"hello","world"}, response);
return;
//返回多个对象
ResponseMapData resData = new ResponseMapData();
resData.addResponseData(BaseController.OBJLIST, new Object[]{"hello","world"});
resData.addResponseData(BaseController.PAGE_DESC, new PageDesc());
JsonResultUtils.writeResponseDataAsJson(resData, response);
return;
}
前端获取后端返回的json字符串可以使用ResponseJSON来解析。示例代码:
java客户端
CloseableHttpClient client = HttpExecutor.createKeepSessionHttpClient();
ResponseJSON resJson = ResponseJSON.valueOfJson(HttpExecutor.simpleGet(client,"url"));
client.close();
js客户端
var Core = require('core/core');
Core.ajax(url, options)
.then(function(data) {
alert('成功');
})
// 如果需要捕获错误
.catch(function(data) {
alert('错误');
});