Struts2 - 文件选择字段值在验证错误时消失

时间:2012-09-18 08:30:16

标签: file validation struts2

我有一个典型的struts2表单,带有文件选择字段:

<s:form action="%{#parameters.myAction}" namespace="/" method="post" name="myForm" enctype="multipart/form-data" focusElement="storeBrandNameId">
 <s:textfield name="storeBrandName" id="storeBrandNameId" size="40" maxlength="50" required="true" key="storeBrandName-label" tooltip="%{getText('storeBrandName-label-help')}" />
 <s:file name="storeImage" key="storeImage-label"/>
 /* ... Other fields removed for clarity ... */
 <s:submit key="submit" />
</s:form>

表单工作正常,除非我有验证错误(使用XML验证)。在这种情况下,除了所选文件(如果有)外,所有字段值都将被保留。

为什么在验证错误时清除所选文件?这是我身边的错误吗?一个struts2限制?或典型的浏览器限制?有办法吗?

3 个答案:

答案 0 :(得分:2)

文件字段可能未预先填写;出于安全考虑,这是一个HTML内容。

如果文件已经上传,您可以记住并提供使用刚刚上传的文件。我还会显示文件输入框。这会(略微)使验证复杂化。

答案 1 :(得分:1)

这是一个正常的用例,你需要处理这个问题,以便保存数据,并在验证错误时向用户显示所选的值。

通常验证错误让工作流拦截器重定向回页面并显示有错误的页面,这意味着你的实际方法永远不会被调用。

Struts2提供了一种方法来准备您的操作正常工作所需的任何数据。用户Preparable界面并使用其准备方法。

在验证之前调用其prepare()方法,您可以设置显示是否存在任何错误所需的任何值。

简而言之prepare()方法作为init方法来完成任何此类工作

答案 2 :(得分:1)

出于安全原因,无法更改或初始化文件输入字段的值。

在表单中,您有两个字段:text-field和file-field。 我不认为用户会在他们选择的文件错误时忽略输入字段的值。只有当文本字段中的值错误时,它们才会生气,因此需要再次拾取文件。 因此,您可以在提交表单之前对文本字段值执行ajax验证(或者更好,因为他们键入值!)。如果出现问题,表单未提交,用户修复它并且不会丢失文件字段值。