Session d'accès étendue de haricot de la portée de la requête bean
Je suis en train d'utiliser un motif trouvé sur un IceFaces page.(Je ne suis pas en utilisant IceFaces, à l'aide de PrimeFaces)
Dans ce cas, j'ai deux grains:
UserController et Usermodel
Sur mon UserModel j'ai un exemple de UserVO (créé par un autre programmeur).
Sur Mon UserController j'ai ceci:
@ManagedBean
@RequestScoped
public class UserController implements Serializable
{
private static final long serialVersionUID = 1L;
private UserBO bo;
private UserModel model;
public UserController()
{
bo = new UserBO();
model = new UserModel();
}
public void Login() throws IOException
{
model.setUserVo(bo.executeLogin(model.getUserVo()));
ExternalContext externalContent = FacesContext.getCurrentInstance().getExternalContext();
if (!model.getUserVo().isError())
{
model.setLoggedIn(true);
externalContent.getSessionMap().put("userSession", model);
externalContent.redirect(externalContent.getRequestContextPath() + "/views/request/search.html");
} else
{
model.setLoggedIn(false);
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, model.getUserVo().getMessage(), model.getUserVo().getLogin());
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
}
}
public UserBO getBo()
{
return bo;
}
public void setBo(UserBO bo)
{
this.bo = bo;
}
public UserModel getModel()
{
return model;
}
public void setModel(UserModel model)
{
this.model = model;
}
}
Comme vous pouvez le voir, j'ai créer une nouvelle instance de UserModel et avec ce qui a été renvoyé de la bo.executeLogin()
et il est au travail, mon objet est retourné.
S'assurer que l'utilisateur est connecté, j'ai un bien sur mon UserModel:
@ManagedBean
@SessionScoped
public class UserModel
{
private UserVO userVo;
private Boolean loggedIn = false;
public UserModel()
{
userVo = new UserVO();
}
public UserVO getUserVo()
{
return userVo;
}
public void setUserVo(UserVO userVo)
{
this.userVo = userVo;
}
public Boolean getLoggedIn()
{
return loggedIn;
}
public void setLoggedIn(Boolean loggedIn)
{
this.loggedIn = loggedIn;
}
J'ai un modèle.xhtml avec:
<ui:fragment rendered="#{userModel.loggedIn}">
<ui:include src="../includes/top.xhtml"/>
</ui:fragment>
Et le truc, c'est qu'il n'est pas de travail, n'est pas le loggedIn
la valeur de la propriété.
Ma conjecture est que l'accès de cette façon, je suis un peu en créant une nouvelle instance de UserModel, si oui, c'est un problème parce que mon UserController n'est pas de session étendu, seuls les UserModel
MODIFIER
Au lieu d'utiliser ce loggedIn
bien je sais que je peux simplement de vérifier si le UserModel userVo
propriété est définie, mais le problème est sur la session d'étendue de haricot, je ne peux pas y accéder à partir de UserController, où il est défini, car il n'est pas l'étendue de la session, et mon modèle.xhtml sera utilisé par chaque page.
désolé mec, je n'ai pas le lien plus et ne pouvez pas le trouver, mais voici quelques utiles. stackoverflow.com/questions/7223055/... et stackoverflow.com/questions/5104094/... sur ce deuxième lien de vérifier la réponse choisie, c'est une explication fondée sur la IceFaces post, j'espère que ça aide
OriginalL'auteur Gerep | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
Au lieu de créer un nouveau
UserModel
instance dans votreUserController
, injecter@ManagedProperty
.Dans
UserController
:Alors vous n'avez pas l'instancier dans le constructeur et sera toujours obtenir la séance d'étendue instance de
UserModel
dans votre contrôleur.Mise à JOUR:
Je pense que vous êtes qui complique le processus de connexion avec votre stricte approche MVC. Dans JSF les frontières entre le modèle, la vue et le contrôleur sont un peu floues ou qui se chevauchent.
Je recommande la lecture de cette question est intéressante, et les réponses et surtout cette réponse pour plus d'informations sur ce sujet.
À votre problème concret. Je ne suis pas tout à fait sûr de ce qui est la raison, mais ce que vous devez absolument éviter, c'est de créer une instance de bean géré par vous-même et de jouer avec les deux injecté et de l'auto-initialisé instances de beans.
Aussi je vous recommande de fusionner vos haricots dans un seul haricot. Ensuite, vous n'avez pas de problèmes avec les dépendances circulaires et des références nulles.
@ManagedProperty
, droit?@ManagedProperty
peut être utilisé pour injecter un haricot ou le champ de la même ou une plus grande portée. Donc il fonctionnera à partir de SessionScope en RequestScope mais pas l'inverse. Si vous voulez obtenir le gérée par le conteneur instance d'un bean, toujours utiliser l'injection (ou look-up comme alternative), mais ne pas instancier la classe.Merci beaucoup, j'ai gâché quelques heures sur elle =)
Je recommande BalusC Communication en JSF 2.0. 🙂
Pas de problème ;-). Je vous recommande de lire les liens dans ma réponse de mise à jour (juste corrigé les liens brisés).
OriginalL'auteur Matt Handy
(ce qui a été posté sur https://stackoverflow.com/questions/10691324/working-with-3-java-beans-controller-backing-model, mais l'OP supprimé la question et je n'ai pas envie de jeter la réponse, je pense un repost sur cette question est adapté aussi bien)
Vous avez sans doute été de trop mettre l'accent sur ce ICEfaces blog qui contient principalement non-sens.
Vous devriez avoir un seul JSF managed bean qui agit comme un contrôleur, vous l'avez déjà:
UserController
. Vous devriez faire un bean entité qui représente le modèle, vous l'avez déjà:UserVO
. Vous devriez avoir un haricot d'entreprise qui représente le service, vous l'avez déjà:UserBO
. Ces deux derniers n'ont pas besoin d'être JSF géré haricots.Basé sur votre question de l'histoire, vous êtes à l'aide de Glassfish, donc vous pouvez faire usage de JPA et EJB. Ainsi, le modèle de la classe doit être un APC
@Entity
et la classe de service doit être un@Stateless
EJB.Le cas d'utilisation d'une "connexion utilisateur" est toutefois spécial. Vous ne voulez pas avoir l'entité comme une session d'étendue de managed bean, ou il serait implicitement créé par JSF. Vous feriez mieux de mettre directement dans la session de la portée, de sorte que vous pouvez vérifier sur
#{not empty user}
si l'utilisateur est connecté ou non.Tous avec tous, il devrait ressembler à quelque chose comme ceci:
avec
Alternativement, vous pouvez faire la
UserController
une session d'étendue de haricot qui détient leUser
entité, vous ne devez ajouter une méthode supplémentaire pour vérifier si l'utilisateur est connecté ou non, de sorte que vous pouvez l'utiliser dans EL par#{userController.loggedIn}
.avec
@SessionScoped
était une option à l'aide de la séance:context.getExternalContext().getSessionMap().put("user", user);
le
@SessionScoped
déclare une session d'étendue de JSF managed bean. Une entité n'est pas censé être un managed bean JSF.alors quel est le point? Désolé pour la bizarre questions, je vais avoir un moment difficile avec Java, mais je suis motivé et déjà acheté un livre =)
Votre entité ne doit pas contenir de JSF managed bean logique spécifique tels que les méthodes d'action et ainsi de suite. Il devrait purement contiennent des données du modèle. Il n'y a pas de point d'en faire un managed bean JSF. Il doit être référencé par un réel JSF managed bean ou dans le cas spécifique de "connexion utilisateur" manuellement être placé dans la session.
afin d'ajouter manuellement ou à l'ajout de l' @SessionScoped est la même chose?
OriginalL'auteur BalusC
Vous pouvez utiliser l'injection de dépendance pour obtenir les valeurs de cette fève à la session.
Alors vous pourriez utiliser cet Objet dans votre UserControl bean.
Par la façon dont vous n'avez pas besoin d'implémenter serializable lorsque vous traitez avec des RequestScope haricots.
OriginalL'auteur David Agustin Almanza Gaitan