我使用struts2构建一个应用程序,我有一个非常复杂的形式的问题。我的想法是,对于表单的初始设置,我使用可预编制以预填充所有控件,但是当验证失败时,我无法使用getXX()在prepare方法中找回一些提交的参数(以便在表单中再次设置它们)。 我可以使用getRequest()。getParameter(“paramName”)访问该参数,但我认为必须有一种更优雅的方法来实现这一点。 我提到如果验证没有失败,我可以使用getter方法从表单中获取所有信息。只有在我获得验证失败并再次调用prepare方法时才会出现此问题。 通常struts会在验证失败的情况下设置这个参数但是在我的情况下我有一些对象列表,我首次打开表格时(使用prepareXXX()方法)使用圆顶默认值。
谢谢,
感谢您的回答,我将在此处提供相关代码。 所以,我有使用prepareAddTicket()编写的addTicket方法的TicketAction()动作。 在这个应用程序中,我有一个Phone对象,它有3个属性: phoneType - 固定电话/手机, phoneNum - 电话号码 phoneLabel - 工作电话/家庭电话/其他电话。 我必须在表单中生成6个文本文件: 移动设备 _ __ _ __ _ __ _ _ 工作固定电话 _ __ _ __ _ ____ ...................................
并且为了实现这一点,并且因为从DB表读取标签,我使用迭代器来创建这些字段:
<s:iterator value="defaultPhoneFormNewCaller" status="dpStatus"> <tr>
<td class="tdLabel"><label class="label"><s:property value="%{phoneLabel.name}"/>:</label></td>
<s:hidden name="phoneFormNewCaller[%{#dpStatus.index}].phoneLabel.id" value="%{phoneLabel.id}" theme="simple" />
<td>
<s:textfield name="phoneFormNewCaller[%{#dpStatus.index}].phNo" value="%{phNo}" size="50" theme="simple" cssClass="%{defaultItemClass}" />
<!-- <input type="button" value="Default" onclick="" /> -->
</td>
<s:hidden name="phoneFormNewCaller[%{#dpStatus.index}].phoneType" value="%{phoneType}" theme="simple" />
<s:hidden name="phoneFormNewCaller[%{#dpStatus.index}].defaultPhone" id="phoneFormNewCaller_%{#dpStatus.index}" value="%{defaultPhone}" theme="simple" />
</tr>
</s:iterator>
在prepareAddTicket()中,只有当我能确定手机所属的人时,才会填充此列表。
prepareAddTicket {
//...........................
defaultPhoneFormNewCaller = new ArrayList();
//create defaultPhoneList for display
List<PhoneLabel> defaultPhoneLabels = phoneLabelService.getPhoneLabels();
Iterator<PhoneLabel> ipl = defaultPhoneLabels.iterator();
while(ipl.hasNext()){
PhoneLabel pl = ipl.next();
PhoneLabelForm phoneLabelLandline = new PhoneLabelForm(pl.getId(),pl.getName()+" Landline");
PhoneForm phoneFormLandline = new PhoneForm();
phoneFormLandline.setPhoneLabel(phoneLabelLandline);
phoneFormLandline.setPhoneType(0);
PhoneLabelForm phoneLabelMobile = new PhoneLabelForm(pl.getId(),pl.getName()+" Mobile");
PhoneForm phoneFormMobile = new PhoneForm();
phoneFormMobile.setPhoneLabel(phoneLabelMobile);
phoneFormMobile.setPhoneType(1);
defaultPhoneFormNewCaller.add(phoneFormLandline);
defaultPhoneFormNewCaller.add(phoneFormMobile);
phoneFormLandline = null;
phoneFormMobile = null;
phoneLabelLandline = null;
phoneLabelMobile = null;
}
//...........................
}
//create defaultPhoneList for display
List<PhoneLabel> defaultPhoneLabels = phoneLabelService.getPhoneLabels();
Iterator<PhoneLabel> ipl = defaultPhoneLabels.iterator();
while(ipl.hasNext()){
PhoneLabel pl = ipl.next();
PhoneLabelForm phoneLabelLandline = new PhoneLabelForm(pl.getId(),pl.getName()+" Landline");
PhoneForm phoneFormLandline = new PhoneForm();
phoneFormLandline.setPhoneLabel(phoneLabelLandline);
phoneFormLandline.setPhoneType(0);
PhoneLabelForm phoneLabelMobile = new PhoneLabelForm(pl.getId(),pl.getName()+" Mobile");
PhoneForm phoneFormMobile = new PhoneForm();
phoneFormMobile.setPhoneLabel(phoneLabelMobile);
phoneFormMobile.setPhoneType(1);
defaultPhoneFormNewCaller.add(phoneFormLandline);
defaultPhoneFormNewCaller.add(phoneFormMobile);
phoneFormLandline = null;
phoneFormMobile = null;
phoneLabelLandline = null;
phoneLabelMobile = null;
}
问题是在验证失败后,我无法在prepareAddTicket()中获取提交的参数,以便使用提交的值重新填充这些字段。 我确定prepareAddTicket()被调用,因为在这里我还准备了一些下拉列表,这些都没问题。我使用调试器,当验证失败时,当我调用getPhoneFormNewCaller()时,这是null。否则,如果验证在addTicket()中运行良好,我可以使用getPhoneFormNewCaller()获取值。 正如我在最初的帖子中所说,我可以使用getParameters()来获取提交的值并将它们重新放回到表单中,但这将完全没有优雅:) 那么,还有其他想法吗? 感谢,