Не удалось вызвать метод внутри составного компонента JSF 2.0 - PullRequest
1 голос
/ 24 октября 2011

Я учусь использовать составные компоненты в 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>

Это страница HTML, которую я вызываюоба компонента:

<!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;
    }

}

1 Ответ

0 голосов
/ 25 октября 2011

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

...