【问题标题】:Passing an iterable object into a nested JSP将可迭代对象传递到嵌套 JSP
【发布时间】:2017-05-06 19:21:11
【问题描述】:

这是我的动作类代码中的内容:

private List<PersonDO> listPerson;

public void setListPerson(List<PersonDO> listPerson) {
    this.listPerson = listPerson;
}

public List<PersonDO> getListPerson() {
    return listPerson;
}

public String Details() {
   PersonDO personDO = new PersonDO()
   personDO.setName("Bob");
   personDO.setAge("20");
   
   this.listPerson = new ArrayList<PersonDO >();
   this.listPerson.add(personDO)

   return "success";
}

我知道在调用“详细信息”操作时对象被传递到值堆栈中,因为我可以在我的 JSP 中迭代“listPerson”

<s:iterator value="listPerson" status="rowSts" var="mapItem">
   <td style="vertical-align:middle;"><s:property value="#mapItem.name" /></td>
   <td style="vertical-align:middle;"><s:property value="#mapItem.age" /></td>
</s:iterator>

但我的问题是我想将它传递到一个通用的嵌套 jsp 中,而不是直接使用名称 "listPerson" 调用它,因为这个 jsp 将在我的应用程序中使用

我已经尝试了以下

main.jsp

<s:include value="sub.jsp">
    <s:param name="listResult" value="listPerson">
</s:include>

sub.jsp

<%pageContext.setAttribute("listResult" , request.getParameter("listResult")); %>
<s:set var="listResult" value="%{#attr.listResult}"/>


 <s:iterator value="listPerson" status="rowSts" var="mapItem">
      <td style="vertical-align:middle;"><s:property value="#mapItem.name" /></td>
      <td style="vertical-align:middle;"><s:property value="#mapItem.age" /></td>
 </s:iterator>

它不起作用,我正在尝试设置一个变量“listResult”来引用“listPerson”并在 sub.jsp 中对其进行迭代。

更新:

为了澄清我这样做的原因是因为我想在 main.jsp 中重复使用 sub.jsp 两次,以避免重复编码,只有微不足道的差异,例如列表的不同变量名。

我能够解决我的问题

<c:set var="listResult"  value="${listPerson}"  scope="request"/>
<s:include value="sub.jsp">
    <s:param name="shortlist">true</s:param>
</s:include>

<c:set var="listResult"  value="${listCompany}"  scope="request"/>
<s:include value="sub.jsp">
    <s:param name="shortlist">true</s:param>
</s:include>

我认为它可以工作,因为 jsp 是自上而下生成的,并且变量“listResult”在 sub.jsp 再次呈现之前设置了另一个值。如果我错了,请纠正我,如果此方法有任何问题或您提出更好的解决方案,请告诉我。

【问题讨论】:

  • 你为什么要这样做?如果您将列表加载到基本操作中,并且想要实现 DRY,只需将迭代器放入 sub.jsp 并将 sub.jsp 包含在您的其他 jsps 中
  • 因为在我的情况下,我将在 main.jsp 中包含两次 sub.jsp。每个人都将显示一个列表。一个将显示来自“listPerson”的值,而另一个将显示来自“listCompany”的项目。我想重用 sub.jsp 以避免对同一事物进行额外编码,但会有一些微不足道的差异,例如列表的不同变量名。
  • 但是,如果您要迭代两个不同对象的列表,那么在迭代中打印出来的属性也会有所不同...... Person 不是 Company,那么您如何处理呢?还参数化属性名称?伙计,这不是正确的方法,恕我直言。如果您有多个打印人员和/或公司的页面,您可以创建 person.jsp 和 company.jsp,每个页面都包含 ITS 迭代,并包含它们。否则,进行两次迭代,这不是重复,因为它们是不同的对象
  • 如果Person和Company的所有属性都匹配也是错误的;如果明天您将向 Person 添加不在 Company 上的属性怎么办?你会遇到麻烦,需要在迭代中开始执行
  • @ron 请使用回答部分进行回答。并且不要忘记接受您的回答。

标签: jsp struts2 ognl valuestack


【解决方案1】:

您正在尝试创建一个请求范围变量并从包含的页面访问它。它可能是访问请求范围参数的替代方法。

注意,参数只能作为请求参数访问:

参数作为请求参数传递,所以使用 ${param.ParamName} 符号来访问它们。不要使用s:property 标签以访问包含文件中的参数。

为什么不使用值堆栈并在包含的页面中从迭代器中推送要访问的参数?

<s:push value="listPerson">
  <s:include value="sub.jsp">
    <s:param name="shortlist">true</s:param>
  </s:include>
</s:push>

<s:push value="listCompany">
  <s:include value="sub.jsp">
    <s:param name="shortlist">true</s:param>
  </s:include>
</s:push>

如果您需要两个列表作为参数,您可以同时推送(一个接一个)。值栈不受大小限制。

【讨论】:

  • 感谢您的意见,现在我学会了一种新的方法,即使用推送。但这在我的情况下不起作用,因为它们仍将分别命名为“listPerson”和“listCompany”。我正在尝试设置一个变量“listResult”来引用它们,因为这就是它在“sub.jsp”中的命名方式
  • 如果你将一个对象推送到值栈,它没有名字。您可以直接从堆栈中引用可迭代对象。如果你想设置一个命名变量,那么你可以使用s:set标签。这样,对象默认进入action 范围,因此您可以在s:iteratorc:forEach 中获取它。
  • @ron 你试过这个解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
相关资源
最近更新 更多