0

我正在尝试让 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.

这对任何人都意味着什么?

4

1 回答 1

0

首先要知道 Primefaces 展示展示了最新的 Primefaces 发布版本。如果可以使用所有给定属性上传文件,您应该查看Primefaces 文档以了解 2.2.1 版本。

然后(如 Luigi 所述),您必须确保 web.xml 中的 faces servlet 映射与项目中的文件匹配。

最后到您的请求网址。我没有使用 Tomcat,但在 Glassfish 中,您有一个应用程序部署到的上下文根。上下文根需要是您的 url 的一部分,并且通常与您的 war 文件名相同(您可以更改它,但我不知道在哪里为 Tomcat 执行此操作)。

因此,假设上下文根与您的战争文件名相同,您应该尝试:

localhost:8080/image-uploader/imageUpload.jsf
于 2012-04-12T06:13:18.840 回答