JSF 1.2 facelets自定义组件

时间:2010-07-16 14:24:43

标签: jsf facelets custom-component

我正在尝试在JSF 1.2中开发自定义控件(使用facelets)。

我按照不同教程中的步骤(定义.tld,taglib.xml,faces-config.xml中的注册组件和实现UIComponent(组件呈现本身)和UIComponentELTag类)并且我的组件被渲染,我有值绑定它,但我忽略了为该标签定义的属性。我在Tag类中记录了各种方法,并注意到没有调用任何方法。

我错过了什么?是否有原因永远不会调用Tag处理程序类?

提前致谢。

我的taglib.xml文件是:

<?xml version="1.0"?> 
<!DOCTYPE facelet-taglib PUBLIC 
  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
  "java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib> 
  <namespace>dynamissoft.com/entities/ui</namespace>
  <tag>
    <tag-name>legalEntityView</tag-name>
    <component>
      <component-type>rs.bozic.wastemanager.LegalEntityView</component-type>
    </component>
  </tag>
</facelet-taglib> 

2 个答案:

答案 0 :(得分:3)

您是否尝试过使用facelets创建自定义组件(仅限xml)。这是最简单的方法,通常使用facelets,不再需要不同的java类。

非常粗略概述:

  • 创建facelet xml文件(如myComponent.xhtml)
  • 在taglib中注册facelet(反过来应该在web.xml中定义)
  • (可选)在Java中创建一些支持bean

您可以使用常规标记参数将值/ bean传递给组件:

使用该组件

组件内部

Param1刚刚打印出来:#{myParam2} Param2用作表的值 ...

Google上有很好的教程,就像来自IBM的教程一样。

如果可能,请考虑使用JSF 2.0。 Facelets已集成,您可以更灵活地创建自定义组件。我刚刚创建了一篇博文:http://blog.whitehorses.nl/2010/02/08/jsf-2-0/(或Google自己)

答案 1 :(得分:2)

只是为了扩展Gerbrand的答案,这里是一个简单的Facelets兼容组件的过程。它会呈现一个span标记,用于包装通过组件text属性指定的文本。

  1. 首先创建组件类(在我们的例子中,它只是一种风格 UIOutput):

      package sample.mytag;
    
      import java.io.IOException;
      import javax.faces.component.UIOutput;
      import javax.faces.context.FacesContext;
      import javax.faces.context.ResponseWriter;
    
      public class SpanComponent extends UIOutput{            
        private String text;
        @Override
        public Object saveState(FacesContext context) {
          Object values[] = new Object[2];
          values[0] = super.saveState(context);
          values[1] = target;
          return ((Object) (values));
        }
    
        @Override
        public void restoreState(FacesContext context, Object state) {
          Object values[] = (Object[])state;
          super.restoreState(context, values[0]);
          target = (String)values[1];
        }
    
        public String getText() {
          return text;
        }
    
        public void setText(String text) {
          this.text = text;
        }
    
        @Override
        public void encodeBegin(FacesContext context) throws IOException {
          ResponseWriter writer=context.getResponseWriter();
          writer.startElement("span", component);
          writer.writeAttribute("id", id, null);
          writer.writeText(text, null);
          writer.endElement("span");
          writer.flush();                
        }
    
        @Override
        public String getFamily(){
          return "myTag.component";
        }
    
        @Override
        public void encodeEnd(FacesContext context) throws IOException {
          return;
        }
    
        @Override
        public void decode(FacesContext context) {
          return;
        } 
      }
    
  2. 接下来,我们需要一个taglib XML文件,让我们将其称为mytag.taglib.xml并将其放在WEB-INF目录中。

      <!DOCTYPE facelet-taglib PUBLIC
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
        "WEB-INF/facelet-taglib_1_0.dtd"> 
      <facelet-taglib> 
      <namespace>http://sample.tag/mytags</namespace> 
      <tag>
        <tag-name>myspan</tag-name>
          <component>
            <component-type>myTag.component</component-type>    
          </component>
      </tag>
      </facelet-taglib> 
    

    请注意:

    • .taglib.xml后缀是强制性的
    • <component-type>应该有相同的 组件&#39; getFamily()方法
    • 返回的值
    • 你可以 用{替换WEB-INF/facelet-taglib_1_0.dtd http://java.sun.com/dtd/facelet-taglib_1_0.dtd
  3. 现在是修改web.xml和faces-config.xml的时候了。

    前者应该用

    修改
    <context-param> 
      <param-name>facelets.LIBRARIES</param-name> 
      <param-value>/WEB-INF/mytag.taglib.xml</param-value> 
    </context-param>     
    

    faces-config.xml应该

    <component> 
     <component-type>myTag.component</component-type> 
     <component-class>sample.mytag.LabelComponent</component-class> 
    </component>  
    
  4. 我们很高兴去!

        <ui:composition
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"  
          xmlns:sample="http://sample.tag/mytag">  
    
          <sample:myspan text="I'm inside a span!"/>
    
        </ui:composition>