2009-11-12 4 views
2

J'ai cette option select:JSF 1.2 - Problème avec la page de passage compte de haricots pour créer la liste

<f:verbatim>Pages: </f:verbatim> 
<h:selectOneMenu id="selectPage" value="#{pageList.selectedPage}"> 
    <f:selectItems value="#{pageList.selectPages}" /> 
</h:selectOneMenu> 

Et la fève de support (appelé mybean2) pour cela est:

private int pages; 

public void getPages(int Pages) 
{ 
this.pages = Pages; 
} 

// getter methods 
public List<SelectItem> getSelectPages() 
{ 
selectPages = new ArrayList<SelectItem>(); 
     pages++; 
     for (int i = 1; i > pages; i++) { 
     selectPages.add(new SelectItem(Integer.toString(i), Integer.toString(i))); 
     } 

    return selectPages; 
} 

public String getSelectedPage() 
{ 
    return selectedPage; 
} 

// setter methods 
public void setSelectPages(List<SelectItem> selectPages) { 
     this.selectPages = selectPages; 
} 

public void setSelectedPage(String selectedPage) { 
    this.selectedPage = selectedPage; 
} 

La méthode getPages ci-dessus obtient le nombre de pages de mybean1.submit méthode. Ainsi, par exemple, lorsque le soumettre méthode renvoie 30, comment suis-je en mesure de transmettre cette valeur dans la méthode getSelectPages afin qu'il puisse créé dynamiquement le nombre de pages comme dans:

for (int i = 1; i > pages; i++) { 

, je veux aussi mybean2 être générique, c'est-à-dire que je ne veux pas que d'autres beans soient référencés directement dans mybean2. Par exemple, je ne veux pas faire référence comme celui-ci dans les mybean2:

mybean1 mb1 = new mybean1(); 
pages = mb1.getPages(); 

Sinon, je dois déclarer des instances distinctes d'autres haricots (environ 12 autres) qui envoient des pages à compter mybean2 pour elle à l'action - ce le chemin serait trop désordonné ...

Tout exemple de conseil ou de code est très apprécié. Merci.

+0

Je suis un peu confus. Vous parlez de 'mybean1' et' mybean2', mais je ne vois que 'pageList' dans votre code. Lequel est lequel? – BalusC

Répondre

1

Si vous voulez que votre mybean2 pour être générique, vous pouvez mettre le haricot spécifique comme une variable de session/demande et dans votre mybean2 il obtient de cette portée.
Code pour la mise en haricot portée de la session:

FacesContext context = FacesContext.getCurrentInstance(); 
Map sessionMap = context.getExternalContext().getSessionMap(); 
sessionMap.put("beanName", yourBean); 

Dans votre mybean2 vous obtiendrez le haricot en cours par:

FacesContext context = FacesContext.getCurrentInstance(); 
Map applicationMap = context.getExternalContext().getApplicationMap(); 
GetPagesInterface yourBean = (GetPagesInterface)applicationMap.get("beanName"); 

Pour le code ci-dessous vous pouvez mettre ce code dans les méthodes et créer haricot utilitaire pour que . Aussi la méthode public void getPages(int Pages) devrait être comme méthode dans l'interface (GetPagesInterface) que tous les beans devraient implémenter.

En plus, dans le code que vous avez collé vous avez une mauvaise erreur, le code:

pages++; 
    for (int i = 1; i > pages; i++) 

vous devez remplacer par:

for (int i = 1; i > pages+1; i++) 

parce metod getSelectPages pourrait être appelé à plusieurs reprises et qui être augmenter la valeur de vos pages.

+0

Si j'ai configuré mes autres beans dans faces-config.xml, je rassemble cette instruction: Map applicationMap = context.getExternalContext(). GetApplicationMap(); me permettrait de la valeur de l'attribut managed-bean-name? Je n'ai démarré que sur JSF il y a plus de 3 semaines (je n'en suis encore qu'à ses débuts), donc je ne suis pas vraiment sûr d'écrire le GetPagesInterface. Avez-vous un exemple de comment faire cela? S'il vous plaît aider. Actuellement, j'obtiens le nombre de pages de la base de données via une méthode dans mybean1. Je ne sais pas comment convertir cette méthode à GetPagesInterface que vous avez mentionné. – icepax

+0

@icepax. GetPagesInteface est votre nouvelle interface que vous devez créer et c'est un nom temporaire inventé par moi. Utiliser getApplicationMap() n'est pas une bonne idée car c'est une configuration complète de l'application (vous avez une application très simple). De quoi apprends-tu JSF? Peut-être que vous envisagez un cours JavaPassion gratuit de vistit (http://www.javapassion.com/j2ee/#JavaServer_Faces_JSF) un examen de votre code après. Je pense que le problème que vous voulez résoudre est facile, mais vous essayez de le faire de manière incorrecte. – cetnar

0

En tant que cetnar says, vous pouvez rechercher des valeurs directement à l'aide du FacesContext. Vous pouvez également injecter la valeur via la configuration faces-config.xml. Dans ce descripteur exemple, un haricot coûteux à créer est conservé dans la session et injecté dans un haricot champ de demande lorsque, au besoin:

<managed-bean> 
    <managed-bean-name>expensiveBean</managed-bean-name> 
    <managed-bean-class>lifetime.ExpensiveBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
    <managed-bean-name>requestBean</managed-bean-name> 
    <managed-bean-class>lifetime.RequestBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>cachedAsset</property-name> 
     <property-class>lifetime.ExpensiveBean</property-class> 
     <value>#{expensiveBean}</value> 
    </managed-property> 
    </managed-bean> 

L'avantage de cette approche est que vous pouvez garder votre modèle libre Dépendances JSF, ce qui facilite leur test unitaire.Ce n'est pas toujours possible de le faire, bien sûr. Voir le JSF spec pour plus de détails sur les règles d'injection de propriété (vous voulez probablement la spécification 1.2).

0

Résolu. Il suffit de déplacer le code pour calculer les pages de mybean1 à mybean2.

@BalusC. Salut Baulke - pageList est mybean2. Désolé, j'essayais de le simplifier. Mybean1 est l'endroit où je traite la méthode submit pour obtenir le nombre de pages à passer à pageList (aka mybean2). Quoi qu'il en soit, j'ai déjà résolu ce problème.

Cependant, il serait intéressant de savoir comment procéder avec l'injection de dépendance (DI). Je suis passé par la spécification JSF 1.2 mais il n'y avait pas d'exemple sur DI que je pourrais suivre. Je pense que ma méthode fonctionne bien pour moi.

Questions connexes