在我的Struts2 JSP表单中,有文本字段和选择标记。例如,
<s:form>
<s:textfield name="name" label="Name"/>
<s:textfield name="dob" label="Date of Birth"/>
<s:select name="degree" list="degreeList" listKey="degreeID" listValue="degreeName"/>
<s:submit/>
</s:form>
在加载这个JSP之前,我在action class中填充了degreeList
。
我需要验证此表单。所以我尝试了验证框架。但问题是如果验证失败,则动作类返回"input"
本身。如果验证失败,我无法重新填充degreeList
。所以上面的JSP无法加载。错误说degreeList
不是列表/集合,因为列表不再位于值堆栈中。请有人指导我如何以其他方式验证?感谢。
答案 0 :(得分:3)
没有什么能阻止你在execute()中进行验证并返回你想要的结果字符串或抛出异常。
但真正的问题似乎是“如果验证失败,我无法重新填写DegreeList”,为什么不呢,为什么不能把它们发回给同一个表格呢?
您应该能够注释您的操作(或使用struts.xml),以便在返回“input”时重定向到相应的页面,即使这意味着在发送表单之前的页面或不太合理的页面声明“抱歉,您输错了值,由于表格的时间敏感性,我们永远不会给您再次尝试的选择:)“
<强>更新强>:
@Results({ @Result(name =“input”,location =“/ package / my-action”) })
答案 1 :(得分:3)
当您从validate()
方法返回时,您需要解决的所有问题都是重新填充列表。我想你的行动扩展了ActionSupport
,如果不是,那么你应该这样做。覆盖validate()
方法。在那里,您应该检查hasActionErrors()
和hasFieldErrors()
。如果有,那么重新填充列表。作为一种好的做法,您应该将用于呈现JSP的代码分开,并在validate
方法中重用它。 validate()
INPUT
结果返回后没有执行操作。