转发和重定向和request域对象
request利用請求域傳遞對象
request對象同時也是一個域對象,開發人員通過request對象在實現轉發時,把數據通過request對象帶給其它web資源處理
setAttribute方法
getAttribute方法?
removeAttribute方法
getAttributeNames方法
request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉發,從而共享請求中的數據
請求重定向和請求轉發的區別
RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。 如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對于服務器的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當前WEB應用程序的根目錄。 調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。 HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。 RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。 package cn.learn.request;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 重定向和轉發* @author Administrator**/ public class RequestDemo3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// request域設置內容request.setAttribute("name", "鳳姐");// 完成重定向的工作(客戶端端絕對路徑)// response.sendRedirect("/day10/request4");// 轉發(路徑服務器的絕對路徑)request.getRequestDispatcher("/request4").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}} package cn.learn.request;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class RequestDemo4 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 獲取String value = (String) request.getAttribute("name");// 輸出中文response.setContentType("text/html;charset=UTF-8");response.getWriter().write("訪問到了demo4... "+value);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}URL特殊字符轉義規則
常用轉義規則
空格換成加號(+)
+換成%2B
正斜杠(/)分隔目錄和子目錄 換成%2F
問號(?)分隔URL和查詢 換成%3F
百分號(%)制定特殊字符 換成%25
#號指定書簽? 換成%23
?&號分隔參數? 換成%26
java.net.URLEncoder和 java.net.URLDecoder
Request的開發細節
使用轉發的方法后,response的緩沖區會被清空。
response.getWriter().write("aaa");
request.getRequestDispatcher("/demo2").forward(request, response);
response.getWriter().write("bbb");
?
RequestDispatcher
include方法:
RequestDispatcher.include方法用于將RequestDispatcher對象封裝的資源內容作為當前響應內容的一部分包含進來,從而實現可編程的服務器端包含功能
被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,如果它里面存在這樣的語句,這些語句的執行結果將被忽略
底層使用的是子節流,所以輸出內容只能使用字節流。
include在程序執行上效果類似forward,但是使用forward只有一個程序可以生成響應,include可以由多個程序一同生成響應 ----- 常用來頁面布局
總結
以上是生活随笔為你收集整理的转发和重定向和request域对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: request获取中文乱码的问题
- 下一篇: response的运行过程