我仍在学习在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展示Web应用程序中的示例代码创建的。这是我的实现:
<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上传的文件与我看到的其他文件没有什么不同。它使用FacesServlet上的自定义Filter
来访问上传的数据。实际的文件上传部分运行良好,当上传成功时,我会将上传的文件存储在Tomcat服务器上的临时文件中。
我的问题是不知道如何让我的复合组件在成功上传后采取行动。我希望我的Composite组件将uploadedFileKey
存储在特定会话范围的托管bean上的Map
中,并将上载的File
作为映射值。我该怎么做
我只需要通过<f:attribute>
将键作为自定义组件属性传递,并让处理程序处理它。您可以通过event.getComponent().getAttributes()
在处理程序方法中获得它。
例如
<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());
}