SpringMVC的Controller中使用线程安全的初始化
因为SpringMVC的Controller默认是单例, 在这种情况下, Controller中使用的私有变量必须也是单例, 例如各种service, 否则会有多线程访问数据互相修改的问题.
对于需要对一类Controller做相同初始化的需求, 可以通过@ModelAttribute("some-variable") public init() 这样的方法解决.
首先创建一个基类如BasicController, 构造一个拦截器, 对基类实现preHandle(), postHandle()方法
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) throws Exception
{
RequestBean requestBean = (RequestBean)request.getAttribute(RequestBean.ATTR_KEY);
if (requestBean != null)
{
requestBean.destroy();
request.removeAttribute(RequestBean.ATTR_KEY);
long current = System.currentTimeMillis();
logger.debug("Page end: " + current + ", time: " + (current - requestBean.getTimestamp()) + " milliseconds");
}
} public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView mav) throws Exception
{
if (handler instanceof HandlerMethod && mav != null)
{
HandlerMethod hm = (HandlerMethod)handler;
if (BasicController.class.isAssignableFrom(hm.getBean().getClass()))
{
mav.addObject("sys_config", Config.getConfigs());
}
}
} public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
long timestamp = System.currentTimeMillis();
logger.debug("Page start: " + timestamp); if (handler instanceof HandlerMethod)
{
HandlerMethod hm = (HandlerMethod)handler;
if (BasicController.class.isAssignableFrom(hm.getBean().getClass()))
{
RequestBean requestBean = new RequestBean(request, response, timestamp);
request.setAttribute(RequestBean.ATTR_KEY, requestBean);
}
}
return true;
}
然后在BasicController中, 通过如下形式对每次访问作初始化
@ModelAttribute("requestBean")
public RequestBean initRequest(HttpServletRequest request) {
return (RequestBean)request.getAttribute(RequestBean.ATTR_KEY);
}
然后在Controller方法中, 就可以直接引用这个初始化好的变量了
@RequestMapping(value = {"/edit","/add"}, method = RequestMethod.GET)
public String doEdit(
@ModelAttribute("requestBean") RequestBean rb)
{
...
}
@ModelAttribute("requestBean")
SpringMVC的Controller中使用线程安全的初始化的更多相关文章
- springmvc的controller中使用@Transactional无效
最近看mybatis的时候做了一个练习,但是进行事务处理的时候出了问题,如下 package com.henu.lz.controller; import org.springframework.be ...
- springmvc 解决 controller 中出现死循环并 stackoverflow 的问题
这是因为这个controller中的方法返回值为void类型,且没有request response这类衍生的重定向,或者返回值为String,但是是null等等的情况,都会引起死循环,然后stack ...
- 在springMVC的controller中获取request,response对象的一个方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...
- springMVC:将controller中数据传递到jsp页面
1> 将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如: newModelAndView("/WEBINF/jsp/showData.j ...
- 9.SpringMVC和json结合传递数据 && 10.SpringMVC获取controller中json的数据
- 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- SpringMVC Controller中注入Request成员域和在方法中定义中HttpServletRequest有啥区别
先说结论,在Controller中注入Request是线程安全的. 以下是解释: 我们先来看看这两者有什么不同 在controller注入成员变量request 可以看到注入的是一个代理对象 写在方法 ...
- (转)聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
随机推荐
- Android 插件化
1.介绍 涛哥写的文章 <Android 插件化的 过去 现在 未来> http://kymjs.com/code/2016/05/04/01#rd
- 【代码笔记】iOS-带输入框的UIAlertView
一,效果图. 二,代码. //点击任何处,弹出输入框 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIAlertV ...
- MongoDB 安装(Window/Linux)
MongoDB安装在Windows上 在 Windows上,首先要安装 MongoDB下载最新发布的MongoDB: http://www.mongodb.org/downloads 确保得到正确的版 ...
- JavaScript(七)——视频插入
代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- 问题解决——开启Guest后仍无法共享打印机
==================================声明================================== 本文版权归作者所有 未经作者授权 请勿转载 保留法律追究的 ...
- my_mosaic
//功能:输入想要打马赛克的坐标点,宽,高以及每个边需要划分的块数进行打马赛克 //只能处理位图,根据不同色深定义depth即可 //还没写从文件头读取图片分辨率 #include<unistd ...
- redis 下载启动,设置、查询超时时间
1.定义 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...
- cookie实现自动登录
有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机).实现这个功能关键就是服务端要识别客户的身份.而用Cookie ...
- Android界面隐藏软键盘的探索(兼findViewById返回null解决办法)
最近写的APP,老师说我的登陆界面虽然有ScrollView滑动,但用户体验不太好,因为软键盘会挡住输入框或登录button(小米Pad,横屏,当指定只能输入数字时没找到关闭系统自带键盘的下箭头). ...
- 报表性能优化方案之单数据集分页SQL实现层式报表
1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分 ...