2011-10-24 67 views
1

我正在學習在JSF 2.0中使用複合組件。無法調用JSF 2.0複合組件內的方法

首先我創建了這個組件如下。 它聲明瞭一個managedBean,並直接調用managedBean的一個方法。

<h:commandButton 
           action = "#{cc.attrs.managedBean.toogleEditing}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 

這是該組件的全碼:

<ui:component   
       xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.prime.com.tr/ui" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute 
       name ="managedBean"   
       type = "java.lang.Object" 
      required ="true">     
     </composite:attribute> 
    </composite:interface> 

    <composite:implementation> 
     <f:view contentType="text/html"> 
      <h:form id="componentes"> 
       <h:panelGrid columns="3"> 
        <h:panelGroup>    
         <h:outputText 
           escape = "false" 
           value = "#{cc.attrs.managedBean['value']}"  
          rendered = "#{!cc.attrs.managedBean['editing']}"/> 
         <p:editor 
          widgetVar = "editor" 
           value = "#{cc.attrs.managedBean.value}" 
          rendered = "#{cc.attrs.managedBean.editing}"/> 
        </h:panelGroup> 

        <h:commandButton 
           action = "#{cc.attrs.managedBean.toogleEditing}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 

        <p:commandButton 
           action = "#{cc.attrs.managedBean.toogleEditing}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 
       </h:panelGrid> 
      </h:form>      
     </f:view> 
    </composite:implementation> 
</ui:component> 

在該第二試驗我創建了一個屬性,該屬性是一個方法。

<composite:attribute 
         name = "action" 
      method-signature = "void action()" 
        required = "true"/> 

我使用屬性而不是上面調用managedBean方法的其他版本調用方法。

<h:commandButton 
           action = "#{cc.attrs.action}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 


This is the code of the second component: 

<ui:component   
       xmlns = "http://www.w3.org/1999/xhtml" 
      xmlns:f = "http://java.sun.com/jsf/core" 
      xmlns:h = "http://java.sun.com/jsf/html" 
      xmlns:ui = "http://java.sun.com/jsf/facelets" 
      xmlns:p = "http://primefaces.prime.com.tr/ui" 
    xmlns:composite = "http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute 
       name = "managedBean"    
       type = "java.lang.Object" 
      required = "true">     
     </composite:attribute> 
     <composite:attribute 
         name = "action" 
      method-signature = "void action()" 
        required = "true"/> 
    </composite:interface> 

    <composite:implementation> 
     <f:view contentType="text/html"> 
      <h:form id="componentes"> 
       <h:panelGrid columns="3"> 
        <h:panelGroup>    
         <h:outputText 
           escape = "false" 
           value = "#{cc.attrs.managedBean['value']}"  
          rendered = "#{!cc.attrs.managedBean['editing']}"/> 
         <p:editor 
          widgetVar = "editor" 
           value = "#{cc.attrs.managedBean.value}" 
          rendered = "#{cc.attrs.managedBean.editing}"/> 
        </h:panelGroup> 

        <h:commandButton 
           action = "#{cc.attrs.action}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 

        <p:commandButton 
           action = "#{cc.attrs.action}" 
           value = "#{cc.attrs.managedBean.editing?'Back':'Edit'}" 
           update = "componentes"/> 
       </h:panelGrid> 
      </h:form>      
     </f:view> 
    </composite:implementation> 
</ui:component> 

這是XHTML頁面,我叫兩個組件:

<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html 
      xml:lang="pt" 
       lang="pt" 
       xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:p="http://primefaces.prime.com.tr/ui" 
    xmlns:components="http://java.sun.com/jsf/composite/components"> 

    <h:head id="head"> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <title>Editable HTML Text Sample</title> 
    </h:head> 

    <h:body id="body"> 
     <f:view contentType="text/html"> 
      <h:form>  
       <p:panel header="Editable HTML Text Sample"> 

        <components:EditableHTMLText 
         managedBean = "#{editableHTMLText}"/> 

       </p:panel>  

       <p:panel header="Editable HTML Text Sample Direct Action"> 

        <components:EditableHTMLTextPrimeFaces 
         managedBean = "#{editableHTMLText}" 
          action = "#{editableHTMLText.toogleEditing}"/> 

       </p:panel>                 
      </h:form>      
     </f:view> 
    </h:body> 
</html> 

的問題是,在此的index.xhtml如果我叫兩個組件的第二組件(具有在聲明的方法屬性標籤)不起作用。 如果在index.xhtml中,我評論第一個組件。比第二個工作正常。 必須是某種衝突,但我不明白爲什麼。 任何提示?

這是bean:

import java.io.Serializable; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 


@ManagedBean 
@SessionScoped 
public class EditableHTMLText implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8439126615761864409L; 

    private String    value    = "Test<br>of<br>HTML<br>text<br><b>ITEM</b><br>"; 
    private boolean    editing    = false; 


    public void toogleEditing(){ 

     this.setEditing(!this.isEditing()); 
     System.out.println("Editing State: " + this.editing); 
    } 


    public String getValue(){ 

     return value; 
    } 


    public void setValue(String value){ 

     this.value = value; 
    } 


    public boolean isEditing(){ 

     return editing; 
    } 


    public void setEditing(boolean editing){ 

     this.editing = editing; 
    } 

} 

回答

0

只是快速的想法:我看到你把F:鑑於雙方components.My的理解是,只需要一個/允許的。我甚至在整個項目中都沒有。