Я хочу спросить о сессии в JSP
index.jsp
<form action="a.jsp" method="post">
<input type="text" name="a">
<input type="radio" name="b" value="admin">admin <input type="radio" name="b" value="member">member
<input type="submit" value="c">
</form>
a.jsp
<% String a=request.getParameter("a"); String b=request.getParameter("b");
session.setAttribute("a",a); session.setAttribute("b",b);
response.sendRedirect("b.jsp"); %>
b.jsp
<%
String b = (String)session.getAttribute("b");
if(b!="")
{
if(b.equals("admin"))
{
out.print(session.getAttribute("a"));
out.print("this is admin");
}
else if(b.equals("member"))
{
out.print(session.getAttribute("a"));
out.print("this is member");
}
}
else
{
out.print(session.getAttribute("a"));
out.print("this is guest");
}
%>
<form action="d.jsp" method="post">
<input type="submit" value="d" />
</form>
d.jsp
<%
session.invalidate();
response.sendRedirect("index.jsp");
%>
Код работает нормально, но если я не выберу admin
или же member
значение, оно в идеале должно идти в состояние гостя в b.jsp
страница, но я получаю сообщение об ошибке в строке 5.
ошибка Возникла исключительная ситуация при обработке страницы JSP /c/b.jsp в строке 5
2: String b = (String)session.getAttribute("b");
3: if(b!="")
4: {
5: if(b.equals("admin"))
6: {
7: out.print(session.getAttribute("a"));
8: out.print("this is admin");
2 ответа
В b.jsp
кажется, что вы пытаетесь проверить карту сеанса для записи, ключ которой b
и затем решить, какой тип пользователя просматривает страницу, основываясь на этом значении.
Проблемный код - вторая строка скриплета в b.jsp
:
if (b!="")
{
Когда нет записи для b
в карте сеанса это сравнение должно быть true
, вызывая код, который проверяет для администратора или члена для выполнения. Это в свою очередь приведет к b
быть разыменованным в сравнении, как b.equals("admin")
, что приведет к NullPointerException
, Я полагаю, что вы намерены проверить, есть ли запись для b
в карте сеанса. Если запись не найдена, то вы будете относиться к пользователю как к гостю. Если в сеансе нет записи для ключа b
затем null
будет возвращена, а не пустая строка. Так что вы должны проверить null
:
if (b != null)
{
Или, если вы хотите также рассматривать пустое строковое значение как гостевое, то вы можете попробовать:
if (b != null && !b.equals(""))
{
Причина исключения:
Ваш b.jsp вызывает nullPointerException тогда и только тогда, когда значение для параметра не установлено.
Как вы указали выше, отправка формы без выбора радиокнопки должна рассматриваться как гость.
Итак, вот 2 решения:
Решение 1:
Вместо проверки параметра как
if(b!="")
{
Ниже код работает нормально, замените ваш b.jsp этим
<%
String b = (String)session.getAttribute("b");
if(b==null)
{
out.print(session.getAttribute("a"));
out.print("this is guest");
}
else {
if(b.equals("admin"))
{
out.print(session.getAttribute("a"));
out.print("this is admin");
}
else if(b.equals("member"))
{
out.print(session.getAttribute("a"));
out.print("this is member");
}
}
%>
<form action="d.jsp" method="post">
<input type="submit" value="d" />
</form>
Решение 2:
Поместите переключатель "Гость" также в форму, чтобы гостевые пользователи непосредственно выбирали опцию "гость". (здесь исключается nullPointerException, так как всегда будет установлено значение параметра "b".)