JSF2-在复合组件的子级完成操作后,我如何执行操作



我仍在学习在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());
}

相关内容

  • 没有找到相关文章

最新更新