【发布时间】:2012-12-25 21:24:01
【问题描述】:
我正在尝试将 Object 从 Servlet 的 doPost() 传递给 JSF 的 Managed bean 的操作方法。但我做不到。
我尝试将Servlet 的值设置为:
request.getSession().setAttribute(key, "JYM");
并尝试从Managed bean 中检索它:
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key)
它正在返回null。
这也是从Managed bean返回null:
((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 从Servlet 传递到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}" />'。
【问题讨论】:
-
看看this post。您需要将 bean 放在 JSF 期望的范围内
-
@VikasV 你的意思是来自 servlet 我需要做
request.getSession().setAttribute("key", "value");? -
是的,我是想说。您的 bean 在会话范围内。所以你上面输入的代码应该没问题。
-
@VikasV 我在问题中提到,在第一个代码 sn-p 中,我在 servlet 中做了完全相同的事情。
-
您设置的是 key 而不是 managed bean。如果您重新查看我提到的帖子,您会看到 managed bean 已放入所需的范围
标签: java jsf servlets weblogic jsf-1.2