JSF meilleure Façon de passer des paramètres
je suis actuellement en train de travailler avec la JSF, mais depuis que je suis un vieux et grincheux php-dev j'ai toujours du mal avec le Paramètres d'une requête. (En PHP, vous pouvez accéder à la demande Paramerts quand vous le souhaitez, à l'aide de la $_GET["paramname"]
Tableau.
Maintenant, je suis en train de travailler sur un Utilisateur de Gestion du Système. (CRUD) Habituellement, je aller avec une liste de tous les utilisateurs disponibles, les options ayant comme modifier /supprimer. Le lien modifier est alors pointant vers http:\\localhost\editUser.xhtml?userId=5
par exemple.
J'ai également un Contrôleur appelé UserEditController
qui, fondamentalement, détient l'entité utilisateur et appelle la mise à jour.
Donc, à l'intérieur de ce Contrôleur, je suis en utilisant le @PostConstruct
Annotation à la charge de l'utilisateur avec l'id 5 de l'instance DataService et de le stocker à l'intérieur d'une propriété.
Problème est ici: Wenn entrer PostConstruct-Méthode dans le APPLY_REQUEST_VALUES
-Phase im pas en mesure d'accéder à la requête de Paramètre de la Carte de Visages Contexte (retournera null pour userId)
Contrôleur (simplifié):
@Named
@RequestScoped
UserEditController{
@Inject
private UserDataService userDataService;
private User currentUser;
@PostConstruct
public void initValues(){
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userId");
this.currentUser = userDataService.getUserById(id);
}
public String saveCurrentUser(){
userDataService.updateUser(this.currentUser);
return "userManagement"; //return to overview after saving
}
//getter and setter
}
Cela fonctionne comme intened. Les Champs sont maintenant liés à propriétés de l'utilisateur comme #{userEditController.currentUser.forename}
etc.
J'ai maintenant ajouté un bouton "enregistrer" avec l'attribut action {userEditController.saveCurrentUser()}
Cependant le script puis pénètre dans la APPLY_REQUEST_VALUES
-Phase Et le UserEditController de initValues est appelé à nouveau.
- il en résulte un nullpointer Exception, lorsque vous essayez d'accéder à la RequestParameterMap
- et, évidemment, je ne veux pas recharger l'utilisateur AVANT de l'enregistrer 🙂
Cela sonne comme une question stupide, mais je pense que je vais gâcher entre le PHP et le JSF-Style de gérer les choses.
Toute Aide serait appréciée.
Vous devez vous connecter pour publier un commentaire.
La façon la plus commune de passe de l'utilisateur (ou nom d'utilisateur) à votre BackingBean, est en utilisant l'une des options suivantes:
http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/
Je pense que le principal problème, c'est que votre bean est
@RequestScoped
. Si vous appuyez sur le bouton enregistrer sur votre edit-page vous envoyer une nouvelle demande, une nouvelle instance de la portée de la requête bean sera créé. Il suffit de changer votre fève de@ViewScoped
.Plus d'infos:
ConversationScoped
bean etconversation.begin()
lors de la configuration de l'utilisateur à modifier, avecconversation.end()
lors de l'enregistrement de l'utilisateur. Votre post m'a orienté dans la bonne direction, j'ai donc du taux d'elle, même si elle n'est pas "la solution".J'ai essayé de le modifier pour ViewScoped mais alors sa terminant par "appeler le constructeur" de la fève à chaque fois que je accéder à la propriété...
Pendant ce temps j'ai essayé beaucoup de choses, rien n'a fonctionné comme prévu:
Le SEUL cas où je peux l'obtenir pour fonctionner est de définir les Contrôleurs "SessionScoped". Mais je ne pense pas que c'est une bonne approche, car j'aurais besoin de prendre soin de "nettoyage" des valeurs et causer beaucoup de unneded (initialisé) haricots...
J'ai créé un Projet simple à jouer autour. Heres la Session de l'Étendue de la Version de travail. Mais si je change la portée, j'aurais besoin de "recharger" l'utilisateur en cours au moment de frapper le bouton enregistrer. Et sans accès aux paramètres de la requête je n'ai aucune idée, comment faire pour y parvenir.
(j'ai essayé en passant l'identifiant de nouveau avec la "forme", mais j'ai des problèmes pour transmettre l'id "pour la première fois")
Heres mon exemple. (Getter et Setter sont disponibles et ne sont pas mentionnés à le garder court)
Classe Utilisateur:
DBSimulator:
UserManagement-Contrôleur:
UserEdit Contrôleur
et, enfin, les deux fichiers XHTML:
UserManagement.xhtml
UserEdit.xhtml
ps.: Je ne veux pas quelqu'un de "corriger" mon code mais peut-être avec l'exemple complet, quelqu'un est en mesure de voir où mon headeck vient 🙂
De travail avec ViewScoped Haricots génère la suite de la console de Sortie:
Et, évidemment, l'utilisateur n'est pas défini plus, parce que l' (ViewScoped) UserEditController a été reconstruit deux fois après la mise à l'utilisateur...