Java 如何仅在未渲染其他组件时渲染组件?

Java 如何仅在未渲染其他组件时渲染组件?,java,jsp,jsf,richfaces,Java,Jsp,Jsf,Richfaces,我有一个用户可以通过Android、iPhone、BlackBerry或未知浏览器访问的页面。我有4个rich:panels,每个平台一个,后者是通用的 守则: <rich:panel id="dlAndroid" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> ... </rich:panel> <rich:panel id="dlIphon

我有一个用户可以通过Android、iPhone、BlackBerry或未知浏览器访问的页面。我有4个
rich:panel
s,每个平台一个,后者是通用的

守则:

<rich:panel id="dlAndroid" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}">
    ...
</rich:panel>

<rich:panel id="dlIphone" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}">
    ...
</rich:panel>

<rich:panel id="dlBlackberry" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'BlackBerry')}">
    ...
</rich:panel>

<rich:panel id="dlGeneric" rendered="#{ ---> WHAT TO WRITE HERE? <--- }">

...
...
...

如何仅在其他面板均未呈现的情况下呈现最后一个
rich:panel

您可以在托管bean方法上编写此验证,因此它将验证用户代理是否符合第四个选项。 例如:

在您的页面上,您只需使用以下方法:

<rich:panel id="dlGeneric" rendered="#{myBean.userAgentUnknownBrowser()}">

您可以使用

<c:choose>
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}">
<rich:panel id="dlAndroid">
...
</rich:panel>
</c:when>
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}">
<rich:panel id="dlIphone">
...
</rich:panel>
</c:when>
<c:otherwise>
<rich:panel id="dlGeneric">
    ...
</rich:panel>
</c:otherwise>
<c:choose>

...
...
...
我认为您正在使用一种逻辑来确定浏览器类型,该类型在同一页面上的帖子之间不会改变,因此在这里使用JSTL标记似乎是安全的。 JSTL标记在页面的创建视图期间只执行一次

但是,如果您正在测试某个模型变量的条件,那么最好将每个面板包装在ui:fragment-like中

<ui:fragment rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}">
    <rich:panel id="dlAndroid">
    ...
    </rich:panel>
<ui:fragment>

...

说到这里,您在标题中提出的问题可以具体回答为:


...
...
...
...
但是,在这种特殊情况下,最好将那些冗长的表达式别名为


...
...
...
...

请注意,通过隐式
#{header}
映射获取请求头的方法较短。

您不应该使用getter来处理业务逻辑。哦,对不起。该方法也可以有其他名称。您是否尝试过最丑陋的解决方案
rendered=“#{not(fn:containsIgnoreCase(request.getHeader('User-Agent'),'Android')或fn:containsIgnoreCase(request.getHeader('User-Agent'),'iPhone')或fn:containsIgnoreCase(request.getHeader('User-Agent'),'BlackBerry'))}
?@luigimendoza我尝试了类似的方法,但不是这样,因为我试图不重复这行代码。但是,尽管你的解决方案很难看,但它仍然有效。。通过再次使用这样的语句,我们混淆了视图和业务逻辑,这违反了MVC的概念。你如何证明这一点?@奎师那:它(重新)在商业逻辑中的任何地方使用过吗?那就放在那儿吧。是否仅在视图中使用?那么把它放在视野中也没什么坏处。
<ui:fragment rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}">
    <rich:panel id="dlAndroid">
    ...
    </rich:panel>
<ui:fragment>