【发布时间】: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