jsf - JSF返回带有纯/原始XHTML/XML/EL源的空白/未解析页面,而不是呈现的HTML输出

标签 jsf jsf-2 el facelets

我有一些如下的Facelets文件。

网页内容
 |-index.xhtml
 |-register.xhtml
 |-模板
 | | --userForm.xhtml
 | `--banner.xhtml
 :


两个页面都使用/templates目录中的模板。我的/index.xhtml在浏览器中可以正常打开。我得到了生成的HTML输出。我在/index.xhtml文件中有一个链接到/register.xhtml文件。

但是,我的/register.xhtml没有得到解析,并以纯XHTML /原始XML而不是其生成的HTML输出形式返回。所有以#{...}形式显示的EL表达式均按原样显示,而不是打印其结果。当我在浏览器中右键单击页面并执行View page source时,我仍然看到原始的XHTML源代码,而不是生成的HTML输出。例如,<h:body>没有成为<body>。看起来模板没有被执行。

但是,当我在浏览器的地址栏中打开/register.xhtml之类的/faces/register.xhtml时,它会正确显示。这是怎么引起的,我该如何解决?

最佳答案

有三个主要原因。


FacesServlet不被调用。
XML名称空间URI丢失或错误。
多个JSF实现已加载。




1.确保URL匹配FacesServlet映射

链接的URL(在浏览器的地址栏中显示的URL)必须与<url-pattern>FacesServletweb.xml匹配,以使所有JSF作品都能运行。 FacesServlet是负责解析XHTML文件,收集提交的表单值,执行转换/验证,更新模型,调用操作以及生成HTML输出的程序。如果您不通过URL调用FacesServlet,那么您将获得的所有内容(并通过右键单击在浏览器中查看源代码来查看)确实是原始的XHTML源代码。

如果<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>更改为*.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> 


2017年4月推出的JSF 2.3已通过在webapp启动期间在FacesServlet的URL模式下自动注册*.xhtml来解决上述所有问题。因此,替代方法是简单地升级到最新可用的JSF版本,该版本应为JSF 2.3或更高版本。但是理想情况下,您仍然应该仅在FacesServlet的一个URL模式上显式注册*.xhtml,因为对于完全相同的资源(例如/register.xhtml/register.jsf/register.faces/faces/register.xhtml)拥有多个可能的URL对SEO不利。 。

也可以看看:


Set default home page via <welcome-file> in JSF project
Opening Facelets page errors with "This XML file does not appear to have any style information associated with it."
Sometimes I see JSF URL is *.jsf, sometimes *.xhtml and sometimes /faces/*. Why?
JavaServer Faces 2.2 and HTML5 support, why is XHTML still being used
Which XHTML files do I need to put in /WEB-INF and which not?
Our servlets wiki-了解有关Servlet的强制性基础知识




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

自从JSF 2.2引入以来,另一个可能的原因是XML名称空间与JSF版本不匹配。如下所示的xmlns.jcp.org是JSF 2.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">


如果无法升级到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">


但理想情况下,应始终使用可用的最新版本。

也可以看看:


Which XML namespace to use with JSF 2.2 and up
JSF tags not executed
Warning: This page calls for XML namespace http://xmlns.jcp.org/jsf/XXX declared with prefix XXX but no taglibrary exists for that namespace




3.加载了多个JSF实现

另一个可能的原因是您的Web应用程序已加载了多个JSF实现,它们相互冲突并破坏。例如,当您的Web应用程序的运行时类路径被多个不同版本的JSF库污染,或者在特定的Mojarra 2.x + Tomcat 8.x组合中被污染时,当Web应用程序的ConfigureListener中有不必要的web.xml条目导致其被加载时两次。

<!-- 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>


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

也可以看看:


Configuration of com.sun.faces.config.ConfigureListener
How to properly install and configure JSF libraries via Maven?




确保您以正确的方式学习JSF

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

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

也可以看看:


Java EE web development, where do I start and what skills do I need?
What is the need of JSF, when UI can be achieved with JavaScript libraries such as jQuery and AngularJS

关于jsf - JSF返回带有纯/原始XHTML/XML/EL源的空白/未解析页面,而不是呈现的HTML输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54866725/

相关文章:

java - 如何使用 Primefaces 在 JSF 页面中显示来自 Java 缓冲区的消息

jsf-2 - 如何使用 JSF 设置 HTTP 状态码?

java - 我可以在字符串上显式调用 EL (java)

java - JSF 2 - 存在哪些方法可以返回到调用页面?

java - 如何使用表达式语言迭代具有值 Map<String,Integer> 声明为 Map<String,Map<String,Integer>> 的映射?

javax.el.PropertyNotFoundException : in the JSP page of a Spring MVC Application

ajax - 我无法以另一种形式更新数据表

jsf - 异常 - 无法为托管 Bean 凭据设置属性 userLogin

java - Java EE Web 应用程序的架构

jsf - 为什么不是我的 f :param rendering inside h:outputText?