Spring mvc controller 基类封装

原创
2015/11/24 12:22
阅读数 2.5W

一、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);

	}
}



二、BaseController
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真是个好东西。



展开阅读全文
打赏
2
10 收藏
分享
加载中
ThreadLocal 是好东西。用的多了。不是释放 内存就炸了。
2018/05/18 08:47
回复
举报
modelandview线程不安全
2017/02/15 16:59
回复
举报

引用来自“冰封情”的评论

引用来自“漂泊者及其影子”的评论

引用来自“冰封情”的评论

1、感觉你这个ThreadLocal多此一举,requet和response已经再mvc存在ThreadLocal,没必要自己再搞一个基类
2、返回JSON直接用fastjson就可以直接整合进来了,也不用自己写了,直接返回responseBody即可
以上只是个人学识观点,有错勿喷。。。

回复@冰封情 : ModelAndView确实不好用,后来实际用,之前设计是为了给modelandview更多的功能,但request不好获取吧,从mvc相关对象
public HttpServletRequest getRequest(){
return ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
}
这个不是直接获取吗?想啥时候获取就啥时候获取

回复@冰封情 : 哦,学习了
2016/11/28 17:33
回复
举报

引用来自“漂泊者及其影子”的评论

引用来自“冰封情”的评论

1、感觉你这个ThreadLocal多此一举,requet和response已经再mvc存在ThreadLocal,没必要自己再搞一个基类
2、返回JSON直接用fastjson就可以直接整合进来了,也不用自己写了,直接返回responseBody即可
以上只是个人学识观点,有错勿喷。。。

回复@冰封情 : ModelAndView确实不好用,后来实际用,之前设计是为了给modelandview更多的功能,但request不好获取吧,从mvc相关对象
public HttpServletRequest getRequest(){
return ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
}
这个不是直接获取吗?想啥时候获取就啥时候获取
2016/11/28 15:26
回复
举报

引用来自“冰封情”的评论

1、感觉你这个ThreadLocal多此一举,requet和response已经再mvc存在ThreadLocal,没必要自己再搞一个基类
2、返回JSON直接用fastjson就可以直接整合进来了,也不用自己写了,直接返回responseBody即可
以上只是个人学识观点,有错勿喷。。。

回复@冰封情 : ModelAndView确实不好用,后来实际用,之前设计是为了给modelandview更多的功能,但request不好获取吧,从mvc相关对象
2016/11/28 08:51
回复
举报
1、感觉你这个ThreadLocal多此一举,requet和response已经再mvc存在ThreadLocal,没必要自己再搞一个基类
2、返回JSON直接用fastjson就可以直接整合进来了,也不用自己写了,直接返回responseBody即可
以上只是个人学识观点,有错勿喷。。。
2016/11/27 22:47
回复
举报

引用来自“艾伦HUC”的评论

ThreadLocal没有释放,严重不会造成内存溢出吗?

回复@艾伦HUC : 实际项目中我会在aop层清空设置的值
2016/11/22 20:21
回复
举报
ThreadLocal没有释放,严重不会造成内存溢出吗?
2016/11/22 14:15
回复
举报
更多评论
打赏
8 评论
10 收藏
2
分享
返回顶部
顶部