2015-02-07 54 views
1

我試圖將JSF(2.2.10)集成到非JSF現有項目中。 對於合規性,以現有的項目結構,我想自定義哪裏鑽嘴魚科,而無需修改URL(或使用外部URL重寫)搜索頁面的路徑在外部固定磁盤文件系統路徑中查找Facelets文件而不是在WAR中

路徑訪問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以實現所需的行爲。 啊,應用程序沒有捆綁在一場戰爭中,而是部署在一個目錄結構中

謝謝你的支持!

回答

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> 
相關問題