1,通过ValueStack取值
1)调试标签,开发人员可以用来进行调试
<s:debug/>
2)直接输出栈顶的值
<s:property/>
*3)访问context对象
*4)遍历集合
<s:iterator value="users">
<s:property value="name"/>
</s:iterator>
*5)按数字循环
<s:iterator begin="1" end="3" var="k">
<s:property value="#k"/>
</s:iterator>
2,总结:
1)ValueStack中有栈对象,该对象封装的是上面最常用的数据,即Action
2)ValueStack中有context对象,该对象的类型 是Map,里面封装的是包括Action以及程序上下文所需要的数据在内的完整的数据。
3)一般情况下,我们都是关注最常用的对象,即 栈对象,如果栈对象里面的数据不能满足要求,那么考虑从context中取值
*4)重点要关注栈顶的变化
--通常情况下,栈顶是Action
--只有在循环过程中,栈顶变为本次循环的 循环变量,此刻Action位于栈的第二位
--循环结束后,栈顶恢复成Action
3,Struts2对EL表达式的支持
1)EL表达式默认从page,request,session,application这4个范围取值
2)Struts2提供了对requerst对象的包装类,该类 覆写了request的getAttribute方法,在方法中会优先从原始的request对象取值,若取不到,再从ValueStack对象中取值。
3)由于我们的资费列表,查询到的数据是放于 Action中,Action是放于ValueStack中,那么页面上我们写的EL表中得到的值。
1)调试标签,开发人员可以用来进行调试
<s:debug/>
2)直接输出栈顶的值
<s:property/>
*3)访问context对象
*4)遍历集合
<s:iterator value="users">
<s:property value="name"/>
</s:iterator>
*5)按数字循环
<s:iterator begin="1" end="3" var="k">
<s:property value="#k"/>
</s:iterator>
2,总结:
1)ValueStack中有栈对象,该对象封装的是上面最常用的数据,即Action
2)ValueStack中有context对象,该对象的类型 是Map,里面封装的是包括Action以及程序上下文所需要的数据在内的完整的数据。
3)一般情况下,我们都是关注最常用的对象,即 栈对象,如果栈对象里面的数据不能满足要求,那么考虑从context中取值
*4)重点要关注栈顶的变化
--通常情况下,栈顶是Action
--只有在循环过程中,栈顶变为本次循环的 循环变量,此刻Action位于栈的第二位
--循环结束后,栈顶恢复成Action
3,Struts2对EL表达式的支持
1)EL表达式默认从page,request,session,application这4个范围取值
2)Struts2提供了对requerst对象的包装类,该类 覆写了request的getAttribute方法,在方法中会优先从原始的request对象取值,若取不到,再从ValueStack对象中取值。
3)由于我们的资费列表,查询到的数据是放于 Action中,Action是放于ValueStack中,那么页面上我们写的EL表中得到的值。