web-dev-qa-db-fra.com

Obtenir les valeurs des paramètres de requête en JSF

J'ai un composant <odc:tabbedPanel/>. À l'intérieur de cela, j'ai une page dans le composant <odc:bfPanel/>. Je souhaite accéder à une valeur (d'un inputtext ou d'un radiobutton) à partir de la page dans le <odc:bfPanel/> dans ma classe de beans gérés <odc:tabbedPanel/>. S'il vous plaît, guidez-moi sur la façon de procéder. Veuillez noter ici que je ne veux pas utiliser la session ici. Je le veux uniquement sur demande. J'ai essayé les options ci-dessous mais elles n'ont pas fonctionné pour moi.

première option

String value = (String) ctx.getExternalContext()
                        .getRequestParameterValuesMap()
                        .get("managedbean.property");

option deux

String value = (String) ctx.getExternalContext()
                         .getRequestParameterValuesMap()
                         .get("property");

option trois

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance()
                         .getExternalContext().getRequest();
System.out.println(req.getParameter("property"));

option quatre

Map requestMap = FacesContext.getCurrentInstance() 
                         .getExternalContext().getRequestHeaderValuesMap(); 
String msgId = (String) requestMap.get("property"); 
System.out.println(msgId);

option cinq

HttpServletRequestWrapper r = new HttpServletRequestWrapper(req);
String value1 = r.getParameter("managedbean.property");

je veux que la valeur ne soit pas dans le bean géré de jsp ... mais je le veux dans un autre bean géré. Ici, j'ai des pages dans une page (comme je l'avais mentionné, c'est un panneau à onglets). Maintenant, je veux la valeur dans le haricot géré de l'onglet externe - 

20
user265950

Laissons d’abord expliquer pourquoi les options que vous avez essayées n’ont pas fonctionné:

Les options 1 et 2 ne sont pas valides car elles renvoient les valeurs (!!) sous la forme String[] et non une valeur unique sous la forme String.

L'option 3 devrait fonctionner si le paramètre était là. Mais ce n’est pas une belle façon JSF.

L'option 4 n'est pas valide car les paramètres ne sont pas définis dans l'en-tête de la demande.

L'option 5 est invalide car elle n'a aucun sens. Vous ajoutez seulement une couche abstraite supplémentaire entre les deux qui ne change en fait rien ici.


La méthode JSF-ish serait l’utilisation de ExternalContext#getRequestParameterMap() :

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
String param = parameterMap.get("paramName");

Il est probable que l’option 3 ne fonctionne pas car le nom du paramètre n’est pas ce que vous pensez/attendez. JSF, à savoir, ajoute les ID de client (Woodstocks) en fonction des composants parent UINamingContainer dans l'arborescence de la vue. Cliquez avec le bouton droit de la souris sur la sortie HTML générée de la page JSF dans votre navigateur Web et choisissez Voir la source. Examinez le nom de l'élément d’intérêt <input> généré. Utilisez that name à la place comme nom de paramètre.


Cela dit, il s’agit d’une solution de contournement et non d’une solution. Mais nous ne pouvons pas raisonnablement suggérer la solution real car l'exigence fonctionnelle et le code que vous avez ne sont pas parfaitement clairs. Vous liez normalement les éléments d’entrée à un bean de support. Si vous vous trouvez dans un bean de support différent, vous pouvez également simplement accéder à ce bean de support depuis l'intérieur du bean de support, puis accéder à son tour à la valeur d'entrée associée. Voir Injecter des beans gérés les uns dans les autres pour savoir comment.

28
BalusC

Le fait que vos contrôles se trouvent dans les panneaux IBM ODC n'est pas pertinent.

En règle générale, vous liez le contrôle d'entrée à une valeur de bean géré.

Définition de haricot:

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Voir les tags:

<!-- needs to be inside a form control -->
<h:inputText value="#{demo.foo}" />
<h:commandButton value="Click Me" action="#{demo.invokeMe}" />

Haricot:

package foo;
public class MyManagedBean {
  private String foo;
  public String getFoo() { return foo; }
  public void setFoo(String foo) { this.foo = foo; }

  public String invokeMe() {
    System.out.println(foo);
    return null; //no navigation
  }
}

Si vous souhaitez lier votre contrôle d'entrée à un bean différent de celui avec la logique d'application, vous pouvez utiliser l'injection de propriété pour faire référence à l'autre bean.

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>propName</property-name>
    <value>#{someExpression}</value>
  </managed-property>
</managed-bean>

Vous pouvez rechercher des éléments directement via le contexte ou utiliser les classes d'expression pour résoudre des éléments via du code, mais il s'agit d'une approche plus propre.

2
McDowell

Je ne comprends pas exactement votre question. Si inputtext ou radiobutton est correctement lié à une valeur dans un bean de support, vous pouvez accéder à la valeur directement en Java. Si ce qui vous intéresse est la recherche programmée d'un bean géré, c'est comme cela que je le fais:

FacesContext facesContext = FacesContext.getCurrentInstance();
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean");
0
ewernli