gpt4 book ai didi

jsf - 从 Servlet 访问 ViewScoped ManagedBean

转载 作者:行者123 更新时间:2023-12-02 17:46:22 24 4
gpt4 key购买 nike

背景信息:我的 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/

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