0

TestAction クラスでセッション オブジェクトを設定していますが、TestServlet でセッション オブジェクトを取得しようとすると、null が返されます。Seam フレームワークでアクション クラスからサーブレットにセッションを渡す方法を教えてください。

@Scope(ScopeType.EVENT)
@Name("testAction  ")
public class TestAction  {

    public void setSessionObj(){

        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
        session.setAttribute("temp", "124563");
    }
}

//サーブレットはここから始まります

 public class TestServlet extends HttpServlet {

        public void init(ServletConfig servletConfig) throws ServletException {
            super.init(servletConfig);
            servletContext = servletConfig.getServletContext();

        }

        protected String doExecute(HttpServletRequest request,
                HttpServletResponse response) throws Exception {

                 Session session =    request.getSession(false);
            String user1 = (String) session .getAttribute("temp");
        }
    }

以下は、セッションインスタンスのデバッグに関する観察です

アクションとサーブレットで取得している場合に備えて、セッションオブジェクトインスタンスを確認しましたが、どちらもセッションの異なるインスタンスです。たとえば、動作中のインスタンスは StandardSession[41CBDED6EBBBECEBA001A70555F51CA5] であり、サーブレットで取得するのは StandardSession[EACBDED6E34BECEB3401A70555F51CA5] です。異なるセッション インスタンスを取得する理由

4

2 に答える 2

1

FacesContextサーブレットの を介してセッション属性にアクセスする必要はありません。request.getSession()セッションを取得するために使用するだけです。リクエストが実際に同じセッションからのものである限り、セッション属性はサーブレットで利用できるはずです。

于 2013-04-03T07:18:36.590 に答える
-2

CDI/Spring を介して JSF Managed Bean とサーブレットの両方に注入されるプロキシ オブジェクトを使用します。

この例では、CDI Bean を作成し、それを常に維持し、文字列を格納するだけです。依存性注入を通じて、両方のコンポーネントがアクセスできます。

META-INF リソース フォルダーの下に空の bean.xml ファイルを作成します。

@Named
@ApplicationScoped
public class Container{
 private String temp;

 public Container(){

 }
 public void setTemp(String temp) {
  this.temp = temp;
 }

 public String getTemp() {
  return temp;
 }
}

@Scope(ScopeType.EVENT)
@Name("testAction  ")
public class TestAction  {

 @Inject 
 Container container;

public void setSessionObj(){
 container.setTemp("123456");

}
}

//サーブレットはここから始まります

public class TestServlet extends HttpServlet {

@Inject
Container container; 
    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
        servletContext = servletConfig.getServletContext();

    }

    protected String doExecute(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

             Session session =    request.getSession(false);
        String user1 = container.getTemp();
    }
}
于 2013-04-03T07:32:44.373 に答える