Bonjour,

J'ai commencé à développer une application. La couche présentation est basée sur les JSF. Je dois développer plusieurs écrans de recherche avec des données paginées/chargées à la demande.

Sur une page, j'ai un composant datatable défini comme suit :
<h:dataTable value="backingBean.data"> (en fait ice:dataTable car je suis sur iceFaces)

Le backingBean associé est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Backing {
 
     private CustomDataTable data = null;
     private int pageSize = 10;
     private ISearchService service;
 
     public getData() {
          if (data == null) { return new LocalCustomDataTable(pageSize) }
          else { return data }
     }
 
     public fetchData(int startRow, int endRow) {
          int totalCount = service.getTotalCount();
          List<DTO> result = service.search();
          ....
     }
 
          /** Classe interne permettant de founir un mécanisme de callback */
          private class LocalCustomDataTable extens CustomDataTable {
               /** Constructeur */
               public LocalCustomDataTable(int size) {
                    super(size);
               }
               /** Méthode redéfinie */
               public fetchPage(startRow, endRow) {
                    fetchData(startRow, endRow);
               }
          }
}
Quand ma page est interprétée, le composant dataTable présent sur la page appelle la métode getData() de mon backing bean. Cette méthode lui renvoit un CustomDataTable qui représente un dataTable paginé. La pagination est effectuée grâce à une fonction de callBack qui appelle un service métier dans le backingBean.

Mon problème est le suivant :
C'est le composant dataTable qui va chercher ses données en base de données quand la page est interprétée. Si il y a une erreur dans la méthode fetchData, cela entraîne une erreur qu'il est impossible d'afficher correctement sur la page.

J'ai ensuite essayé de procéder autrement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public class BackingBean {
     private ListDataTable data;
     private ISearchService service;
     private int beginIndex;
     private int endIndex;
     public goNext() { ... }
     public goPrevious { ... }
}
et sur ma page en dessous du composant datatable, j'ai des liens Next et Previous.
Avec cette technique, si goNext ou goPrevious renvoie une erreur, je peux créer un FacesMessage et l'afficher sur la page. Je peux gérer les erreurs proprement.
Mais le souci est que j'ai quelque-chose de graphiquement rudimentaire. Pour l'exemple précédent, j'ai sur la page un composant de pagination lié au dataTable (le composant paginator de IceFaces). Ce composant rend bien mieux que mes liens Next et Previous. Il se présente comme suit : << < 1 2 3 > >> et possède tout un tas d'options.
Mes questions sont au final les suivantes :
1 - Faut-il préférer la méthode 2 à la méthode 1 ? ou au contraire est-ce bien pensé de laisser le composant dataTable requêter tout seul la base de données ? si oui il faut m'expliquer comment gérer correctement les erreurs.
2 - Quelqu'un a-t-il trouvé une solution correcte pour paginer un tableau avec un composant de pagination qui tient la route graphiquement ?
3 - Quelqu'un a-t-il une autre solution que les méthodes 2 et 3 ?

J'attend vos retours. J'aimerai voir comment s'y retrouver avec JSF.
Merci d'avance.
Julien.