javascript
JSP中页面跳转response.sendRedirect()和request.getRequestDispatcher()的区别
Java Web開發中,采用MVC模式的時候,在控制器完成模型的調用之后會選擇界面對用戶響應,用常有2種方式
1,通過response對象的sendRedirect方法重定向:
2,通過RequestDispatcher對象的forward方法:
<!--請求轉發--> RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); rd.forward(request,response);3,使用jsp動作指令的方法:與第2中方式相同
<jsp:forward page="login.jsp"></jsp:forward>現在來說一下二者的區別:
1),過程不同:response.sendRedirect(“login.jsp”)方式相當于瀏覽器接收到了響應之后又向服務器發送了一次請求,所以相當于兩次請求。request.getRequestDispatcher(“login.jsp”)方式相當于方法調用,在執行當前文件的過程中轉向執行目標文件,兩個文件(當前文件和目標文件)屬于同一次請求。
2)地址欄不同:response.sendRedirect(“login.jsp”)方式下用戶在瀏覽器地址欄中看到的是目標文件的地址,即地址欄會變,request.getRequestDispatcher()方式下用戶在瀏覽器地址欄中看到的是當前文件的地址,即地址欄不變
3)數據共享角度:request.getRequestDispatcher()是請求轉發,前后頁面共享一個request ;
response.sendRedirect()是重新定向,前后頁面不是一個request。
sendRedirect兩次提交,forword一次提交
如果需要把請求轉移到另外一個Web 工程中的某個地址,可以按下面的做法:
1. 獲得另外一個Web App的ServletConext對象(currentServletContext.getContext(uripath)). 2. 調用ServletContext.getRequestDispatcher(String url)方法。 eg: ServletContext.getRequestDispatcher("smserror.jsp").forward(request,response);4),參數傳遞方面:
response.sendRedirect(url)跳轉到指定的URL地址,產生一個新的request,所以要傳遞參數只有在url后加參數,如: url?id=1.
request.getRequestDispatcher(url).forward(request,response)是直接將請求轉發到指定URL,所以該請求 能夠直接獲得上一個請求的數據,數據可以用request.setAttribute()方法封裝在request里面。也就是說采用請求轉發,request對象始終存在,不會重新創建。而
sendRedirect()會新建request對象,所以上一個request中的數據會丟失。
5),功能上:response.sendRedirect()方法能夠定向到當前應用程序的其他資源,而且還能夠重定向到同一個站點上的其他應用程序的資源,甚至是使用絕對URL重定向到其他站點的資源:
response.sendRedirect(“http://www.baidu.com”)request.getRequestDispatcher(“login.jsp”)方法只能在同一個web應用程序內的資源之間轉發請求
response.sendRedirect(“login.jsp”);和request.getRequestDispatcher(“login.jsp”);的請求過程如下:
redirect會首先發一個response給瀏覽器, 然后瀏覽器收到這個response后再發一個requeset給服務器, 然后 服務器發新的response給瀏覽器. 這時頁面收到的request是一個新從瀏覽器發來的.
forward 發生在服務器內部, 在瀏覽器完全不知情的情況下發給了瀏覽器另外一個頁面的response. 這時頁面 收到的request不是從瀏覽器直接發來了,可能己經用request.setAttribute在request里放了數據.在轉到的頁
面可直接用request.getAttribute獲得數據。
總結
以上是生活随笔為你收集整理的JSP中页面跳转response.sendRedirect()和request.getRequestDispatcher()的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java缓冲流,BufferedRead
- 下一篇: gradle idea java ssm