JSF 2 - 如何在复合组件子项完成操作后执行操作?

JSF 2 - 如何在复合组件子项完成操作后执行操作?

问题描述:

我仍然学习使用JSF 2中的组合组件的一些功能。我对JSF 1.2开发有经验,最近我读了Geary和Horstmann编写的“Core Java Server Faces 3rd Edition”一书。JSF 2 - 如何在复合组件子项完成操作后执行操作?

我想要做的是创建一个包装文件上传组件(目前使用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文件上传标签正如我前面提到。它需要一个带有事件处理程序的托管bean,我也是基于来自PrimeFaces展示web应用程序的示例代码创建的。下面是我的实现:

<composite:implementation> 
    <p:fileUpload 
     fileUploadListener="#{primeFacesFileUploadController.handler}" 
     label="Browse" 
     mode="advanced" 
     allowTypes="png,gif,jpg" /> 
</composite:implementation> 

我不打算在这里包括整个控制器豆,但这里是类的声明:

@ManagedBean(name="primeFacesFileUploadController") 
@RequestScoped 
public class PrimeFacesFileUploadController { 
    // ... 
} 

的PrimeFaces文件上传是不是不像别人,我有看到。它使用Faces Servlet上的自定义Filter来访问上传数据。实际的文件上传部分工作正常,当上传成功时,我将上传的文件存储在我的Tomcat服务器上的临时文件中。

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

我只是通过<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()); 
} 
+0

这看起来像它会工作。谢谢Balus。 – 2011-06-07 00:47:18