关于网友提出的“ SpringMVC request的获取问题”问题疑问,本网通过在网上对“ SpringMVC request的获取问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: SpringMVC request的获取问题描述:
springMVC 可以在父BaseController 里面使用
@Autowired
protected HttpServletRequest request;
获取request ?网上说springMVC 是单例模式会有问题,有没有哪位大师比较清楚这方面的,给个准确的答案,拜谢
解决方案1:
一般确实是单例,当前请求响应相关的状态应该从Controller方法参数,或通过Model来访问。一般获取request有两种方法。
1. 直接在控制器方法参数上声明,他在调用时会自己注入,这种方式简单,但是如果不是Controller而是调用函数内部需要的话,你就只能把对象传进去。
2. 可以在web.xml中声明监听器RequestContextListener:
org.springframework.web.context.request.RequestContextListener
然后在代码中需要的时候,可以通过RequestContextHolder的静态方法获取到HttpServletRequest等对象,比如专门写个工具类:
package org.fox.support.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* 获取上下文相关对象的静态工具
*
* @author Chen Rui
*/
public interface WebUtils {
/* ----- ----- ----- ----- 请求响应对象获取 ----- ----- ----- ----- */
/* NOTE 这些方法都依赖于Spring Web以及RequestContextListener的部署 */
/**
* 返回当前Servlet上下文的请求参数对象
*
* @return 返回当前Servlet上下文的请求参数对象
*/
public static ServletRequestAttributes getRequestAttributes() {
// NOTE 这里不使用getRequestAttributes()是为了防止RequestContextListener没有部署, 返回不可控的null值
// NOTE currentRequestAttributes()在RequestContextListener未部署,取不到对象时,会直接抛出异常
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
// 如果是ServletRequestAttributes,返回对象
if (requestAttributes instanceof ServletRequestAttributes) {
return (ServletRequestAttributes) requestAttributes;
} else {
// 一般出现这个异常原因是没有部署RequestContextListener且启用了JSF环境
throw new IllegalStateException("当前上下文环境非Servlet环境");
}
}
/**
* 返回当前上下文的请求对象
*
* @return 返回当前上下文的请求对象
*/
public static HttpServletRequest getRequest() {
return getRequestAttributes().getRequest();
}
/**
* 返回当前上下文的响应对象
*
* @return 返回当前上下文的响应对象
*/
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
/**
* 返回当前上下文Session Id
*
* @return 返回当前上下文Session Id
*/
public static String getSessionId() {
return getRequestAttributes().getSessionId();
}
/**
* 返回当前上下文Session
*
* @param isCreate 如果session不存在, 是否创建
* @return 返回当前上下文Session
*/
public static HttpSession getSession(boolean isCreate) {
return getRequest().getSession(isCreate);
}
/**
* 获取Spring Web应用程序上下文
* 只能得到顶层WebApplicationContext, 而无法得到MVC DispatchServlet管理的ApplicationContext
* 建议优先考虑Spring提供的ApplicationContextAware
*
* @return 返回当前Spring Web应用程序上下文
*/
public static WebApplicationContext getWebApplicationContext() {
return WebApplicationContextUtils.getWebApplicationContext(getRequest().getServletContext());
}
/**
* 获取Servlet上下文
* 建议优先考虑Spring提供的ServletContextAware
*
* @return 返回当前Servlet上下文
*/
public static ServletContext getServletContext() {
return getRequest().getServletContext();
}
}解决方案2:
我就想问你,你怎么注册的HttpServletRequest类型的bean,你是不是想问参数绑定啊