我想询问 jsp 中的会话
I want to ask about session in 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");
在 b.jsp
中,您似乎正在尝试检查会话映射以查找键为 b
的条目,然后根据该值确定正在查看页面的用户类型.
有问题的代码是 b.jsp
中 scriptlet 的第二行:
if (b!="")
{
当会话映射中没有 b
的条目时,此比较应该是 true
,导致执行检查管理员或成员的代码。这反过来会导致 b
在 b.equals("admin")
之类的比较中被取消引用,这将导致 NullPointerException
。我认为您的意图是检查会话映射中 b
是否有 any 条目。如果未找到任何条目,则您会将用户视为访客。如果会话中没有键 b
的条目,则将返回 null
,而不是空字符串。所以你应该检查 null
:
if (b != null)
{
或者,如果您还想将空字符串值视为来宾,那么您可以尝试:
if (b != null && !b.equals(""))
{
Reason for Exception:
Your b.jsp invokes nullPointerException if and only if the value for parameter is not set.
正如您在上面所说的那样,在未选择任何单选按钮的情况下提交表单必须被视为访客。
所以这里有 2 个解决方案:
解决方案 1:
Instead of checking parameter as
if(b!="")
{
Below code works fine, replace your b.jsp with this
<%
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:
Put Guest radio button also there in form, so that guest users will directly select "guest" Option. (here nullPointerException is avoided as always the value for parameter "b" will be set.)
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");
在 b.jsp
中,您似乎正在尝试检查会话映射以查找键为 b
的条目,然后根据该值确定正在查看页面的用户类型.
有问题的代码是 b.jsp
中 scriptlet 的第二行:
if (b!="")
{
当会话映射中没有 b
的条目时,此比较应该是 true
,导致执行检查管理员或成员的代码。这反过来会导致 b
在 b.equals("admin")
之类的比较中被取消引用,这将导致 NullPointerException
。我认为您的意图是检查会话映射中 b
是否有 any 条目。如果未找到任何条目,则您会将用户视为访客。如果会话中没有键 b
的条目,则将返回 null
,而不是空字符串。所以你应该检查 null
:
if (b != null)
{
或者,如果您还想将空字符串值视为来宾,那么您可以尝试:
if (b != null && !b.equals(""))
{
Reason for Exception:
Your b.jsp invokes nullPointerException if and only if the value for parameter is not set.
正如您在上面所说的那样,在未选择任何单选按钮的情况下提交表单必须被视为访客。
所以这里有 2 个解决方案:
解决方案 1:
Instead of checking parameter as
if(b!="")
{
Below code works fine, replace your b.jsp with this
<%
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:
Put Guest radio button also there in form, so that guest users will directly select "guest" Option. (here nullPointerException is avoided as always the value for parameter "b" will be set.)