Projets
Pages enfant
  • 1.9.3 Ecriture des formulaires

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Commentaire: Migration of unmigrated content due to installation of a new plugin

...

Les balises <h:messages> et <h:message> sont traitées dans un paragraphe à suivre.

exercice
Ajouter une entrée dans la barre de navigation
Ajouter une entrée dans la barre de navigation

Ajouter une entrée Test1 dans la barre de navigation (_navigationItems.jsp) qui sera toujours affichée (pas d'attribut rendered) et dont l'action sera gotoTest1 (en dur).
Ajouter une règle de navigation (dans /properties/jsf/navigation-rules.xml) pour que la sélection de cet item envoie sur la vue /stylesheets/test1.jsp.
Tester.

 

Info

L'envoi vers test1.jsp ne doit pas marcher tant que la vue n'a pas été créée.

solution
  1. Dans _navigationItems.jsp, ajouter :  
    Bloc de code
    <h:menuItem id="test1" value="Test1" action="gotoTest1" />
    
    2. Dans navigation-rules.xml, ajouter :
    Bloc de code
    <navigation-rule>
     <from-view-id>*</from-view-id>
     <navigation-case>
       <from-outcome>gotoTest1</from-outcome>
       <to-view-id>/stylesheets/test1.jsp</to-view-id>
       <redirect/>
     </navigation-case>
    </navigation-rule>
    

exercice
Ajouter une page JSF
Ajouter une page JSF

Créer la page test1.jsp, (la créer à partir de about.jsp, en ne gardant que la barre de navigation) et tester (elle doit s'afficher).

Note : la page doit s'afficher maintenant qu'elle existe.

solution

Contenu de test1.jsp :

Bloc de code
 <%@include file="_include.jsp"%>

 <%@include file="_navigation.jsp"%>

exercice
Créer une règle de navigation
Créer une règle de navigation

Ajouter un formulaire avec un bouton Move sur la page, dont l'action gotoWelcome envoie sur la page welcome.jsp.

Info

Ajouter une règle de navigation dans le fichier /properties/jsf/navigation-rules.xml.

solution

1. Contenu de test1.jsp :

Bloc de code
<%@include file="_include.jsp"%>
<%@include file="_navigation.jsp"%>
  <h:form>
    <h:commandButton value="Move"
	action="gotoWelcome"/>
  </h:form>

2. Dans navigation-rules.xml, ajouter :

Bloc de code
<navigation-rule>
  <from-view-id>/stylesheets/test1.jsp</from-view-id>
  <navigation-case>
    <from-outcome>gotoWelcome</from-outcome>
    <to-view-id>/stylesheets/welcome.jsp</to-view-id>
    <redirect />
   </navigation-case>
</navigation-rule>

...

Bloc de code
package org.esupportail.example.web.beans;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserBean{
	/**
	 * Id of the user.
	 */
	@NotNull
	private String id;
	
        /**
	 * Display Name of the user.
	 */
	@Size(max = 10, min = 1)
        private String displayName;
	
	 
[...]
}

Pour utiliser javax.validation il faudra alors ajouter dans le pom.xml la dépendance suivante :

Bloc de code
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.0.0.GA</version>
			<scope>provided</scope>
		</dependency>

ou

Bloc de code

		<dependency>
			<dependency>
 <groupId>org.hibernate</groupId>
			 <artifactId>hibernate-validator</artifactId>
			 <version>4.0.2.GA</version>
		</dependency>

Exemple de contraintes :

  • @AssertFalse : doit être faux
  • @AssertTrue : doit être vrai
  • @DecimalMax : doit être un nombre inférieur ou égal à la valeur indiquée (représentation String d'un BigDecimal)
  • @DecimalMin : doit être un nombre supérieur ou égal à la valeur indiquée (représentation String d'un BigDecimal)
  • @Digits(integer=, fraction=) : doit être un chiffre (pour BigDecimal, BigInteger, String, byte, short, int, long)
  • @Future : doit être une date dans le future
  • Max @Max : doit être un nombre inférieur ou égal à la valeur indiquée
  • @Min : doit être un nombre supérieur ou égal à la valeur indiquée
  • @NotNull : ne doit pas être null
  • @Null : doit être null
  • @Past : doit être une date dans le passé
  • @Size(min=, max=) : doit avoir une taille comprise entre min et max (pour String et tableaux)
  • @Pattern(regex=, flag=) : doit respecter la regex indiquée
  • @Valid : doit être valide (pour un objet propriété d'un autre)

...

Bloc de code
<h:inputText value="#{sampleBean.userName}">
    <f:validateBean disabled="true" />
</h:inputText>
Gestion des messages

On peut définir le message qui sera affiché en cas d'erreur de validation en précisant un attribut message dans l'annotation

Bloc de code
@Size(max = 10, min = 1, message="{toto}")

Ici on utilise une clé (chaîne entre accolades) afin d'aller chercher le message dans un fichier de propriétés. Ce fichier doit se trouver dans le classpath et porter le nom ValidationMessages.properties

On peut le décliner ne fonction des langues ValidationMessages_en.properties, ValidationMessages_fr.properties

Mise à jour de propriétés par les formulaires (updateActionlistener)

...

exercice
Utiliser un updateActionListener
Utiliser un updateActionListener

Faire une vue test2.jsp qui s'appuie sur un contrôleur test2Controller qui possède une propriété chaîne de caractères value. Cette vue test2.jsp ne fait qu'afficher la valeur de value. Rajouter un bouton SetTest2Value à la vue test1.jsp et faire en sorte qu'appuyer sur ce bouton, mette dans test2Controller.value la valeur de myInput.

Info

Rajouter au passage une entrée dans la barre de navigation pour aller sur la vue test2.jsp depuis n'importe quelle page de l'application.

solution

1. Création de Test2Controller qui étend AbstractContextAwareController et qui contient l'attribut value :

Bloc de code
private String value;
public String getValue() {
  return value;
}
public void setValue(String value) {
  this.value = value;
}

2. Ajout dans controller.xml :

Bloc de code
<bean id="test2Controller"
      class="org.esupportail.formation.web.controllers.Test2Controller"
      parent="abstractContextAwareController"
      scope="session">
  <description>A bean to manage the test2 page.</description>
</bean>

3. Création de la page test2.jsp:

Bloc de code
<%@include file="_include.jsp"%>
<%@include file="_navigation.jsp"%>
 <h:form>
   <h:outputText value="#{test2Controller.value}"/>
 </h:form>

4. Modification du navigation-rules.xml :

Bloc de code
<navigation-rule>
  <from-view-id>/stylesheets/test1.jsp</from-view-id>
  <navigation-case>
    <from-outcome>gotoWelcome</from-outcome>
    <to-view-id>/stylesheets/welcome.jsp</to-view-id>
    <redirect />
  </navigation-case>
  <navigation-case>
    <from-outcome>gotoTest2</from-outcome>
    <to-view-id>/stylesheets/test2.jsp</to-view-id>
    <redirect />
  </navigation-case>
</navigation-rule>

5. Modification de test1.jsp :

Bloc de code
<%@include file="_include.jsp"%>
<%@include file="_navigation.jsp"%>
  <h:form>
    <h:messages/>
    <h:inputText value="#{test1Controller.myInput}" validator="#{test1Controller.validateMyInput}"/>
    <h:commandButton value="Move" action="#{test1Controller.callback}"/>
    <h:commandButton value="SetTest2Value" action="gotoTest2">
       <t:updateActionListener value="#{test1Controller.myInput}"
	                       property="#{test2Controller.value}"/>
    </h:commandButton>
  </h:form>

Remarque
titleOrdre des opérations en JSF
  • Appel des validateurs,
  • Affectation des valeurs des entrées de formulaires,
  • Appel des updateActionListeners,
  • Appel de la callback d'action du formulaire.

...