文档章节

Spring mvc controller 基类封装

漂泊者及其影子
 漂泊者及其影子
发布于 2015/11/24 12:22
字数 623
阅读 10580
收藏 10

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



© 著作权归作者所有

漂泊者及其影子
粉丝 43
博文 121
码字总数 72105
作品 0
广州
程序员
私信 提问
加载中

评论(8)

小王来了
小王来了
ThreadLocal 是好东西。用的多了。不是释放 内存就炸了。
天可汗1987
modelandview线程不安全
漂泊者及其影子
漂泊者及其影子 博主

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

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

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

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

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

回复@冰封情 : 哦,学习了
冰封情
冰封情

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

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

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

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

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

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

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

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

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

回复@艾伦HUC : 实际项目中我会在aop层清空设置的值
艾伦HUC
艾伦HUC
ThreadLocal没有释放,严重不会造成内存溢出吗?
Spring 3.x Web MVC

本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1142 Spring 3.x Web MVC Spring mvc 特点 @ 功能组件划分细致 @ 灵活、强大 @ 设计思想优秀 MVC框......

智慧点点
2018/08/26
19
0
构建ant-framework框架的pom.xml文件配置

ant-framework是ant分布式框架的基础核心框架,其中包括CRUD,MVC等一系列基类和模板。另外定义了spring,mybatis,wink等底层框架扩展项目,具体内容包括: 其中ant-framework是ant分布式框...

明理萝
2018/08/24
19
1
使用Titan Framework搭建一个集群Demo

Titan Framework是一款分布式微服务框架,因其具有简单的配置方式,良好的集成性、多样化的支持、丰富的自定义扩展功能,所以它是非常值得我们去应用的。也正是因为它强大的集群特性,使得它...

云季科技
2018/10/18
17
0
SpringMVC知识梳理(一)

什么是SpringMVC SpringMVC其实就是spring框架的一个模块,SpringMVC和spring之间可以无缝整合,SpringMVC也是一个非常优秀的基于MVC的web框架,什么是MVC这里就不多说了,下面来了解一下spr...

iHuawen
2017/12/28
0
0
仿照源码,手写一个自定义 Spring MVC 框架

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/97947618 前言 上节课我们学习了 Spring M...

GitChat技术杂谈
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

领域驱动中的“贫血症和失忆症”

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态...

还仙
8分钟前
2
0
条码打印软件中标签预览正常打印无反应怎么解决

在使用条码打印软件制作标签时,有客户反馈,标签打印预览正常的,但是打印无反应,咨询是怎么回事?今天针对这个情况,可以参考以下方法进行解决。 一、预览正常情况下,打印没反应 (1)在条码...

中琅软件
18分钟前
2
0
判断字符串的时候

判断字符串的时候一定把常量房前边, //报警程度 String leve = vo.getDeviceAlertDeal().getWarnLevel(); if(("0").equals(leve)) { row.add("无报警"); }else if(("1").equals(leve)) { ro......

简小姐
18分钟前
3
0
Linux maven3.6.2 install

PS:安装 maven 之前请先安装 jdk 1.安装 wget 命令(安装过就不用了) yum -y install wget 2.寻找需要的 maven 版本 https://maven.apache.org/download.cgi 3.进入 /var/local 文件夹 cd...

东方神祇
20分钟前
2
0
Tomcat源码分析二:先看看Tomcat的整体架构

Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server、Service、Connector、Container等组件,接下...

flygrk
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部