Je ne comprends pas les paramètres de passage dans la couture
-
05-07-2019 - |
Question
Au moment de déboguer mon application de couture, je me rends compte que je ne comprends pas vraiment comment fonctionne le passage de paramètres. La terminologie suivante m'a vraiment dérouté. Je pose donc cette question très générale dans l’espoir d’obtenir une bonne explication de ce qui fonctionne avec quoi et à quoi certaines choses servent.
Tout d’abord, vous pouvez utiliser les boutons h: commandButton ou s: button pour passer d’une page à l’autre. Je comprends que s: button ne soumet pas de formulaire, mais cela ne m’aide pas à comprendre la différence. Si vous ne soumettez pas un formulaire en passant d’une page à l’autre, que faites-vous?
Mon application implique la saisie d'informations dans un formulaire, la sélection d'un bouton, puis le passage à une nouvelle page affichant les résultats après l'exécution d'une requête. Il semble que j'ai vu cette activité se dérouler avec le bouton s:, alors comment se fait-il que si ce n'est pas & "Soumettre un formulaire &"; Je sens que je manque quelque chose de fondamental ici.
En ce qui concerne les paramètres eux-mêmes ... d'après ce que j'ai vu, vous pouvez passer les paramètres en utilisant l'une des 3 méthodes suivantes:
- f: param. Cela semble se produire plus souvent en combinaison avec s: button que h: commandbutton. Pourquoi est-ce?
- De même, vous pouvez " passer " (ou quelque chose) paramètres en utilisant votre fichier page.xml. Le paramètre semble devoir apparaître à la fois dans le fichier source page.xml et dans le fichier cible page.xml pour pouvoir apparaître dans l'URL.
- Enfin, il est possible d’ajouter une annotation @RequestParameter à votre bean de support. Je suppose que cela est également utilisé lorsque vous définissez f: param à votre avis. Cela signifie-t-il que celui de page.xml est négligé? Je remarque dans l'exemple d'enregistrement de la distribution de couture, que le bean utilisateur est rempli sans qu'aucun paramètre ne soit passé via page.xml pour f: param. Comment est-ce possible?
Je suis sûr que cette question révèle beaucoup d’ignorance.
Espérons que l’un de vous, personnes éloquentes, & "obtiendra &"; ce que je demande et donnez-moi une explication de ce processus.
Merci d'avance.
TDR
La solution
Si vous ne soumettez pas de formulaire avant le passant d'une page à l'autre, puis tu fais quoi?
Accéder à une autre page sans soumettre de champs de formulaire.
Mon application implique la saisie d'informations sous une forme, en appuyant sur un bouton, puis aller à une nouvelle page qui affiche résultats après l'exécution d'une requête. Il semble avoir vu cette activité prendre placer avec s: bouton
s: button ne soumettra pas le formulaire, les valeurs de votre page ne seront donc pas appliquées au modèle. Vous devez utiliser un bouton de commande / lien pour cela. L'activité que vous avez peut-être vue passe une valeur déjà renseignée dans une autre page.
f: param
Utilisé plus souvent avec s: button / link car ils sont souvent utilisés pour la navigation. Vous pouvez utiliser f: param pour transmettre une valeur déjà renseignée à une autre page. h: le bouton de commande / lien est utilisé pour la soumission de formulaires afin que les valeurs soient dans les champs de formulaire. Bien sûr, rien ne vous empêche d’utiliser f: param pour cela.
page.xml
les paramètres utilisés ici servent à appliquer des paramètres de requête au modèle et inversement.
@RequestParameter
Peut être utilisé avec tout ce qui précède, mais est un peu inutile lorsqu'il est utilisé avec les paramètres page.xml car ils peuvent être utilisés pour le même travail
Exemple
Si vous commencez par cette page:
http://mydomain.com/myapp/home.seam?name=damo
Et le home.page.xml a:
<param name="name" value="#{person.name}"/>
Ensuite, lorsque la page sera chargée, person.setName("damo")
sera appelé car il existe un paramètre de requête correspondante dans l'URL.
Vous pouvez stocker la valeur du paramètre dans le lien vers la page suivante:
<s:link value="Go to Page 2" view="/page2.xhtml">
<f:param name="name" value="#{person.name}"/>
</s:link>
Lorsque vous cliquez sur le lien et accédez à http://mydomain.com/myapp/page2.seam Et le page2.page.xml a:
<param name="name" value="#{someOtherBean.name}"/>
Ensuite, someOtherBean.setName("damo")
sera appelé.
La page2 peut avoir un bouton s: comme ceci:
<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
<f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>
Et la méthode pourrait être:
@Name("someOtherBean")
public class SomeOtherBean {
@RequestParameter("subject") //same value as the 'name' in f:param
private String subject;
public void sayHello() {
System.out.println("Hello "+subject);
}
}
J'espère que ça aide!
Autres conseils
Il existe déjà une excellente réponse à cette question. J'essaie simplement d'ajouter des informations supplémentaires.
Si vous ne soumettez pas un formulaire en passant d’une page à l’autre, que faites-vous?
- Déjà analysé dans la réponse de @ Damo
- Effectuez une validation côté client ou exécutez un javascript avant de passer à la page suivante à l'aide de
onclick
l'attribut du bouton. - Appelez une méthode dans un bean en utilisant l'attribut
action
.
Mon application implique la saisie d'informations dans un formulaire, la sélection d'un bouton, puis le passage à une nouvelle page affichant les résultats après l'exécution d'une requête. Il semble que j’ai vu cette activité se dérouler avec s: button
- Comme mentionné dans la réponse de @Damo,
<s:button>
/<s:link>
n'envoie pas le formulaire, vous pouvez donc exécuter votre requête en deuxième page, mais sûrement sans les données saisies auparavant. - Mais si vous avez utilisé des balises
<a4j:support>
/<a4j:ajax>
avec les champs de saisie de votre première page, vous pouvez accéder à ces données dans votre deuxième page si vous êtes dans une longue conversation ou si votre bean est à périmètre de session. Si vous voyez les données du formulaire sur votre deuxième page, cela pourrait en être la raison.
Il est possible d’ajouter une annotation @RequestParameter à votre bean de support. Je suppose que cela est également utilisé lorsque vous définissez f: param à votre avis. Cela signifie-t-il que celui de page.xml est oublié?
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Oui, la valeur définie par le paramètre page.xml
sera remplacé. Regardez l'exemple suivant.
Supposons que votre getter
a la ligne suivante.
<param name="name" value="#{myBean.name}"/>
et votre bean a setter
et name
des méthodes pour la propriété setName
et vous définissez la variable property
comme suit.
@RequestParameter
String name;
Maintenant, si vous appelez la page comme ceci.
http://...../app_name/home.seam?name=william
le <=> sera appelé et le nom <=> est défini sur & "william &";.
.Supposons maintenant que vous définissiez votre variable comme ceci.
@RequestParameter("userName")
String name;
Et appelez la page comme ceci.
http://...../app_name/home.seam?name=william&userName=tony
La <=> méthode est encore appelée et la propriété <=> est définie sur & "william &"; Mais alors cette valeur est remplacée par la valeur & Quot; tony & Quot;.