我有一个JSF页面,它有一个h:form,它有一些文本字段,还有一个来自primefaces 的图像上传小工具
我的问题是:如何从字段中获取文本并将其分配给某个变量。(目的是将上传的图像与文本分离(
-我该怎么办?
-我需要过滤器吗?
-有没有什么简单的方法可以用primefaces文件上传工具实现它?
这对于PrimeFaces 2.2.1来说并非微不足道。PF2文件上传处理有点像史诗般的失败。在幕后,使用Ajax上传文件已经不是一件小事了。XMLHttpRequest
对象根本不支持multipart/form-data
请求。许多"Ajaxified"(有一种异步进度的感觉(文件上传解决方案都是基于隐藏的iframe,或者像PF一样,使用Flash。PF 2是基于Flash的,不能与常规文本输入相结合,以便一次性提交所有数据。
在PF3中,文件上传组件进行了大幅修改。使用"简单"的文件上传模式,您的问题应该得到解决。然而,PF3目前仍处于β/α阶段。你需要在你的网络应用程序上做很多单元测试,看看它是否在PF3上不坏。
如果PF3不是一个选项,那么你最好使用战斧2.0或自制JSF组件。
- JSF 2.0文件上传-Tomahawk 2.0文件上传教程
- 使用JSF 2.0和Servlet 3.0上传文件-自定义文件上传组件教程
至于过滤器,FacesServlet
使用HttpServletRequest#getParameter()
来检索提交的值。当您熟悉基本的JSP/Servlet时,您应该知道它通常是如何工作的。默认的HTML表单编码是application/x-www-form-urlencoded
。getParameter()
方法依赖于此。然而,为了能够同时发送二进制数据,例如文件上传,这种默认的表单编码是不合适的。为此,应使用multipart/form-data
。
然而,使用这种表单编码,getParameter()
调用将不再工作。他们都将返回null
。最简单的形式是,您需要根据每个请求手动解析请求体。另请参阅如何使用JSP/Servlet将文件上载到服务器?然而,这与JSF结合使用是不可行的,因为它依赖于getParameter()
调用来使用提交的值设置bean属性(模型值(并调用命令按钮/链接操作。
因此,您希望以这种方式更改HttpServletRequest
,以便getParameter()
调用返回正确的值。因此,Filter
是正确的选择,因为它在任何servlet(如FacesServlet
(之前运行。然后,过滤器应该解析multipart/form-data
请求体,创建一个参数映射和包装,并用一个自定义实现替换原始的HttpServletRequest
,该实现返回正确的参数,并通过链传递该请求对象,以便JSF可以"以通常的方式"完全透明地使用它。