jsp中的会话变量值没有改变

时间:2013-07-15 20:19:43

标签: html jsp

<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”正在创建一个问题。无论我点击什么,它都会保持“工作”状态。我做错了什么?

1 个答案:

答案 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?,然后转到ELJSTL

现在,您将意识到您当前的开发方法存在其他问题。您正在使用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?