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);
- }