2012-03-22 60 views
2

我试图动态地呈现基于查询字符串的存在或不存在查询字符串的一些组合物/模板的存在下进行。例如:条件呈现JSF H:panelGrid的基于查询字符串(或没有查询字符串在所有)

本地主机:9080/myWonderfulApp/test.xhtml富=酒吧

这工作,A.xhtml在被拉到

本地主机:9080/myWonderfulApp/test.xhtml

这不起作用,B.xhtml没有得到拉动。

我在与缺少一个查询字符串部分的问题。当我传递?foo = bar时,我可以呈现A.xhtml,但当我没有查询字符串时,我似乎无法呈现B.xhtml呈现。我尝试了一些变化,我最初认为#{param ['foo']!='bar'会起作用,但我认为这不起作用,因为我根本没有foo查询参数。我试着检查,如果参数== null,但也没有工作。

是否有可能基于NO查询字符串设置我的呈现属性?

我不能为B.xhtml设置另一个查询字符串,因为我正在处理一个传统应用程序,该应用程序获取2个不同的皮肤,因此改进链接的所有旧应用程序不是一个选项。新的应用程序将使用一个查询字符串,旧的应用程序需要一个旧的皮肤链接到没有查询字符串。

<!--This works--> 
<h:panelGrid rendered="#{param['foo'] == 'bar' ? true : false}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<!--This doesn't work--> 
<h:panelGrid rendered="#{param == null ? true : false}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

这似乎并不工作,要么:

<h:panelGrid rendered="#{empty facesContext.externalContext.requestParameterMap.foo ? true : false}"> 

回答

1

你只需要逆条件:#{param.foo != 'bar'}。那些返回布尔值的条件运算符是不必要的,方程本身已经返回一个布尔值。 #{param}永远不会是null。当它不包含任何参数时,它返回一个Map<String, String>,这只是(不是null!)。仅当参数名称包含可能被解释为嵌套属性的句点时,括号符号才有用,但请求参数名称不应包含句点。

所以,这应该这样做:

<h:panelGrid rendered="#{param.foo == 'bar'}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<h:panelGrid rendered="#{param.foo != 'bar'}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

由于不同的选择,如果你想使用条件运算符的正确方法,你也可以做

<ui:composition template="#{param.foo == 'bar' ? 'A' : 'B'}.xhtml">...</ui:composition> 
+0

既不似乎工作。在您的版本中,B.xhtml在访问页面时没有加载查询字符串时会加载A.xhtml。我似乎无法在我的模板中使用EL,它会导致堆栈溢出,崩溃我的编辑器(RAD),并且不会重新启动。我必须在另一个编辑器中编辑文件(删除我的模板中的EL),然后RAD将启动。这也在JSF 1.2中。 – 2012-03-23 16:27:48

+0

我必须承认,这是一种使用''的非常奇怪的方式,但由于我不知道你的功能需求和其他细节,而且我自己从未使用过这种构造,所以我只是忽略了这个奇怪的用法。但毕竟,你是不是故意使用''或者至少''这反过来排除了另一个构成? – BalusC 2012-03-23 16:30:25

+0

顺便说一句,它确实没有渲染作品 - 以及我昨天想要的。
这些输出true和false并正常工作,但是当我尝试渲染模板,但它们只是不起作用,我也尝试使用ui:装饰,但它给了我重复的ID错误 - 它似乎在两个模板中都有效。 – 2012-03-23 16:32:39