3

我正在使用 JSF 2。

对于其中一个页面,它需要包含一个页面,如下所示:

domain/subdomain/cms/[userspecified_code].html

我使用 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>

编辑

感谢所有的答案。我正在寻找一种不需要我自己添加所有文件检查逻辑的解决方案。

4

2 回答 2

6

您可以使用的解决方法是在呈现页面之前检查目标文件是否存在于服务器端。假设您正在使用允许视图方法参数的 EL-2.2,您可以执行以下操作:

public boolean fileExists(String fileName)
    File file = new File(servletContext.getRealPath("domain/subdomain/cms/"+fileName+".html"));
    return file.exists();
}

并使用 jstl 条件标签动态包含目标页面:

<c:if test="#{bean.fileExists(userspecified_code)}">
    <ui:include src="domain/subdomain/cms/#{userspecified_code}.html" />
</c:if>

此外,为了避免代码重复,您可以使用fn:jointag 只评估一次路径:

<c:if test="#{bean.fileExists(userspecified_code)}">
    <ui:include src="#{fn:join('domain/subdomain/cms/',fn:join(userspecified_code,'.html')}" />
</c:if>
于 2013-10-14T07:37:20.627 回答
-2

您可以在面板(primefaces)中编写ui:include 。
并且仅当您的文件名不为空时才渲染(渲染是面板的属性)。

于 2013-10-14T07:00:13.987 回答