0
<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”产生了问题。无论我点击什么,它都保持为“工作”。我究竟做错了什么?

4

1 回答 1

0

问题是您在页面中设置了两次会话属性,因此当 JSP 生成视图时,它将执行您的所有小脚本。基本上,您的 JSP 正在这样做:

session.setAttribute("logtype", "hire");
//later...
session.setAttribute("logtype", "work");

请注意,所有 scriptlet 代码都是在呈现视图时执行的(简单来说,就是将 JSP 转换为 HTML 时)。

正如大卫牛顿在评论中所说,问题不是 "where", "when"。由于看起来您想要更改表单 POST 中的会话属性,因此应该在您的操作 POST 请求中进行处理。再一次,因为你在 JSP 中做所有事情,这应该在你的displayTasks.jsp页面中:

session.setAttribute("logtype", "work");

并从您的当前页面中删除这一行(无论它有什么名称)。


与当前问题没有直接关系,但您在开发 Java Web 应用程序时遇到了严重问题。首先要知道,Java 在服务器上运行(如前所述,在渲染视图时),而 JavaScript 在客户端浏览器上运行,因此让两者直接在同一级别交互并不是一个好主意。意识到这一点后,您必须避免使用 scriptlet,正如此处大量解释的那样:如何避免 JSP 文件中的 Java 代码?然后转到ELJSTL

现在,您将意识到您当前的开发方法还有其他问题。您正在使用 JSP 直接处理 GET 和 POST 请求。如果您处于学习阶段,我强烈建议您不要这样做,而是使用Servlet进行服务器端数据处理。了解了所有这些工具,您的开发将按照 MVC 模式进行,我为您提供了 JSP + Servlet 中的基本登录实现示例:从登录参数创建用户对象

然后在获得更多的 web 开发经验之后,你会想尝试 ajax。这是关于 JSP、Servlets 和 Ajax 的一个很好的教程:如何使用 Servlets 和 Ajax?

于 2013-07-16T05:07:32.393 回答