扩展Richfaces组件

时间:2011-02-16 12:04:13

标签: jsf richfaces

我希望覆盖一些Richfaces组件的功能(主要是extendedDataTable)。

有人可以通过代码示例提供他们扩展的任何组件的完整示例吗?

我知道下面的主题描述了如何做,但代码示例将非常有用。

Extend Richfaces components - for example customize Datatable component for specific implementation


好的.....我一直在浏览互联网,似乎并没有一步一步的简单例子。在这里也是如此:(

到目前为止,我已设法将以下内容整理在一起:

我已经创建了一个自定义的ExtendedDataTableRenderer渲染器,如下所示:

package com.test;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.richfaces.renderkit.html.ExtendedDataTableRenderer;

public class HtmlExtendedDataTableRendered extends ExtendedDataTableRenderer
{
     @Override
     public void encodeBegin(FacesContext context, UIComponent component) throws IOException
     {
               System.out.println("------- in HtmlExtendedDataTableRendered init() -----");

                    // TODO Auto-generated method stub
                    super.encodeBegin(context, component);
     }
}

并将以下内容添加到我的faces-config.xml中,如下所示:

<render-kit>
     <renderer>
          <component-family>org.richfaces.ExtendedDataTable</component-family>
          <renderer-type>org.richfaces.ExtendedDataTableRenderer</renderer-type>
          <renderer-class>com.test.HtmlExtendedDataTableRendered</renderer-class>
     </renderer>
</render-kit>

当我点击具有entendedDataTable组件的页面时,这似乎正在工作(它将测试代码固定到控制台)。

现在我还扩展了HtmlExtendedDataTable类,如下所示:

package com.test;

import java.io.IOException;
import javax.faces.context.FacesContext;
import org.richfaces.component.html.HtmlExtendedDataTable;

public class customExtendedDataTable extends HtmlExtendedDataTable {
    /*
     * The renderer type for this component.
    */
    public static final String RENDERER_TYPE = "com.test.HtmlExtendedDataTableRendered";

    public customExtendedDataTable() {

         System.out.println("------- in customExtendedDataTable init() -----");

         setRendererType(RENDERER_TYPE);
    }

   @Override
    public String getFamily() {
        return customExtendedDataTable.RENDERER_TYPE;
    }


   @Override
   public boolean groupIsExpanded(int index)
   {
        System.out.println("------- in groupIsExpanded -----");

        // TODO Auto-generated method stub
        return super.groupIsExpanded(1);
   }

   @Override
   public void encodeBegin(FacesContext context) throws IOException
   {
        System.out.println("------- in encodeBegin -----");

        // TODO Auto-generated method stub
        super.encodeBegin(context);
   }
}

当我输入具有extendedDataTable组件的页面时,没有任何内容从此类打印到控制台。

有人可以为我提供一些帮助吗?为什么这不起作用?

由于

1 个答案:

答案 0 :(得分:2)

你只是在faces-config.xml中定义了渲染器,但你已经无法确定该组件。它也必须进入faces-config.xml

<component>
    <component-type>customExtendedDataTable</component-type>
    <component-class>com.test.customExtendedDataTable</component-class>
</component>

不要忘记在自定义组件中添加一个getter getComponentType(),它返回的值与<component-type>中定义的值相同。

此外,您还需要创建一个标记文件,以便在视图中使用它。您不能替换现有rich:extendedDataTable的代码。例如,您必须使用my:extendedDataTable。创建一个taglib.xml非常笨拙,我不能从头顶写下来(还有?;)),所以这里有一些链接可以帮助你朝着正确的方向前进:


与具体问题无关,类名应really以大写字母开头。