2

背景情報: jsf ページにファイル アップロード アプレットがあります。このアプレットは、POST 要求を送信できるアドレスを想定しています。(この投稿リクエストを編集してフィールドなどを追加することはできません)。次に、サーブレットの post メソッドがファイルを保存します。サーブレットに @MultiPartConfig のアノテーションを付ける必要があり、このアノテーションを jsf マネージド Bean に追加できないため、このジョブはマネージド Bean では実行できません。アップロード アプレットが同じセッションを使用するように強制するために、この投稿に従って、jsessionId という名前の URL 属性を投稿リクエストに追加しました。私のサーブレットでは、セッション スコープの Bean にアクセスできるようになりました。

サーブレットで使用したいフォーム入力データを保存するViewScoped Beanがあります。これらの入力をポストリクエストに追加しても機能しないためです(アプレットはサードパーティプロジェクト(JUploadApplet)であり、何らかの理由で機能しません追加のフォームデータを追加することはできません)。サーブレット内から ViewScoped Bean にアクセスできるようになりましたか? スコープを SessionScope に変更すると、入力を処理できますが、ViewScoped を使用すると、次のように Bean にアクセスしようとすると NullPointerException が発生します。

4

1 に答える 1

6

これは不可能です。あなたの最善の策は、ビュー スコープ Bean に一意のキーを生成させ、そのキーによってセッション スコープに格納し、そのキーを追加パラメーターとしてアプレットに渡し、最後にサーブレットがそのキーによってセッション属性にアクセスできるようにすることです。

例えば

private String sessionKey;

@PostConstruct
public void init() {
    sessionKey = UUID.randomUUID().toString();
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(sessionKey, this);
}

@PreDestroy
public void destroy() {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(sessionKey);
}

アプレットがsessionKeyas request パラメータをサーブレットに渡して、サーブレットができるようにします。

String sessionKey = request.getParameter("sessionKey");
Bean bean = (Bean) request.getSession().getAttribute(sessionKey);
// ...

Bean 自体の代わりに、任意の Bean/valueobject/etc を格納することもできることに注意してください。

于 2013-01-08T13:13:51.847 に答える