Как использовать шаблоны JSF, хранящиеся в общей банке? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь сохранить набор шаблонов JSF и другие ресурсы в файле .jar, из которого будут извлечены несколько веб-приложений.Я нашел этот SO ответ , который, кажется, содержит инструкции для того, что я пытаюсь сделать.Однако, хотя я могу загружать изображения из общего JAR-файла, я не могу заставить работать шаблоны JSF.Я получаю сообщение об ошибке «Файл не найден».

Я использую Open Liberty 18.0.0.4, и файл jar хранится в каталоге ${server.config.dir}/lib/global, что, как я понимаю, делает содержимое доступным для всех веб-приложений.

Вот вывод jar tf общей банки.

META-INF/MANIFEST.MF
META-INF/resources/common/images/ufo.png
META-INF/resources/common/jsf/template.xhtml

Это template.xhtml из общей банки.

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Title from template</title>
    </h:head>
    <h:body>
        This is content from the template<br/>
    </h:body>
</html>

Обращаясь к моему веб-приложению,Вот макет каталога.

/WEB-INF
/WEB-INF/classes
/WEB-INF/web.xml
/META-INF
/imageTest.xhtml
/localTemplate.xhtml
/localJSFTest.xhtml
/sharedJarJSFTest.xhtml

imageTest.xhtml просто отображает ufo.png из общего jar-файла, и этот фасет работает без проблем.

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Test Image</title>
    </h:head>
    <h:body>
        I can see this image.<br/>
        <h:graphicImage library="common" name="images/ufo.png" alt="ufo"/>
    </h:body>
</html>

localJSFTest.xhtml использует localTemplate.xhtml, который является частью веб-приложения.Это также работает.

localJSFText.html

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <h:body>
        <ui:composition template="localTemplate.xhtml" />
    </h:body>
</html>

localTemplate.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Title from local template</title>
    </h:head>
    <h:body>
        This is content from the LOCAL template<br/>
    </h:body>
</html>

Проблема возникает, когда sharedJarJSFText.xhtml пытается использовать template.xhtml (опубликовано выше) из общей банки.

sharedJarJSFText.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <h:body>
        <ui:composition template="/common/jsf/template.xhtml" />
    </h:body>
</html>

При попытке получить доступ к sharedJarJSFText.xhtml в браузере появляется следующая ошибка:

/common/jsf/template.xhtml Not Found in ExternalContext as a Resource

viewId=/sharedJarJSFTest.xhtml
location=/home/jmac/Programming/NetBeansProjects/TestJSFWebApp/src/main/webapp/sharedJarJSFTest.xhtml
phaseId=RENDER_RESPONSE(6)

Caused by:
java.io.FileNotFoundException - /common/jsf/template.xhtml Not Found in ExternalContext as a Resource
at org.apache.myfaces.view.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:300)

Я думаю, что я следую инструкциям в приведенном выше связанном ответе SO, поэтому я не уверен, почему это не работает.

В другом ответе SO пользователь BalusC объясняет, что, посколькув спецификации Servlet 3.0 написание пользовательского ResourceResolver не требуется.Эта версия Open Liberty использует спецификацию Servlet 4.0.

Если полезно, вот список возможностей из server.xml для этого сервера Open Liberty.

<featureManager>
    <feature>jsp-2.3</feature>
    <feature>jsf-2.3</feature>
</featureManager>

Заранее благодарим за любыепредложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...