1)基本使用
名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下:
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
通过配置可以看出,它对应的实现类是ServletDispatcherResult。
如果采用JSP作为视图的实现技术,那么这个ResultType是最常用的。在这个ResultType的实现中,调用了javax.servlet.RequestDispatcher类的forward方法,也就是说它相当于是对RequestDispatcher的一个再包装。
既然是这样,那么在Servlet中使用RequestDispatcher来进行页面跳转的特性,也就自然被“dispatcher”这个ResultType继承下来了。那么Servlet中的RequestDispatcher,到底有什么特性呢?那就是是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。这有什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,在Servlet的request对象里面,典型有如下数据:
- 参数区(parameter),就是用户在页面上填写并提交的数据
- Head区,由浏览器在发出请求的时候,自动加入到请求包的数据
- 属性区(Attribute),由开发人员存储在属性区的值,通常是通过request.setAttribute方法、request.getAttribute方法来进行访问
- cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request传递到服务端
好处是不是很大?因此这也是使用Struts2来进行web开发中最常使用的ResultType。
2)特殊用法
在<result>元素的定义中可以使用Action的execute方法运行之后的数据。怎么做呢?一起来看看示例。或许我们都已经习惯于以下这种简单的<result>配置:
<result name="toWelcome">/s2impl/welcome.jsp</result>
里面用于指定jsp位置的字符串都是固定的。如果我们希望这个字符串是活动的,可以根据某些参数值来变化,该怎么做到呢?如果我们在Action中定义一个folder字符串,并在execute中或validate中对它进行赋值,这里我们放到validate中,代码如下:
package cn.javass.hello.struts2impl.action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; private String folder; public String execute() throws Exception { this.businessExecute(); return "toWelcome"; } public void validate(){ this.folder = "s2impl"; //放在这里的原因是:validate先与execute执行,如果fieldError里面有值,execute就不执行了 if(account==null || account.trim().length()==0){ this.addFieldError("account", this.getText("k1")); } if(password==null || password.trim().length()==0){ this.addFieldError("password", this.getText("k2")); } if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){ this.addFieldError("password", this.getText("k3")); } } /** * 示例方法,表示可以执行业务逻辑处理的方法, */ public void businessExecute(){ System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag = submitFlag; } public String getFolder() { return folder; } public void setFolder(String folder) { this.folder = folder; } }