J'ai une page JSP utilisée pour modifier les informations de certains utilisateurs. Lorsqu'un utilisateur se connecte au site Web, je conserve les informations dans la session, puis j'essaie dans ma page d'édition:
<%! String username=session.getAttribute("username"); %>
<form action="editinfo" method="post">
<table>
<tr>
<td>Username: </td><td> <input type="text" value="<%=username %>" /> </td>
</tr>
</table>
</form>
mais cela donne une erreur en disant que la session ne peut pas être résolue. Que puis-je faire à ce sujet?
JSP implicite les objets tels que session
, request
etc. ne sont pas disponibles dans les balises JSP de déclaration <%! %>
.
Vous pouvez l'utiliser directement dans votre expression comme
<td>Username: </td>
<td><input type="text" value="<%= session.getAttribute("username") %>" /></td>
Par ailleurs, l'utilisation de scriptlets dans JSP est depuis longtemps obsolète. L'utilisation de balises EL (langage d'expression) et JSTL est fortement recommandée. Par exemple, ici vous pouvez utiliser EL comme
<td>Username: </td>
<td><input type="text" value="${username}" /></td>
La meilleure partie est que la résolution de la portée se fait automatiquement. Donc, ici nom d'utilisateur pourrait provenir de page, ou demande, ou session, ou application étendues dans cet ordre. Si, pour une instance particulière, vous devez le remplacer en raison d'une collision de noms, vous pouvez spécifier explicitement la portée en tant que
<td><input type="text" value="${requestScope.username}" /></td> or,
<td><input type="text" value="${sessionScope.username}" /></td> or,
<td><input type="text" value="${applicationScope.username}" /></td>
Utilisation
<% String username = (String)request.getSession().getAttribute(...); %>
Notez que votre utilisation de <%! ... %>
est traduite au niveau de la classe, mais que la requête n'est disponible que dans la méthode service()
de la servlet traduite.
La raison pour laquelle vous obtenez une erreur de compilation est que vous essayez d'accéder à la session dans le bloc de déclaration (<%! %>
) où elle n'est pas disponible. Tous les objets implicites de jsp sont disponibles dans la méthode de service uniquement. Le code des blocs déclaratifs sort de la méthode de service.
Je vous conseillerais d'utiliser EL. C'est une approche simplifiée.
${sessionScope.username}
vous donnerait le résultat souhaité.
Supposons que vous souhaitiez utiliser, par exemple, un identifiant dans une autre page Web, vous pouvez le faire en suivant l’extrait de code suivant:
String id=(String)session.getAttribute("uid");
Ici, uid est l'attribut dans lequel vous avez enregistré l'identifiant précédemment. Vous pouvez le définir par:
session.setAttribute("uid",id);