Clases como parámetros y métodos en el composite

Clases como parámetros y métodos en el composite

Invocando métodos definidos en la interface.

  • A veces 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

action="#{cc.attrs.controller[cc.attrs.next]}"

Componente paginator

<?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="pages" type="java.util.List" />

        <composite:attribute name="skip" />
        <composite:attribute name="renderednew" default="true"/>
        <composite:attribute name="renderedClear" default="true"/>
        <composite:attribute name="renderedPrint" default="true"/>

        <composite:attribute name="clear"  default="clear" />
        <composite:attribute name="first" default="first"/>
        <composite:attribute name="back" default="back" />
        <composite:attribute name="next" default="next" />
        <composite:attribute name="last" default="last" />
        <composite:attribute name="new" 
                             method-signature="java.lang.String action()" />


        <composite:attribute name="printAll" default="printAll" />


    </composite:interface>
    <composite:implementation>




        <b:panel>   

            <p:remoteCommand  update=":form:dataTable :form:content "
                              name="remoteshowall" />
            <p:remoteCommand  update=":form:content"
                              name="remotecontent" />

 <b:commandButton   iconAwesome="fa-step-backward" 
                               styleClass="ui-priority-primary"
                               look="primary"
                               oncomplete="remoteshowall();"
                               action="#{cc.attrs.controller[cc.attrs.first]}"
                               update=":form:dataTable " > 

            </b:commandButton>


            <b:commandButton   iconAwesome="fa-caret-left" 
                               styleClass="ui-priority-primary"
                               look="primary"
                               oncomplete="remoteshowall();"
                               action="#{cc.attrs.controller[cc.attrs.back]}"
                               update=":form:dataTable " > 
                <f:attribute name="page" value="#{cc.attrs.page}"/>
            </b:commandButton>

            <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:commandButton  iconAwesome="fa-step-forward"  
                              oncomplete="remoteshowall();"
                              look="primary"
                              action="#{cc.attrs.controller[cc.attrs.last]}"  
                              update=":form:dataTable " > 
                        <f:attribute name="page" value="#{cc.attrs.page}"/>
                <f:attribute name="sizeOfPage" value="#{cc.attrs.sizeOfPage}"/>
            </b:commandButton>

           <b:selectOneMenu id="pages"

                             value="#{cc.attrs.page}"                                                  
                             colMd="1"
                             onchange="#{cc.attrs.skip}"
                             oncomplete="remoteshowall();"
                             update=":form:dataTable" 
                             >

                <f:selectItems  value="#{cc.attrs.pages}" />

            </b:selectOneMenu> 

            <b:commandButton iconAwesome="fa-plus"  
                             action="#{cc.attrs.new}"
                             look="primary"
                             rendered="#{cc.attrs.renderednew}"
                             oncomplete="remotecontent()"
                             > 

            </b:commandButton>



            <b:commandButton iconAwesome="fa-print"                                                                                                         
                             title="#{app['button.print']}"    
                             rendered="#{cc.attrs.renderedPrint}"  
                             action="#{cc.attrs.controller[cc.attrs.printAll]}"  
                             ajax="false"
                             look="primary"
                             style="width:60px"/> 


            <b:commandButton  iconAwesome="fa-list-alt"                                                
                              action="#{cc.attrs.controller[cc.attrs.clear]}"     
                              rendered="#{cc.attrs.renderedClear}"    
                              look="primary"
                              title="#{app['button.all']}"
                              update=":form:dataTable :form:content"
                              oncomplete="remoteshowall()"
                              > 
                <f:ajax />
            </b:commandButton>

             <b:selectOneMenu colMd="1"
                             value="#{cc.attrs.rowPage}"
                             onchange="#{cc.attrs.skip}"
                              oncomplete="remoteshowall();"
                             update=":form:dataTable" 
                >

                <f:selectItem itemLabel="#{app['rows.l25']}" itemValue="25" />
                <f:selectItem itemLabel="#{app['rows.l15']}" itemValue="15" />
                <f:selectItem itemLabel="#{app['rows.l10']}" itemValue="10" />
                <f:selectItem itemLabel="#{app['rows.l5']}" itemValue="5" />
                <f:selectItem itemLabel="#{app['rows.l40']}" itemValue="40" />

            </b:selectOneMenu>
        </b:panel>
    </composite:implementation>

</html>

Llamado desde el xhtml

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

La implementacion anterior usaba todos estos parámetros.

  • se necesitaban pasar los métodos firts, back, next,last, printAll,clear

  • No es necesario se invocan automáticamente desde el componente paginator

  <jmoordbjsf:paginator 
                    rowPage="#{rolController.rowPage}"
                    clear="#{rolController.clear()}"
                    first="#{rolController.first()}"
                    back="#{rolController.back()}"
                    next="#{rolController.next()}"
                    last="#{rolController.last()}"
                    page="#{rolController.page}"
                    pages="#{rolController.pages}"
                    skip="ajax:rolController.skip(rolController.page)" 
                    new="#{rolController.prepare('gonew',rolController.rol)}"
                    printAll="#{rolController.printAll()}"
                    />

CONTROLLER

  • Se elminaron los metodos

  • firts

  • next

  • last

Estos tiene el codigo para controlar el desplazamiento entre las paginas.

public class RolController implements Serializable, IController {

}

INTERFAZ

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.avbravo.store.controller.interfaces;

import com.avbravo.jmoordbutils.JsfUtil;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

/**
 *
 * @authoravbravo
 */
public interface IController<T> {

    public String preRenderView(String action);

    default public String refresh() {
        return "";
    }

    public String isNew();

    public void reset();

    public String showAll();

    public String save();

    public String edit();

    public String delete(Object item, Boolean deleteonviewpage);

    public String deleteAll();

    public String print();

    public String printAll();

    public String clear();

    // <editor-fold defaultstate="collapsed" desc="last">

    default public String last() {
        try {
              Integer page= 0;
            Integer sizeOfPage = (Integer) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("sizeOfPage");

            page = sizeOfPage;
            move(page);
        } catch (Exception e) {
           JsfUtil.errorDialog(nameOfMethod(), e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

  // <editor-fold defaultstate="collapsed" desc="first">


   default public String first() {
        try {
          Integer  page = 1;
            move(page);
        } catch (Exception e) {
           JsfUtil.errorDialog(nameOfMethod(), e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

     // <editor-fold defaultstate="collapsed" desc="next">
    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 "";
    }// </editor-fold>



     // <editor-fold defaultstate="collapsed" desc="back">
   default public String back() {
        try {
              Integer page= (Integer) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("page");

            if (page > 1) {
                page--;
            }
            move(page);
        } catch (Exception e) {
             JsfUtil.errorDialog(nameOfMethod(), e.getLocalizedMessage());
        }
        return "";
    }// </editor-fold>

    public String skip(Integer page);

    // <editor-fold defaultstate="collapsed" desc="skip(Integer page)">


//   default public String skip() {
//        try {
//              Integer page= (Integer) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("page");
//            move(page);
//        } catch (Exception e) {
//           JsfUtil.errorDialog(nameOfMethod(), e.getLocalizedMessage());
//        }
//        return "";
//    }// </editor-fold>

    public void move(Integer page);

    public String searchBy(String field);

    public default String nameOfClassAndMethod() {
        final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
        final String s = e.getClassName();
        return s.substring(s.lastIndexOf('.') + 1, s.length()) + "." + e.getMethodName();
    }

    public default String nameOfClass() {
        final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
        final String s = e.getClassName();
        return s.substring(s.lastIndexOf('.') + 1, s.length());
    }

    public default String nameOfMethod() {
        final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
        final String s = e.getClassName();
        return e.getMethodName();
    }


   public Integer sizeOfPage();

}

Last updated