我还在学习使用JSF 2中的复合组件的一些功能。我对JSF 1.2开发很有经验,我最近阅读了Geary和Horstmann的“Core Java Server Faces 3rd Edition”一书。
我要做的是创建一个包含文件上传组件的复合组件(当前使用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 fileUpload标记,如前所述。它需要一个带有事件处理程序的托管bean,我也是根据PrimeFaces showcase webapp中的示例代码创建的。这是我的实施:
<composite:implementation>
<p:fileUpload
fileUploadListener="#{primeFacesFileUploadController.handler}"
label="Browse"
mode="advanced"
allowTypes="png,gif,jpg" />
</composite:implementation>
我不会在这里包含整个控制器bean,但这里是类声明:
@ManagedBean(name="primeFacesFileUploadController")
@RequestScoped
public class PrimeFacesFileUploadController {
// ...
}
PrimeFaces文件上传与我见过的其他文件没有什么不同。它使用Faces Servlet上的自定义Filter
来访问上载数据。实际的文件上传部分工作正常,当上传成功时,我将上传的文件存储在我的Tomcat服务器上的临时文件中。
我的问题是不知道如何让我的复合组件在成功上传后采取行动。我希望我的Composite Component将uploadedFileKey
存储在特定会话范围的托管bean上的Map
中,并将上传的File
作为映射值。我怎么能这样做?
答案 0 :(得分:1)
我只是将密钥作为自定义组件属性传递<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());
}