问题">
我真的不知道这是否是Netbeans的问题,但问题是:在我的jsf web应用程序的根目录中,我有一个名为resources的文件夹,其中包含了图像、css和js (用于javascript)子文件夹。子文件夹包含各自的内容。下面是我如何(例如)从应用程序中引用脚本:
<h:outputScript library="js" target="head" name="dialog.js"/>
问题是,当我清理和构建时,css目录和js目录中的文件保持不变,而images目录中的所有图像都被删除了。那么,如果jsf资源机制在每次“清理并构建”时都会清除我的图像,那么我如何使用它呢?
发布于 2011-12-27 03:44:38
JSF不会这样做。这是服务器做的事情。此问题表明您正在手动存储(上传?)图像在展开的WAR文件夹中,而不是在它之外的任何地方。“清理并重建”只是清理服务器的工作文件夹和旧的扩展的WAR,并基于原始的WAR重建webapp (本质上,在开发时,是项目的结构)。顺便说一句,这不仅在开发中发生,而且在重新部署新的WAR文件时也会在生产中发生。
这种行为是按规范进行的。您不应该手动将文件放在展开的WAR文件夹中,并期望它们神奇地包含在原始WAR文件中或在重新部署时保留。
将它们保存在战争之外的固定和永久位置。如果您将外部路径作为新的上下文添加到服务器,那么您可以通过通常的方式通过<img>
或<h:graphicImage value>
引用它们。另请参见Load images from outside of webapps / webcontext / deploy folder using or tag。
如果您确实需要通过JSF资源处理程序来解析它们,以便可以在诸如<h:graphicImage library="uploads" name="foo.png>
之类的东西中使用它们,那么您需要实现一个自定义的ResourceHandler
。它看起来像这样:
public class UploadedResourceHandler extends ResourceHandlerWrapper {
private ResourceHandler wrapped;
public MyResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ResourceHandler getWrapped() {
return this.wrapped;
}
@Override
public Resource createResource(String resourceName, String libraryName) {
if ("uploads".equals(libraryName)) {
return new YourCustomUploadedResourceImpl(resourceName);
} else {
return super.createResource(resourceName, libraryName);
}
}
}
要让它运行,请在faces-config.xml
中按如下方式注册它
<application>
<resource-handler>com.example.UploadedResourceHandler</resource-handler>
</application>
然而,用一个简单的答案来概括这并不是微不足道的。您还需要了解HTTP (缓存)是如何工作的。只需阅读javadoc,从ResourceHandler
开始,看看Mojarra自己的ResourceHandlerImpl
和ResourceImpl
源代码就能明白其中的含义。
https://stackoverflow.com/questions/8640832
复制相似问题