2011-10-24 3 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"/> 

Я вызываю метод, используя атрибут вместо другой версии выше, которая вызывает метод из управляемогоBean.

<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 комментирую первый компонент. Чем второй работает отлично. Должен быть какой-то конфликт, но я не понимаю, почему. Любые подсказки?

И это боб:

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

Просто быстро мысль: я вижу, что вы кладете п: вид как в понимании components.My является то, что требуется только один/допускается. У меня даже нет ни одного проекта.

 Смежные вопросы

  • Нет связанных вопросов^_^