获取它但不在s:iterator标记中显示

时间:2013-04-15 07:42:47

标签: java hibernate jsp struts2 actioncontext

我用

<class name="Topic" table="topic">     
         .......
  <set name="replies" inverse="true" lazy="false"  cascade="save-update">
        <key column="TOPIC_ID"/>
        <one-to-many class="Reply"/>
  </set>
</class>

我看到回复不为空且在topic.replies;

中有元素
Topic topic = topicService.getTopicById(topicId);
ActionContext actionContext = getActionContext();
actionContext.put("topic", topic);

并在JSP中:

<s:iterator value="#topic.replies">
  <s:property value="title"/>
</s:iterator>

没有标题显示。 然后我改变了我的代码

Topic topic = topicService.getTopicById(topicId);
ActionContext actionContext = getActionContext();
actionContext.put("replies", topic.getReplies);
JSP中的

<s:iterator value="#replies">
  <s:property value="title"/>
</s:iterator>

显示标题的值。

我不知道为什么标题不会以第一种方式显示。

2 个答案:

答案 0 :(得分:1)

为什么你这样使用ActionContext?

ActionContext对于从其他地方访问数据(已经可用于Action)非常有用,例如Helper类,而无需传递任何参数。

来自文档:What is the ActionContext

  

为了使签名简洁,方法有用,框架使用了两种技术:依赖注入线程本地,这两种技术又依赖于 ActionContext中

     

从Struts 2应用程序中的任何地方,您可以通过调用

获取对[ActionContext]的引用
  ActionContext context = ActionContext.getContext();
     

例如,如果从Action调用辅助类,并且它恰好需要访问ServletContext(可能它正在编写文件并且需要ServletContext来获取它的路径),那么帮助程序可以直接获取ActionContext 。没有什么需要从Action传递。

通常从Action读取JSP属性,Action必须通过访问器(或getter)公开这些属性;只需将您的Hibernate结果映射到Action中的某些DTO。

答案 1 :(得分:0)

回复配置为懒惰,因此在您致电topic.getReplies之前,这些回复无法使用。这实际上是通过访问实体的代理来初始化延迟集合。另一方面,您尝试使用OGNL访问实体,并以其他方式找到它,因此集合未初始化。