我正在尝试将Object
from传递给 JSF 的Servlet
action方法。但我无法做到这一点。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
Servlet 和托管 bean 中都保持不变。我打印的是检查。
我怎样才能传递Object
fromServlet
到Action
?任何指针都会非常有帮助。
更新
在Managed bean
会话范围内。
更新
通过使用ServletContext
我能够传递值:
这是我所做的: 在 Servlet 中:
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
不再为空。我理解的是ServletContext
行为类似于 Application Scoped 变量。
更新
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);
这就是我调用 Servlet: 的方式'${pageContext.request.contextPath}/uploadservlet?key=<h:outputText value="#{uploadBean.key}" />'
。