【问题标题】:Get PrimeFaces JSF working on Tomcat [duplicate]让 PrimeFaces JSF 在 Tomcat 上工作 [重复]
【发布时间】: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.jarjsf-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.&lt;date&gt;.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。
  • 我会推荐你​​阅读difference between XHTML and JSP for JSF
  • 进行了更改,现在收到 HTTP 500 错误(有关详细信息,请参阅我的编辑)。

标签: java tomcat jsf-2 primefaces


【解决方案1】:

首先请注意,Primefaces 展示展示了最新的 Primefaces 发布版本。如果可以使用所有给定属性上传文件,您应该检查 Primefaces documentation 版本 2.2.1。

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

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

所以假设上下文根与你的war文件名相同,你应该尝试:

localhost:8080/image-uploader/imageUpload.jsf

【讨论】:

  • 感谢@Matt 的有用回答!但仍有问题,请参阅我对 OP 的编辑。再次感谢!
  • 您似乎没有包含 JSF 所需的所有类。见here
  • 哈!我找到了相同的链接,用javax.servlet.jsp.jstl-1.2.1.jar 重新部署(并在WEB-INF/lib/ 下确认了它)但仍然是同样的错误......
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2012-11-08
  • 2014-03-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多