通用方法:
1.以参数的形式把request,response传入进去,这是SpringMVC中常用的一种方法
public String hello(HttpServletRequest request,HttpServletResponse response)
2.以注解的方法获取request,response
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;//这种方法获取的response 为空,建议以参数的形式获取
这种需要在web.xml里添加Listener
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
SpringMVC的Java获取方法:
1.
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse resp = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse();
这种方法在spring4.0版本之后才支持,如果低于4.0版本,可以采用通用方法。
注:本地项目升级到4.3的版本之后也试了下,reponse还是无法获取,此方法会报转换异常,这个方法不建议使用(2019-03-13)
2.
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response){
this.request = request;
this.response = response;
this.session = request.getSession();
}
目前作者自己的工具类里就是采用这种方法。有的小伙伴里的工具类里面的getRequest(),getResponse()方法是静态方法,这里不要把成员变量设置成静态成员变量。这样在多线程的情况下会引起安全问题。
3.
@Component("springMVCInterceptor")
public class SpringMVCInterceptor extends HandlerInterceptorAdapter {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// 获得当前父类的class
Class baseActionClass = BaseAction.class;
// 获得当前action的class
Class newClass = Class.forName(handler.getClass().getName())
.newInstance().getClass();
// 判断是否有父子关系
if (baseActionClass.isAssignableFrom(newClass)) {
//注入request、response对象
BaseAction ba = (BaseAction) handler;
ba.setRequest(request);
ba.setResponse(response);
}
return super.preHandle(request, response, handler);
}
}
拦截器配置:
<!-- baseAction通过拦截注入request、response对象 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<ref bean="springMVCInterceptor" />
</list>
</property>
</bean>
<mvc:interceptors>
<bean id="springMVCInterceptor" class="com.netsdar.zm.action.SpringMVCInterceptor">
</bean>
</mvc:interceptors>
<!-- baseAction通过拦截注入request、response对象 -->
这种方法作者也试过,但是会在 Class newClass = Class.forName(handler.getClass().getName()) .newInstance().getClass() 和BaseAction ba = (BaseAction) handler这两段代码出现异常,有解决的小伙伴可以跟我说说解决办法。。。