1。访问或添加request/session/application属性
将前一篇文件中的TestAction中的代码修改为如下所示:
public class TestAction { public String execute() { ActionContext ctx = ActionContext.getContext(); ctx.getApplication().put("app", "应用范围");// 往ServletContext里放入app ctx.getSession().put("ses", "session范围");// 往session里放入ses ctx.put("req", "request范围");// 往request里放入req return "success"; } }
result.jsp中的代码修改为:
<body> ${applicationScope.app} <br> ${sessionScope.ses}<br> ${requestScope.req}<br> </body>
然后访问testAction,reault.jsp页面显示的内容为:
应用范围
session范围
request范围。
在上面的程序中也可以向request/session/application添加集合对象,然后使用jstl标签<c:forEach>在jsp页面迭代,就像使用servlet和jsp编程一样的方式。
2。获取HttpServletRequest / HttpSession / ServletContext / HttpServletResponse对象
方式一、与Servlet解耦合的非IOC方式
获取的scope对象与容器无关,通过ActionContext获取。
public class TestAction { ActionContext context; Map<String,Object> request; Map<String,Object> session; Map<String,Object> application; @SuppressWarnings("unchecked") public String execute() throws Exception { context=ActionContext.getContext(); //request= (Map)context.get("request"); session=context.getSession(); application=context.getApplication(); context.put("req", "request范围");// 往request里放入req //request.put("req", "requst属性");//或者使用这种方式 session.put("ses", "sesion属性"); application.put("app", "application属性"); return "success"; } }
result.jsp中的代码修改为:
${requestScope.req} ${sessionScope.ses} ${applicationScope.app} <h4>以下使用scope.getAttribute的形式来接受</h4> request: <%=request.getAttribute("req") %><br> session: <%=session.getAttribute("ses") %><br> application:<%=application.getAttribute("app") %><br>
页面访问显示结果为:
requst属性 sesion属性 application属性 以下使用scope.getAttribute的形式来接受 request: requst属性 session: sesion属性 application:application属性
ActionContext中的部分源码如下所示:
public class ActionContext implements Serializable{ Map<String, Object> context; public ActionContext(Map<String, Object> context) { this.context = context; } public void setApplication(Map<String, Object> application) { put("com.opensymphony.xwork2.ActionContext.application", application); } public Map<String, Object> getApplication() { return ((Map) get("com.opensymphony.xwork2.ActionContext.application")); } public void setSession(Map<String, Object> session) { put("com.opensymphony.xwork2.ActionContext.session", session); } public Map<String, Object> getSession() { return ((Map) get("com.opensymphony.xwork2.ActionContext.session")); } public Object get(String key) { return this.context.get(key); } }
分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在Map中的对象。
方式二、与Servlet解耦合的IOC方式
实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)
import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.RequestAware; import org.apache.struts2.interceptor.SessionAware; public class TestAction implements RequestAware,SessionAware,ApplicationAware { Map<String, Object> request; Map<String, Object> session; Map<String, Object> application; public String execute() throws Exception { request.put("req", "requst属性"); session.put("ses", "sesion属性"); application.put("app", "application属性"); return "success"; } public void setRequest(Map<String, Object> request) { System.out.println("request:" + request.getClass().getName()); this.request=request; } public void setSession(Map<String, Object> session) { System.out.println("session:" + session.getClass().getName()); this.session=session; } public void setApplication(Map<String, Object> application) { System.out.println("application:" + application.getClass().getName()); this.application=application; } }
当访问testAction时,控制台打印出的信息如下所示:
application:org.apache.struts2.dispatcher.ApplicationMap session:org.apache.struts2.dispatcher.SessionMap request:org.apache.struts2.dispatcher.RequestMa
RequestAware接口的源码如下所示:其他接口的源码类似。
public interface RequestAware { public abstract void setRequest(Map<String, Object> paramMap); }
方式三、与Servlet耦合的非IOC方式
通过ServletActionContext.类直接获取:
public class TestAction { HttpServletRequest request; HttpSession session; ServletContext application; public String execute() throws Exception { request = ServletActionContext.getRequest(); session = request.getSession(); application = ServletActionContext.getServletContext(); request.setAttribute("req", "requst属性"); session.setAttribute("ses", "sesion属性"); application.setAttribute("app", "application属性"); return "success"; } }
方式四、与Servlet耦合的IOC方式
实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)
public class TestAction implements ServletRequestAware,ServletResponseAware,ServletContextAware{ private ActionContext context; private HttpServletRequest request; private HttpServletResponse response; HttpSession session; ServletContext application; public String execute() throws Exception { context=ActionContext.getContext(); session=request.getSession(); request.setAttribute("req", "requst属性"); session.setAttribute("ses", "sesion属性"); application.setAttribute("app", "application属性"); return "success"; } public void setServletRequest(HttpServletRequest request) { System.out.println("HttpServletRequest测试:"+request); this.request=request; } public void setServletContext(ServletContext application) { System.out.println("ServletContext测试:"+application); this.application=application; } public void setServletResponse(HttpServletResponse response) { System.out.println("HttpServletResponse测试:"+ response); this.response=response; } }
在访问此action时,控制台打印的信息如下所示:
HttpServletRequest测试:org.apache.struts2.dispatcher.StrutsRequestWrapper@1acfa31 HttpServletResponse测试:org.apache.catalina.connector.ResponseFacade@15dd910 ServletContext测试:org.apache.catalina.core.ApplicationContextFacade@47a0d4
ServletRequestAware的接口源码如下所示:
public interface ServletRequestAware { public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest); }