我有一些像下面这样的Facelets文件。
WebContent |-- index.xhtml |-- register.xhtml |-- templates | |--userForm.xhtml | `--banner.xhtml :
这两个页面都使用/templates
目录中的模板。我的/index.xhtml
在浏览器中打开正常。我得到生成的HTML输出。我在/index.xhtml
文件到/register.xhtml
文件中有一个链接。但是,我的/register.xhtml
未被解析并返回为纯XHTML /原始XML而不是其生成的HTML输出。当我在浏览器中右键单击页面并执行查看页面源时,我仍然看到XHTML源代码而不是生成的HTML输出。看起来模板没有得到应用。
但是,当我在浏览器的地址栏中打开/register.xhtml
/faces/register.xhtml
时,它会正确显示。这是怎么造成的,我该如何解决?
答案 0 :(得分:40)
主要有三个原因。
FacesServlet
未被调用。FacesServlet
映射链接的网址(您在浏览器的地址栏中看到的网址)必须与<url-pattern>
中FacesServlet
的{{1}}匹配才能获得所有JSF努力运行。 web.xml
负责解析XHTML文件,收集提交的表单值,执行转换/验证,更新模型,调用操作和生成HTML输出。如果您没有通过URL调用FacesServlet
,那么您将获得的所有内容(通过右键单击,浏览器中的查看源)确实是原始的XHTML源代码。
如果FacesServlet
例如<url-pattern>
,则该链接应指向*.jsf
而不是/register.jsf
。如果它是/register.xhtml
,就像您一样,则链接应指向/faces/*
而不是/faces/register.xhtml
。避免这种混淆的一种方法是将/register.xhtml
从<url-pattern>
更改为/faces/*
。因此,下面是理想的映射:
*.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-pattern>
,那么您可能还希望阻止最终用户通过URL直接访问XHTML源代码文件。在这种情况下,您可以在*.xhtml
的{{1}}上添加<security-constraint>
,<url-pattern>
中的空*.xhtml
可以阻止:{/ p>
<auth-constraint>
即将推出的JSF 2.3将通过在webapp启动期间在web.xml
的URL模式上自动注册<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.2以来,另一个可能的原因是XML命名空间与JSF版本不匹配。下面的FacesServlet
是自JSF 2.2以来的新版本,并且在较旧的JSF版本中不起作用。症状几乎与未调用*.xhtml
的情况相同。
xmlns.jcp.org
如果无法升级到JSF 2.2,则需要使用旧的FacesServlet
XML命名空间:
<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">
另一个可能的原因是你的webapp加载了多个JSF实现,相互冲突和腐败。例如,当您的webapp的运行时类路径被多个不同版本化的JSF库或特定的Mojarra 2.x + Tomcat 8.x组合污染时,当webapp的java.sun.com
中出现不必要的<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">
条目时它要加载两次。
ConfigureListener
使用Maven时,请确保以正确的方式声明依赖项并了解依赖项范围。重要的是,当目标服务器已经提供了依赖关系时,请不要在webapp中捆绑依赖关系。
对于那些不熟悉基本HTTP,HTML和Servlets的人来说,JSF的学习曲线非常陡峭。互联网上有很多低质量的资源。请忽略由业余爱好者维护的代码片段抓取网站,主要关注广告收入而不是教学,例如roseindia,tutorialspoint,javabeat等。它们很容易通过令人不安的广告链接/横幅识别。另外请忽略处理jurassic JSF 1.x的资源。通过使用JSP文件而不是XHTML文件,可以轻松识别它们。自从2009年的JSF 2.0以来,JSP作为视图技术已被弃用。
要以正确的方式开始,请从our JSF wiki page开始,然后订购authoritative book。