OGNL 找不到指定的值 但是EL表达式可以找到
哎,这段时间再学struts2.3GA,初学很多地方不明白。这里就先贴上一个,如题。最近在做一个OA办公,为了简单没写工作流,只做权限控制。做到上传下载。有点犯糊涂。。
代码说明:在服务器获得附件信息后使用struts2标签<s:property value="tAffixs==null"/>附件居然是空的。当然这里返回的是true。感觉就不对我调试跟踪后发现服务器确实取到值了,并且请求转发到这里jsp页面, 如果使用EL表达式 ${requestScope.notice.tAffixs==null} 返回的是false,为了进一步验证,我用el标签循环:
<c:forEach items="${notice.tAffixs}" var="tAffix" varStatus="vs" >
${tAffix.filename}
<a href="notice/notice!download?affix.aid=${tAffix.aid}">下载</a>
</c:forEach>
附件的名字,以及id都有。
关键就是这里,我使用strut2搭配 OGNL表达式 :
<s:iterator value="#request.notice.tAffixs" var="taffix">
<s:property value="filename"/>
<a href="notice/notice!download?affix.aid=<s:property value="aid"/>">下载</a>
</s:iterator>
上面使用OGNL表达式不管我 value 写作用域还是值栈中的范围都无法取到这个附件对象的值。一直是空的。
搞了好久没搞懂。。本想使用debug标签调式,可能是因为我使用j-ui框架的原因,会报错。也没办法调试。 纠结了。。。还希望高手分析其中的原因,感激不尽。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
哦?能否详述?
OK,搞定。。。。。。。。。。。。。。。。。。。原来是我属性没按照Struts2要求的命名规范。哎。。规范规范。。如此重要
实例代码:
1)遍历一个List,里面的元素的属性又是一个List,用双层Iterator
<%
List<User> userList = new ArrayList<User>(0);
User userBean = new User();
userBean.setName("designer");
userBean.setGender("nam");
userBean.setPassword("123456");
userBean.setId(1L);
Set<Hobby> hobbies = new HashSet<Hobby>(0);
for(int i=0;i<10;i++){
Hobby hobby = new Hobby();
hobby.setId(Long.valueOf(i+""));
hobby.setName("xx"+i);
hobby.setDescription("oo"+i);
hobbies.add(hobby);
}
userBean.setHobbies(hobbies);
userList.add(userBean);
ActionContext.getContext().getValueStack().setValue("#request.userList", userList);
%>
<s:iterator value="#request.userList" var="usr">
<s:property value="id"/>
<s:property value="name"/>
<s:property value="gender"/>
---------
<s:iterator value="#usr.hobbies">
<s:property value="name"/>
<s:property value="description"/>
<br/>
</s:iterator>
</br>
</s:iterator>
遍历一个Map:
<%
Map<String,User> userMap = new HashMap<String,User>(0);
for(int i=0;i<10;i++){
User userBean = new User();
userBean.setName("designer"+i);
userBean.setGender(i/2==0?"nam":"woman");
userBean.setPassword("123456");
userBean.setId(Long.valueOf(i+""));
userMap.put(i+"", userBean);
}
ActionContext.getContext().getValueStack().setValue("#request.userInfo", userMap);
%>
在iterator迭代的过程中会把每个迭代出来的对象临时的放入到栈顶,要访问该对象之间写对象的属性即可,如果加上var则会将每次迭代的对象在往ognl存入一个Map记录该对象,
map的key为var的值,value为当此迭代的对象,因此一般不要写var,一旦迭代完毕则从栈顶移除迭代的对象或ognl的context里存放的最后一次迭代的那个对象
<s:iterator value="#request.userInfo" var="entry" status="status">
<span class="<s:property value="#status.even?'even':'odd'"/>"><s:property value="key"/></span>
<span class="<s:property value="#status.even?'even':'odd'"/>"><s:property value="value.name"/></span>
<br/>
</s:iterator>
你先确定你的#request.notice这个有值,并且是一个集合,如果这个集合里的元素的属性又是一个集合那你就参考第一个例子!
实例代码:
1)遍历一个List,里面的元素的属性又是一个List,用双层Iterator
<%
List<User> userList = new ArrayList<User>(0);
User userBean = new User();
userBean.setName("designer");
userBean.setGender("nam");
userBean.setPassword("123456");
userBean.setId(1L);
Set<Hobby> hobbies = new HashSet<Hobby>(0);
for(int i=0;i<10;i++){
Hobby hobby = new Hobby();
hobby.setId(Long.valueOf(i+""));
hobby.setName("xx"+i);
hobby.setDescription("oo"+i);
hobbies.add(hobby);
}
userBean.setHobbies(hobbies);
userList.add(userBean);
ActionContext.getContext().getValueStack().setValue("#request.userList", userList);
%>
<s:iterator value="#request.userList" var="usr">
<s:property value="id"/>
<s:property value="name"/>
<s:property value="gender"/>
---------
<s:iterator value="#usr.hobbies">
<s:property value="name"/>
<s:property value="description"/>
<br/>
</s:iterator>
</br>
</s:iterator>
遍历一个Map:
<%
Map<String,User> userMap = new HashMap<String,User>(0);
for(int i=0;i<10;i++){
User userBean = new User();
userBean.setName("designer"+i);
userBean.setGender(i/2==0?"nam":"woman");
userBean.setPassword("123456");
userBean.setId(Long.valueOf(i+""));
userMap.put(i+"", userBean);
}
ActionContext.getContext().getValueStack().setValue("#request.userInfo", userMap);
%>
在iterator迭代的过程中会把每个迭代出来的对象临时的放入到栈顶,要访问该对象之间写对象的属性即可,如果加上var则会将每次迭代的对象在往ognl存入一个Map记录该对象,
map的key为var的值,value为当此迭代的对象,因此一般不要写var,一旦迭代完毕则从栈顶移除迭代的对象或ognl的context里存放的最后一次迭代的那个对象
<s:iterator value="#request.userInfo" var="entry" status="status">
<span class="<s:property value="#status.even?'even':'odd'"/>"><s:property value="key"/></span>
<span class="<s:property value="#status.even?'even':'odd'"/>"><s:property value="value.name"/></span>
<br/>
</s:iterator>
你先确定你的#request.notice这个有值,并且是一个集合,如果这个集合里的元素的属性又是一个集合那你就参考第一个例子!
高手们。帮帮忙吧! 我快崩溃了。。
顶贴