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
主要有三个原因.
FacesServlet
没有被调用.FacesServlet
映射匹配链接(如你在浏览器的地址栏中显示的网址)的网址必须匹配<url-pattern>
的FacesServlet
为definied中web.xml
,以获得所有的JSF工作运行.的FacesServlet
是一个负责解析XHTML文件,收集提交表单值,进行变换/验证,更新模型,调用操作和产生HTML输出.如果你没有调用FacesServlet
by 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启动期间自动注册FacesServlet
URL模式来解决上述所有问题*.xhtml
.
自从引入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.xhtml
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">
Run Code Online (Sandbox Code Playgroud)
另一个可能的原因是你的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中捆绑依赖关系.
对于那些不熟悉基本HTTP,HTML和Servlet的人来说,JSF的学习曲线非常陡峭.互联网上有很多低质量的资源.请忽略代码片段通过干扰广告链接/横幅刮通过与主要专注于广告收入,而不是教学爱好者,如roseindia,tutorialspoint,javabeat等维护的网站,他们很容易辨认.另外请忽略处理jurassic JSF 1.x的资源.通过使用JSP文件而不是XHTML文件,可以轻松识别它们.自从2009年的JSF 2.0以来,作为视图技术的JSP已被弃用.
要以正确的方式开始,请从我们的JSF wiki页面开始并订购权威书籍.
归档时间: |
|
查看次数: |
12596 次 |
最近记录: |