2012-08-23 10 views
7

Web sayfamıza dinamik olarak JSF <h:commandButtons> eklemeye çalışıyorum ve şu ana kadar bunları görüntüledim, ancak statik olarak yapabildiğim gibi, eylemi parametrelerle ayarlayamıyorum sayfa:
action="#{bean.function(parameter)}". (Bu elbette EL-2.2 kullanıyor)
Etrafa baktığımda bir MethodExpression oluşturmak zorunda olduğumu buluyorum, ama bu benim için belirsiz ve bu konuda fazla bilgi bulamadık. Birisi sisin içinden bir ışık parlatabilseydi ve bunun nasıl yapılabileceğini açıklarsa, büyük bir mutluluk duyacaktır.Dynamic JSF (2.0) commandButtons - bağımsız değişkenlerle eylemi ayarlama

DÜZENLEME: şimdi ben bu

public void displayNode(String childName){ 
//lots of messy code instantiating JSF components 

if(activeEmployee.getParent() != null){ 
     HtmlCommandButton parent = new HtmlCommandButton(); 
     HtmlOutputText parentLabel = new HtmlOutputText(); 

     parentLabel.setId("label" + count++); //I really hate having to use count 
     parentLabel.setValue("Parent: "); 

     parent.setId("Parent" + count++); 
     String parentName = activeEmployee.getParent().getName(); 
     parent.setValue(parentName); 
     MethodExpression expression = createMethodExpression("#{tree.displayNode('" + parentName + "')}", 
                   null, String.class); 
     parent.setActionExpression(expression); 

     newDiv.getChildren().add(parentLabel); 
     newDiv.getChildren().add(parent); 
    } 
+0

Komut düğmesini göstermek/gizlemek için oluşturulan özelliği kullanamaz mısınız? – RajV

+0

nah Dinamik olarak diğer ilgili düğümleri görüntülemek için düğmelerle birlikte ağaç düğümleri oluşturuyorum –

cevap

17

kullanın ExpressionFactory#createMethodExpression() var.

public static MethodExpression createMethodExpression(String expression, Class<?> returnType, Class<?>... parameterTypes) { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(
     facesContext.getELContext(), expression, returnType, parameterTypes); 
} 

Aşağıdaki eylem yöntemi örnekler: Burada

public abstract MethodExpression createMethodExpression(
             ELContext context, 
             java.lang.String expression, 
             java.lang.Class<?> expectedReturnType, 
             java.lang.Class<?>[] expectedParamTypes) 
bir kolaylık yöntemidir

public void submit1() 
public String submit2() 
public void submit3(String argument) 
public String submit4(String argument) 
public void submit5(String argument1, Long argument2) 
public String submit6(Long argument1, String argument2) 
şöyle

sonra oluşturulabilir:

createMethodExpression("#{bean.submit1}", null); 
createMethodExpression("#{bean.submit2}", String.class); 
createMethodExpression("#{bean.submit3('foo')}", null, String.class); 
createMethodExpression("#{bean.submit4('foo')}", String.class, String.class); 
createMethodExpression("#{bean.submit5('foo', 0)}", null, String.class, Long.class); 
createMethodExpression("#{bean.submit6(0, 'foo')}", String.class, Long.class, String.class); 

EL ifadesinin normal görünüm dosyasında kullanacağınız ile tamamen aynı olduğunu unutmayın.


Güncelleme burada Tomcat 7.0.27 tarihinde Mojarra 2.1.12 ile benim için iyi çalışan bir SSCCE bu. Beton sorununa

@ManagedBean 
@RequestScoped 
public class Bean { 

    private UIForm form; 

    public void add() { 
     String id = "button" + form.getChildCount(); 
     UICommand button = new HtmlCommandButton(); 
     button.setId(id); 
     button.setValue(id); 
     button.setActionExpression(createMethodExpression(String.format("#{bean.submit('%s')}", id), null, String.class)); 
     form.getChildren().add(button); 
    } 

    public void submit(String arg) { 
     System.out.println("submit: " + arg); 
    } 

    public UIForm getForm() { 
     return form; 
    } 

    public void setForm(UIForm form) { 
     this.form = form; 
    } 

    public static MethodExpression createMethodExpression(String expression, Class<?> returnType, Class<?>... parameterTypes) { 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     return facesContext.getApplication().getExpressionFactory().createMethodExpression(
      facesContext.getELContext(), expression, returnType, parameterTypes); 
    } 

} 

İlgisiz

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
> 
    <h:head> 
     <title>SO question 12098611</title> 
    </h:head> 
    <h:body> 
     <h:form binding="#{bean.form}"> 
      <h:commandButton value="add" action="#{bean.add}" /> 
     </h:form> 
    </h:body> 
</html> 

Yukarıdakilerin hepsi fakir bir uygulamadır. Ayrıca bkz. How does the 'binding' attribute work in JSF? When and how should it be used?

+1

Bir kez daha siz erkeksin. İnternette bu bilgiyi arıyordum çünkü yaptım ama JSF 1.2 kullanıyordum. –

+0

Sanırım bir 'MethodExpression'a ihtiyacım olduğunu düşündüm çünkü' button.setActionExpression (...) 'işlevini kullanmadan önce gördüm. Gereken açık argümanların yanında 'setActionExpression()' ve 'setAction()' kullanımı arasındaki fark nedir? –

+1

@Jake: 'setAction()' [kullanımdan kaldırılmış] (http://docs.oracle.com/javaee/6/api/javax/faces/component/UICommand.html#setAction (javax.faces.el.MethodBinding))) Kendi EL uygulamasını 'ValueBinding',' MethodBinding' ve daha sonra (daha sonra JSP EL ile birleştirilmiştir) kullanan “ertelenmiş EL” kullanarak JSF 1.x'in kalanını. ** ** JSF 2.x'te hiç kullanımdan kaldırılmış API kullanmayın. Çıkarılmak üzere. EL üzerinde biraz geçmiş için http://stackoverflow.com/questions/4812755/difference-between-jsp-el-jsf-el-and-unified-el adresine bakın. – BalusC

İlgili konular