【问题标题】:JSF 2.0: Empty operator doesn't work with paramJSF 2.0:空运算符不适用于参数
【发布时间】:2012-06-04 09:58:50
【问题描述】:

在文件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.targetnull。但是,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}" />

最好的问候

【问题讨论】:

  • param.target 似乎持有 -en 值,这意味着它不是空的,这就是为什么你被引用到 -en.html 页面......似乎持有的值存在问题param.target
  • @Daniel:哎呀,对不起,-en 不应该在那里。我在简化代码以在此处发布时错过了这一点。

标签: java jsf-2 el param


【解决方案1】:

ui:include 没有rendered 属性...用&lt;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 为有效路径时才有效,

原因

&lt;ui:include&gt; 的 src 中的 EL 在视图构建期间评估,而不是在视图渲染期间评估

【讨论】:

  • 尽管 NetBeans 建议 ui:include 具有 rendered 属性,但您似乎是对的。但是,使用您的解决方案时,我仍然遇到同样的异常。
  • 尝试在您的页面中输出 param.target... 它向您显示了什么? &lt;h:outputText value="prefix#{param.target}suffix"/&gt;你看到前缀和后缀之间有什么吗?
  • 我确实尝试在上面的代码中用&lt;h:outputText&gt; 替换&lt;ui:include&gt;。当param.target 为空且不为空时,它会打印出正确的消息。我认为乔普·埃根是对的。在这两种情况下都评估了src 属性。
  • 我总是使用 h:panelGroup 的包装,它总是在这里工作......我想知道
  • 正如我告诉你的那样,我尝试将&lt;h:outputText value="Empty"&gt; 放入&lt;h:panelGroup rendered="#{empty param.target}" &gt; 中,并且效果很好。仅当我将&lt;ui:include&gt; 放入&lt;h:panelGroup rendered="#{empty param.target}" &gt; 时才会出现问题。 :)
【解决方案2】:

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

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

【讨论】:

  • 在 EL 中不能使用+ 连接字符串。我修正了语法。
  • @BalusC,说为什么我提出的解决方案在这种情况下不起作用?因为它对我来说总是很好......
  • @Daniel:&lt;ui:include&gt; 中的src 中的 EL 在视图构建期间而不是在视图渲染期间进行评估。仅当src 指向有效路径时才有效。
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2014-03-07
相关资源
最近更新 更多