背景信息:我的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”);
答案 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.