L'appel de méthodes de JSF page doutes
J'ai quelques questions au sujet de la façon dont je l'appel de méthodes à EL. Peut-être que quelqu'un pourrait expliquer comment il fonctionne réellement.
J'ai fait cet exemple très simple:
index.xhtml
<h:body>
<!-- Using a method -->
#{bba.salute()}
<br/>
<h:outputText value="#{bba.salute()}"/>
<br/>
<!-- Using a method from an injected bean-->
#{bba.b.doSomething()}
</h:body>
BackBeanA.java
@Named("bba")
@SessionScoped
public class BackBeanA implements Serializable {
private static final long serialVersionUID = 5671761649767605303L;
@Inject
private BackBeanB b;
public String salute() {
return "Hi! I am 'A'";
}
public BackBeanB getB() {
return b;
}
public void setB(BackBeanB b) {
this.b = b;
}
}
BackBeanB.java
@Named("bbb")
@SessionScoped
public class BackBeanB implements Serializable {
private static final long serialVersionUID = -4786092545430477941L;
public String doSomething() {
System.out.println("Hello!!!");
return "I am a SessionScopped Backing Bean, my name is 'B' and i am doing something";
}
}
Ce sont les questions que j'ai:
-
Lorsque j'appelle une méthode d'un backing bean, quand dois-je utiliser les parenthèses (), et quand je n'en ai pas besoin? Exemple: Si j'ai enlever les crochets de
#{bba.salute()}
, j'obtiens une erreur, qui dit: (Ne peut pas trouver une propriété appelée 'salut') -
Je veux aussi apprendre à appeler une méthode d'un bean injecté. J'ai injecté BackBeanB, à l'intérieur de BackBeanA, mais quand je dis
#{bba.salute()}
dans la page, je ne vois pas le message que j'ai de la méthode dansBackBeanB
. Pourquoi est-ce? Injecté haricots n'ont pas besoin d'être initialisé dans@PostConstruct
droit? Sont les getters et setters pour le bean injecté assez? -
Remarque la ligne où je dis
<h:outputText value="#{bba.salute()}"/>
, il fonctionne, mais eclipse affiche un message d'avertissement comme ceci:Pourquoi est-ce?
- Quant à votre commentaire: "// Le champ d'application de ce bean ne peut être plus de la fève qui le contient.". Ce n'est pas vrai lors de l'utilisation de CDI. Supprimer le commentaire, il ne confondez-vous et futurs responsables.
- Merci pour les conseils je vais l'enlever
Vous devez vous connecter pour publier un commentaire.
Lorsque vous écrivez
#{myBean.salute}
, JSF est à la recherche pour le propriétésalute
. Dans le code Java, il est "traduit" àmyBean.getSalute();
. En d'autres mots, vous devez fournir à la lecture de cette propriété (et, éventuellement, le setter si cette propriété peut être modifiée par JSF, lorsqu'il est utilisé dans un champ de saisie par exemple).Lorsque vous écrivez
#{myBean.salute()}
vous faites référence à l' méthodesalute()
.La règle est assez simple: utiliser une méthode lorsque vous voulez faire une action (c'est à dire, généralement, il sera définie à l'intérieur d'un
action
ouactionListener
attribut). Dans les autres cas, l'utilisation d'une propriété.Dans votre exemple, vous voulez afficher du texte dans votre page, de sorte qu'au lieu d'appeler
#{myBean.salute()}
, il suffit d'appeler#{myBean.salute}
.Pour le deuxième point, essayez de modifier votre code pour accéder à la propriété
something
au lieu de la méthode:et dans
BeanB
code:Concernant votre dernier point, je pense que votre Eclipse n'a tout simplement pas gérer la EL 2.0 syntaxe.
#{bean.getSalute()}
2) si vous n'êtes pas à l'aide de Glassfish plugin / JBoss tools, il suffit de désactiver EL validation dans Eclipse.