gpt4 book ai didi

当文件扩展名为 ".jsf"但为 ".xhtml"时出现 JSF ServletException

转载 作者:行者123 更新时间:2023-12-02 08:35:52 24 4
gpt4 key购买 nike

只要我尝试通过“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>

我找了几个小时是有原因的,但找不到任何解决方案,即使我按照这本工作坊书告诉我做的每一步都做了。

最佳答案

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

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

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

嘿,它被当作 JSP 文件处理了!这里肯定不完全正确。人们会期待一个 FaceletViewHandlingStrategy如果它确实被视为 Facelets 文件,则在此处。

让我们回顾一下 URL:

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

嗯?它包含 2(两个!)典型的 FacesServlet URL映射模式! /faces/**.jsf .如果您实际上已经在您的 Web 应用程序的 web.xml 中注册了它们两者,那么它很可能会在 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 时代的遗留物。从 JSF 2.0 开始,可以只映射 FacesServlet*.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

与部署中的实际路径完全一样。足够简单。

另见:

关于当文件扩展名为 ".jsf"但为 ".xhtml"时出现 JSF ServletException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21562750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com