2013-11-25 113 views
4

我正在使用Primefaces。對於某些頁面,我想排除primefacs包含的資源,尤其是主題資源。排除JSF中的資源

<link type="text/css" rel="stylesheet" href="/context/javax.faces.resource/theme.css?ln=primefaces-owntheme" />  

我嘗試用SystemEventListener如下:

public class PrimeFacesResourceRemover implements javax.faces.event.SystemEventListener { 


    @Override 
    public void processEvent(SystemEvent event) throws AbortProcessingException { 
    FacesContext context = FacesContext.getCurrentInstance(); 

    UIViewRoot viewRoot = context.getViewRoot(); 
    for (UIComponent resource : viewRoot.getComponentResources(context, "head")) { 

     Map<String, Object> attrs = resource.getAttributes(); 
     String resourceLibrary = (String) attrs.get("library"); 
     String resourceName = (String) attrs.get("name"); 

     if ("primefaces-owntheme".equals(resourceLibrary) && "theme.css".equals(resourceName)) { 

      // Remove resource from view 
      context.getViewRoot().removeComponentResource(context, resource, HEAD); 
     } 
    } 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public boolean isListenerForSource(Object source) { 
    return (source instanceof UIViewRoot); 
    } 
} 

,並在faces-config.xml中

<application> 
     <system-event-listener> 
     <system-event-listener-class> 
      com.mycompany.mavenproject1.PrimeFacesResourceRemover 
     </system-event-listener-class> 
     <system-event-class> 
      javax.faces.event.PostAddToViewEvent 
     </system-event-class> 
     </system-event-listener> 
    </application> 

這工作得很好,當我有一個頁面上的種源但是這些不適用於Primefaces包含的資源。我怎樣才能刪除這些資源?

回答

3

theme.css未被添加爲動態組件資源,但已在PrimeFaces的HeadRenderer中進行硬編碼。此OmniFaces CombinedResourceHandler也是struggling

的解決方法是相當簡單:具有自定義HeadRenderer覆蓋它(不上theme.css任何@ResourceDependency,當然!):

public class HeadRenderer extends Renderer { 

    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException { 
     context.getResponseWriter().startElement("head", component); 
    } 

    @Override 
    public void encodeChildren(FacesContext context, UIComponent component) throws IOException { 
     // NOOP. 
    } 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     for (UIComponent resource : context.getViewRoot().getComponentResources(context, "head")) { 
      resource.encodeAll(context); 
     } 

     context.getResponseWriter().endElement("head"); 
    } 

} 

註冊它在Web應用程序的faces-config.xml如下:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Output</component-family> 
     <renderer-type>javax.faces.Head</renderer-type> 
     <renderer-class>com.example.HeadRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

當我明白你的權利,這是不可能改變渲染器的輸出,而無需重寫呢?在我的情況下,我想排除主題CSS只有當它是一個離線頁面(app.cache)。在其他所有情況下,我對PrimeFaces HeadRenderer感到滿意。 – h2mch

+0

你也可以擴展它而不是覆蓋,但是最終你會得到相同的代碼。或者當你說「我很高興」時,你是否專門針對那些無用的方面:',''等PrimeFaces'HeadRenderer'?我想不出任何其他具體原因,爲什麼你明確提到你對此感到滿意。 – BalusC

+0

是的,我正在使用這些方面。特別是最後一個方面要確保,我可以覆蓋默認包括(CSS)。爲什麼你在想,這些方面是無用的? – h2mch

1

對於所有想要在所有頁面上刪除theme.css的人(這是我所做的第一件事),並且仍然不知道這個竅門。

你需要滴在你的web.xml的這幾行:

<context-param> 
    <param-name>primefaces.THEME</param-name> 
    <param-value>none</param-value> 
</context-param>