gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:27:55 24 4
gpt4 key购买 nike

我正在尝试传递 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表现得像 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}" />' .

最佳答案

如果 servletcontainer 不支持通过 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com