在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属性究竟有用吗?
我多年来一直在使用前缀映射,并决定切换到后缀映射,只是为了/faces真正摆脱url.在我挖洞之前,我只是想检查一下我是否朝着正确的方向前进,因为有一些意想不到的事情正在发生.我改变了这个:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
对此:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
然后我看到所有内容FacesServlet都.xhtml
附加到它上面,因此浏览器正在请求background.png.xhtml文件,
style.css.xhtml文件 - 这是正确的吗?我认为它被称为后缀映射,但它看起来有些凌乱,我试图说服自己这是要走的路.
在我引用URI的CSS文件中,我还必须附加.xhtml:
background-image: url(images/background.png.xhtml);
Run Code Online (Sandbox Code Playgroud)
然后我看到BalusC的一篇帖子提供了一个解决方案,可以防止资源下载而无需通过FacesServlet:
<security-constraint>
<display-name>Restrict raw XHTML docs</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
Run Code Online (Sandbox Code Playgroud)
当我添加这个时,只有真实.xhtml文件加载到页面上,所有其他资源(尽管已经.xhtml附加)不显示.
我想知道的是:
这是否适用.xhtml于一切正常(对不起,如果这几年最愚蠢的问题)
为什么'限制原始xhtml文档'安全约束会阻止加载CSS,JavaScript和图像等资源?
感谢您的任何反馈.我在Glassfish 3.1上使用Mojarra 2.1.2.