在JSF <h:outputStylesheet>,<h:outputScript>和<h:graphicImage>组件具有library属性.这是什么以及如何使用它?Web上有很多示例,它们使用如下公共内容/文件类型css,js以及img(或image)作为库名称,具体取决于所使用的标记:
<h:outputStylesheet library="css" name="style.css" />
<h:outputScript library="js" name="script.js" />
<h:graphicImage library="img" name="logo.png" />
Run Code Online (Sandbox Code Playgroud)
它有用吗?library这些示例中的值似乎只是重复标记名称已经表示的内容.对于<h:outputStylesheet>它来说,基于标签名称已经很明显它代表了一个"CSS库".与以下内容有什么不同,它们的工作方式相同?
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
Run Code Online (Sandbox Code Playgroud)
此外,生成的HTML输出有点不同.给定URL模式的上下文路径/contextname和FacesServlet映射*.xhtml,前者生成以下HTML,其库名称为请求参数:
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/style.css.xhtml?ln=css" />
<script type="text/javascript" src="/contextname/javax.faces.resource/script.js.xhtml?ln=js"></script>
<img src="/contextname/javax.faces.resource/logo.png.xhtml?ln=img" alt="" />
Run Code Online (Sandbox Code Playgroud)
而后者在URI的路径中生成以下带有库名的HTML:
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml" alt="" />
Run Code Online (Sandbox Code Playgroud)
后一种方法在事后看来也比前一种方法更有意义.该library属性究竟有用吗?
我有一个JSF2应用程序运行和工作没有问题.我与JSF的问题在于资源包.所有资源都.xhtml附加了后缀.因此main.css成为main.css.xhtml在浏览器中加载时.我想拥有它所以.xhtml不会依赖资源(不要介意页面本身).
是否有一个地方,我们可以一个方式不具有.xhtml附加的资源呢?
理想情况下,我不必改变网站的内部运作.我在下面列出了一些想法,但我不得不说我不喜欢这些.希望在某个地方找到解决方案?
我在Glassfish 3.1.2.2上使用Majorra v.2.1.17.
<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>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css.xhtml?ln=styles">成为:<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css?ln=styles"> WITHOUT的.xhtml扩展.当然你可能会问我为什么需要这个.好吧,我们正在推动我们的应用程序由Akamai CDN提供服务.
我们对网站集成的问题是我们正在尝试在边缘服务器上缓存静态内容.这是通过匹配文件扩展名(即:.js,.doc,.png,css等)来完成的.我们无法匹配,xhtml因为这将缓存所有页面以及静态内容.这会导致会话等问题.
根据BalusC的回答,我按照建议实现了资源处理程序.我不会在这里重写代码,因为它在下面回答.
但是,我在加载复合组件时遇到错误.我这样得到一个错误:
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:975) …Run Code Online (Sandbox Code Playgroud)