就个人而言,我将使用选项2。虽然我知道使用EL来解决问题并使用功能或ui:params在xhtml文档中获得一些重用是很有可能的,但它实际上似乎缺乏Java bean实现的可移植性,可维护性和可测试性。
如果开发人员精通EL和Java,并且同时拥有xhtml和Java Bean,那么使用EL进行大小大于1的任何条件评估似乎没有多大意义。
在Java端实现似乎似乎有太多好处:
- 能够依靠IDE +编译器
- 使用常量或枚举(用于“ dog”和“ bark”),它们也可能在代码中的其他地方使用以进行比较...如果String值发生更改,必须手动替换每个值在字符串中的出现是很有趣的代码库
- 不必使用适当的数据导航到有问题的页面,我可以使用单元测试来练习逻辑
我听到的(在Stack之外)支持选项1的主要论据之一是:
“如果在视图中保留此逻辑,则更容易查看组件何时渲染。”
我发现对于处于生命初期的应用程序来说可能就是这种情况,因为它的重量更轻且更简单。但是,在较大规模上应用此实践,并且随着较小应用的成熟,它可能导致大鼠出现条件性巢,并成为维持噩梦。以下是一些与我在野外看到的类似的示例:
<h:outputText value="grrr"
render="#{animal.type == 'dog' or animal.type == 'cat' or animal.type == 'horse'
or animal.type == 'pony' or animal.type == 'mule' or animal.type == 'lion'
or animal.type == 'tiger' or (animal.type == 'bird'
and animal.subType == 'macaw') or .... continue this for another line or two}"
/>
或我最喜欢的,使用多个渲染条件互斥的组件来表示可能显示的不同值:
<h:outputText value="grr" render="#{theMonstrosityFromPreviousExample} />
<h:outputText value="cry"
render="#{animal.type == 'human' and animal.subType == 'baby'}" />
<h:outputText value="yo"
render="#{animal.type == 'human' and animal.subType == 'teenager'}" />
<h:outputText value="hello"
render="#{animal.type == 'human' and animal.subType == 'adult'}"/>
一次最多可以显示4个文本吗?乍一看您看不出来,需要对每个条件进行检查。附带说明一下,我意识到这个示例的设计也不佳,因为可以将它们放在ac:choose ...中,但是我之前已经看到过。
归根结底,这仍然是理论上的“查看”逻辑,因为它确定了实际显示的内容,因此在xhtml中应该有一个概念上的论点。我发现的问题是,从长远来看,在视图模板中包含这样的逻辑会使布局更难以理解,而且我还没有看到解决问题的方法比使用Java具有任何真正的好处。 bean实现。
barking animals
我会调用该方法,因为它已经存在。如果您在多个站点上使用其视图逻辑,则可以从中构建el函数。