将可迭代对象传递到嵌套JSP

时间:2016-12-21 11:19:51

标签: jsp struts2 jstl valuestack

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

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";
}

我知道当&#34;详细信息&#34;时,对象被传递到valuestack。动作是调用,因为我可以迭代&#34; listPerson&#34;在我的JSP中就是这样

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

它无法正常工作,我正在尝试设置变量&#34; listResult&#34;参考&#34; listPerson&#34;并在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是自上而下生成的变量&#34; listResult&#34;在再次呈现sub.jsp之前设置另一个值。如果我错了,请纠正我,如果您对此方法有任何疑问或建议更好的解决方案,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

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

  

参数作为请求参数传递,因此请使用   ${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>

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