我用
<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>
显示标题的值。
我不知道为什么标题不会以第一种方式显示。
答案 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访问实体,并以其他方式找到它,因此集合未初始化。