//輸出json類型的字符流(自定義函數)
protected void writeAjaxResult(JSONObject jsonData, ServletResponse response) { try { OutputStream os = response.getOutputStream(); os.write(jsonData.toString().getBytes("UTF-8")); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } }
//調用輸出流 MessageCallBack自定義實體類(有) MessageCallBack callback = new MessageCallBack(Message,Status等屬性); callback.setMessage("您提交的相關表單數據字符含有非法字符!"); callback.setStatus("403"); JSONObject json = JSONObject.fromObject(callback); this.writeAjaxResult(json, response); //獲取當前路徑 String last_url = request.getHeader("Referer");
當不爲ajax請求時能夠用重定向或是轉發:java
request.轉發web
getRequestDispatcher是服務器內部跳轉,轉發,地址欄信息不變,只能跳轉到web應用內的網頁,之前的request中存放的變量不會失效,就像把兩個頁面拼到了一塊兒。 ajax
<jsp:forward page="d.jsp"/>json
運 行程序,你會發現c頁面中的內容沒有顯示出來,由於forward是自動執行的,地址欄中雖然是c.jsp但實際上,但瀏覽器中顯示的已是d.jsp的 內容了,並且看到了從b.jsp傳過來的參數。瀏覽器
重定向服務器
sendRedirect是頁面重定向,地址欄信息改變,能夠跳轉到任意網頁,之前的request中存放的變量所有失效,並進入一個新的request做用域。app
<a href="c.jsp?age=23"> 爲ajax請求時:需異步跳轉 protected void writeAjaxResult(JSONObject jsonData, HttpServletResponse response) { try { OutputStream os = response.getOutputStream(); os.write(jsonData.toString().getBytes("UTF-8")); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } messageCallBack.setStatus("200"); messageCallBack.setMessage("申請成功!"); messageCallBack.setUrl(GoodsConstant.getPendingAuditGoods); JSONObject jsonData = JSONObject.fromObject(messageCallBack); this.writeAjaxResult(jsonData, response); return null;
重定向的速度比轉發慢,由於瀏覽器還得發出一個新的請求。同時,因爲重定向方式產生了一個新的請求,因此通過一次重 定向後,request內的對象將沒法使用。異步
轉發,就是延長了requestB-C的做用 域,<jsp:forwardpage="d.jsp"/>,這一句話其實是把c.jsp和d.jsp粘到了一塊兒,他們就像是在一個頁面 中。 jsp
若是你用過struts,那麼你就知道爲何在Action中,最後一句幾乎老是mapping.findForward("xxx");了。由於咱們在這個Action中設置的請求做用域的變量都將會在下一個頁面(也許是另外一個Action)中用到,因此要用轉發。函數