0

私はstruts 1.1上に構築されたアプリケーションの機能強化を行っています.そこで私が使用するファイルアップロードフィールドが必要です.

<html:file  size="40" property="strUploadNoFile" />

次に、以下のように DynaValidatorForm を使用する struts 構成ファイル フォーム Bean にプロパティを追加します。

<form-property name="strUploadNoFile" type="org.apache.struts.upload.FormFile"/>

また、フォーム暗号化タイプを jsp の multipart/form-data として追加します。

コードは正常に動作し、アップロードされたファイルの内容を正常に読み取ることができます。

しかし、ここでのアプリケーション設計は、いくつかのアクションが同じフォーム Bean にマップされるというものでした。したがって、ファイルアップロードフィールドが存在しないリクエストパスから来ると、例外が発生します。

タイプ「java.lang.String」の値をタイプ「org.apache.struts.upload.FormFile」のプロパティ「strUploadNoFile」に割り当てることはできません

その理由は、encript をデフォルトの application/x-www-form-urlencoded または multipart/form-data のいずれかに条件付きで切り替えるためです。したがって、ファイルのアップロードが存在しないパスから来た場合、暗号化タイプは application/x-www-form-urlencoded になります。しかし、上で述べたように、アプリケーション構造はさまざまなアクションに共通のフォーム Bean を使用しますが、FormFile である Bean プロパティ strUploadNoFile はフォーム プロパティに残りますが、jsp の暗号化タイプは multipart/form-data です。これが例外の原因だと思います。

そのxmlファイルにハードコードされているプロパティから動的に追加できるかどうかを知る必要がありますか? ファイルアップロードフィールドを持つリクエストパスからのみ FileForm プロパティを追加できるようにします。この場合、個別のフォーム Bean を持つリクエストごとにアプリケーション アーキテクチャを再設計するのは大変な作業です。

4

1 に答える 1

0

アクションが同じフォーム Bean を使用する場合、同じフォーム要素が必要になります。

エラーが発生する理由は、ご指摘のとおり、フォームエンコーディングも混在しているためです。

IMO がすべてのニーズに対応する 1 つのフォームを持つことは、目的を完全に無効にし、フレームワークを使用するように設計されている方法に反するものを使用しているため、問題が発生します。

最も簡単な解決策は、非マルチパート フォームに遭遇したときに「役立つ」何かを行うカスタム リクエスト プロセッサを作成することかもしれませんが、どうすればよいか正確にはわかりません。

つまり、リクエストごとに新しいフォームを設計する必要はなく、ファイルを含むフォーム Bean を 1 つ作成、ファイルを含まないフォーム Bean を 1 つ作成するだけで済みます。IMOがそうするのは間違っていますが、技術的な側面ではなく、「みんなを誤解させず、アプリケーションについて考えるのを難しくしないようにしましょう」という正面からのみです。

于 2013-02-19T12:52:12.420 に答える