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);
下面这个过时了..貌似 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 (); } }
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() { // TODO Auto-generated method stub} @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 { // TODO Auto-generated method stub} } } }
<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() 得到