あるユーザー情報を編集するためのJSPページがあります。ユーザーがウェブサイトにログインすると、その情報をセッションに保存し、編集ページで次のようにしています。
<%! 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>
しかし、セッションが解決できないというエラーが出ます。どうしたらいいですか?
JSPの implicit オブジェクトである session
や request
などは、JSPの宣言 `<%!タグを使用します。
JSPの式の中では、次のように直接使用することができます。
<td>Username: </td>
<td><input type="text" value="<%= session.getAttribute("username") %>" /></td>
また、JSPでスクリプトレットを使用することは長らく推奨されていません。EL(expression language)やJSTLタグの使用を強く推奨します。例えば、ここではELを次のように使用します。
<td>Username: </td>
<td><input type="text" value="${username}" /></td>
一番の利点は、スコープの解決が自動的に行われることです。つまり、ここでのusernameは、page、request、session、applicationの順にスコープに入ります。名前の衝突のために特定のインスタンスでこれを上書きする必要がある場合は、スコープを明示的に
<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>
使用
<% String username = (String)request.getSession().getAttribute(...); %>
注意していただきたいのは、あなたが使った <%!... %>
の使用はクラスレベルに翻訳されますが、リクエストは翻訳されたサーブレットの service()
メソッドでのみ利用可能であることに注意してください。
<%! String username=(String)session.getAttribute("username"); %>
form action="editinfo" method="post">
<table>
<tr>
<td>Username: </td><td> <input type="text" value="<%=username %>" /> </td>
</tr>
</table>
追加 <%!String username=(String)session.getAttribute("username"); %>