【问题标题】:JSF 1.2 facelets custom componentJSF 1.2 facelets 自定义组件
【发布时间】:2011-03-17 00:03:22
【问题描述】:

我正在尝试在 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> 

【问题讨论】:

  • 请发布您的 xxx.taglib.xml 文件。
  • 我的 taglib.xml 文件是:ttp://java.sun.com/dtd/facelet-taglib_1_0.dtd" rel="nofollow" target="_blank">java.sun.com/dtd/facelet-taglib_1_0.dtd"> dynamissoft.com/entities/ui</namespace> legalEntityViewrs.bozic.wastemanager.LegalEntityView

标签: jsf facelets custom-component


【解决方案1】:

您是否尝试过使用 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/(或谷歌自己)

【讨论】:

  • 感谢您的回复。是的,我已经尝试过了,但它需要我做一些我试图避免的额外工作(在 WAS CE 上注册资源等)。无论如何,我做到了,所以我转而使用 .xhtml 文件来创建组件,现在它可以工作了。不过,我不知道之前发生了什么:-(。
【解决方案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 后缀为必填项
    • &lt;component-type&gt; 应该是一样的 组件的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>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2012-08-16
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多