OGNL 找不到指定的值 但是EL表达式可以找到

发布于 2021-11-14 11:51:37 字数 1079 浏览 693 评论 8

  哎,这段时间再学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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

飘然心甜 2021-11-16 18:48:13

哦?能否详述?

各自安好 2021-11-16 18:48:12

OK,搞定。。。。。。。。。。。。。。。。。。。原来是我属性没按照Struts2要求的命名规范。哎。。规范规范。。如此重要

清风夜微凉 2021-11-16 18:48:11

实例代码:

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这个有值,并且是一个集合,如果这个集合里的元素的属性又是一个集合那你就参考第一个例子!

醉生梦死 2021-11-16 18:48:11

实例代码:

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这个有值,并且是一个集合,如果这个集合里的元素的属性又是一个集合那你就参考第一个例子!

凡尘雨 2021-11-16 18:48:09

囚你心 2021-11-16 18:45:21

高手们。帮帮忙吧! 我快崩溃了。。

孤独患者 2021-11-15 04:32:44

顶贴

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文