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结果类型