我正在尝试将一组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>
预先感谢您的任何建议。