首先了解ThreadLocal的意义以及作用:
https://blog.youkuaiyun.com/lufeng20/article/details/24314381
我在使用SSM开发项目的时候,对于异步请求,在控制器中是通过自定义一个AjaxResult工具类来去接受和传递数据给前端result的。并且对这段代码进行捕获。例如:
@ResponseBody
@RequestMapping("/doAdd")
public Object add(User user) {
AjaxResult result = new AjaxResult();
try {
int count = userService.saveUser(user);
result.setSuccess(true);
result.setMessage("新增用户成功!");
} catch(Exception e) {
e.printStackTrace();
result.setSuccess(false);
result.setMessage("新增用户失败!");
}
return result;
}
导致每个异步请求的控制器模块代码冗余严重。
可以使用建立一个父类,让对应这些类去继承它。
同时注意,不能使用成员变量,因为控制器对象默认是单例的。会出现多线程并发问题,可以通过ThreadLocal来共享数据。
整个过程就是相当于定义一个Map集合,然后再把数据往里面放就可以了。避免多个方法调用这个集合造成了多线程问题,再把它放到ThreadLocal中。
import java.util.HashMap;
import java.util.Map;
public class BaseController {
private ThreadLocal<Map<String,Object>> datas = new ThreadLocal<Map<String,Object>>();
protected void start() {
Map<String,Object> resultMap = new HashMap<String,Object>();
datas.set(resultMap);
}
public Object end() {
Map<String,Object> resultMap = datas.get();
datas.remove();
return resultMap;
}
public void success(boolean flg) {
Map<String,Object> resultMap = datas.get();
resultMap.put("success", flg);
}
public void param(String key,Object val) {
Map<String,Object> resultMap = datas.get();
resultMap.put(key, val);
}
public void error(String msg) {
Map<String,Object> resultMap = datas.get();
resultMap.put("error", msg);
}
}