sábado, 30 de octubre de 2010

REDIRIGIR A OTRO CONTROLLER (Spring Portlet)

Si al terminar la fase "action" de un portlet, no queremos pasar por la fase "render" asociada, sino que queremos redirigir a la fase "action" de otro Controller, la solución sería ésta:

protected void onSubmitAction(ActionRequest request,
            ActionResponse response, Object command, BindException errors)
            throws Exception {

// Supongamos que hemos guardado en BDD y ahora nos interesa mostrar el listado actualizado

PortletUtils.clearAllRenderParameters(response);
response.setRenderParameter("action", "listar");

}

viernes, 29 de octubre de 2010

COMBO DEPENDIENTE PRIMEFACES

Ésta es la solución que propongo para desarrollar un combo dependiente de otro con Primefaces 2.2.1, y SIN NECESIDAD DE RECARGAR LA PÁGINA:

Éste es el código HTML:

<h:outputLabel for="cuentaGrafica" value="Cuenta: " />
<h:selectOneMenu id="cuentaGrafica" immediate="true"
                            validator="comboCuentaGraficaValidator"
                            validatorMessage="Debe seleccionar una cuenta"
                            value="#{movimientosBean.movimientoDTOGrafica.cuentaDTO.id}">
                            <f:selectItem itemLabel="Seleccione una opción" itemValue="0" />
                            <f:selectItems value="#{cuentasBean.listaCuentasDTO}"
                                var="cuenta" itemLabel="#{cuenta.numeroCuenta}"
                                itemValue="#{cuenta.id}" />
                            <p:ajax update="anioGrafica"
                                actionListener="#{movimientosBean.cargaListaAnios}" />
                        </h:selectOneMenu>

<h:outputLabel for="anioGrafica" value="Año: " />
                        <h:selectOneMenu id="anioGrafica"
                            value="#{movimientosBean.movimientoDTOGrafica.anio.anio}">
                            <f:selectItem itemLabel="Seleccione una opción" itemValue="0" />
                            <f:selectItems value="#{movimientosBean.listaAnios}" var="anio"
                                itemLabel="#{anio.anio}" itemValue="#{anio.anio}" />
                        </h:selectOneMenu>


Y éste es el código Java del Backing Bean:

public void cargaListaAnios(ActionEvent event) {

        Integer idCuenta = (Integer) event.getComponent().getAttributes().get(
                "value");

        try {
            setListaAnios(gestorMovimientos.recuperaListaAnios(idCuenta));
        } catch (BusinessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Cuando el usuario selecciona una cuenta en el primer combo, salta el Listener asociado al evento de cambio de valor de dicho combo,  pudiendo acceder a BDD para cargar el segundo combo con los items dependientes de nuestra elección