2012-11-08 10 views
7

başarıyla bu Uygulamamda şablonla çalışmaya almak mümkün gelen dosyalar:edinme Facelet'lerin şablonları/harici dosya sistemi veya veritabanı

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

Ben JAR ait /META-INF/templates/mytemplate.xhtml şablonu taşımak mümkün de duyuyorum ve Bunu işe almak için:

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

Bu dosyayı aslında dosya sistemine (veya bu konuyla ilgili veritabanına) koymak istiyorum. Bunu nasıl başarabilirim? com.sun.facelets.impl.DefaultResourceResolver ile ilgili pek çok şey buldum, ancak aslında şablonun sunumunu geçersiz kılmakla alakalı olduğunu düşünmüyorum. Bir URL'yi çözmeyi denemiyor, sadece dosyayı bir şekilde sınıf yolunda bulmaya çalışıyor.

cevap

12

Zaten JSF 2.2 üzerindeyseniz, ResourceHandler numaralı bir özel kimlik sağlayarak bunu yapabilirsiniz, burada istediğiniz görünüm kaynağını createViewResource() içinde döndürürsünüz. aşağıda faces-config.xml kayıtlıdır

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; 
    } 

} 

:

<application> 
    <resource-handler>com.example.FaceletsResourceHandler</resource-handler> 
</application> 

Yoksa henüz JSF 2.2 üzerinde değilseniz, o zaman bunun yerine ResourceResolver kullanın. veritabanından kaynak sağlamak amacıyla, sen/kurtarırdın ya (onları önbelleğinizde, ne olursa olsun yol

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

: aşağıda web.xml kayıtlıdır

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; 
    } 

} 

temp) disk dosya sistemi böylece aracılığıyla URL sağlayabilir veya db:// gibi özel bir protokol icat ve gerçek bir iş gerçekleştirmek için özel bir URLStreamHandlerFactory ve URLStreamHandler uygulama sağlamak DB'den Burada bir başlangıç ​​örneğini bulabilirsiniz Registering and using a custom java.net.URL protocol.

+0

Merhaba BalusC.Bu işe başladım. Ben gerçek .xhtml sayfaları alıyorum ile iyi çalışıyor gibi görünüyor. Ancak, şablon kullanılarak çalışmak gibi görünmüyor. Şu an aldığım şu anki hatayı göstermek için soruyu düzenliyorum. – JeffJak

+0

Dosya mevcut değil. Başlama örneğini 'File # exists()' testini kullanmak ve 'null' olmadığında döndürmek. – BalusC

+0

Sorunu çözdüm ... Çözümünüz işe yarıyor. Ancak, şablonu nasıl tanımladığına bağlı. Örneğin şablon = "myfile.xhtml" kullanırsam başarısız olur. Ama ben şablon = "/ myfile.xhtml" yaparsam ResourceResolver'a girer. – JeffJak