2013-04-28 95 views
2

在我的Struts2 JSP表单中,有文本字段和一个选择标记。例如,验证验证框架之外的struts2表单

<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装入前,我在行动类充满degreeList。 我需要验证此表单。所以我尝试了验证框架。但是如果验证失败,问题是行动类返回"input"本身。如果验证失败,我无法补充degreeList。所以上面的JSP不能被加载。错误说degreeList不是列表/集合,因为列表不再位于值栈中。有人请指导我如何以另一种方式验证?谢谢。

+3

这是Prepareable的用途。 – 2013-04-28 19:21:42

回答

3

您需要解决的所有问题是在从validate()方法返回时重新填充列表。我想你的行动扩大了ActionSupport,如果不是,那么你应该这样做。覆盖validate()方法。在那里你应该检查hasActionErrors()hasFieldErrors()。如果有的话重新填充列表。作为一种良好的做法,您应该分开用于呈现JSP的代码并在validate方法中重用它。在validate()之后INPUT结果没有执行动作就返回。

3

没有什么阻止你在execute()中进行验证并返回你希望的结果字符串,或者抛出一个异常。

但是真正的问题似乎是“如果验证失败,我无法补充degreeList”,为什么不,为什么不能把它们发送回相同的表单呢?

你应该能够注释你的动作(或使用struts.xml)重定向到适当的页面,如果返回“输入”,即使这意味着页面在发送表单之前或不合理的页面声明“对不起,你放错了价值和因为形式的时间敏感的性质,我们再也不能给你想要的选项:)”

更新

@Results({ @Result( name =“input”,location =“/ package/my-action”) })

+0

<<重定向到合适的页面应该“输入”返回>>如果我手动返回来自动作类方法的“输入”,是的,我可以用这种方法重新填充列表。但验证框架本身返回“输入”。结果“输入”必须返回到表单页面以显示错误,但列表未填充,表单页面无法显示。为了重新填充列表,我使用,在页面加载前首先进入操作类。然后列表被填充并成功显示表格页面。但不要显示错误消息。 :( – 2013-04-28 18:16:27

+0

该动作返回的字符串用于确定应该调用什么,您可以控制这个。请参阅更新,其中注释演示了这一点,这需要约定插件,但您可以在struts.xml中轻松配置它。不要做元刷新! – Quaternion 2013-04-28 18:32:02

+0

http://img.viralpatel.net/2009/12/customer-page-validation-errors.png 请看看。我想在返回“输入”时显示这样的错误,有了xml验证请不要介意我很难理解 – 2013-04-29 01:06:18