3

ファイル選択フィールドを持つ典型的な 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の制限?または典型的なブラウザの制限?回避策はありますか?

4

3 に答える 3

2

ファイルフィールドは事前に入力されていない可能性があります。これは、セキュリティ上の理由から、HTMLのものです。

ファイルがすでにアップロードされている場合は、それを覚えて、アップロードしたばかりのファイルを使用することを提案できます。それでもファイル入力ボックスを表示します。これにより、検証が(わずかに)複雑になります。

于 2012-09-18T09:39:47.633 に答える
2

セキュリティ上の理由から、ファイル入力フィールドの値を変更または初期化することはできません。

フォームには、テキスト フィールドとファイル フィールドの 2 つのフィールドがあります。選択したファイルが間違っていたときに入力フィールドの値が失われても、ユーザーは気にしないと思います。テキストフィールドの値が間違っていた場合にのみイライラするため、ファイルを再度取得する必要があります。そのため、フォームを送信する前にテキスト フィールドの値に対して ajax 検証を行うことができます (または、値を入力するときの方が良いでしょう!)。問題がある場合、フォームは送信されません。ユーザーはそれを修正し、ファイル フィールドの値を失わないようにします。

于 2012-09-18T10:13:29.283 に答える
1

これは通常のユースケースであり、データを保持し、検証エラーが発生した場合でも選択した値をユーザーに表示するには、これを処理する必要があります。

通常、検証エラーにより、ワークフロー インターセプターはページにリダイレクトされ、エラーのあるページが表示されます。これは、実際のメソッドが呼び出されなかったことを意味します。

Struts2は、アクションが適切に機能するために必要なデータを準備する方法を提供します。ユーザー準備可能なインターフェイスとその準備メソッドを使用します。

そのprepare()メソッドは検証の前に呼び出され、エラーがあるかどうかを示すために必要な値を設定できます。

要するにprepare()、メソッドは init メソッドとして機能し、そのような種類の作業を行います

于 2012-09-18T09:29:57.330 に答える