当Action设置了某个属性值后,Struts 2 将这些属性值全部封装在一个叫struts.ValueStack 的请求属性里。
在Java语句中通过ValueStack对象来获取封装输出信息的ValueStack对象,并调用ValueStack对象的findValue()方法来获取属性值。代码如下:
ValueStack vs = (ValueStack) request.getAttribute("struts.valueStack");
Object object = vs.findValue("fieldName);
案例如下 (查看书籍为例) :
1.存放书籍:
public class BookService{
//以数组模拟数据库
private String[] books = new String[] {
"Struct 2.x 权威指南",
"疯狂Java讲义"
}
//业务逻辑方法,返回全部图书
public String[] getLeeBooks() {
return books;
}
}
2.Action中设置属性
public class BooksAction implements Action{
//定义一个用于封装图书的属性
private String[] books;
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public String execute() throw Exception{
BookService bs = new BookService();
setBooks(bs.getLeeBooks()); //将业务逻辑中的返回值设置为Action的属性
return SUCCESS;
}
}
3.迭代显示书籍
<table border="1" width="360">
<caption>图书系统</caption>
<%
//获取封装输出信息的ValueStack对象
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
//获取Action中的属性值
String[] books = (String[])vs.findValue("books");
//迭代输出
for(String book : books){
%>
<tr>
<td>书名</td>
<td><%=book %></td>
</tr>
<%
}
%>
</table>
for (String name : nameArray) { }:
1、String name–声明会带有数组单一元素的循环变量,数组元素的类型必须与循环变量的类型匹配,name在循环过程中会带有不同元素的值。
2、冒号(:)–代表“in”
3、nameArray–要被逐个运行的集合,这必须是对数组或其他集合的引用。