2012-11-08 49 views
7

我能夠成功地得到這個在我的應用程序模板的工作文件:獲得Facelets的模板/從外部文件系統或數據庫

<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml"> 

我也能移動模板/META-INF/templates/mytemplate.xhtml一個JAR和得到這個工作:

<ui:decorate template="/templates/mytemplate.xhtml"> 

我真的想把這個文件放到文件系統(或數據庫)。我怎樣才能做到這一點?我發現很多與com.sun.facelets.impl.DefaultResourceResolver有關的事情,但我認爲這實際上並不涉及覆蓋模板的服務。它不會嘗試解析URL,它只是試圖在類路徑上以某種方式獲取文件。

回答

12

如果您已經使用JSF 2.2,則可以通過提供自定義ResourceHandler來實現此目的,其中您返回所需的視圖資源createViewResource()

public class FaceletsResourceHandler extends ResourceHandlerWrapper { 

    private ResourceHandler wrapped; 

    public FaceletsResourceHandler(ResourceHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ViewResource createViewResource(FacesContext context, final String name) { 
     ViewResource resource = super.createViewResource(context, name); 

     if (resource == null) { 
      resource = new ViewResource() { 
       @Override 
       public URL getURL() { 
        try { 
         return new File("/some/base/path", name).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.FaceletsResourceHandler</resource-handler> 
</application> 

或者,如果你對JSF 2.2是沒有,然後使用ResourceResolver代替。

<context-param> 
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> 
    <param-value>com.example.FaceletsResourceResolver</param-value> 
</context-param> 

不管方式,以提供從數據庫中的資源,你要麼保存/緩存他們(:

public class FaceletsResourceResolver extends ResourceResolver { 

    private ResourceResolver parent; 

    public FaceletsResourceResolver(ResourceResolver parent) { 
     this.parent = parent; 
    } 

    @Override 
    public URL resolveUrl(String path) { 
     URL url = parent.resolveUrl(path); // Resolves from WAR. 

     if (url == null) { 
      try { 
       url = new File("/some/base/path", path).toURI().toURL(); 
      } catch (MalformedURLException e) { 
       throw new FacesException(e); 
      } 

     } 

     return url; 
    } 

} 
這是登記在 web.xml如下

temp)磁盤文件系統,因此您可以僅通過File提供URL,或者創建自定義協議(例如db://),並提供自定義URLStreamHandlerFactoryURLStreamHandler實現來執行流的實際作業來自DB。你可以在這裏找到一個開球的例子Registering and using a custom java.net.URL protocol

+0

嗨BalusC..This幫助讓我開始。我似乎與得到實際的.xhtml頁面正常工作。但它似乎沒有使用模板。我編輯問題以顯示我現在正在獲取的當前錯誤。 – JeffJak

+0

該文件顯然不存在。當啓動示例不使用時,擴展啓動示例以使用'File#exists()'測試並返回'null'。 – BalusC

+0

我想出了問題......您的解決方案確實有效。但這取決於我如何定義模板。例如,如果我使用template =「myfile.xhtml」,它將失敗。但是,如果我做template =「/ myfile.xhtml」它將進入ResourceResolver。 – JeffJak

相關問題