2

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

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

4

1 回答 1

6

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

例如

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);
}

让小程序把sessionKeyas请求参数传给servlet,这样servlet就可以做

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

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

于 2013-01-08T13:13:51.847 回答