session.setAttribute仅在页面重新加载后更新

时间:2017-05-31 23:44:48

标签: ajax jsp session servlets setattribute

我有一个调用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保存&#39;&#39;到会话属性如下,并转发回同一页面(index.html)。

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

当调用alert(test)时,它会警告上一次处理ajax请求时所选的层。 会话属性&#39;&#39;总是好像&#34;滞后&#34;一次刷新。

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

1 个答案:

答案 0 :(得分:0)

这段JavaScript:

  var test = '<c:out value="${tiers}" />';
在调用servlet 之前,

的值为${tiers} 。如果您检查页面上的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(...)函数完成执行。
  5. 你AJAX调用返回一个页面,它应该返回一个包含tiers内容的JSON片段,然后由.done函数使用。