關於提交表單的提交及異步問題

//輸出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)中用到,因此要用轉發。函數

相關文章
相關標籤/搜索