在JSF之间传递和使用参数包括

问题描述 投票:-1回答:1

我一直在尝试理解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>

认识到本书中的例子可能是一个用来说明一个观点的人为例子,是否存在其他语法合适的用例?

jsf-2 el
1个回答
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个参数,templatesBeanNamecontentPropertyName

<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和动态属性名称。

所以我的结论是,通过这个例子,他们试图说明的是你能够传递动态bean,并且在那个bean上使用静态或动态方法和属性(静态属性和动态方法不在示例中) )

© www.soinside.com 2019 - 2024. All rights reserved.