2017-05-31 65 views
0

后session.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保存“层”的会话属性如下并转发回到同一页(索引。 HTML)。

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

当警报(试验)被调用时,它从上一次的AJAX请求被处理警报选定的层。 会话属性“分层”似乎总是滞后一个刷新。

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

回答

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(...)函数完成执行。

您AJAX调用返回一个页面时,它可能应该返回一个包含您的tiers内容将随后由.done功能消耗一个JSON片段。