etiquetas jsf primefaces resources systemeventlistener

etiquetas - Excluir recursos en JSF



jsf etiquetas (2)

Estoy usando Primefaces. Para algunas páginas, quiero excluir los recursos que están incluidos en primefacs, especialmente el recurso de tema.

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

Intento eso con un SystemEventListener de la siguiente manera:

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

y en 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>

Esto funciona bien, cuando incluyo un recurso en una página manualmente, pero esos no funcionan con los recursos que están incluidos en Primefaces. ¿Cómo puedo eliminar esos recursos?


Para todos los que quieran eliminar theme.css en todas las páginas (eso es lo primero que estoy haciendo), y aún no conozco este truco.

Deberá soltar estas pocas líneas en su web.xml:

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


The theme.css no se ha agregado como un recurso componente dinámico, pero se ha codificado en HeadRenderer PrimeFaces. OmniFaces CombinedResourceHandler también estaba luchando con esto.

La solución es bastante simple: HeadRenderer con un HeadRenderer personalizado (sin ninguna @ResourceDependency en theme.css , por supuesto!):

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

Regístrelo de la siguiente manera en 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>