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

标签 java jsf servlets weblogic jsf-1.2

我正在尝试通过 Object来自ServletdoPost()至 JSF Managed bean的 Action 方法。但我无法做到这一点。

我尝试将值设置为 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)

我将 key 传递为:

'${pageContext.request.contextPath}/uploadservlet;jsessionid=${pageContext.session.id}?key=<h:outputText value="#{uploadBean.key}" />'

uploadBeanManaged bean 的名称和 key生成为:

key = UUID.randomUUID().toString();

key在 Servlet 和托管 bean 中都保持不变。我打印出来是为了检查。

我怎样才能通过Object来自ServletAction ?任何指针都会非常有帮助。

更新

Managed bean在 session 范围内。

更新

通过使用 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);
}

以及来自 session 作用域的 bean:

ServletContext servletContext = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext());
List<FileItem> fileFields = (List<FileItem>)servletContext.getAttribute(key);
servletContext.setAttribute(key, null);

现在是fileFields不再为空。我理解的是ServletContext行为类似于应用程序范围变量。

更新

HttpSessionListener的实现:

这是我写的类(class):

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}" />' .

最佳答案

如果 servlet 容器不支持通过 jsessionid URL 片段识别 HTTP session ,则此构造将会失败。默认情况下支持此功能,但可以通过 servletcontainer 特定配置来关闭此功能。不幸的是,到目前为止,您的 Weblogic 服务器似乎是这样配置的。

您最好的选择是在应用程序范围内交换数据。 UUID 的随机性足够强,不会造成冲突。您只需要确保在 session 销毁时清除与 session 相关的数据即可。否则内存会泄漏。为此,您可以使用 HttpSessionListener 。假设您将 key 存储在应用程序范围(引用共享数据)和 session 范围(引用迄今为止使用的所有 key 的集合)中,则 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);
// ...

关于java - 将值从 Servlet 传递到 WebLogic 中的 JSF Action 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275732/

相关文章:

java - 如何获取java应用程序的所有包?

java - java TreeSet 是如何显式运行的?

java - 适应游戏中不同屏幕尺寸的最佳方式是什么?

java - PrimeFaces 验证码未在 Chrome 下显示

java - JSF : Elements of ArrayList are not rendered properly?

java - 如何在 JSF 2.0 中呈现 XHTML 兼容表单?

mysql - 我希望我在 Netbeans 上制作的 Web 应用程序能够上线?

java - 动画 *.gif 帧速率太高

java - 如何确定 api 实现的规范版本

spring - tomcat 启动时自动启动 Servlet ...?