Jsp 如何处理会话可能不存在的情况?

Jsp 如何处理会话可能不存在的情况?,jsp,session,Jsp,Session,我有一个带有 <%@ page session="false" %> 要防止Tomcat自动创建会话,请执行以下操作: 1 <% 2 if(request.getSession(false) != null) { 3 session.setAttribute("username", username); 4 } 5 %> 1 访问页面会出现引用第3行的“会话无法解析为变量”错误 如果会话不存在,则request.getSession(fals

我有一个带有

<%@ page session="false" %>

要防止Tomcat自动创建会话,请执行以下操作:

1  <%
2  if(request.getSession(false) != null) {
3       session.setAttribute("username", username);
4  }
5  %>
1
访问页面会出现引用第3行的“会话无法解析为变量”错误


如果会话不存在,则
request.getSession(false)
应返回
null
,并且应跳过“If”块。相反,Tomcat抱怨它应该跳过的块中不存在变量,因为变量不存在。我在这里做错了什么?

以下是JSP规范对page指令的
session
属性的说明:

指示页面需要参与(HTTP)会话。 如果为true,则名为session的javax.servlet.http.HttpSession类型的隐式脚本语言变量将引用页面的当前/新会话。 如果为false,则页面不参与会话;会话隐式变量不可用,JSP页面正文中对它的任何引用都是非法的,将导致致命的翻译错误。 默认值为true

因此,您使用session=false,但希望定义session变量。规范明确指出,使用session=false会使session隐式变量[…]不可用

您仍然可以定义引用会话的变量,但是:

<%
  HttpSession session = request.getSession(false);
  if (session != null) {
      session.setAttribute("username", username);
  }
%>


也就是说,在JSP中使用Scriptlet,以及从JSP修改会话,都显示了应用程序中的设计问题。JSP是一个视图组件。这应该在Java代码中完成,在用Java编写的控制器中。JSP应该只生成HTML,必要时使用JSPEL、JSTL和其他自定义标记。了解MVC。

否。但是您可以按照自己的方式命名变量。