Règle de navigation conditionnelle dans JSF 2.0
JSF 2 est livré avec une règle de navigation conditionnelle très flexible pour résoudre le flux de navigation de page complexe, voir l'exemple de règle de navigation conditionnelle suivant:
1. Page JSF
Une simple page JSF, avec un bouton pour passer de cette page à la page de paiement.
start.xhtml
This is start.xhtml
2. Bean géré
Un bean géré pour fournir des exemples de données pour effectuer la vérification conditionnelle dans la règle de navigation.
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
@ManagedBean
@SessionScoped
public class PaymentController implements Serializable {
private static final long serialVersionUID = 1L;
public boolean registerCompleted = true;
public int orderQty = 99;
//getter and setter methods
}
3. Règle de navigation conditionnelle
Normalement, vous déclarez la règle de navigation simple dans le "faces-config.xml" comme ceci:
start.xhtml payment payment.xhtml
Avec JSF 2, vous pouvez ajouter une vérification conditionnelle avant de passer à la page de paiement, voir ce qui suit:
faces-config.xml
start.xhtml payment #{paymentController.orderQty < 100} ordermore.xhtml payment #{paymentController.registerCompleted} payment.xhtml payment register.xhtml
C'est égal au code Java suivant:
if (from-view-id == "start.xhtml"){
if(from-outcome == "payment"){
if(paymentController.orderQty < 100){
return "ordermore";
}else if(paymentController.registerCompleted){
return "payment";
}else{
return "register";
}
}
}
Le code devrait être suffisamment explicite.
Note
Dans la règle de navigation conditionnelle, la séquence de la règle de navigation affecte le flux de navigation, placez toujours la priorité de vérification la plus élevée en haut.
4. Essai
Différents ensembles de données pour les tests:
Exemple 1
public class PaymentController implements Serializable {
public boolean registerCompleted = true;
public int orderQty = 99;
...
Lorsque le bouton est cliqué, il atteint le critère «paymentController.orderQty < 100» et se déplace vers la page «ordermore.xhtml».
Exemple 2
public class PaymentController implements Serializable {
public boolean registerCompleted = true;
public int orderQty = 200;
...
Lorsque le bouton est cliqué, il atteint le critère "paymentController.registerCompleted" et passe à la page "payment.xhtml".
Exemple 3
public class PaymentController implements Serializable {
public boolean registerCompleted = false;
public int orderQty = 200;
...
Lorsque le bouton est cliqué, il a échoué à tous les critères de vérification et passer à la page "register.xhtml".
Suggestion
Dans JSF 2.0, il n'y a pas de balise "else" dans la règle de navigation conditionnelle, je souhaite que l'équipe JSF puisse inclure la balise "else" dans la prochaine version. Par exemple,
start.xhtml payment #{paymentController.orderQty < 100} ordermore.xhtml #{paymentController.registerCompleted} payment.xhtml register.xhtml
De plus, il devrait également inclure la vérification conditionnelle multiple, comme ceci
start.xhtml payment #{paymentController.orderQty < 100} && #{paymentController.xxx} ordermore.xhtml #{paymentController.registerCompleted} payment.xhtml register.xhtml
Thought…
Règle de navigation conditionnelle JSF 2,… assez similaire avec Spring Web Flow, non? :)
Télécharger le code source
Téléchargez-le -JSF-2-Conditional-Navigation-Example.zip (11 Ko)