2

私はまだ JSF 2 の複合コンポーネントの機能のいくつかを使用する方法を学んでいます。私は JSF 1.2 開発の経験があり、最近 Geary と Horstmann による本「Core Java Server Faces 3rd Edition」を読みました。

私がやろうとしているのは、ファイル アップロード コンポーネントをラップする複合コンポーネントを作成することです (現在は PrimeFaces を使用しています<p:fileUpload>)。アップロードされたファイルを、セッション スコープのマネージド Bean の文字列ベースのキーに関連付ける必要があります (後で使用します)。「uploadedFileKey」という名前の複合コンポーネント インターフェイスの属性を介してキーを提供しようとしています。インターフェースは次のとおりです。

<html xmlns:composite="http://java.sun.com/jsf/composite">
    <composite:interface>
        <composite:attribute name="uploadedFileKey" 
            type="java.lang.String" 
            required="true" />
    </composite:interface>
    ...
</html>

実装は簡単で、前述のように PrimeFaces の fileUpload タグを使用します。これには、PrimeFaces ショーケース Web アプリケーションのサンプル コードに基づいて作成したイベント ハンドラーを持つマネージド Bean が必要です。これが私の実装です:

<composite:implementation>
    <p:fileUpload
        fileUploadListener="#{primeFacesFileUploadController.handler}"
        label="Browse"
        mode="advanced"
        allowTypes="png,gif,jpg" />
</composite:implementation>

ここにコントローラ Bean 全体を含めるつもりはありませんが、クラス宣言は次のとおりです。

@ManagedBean(name="primeFacesFileUploadController")
@RequestScoped
public class PrimeFacesFileUploadController {
    // ...
}

PrimeFaces ファイルのアップロードは、私が見た他のものと同じです。Faces サーブレットのカスタムFilterを使用して、アップロード データにアクセスします。実際のファイル アップロード部分は正常に動作し、アップロードが成功すると、アップロードされたファイルが Tomcat サーバーの一時ファイルに保存されます。

私の問題は、アップロードが成功した後に複合コンポーネントにアクションを実行させる方法がわからないことです。複合コンポーネントに、マップ値としてアップロードされた特定のセッション スコープのマネージド Bean にを格納するようuploadedFileKeyにします。どうやってやるの?MapFile

4

1 に答える 1

1

キーをカスタム コンポーネント属性として渡して<f:attribute>、ハンドラーに処理させるだけです。によってハンドラーメソッドで取得できますevent.getComponent().getAttributes()

例えば

<composite:implementation>
    <p:fileUpload
        fileUploadListener="#{primeFacesFileUploadController.handler}"
        label="Browse"
        mode="advanced"
        allowTypes="png,gif,jpg">
        <f:attribute name="key" value="#{cc.attrs.uploadedFileKey}" />
    </p:fileUpload>
</composite:implementation>

public void handler(FileUploadEvent event) {
    String key = (String) event.getComponent().getAttributes().get("key");
    yourSessionBean.getMap().put(key, event.getFile());
}
于 2011-06-06T19:47:41.900 に答える