Проблема с созданием собственных пользовательских тегов (JSF 2.0) - PullRequest
0 голосов
/ 13 августа 2011

Я учусь создавать свои собственные теги, но у меня возникли небольшие проблемы, я не могу заставить это простое приложение использовать созданный мной тег. Я думаю, что все сделал хорошо, но я боюсь, что пути к новой библиотеке, которую я создал, неверны. Может быть, кто-то может помочь мне найти мою ошибку и понять ее причину. Это то, что я сделал до сих пор:

1- Я создал тег как кусок xhtml (mybutton.xhtml)

<!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">

<ui:composition>
    <h:commandButton type="submit" value="#{buttonSubmitLabel}" />
    <h:commandButton type="reset" value="#{buttonResetLabel}" />
</ui:composition>
</html>

2- Затем я создал файл .xml, который будет выступать в качестве библиотеки, в которую будут индексированы все мои пользовательские теги (mytagsconfig.taglib.xml)

 <?xml version="1.0"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://mytags.com/facelets</namespace>
    <tag>
        <tag-name>mybutton</tag-name>
        <source>mytags/mybutton.xhtml</source>
    </tag>
</facelet-taglib>

3- Я попытался зарегистрировать мою новую библиотеку в web.xml, чтобы я мог ее использовать

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>CHAPTER 5 Creating your own Custom tags</display-name>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <!-- REGISTERING A CUSTOM TAG INTO JSF APPLICATION -->
    <context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/mytagsconfig.taglib.xml</param-value>
</context-param>
</web-app>

4- И последнее, я пытаюсь использовать тег на некоторой странице (в моем случае внутри компонента, который вставлен в шаблон)

 <!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:mytags="http://mytags.com/facelets">

<ui:composition template="WEB-INF/templates/masterLayout.xhtml">
    <ui:define name="pagetitle">
    Defining custom tags
    </ui:define>
    <ui:define name="content">
    Defining custom tags is a 3 step process:
    <ul>
        <li>Use ui:compisition to create some content.(Custom tags are stored in WEB-INF/customtags)</li>
        <li>Declares the custom tag in a tag library descriptor into the WEB-INF folder(Example: mycustomtags.taglib.xml).</li>
        <li>Register the tag library descriptor in the web.xml.</li>        
    </ul>

    <!-- Here should go a call to the new created tag -->
    <mytags:mybutton buttonSubmitLabel="Submit" buttonResetLabel="Reset" /> 

    </ui:define>    
</ui:composition>

</html>

Это моя структура папок:

enter image description here

**** Обновление **** При сборке я вижу страницу index.xhtml, но пользовательского тега там нет (я не вижу 2 кнопки)

1 Ответ

6 голосов
/ 13 августа 2011

В объявлении taglib в web.xml не указано правильное имя файла.

Вы сказали, что создали /WEB-INF/mytagsconfig.taglib.xml, но вместо этого объявили его в web.xml как /WEB-INF/mytags.taglib.xml. Исправьте это соответственно.

Не имеет прямого отношения к проблеме, но рассмотрите возможность обновления до декларации корня taglib, совместимой с JSF / Facelets 2.0, и web.xml имени параметра контекста.

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <!-- Taglib config here. -->
</facelet-taglib>

и

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/mytagsconfig.taglib.xml</param-value>
</context-param>
...