我正在尝试将JSF(2.2.10)集成到NON JSF现有项目中。 为了符合现有的项目结构,我想自定义Mojarra搜索页面的路径,而不修改url(或使用外部url-rewrite)
访问JSF页面的路径
http://my.web.app/context/faces/page1.xhtml
基本上,查找方案将从
更改webapp\
templates\
WEB-INF\
lib
page1.xhtml
page2.xhtml
etc...
到
mydir_outside_webapp\
templates\
page1.xhtml
page2.xhtml
etc...
...
webapp\
templates\
WEB-INF\
lib
我找不到一种方法来自定义JSF来实现所需的行为。 啊,应用程序没有捆绑在战争中,而是部署在目录结构中
感谢您的支持!
答案 0 :(得分:3)
您可以使用自定义ResourceHandler
,其中您可以覆盖createViewResource()
方法以首先签入外部文件夹。
public class ExternalResourceHandler extends ResourceHandlerWrapper {
private ResourceHandler wrapped;
private File externalResourceFolder;
public ExternalResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
externalResourceFolder = new File("/path/to/external/resources");
}
@Override
public ViewResource createViewResource(FacesContext context, String path) {
ViewResource resource = super.createViewResource(context, path); // First try local.
if (resource == null) { // None found? Try external.
final File externalResource = new File(externalResourceFolder, path);
if (externalResource.exists()) {
resource = new ViewResource() {
@Override
public URL getURL() {
try {
return externalResource.toURI().toURL();
} catch (MalformedURLException e) {
throw new FacesException(e);
}
}
};
}
}
return resource;
}
@Override
public ResourceHandler getWrapped() {
return wrapped;
}
}
要使其运行,请在faces-config.xml
:
<application>
<resource-handler>com.example.ExternalResourceHandler</resource-handler>
</application>