2

我仍在学习在 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 文件上传与我见过的其他文件没有什么不同。它使用FilterFaces Servlet 上的自定义来访问上传数据。实际的文件上传部分工作正常,上传成功后,我将上传的文件存储在我的 Tomcat 服务器上的临时文件中。

我的问题是不知道如何让我的复合组件在成功上传后采取行动。我希望我的复合组件将其存储uploadedFileKeyMap特定会话范围的托管 bean 中,并将上传File的映射值作为映射值。我怎样才能做到这一点?

4

1 回答 1

1

我只需将密钥作为自定义组件属性传递,<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());
}
于 2011-06-06T19:47:41.900 回答