在struts2中有很多种跳转方式如下是在struts-default.xml截取的一段源码,常用的跳转有 转发:dispatcher、重定向:redirect、转发到Action:chain、重定向到Action:redirectAction
1 <package name="struts-default" abstract="true"> 2 <result-types> 3 <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> 4 <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> 5 <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> 6 <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> 7 <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> 8 <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> 9 <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> 10 <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> 11 <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> 12 <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> 13 <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /> 14 </result-types> 15 </package>
ActionContest: 数据中心
有原来一切 servlet 年代的东西
原生 request HttpServletRequest
源生 response HttpServletResponse
原生 ServletContext ServletContext
request域 Map 命短
session域 Map
appliction域 Map 命长
param参数 Map
attr域 Map 如果重复以最小的键值对为准 3个域合一
ValueStack 值栈
ActionContext :数据中心其实也是一个 Map
ActionContext域是什么?
答:比如问一个木桶有多少水 要看最短的木板,所以
域最小的是request 就是一次请求
ActionContext生命周期:每次请求都会创建一个请求对应
的ActionContext对象。请求处理完ActionContext销毁,他
不会影响别的域的声明周期
如何获得ActionContext。struts2设计的是,将ActionContext对象
创建好之后,将ActionContext与当前线程绑定。我们要获得ActionContext
只需要从ThreadLocal中获得即可。
第一种方式
通过ActionContext
1 public class DemoAction extends ActionSupport { 2 3 @Override 4 public String execute() throws Exception { 5 // request域->map(struts2并不推荐使用request原生) 6 // 不推荐 7 Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request"); 8 // 推荐 9 ActionContext.getContext().put("name", "requestTom"); 10 // session域->map 11 Map<String, Object> sessionScope = ActionContext.getContext().getSession(); 12 sessionScope.put("name", "sessionTom"); 13 // application域->map 14 Map<String, Object> applicationScope = ActionContext.getContext().getApplication(); 15 applicationScope.put("name", "applicationTom"); 16 return SUCCESS; 17 } 18 }
第二种方式
通过ServletActionContext
1 public class Demo2Action extends ActionSupport { 2 // 并不推荐 3 @Override 4 public String execute() throws Exception { 5 6 // 原生request 7 HttpServletRequest request = ServletActionContext.getRequest(); 8 // 原生session 9 HttpSession session = request.getSession(); 10 // 原生response 11 ServletActionContext.getResponse(); 12 // 原生servletContext 13 ServletActionContext.getServletContext(); 14 15 return super.execute(); 16 } 17 18 }
第三种方式
通过实现ServletRequestAware
public class Demo3Action extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; // 并不推荐 @Override public String execute() throws Exception { System.out.println("原生request" + request); request.setAttribute("name", "haha"); return super.execute(); } @Override public void setServletRequest(HttpServletRequest arg0) { this.request = arg0; } }
第四种方式(推荐)
通过实现接口获得Map类型元素
接口RequestAware
接口SessionAware
接口ApplicationAware
1 public class ScopeAction extends ActionSupport implements SessionAware{ 2 Map<String,Object> session; 3 4 @Override 5 public void setSession(Map<String, Object> arg0){ 6 session = arg0; 7 } 8 9 @Override 10 public String execute() throws Exception{ 11 session.put("abc","haha"); 12 System.out.println(session.get("abc")); 13 return SUCCESS; 14 } 15 }