我有一个带
的JSP页面<%@ page session="false" %>
阻止Tomcat自动创建会话,以及类似于
的代码块1 <%
2 if(request.getSession(false) != null) {
3 session.setAttribute("username", username);
4 }
5 %>
访问该页面会出现“会话无法解析为变量”错误,引用第3行。
如果会话不存在,则request.getSession(false)
应返回null
,并且应跳过“if”块。相反,Tomcat抱怨该变量不存在于它应该跳过的块中,因为该变量不存在。我在这里做错了什么?
答案 0 :(得分:1)
以下是JSP规范对页面指令的session
属性的说法:
表示该页面需要参与(HTTP)会话。 如果为true,则名为session的类型为javax.servlet.http.HttpSession的隐式脚本语言变量引用该页面的当前/新会话。 如果为false,则页面不参与会话;会话隐式变量不可用,并且在JSP页面主体内对它的任何引用都是非法的,并且会导致致命的转换错误。 默认为true。
因此,您使用session = false,但期望定义会话变量。该规范明确指出,使用session = false会使会话隐式变量[...]不可用。
您仍然可以定义一个引用会话的变量:
<%
HttpSession session = request.getSession(false);
if (session != null) {
session.setAttribute("username", username);
}
%>
也就是说,在JSP中使用scriptlet并从JSP修改会话,都会在应用程序中显示设计问题。 JSP是一个视图组件。这应该在Java代码中完成,在用Java编写的控制器中。 JSP应该只在必要时使用JSP EL,JSTL和其他自定义标记生成HTML。了解MVC。