我正在使用JSF 2.
对于其中一个页面,它需要包含以下行的页面:
domain/subdomain/cms/[userspecified_code].html
Run Code Online (Sandbox Code Playgroud)
我用ui:include标签来获取这个文件.它适用于存在的文件,但对于不存在的文件,它会抛出FileNotFoundException,将整个页面呈现为错误页面.
是否有一个替代解决方案ui:include标签跳过/记录文件错误,只显示一个空的部分?这样可以最大限度地减少对用户的干扰(包含的文件只是页面的一小部分,如果没有匹配的文件,我宁愿不显示任何内容).我能想到的一种方法是加载ajax部分,所以如果出现错误,它将是一个javascript错误而不是一个服务器错误,但是有更优雅/更简单的方法吗?
这是我目前拥有的xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
Lots of other html....
<ui:include src="domain/subdomain/cms/#{userspecified_code}.html"/>
Lots of other html....
</html>
Run Code Online (Sandbox Code Playgroud)
编辑
嗨,大家好,谢谢你的所有答案.我正在寻找一种不需要我自己添加所有文件检查逻辑的解决方案.
我正在将旧项目从 JSF 1.1 升级到 JSF 2.2。具体来说,我将 JSF 实现从 MyFaces 1.1 升级到 MyFaces 2.2.12,用 Facelets 替换 JSP 并升级/替换过时的标签库。我主要使用从 JSF 1.2 迁移到 JSF 2.0作为指南。
该项目使用了一些在其 JSP 页面中htmLib使用命名空间调用的标记库http://jsftutorials.net/htmLib。我再也找不到关于这个标签库的任何文档,无论是在 jsftutorials 网页还是其他地方,但显然它被用来包含像JSP 页面<div>或<table>在 JSP 页面中的纯 HTML 标签。
由于现在可以在带有 JSF2 的 XML Facelets 中使用纯 HTML 标记,因此我现在正在从htmLibtaglib 中删除所有出现的标记,<htm:div>...</htm:div>例如<div>...</div>.
但是,从使用的一些标签htmLib包含render用于条件渲染的属性,如下所示:
<htmLib:h4 render="someCondition">
...
</htmLib:h4>
Run Code Online (Sandbox Code Playgroud)
因为纯 HTML 标签没有render用于此目的的属性,所以我正在寻找一种有条件地呈现纯 HTML 标签的替代方法,并在 SO 上偶然发现了这个答案:如何有条件地呈现像 <div> 这样的纯 HTML 元素? …
我正在使用JSF 2.1.8实现一个Web应用程序,我遇到了ui:include标记的问题.我有这个代码
<h:panelGroup id="panelContenido">
<ui:fragment rendered="#{!empty navigationManagerSystem._Navegable}">
<ui:include src="#{navigationManagerSystem._Navegable._IncludePath}" />
</ui:fragment>
<ui:fragment rendered="#{empty navigationManagerSystem._Navegable}">
<ui:include src="/system/navigation/error.xhtml" />
</ui:fragment>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
该navigationManagerSystem bean被JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容.如果我按照这样的常量执行此操作,<ui:include /system/home/index.xhtml" />但是如果我将它放在变量中则不行,即使我已经看到变量在屏幕打印之前保持该值.我不知道它是否能与持有/system/home/index.xhtml页豆,这是有关视图作用域.
无论如何,如果我在页面渲染后立即刷新页面,则正确包含xthml.顺便说一句,我已经简化了要包含的页面,以便没有任何jstl标签,因为我知道它们可能会导致View Scope出现问题.
有什么想法吗?