Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6.4 chain结果类型

很多时候,当一个 Action 处理完成之后,系统并不想转发到视图资源,而是希望让另一个Action进行下一步处理,此时就需要两个Action形成“链式”处理——这就需要使用chain结果类型了。

下面以一个简单的例子为例:当用户添加图书之后,如果希望立即呈现系统内所有的图书,这就需要借助于chain结果类型。

该应用的添加图书页面只是一个简单的表单页,该表单页包含一个文本框,允许用户在该文本框中输入书名。添加图书的Action代码如下。

程序清单:codes\03\3.6\chain\WEB-INF\src\org\crazyit\struts2\action\AddBookAction.java

public class AddBookAction implements Action
{
    private String book;
    private String tip;
    // book的setter和getter方法
    public void setBook(String book)
    {
          this.book = book;
    }
    public String getBook()
    {
          return this.book;
    }
    // tip的setter和getter方法
    public void setTip(String tip)
    {
          this.tip = tip;
    }
    public String getTip()
    {
          return this.tip;
    }
    // 处理用户请求的execute方法
    public String execute() throws Exception
    {
          // 创建BookService实例
          BookService bs = new BookService();
          // 调用业务逻辑组件的方法来添加图书
          bs.addBook(book);
          setTip("恭喜你,图书添加成功!");
          return SUCCESS;
    }
}

该Action处理完用户请求之后,该Action并不是直接转发到视图页面,而是转发到另一个Action:一个列出所有图书的Action,因此该Action需要的结果类型为chain。该Action的配置片段如下。

程序清单:codes\03\3.6\chain\WEB-INF\src\struts.xml

<!-- 定义addBook的Action,该Action的实现类为
    org.crazyit.struts2.action.AddBookAction -->
<action name="addBook" class="org.crazyit.struts2.action.AddBookAction">
    <!-- 使用chain结果类型,跳转到另外一个Action -->
    <result type="chain">getBooks</result>
</action>

上面的粗体字代码控制该Action处理成功后跳转到getBooks Action,该Action的处理代码如下。

程序清单:codes\03\3.6\chain\WEB-INF\src\org\crazyit\struts2\action\GetBooksAction.java

public class GetBooksAction implements Action
{
    // 该属性并不用于封装用户请求参数
    // 而用于封装Action需要输出到JSP页面的信息
    private List<String> books;
    // books属性的setter、getter方法
    public void setBooks(List<String> books)
    {
          this.books = books;
    }
    public List<String> getBooks()
    {
          return books;
    }
    // 处理用户请求的execute方法
    public String execute() throws Exception
    {
          // 创建BookService实例
          BookService bs = new BookService();
          // 将业务逻辑组件的返回值设置成该Action的属性
          setBooks(bs.getLeeBooks());
          return SUCCESS;
    }
}

该Action对应的配置片段如下:

<action name="getBooks" class="org.crazyit.struts2.action.GetBooksAction">
    <!-- 如果处理结果返回success,则进入showBook.jsp页面 -->
    <result>/WEB-INF/content/showBook.jsp</result>
</action>

getBooks Action处理完成后将会转发到showBook.jsp视图页面,由于addBook、getBooks两个Action形成链式处理,因此前一个Action设置的tip属性也不会丢失。在浏览器中浏览该页面并添加图书,将可以看到如图3.20所示的结果。

图3.20 chain结果类型