环境:RichFaces 3.3.3 Final;小面1.1.15;JBoss portletbridge 2.1.0决赛;GateIn Portal 3.1.0与JBoss as 5.1和Mojarra JSF 1.2捆绑在一起。
一些代码片段:filepage.xhtml:
<a4j:form id="fileForm">
<rich:fileUpload fileUploadListener="#{testBean.fileListener}"
acceptedTypes="txt" maxFilesQuantity="1" />
<!-- etc. -->
</a4j:form>
TestBean.java:
public void fileListener(UploadEvent e) throws IOException {
System.out.println("Entering the fileListener Method");
UploadItem item = e.getUploadItem();
File file = item.getFile();
// etc...
}
当部署为独立的web应用程序时,结果如预期,组件显示,用户单击添加,浏览然后选择一个文件,文件被添加到列表中,用户单击上传按钮,控制台上显示"输入fileListener方法"一行(以及其他发生的事情)。
GateIn上的结果:除了侦听器中的sysout和其他代码之外,其余都是。似乎没有调用此方法。
我已经花了几天时间阅读JBoss社区论坛和一些JIRA,我的问题似乎并不新鲜。我尝试了我找到的每一个建议,但都不适用。此外,这些帖子都不是2010年1月发布的,从那时起,我的应用程序的所有组成部分都有了新版本。
非常感谢您的帮助,或提供最新详细信息。
我不认为这是我自己问题的答案,但这对于评论来说太大了,我不想通过将其添加为编辑来影响答案。不管怎样,在一位同事的建议下,我有了一些变通办法。
正如我在问题中提到的,文件上传在一个独立的web应用程序中可以完美地工作,所以为什么不让portlet只指向那个web应用程序,而不是那个web应用呢。
在portlet.xml中,将<portlet-class>
从javax.portlet.faces.GenericFacesPortlet更改为您创建的java portlet,例如mypackage。DispatchPortlet。同时删除具有defaultViewId的<init-param>
。
DispatchPortlet和其他所有东西都在同一个项目中,并且只比条目HelloWorldPortlet复杂一步。只需覆盖doView并添加以下四行:
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(HTML_CONTENT);
out.close();
HTML_CONTENT是一个静态字符串变量,看起来有点像:
<iframe src="url to your app" height="400" width="600">no iframes</iframe>
这些都是垃圾。人们几乎想知道我们为什么要麻烦使用portlet桥。不仅一切都正常,而且看起来也好一点,因为GateIn对CSS所做的一些时髦的事情并没有发生。
然而,我认为这是一个贫民区解决方案,并且正在寻找正确的方法,使其成为一个100%的portlet,并具有正常的文件上传功能。
我在Red Hat EPP的文档中发现不支持文件上传。也许下一个版本准备好了(支持JSF 2、Richfaces 4和Bridge 3),就可以了,但就目前而言,解决方案是唯一的选择。