我一直在尝试理解JSF模板和include
属性以及在组件之间传递参数。在Anghel Leonard的掌握JavaServer Faces 2.2 中,我遇到了以下传递参数的例子,我并不完全理解。
鉴于这个bean:
@Named
@ViewScoped
public class TemplatesBean implements Serializable {
private String msgTopDefault="";
private String msgBottomDefault="";
private String msgCenterDefault="No center content ... press the below button!";
public void centerAction(){
this.msgCenterDefault="This is default content";
}
// Getters and setters
}
使用以下参数传递给contentDefault.xhtml
<ui:insert name="content">
<ui:include src="/template/default/contentDefault.xhtml">
<ui:param name="templatesBeanName" value="#{templatesBean}"/>
<ui:param name="contentPropertyName" value="msgCenterDefault"/>
</ui:include>
</ui:insert>
然后,在contentDefault.xhtml
内,参数使用如下:
<ui:composition>
<h:outputText value="#{templatesBeanName[contentPropertyName]}"/>
<h:form>
<h:commandButton value="Center Button" action="#{templatesBeanName['centerAction']()}"/>
</h:form>
</ui:composition>
之前我从未使用过square-bracket语法,但如果传入对templatesBean
的引用,为什么不使用它来访问属性或调用action方法?例如,以下代码也适用于我,看起来更简单:
<h:form>
<h:commandButton value="Center Button" action="#{templatesBeanName.centerAction()}"/>
</h:form>
认识到本书中的示例可能是一个人为举例说明一个观点,是否存在其他语法合适的用例?
答案 0 :(得分:1)
我不知道或拥有这本书,所以我无法调查他们想要说明的内容,但我可以通过查看您发布的完整示例来推断,而不仅仅是部分关于centerAction
。
如果你看一下
<ui:insert name="content">
<ui:include src="/template/default/contentDefault.xhtml">
<ui:param name="templatesBeanName" value="#{templatesBean}"/>
<ui:param name="contentPropertyName" value="msgCenterDefault"/>
</ui:include>
</ui:insert>
你会看到传递 2 参数, templatesBeanName
和 contentPropertyName
< / em>的
在
<ui:composition>
<h:outputText value="#{templatesBeanName[contentPropertyName]}"/>
<h:form>
<h:commandButton value="Center Button" action="#{templatesBeanName['centerAction']()}"/>
</h:form>
</ui:composition>
你刚刚从中指向了action="#{templatesBeanName['centerAction']()}"
的行,一个动态bean,在suqare括号中通过添加()
作为后缀而形成一个方法,你会看到另一行上面的代码
<h:outputText value="#{templatesBeanName[contentPropertyName]}"/>
这里有效的做法是使动态bean AND 使用动态属性名称。
所以我的结论是,通过这个例子,他们试图说明的是你能够传递动态bean,并且在那个bean上使用静态或动态方法和属性(静态属性和动态方法不是在示例中)