将值从Servlet传递到WebLogic中的JSF Action方法

时间:2013-01-11 10:04:03

标签: java jsf servlets weblogic jsf-1.2

我正在尝试将ObjectServlet的{​​{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中保持不变。我打印的是检查。

如何将keyObject传递给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);

1 个答案:

答案 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);
// ...