<html>
<script type="text/javascript">
function logged()
{
<% session.setAttribute("logtype", "hire"); %>
var x=<%=session.getAttribute("loggedin")%>;
if(x===true)
{
window.location="home.jsp";
return false;
}
else if(x===false)
{
return true;
}
}
</script>
<body>
<form method="post" action="login.jsp" onsubmit="return logged()">
<input type="submit" value="HIRE"/>
</form>
<form method="post" action="displayTasks.jsp" onsubmit="<% session.setAttribute("logtype", "work"); %>">
<input type="submit" value="WORK"/>
</form>
</body>
</html>
我的会话变量“logtype”正在创建一个问题。无论我点击什么,它都会保持“工作”状态。我做错了什么?
答案 0 :(得分:1)
问题是您在页面中设置了两次会话属性,因此当JSP生成视图时,它将执行所有的scriptlet。基本上,您的JSP正在执行此操作:
session.setAttribute("logtype", "hire");
//later...
session.setAttribute("logtype", "work");
请注意,渲染视图时会执行所有scriptlet代码(简单来说,在将JSP转换为HTML时)。
正如David Newton在评论中所述,问题是不是“在哪里”,“何时”。由于它看起来要在POST表单中更改会话属性,因此应在操作POST请求中处理。再说一遍,既然你在JSP中做了所有事情,那应该在你的 displayTasks.jsp 页面中:
session.setAttribute("logtype", "work");
并从当前页面中删除此行(无论其名称如何)。
与当前问题没有直接关系,但您有严重问题开发Java Web应用程序。首先要知道的是,Java运行在服务器(如前所述,在渲染视图时),而JavaScript则运行在客户端浏览器,因此将两者进行交互并不是一个好主意直接在同一水平。实现这一点后,您必须避免使用scriptlet,如下所示:How to avoid Java code in JSP files?,然后转到EL和JSTL。
现在,您将意识到您当前的开发方法存在其他问题。您正在使用JSP直接处理GET和POST请求。如果您处于学习阶段,我强烈反对这样做并使用Servlets代替服务器端数据处理。了解所有这些工具,您的开发将相应于MVC模式,我在JSP + Servlet示例中为您提供了基本的登录实现:Creating a user object from login parameters。
然后在获得更多Web开发经验之后,您会想尝试ajax。这是关于JSP,Servlets和Ajax的一个很好的教程:How to use Servlets and Ajax?