12
votes

Java Servlet et JSP Accès à la même session Bean

Disons que j'ai un servlet de connexion simple qui vérifie le nom transcuté et crée objet l'objet et le stocke dans une session. XXX < p> dans le index.jsp page I accédez à l'objet utilisateur via jsp: utilbean xxx

Ça marche jusqu'à présent .

de la documentation des haricots JSP

Pour localiser ou instancier le haricot, prend ce qui suit étapes, dans cet ordre:

  1. tente de localiser un haricot avec la portée et le nom que vous spécifiez.
  2. Définit une variable de référence d'objet avec le nom que vous spécifiez.
  3. S'il trouve le haricot, stocke une référence à la variable. Si vous avez spécifié le type, donne le haricot ce type.
  4. Si cela ne trouve pas le haricot, instansible de la classe que vous Spécifiez, stockant une référence à la nouvelle variable. Si le nom de la classe représente un modèle sérialisé, le Haricot est instancié par java.beans.beans.Insticated.
  5. si a instancié (plutôt que localisé) le haricot, et si il a des étiquettes de corps ou des éléments (entre et ), Exécute les étiquettes du corps.

    Les questions:

    tente de localiser un haricot avec la portée et le nom que vous spécifiez

    Il ne spécifie pas le processus "localiser". Cela signifie-t-il que cela vérifiera httpservletrequest.getsession () ou simplement vérifier si d'autres pages ont déjà créé ce haricot ou non?

    S'il ne trouve pas le haricot, instancipliez-le de la classe que vous spécifiez, stockez une référence à celle-ci dans la nouvelle variable.

    Cela signifie que JSP peut associer un bean nouvellement créé avec une session à l'aide de jsp_internal_name_user . Il n'y a aucun mot sur la manière dont JSP stocke et trouve des haricots dans la session.

    Il existe une option pour accéder aux objets de session à l'aide de $ {sessionscope.user} et cela garantira que "L'utilisateur" de l'objet de session Java sera obtenu. Le même que je me suis mis à moi-même.

    Java EE 5 Exemple "Book Store" Access Session Objets en utilisant $ {sessionscope.name} approche.

    en utilisant juste $ {utilisateur} fonctionne. Et c'est ce qui me soucie. J'aimerais voir une phrase spécifique dans la spécification sur le processus localiser et si $ {utilisateur} doit fonctionner ou si elle appartient à la référence JSP et / ou JSTL Mise en œuvre.


0 commentaires

3 Réponses :


2
votes

de la documentation:

Le élément localise ou instancie un composant JavaBeans. Les premières tentatives de localisation d'une instance du haricot. Si le haricon n'existe pas, l'instancite à partir d'une classe ou sérialisée modèle.

Depuis "Localisation", le haricot est parfaitement alloué, nous pouvons supposer que le haricon peut être mis à disposition par des moyens autres que l'instanciation via . Par exemple, en le créant dans un servlet.


0 commentaires

6
votes

Dans le cas d'un contrôleur (servlet) qui prend soin du modèle, le JSP: Usebean code> n'est utile que si l'instance par défaut (construite avec le constructeur de no-arg) expose différents comportements / états différents qu'une instance non existante. Par exemple. Si vous souhaitez avoir un nom d'utilisateur par défaut "Utilisateur inconnu", vous feriez:

for (String name : Collections.list(session.getAttributeNames())) {
   System.out.println(name + " = " + session.getAttribute(name));
}


11 commentaires

Existe-t-il une documentation qui décrit explicitement le processus des variables résolvant dans une page JSP?


Intellij Idea complète les champs variables uniquement en cas de déclaration explicite.


1) Tu parles d'El? Vérifiez le Spécification JSP EL . En bref, il fait Pagecontext # FindatTtribute () pour localiser les attributs dans n'importe quelle portée. 2) C'est bien un autre argument que j'ai vu auparavant.


Merci de pointer des choses. Je faisais référence à la spécification JSP et je n'ai rien trouvé d'utile là-bas. Regarder dans el spec.


Pourriez-vous s'il vous plaît pointez sur la section où vous avez trouvé «résolve grossièrement ...»?


Eh bien, c'est dans la cellule cérébrale # 1875129. Non, désolé, je suis plus raconté de> 7 ans d'expérience JSP / servlet et de savoir comment cela fonctionne "sous les hottes". L'exemple ci-dessus est celui qui a le plus de sens pour le JSP / el-ignorant. La spécification El est un peu plus abstraite que celle-là. ELRESOLVER et ainsi de suite. Mais la voie directe (quels pratiquement tous les impléments d'EL --Sun, Apache, JBoss, etc- etc. font) est de commencer par pagecontext # Findattribute () pour trouver l'attribut par nom dans l'une quelconque des champs et ensuite aller de l'avant avec la résolution de la réflexion / introspection / etc.


Donc, l'utilisation du bean de session dans ma question est valide?


C'est fonctionnellement et techniquement valide, oui. Mais c'est techniquement superflu.


Je suis désolé de toujours poser des questions. Mais vient de remarquer que même la librairie EE5 exemple utilise "Sessionscope.cart" au lieu de "Panier"


Vérifiez Java.sun.com/javaee/5/docs /Tutorial/doc/bnahaq.html#bnahw . En ce qui concerne l'exemple de la librairie, il s'agit juste d'une référence explicite pour vous assurer qu'elle ne renvoie pas un "coïncidence" panier instance de page ou de demande (qui sont scannés avant la portée de la session). Ceci est juste une "pratique", mais pas nécessaire.


Je mets accidentellement plus de nouveau sur la réponse et il est devenu "Score Supprimer" l'action. Je modifie votre réponse juste pour pouvoir mettre des scores. S'il vous plaît annuler mes changements. Merci beaucoup pour pointer du texte. Je cherchais dans les spécifications et c'était juste sur la page du tutoriel.



5
votes

citant la spécification JSP JSP.5.1

L'essentiel de base sémantique essaie de trouver un objet existant à l'aide d'une pièce d'identité et portée. Si l'objet n'est pas trouvé, il tentera de créer l'objet en utilisant l'autre. attributs. p> blockQuote>

En d'autres termes, P>

package.name.User user = (package.name.User)session.getAttribute("user");
if (user == null){
  user = new package.name.User();
  session.setAttribute("user", user);
}


5 commentaires

Hé, content de vous voir ici :) Votre réponse est en effet correcte pour le particulier jsp: usebean Ligne, vous avez uniquement oublié le session.setattribute ("utilisateur", utilisateur); dans le si bloc;)


J'aimerais voir la description de "trouver un processus existant". En fait, JSP peut stocker un objet en utilisant le nom "user_jsp_internal".


Non, ça ne le fait pas. L'objet est stocké avec la clé d'attribut comme spécifié dans ID . Comment voudriez-vous vous y accéder à la nature el par $ {utilisateur} et ainsi de suite?


En raison de la mise en œuvre actuelle. Pourquoi alors nous avons {sculesession.user} Expression explicite disponible à utiliser. Veuillez noter où avez-vous trouvé qu'il le stockera dans la session en utilisant ID? Je pense que c'est ce que les gars de la mise en œuvre de la JSR peuvent décider eux-mêmes.


Reportez-vous à JSP.5.1. C'est tout là en noir et blanc.