Java 让JSF在Tomcat上工作

Java 让JSF在Tomcat上工作,java,tomcat,jsf-2,primefaces,Java,Tomcat,Jsf 2,Primefaces,我正试图让一个PrimeFaces在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页面,其

我正试图让一个PrimeFaces在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将其升级,并部署到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:

imageUpload.xhtml:

然后将此war部署到${CATALINA.HOME}/webapps/。当我运行Tomcat时,日志中没有任何错误或警告,但我确实在catalina中看到了这一点。日志我在Windows 7上:

2012年4月11日下午2:31:33 org.apache.catalina.startup.HostConfig deployWAR

信息:部署web应用程序存档映像上载程序.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:存在后构造/预分解注释。标记有这些注释的ManagedBeans方法将处理上述注释

我是否缺少任何其他配置文件?我是否需要在imageUpload.xhtml之上有一个imageUpload.jsf,或者替代imageUpload.xhtml

是什么解释了我的404错误?!?提前谢谢

注意:除非无法让PrimeFaces/JSF在我指出的JAR版本下工作,否则请尊重我对我们的标准没有任何发言权。如果我能证明JSF2.0.3与PrimeFaces 2.2.1不兼容,那么我可能会说服技术人员改变标准。但除非我能证明这一点,否则这些都是我一直坚持的版本和技术——所以请不要乱说为什么要选择那种技术——或者为什么要使用旧的版本类型

编辑:

更改了my 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.

这对任何人都有意义吗?

首先,请注意Primefaces showcase显示了Primefaces的最新发布版本。如果可以使用所有给定的属性上载文件,则应签入版本2.2.1

然后,正如Luigi所提到的,您必须确保web.xml中的Facesservlet映射与项目中的文件相匹配

最后,返回您的请求URL。我没有使用Tomcat,但在Glassfish中,您有一个应用程序部署到的上下文根。上下文根目录必须是URL的一部分,并且通常与war文件名相同。您可以更改它,但我不知道在Tomcat的何处执行此操作

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

localhost:8080/image-uploader/imageUpload.jsf

在web.xml中,将*.jsf更改为*.xhtmlGenius!这是否意味着我也可以将我的文件重命名为imageUpload.jsf而不是imageUpload.xhtml?jsf 1.X中对JSP页面大量使用了*.jsf过滤器,因为*.JSP过滤器会导致自引用错误,这并不意味着您的页面应该具有jsf扩展名。在JSF2.x中,这不再是一个问题,您可以使用*.jsp过滤器。如果你有XHTML页面,你的过滤器应该是*.XHTML。我建议你阅读修改后的内容,现在收到HTTP 500错误。请查看我的编辑以了解详细信息。感谢你提供的有用答案@Matt!但是仍然有问题,请查看我对OP的编辑。再次感谢!您似乎没有包含JSF所需的所有类。再见哈!我找到了相同的链接,用javax.servlet.jsp.jstl-1.2.1.jar重新部署,并在WEB-INF/lib/下确认了它的存在,但仍然是相同的错误。。。
<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>
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
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.
localhost:8080/image-uploader/imageUpload.jsf