JSF 2 - 如何在Composite Component子项完成操作后执行操作?

时间:2011-06-06 16:43:44

标签: java jsf jsf-2 composite-component

我还在学习使用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作为映射值。我怎么能这样做?

1 个答案:

答案 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());
}