【发布时间】:2012-04-24 03:27:56
【问题描述】:
我正在尝试让 PrimeFaces multiple file uploader 在 JSF 页面上工作,并且我的技术主管已经给出了以下要求(不可协商!):
- 必须是名为
imageUpload.jsf的 PrimeFaces/JSF 页面 - 必须部署到 WAR 并部署到 Tomcat (
v7.0.19) - 必须使用以下 PrimeFaces/JSF JAR(它们是“企业架构标准”):来自 JSF 2.0.3 的
jsf-api.jar和jsf-impl.jar,以及primefaces-2.2.1.jar
我的第一个任务是复制链接的演示页面所具有的内容 - 只是一个简单的 JSF 页面,其中包含文件上传组件。所以我创建了一个 Eclipse 项目,创建了我相信正确的目录结构和配置文件,使用 Ant 对其进行 WAR,然后部署到 Tomcat 的 webapps 目录。 当我转到 localhost:8080/imageUpload.jsf 时,我收到 404(请求的资源 (/imageUpload.jsf) 不可用。)错误。
这是我的设置:
eclipse中的项目目录结构:
ImageUploader
src/
com.company.imgupload.FileUploadController.java
build/ --> where java compiles to and then copies over to WEB-INF/classes/
dist/ --> where image-uploader.war gets WARed to
lib/ --> copied to WEB-INF/lib/
war/
META-INF/
MANIFEST.MF
WEB-INF/
classes/
lib/
imageUpload.xhtml
faces-config.xml
web.xml
FileUploadController.java 与 PrimeFaces 人们在上面提供的演示链接上的相同 - 在我开始根据我们的需要对其进行自定义之前,我只是想让这个简单的示例正常工作。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
<welcome-file-list>
<welcome-file>imageUpload.jsf</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
faces-config.xml:
<?xml version="1.0" encoding="utf-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
<!-- Not using MangedBean declarations for this simple example -->
</faces-config>
imageUpload.xhtml:
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<link type="text/css" rel="stylesheet" href="themes/bluesky/skin.css" />
</h:head>
<h:body>
<center>
<p:panel header="Multiple File Uploader Demo" style="width: 350;">
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}" mode="advanced" update="messages" multiple="true" sizeLimit="100000" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>
<p:growl id="messages" showDetail="true"/>
</h:form>
</p:panel>
<div><h:messages ></h:messages></div>
</center>
</h:body>
</html>
为了重申,将这些放在以下 WAR 文件中:
image-uploader.war/
META-INF/
MANFIEST.MF
WEB-INF/
classes/
com/company/imgupload/FileUploadController.java
lib/
jsf-api.jar (v2.0.3)
jsf-impl.jar (v2.0.3)
primefaces-2.2.1.jar
web.xml
faces-config.xml
imageUpload.xhtml
然后将这场战争部署到${CATALINA.HOME}/webapps/。当我运行 Tomcat 时,我没有在日志中看到任何错误或警告,但我确实在 catalina.<date>.log 中看到了这一点(我在 Windows 7 上):
2012 年 4 月 11 日下午 2:31:33 org.apache.catalina.startup.HostConfig deployWAR
信息:部署 web 应用程序存档 image-uploader.war
2012 年 4 月 11 日下午 2:31:34 com.sun.faces.config.ConfigureListener contextInitialized
信息:为上下文“/image-uploader”初始化 Mojarra 2.0.3 (FCS b03)
2012 年 4 月 11 日下午 2:31:34 com.sun.faces.spi.InjectionProviderFactory createInstance
信息:JSF1048:存在 PostConstruct/PreDestroy 注释。使用这些注解标记的 ManagedBeans 方法将处理这些注解。
我在这里缺少任何其他配置文件吗?我需要在imageUpload.xhtml 之上(或代替)imageUpload.jsf 吗?
什么解释了我遇到的这个 404 错误?!?提前致谢。
注意:除非不可能让 PrimeFaces/JSF 在我指出的 JAR 版本下工作,否则请尊重我没有任何发言权 -所以我们的标准是什么。如果我能证明 JSF 2.0.3 与 PrimeFaces 2.2.1 不兼容,那么我可能可以说服技术人员改变标准。但除非我能证明这一点,否则这些是我坚持使用的版本和技术 - 所以请不要用“你为什么选择该技术”来混淆 SO -或“你为什么要使用旧版本”类型的回复!
编辑:
更改了我的web.xml 以反映@Luigi 的建议,并且(根据@Matt 的建议)将我的浏览器指向localhost:8080/image-uploader/imageUploader.jsf 并且没有收到HTTP 500 错误:
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/image-uploader] threw exception [javax/servlet/jsp/jstl/core/Config] with root cause
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:340)
at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:150)
...etc.
这对任何人都意味着什么?
【问题讨论】:
-
在您的 web.xml 中,将“
*.jsf ”更改为“*.xhtml ”跨度> -
天才!这是否意味着我也可以将我的文件重命名为 imageUpload.jsf(而不是 imageUpload.xhtml)?
-
*.jsf 过滤器在 JSF 1.X 中大量用于 JSP 页面,因为 *.jsp 过滤器会导致自引用错误,这并不意味着您的页面应该有 JSF延期。在 JSF 2.x 中,这不再是问题,您可以使用 *.jsp 过滤器。如果你有 XHTML 页面,你的过滤器应该是 *.XHTML。
-
进行了更改,现在收到 HTTP 500 错误(有关详细信息,请参阅我的编辑)。
标签: java tomcat jsf-2 primefaces