【问题标题】:session.setAttribute only updates after page reloadsession.setAttribute 仅在页面重新加载后更新
【发布时间】:2017-11-01 22:34:25
【问题描述】:

我有一个调用 GetTierNamesServlet 的 ajax 请求:

$('#application').change(function() { $.ajax({ url : 'GetTierNamesServlet', data : { name : $('#application').find(":selected").text() }, type : 'get', cache : false, success : function(data) { }, error : function() { alert('error'); } }).done(function() { var test = '<c:out value="${tiers}" />'; alert(test) }) });

GetTierNamesServlet 将“层”保存到会话属性中,如下所示并转发回同一页面 (index.html)。

HttpSession session = request.getSession(false); session.setAttribute("tiers", tiers); getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);

当调用 alert(test) 时,它会从上次处理 ajax 请求时提醒选定的层。 会话属性“tiers”似乎总是“滞后”一次刷新。

我在这里做错了什么?我希望通过将警报放置在 ajax 请求的 .done 部分中,它会在执行某些操作之前等待异步调用返回。

【问题讨论】:

    标签: ajax jsp session servlets setattribute


    【解决方案1】:

    这段 JavaScript 片段:

      var test = '<c:out value="${tiers}" />';
    

    使用${tiers} 在调用您的servlet之前的值呈现。如果您检查页面上的 HTML,您可能会发现如下内容:

              ...
           }).done(function() {
                var test = 'null';  // or some other "old" value
                alert(test)
            })
    
    1. JSP 内容被翻译成 HTML 并发送到浏览器(第 1 页)
    2. 第 1 页上的某些事件导致 JavaScript 被执行
    3. AJAX 调用导致页面再次呈现并返回到浏览器(第 2 页)
    4. 第 1 页中的 JavaScript 通过 .done(...) 函数完成执行。

    您的 AJAX 调用正在返回一个页面,而它可能应该返回一个 JSON 片段,其中包含您的 tiers 内容,该内容随后将被 .done 函数使用。

    【讨论】: