2017-05-31 116 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片段。