Пользовательский компонент JSF 1.2 Facelets - PullRequest
3 голосов
/ 16 июля 2010

Я пытаюсь разработать пользовательский элемент управления в JSF 1.2 (используя Facelets).

Я следовал инструкциям из разных руководств (определение .tld, taglib.xml, зарегистрированный компонент в Face-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> 

Ответы [ 2 ]

3 голосов
/ 17 июля 2010

Вы пытались создать пользовательский компонент, используя Facelets (только XML). Это самый простой способ, используя Facelets, обычно разные Java-классы больше не нужны.

Очень грубый обзор:

  • Создать xml-файл facelet (например, myComponent.xhtml)
  • Зарегистрируйтесь в лицевой стороне внутри taglib (который, в свою очередь, должен быть определен в web.xml)
  • По желанию, создайте некоторые компоненты поддержки в Java

Вы можете передавать значения / компоненты вашему компоненту, используя обычные параметры тега:

Использование компонента

Внутри компонента

Param1 только что напечатан: # {myParam2} Param2 используется в качестве значения для таблицы ...

В Google есть отличные учебные пособия, такие как IBM .

Если возможно, рассмотрите возможность использования JSF 2.0. Facelets интегрированы, и у вас есть больше возможностей для создания пользовательских компонентов. Недавно я создал блог на эту тему: http://blog.whitehorses.nl/2010/02/08/jsf-2-0/ (или Google самостоятельно)

2 голосов
/ 06 апреля 2012

Просто чтобы немного расширить ответ 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. Далее нам понадобится XML-файл taglib, назовем его mytag.taglib.xml и поместим его в WEB-INF dir.

      <!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.dtd с http://java.sun.com/dtd/facelet-taglib_1_0.dtd
  3. Пришло время изменить web.xml и face-config.xml.

    Прежний должен быть изменен с

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

    face-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>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...