struts 值栈 通过get set方法 方便的获取,设置属性值 例如从jsp页面传来的参数。。。从action设置jsp所要回显的内容
注意el表达式,struts2对request进行了封装,所以它的查找顺序 多了一个findvalue() 如上图
再看下面的代码:
public class useraction {
private string username;
//查看用户的详细信息
public string detail(){
username = "张三";
list list = new arraylist();
for(int i=0; i<10; i++){
user user = new user();
user.setusername("user"+i);
list.add(user);
}
actioncontext.getcontext().put("users", list);
user u = new user();
u.setusername("赵毅");
actioncontext.getcontext().getvaluestack().push(u);
return "detail";
}
对应的jsp如下:
1: <s:property value="username"/> <br/>
2: <s:iterator value="#users">
3: <s:property value="username"/>
4: <s:property value="#root[2].username"/><br/>
5: </s:iterator>
6: <s:property value="username"/>
7: <s:property value="#root[1].username"/> <!-- 张三 -->
根据刚才的示例,我们知道,第1行的username是“赵毅”(因为jsp在执行这行代码的时候,compoundroot中有两个元素:第0个是“user对象赵毅”,第1个是“useraction对象张三”),因此第1行的username将取出compoundroot中第0个元素的username属性:赵毅
第2行代码是iterator标签,只定义了一个value属性,iterator标签将循环访问users这个list中的user对象,并把当前循环的user对象压入到compoundroot中!所以,在第3行和第4行代码被执行的时候,compoundroot中总共有3个元素:第0个元素是被iterator标签压入的当前循环的user对象;第1个元素是“user对象赵毅”;第2个元素是“useraction对象张三”,因此第3行代码的执行结果就是输出“userx”,即当前循环的user对象的username属性!iterator标签将会依次取出list中的user对象,并不断压入/弹出user对象(每次循环,都将执行一遍压入/弹出)。而第4行代码取第2个元素的username属性,即useraction对象的username属性:张三。
第5行代码执行完成之后,在compoundroot中将剩下2个元素,与第2行代码被执行之前一样。所以,第6行代码的输出和第1行代码的输出结果是一样的,而第7行代码将取出useraction对象的username属性:张三