salut,
je cherche à construire des backingbean xxxAction avec la règle 1 par page jsp ET uniquement en portée request.
Ensuite le bean utilise une classe xxxForm qui contient tous les composants bindés avec la vue, ainsi qu'une classe xxxModel qui contient toutes les données préparée pour être affichées par la vue.
De plus j'utilise un VariableResolver de Spring pour injecter les services métiers dans le bean. Toutefois, cette opération ne s'effectue qu'une fois le constructeur du bean terminé...
un petit peu de code...
le bean managé par jsf sous le nom listeProjetAction :
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
30
31
32
33
34
35 public class ListProjetAction { public ListProjetForm view; public ListProjetModel model; private List<Collaborateur> listCdP; public ListProjetAction(){ view = new ListProjetForm(); model = new ListProjetModel(); } //############################################################################# // BINDING //############################################################################# public HtmlSelectOneListbox getCpSelected(){ return view.getCpSelected(); } //############################################################################# // DATA //############################################################################# public List<SelectItem> getListChefProjet(){ model.setListCdP(service.getCdP()); return model.getListChefProjet(); } //############################################################################# // ACTIONS //############################################################################# public void action1(){} public String action2(){ return "detail"; }
et le xxxModel
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
30
31 public class ListProjetModel { List<Collaborateur> listCdP; // Liste d'objets métiers ou de VO /** * Liste des items à afficher par le composant html */ private List<SelectItem> listChefProjet; public ListProjetModel() { listChefProjet = new ArrayList<SelectItem>(); } public List<SelectItem> getListChefProjet() { // FAUT IL APPELER LE SERVICE ICI ou suppose t'on que c'est DEJA INITIALISE? listChefProjet= new ArrayList<SelectItem>(); if (listChefProjet != null ){ for ( Collaborateur c : listCdP ){ listChefProjet.add(new SelectItem(c.getId(), c.getNom()); } } return listChefProjet; } public void setListChefProjet(List<SelectItem> listChefProjet) { this.listChefProjet = listChefProjet; } }
Le xxxForm
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 public class ListProjetForm { /** * Binding composant selection du chef de projet. */ private HtmlSelectOneListbox cpSelected; public ListProjetForm(){ buildComponent(); } private void buildComponent(){ cpSelected = new HtmlSelectOneListbox(); } public HtmlSelectOneListbox getCpSelected() { return cpSelected; } public void setCpSelected(HtmlSelectOneListbox cpSelected) { this.cpSelected = cpSelected; } }
et le code de la jsp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <h:selectOneListbox size="1" id="idCP" binding="#{listProjetAction.cpSelected}" styleClass="textA"> <f:selectItems value="#{listProjetAction.listChefProjet}"/> </h:selectOneListbox>
* le 1er pb est le suivant: Si je veux initialiser des données en provenance des services, alors :
- soit je dois le faire en dehors du constructeur
- soit, pour ceux qui connaissent spring, faire un appel explicite au WebApplicationContext.getBean("monService") ce qui du coup supprime l'interet de l'initialisation par jsf...
En fait la spécif 1.1 ne propose pas de fonctionalité post/pré-constructeur, donc j'utiise actuelement l'initialisation dans le constructeur.
*le 2eme soucis, si j'utilise la navigation dynamique, qui consiste à interoger le bean pour connaitre l'outcome, c'est tout le bean xxxAction qui est construit par un appel au constructeur, car on est en portée request... Du coup, juste pour retourner un outcome, je reconstruit tout le bean alors qu'il ne sera peut être jamais affiché! C'est vraiment lourd.
Alors ma question, comment et a quel moment réaliser la construction des composants contenus xxxForm et l'initialisation des données (dans la classe xxxModel), données qui sont récupérées à partir des services métiers de la classe xxxAction ou d'autres paramètres???!!!
Ma solution consiste à réaliser les initialisation dans les getters de la classe Action, qui va initialiser le/les champs du Model et le retourner...
Qu'en pensez vous? Merci de m'éclairer et dite moi en plus sur votre facon de faire, si vous voyez des avantages/inconvénients...
Partager