web-dev-qa-db-fra.com

Utilisation de request.setAttribute dans une page JSP

Est-il possible d'utiliser request.setAttribute sur une page JSP, puis sur HTML Submit, obtenir le même attribut de requête dans Servlet?

20
ria

Non. Malheureusement, l’objet Request n’est disponible que jusqu’à la fin du chargement de la page. Une fois l’opération terminée, vous perdrez toutes ses valeurs sauf si elles ont été stockées quelque part.

Si vous souhaitez conserver des attributs via des demandes, vous devez soit:

  1. Ayez une entrée cachée dans votre formulaire, telle que <input type="hidden" name="myhiddenvalue" value="<%= request.getParameter("value") %>" />. Ce sera alors disponible dans le servlet en tant que paramètre de requête.
  2. Mettez-le dans la session (voir request.getSession() - dans un JSP, il est disponible simplement sous la forme session)

Je recommande d'utiliser la session car il est plus facile à gérer.

24
user7094

La réponse de Phil Sacre était correcte, mais la session ne devrait pas être utilisée uniquement pour le plaisir. Vous ne devez utiliser cette option que pour les valeurs que vraiment doivent conserver pendant toute la durée de la session, telles que la connexion d'un utilisateur. Il est courant de voir des personnes abuser de la session et rencontrer davantage de problèmes, en particulier lorsqu'il s'agit d'une collection ou lorsque les utilisateurs reviennent sur une page qu'ils ont visitée précédemment pour constater qu'ils ont encore des valeurs d'une visite précédente. Un programme intelligent minimise autant que possible la portée des variables, un mauvais utilise trop la session. 

4
user31475

Si vous voulez que vos demandes persistent, essayez ceci:

exemple: sur votre page JSP ou servlet

request.getSession().setAttribute("SUBFAMILY", subFam);

et sur n'importe quelle page de destination, utilisez les lignes ci-dessous pour récupérer votre session et vos données:

SubFamily subFam = (SubFamily)request.getSession().getAttribute("SUBFAMILY");
4
connect2krish

Vous pouvez le faire en utilisant les attributs pageContext, cependant:

Dans le JSP:

<form action="Enter.do">
    <button type="SUBMIT" id="btnSubmit" name="btnSubmit">SUBMIT</button>
</form>
<% String s="opportunity";
pageContext.setAttribute("opp", s, PageContext.APPLICATION_SCOPE); %>

Dans le Servlet (lié au motif url "Enter.do"):

String s=(String) request.getServletContext().getAttribute("opp");

Outre APPLICATION_SCOPE, il existe d'autres portées que SESSION_SCOPE. APPLICATION_SCOPE est utilisé pour les attributs ServletContext.

3
Prasad

Essayer 

request.getSession().setAttribute("SUBFAMILY", subFam);
request.getSession().getAttribute("SUBFAMILY");
2
Lino

Corrigez-moi si je me trompe ... Je pense que la requête persiste entre les pages consécutives.

Vous pensez traverser de la page 1 -> page 2 -> page 3.

Vous avez une valeur définie dans l'objet de requête à l'aide de setAttribute à partir de la page 1, que vous récupérez à la page 2 à l'aide de getAttribute, puis si vous essayez de redéfinir quelque chose dans le même objet de requête pour le récupérer à la page 3, il échoue en vous donnant la valeur null " la demande qui a créé le JSP et la demande générée lors de la soumission du JSP sont des demandes complètement différentes et les attributs placés sur le premier ne seront pas disponibles sur le second ".

Je veux dire quelque chose comme ceci à la page 2 échoue:

Où la même chose a fonctionné dans le cas de la page 1 comme:

Je pense donc que je devrais passer à l’une des deux options proposées par Phill.

1
ria

je pense que phil est la bonne option de demande est disponible jusqu'au chargement de la page. donc si nous voulons envoyer de la valeur à une autre page, nous voulons définir le dans la balise masquée ou dans la session si vous avez besoin uniquement de la valeur sur une autre page et pas plus que cela, les balises masquées sont la meilleure option si vous avez besoin de cette valeur sur plus d'une page à la fois, la session est la meilleure option que les balises masquées.

0
user189062