2011-01-05 67 views
4

我创建了一个Facelet组件来扩展h:commandLink(以添加一些功能和圆角)。扩展JSF commandLink组件

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core"> 
    <span class="btn-left btn-corners">&#160;</span> 
    <span type="submit" class="submit"> 
     <h:commandLink id="#{id}" value="#{label}" action="#{action}" /> 
    </span> 
    <span class="btn-right btn-corners">&#160;</span> </ui:composition> 

我的新组件可以使用

<my:commandLink id="continue" label="continue" action="#{applyBacking.submit}"/> 

访问和Java代码

public String submit(){ 
    ... 
} 

但是它给了我一个错误 “ApplyBacking没有物业提交”。 我明白这个错误的原因,因为在呈现my:commandLink时,它会尝试评估#{applyBacking.submit}属性。相反,我希望关于调用的方法(applyBacking.submit)的信息被传递给模板并在渲染h:commandLink时进行评估。

有什么建议吗?

回答

5

改为创建composite componenttutorial here),它使您可以将bean操作定义为attribtues。

这里有一个开球例如:

/resources/components/commandLink.xhtml

<ui:component 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:cc="http://java.sun.com/jsf/composite"> 
    <cc:interface> 
     <cc:attribute name="id" required="true" /> 
     <cc:attribute name="label" required="true" /> 
     <cc:attribute name="action" method-signature="java.lang.String action()" required="true" /> 
    </cc:interface> 
    <cc:implementation> 
     <span class="btn-left btn-corners">&#160;</span> 
     <span type="submit" class="submit"> 
      <h:commandLink id="#{cc.attrs.id}" value="#{cc.attrs.label}" action="#{cc.attrs.action}" /> 
     </span> 
     <span class="btn-right btn-corners">&#160;</span> 
    </cc:implementation> 
</ui:component> 

/somepage.xhtml

<!DOCTYPE html> 
<html lang="en" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:my="http://java.sun.com/jsf/composite/components"> 
    <h:head> 
     <title>SO question 4608030</title> 
    </h:head> 
    <h:body> 
     <h:form> 
      <my:commandLink id="continue" label="continue" action="#{applyBacking.submit}"/> 
     </h:form> 
    </h:body> 
</html> 

顺便说一句,我个人比较喜欢使用JS/jQuery的的圆角部分,例如jQuery corner plugin。只要给你的命令链接一个特定的styleClass,让JS做魔术。