JSF 2 - 如何在复合组件子项完成操作后执行操作?
问题描述:
我仍然学习使用JSF 2中的组合组件的一些功能。我对JSF 1.2开发有经验,最近我读了Geary和Horstmann编写的“Core Java Server Faces 3rd Edition”一书。JSF 2 - 如何在复合组件子项完成操作后执行操作?
我想要做的是创建一个包装文件上传组件(目前使用PrimeFaces <p:fileUpload>
)的复合组件。我需要将上传的文件与会话作用域托管bean上的基于字符串的键关联(稍后使用)。我试图通过名为'uploadedFileKey'的复合组件接口上的一个属性来提供密钥。下面是接口:
<html xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="uploadedFileKey"
type="java.lang.String"
required="true" />
</composite:interface>
...
</html>
的实现很简单,使用PrimeFaces文件上传标签正如我前面提到。它需要一个带有事件处理程序的托管bean,我也是基于来自PrimeFaces展示web应用程序的示例代码创建的。下面是我的实现:
<composite:implementation>
<p:fileUpload
fileUploadListener="#{primeFacesFileUploadController.handler}"
label="Browse"
mode="advanced"
allowTypes="png,gif,jpg" />
</composite:implementation>
我不打算在这里包括整个控制器豆,但这里是类的声明:
@ManagedBean(name="primeFacesFileUploadController")
@RequestScoped
public class PrimeFacesFileUploadController {
// ...
}
的PrimeFaces文件上传是不是不像别人,我有看到。它使用Faces Servlet上的自定义Filter
来访问上传数据。实际的文件上传部分工作正常,当上传成功时,我将上传的文件存储在我的Tomcat服务器上的临时文件中。
我的问题是不知道如何让我的复合组件在成功上传后采取行动。我希望我的复合组件将uploadedFileKey
存储在Map
中的特定会话范围的受管bean上,并将上传的File
作为映射值。我怎样才能做到这一点?
答
我只是通过<f:attribute>
作为自定义组件属性传递密钥,并让处理程序处理它。您可以通过event.getComponent().getAttributes()
在处理程序方法中获得它。
E.g.
<composite:implementation>
<p:fileUpload
fileUploadListener="#{primeFacesFileUploadController.handler}"
label="Browse"
mode="advanced"
allowTypes="png,gif,jpg">
<f:attribute name="key" value="#{cc.attrs.uploadedFileKey}" />
</p:fileUpload>
</composite:implementation>
与
public void handler(FileUploadEvent event) {
String key = (String) event.getComponent().getAttributes().get("key");
yourSessionBean.getMap().put(key, event.getFile());
}
这看起来像它会工作。谢谢Balus。 – 2011-06-07 00:47:18