Передавая значение из сервлета с помощью JSF способ действия в WebLogic


Я пытаюсь передать Object из Servlet s doPost() В метод действия JSF 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 остается неизменным как в сервлете, так и в управляемом Бобе. Я напечатал это, чтобы проверить.

Как я могу передать Object из Servlet в 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);
}

И из области действия сеанса Боб:

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

Теперь fileFields больше не является нулем. Я понимаю, что ServletContext ведет себя как переменная с областью применения.

Обновление

HttpSessionListener's реализация:

Это класс, который я написал:

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}" />'.

1 2

1 ответ:

Эта конструкция не будет работать, если servletcontainer не поддерживает идентификацию сеанса HTTP по фрагменту URL jsessionid. Это поддерживается по умолчанию,но это можно отключить с помощью специальной конфигурации servletcontainer. Пока, к сожалению, похоже, что ваш 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);
}

Update согласно вашему обновлению, немного более элегантный способ получить / установить их:

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);
// ...