防止在页面加载时将后缀添加到资源
我有一个JSF2应用程序正在运行并且工作没有问题。我在 JSF 上遇到的问题是资源包。所有资源都附加了后缀。因此,当加载到浏览器中时。我想拥有它,这样就不会被附加到资源上(不要介意页面本身)。.xhtml
main.css
main.css.xhtml
.xhtml
有没有办法让我们不附加到资源?.xhtml
理想情况下,我不必改变网站的内部运作。我在下面列出了一些想法,但我不得不说我真的不喜欢这些。希望在某个地方找到解决方案?
我在Glassfish 3.1.2.2上使用Majorra v.2.1.17。
当前面孔 Servlet 加载方式与在 web.xml 中一样(已更新)
<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>
为什么这个问题与其他问题不同
- JSF 2 资源与 CDN?.我不打算将我的资源放在 CDN 上,而是让我的资源保留在我的服务器上,但被推送到 CDN 上。
-
更改资源 URL 的 /javax.faces.resource 前缀。我不想更改前缀。我只想更改后缀。我想成为:没有扩展。
<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">
.xhtml
- 将 JSF 前缀更改为后缀映射迫使我在 CSS 背景图像上重新应用映射。由于我在加载资源时没有问题。该网站可以正常工作,我们只是很难将网页与资源区分开来(因为我们只看扩展)。
推理
当然,你可能会问我为什么我需要这个。好吧,我们正在将应用程序移动为由 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)
at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.createComponent(CompositeComponentTagHandler.java:162)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:494)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:169)
...
复合组件已正确加载,因为如果我“注销”我们刚刚创建的新组件,它将加载。堆栈跟踪使我相信它试图在java类中找到这个组件,而不是在资源中找到它。根据这个将在发生错误的最后一行(975)处:ResourceHandler
grepcode
String packageName = componentResource.getLibraryName();
String className = componentResource.getResourceName();
className = packageName + '.' + className.substring(0, className.lastIndexOf('.'));
这意味着,aka 是因为我得到的错误是 。我似乎无法弄清楚如何/在哪里被称为复合组件。对弄清楚最后一个问题有什么帮助吗?resourceName
className
null
java.lang.NullPointerException
ResourceHandler