После нескольких дней исследований и обработки моего кода я наконец смог получить значения из JSP и отправить их обратно в форму.Я просто выложу ответ для дальнейшего использования.Благодаря этому веб-сайту я смог узнать причину своей проблемы и в итоге принял решение для ее решения.Ниже приведены подробные сведения о том, как я решил свою проблему.
Я обнаружил, что проблема связана с проблемой в Commons BeanUtils с индексированными свойствами, если вы используете java.util.List, а не Arrays, из-за того, что люди тогдаполучить ошибки «индекс вне диапазона» с помощью 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 и поместить их обратно в список.Для этого вы должны принять к сведению, что значение результирующего атрибута html name вашего тега JSP должно быть в этом формате 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 и отправить его обратно в форму.Я надеюсь, что это послужит руководством для тех людей, которые застряли на несколько дней, решая эту проблему.