从Servlet访问ViewScoped ManagedBean

时间:2013-01-08 10:56:16

标签: jsf java-ee jsf-2 applet managed-bean

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

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

1 个答案:

答案 0 :(得分:5)

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

E.g。

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

让applet将sessionKey作为请求参数传递给servlet,以便servlet可以执行

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

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