Example Three:
Generate an iterator with var attribute
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," var="myAtt" />
<%
Iterator i = (Iterator) pageContext.getAttribute("myAtt");
while(i.hasNext()) {
String s = (String) i.next(); %>
<%=s%> <br/>
<% }
%>
This generates an iterator and put it in the PageContext under the key as specified by the var attribute.
后copy上面整段代码,执行后,页面显示错误信息,报java.lang.NullPointerException。
改代码,如下:
再次执行,结果显示:OH,My God!
从结果可知,pageContext.getAttribute("myAtt");获取不到对象,把它改为pageContext.getAttribute("myAtt",PageContext.REQUEST_SCOPE);即可,结果显示:
aaa
bbb
ccc
ddd
PS:
1.在Debug的过程中也未发现pageContext的attributes下有myAtt的key,而在value stack中可以找到。
2.Struts2中的request是org.apache.struts2.dispatcher.StrutsRequestWrapper。
Method Summary
Object getAttribute(String s)
Gets the object, looking in the value stack if not found
官方的例子估计没有运行过,只是一个样例而已,不能保证正确运行。
估计学struts2到generator标签都会碰到这个问题。。,只能怪他们documention的时候没有testing吧。
我查了源码,迭代层次太深,并没有找到蛛丝马迹,显示获得的pageContext是存入request域中。惭愧~~
不过好好思考下,就像JSP中一样,你若是generate一个Collection或者Iterator,存放用户的购物车,总要把这些信息传出去的,存入request域,从而在服务器跳转的情况下在下一个页面能访问到。而session域的话,有点不合情理,不安全,life-cycle也太长,application就更不可能了。
因此将var属性定义的集合存入request域中应该是理想的选择。