文件扩展名为“JSF ServletException”时的JSF ServletException;。jsf";但作为“一个”;。xhtml";

文件扩展名为“JSF ServletException”时的JSF ServletException;。jsf";但作为“一个”;。xhtml";,jsf,facelets,servletexception,Jsf,Facelets,Servletexception,只要我尝试通过“http://localhost:8080/初学者/faces/index.jsf”打开index.xhtml,我就会得到以下异常: javax.servlet.ServletException javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPro

只要我尝试通过“http://localhost:8080/初学者/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中,我通过“NewMaven项目向导”创建了一个Maven项目,并选择了 组Id:“org.jboss.spec.archetype”,工件Id“jboss-javaee6-webapp-blank-archetype”版本:7.13 我正在使用JBoss7.1.1.FINAL,并尝试了JDK6和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>

第一个JSF
你好
我找了好几个小时是有原因的,但找不到任何解决方案,即使我完成了这本工作坊书让我做的每一步。

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

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

com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:214)
嘿,它被视为一个JSP文件!这里肯定有点不对劲。如果它真的被当作Facelets文件来处理,那么这里就应该有一个
FaceletViewHandlingStrategy

让我们回顾一下URL:

http://localhost:8080/beginner/faces/index.jsf
嗯?它包含2(两!)个典型的
FacesServlet
URL映射模式!
/faces/*
*.jsf
。如果您已经在webapp的
web.xml
中注册了JSF的内部代码(就像许多质量差的在线教程和代码样本一样),那么很有可能会导致JSF内部代码出现一些混乱。如果找不到物理Facelets文件,则默认情况下会返回到JSP。如果匹配了
/faces/*
映射,那么JSF将假定
/index.JSF
是物理文件。然而,它显然不是。它应该是
/index.xhtml

您是如何通过双重映射找到该URL的?你正在读的教程真的是这样教你的吗?难道你不应该改为使用

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

?

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

无论如何。。。这些URL映射模式是遗留的JSF1.x时代遗留下来的。自JSF2.0以来,可以直接在
*.xhtml
上映射
FacesServlet
,而不必与虚拟URL混淆

如果可以的话,去掉所有其他的
,这样你最终会得到
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>
与部署中的实际路径完全相同。很简单

另见:
  • ,以正确的方式开始使用JSF

查看web.xml中的内容会很好吗?它可能与您正在使用的servlet和url模式有关。一如既往,非常好,+1。有一个问题,FacesServlet映射对JSF2内部运行的Facelets 1.x有效吗?@EJP:no,不幸的是不行。这将导致堆栈溢出。
<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