我仍在学习在 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 文件上传与我见过的其他文件没有什么不同。它使用Filter
Faces Servlet 上的自定义来访问上传数据。实际的文件上传部分工作正常,上传成功后,我将上传的文件存储在我的 Tomcat 服务器上的临时文件中。
我的问题是不知道如何让我的复合组件在成功上传后采取行动。我希望我的复合组件将其存储uploadedFileKey
在Map
特定会话范围的托管 bean 中,并将上传File
的映射值作为映射值。我怎样才能做到这一点?