我正在尝试让 PrimeFaces多文件上传器在 JSF 页面上工作,并且我的技术主管已经给出了以下要求(不可协商!):
- 必须是名为 PrimeFaces/JSF 的页面
imageUpload.jsf
- 必须部署到 WAR 并部署在 Tomcat (
v7.0.19
) - 必须使用以下 PrimeFaces/JSF JAR(它们是“企业架构标准”):
jsf-api.jar
并且jsf-impl.jar
来自 JSF 2.0.3,以及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.jsf
在(或代替)之上有一个imageUpload.xhtml
?
什么解释了我得到的这个 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.
这对任何人都意味着什么?