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>