4

サーブレットからセッションスコープのBeanにアクセスする必要があります。私はすでに試しました

UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");

この投稿で説明されているように。しかし、UserBeanのインスタンスはすでにインスタンス化されていますが、結果としてnullを取得するだけです。これらは、userBeanに使用するアノテーション/インポートです。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
 ... }

サーブレットを削除できない背景:jsfページにファイルアップロードアプレットがあります。このアプレットは、POSTリクエストを送信できるアドレスを期待しています。(この投稿リクエストを編集して、フィールドなどを追加することはできません)。次に、サーブレットのpostメソッドがファイルを保存します。サーブレットには@MultiPartConfigアノテーションを付ける必要があり、このアノテーションをjsfマネージドBeanに追加できないため、このジョブはマネージドBeanでは実行できません。

4

1 に答える 1

6

を返す場合null、それは2つのことだけを意味する可能性があります。

  1. JSFはまだBeanを事前に作成していません。
  2. アプレットとサーブレットの相互作用は、Webアプリケーションと同じHTTPセッションを使用しません。

機能要件をどのように説明したかを考えると、後者だと思います。アプレットからのHTTPリクエストとともに、Webアプリケーションのセッション識別子を確実に渡す必要があります。JSESSIONIDこれは、 CookieまたはjsessionidURLパス属性の形式にすることができます。

まず、Webアプリが使用しているセッションIDについてアプレットに通知する必要があります。アプレットを保持しているタグ<applet>にパラメータを渡すことでそれを行うことができます<object>

<param name="sessionId" value="#{session.id}" />

(これ#{session}は、現在を参照する暗黙のJSF EL変数HttpSessionであり、getId()メソッドがあります。そのためのマネージドBeanを作成する必要はありません。上記のコード行は、そのままで完了します)

これは、次のようにアプレットで取得できます。

String sessionId = getParameter("sessionId");

サーブレットとの対話方法については説明しませんでしたが、これに標準のJava SEURLConnectionを使用しており、サーブレットを指していると仮定すると、を使用して要求ヘッダーを設定@WebServlet("/servleturl")できます。setRequestProperty()

URL servlet = new URL(getCodeBase(), "servleturl");
URLConnection connection = servlet.openConnection();
connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId);
// ...

または、URLパス属性として渡すこともできます。

URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + sessionId);
URLConnection connection = servlet.openConnection();
// ...

(どちらの場合もケースが重要であることに注意してください)

いずれにせよ、このようにして、アプレットとサーブレットの相互作用は、JSF管理対象Beanと同じHTTPセッションで行われます。

于 2012-11-02T11:21:10.567 に答える