JSF使用普通/原始XHTML / XML / EL源返回空白/未解析页面,而不是呈现HTML输出

时间:2010-06-24 18:41:38

标签: jsf jsf-2 el facelets

我有一些像下面这样的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时,它会正确显示。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:40)

主要有三个原因。

  1. FacesServlet未被调用。
  2. XML名称空间URI缺失或错误。
  3. 已加载多个JSF实现。

  4. 1。确保该URL与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> 来解决上述所有问题。

    另见:


    2。确保XML名称空间与JSF版本

    匹配

    自从引入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">
    

    另见:


    3。已加载多个JSF实现

    另一个可能的原因是你的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中捆绑依赖关系。

    另见:


    确保以正确的方式学习JSF

    对于那些不熟悉基本HTTPHTMLServlets的人来说,JSF的学习曲线非常陡峭。互联网上有很多低质量的资源。请忽略由业余爱好者维护的代码片段抓取网站,主要关注广告收入而不是教学,例如roseindia,tutorialspoint,javabeat等。它们很容易通过令人不安的广告链接/横幅识别。另外请忽略处理jurassic JSF 1.x的资源。通过使用JSP文件而不是XHTML文件,可以轻松识别它们。自从2009年的JSF 2.0以来,JSP作为视图技术已被弃用。

    要以正确的方式开始,请从our JSF wiki page开始,然后订购authoritative book

    另见: