2

我用

<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>

显示标题的值。

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

4

2 回答 2

1

你为什么要这样使用 ActionContext ?

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

来自文档:什么是 ActionContext

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

从Struts 2 应用程序中的任何地方,您都可以通过调用获得对 [ActionContext] 的引用

  ActionContext context = ActionContext.getContext();

例如,如果从一个Action调用了一个helper类,如果它恰好需要访问ServletContext(可能是在写一个文件,需要ServletContext来获取它的路径),那么helper可以直接获取ActionContext。不需要从 Action 传递任何内容。

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

于 2013-04-15T08:21:15.870 回答
0

回复被配置为惰性,因此在您调用之前它们不可用topic.getReplies。这实际上是通过访问实体的代理来初始化惰性集合。另一方面,您尝试使用 OGNL 访问实体并以其他方式找到它,因此集合未初始化。

于 2013-04-15T10:17:38.473 回答