【问题标题】:Primefaces composite component not rendering [duplicate]Primefaces复合组件未呈现[重复]
【发布时间】:2016-04-20 10:00:02
【问题描述】:

我正在尝试使用 PrimeFaces 在 JSF 中构建一个复合组件。

在 src/main/webapp/resources/components 我有一个名为 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 的 FacesComponent 提供支持

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

但是当我尝试将它粘贴到另一个文件中时

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复合:属性)中删除呈现的属性,并且我已经验证它正在正确的位置寻找editableLabel.xhtml。 foob​​ean.testValue 只是一个字符串,其默认值为“测试值”以及相应的 getter 和 setter。

为什么 PrimeFaces 会拒绝渲染这个复合组件?

编辑:我还尝试用 JSF 等效项替换复合组件中的 primefaces 组件,但没有成功。我尝试删除 ajax 调用,看看是否有问题。不是。

编辑 2:这是我的 FacesComponent 的问题,但我不知道是什么。移除组件类型属性使其至少能够呈现。

【问题讨论】:

    标签: jsf jsf-2 primefaces composite-component


    【解决方案1】:

    感谢 BalusC 对 Extended @FacesComponent as composite interface componentType renders nothing 的回答,我想通了

    我需要在 EditableLabel.java 中实现 NamingContainer 和 getFamily()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2012-07-26
      相关资源
      最近更新 更多