Dudas JSF

Rubo18

Buenas, he empezado hace unos días a trabajar con JSF y estoy algo perdido, a ver si alguien puede echarme un cable con unas dudas.

En primer lugar, a la hora de mostrar desde la vista datos recogidos en el bean. Por ejemplo, llamas a un método del bean que te actualice algo en la base de datos, y te devuelva 3 valores, un success y dos errores distintos, ¿cómo manejas esos datos desde la vista? Lo único que he visto hasta ahora es que los métodos a los que llamas del Bean sólo devuelven un String que representa el outcome.

En segundo lugar, algo más concreto. Tengo una datatable con valores de una base de datos, a la que quiero meter una columna con Checks para que se pueda hacer una selección múltiple, ¿cómo puedo mapear esos checks para saber cuáles están marcados al submit? La forma que he visto de hacerlo tras mucho buscar es dándole a la datatable como variable un array de entidades Check, pero mi datatable ya lleva el array de la tabla de la base de datos.

R

Buenas..

Sobre la primera pregunta.. no entiendo que quieres hacer, los actions devuelven un String como tu dices que en el faces-config.xml tienes que definirle la lógica.. Por ejemplo :

Si viene OK --> forward a este JSP | Si viene ERRROR2 -> forward a error.jsp

Esto en jsf2 creo que se hace directametne con annotations, solo he usado jsf1.2 así que no estoy seguro de lo que te digo.

Cuando es un actionEvent no devuelve nada, la función tiene que ser void.

Si quieres hacer algo con datos que vienen de la B.D tienes que "mapearlos" a algun elemento.

Por ejemplo :


<h:outputText value="#{manager.resultado}"/>

<h:commandLink action="#{manager.actutalizaDatos}">

y en el manager...

public String actualizaDatos() {
   // ......
   if(todoOk)
      this.resultado = "OK";
   else 
      this.resultado = CODIGOERROR.251;
}

Y si lo quieres hacer por ajax.. jsf2 ya trae facilidades para eso.. yo en el 1.2 lo hacia usando a4j (richfaces), pero creo que ahora esta integrado en la base ya.

La 2nda pregunta.. supongo que ya con jsf2 hay mejores maneras de hacerlo pero yo lo que hacía era.. dentro del checkbox pasarle como parametro la id del objeto de esa fila . p.ejemplo :

<h:dataTable var="objeto">
    <h:selectBooleanCheckbox blablabla>
        <f:param name="lo que sea" value="#{objeto.id}"/>
    </h:selectBooleanCheckbox>
</h:dataTable>

y así podias saber a que objeto hace referencia ese checkbox.

A mi me sirvió de ayuda leer el blog de BalusC, que creo que es EL CRACK del jsf mundial xD

1 respuesta
Rubo18

#2 Vale, no sabía que la navegación se hace a través del faces-config, ahora todo es mucho más fácil xD. 400 tutoriales hablando sobre botones, comandos y mierdas y nadie es capaz de explicar una cosa tan básica xD.

En cuanto a la segunda respuesta, ¿Cómo se enviarían los parámetros? Y, ¿cómo recoges esas IDs desde el bean?

Osea, tienes 10 o 15 checks con el CODE que has puesto, y el típico botón con el submit:

 <h:commandButton value="Borrar seleccionados" action="#{randomBean.borrarSeleccionados()}"/>

Que cuando le das te actualiza la página borrando esos valores.

¿Cómo haces llegar esos parámetros al método borrarSeleccionados() o cómo los recoges desde allí?

Muchas gracias.

PD: Me meto el blog a favoritos, tiene buena pinta, esta noche en casa me lo leo con más detenimiento.

1 respuesta
R

#3 Los parametros dentro del Bean se leen así


jsp:
   <f:param name="pepito" value="valor"/>

bean:
   FacesUtil.getRequestParameter("pepito");

Te recomiendo que te metas todos estos metodos (que en breves usaras mas) de ayuda de comunicación de JSF en un clase tipo JSFUtils.

Otra cosa dentro del JSP no tienes que poner los parentesis del método (borrarSeleccionados).

Yo te había puesto esta manera para hacerlo en ajax (la costumbre) , le pones un onChange al elemento y ya haces lo que tengas que hacer en función de si esta marcado o no.

Pero supongamos que ese checkbox es un atributo de la clase . P Ejemplo

    public class Recibo {
    
private Long id; private Entidad entidad; // etc etc etc... private boolean pagado; // <-- esta es la linea importante } En el codigo jsp la puedes referenciar tal cual : <h:dataTable value="#{myBean.listaRecibos}" var="recibo"> <h:column> <f:facet name="header"> <h:outputText value="ID" /> </f:facet> <h:selectBooleanCheckbox value="#{recibo.pagado}" /> </h:column> </h:dataTable> <h:commandButton value="Save" action="#{myBean.guardaRecibos}" /> Y en el bean ... public String guardaRecibos() { // Haz tu update de B.D try { dataDAO.save(recibos); } catch (DAOException e) { setErrorMessage(e.getMessage() + " Motivo: " + e.getCause()); e.printStackTrace(); } return "OK"; }

Aquí lo explica mejor que yo.

A parte de esto .. no es la única forma, siempre tienes mas de una forma para hacerlo, también podrias por ejemplo bindear la tabla entera en el bean usando binding y la clase HtmlDataTable en el bean.

1 respuesta
Rubo18

#4 Sí, lo de los paréntesis es la manía de java, que me cuesta quitármela xD.

El código ese no me sirve, son checks para hacer un borrado múltiple de objetos de una base de datos, pero en el blog ese sí que hay varios ejemplos bastante buenos. La verdad que lo que he visto de ese blog hasta ahora tiene muy buena pinta.

Bueno, gracias por todo, entre la recogida de parámetros y el mapeo de la vista con el faces-config ya me va quedando todo menos caótico, dentro de nada lo mismo hasta parece una aplicación de verdad XD.

Usuarios habituales