Передавая значение из сервлета с помощью 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 ответ:
Эта конструкция не будет работать, если 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); // ...