我有一个JSF2应用程序运行良好,但是我在JSF中使用资源束时遇到了问题。所有资源都附加了
有没有办法不将
理想情况下,我不想改变站点的内部工作方式。我列出了以下几种想法,但我必须说我并不真的喜欢这些方法。希望能找到解决方案?
我正在Glassfish 3.1.2.2上使用Majorra v.2.1.17。
.xhtml
后缀。因此,当在浏览器中加载main.css
时,它会变成main.css.xhtml
。我想让资源不再附加.xhtml
(不介意页面本身)。有没有办法不将
.xhtml
附加到资源上?理想情况下,我不想改变站点的内部工作方式。我列出了以下几种想法,但我必须说我并不真的喜欢这些方法。希望能找到解决方案?
我正在Glassfish 3.1.2.2上使用Majorra v.2.1.17。
当前Faces 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)
...
组合组件被正确加载,因为如果我“取消注册”我们刚刚创建的新的ResourceHandler
,它就会加载。堆栈跟踪让我相信它正在尝试在Java类中找到此组件,而不是在资源中找到它。根据grepcode
,错误发生在最后一行(975):
String packageName = componentResource.getLibraryName();
String className = componentResource.getResourceName();
className = packageName + '.' + className.substring(0, className.lastIndexOf('.'));
这意味着 resourceName
,也就是 className
为 null
,因为我得到的错误是 java.lang.NullPointerException
。我似乎无法弄清楚 ResourceHandler
是如何与组合组件相关调用的。有人能帮我解决这个问题吗?
background: #14311b url("#{resource['templateImages:background.jpg']}") no-repeat 0 0;
,由于JSF不会在“非XHTML”文件上运行,因此它将无法正常工作。那么,将“*.css”添加为JSF servlet的模式是否是一个好主意?还是只需使用静态获取即可?那么位于ln=javax.faces
的资源呢? - blo0p3r/javax.faces.resource/*
添加到faces servlet映射中。 - BalusChttp://localhost:8080/myApp/javax.faces.resource/main03.css?ln=styles
。但是这不起作用,但是http://localhost:8080/myApp/javax.faces.resource/main03.css.xhtml?ln=styles
可以。我知道我漏掉了什么。 - blo0p3r