如何使用存储在共享jar中的JSF模板?

时间:2019-03-01 15:57:05

标签: jsf

我正在尝试将一组JSF模板和其他资源存储在一个.jar文件中,几个Web应用程序将从中提取这些模板。我找到了这个SO answer,它似乎为我正在尝试做的事情提供了说明。但是,虽然我可以从共享jar中加载图像,但无法使JSF模板正常工作。我收到找不到文件的错误。

我正在使用Open Liberty 18.0.0.4,该jar存储在${server.config.dir}/lib/global目录中,据我了解,该目录的内容可用于所有webapp。

这是共享jar的jar tf的输出。

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

这是共享jar中的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应用程序,这是目录布局。

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

imageTest.xhtml仅显示共享jar中的ufo.png,并且该facelet正常工作。

<?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,它是Web应用程序的一部分。这也可以。

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尝试使用共享jar中的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 answer中,用户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>

预先感谢您的任何建议。

0 个答案:

没有答案