Invocar métodos directos desde un composite Java Server Faces
Aveces necesitamos pasar solo el nombre del controller o el entity a un composite y desde el invocar a métodos específicos que no serán pasados como parámetros.
Definimos los atributos
- Controller
- Si el método necesita leer atributos lo podemos pasar mediante <f:attribute>
- en esos métodos los obtenemos
<composite:attribute name="controller" type="java.lang.Object"/>
<composite:attribute name="next" default="next" />
definición del action
exit: Ctrl + ↩
action="#{cc.attrs.controller[cc.attrs.next]}"
DEFINIMOS EL COMPONENTE
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:b="http://bootsfaces.net/ui"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<composite:interface >
<composite:attribute name="controller" type="java.lang.Object"/>
<composite:attribute name="sizeOfPage" default="25" />
<composite:attribute name="page" />
<composite:attribute name="rowPage" default="25" />
<composite:attribute name="next" default="next" />
<b:panel>
//DEFINIMOS EL COMMAND BUTTON
//El action construimos la llamada el método next que esta en la interface que implementa el controller.
<b:commandButton iconAwesome="fa-play"
oncomplete="remoteshowall();"
action="#{cc.attrs.controller[cc.attrs.next]}"
look="primary"
update=":form:dataTable " >
<f:attribute name="page" value="#{cc.attrs.page}"/>
<f:attribute name="sizeOfPage" value="#{cc.attrs.sizeOfPage}"/>
</b:commandButton>
</b:panel>
</composite:implementation>
</html>
DESDE EL FORMULARIO .XHTML
Invocamos el componente,
<jmoordbjsf:paginator
controller="#{rolController}"
sizeOfPage="#{rolController.sizeOfPage()}"
rowPage="#{rolController.rowPage}"
page="#{rolController.page}"
pages="#{rolController.pages}"
skip="ajax:rolController.skip(rolController.page)"
new="#{rolController.prepare('gonew',rolController.rol)}"
/>
En el contoller
No definimos el metodo next() ya que este esta definido en la interface IController
public class RolController implements Serializable, IController {
}
INTERFACE
Definimos el método con default para implementar código dentro del método en la interface y obtenemos los atributos page y sizeOfPage
public interface IController<T> {
default public String next() {
try {
Integer page= (Integer) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("page");
Integer sizeOfPage = (Integer) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("sizeOfPage");
if (page < sizeOfPage) {
page++;
}
JsfUtil.warningDialog("IController.next", "page: " + page.toString());
move(page);
} catch (Exception e) {
JsfUtil.errorDialog(nameOfMethod(), e.getLocalizedMessage());
}
return "";
}
}
Comments