Spring mvc controller 基类封装

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



转载于:https://my.oschina.net/fengshuzi/blog/534676

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值