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

Blu*_*ird 18 jsf facelets el jsf-2

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

WebContent
 |-- index.xhtml
 |-- register.xhtml
 |-- templates
 |    |--userForm.xhtml
 |    `--banner.xhtml
 :

两个页面都使用/templates目录中的模板.我/index.xhtml在浏览器中打开了.我得到生成的HTML输出.我在/index.xhtml文件中有一个链接/register.xhtml文件.但是,我/register.xhtml没有被解析并返回为普通的XHTML/raw XML而不是生成的HTML输出.当我在浏览器中右键单击页面并执行查看页面源代码时,我仍然看到XHTML源代码而不是生成的HTML输出.看起来模板没有得到应用.

但是,当我在浏览器的地址栏中打开#{...}相似内容<h:body>时,它会正确显示.这是怎么造成的,我该如何解决?

Bal*_*usC 44

主要有三个原因.

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

1.确保URL与FacesServlet映射匹配

链接(如你在浏览器的地址栏中显示的网址)的网址必须匹配<url-pattern>FacesServlet为definied中web.xml,以获得所有的JSF工作运行.的FacesServlet是一个负责解析XHTML文件,收集提交表单值,进行变换/验证,更新模型,调用操作和产生HTML输出.如果你没有调用FacesServletby URL,那么你所得到的(通过右键单击,浏览器中的View Source)确实是原始的XHTML源代码.

<url-pattern>例如*.jsf,如果是,那么链接应该指向/register.jsf而不是/register.xhtml.如果它是,例如/faces/*,像你一样,那么链接应该指向/faces/register.xhtml而不是/register.xhtml.避免这种混淆的一种方法是将<url-pattern>from /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>
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因无法更改<url-pattern>to *.xhtml,那么您可能还希望阻止最终用户通过URL直接访问XHTML源代码文件.在这种情况下,您可以添加<security-constraint><url-pattern>*.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> 
Run Code Online (Sandbox Code Playgroud)

即将推出的JSF 2.3将通过在webapp启动期间自动注册FacesServletURL模式来解决上述所有问题*.xhtml.

也可以看看:


2.确保XML名称空间与JSF版本匹配

自从引入JSF 2.2以来,另一个可能的原因是XML命名空间与JSF版本不匹配.在FacesServlet下面就像是新的,因为JSF 2.2和老年JSF版本不起作用.症状几乎与*.xhtml未调用的症状相同.

<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">
Run Code Online (Sandbox Code Playgroud)

如果无法升级到JSF 2.2,则需要使用旧的/register.xhtmlXML命名空间:

<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">
Run Code Online (Sandbox Code Playgroud)

也可以看看:


3.已加载多个JSF实现

另一个可能的原因是你的webapp加载了多个JSF实现,相互冲突和腐败.例如,当您的webapp的运行时类路径被多个不同版本化的JSF库或特定的Mojarra 2.x + Tomcat 8.x组合污染时,当webapp中有一个不必要的/register.jsf条目/register.faces导致它被加载两次.

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

使用Maven时,请确保以正确的方式声明依赖项并了解依赖项范围.重要的是,当目标服务器已经提供了依赖关系时,请不要在webapp中捆绑依赖关系.

也可以看看:


确保以正确的方式学习JSF

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

要以正确的方式开始,请从我们的JSF wiki页面开始并订购权威书籍.

也可以看看:


归档时间:

查看次数:

12596 次

最近记录:

5 年,10 月 前