一、ModelAndView 封装
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.view.json.MappingJacksonJsonView;
import com.iflashbuy.base.util.StringUtil;
/**
* 自己建造了一个ModelAndView,只是为了让自己调用方法舒服些,不喜勿用
*
* @author limanman
* @date 2015年11月18日
*/
public class ModelAndView extends org.springframework.web.servlet.ModelAndView {
private Logger logger = LoggerFactory.getLogger(getClass());
public void setState(String state) {
super.addObject("state", state);
}
public void put(String key, Object value) {
addObject(key, value);
}
public ModelAndView() {
}
public ModelAndView(String viewName) {
if ("json/json".equals(viewName)) {
setView(new MappingJacksonJsonView());
} else {
logger.debug("即将跳转到页面:" + viewName);
setViewName(viewName);
}
}
public void noticeSuccess() {
setState("success");
}
public void noticeFailure(String message) {
this.setState("error");
this.setMessage(message);
if(StringUtil.isNotEmpty(message)) {
logger.warn("invoke method failure:"+ message);
}
}
public void setState(String state, String message) {
super.addObject("state", state);
super.addObject("message", message);
}
public void setMessage(String message) {
super.addObject("message", message);
}
}
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.view.json.MappingJacksonJsonView;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.iflashbuy.base.util.JsonUtil;
/**
* 基础控制类 ,持续扩展
*
* @author limanman
* @date 2015年11月24日
*/
public class BaseController {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* ThreadLocal确保高并发下每个请求的request,response都是独立的
*/
private static ThreadLocal<ServletRequest> currentRequest = new ThreadLocal<ServletRequest>();
private static ThreadLocal<ServletResponse> currentResponse = new ThreadLocal<ServletResponse>();
private static ThreadLocal<CommonParams> currentParams = new ThreadLocal<CommonParams>();
/**
* 线程安全初始化reque,respose对象
*
* @param request
* @param response
* @date 2015年11月24日
* @author 漂泊者及其影子
*/
@ModelAttribute
public void initReqAndRep(HttpServletRequest request, HttpServletResponse response) {
currentRequest.set(request);
currentResponse.set(response);
}
@ModelAttribute
public void initCommonParams(String para) {
if (StringUtils.isNotEmpty(para)) {
try {
CommonParams commonParams = JsonUtil.formJson(para, CommonParams.class);
currentParams.set(commonParams);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
logger.info( gson.toJson(commonParams));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 获取app传递的params参数
*
* @return
* @date 2015年11月24日
* @author 漂泊者及其影子
*/
public CommonParams getParams() {
return currentParams.get();
}
/**
* 线程安全
*
* @return
* @date 2015年11月24日
* @author 漂泊者及其影子
*/
public HttpServletRequest request() {
return (HttpServletRequest) currentRequest.get();
}
/**
* 线程安全
*
* @return
* @date 2015年11月24日
* @author 漂泊者及其影子
*/
public HttpServletResponse response() {
return (HttpServletResponse) currentResponse.get();
}
public static final String SUCESS = "success";
// jsp 返回
public static final String FAILURE = "failure";
// app端返回
public static final String ERROR = "error";
// 返回json
public static final String JSON_VIEW = "json/json";
// ------------------------------------------------------------------constants
/**
* 偷下懒
*
* @param mv
* @return
* @date 2015年11月18日
* @author 佚名
*/
public ModelAndView modelAndView(ModelAndView mv) {
if (mv.getModel().get("state") == null) {
mv.noticeSuccess();
}
if (!mv.hasView()) {
mv.setView(new MappingJacksonJsonView());
}
return mv;
}
/**
* 跳转到到登录页面(jsp接口调用)
*
* @return
* @date 2015年11月18日
* @author 佚名
*/
public ModelAndView toLoginView() {
return new ModelAndView("leaguer/loginNew");
}
}
三、扩展
也可以吧ThreadLocal相关的东西放在拦截器里面做,不通过basecontroller实现,我后来想来想在项目中就是这样做的
ThreadLocal也可以放在一个单独的类里面,比如ContextThread,放置各种ThreadLocal变量
总之,ThreadLocal真是个好东西。