3

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

我遵循了不同教程中的步骤(定义 .tld、taglib.xml、在 faces-config.xml 中注册的组件并实现 UIComponent(组件呈现自身)和 UIComponentELTag 类)并且我的组件被呈现,我有绑定到它的值,但是属性我为那个标签定义的被忽略了。我在 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> 
4

2 回答 2

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/(或谷歌自己)

于 2010-07-16T20:32:45.323 回答
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-INFdir 中。

      <!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>应该与组件的getFamily()方法 返回的值相同
    • 你可以WEB-INF/facelet-taglib_1_0.dtdhttp://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>
    
于 2012-04-06T13:53:19.230 回答