【问题标题】:Session variable value in jsp not getting changedjsp中的会话变量值没有改变
【发布时间】:2013-07-13 20:14:07
【问题描述】:
<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”产生了问题。无论我点击什么,它都保持为“工作”。我做错了什么?

【问题讨论】:

  • 您正试图在 JS 事件上运行 Java。 Java == 服务器。 JS == 客户端。您在服务器上设置会话属性。您认为您是在 JS 事件之后设置它,在 Java 执行并发送到客户端很久之后。
  • 那么我应该在哪里设置会话值?
  • 不是“哪里”,“何时”。您需要退后一步,首先了解 Java Web 应用程序的工作原理。 “何时”取决于您实际尝试做什么;您可以根据您的要求使用 Ajax、普通表单提交等。
  • 不熟悉 ajax 人。刚开始用jsp的
  • 更有理由退后一步。 Scriptlet 是 Java,编译成 JSP 的 servlet,并在服务器端执行。 servlet 被渲染之后,它被发送到客户端。 JavaScript 在 client(例如,浏览器)上执行。就本次讨论而言,浏览器 (a) 对 Java一无所知,并且 (b) 只有在 Java 端需要修改某些内容时才能向服务器发出 HTTP 请求。跨度>

标签: html jsp


【解决方案1】:

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

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

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

正如 David Newton 在 cmets 中所说,问题是不是“哪里”,“何时”。由于看起来您想要更改表单 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、Servlet 和 Ajax 的好教程:How to use Servlets and Ajax?

【讨论】:

  • 我应该如何知道何时在 jsp 和 servlet 中实现我的代码?
  • 你能给我一个示例项目,这样我就可以学习创建高效的项目。
  • @Saurabh 我的答案中的链接不是用于装饰目的。访问有关从登录参数创建用户对象的每个示例,以查看使用 jsp 和 servlet 进行开发的基本现实世界示例。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2012-06-24
  • 2014-08-24
  • 2014-12-02
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多