plantillas - ¿Cómo cargar recursos dinámicos en JSF?
ui:composition primefaces (1)
Me gustaría cargar el recurso dinámico (JavaScript generado, configuración técnica en JSON) como recurso dinámico, usando la etiqueta h:outputScript
. Soy consciente de que puedo hacerlo escribiendo mi propio servlet y cargándolo a través de scripts de etiquetas normales, por lo que preferiría el "modo JSF" de carga de recursos.
¿Es posible y cómo?
Si es posible. Puede lograr esto utilizando un nombre de biblioteca de recursos específico y tener una intercepción de ResourceHandler
personalizada en él y devolver un Resource
personalizado cuando se solicite un recurso de la biblioteca específica.
P.ej
<h:outputScript library="dynamicJs" name="some.js" />
con
public class DynamicJsResourceHandler extends ResourceHandlerWrapper {
public DynamicJsResourceHandler(ResourceHandler wrapped) {
super(wrapped);
}
@Override
public Resource createResource(String resourceName, String libraryName) {
if ("dynamicJs".equals(libraryName)) {
return new DynamicJsResource(resourceName);
} else {
return super.createResource(resourceName, libraryName);
}
}
}
y
public class DynamicJsResource extends Resource {
private String resourceName;
public DynamicJsResource(String resourceName) {
this.resourceName;
}
@Override
public String getRequestPath() {
// TODO: return "/context/javax.faces.resource/" + resourceName + ".xhtml?ln=dynamicJs";
}
@Override
public URL getURL() {
// TODO: return new URL("http://localhost:8080" + getRequestPath());
}
@Override
public Map<String, String> getResponseHeaders() {
// TODO: return desired HTTP response headers.
}
@Override
public InputStream getInputStream() throws IOException {
// TODO: return InputStream by resourceName.
}
@Override
public boolean userAgentNeedsUpdate(FacesContext context) {
// TODO: return true when resource has been modified in server side.
}
}
Para que se ejecute, regístrelo de la siguiente manera en faces-config.xml:
<application>
<resource-handler>com.example.DynamicJsResourceHandler</resource-handler>
</application>
Si usa la biblioteca de utilidades JSF OmniFaces , también puede guardar el código org.omnifaces.resourcehandler.DynamicResource
y extenderlo desde su org.omnifaces.resourcehandler.DynamicResource
por lo que solo necesita implementar getInputStream()
. Si no usa OmniFaces, siempre puede usar su código fuente como guía.