主要有三个原因。
-
FacesServlet
未被调用。
-
XML命名空间URI丢失或错误。
-
已加载多个JSF实现。
1。确保URL匹配
面服务
映射
链接的URL(您在浏览器地址栏中看到的URL)必须与
<url-pattern>
的
面服务
如定义
web.xml
为了让所有的JSF工作运行起来。这个
面服务
负责分析XHTML文件、收集提交的表单值、执行转换/验证、更新模型、调用操作和生成HTML输出。如果不调用
面服务
通过url,你就可以得到所有的信息(通过右键点击,
视图源
在浏览器中)确实是原始的XHTML源代码。
如果
<URL模式GT;
例如
*.jsf
,则链接应指向
/register.jsf
而不是
/register.xhtml
. 如果是这样的话
/faces/*
,就像您所拥有的,那么链接应该指向
/faces/register.xhtml
而不是
注册/ XHTML
. 避免这种混乱的一种方法是改变
<URL模式GT;
从
/FACE/*
到
*.xhtml
. 因此,下面是理想的映射:
<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>
如果你不能改变
<URL模式GT;
到
*XHTML
出于某种原因,您可能还希望阻止最终用户通过URL直接访问XHTML源代码文件。在这种情况下,您可以添加
<security-constraint>
上
<URL模式GT;
属于
*XHTML
空着
<auth-constraint>
在里面
Web.XML
这就阻止了:
<security-constraint>
<display-name>Restrict direct access to XHTML files</display-name>
<web-resource-collection>
<web-resource-name>XHTML files</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
即将到来的JSF 2.3将通过自动注册
面服务
在URL模式上
*XHTML
在webapp启动时。
参见:
2。确保XML名称空间与JSF版本匹配
由于引入了JSF 2.2,另一个可能的原因是XML名称空间与JSF版本不匹配。这个
xmlns.jcp.org
下面是新的,因为JSF 2.2,不适用于旧的JSF版本。症状几乎是相同的,如果
面服务
未被调用。
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
如果不能升级到JSF 2.2,那么需要使用旧的
java.sun.com
XML命名空间:
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
参见:
三。已加载多个JSF实现
另一个可能的原因是,webapp已经加载了多个JSF实现,它们相互冲突并相互破坏。例如,当webapp的运行时类路径被多个不同版本的jsf库污染时,或者在特定的mojarra 2.x+tomcat 8.x组合中,当存在不必要的
ConfigureListener
webapp的条目
Web.XML
使其加载两次。
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
使用maven时,请确保以正确的方式声明依赖项,并且了解依赖范围。重要的是,当目标服务器已经提供依赖项时,不要在webapp中捆绑这些依赖项。
参见:
确保你以正确的方式学习JSF
对于那些不熟悉基本知识的人来说,JSF有一个非常陡峭的学习曲线。
HTTP
,
HTML
和
Servlets
. 互联网上有很多低质量的资源。请忽略由业余人士维护的代码片段抓取网站,主要关注广告收入而不是教学,如Roseindia、TutorialSpoint、JavaBeat等。它们很容易通过干扰广告链接/横幅识别。另外,请忽略处理Jurassic JSF 1.x的资源。使用JSP文件而不是XHTML文件很容易识别这些资源。由于2009年的JSF 2.0已经过时了JSP as View技术。
要开始正确的方式,从
our JSF wiki page
订购一个
authoritative book
.
参见: