2011-01-05 13 views
4

Ich habe eine Facelet-Komponente erstellt, um h: commandLink zu erweitern (um einige Funktionen und abgerundete Ecken hinzuzufügen).Erweitern der JSF commandLink-Komponente

<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> 

Meine neue Komponente kann

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

und der Java-Code ist

mit zugegriffen werden
public String submit(){ 
    ... 
} 

aber es gibt mir eine Fehlermeldung "ApplyBacking haben nicht die Eigenschaft einreichen". Ich verstehe den Grund für diesen Fehler, weil beim Rendern von my: commandLink versucht wird, # {applyBacking.submit} auf eine Eigenschaft auszuwerten. Stattdessen möchte ich, dass die Informationen über die aufgerufene Methode (applyBacking.submit) an die Vorlage übergeben und beim Rendern von h: commandLink ausgewertet werden.

Irgendwelche Vorschläge?

Antwort

5

Erstellen Sie stattdessen eine composite component (tutorial here), ermöglicht es Ihnen, Bean-Aktionen als Attribute zu definieren.

Hier ist ein Kick-off Beispiel:

/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> 

By the way, würde ich persönlich für den abgerundeten Ecken Teil mit JS/jQuery bevorzugen, zum Beispiel des jQuery corner plugin. Geben Sie Ihrem Commandlink eine spezifische styleClass und lassen Sie JS die Magie tun.