2

ObjectfromをJSFのServletアクションメソッドに渡そうとしています。しかし、私はそれをすることができません。doPost()Managed bean

次のように値を設定しようとしServletました:

request.getSession().setAttribute(key, "JYM");

そして、次のようにフォームを取得しようとしManaged beanました:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key)

帰ってきnullました。

また、これも戻っnullてきていManaged beanます:

((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().getAttribute(key);

また、Managed beanこれから戻ってきていnullます:

((HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false)).getAttribute(key)

私は次のようにキーを渡します:

'${pageContext.request.contextPath}/uploadservlet;jsessionid=${pageContext.session.id}?key=<h:outputText value="#{uploadBean.key}" />'

uploadBeanはの名前でManaged beanあり、keyは次のように生成されます。

key = UUID.randomUUID().toString();

keyサーブレットとマネージドBeanの両方で変更されません。私が印刷したのは確認することです。

ObjectfromServletをtoに渡すにはどうすればよいActionですか?任意のポインタが非常に役立ちます。

アップデート

Managed beanセッションスコープ内にあります。

アップデート

を使用することによりServletContext、値を渡すことができます。

これが私がしたことです:サーブレットで:

String key = request.getParameter("key");

if (getServletContext().getAttribute(key) == null) {
    List<FileItem> fileFields = new ArrayList<FileItem>();
    fileFields.add(fileField);
    getServletContext().setAttribute(key, fileFields);
} else {
    List<FileItem> fileFields = (List<FileItem>)getServletContext().getAttribute(key);
    fileFields.add(fileField);
}

そして、セッションスコープのBeanから:

ServletContext servletContext = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext());
List<FileItem> fileFields = (List<FileItem>)servletContext.getAttribute(key);
servletContext.setAttribute(key, null);

これで、fileFieldsはnullではなくなりました。私が理解しているのは、ServletContextアプリケーションスコープ変数のように動作することです。

アップデート

HttpSessionListenerの実装:

これは私が書いたクラスです:

public class UploadListener implements HttpSessionListener {
    private HttpSession session = null;

    public void sessionCreated(HttpSessionEvent event) {
        session  = event.getSession();
        session.setMaxInactiveInterval(10);
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        session  = event.getSession();
        Set<String> keys = (Set<String>) session.getAttribute("key");
        Map<String, Object> data = (Map<String, Object>) session.getServletContext().getAttribute("key");
        data.keySet().removeAll(keys);
    }
}

私は次のように値を設定していますServletContext

String key = request.getParameter("key");

List<FileItem> fileFields = (List<FileItem>)getServletContext().getAttribute(key);

if (fileFields == null) {
    fileFields = new ArrayList<FileItem>();
    getServletContext().setAttribute(key, fileFields);
}

fileFields.add(fileField);

そして、これが私がサーブレットと呼んでいる方法です'${pageContext.request.contextPath}/uploadservlet?key=<h:outputText value="#{uploadBean.key}" />'

4

1 に答える 1

2

jsessionidservletcontainer がURL フラグメントによる HTTP セッションの識別をサポートしていない場合、この構成は失敗します。これはデフォルトでサポートされていますが、サーブレットコンテナ固有の構成によってこれをオフにすることができます。残念ながら、これまでのところ、Weblogic サーバーはそのように構成されているようです。

最善の策は、アプリケーション スコープでデータを交換することです。のランダム性はUUID、衝突を引き起こさないほど強力です。セッションが破棄されたときに、セッションに関連付けられたデータがクリーンアップされていることを確認する必要があるだけです。そうしないと、メモリがリークします。これには、を使用できますHttpSessionListener。アプリケーション スコープ (共有データを参照) とセッション スコープ (これまでに使用されたすべてのキーのセットを参照) の両方にキーを格納する場合、sessionDestroyed()実装は次のようになります。

public void sessionDestroyed(HttpSessionEvent event) {
    Set<String> keys = (Set<String>) event.getSession().getAttribute("keys");
    Map<String, Object> data = (Map<String, Object>) event.getSession().getServletContext().getAttribute("data");
    data.keySet().removeAll(keys);
}

更新に従って更新します。それらを取得/設定するもう少しエレガントな方法は次のとおりです。

String key = request.getParameter("key");
List<FileItem> fileFields = (List<FileItem>) getServletContext().getAttribute(key);

if (fileFields == null) {
    fileFields = new ArrayList<FileItem>();
    getServletContext().setAttribute(key, fileFields);
}

fileFields.add(fileField);

List<FileItem> fileFields = (List<FileItem>) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().remove(key);
// ...
于 2013-01-11T14:47:24.380 に答える