java - 从 JSP 中检索嵌套列表的值并将其发送回表单
问题描述
编辑现在我知道我的问题是由于这个。该链接还提供了解决方案,但我似乎无法在第二个列表中弄清楚如何做到这一点。
我将首先向您展示我正在处理的代码结构。
这是 MyForm 类:
public class MyForm extends ValidatorForm {
private List<ADTO> aDTOList;
// getters and setters for aDTOList below
public ADTO getADTO(int index) {
if (aDTOList == null) {
aDTOList = new ArrayList<ADTO>();
}
if (aDTOList.size() - 1 < index) {
while (aDTOList.size() - 1 < index) {
aDTOList.add(new ADTO());
}
}
return aDTOList.get(index);
}
@Override
protected ActionErrors execValidate(ActionMapping mapping, HttpServletRequest request) {
// BODY NOT SHOWN FOR PRIVACY
}
@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
super.reset(mapping, request);
this.aDTOList = new ArrayList<ADTO>();
}
}
这是ADTO类:
public class ADTO {
private List<BDTO> bDTOList;
// getters and setters for bDTOList below
}
这是 BDTO 类:
public class BDTO {
private String sample1;
private String sample2;
// getters and setters for sample1 and sample2 below
}
aDTOList
通过这样做,我已经成功地在 JSP 中显示了 的内容:
<logic:iterate id="ADTO" name="MyForm" property="aDTOList" indexId="idxRes">
<logic:iterate id="BDTO" name="ADTO" property="bDTOList" indexId="idxLine">
<html:hidden name="BDTO" property="sample1" indexed="true"/>
<html:hidden name="BDTO" property="sample2" indexed="true"/>
</logic:iterate>
</logic:iterate>
现在我的问题是每当我提交bDTOList
里面的表单时aDTOList
都会变成空的。aDTOList
与我显示的原始列表大小相同,但唯一的区别是bDTOList
a中的所有元素aDTO
都是空的。如果 的大小为 2 且每个包含的大小也为 2,则的结构aDTOList
是这样的。aDTOList
ADTO
bDTOList
[[null, null],[null, null]]
因此,我认为我的问题是我getBDTO
的表单中没有,但我不知道如何实现它。谁能帮助我如何实施它?还是有其他方法可以填充bDTOList
原始数据?
注意:我无法更改代码的结构,代码只是示例代码
解决方案
经过几天的研究和修改我的代码,我终于能够从 JSP 中取回值并将其发送回表单。我将发布一个答案以供将来参考。多亏了这个网站,我才能够知道我的问题的原因,并最终找到了解决方案。请参阅下面有关我如何解决问题的详细信息。
我发现问题是由于 Commons BeanUtils 中带有索引属性的问题,如果您使用 java.util.List 而不是 Arrays,那么人们会在请求范围内的 ActionForms 中出现“索引超出范围”错误。这就是为什么需要在调用 get(int) 方法时增加列表的原因。此外,每当调用 reset 方法时,您都需要重新初始化列表。为此,您需要将此代码粘贴到表单的重置方法中:
public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
aDTOList = ListUtils.lazyList(new java.util.ArrayList(), new Factory() {
public Object create() {
return buildADTOList();
}
});
}
private ADTO buildADTOList() {
ADTO aDTO = new ADTO();
List bDTOList = ListUtils.lazyList(new java.util.ArrayList(), new Factory() {
public Object create() {
return new BDTO();
}
});
aDTO.setBDTOList(bDTOList);
return aDTO;
}
现在,无论何时调用重置方法,您的列表都会重新增长到其原始大小。现在的下一个问题是如何从 JSP 中取回值并将它们放回列表中。为此,您必须注意,您的 JSP 标记的结果 html 名称属性的值必须采用这种格式aDTOList[0].bDTOList[0].sample1
。但是,如果您使用标签(就像问题所使用的那样),生成的 html 的值将如下所示: 示例:
<logic:iterate id="ADTO" name="MyForm" property="aDTOList" indexId="idxRes">
<logic:iterate id="BDTO" name="ADTO" property="bDTOList" indexId="idxLine">
<html:hidden name="BDTO" property="sample1" indexed="true"/>
<html:hidden name="BDTO" property="sample2" indexed="true"/>
</logic:iterate>
</logic:iterate>
这将导致:
<input type="hidden" name="BDTO[0].sample1" value="..."/>
<input type="hidden" name="BDTO[0].sample2" value="..."/>
<input type="hidden" name="BDTO[1].sample1" value="..."/>
<input type="hidden" name="BDTO[1].sample2" value="..."/>
<input type="hidden" name="BDTO[0].sample1" value="..."/>
<input type="hidden" name="BDTO[0].sample2" value="..."/>
<input type="hidden" name="BDTO[1].sample1" value="..."/>
<input type="hidden" name="BDTO[1].sample2" value="..."/>
结果不是aDTOList[0].bDTOList[0].sample1
格式,因此您需要使用<nested:iterate>
.
转换后的代码将是:
<nested:iterate property="aDTOList" indexId="idxRes">
<nested:iterate property="bDTOList" indexId="idxLine">
<nested:hidden property="sample1"/>
<nested:hidden property="sample2"/>
</nested:iterate>
</nested:iterate>
这将导致:
<input type="hidden" name="aDTOList[0].bDTOList[0].sample1" value="..."/>
<input type="hidden" name="aDTOList[0].bDTOList[0].sample2" value="..."/>
<input type="hidden" name="aDTOList[0].bDTOList[1].sample1" value="..."/>
<input type="hidden" name="aDTOList[0].bDTOList[1].sample2" value="..."/>
<input type="hidden" name="aDTOList[1].bDTOList[0].sample1" value="..."/>
<input type="hidden" name="aDTOList[1].bDTOList[0].sample2" value="..."/>
<input type="hidden" name="aDTOList[1].bDTOList[1].sample1" value="..."/>
<input type="hidden" name="aDTOList[1].bDTOList[1].sample2" value="..."/>
如您所见,它是aDTOList[0].bDTOList[0].sample1
格式。
从中您可以从 JSP 中检索嵌套列表的值并将其发送回表单。我希望这将为那些被困几天解决此类问题的人提供指导。
推荐阅读
- spring - 在 Spring Boot 中使用过滤器时响应需要很长时间
- python - 更改现有 matplotlib 图的颜色图
- c - %lo(source)($6) 和 .frame 在汇编代码中是什么意思?
- kotlin - 带有kotlin的黄瓜参数类型
- graphql - 如何使我的 hasura 动作准备好用于我的 ci / cd 测试?
- c - 如何知道 Linux 中看门狗重启的原因?
- python - 为什么当我输入一个值时程序会退出?
- vue.js - 当我使用 Axios 获取数据时,我的 JS 代码不起作用
- python - 有没有办法可以在 python 中使用多线程或多处理来连接到 200 个不同的服务器并从它们下载数据
- java - 带有图像的 HTML 和 css 在 iText7 中重叠 html 到 java 中的 pdf 转换