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