gpt4 book ai didi

java - 从 JSP 检索嵌套列表的值并将其发送回表单

转载 作者:行者123 更新时间:2023-11-30 05:43:24 24 4
gpt4 key购买 nike

编辑 现在我知道我的问题是由于 this 。该链接还提供了解决方案,但我似乎无法弄清楚如何在第二个列表中执行此操作。

我将首先向您展示我正在处理的代码结构。

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

}

通过执行以下操作,我已成功在 JSP 中显示 aDTOList 的内容:

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

现在我的问题是,每当我提交aDTOList内的表单bDTOList时,aDTOList将全部变为空。aDTOList的大小与我已显示原始列表,但唯一的区别是 aDTO 中的 bDTOList 的所有元素均为 null。如果aDTOList的大小为2并且每个ADTO包含bDTOList,则aDTOList的结构如下大小为 2。

[[null, null],[null, null]]

因此我认为我的问题是我的表单中没有 getBDTO ,但我不知道如何实现它。谁能帮助我如何实现它?或者是否有其他方法可以用原始数据填充bDTOList

注意:我无法更改代码的结构,并且这些代码只是示例代码

最佳答案

经过几天的研究和修改我的代码,我终于能够从 JSP 检索值并将其发送回表单。我只是发布一个答案以供将来引用。感谢this website我能够知道问题的原因并最终找到解决方案。请参阅下面有关我如何解决问题的详细信息。

我发现问题是由于具有索引属性的 Commons BeanUtils 中的问题引起的,如果您使用 java.util.List 而不是数组,那么人们会在请求范围内的 ActionForms 中遇到“索引超出范围”错误。这就是为什么在调用 get(int) 方法时需要增加列表的原因。此外,每当调用重置方法时,您都需要重新初始化列表。为此,您需要将此代码粘贴到表单的重置方法中:

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 name 属性的值必须采用此格式 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 检索嵌套列表的值并将其发送回表单。我希望这能为那些被困了好几天解决此类问题的人们提供指导。

关于java - 从 JSP 检索嵌套列表的值并将其发送回表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272358/

24 4 0