我正在尝试将Object
从Servlet
的{{1}}传递给JSF的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();
在Servlet和托管bean中保持不变。我打印的是检查。
如何将key
从Object
传递给Servlet
?任何指针都会非常有用。
Action
在会话范围内。
使用Managed bean
我可以传递值:
这是我做的: 在Servlet中:
ServletContext
来自会话范围的bean:
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
表现得像Application Scoped变量。
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
这就是我调用Servlet的方式: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);
。
答案 0 :(得分:2)
如果servletcontainer不支持通过jsessionid
URL片段标识HTTP会话,则此构造将失败。默认情况下支持此功能,但可以通过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);
}
更新,获取/设置它们的方式更为优雅:
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);
// ...