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输出.如果你没有调用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.
自从引入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)
另一个可能的原因是你的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 次 |
| 最近记录: |