jsf - 从 Servlet 访问 ViewScoped ManagedBean

标签 jsf jakarta-ee jsf-2 applet managed-bean

背景信息:我的 jsf 页面中有一个文件上传小程序。这个小程序需要一个可以发送 POST 请求的地址。 (我无法编辑此帖子请求以添加更多字段或其他内容)。然后我的 servlet 的 post 方法存储文件。这项工作不能由托管 bean 完成,因为 servlet 必须使用 @MultiPartConfig 进行注释,而我无法将此注释添加到 jsf 托管 bean。为了强制上传小程序使用相同的 session ,我根据此 post 在发布请求中添加了一个名为 jsessionId 的 URL 属性。 .在我的 servlet 中,我现在可以访问 session 范围内的 bean。

现在我有一个 ViewScoped bean,我在其中存储一些我想在 servlet 中使用的表单输入数据,因为将这些输入添加到 post 请求不起作用(Applet 是第三方项目 (JUploadApplet) 并且对于一些添加额外的表单数据不起作用的原因)。 现在可以从 servlet 中访问 ViewScoped bean 了吗?如果我将范围更改为 SessionScope 我能够处理输入但是使用 ViewScoped 如果我尝试像这样访问 bean 我会得到一个 NullPointerException : UploadBean uploadBean = (UploadBean)request.getSession().getAttribute("uploadBean");

最佳答案

这是不可能的。最好的办法是让 View 范围的 bean 生成一个唯一的键,通过该键将自身存储在 session 范围中,并将该键作为附加参数传递给小程序,最后让 servlet 通过该键访问 session 属性。

例如

private String sessionKey;

@PostConstruct
public void init() {
    sessionKey = UUID.randomUUID().toString();
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(sessionKey, this);
}

@PreDestroy
public void destroy() {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(sessionKey);
}

让小程序将sessionKey作为请求参数传递给servlet,这样servlet就可以做

String sessionKey = request.getParameter("sessionKey");
Bean bean = (Bean) request.getSession().getAttribute(sessionKey);
// ...

请注意,除了 bean 本身,您还可以只存储任意 bean/valueobject/等。

关于jsf - 从 Servlet 访问 ViewScoped ManagedBean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213422/

相关文章:

jsf - PrimeFaces 数据表 - 什么是 f :facet actually doing?

java - 系统异常或应用异常

java - 一个用于实用功能的无状态 session EJB?

session - 在两个不同的应用程序之间传递 session 数据

jsf-2 - ui 内的 Primefaces ManyCheckbox :repeat calls setter method only for last loop

jsf - 如何绑定(bind) <rich :dataTable> to backing bean?

jsf - jsf 注销后发生 session 启动事件?

jsf - 值和绑定(bind)之间的区别

用于 valueChangeListener 的 Ajax

java - 有没有办法下载所有 Java EE 接口(interface)?