Почему я получаю сообщение об ошибке «Префикс [..] не определен», когда я пытаюсь использовать свой пользовательский тег jsf? - PullRequest
3 голосов
/ 26 апреля 2010

Я создал пользовательский тег jsf (я не уверен, что он правильный, я мог что-то легко пропустить, поэтому прикрепил код ниже)

Сейчас я пытаюсь использовать этот тег, но получаю ошибку:

ошибка в строке 28 в столбце 49: Префикс пространства имен gc на диаграмме ganttchart не определено

Итак, вот HTML-страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:gc="http://myganttchart.org">

<body>
<ui:composition template="/masterpage.xhtml">
    <ui:define name="title">Gantt chart test</ui:define>
    <ui:define name="content">
        <f:view>
            <gc:ganttchart width="300" height="100" rendered="true"/>
            ...
        </f:view>
    </ui:define>
</ui:composition>
</body>
</html>

А вот tld -файл (он находится в WEB-INF/):

<taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1">

    <tlib-version>
        1.0
    </tlib-version>
    <short-name>
        oext
    </short-name>
    <uri>
        http://myganttchart.org
    </uri>

    <tag>
        <name>ganttchart</name>
        <tag-class>usermanagement.support.ganttchart.GanttChartTag</tag-class>
        <body-content>empty</body-content>

        <attribute>
            <name>binding</name>
            <deferred-value>
                <type>javax.faces.component.UIComponent</type>
            </deferred-value>
        </attribute>

        ...
    </tag>
</tablib>

Вот часть tag-class кода:

public class GanttChartTag extends UIComponentELTag {

    private ValueExpression width;
    private ValueExpression height;
    private ValueExpression styleClass;

    public String getComponentType () {
        return "org.myganttchart";
    }

    public String getRendererType () {
        return null;  
    }
    ...
}

Соответствующий блок от faces-config:

<component>
    <component-type>org.myganttchart</component-type>
    <component-class>usermanagement.support.ganttchart.UIGanttChart</component-class>
</component>

И последняя часть, если UIGanttChart:

public class UIGanttChart extends UIOutput {

    public UIGanttChart() {
        setRendererType (null);
    }

    //some test code
    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter writer = context.getResponseWriter ();
        writer.startElement("img", this);
        writer.writeAttribute("src", "no-img", "source");
        writer.writeAttribute("width", getAttributes ().get ("width"), "width");
        writer.writeAttribute("height", getAttributes ().get ("height"), "height");
        writer.writeAttribute("class", ".someclass", "styleClass");
        writer.endElement("img");
    }

}

Итак, что я пропустил? Любые идеи о том, как отладить или где может быть проблема приветствуются.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2010

Вам нужно определить ваш новый taglib a-la-facelets.

Создайте файл с именем "gc.taglib.xml" в / WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
                                "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">
<facelet-taglib>
 <namespace>http://org.myganttchart/gc</namespace>
 <tag>
        <tag-name>gantchart</tag-name>
        <component>
        <component-type>org.myganttchart</component-type>
        </component>
    </tag>
</facelet-taglib>

И сохраните то, что вы сделали с faces-config.xml.

2 голосов
/ 26 апреля 2010

Вы используете Facelets, но определяете тег JSP. Facelets имеют свои собственные файлы определения тегов (с суффиксом .taglib.xml).

Если вы используете JSF 1.2 с Facelets, вы найдете DTD здесь . Если вы используете JSF 2.0, схема определяется в спецификации JSR 314 (Приложение A, раздел 1.2).

...