2

我正在尝试根据查询字符串的存在或不存在查询字符串来动态呈现一些组合/模板。例如:

本地主机:9080/myWonderfulApp/test.xhtml?foo=bar

这行得通,A.xhtml 被拉进来。

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

这不起作用,B.xhtml 不会被拉入。

我遇到了缺少查询字符串部分的问题。当我传递 ?foo=bar 时,我可以渲染 A.xhtml,但是当我没有查询字符串时,我似乎无法渲染 B.xhtml。我尝试了一些变化,我最初认为 #{param['foo'] != 'bar' 会起作用,但我认为这不起作用,因为我根本没有 foo 查询参数。我试过检查 param == 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}">
4

1 回答 1

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>
于 2012-03-23T01:45:32.673 回答