5

在文件aPage.xhtml中,我有以下几行:

<ui:include rendered="#{not empty param.target}" src="#{param.target}.html" />
<ui:include rendered="#{empty param.target}" src="About.html" />

通过以上几行,我希望当我转到 时http://localhost:8080/beta/aPage.xhtml,该页面About.html将被包含在内,因为param.targetis null。但是,GlassFish 向我抛出了以下异常:

java.io.FileNotFoundException: http://localhost:8080/beta/.html

不知何故,param.target不被认为是null

此外,我确实尝试使用==!=运算符如下:

<ui:include rendered="#{param.target != null}" src="#{param.target}.html" />
<ui:include rendered="#{param.target == null}" src="About.html" />

有趣的是,这一次,在 GlassFish 的控制台上,我没有看到任何异常抛出。但是,在浏览器上,仍然会出现错误页面,但出现异常java.io.FileNotFoundException

如果您能告诉我为什么会发生这种情况以及我应该做些什么来避免它,我将不胜感激。

更新:

感谢 Joop Eggen 的提示,我终于用以下几行解决了这个问题:

<ui:param name="noTarget"  value="About.html" />
<ui:param name="hasTarget" value="#{param.target}.html" />
<ui:include src="#{empty param.target? noTarget : hasTarget}" />

最好的祝福

4

2 回答 2

4

src 在这两种情况下都会被评估,也许是文件存在测试?做

<ui:include src="#{empty param.target? 'About' : param.target}.html" />
于 2012-05-30T07:55:38.017 回答
3

ui:include没有rendered属性...用<h:panelGroup

像这样

<h:panelGroup rendered="#{not empty param.target}">
   <ui:include  src="#{param.target}.html" />
</h:panelGroup>
<h:panelGroup rendered="#{empty param.target}" >
    <ui:include src="About.html" />
</h:panelGroup>

编辑

不幸的是,这仅在点的 src 中的 EL 有效路径时才有效,

原因

src of 中的 EL 在<ui:include>视图构建期间评估,而不是在视图渲染期间评估

于 2012-05-30T07:45:51.177 回答