Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF返回空白/未解析页面,其中包含普通/原始XHTML/XML/EL源代码,而不是呈现的HTML输出_Jsf_Jsf 2_El_Facelets - Fatal编程技术网

JSF返回空白/未解析页面,其中包含普通/原始XHTML/XML/EL源代码,而不是呈现的HTML输出

JSF返回空白/未解析页面,其中包含普通/原始XHTML/XML/EL源代码,而不是呈现的HTML输出,jsf,jsf-2,el,facelets,Jsf,Jsf 2,El,Facelets,我有一些Facelets文件,如下所示 WebContent |-- index.xhtml |-- register.xhtml |-- templates | |--userForm.xhtml | `--banner.xhtml : 网络内容 |--index.xhtml |--register.xhtml |--模板 ||--userForm.xhtml |`--banner.xhtml : 这两个页面都使用/templates目录中的模板。我的/index.xh

我有一些Facelets文件,如下所示

WebContent |-- index.xhtml |-- register.xhtml |-- templates | |--userForm.xhtml | `--banner.xhtml : 网络内容 |--index.xhtml |--register.xhtml |--模板 ||--userForm.xhtml |`--banner.xhtml : 这两个页面都使用
/templates
目录中的模板。我的
/index.xhtml
可以在浏览器中正常打开。我得到生成的HTML输出。我在
/index.xhtml
文件中有一个指向
/register.xhtml
文件的链接

但是,我的
/register.xhtml
没有被解析,并以普通的xhtml/raw XML而不是其生成的HTML输出返回。所有EL表达式以
#{…}
的形式显示,而不是打印其结果。当我在浏览器中右键单击页面并查看页面源代码时,仍然可以看到原始的XHTML源代码,而不是生成的HTML输出。例如,
没有变成
。看起来模板没有被执行


但是,当我在浏览器的地址栏中打开类似于
/faces/register.xhtml
/register.xhtml
时,它会正确显示。这是如何造成的,我如何解决它?

有三个主要原因

  • FacesServlet
    未被调用
  • XML命名空间URI缺失或错误
  • 已经加载了多个JSF实现

  • 1.确保URL匹配
    FacesServlet
    映射 链接的URL(您在浏览器地址栏中看到的URL)必须与
    FacesServlet
    相匹配,如
    web.xml
    中所定义,以便运行所有JSF工作。
    FacesServlet
    负责解析XHTML文件、收集提交的表单值、执行转换/验证、更新模型、调用操作和生成HTML输出。如果您不通过URL调用
    FacesServlet
    ,那么您将得到的(通过右键单击查看,在浏览器中查看源代码)实际上就是原始的XHTML源代码

    如果
    是例如
    *.jsf
    ,那么链接应该指向
    /register.jsf
    ,而不是
    /register.xhtml
    。例如,如果是
    /faces/*
    ,那么链接应该指向
    /faces/register.xhtml
    ,而不是
    /register.xhtml
    。避免这种混淆的一种方法是将
    /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>
    
    2017年4月推出的JSF 2.3通过在webapp启动期间在
    *.xhtml
    的URL模式上自动注册
    FacesServlet
    解决了上述所有问题。因此,另一种选择是简单地升级到最新可用的JSF版本,该版本应该是JSF2.3或更高版本。但理想情况下,您仍然应该只在
    *.xhtml
    的一个URL模式上显式注册
    FacesServlet
    ,因为对于完全相同的资源,如
    /register.xhtml
    /register.jsf
    /register.faces
    /faces/register.xhtml>有多个可能的URL,这对SEO是有害的

    另见:
    • -学习有关servlet的必修基础知识

    2.确保XML名称空间与JSF版本匹配 自从引入JSF2.2以来,另一个可能的原因是XML名称空间与JSF版本不匹配。下面类似的
    xmlns.jcp.org
    是自JSF2.2以来的新版本,在较旧的JSF版本中不起作用。症状几乎与未调用
    FacesServlet
    时相同

    <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的
    web.xml
    中有一个不必要的
    ConfigureListener
    条目导致它被加载两次时

    <!-- You MUST remove this one from web.xml! -->
    <!-- This is actually a workaround for buggy GlassFish3 and Jetty servers. -->
    <!-- When leaving this in and you're targeting Tomcat, you'll run into trouble. -->
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>
    
    
    com.sun.faces.config.ConfigureListener
    
    在使用Maven时,请绝对确保以正确的方式声明依赖项,并且理解依赖项范围。重要的是,当目标服务器已经提供依赖项时,不要在webapp中捆绑这些依赖项

    另见:

    确保您以正确的方式学习JSF 对于那些不熟悉basic和JSF的人来说,JSF的学习曲线非常陡峭。互联网上有很多低质量的资源。请忽略业余爱好者维护的代码片段清理网站,这些网站主要关注广告收入,而不是教学,如roseindia、TutorialPoint、javabeat、baeldung等。它们很容易通过干扰广告链接/横幅识别。另外,请忽略有关jurassic JSF 1.x的参考资料。通过使用JSP文件而不是XHTML文件,它们很容易识别。自从2009年JSF2.0以来,JSP作为视图技术已经被弃用

    要以正确的方式开始,请从开始并订购

    另见:

    谢谢你,巴卢斯克。我会试试这个然后再给你。保持联系。嗨,亲爱的,现在我用标签添加了我的链接。链接工作正常。我还有一个问题。该链接自动进入/faces/register.xhtml。有没有办法隐藏/faces/目录和链接should display/register.xhtml而不使用“faces”目录???啊,你使用的是前缀映射
    /faces/*
    ,不,你不能隐藏它。使用扩展映射,如
    *.jsf
    *.faces
    甚至
    *.customextension
    。用
    *.jsf替换
    /faces/*
    <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">
    <!-- You MUST remove this one from web.xml! -->
    <!-- This is actually a workaround for buggy GlassFish3 and Jetty servers. -->
    <!-- When leaving this in and you're targeting Tomcat, you'll run into trouble. -->
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>