2016-01-14 67 views
0

我想在PrimeFaces的JSF中構建一個複合組件。Primefaces複合組件不呈現

中的src /主/ web應用/資源/組件

我有一個名爲editableLabel.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

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

<h:head></h:head> 
<h:body> 
<composite:interface componentType="editableLabel"> 
    <composite:attribute name="value" required="true"/> 
    <composite:attribute name="editMode" required="false" default="#{false}" type="java.lang.Boolean"/> 
</composite:interface> 
<composite:implementation> 
    <h:panelGroup id="editableLabelComponent"> 

     <h:panelGroup rendered="#{cc.attrs.editMode}"> 
      <p:inputText value="#{cc.attrs.value}"/> 

      <p:commandButton value="Update" actionListener="#{cc.update}"/> 

      <p:commandButton value="Cancel" actionListener="#{cc.cancel}"/> 
     </h:panelGroup> 


     <p:outputLabel id="display" value="#{cc.attrs.value}" rendered="#{!cc.attrs.editMode}"> 
      <p:ajax event="click" listener="#{cc.toggleEditMode}" update="editableLabelComponent"/> 
     </p:outputLabel> 
    </h:panelGroup> 
</composite:implementation> 
</h:body> 
</html> 

被稱爲EditableLabel.java

import javax.el.ValueExpression; 
import javax.faces.component.FacesComponent; 
import javax.faces.component.UIComponentBase; 
import javax.faces.context.FacesContext; 
import java.io.Serializable; 

/** 
* Created by labraham on 1/14/16. 
*/ 
@FacesComponent(value = "editableLabel") 
public class EditableLabel extends UIComponentBase implements Serializable { 
    private static final long serialVersionUID = 108467781935083432L; 
    private String oldValue = ""; 


    /** 
    * Constructor 
    */ 
    public EditableLabel() { 
    super(); 
    } 

    @Override 
    public String getFamily() { 
    return "foo.bar.components"; 
    } 

    /** 
    * 
    */ 
    public void update() { 
    toggleEditMode(); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    this.oldValue = (String) getValueExpression("value").getValue(context.getELContext()); 
    } 

    /** 
    * 
    */ 
    public void cancel() { 
    toggleEditMode(); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ValueExpression valueExpression = getValueExpression("value"); 
    valueExpression.setValue(context.getELContext(), this.oldValue); 
    } 

    /** 
    * 
    */ 
    public void toggleEditMode() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Boolean editModeValue = (Boolean) getValueExpression("editMode").getValue(context.getELContext()); 
    ValueExpression editModeVe = getValueExpression("editMode"); 
    editModeVe.setValue(context.getELContext(), String.valueOf(!editModeValue)); 
    } 
} 

然而,當我試着堅持FacesComponent襯底部件它在另一個文件中是這樣的

foo.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:p="http://primefaces.org/ui" xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:comp="http://java.sun.com/jsf/composite/components" 
> 

...

<h3>Test</h3> 
<comp:editableLabel value="#{foobean.testValue}"/> 

它不會呈現。它試圖從組件中刪除呈現的屬性(以及editmode composite:attribute),並且已經驗證它正在尋找editableLabel.xhtml的正確位置。 foob​​ean.testValue只是一個默認值爲「test value」的字符串,以及相應的getter和setter。

PrimeFaces爲什麼拒絕渲染此複合組件?

編輯:我也嘗試用他們的JSF等價物替換複合組件中的primefaces組件,並且不起作用。我嘗試刪除ajax調用,看看是否有這個問題。事實並非如此。

編輯2:它的問題是我的FacesComponent,但我不知道是什麼。刪除組件類型屬性讓它至少呈現。

回答