我有一台专用于静态内容的服务器,所以我不想使用resources目录来存储javascript文件,但是我不想停止使用该<h:outputScript />标记。
<h:outputScript />
如何使该标记生成指向文件所在的静态服务器的链接,而不是 RES_NOT_FOUND 。我什至不需要JSF来检查文件是否存在…
我试过了: <h:outputScript name="#{requestBean.staticURL}/javascript.js"/>
<h:outputScript name="#{requestBean.staticURL}/javascript.js"/>
产生: <script type="text/javascript" src="http://static.server.com/javascript.js"></script>
<script type="text/javascript" src="http://static.server.com/javascript.js"></script>
但是它产生: <script type="text/javascript" src="RES_NOT_FOUND"></script>
<script type="text/javascript" src="RES_NOT_FOUND"></script>
我能做什么?
解决方案: Daniel向我提出了一个不错的解决方案!
我已经下载了Omnifaces的源代码,并将该org.omnifaces.resourcehandler.CDNResourceHandle.createResource(String resourceName, String libraryName)方法修改为:
org.omnifaces.resourcehandler.CDNResourceHandle.createResource(String resourceName, String libraryName)
public Resource createResource(String resourceName, String libraryName) { final Resource resource = wrapped.createResource(resourceName, libraryName); if (cdnResources == null) { return resource; } String resourceId = ((libraryName != null) ? libraryName + ":" : "") + resourceName; String path = cdnResources.get(resourceId); if(path == null){ if(libraryName != null){ resourceId = libraryName + ":%"; path = cdnResources.get(resourceId); if(path == null){ return resource; } path += "/"+resourceName; } else return resource; } final String requestPath = path; return new ResourceWrapper() { @Override public String getRequestPath() { return requestPath; } @Override public Resource getWrapped() { return resource; } }; }
通过此更改,我可以将其添加到我的 web.xml 文件中
<context-param> <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name> <param-value> somelib2:%=http://cdn.example.com/somelib2, js/script1.js=http://cdn.example.com/js/script1.js, somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js, otherlib:style.css=http://cdn.example.com/otherlib/style.css, images/logo.png=http://cdn.example.com/logo.png </param-value> </context-param>
注意somelib2:%=http://cdn.example.com/somelib2,,这会将 somelib2 库中的任何资源指向 **http://cdn.example.com/somelib2中** 的相对路径,例如:
somelib2:%=http://cdn.example.com/somelib2
<h:outputScript name="js/myjs.js" library="somelib2" />
将输出:
<script type="text/javascript" src="http://cdn.example.com/somelib2/js/myjs.js"></script>
可以与<h:outputScript /><h:outputStylesheet /><h:graphicImage />,任何使用资源的东西一起使用;
<h:outputScript /><h:outputStylesheet /><h:graphicImage />
你不能
很简单,因为<h:outputScript />可以读取 只有 形成你的web应用程序内部本地资源文件夹
您可以使用 Omnifaces CDNResourceHandler进行操作,这是JavaDoc
它将允许您使用远程文件
这是展示柜中的一些代码
要使其运行,需要在faces-config.xml中按以下方式注册此处理程序:
<application> <resource-handler>org.omnifaces.resourcehandler.CDNResourceHandler</resource-handler> </application> <context-param> <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name> <param-value> js/script1.js=http://cdn.example.com/js/script1.js, somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js, otherlib:style.css=http://cdn.example.com/otherlib/style.css, images/logo.png=http://cdn.example.com/logo.png </param-value> </context-param>
通过上面的配置,以下资源:
<h:outputScript name="js/script1.js" /> <h:outputScript library="somelib" name="js/script2.js" /> <h:outputStylesheet library="otherlib" name="style.css" /> <h:graphicImage name="images/logo.png" />