2

一旦我尝试通过“http://localhost:8080/beginner/faces/index.jsf”打开我的 index.xhtml,我就会得到以下异常:

javax.servlet.ServletException
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
    org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)

java.lang.NullPointerException
com.sun.faces.renderkit.RenderKitImpl.createResponseWriter(RenderKitImpl.java:228)
com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:214)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)


note The full stack trace of the root cause is available in the JBoss Web/7.0.13.Final logs.

在 Eclipse 中,我通过“新建 Maven 项目向导”创建了一个 Maven 项目,并选择了组 ID:“org.jboss.spec.archetypes”,工件 ID“jboss-javaee6-webapp-blank-archetype”版本:7.13 我正在使用JBoss 7.1.1.FINAL 并尝试了 JDK 6 和 JDK7

index.xthml 看起来像这样:

<?xml version="1.0" encoding= "UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>First JSF</title>
    </h:head>
        <h:body>
            <h1>Hello there</h1>
        </h:body>
</html>

我寻找几个小时是有原因的,但找不到任何解决方案,即使我做了这本研讨会书告诉我要做的每一步。

4

1 回答 1

6

它真的是一个 XHTML(Facelets)文件吗?

仔细查看堆栈跟踪以下行中的类名,以了解谁在处理视图:

com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:214)

嘿,它被视为一个JSP文件!这里肯定不完全正确。FaceletViewHandlingStrategy如果它真的被视为一个 Facelets 文件,人们会期望这里有一个。

让我们回顾一下网址:

http://localhost:8080/beginner/faces/index.jsf

嗯?它包含 2(两个!)典型的FacesServletURL 映射模式!/faces/**.jsf。_ 如果您实际上已经在您的 web 应用程序中注册web.xmlJSF 的内部代码(就像许多质量较差的在线教程和代码示例一样),那么它很有可能在 JSF 的内部代码中造成一些混乱。如果找不到物理 Facelets 文件,则默认回退到 JSP。如果/faces/*映射匹配,那么 JSF 将假定/index.jsf是物理文件。然而,显然不是。它应该是/index.xhtml.

您究竟是如何通过双重映射访问该 URL 的?你正在阅读的教程真的是这样指导你的吗?你不应该而是使用

http://localhost:8080/beginner/index.jsf

或者

http://localhost:8080/beginner/faces/index.xhtml

?

请注意,/faces在这种特定情况下,它应该是虚拟 URL,而不是项目结构的 Web 内容中的实际文件夹!

无论如何……那些 URL 映射模式是遗留 JSF 1.x 时代的遗留物。FacesServlet从 JSF 2.0开始,可以*.xhtml直接映射而不弄乱虚拟 URL。

如果可以的话,摆脱所有其他的<servlet-mapping><url-pattern>这样你最终会得到这个FacesServlet

<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

然后您可以通过以下方式打开页面

http://localhost:8080/beginner/index.xhtml

与部署中的实际路径完全相同。够直截了当。

也可以看看:

于 2014-02-04T20:58:58.170 回答