2012-01-27 46 views
4

我们在这里有一个(在我们的意见中)非常简单的场景。但是我们在某些复合组件和f:属性标记上卡住了。我会尽量让代码尽可能简单。在复合组件中使用f:属性

复合组件:

<cc:interface name="button"> 
    ... 
    <cc:attribute 
     name="actionListener" 
     required="true" 
     method-signature="void f(javax.faces.event.ActionEvent)" 
     target="button" 
     shortDescription="The action listener for this button." /> 
    ... 
</cc:interface> 

<cc:implementation> 
    <ice:commandButton 
     ... 
     actionListener="#{cc.attrs.actionListener}" 
     ...> 

     <cc:insertChildren /> 
    </ice:commandButton> 
</cc:implementation> 

...现在我们使用的组件是这样的:

<ctrl:button 
    ... 
    actionListener="#{bean.method}" 
    ...> 
    <f:attribute name="objectId" value="#{someObject.id}" /> 
</ctrl:button> 

现在我们需要访问的动作监听器方法里面的 “OBJECTID” 属性。我们已经尝试过这样的事情:

public void method(ActionEvent event) 
{ 
    ... 
    event.getComponent().getAttributes().get("objectId"); 
    ... 
} 

但是属性映射不包含objectId。这种方法有什么问题吗?建议如何解决这个问题?

如果有人能帮助我们,那会很好。

谢谢! SlimShady

回答

5

这个<f:attribute>当JSF 1.0/1.1无法将对象作为附加参数传递给命令按钮/链接时,hack是一个剩余的来源。由于JSF 1.2,你应该使用<f:setPropertyActionListener>这个。

<ctrl:button action="#{bean.method}"> 
    <f:setPropertyActionListener target="#{bean.objectId}" value="#{someObject.id}" /> 
</ctrl:button> 

由于EL 2.2(也就是Servlet 3.0标准的一部分,但对Servlet 2.5的可执行与JBoss EL帮助),你可以代替,甚至通过整个对象,就像方法参数:

<ctrl:button action="#{bean.method(someObject.id)}" /> 
+0

嘿@BalusC :)我们现在正在迁移到JSF 2并面临类似的问题。我有两个问题:'f:setPropertyActionListener'确实需要target,spec TLD没有列出标签的'name'属性,所以我想你的意思是'target'? – truemmer 2012-01-27 17:08:47

+0

@truemmer:复制粘贴错误,是的:)我修复了它。 – BalusC 2012-01-27 17:17:26

+0

编辑第二个问题的速度太慢了.-)下一个问题是关于你的第二个解决方案:你需要在复合组件接口中有一个名为“action”的属性来提供一个'target',我是不是?为什么JSF 2规范要求操作方法没有参数?感谢您在这里回答所有这些问题:) – truemmer 2012-01-27 17:24:36

3

我设法读取在以下设置中传递给cc的属性。

<test:inner> 
    <f:attribute name="fAttribute" value="myAttributeValue" /> 
</test:inner> 

<cc:implementation> 
    <h:commandButton value="button" actionListener="#{testBean.actionListener}" > 
     <f:attribute name="innerAttribute" value="innerAttributeValue" /> 
      <cc:insertChildren /> <!-- not necessary, I hoped it would pass the outer attribute ---> 
    </h:commandButton> 
</cc:implementation> 

public void actionListener(ActionEvent event) { 
    event.getComponent().getNamingContainer().getAttributes().get("fAttribute") 
    // > myAttributeValue 
    event.getComponent().getAttributes().get("innerAttribute") 
    // > innerAttributeValue 
} 

诀窍是按钮的命名容器中搜索。因此,cc总是一个命名容器,你可以确定你最终进入了内部组件。

我不确定这是否是它的参与方式,但据我了解,命名遏制者为其子女收集此类属性。

问:有没有人知道如果不传递属性到按钮被认为是Mojarra/JSF内的错误?

+0

我我不确定这是否应该被认为是黑客行为,但我希望你的解决方案在迁移到JSF 2期间作为临时步骤。恕我直言,你应该坚持长期使用BalusC解决方案的第二种方法。 – truemmer 2012-01-27 17:49:12

+0

我想我在@BalusC解决方案中看到了2个con:您不能使用带有actionListener参数的action =#{myBean.myMethod(myParameter)},这有时很有用,而且您不能使用'f:setPropertyActionListener像'ui:repeat'一样循环内部的解决方案,因为您必须将该值与唯一的bean属性绑定。 – 2012-02-01 17:39:34