文章来源:http://blog.csdn.net/kvgnt/archive/2011/02/21/6198750.aspx
struts2里关于 Spring Aop 切面方法里直接使用 com.opensymphony.xwork2.ActionContext 就可以得到了.初学绕了一个大弯..唉.
当然,action里也可以这么拿.不过action里更建议实现 SessionAware, ServletRequestAware, ServletResponseAware 这3个接口来获得.假如使用的是实现接口的方式,不要在构造函数里使用这3个对象,因为action对象构建时这3个对象还不一定获取到,可能空指针.
- Map<String,Object> session = (Map<String,Object>)ActionContext.getContext().getSession();
- HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
- HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);
或直接用
HttpServletRequest request = ServletActionContext.getRequest();
下面这个过时了..貌似 struts1 里是这么干的.
建立一个类,里面的2个静态变量ThreadLocal用来保存当前线程的request和response
- package com.exdoit.tool;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class SysContent {
- private static ThreadLocal<HttpServletRequest> requestLocal= new ThreadLocal<HttpServletRequest>();
- private static ThreadLocal<HttpServletResponse> responseLocal= new ThreadLocal<HttpServletResponse>();
-
- public static HttpServletRequest getRequest() {
- return (HttpServletRequest)requestLocal.get();
- }
- public static void setRequest(HttpServletRequest request) {
- requestLocal.set(request);
- }
- public static HttpServletResponse getResponse() {
- return (HttpServletResponse)responseLocal.get();
- }
- public static void setResponse(HttpServletResponse response) {
- responseLocal.set(response);
- }
- public static HttpSession getSession() {
- return (HttpSession)((HttpServletRequest)requestLocal.get()).getSession();
- }
- }
创建一个过滤器.把 当前线程的request和response 赋到之前类的静态变量里
- package com.exdoit.aop;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.exdoit.tool.SysContent;
- public class GetContent implements Filter {
- @Override
- public void destroy() {
-
- }
- @Override
- public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
- SysContent.setRequest((HttpServletRequest) arg0);
- SysContent.setResponse((HttpServletResponse) arg1);
- arg2.doFilter(arg0, arg1);
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
-
- }
- }
配置WEB.XML,加载过滤器我把这段节点放到了web.xml的最前面.保证一开始就得到变量
view plain
copy to clipboard
print
?
- <filter>
- <filter-name>GetContent</filter-name>
- <filter-class>com.exdoit.aop.GetContent</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>GetContent</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
拦截器里的执行方法
public void rightFilter(JoinPoint joinPoint) throws Exception {
- HttpServletRequest request = SysContent.getRequest();
- HttpServletResponse response = SysContent.getResponse();
- HttpSession session = SysContent.getSession();
-
- }
之后在其他拦截器或action...等对象中,要使用这3个变量.都可以直接通过SysContent.getXX() 得到参考
http://www.javaeye.com/topic/103804 正确理解ThreadLocal
http://www.javaeye.com/topic/617368 关于ThreadLocal模式的体会