nic*_*510 2 jsf applet java-ee jsf-2 managed-bean
背景信息:我的jsf页面中有一个文件上传小程序.这个小程序需要一个地址,它可以发送它的POST请求.(我无法编辑此帖子请求以添加更多字段或其他内容).然后我的servlet的post方法存储文件.托管bean无法完成此作业,因为必须使用@MultiPartConfig注释servlet,并且我无法将此批注添加到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");
这是不可能的.最好的办法是让视图scoped bean生成一个唯一的键,通过该键将自己存储在会话范围中,并将该键作为附加参数传递给applet,最后让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);
}
Run Code Online (Sandbox Code Playgroud)
让applet将sessionKeyas请求参数传递给servlet,以便servlet可以执行
String sessionKey = request.getParameter("sessionKey");
Bean bean = (Bean) request.getSession().getAttribute(sessionKey);
// ...
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以只存储任意bean/valueobject/etc,而不是bean本身.
| 归档时间: |
|
| 查看次数: |
1216 次 |
| 最近记录: |