重定向
什么是重定向
服務器發(fā)送一個302狀態(tài)碼及一個Location消息頭(值是一個地址,稱為重定向地址),通知瀏覽器立即向重定向地址發(fā)請求。
- 瀏覽器請求服務器地址A(servletA)
- 服務器解析地址A(servletA)請求,返回302狀態(tài)碼楼入、一個Location消息頭值存放地址B(servletB)
- 瀏覽器拿到返回信息,解析出Location=地址B牧抽。
- 瀏覽器請求地址B(servletB)。
如何重定向
使用response.sendRedirect(String url);
注意兩個問題
1)重定向之前遥赚,不要調(diào)用out.close();會報錯扬舒!
out.println("添加成功");//能看到這個輸出!(如果不寫這個輸出凫佛,則響應為空白頁)
out.close();
response.sendRedirect("list");//看不到重定向結(jié)果讲坎!
2)重定向之前,服務器會先清空response對象上緩存的數(shù)據(jù)愧薛。Servlet只允許同時發(fā)送一個響應晨炕。
out.println("添加成功");//看不到這個輸出!緩存數(shù)據(jù)被清空(響應一)
response.sendRedirect("list");//能看到重定向結(jié)果:谅(響應二)
out.close();
重定向的特點
- 重定向是兩次請求瓮栗。
- 重定向之后,瀏覽器地址欄的地址會變成重定向地址。
- 重定向的地址是任意的(前提要存在否則報404)费奸。
何時用重定向
1)比如用戶作刪除操作時弥激,刪除操作已做完,重定向訪問list.do
轉(zhuǎn)發(fā)
什么是轉(zhuǎn)發(fā)
服務器內(nèi)部servlet將請求轉(zhuǎn)發(fā)到另外的servlet方法中愿阐,由其他servlet進行處理并返回結(jié)果微服。
- 瀏覽器請求服務器地址A(servletA)
- 服務器解析地址A請求(servletA),將request內(nèi)容一并請求至地址B(servletB)
- 由地址B(servletB)完成請求處理缨历,并返回結(jié)果
- 瀏覽器拿到結(jié)果response
如何轉(zhuǎn)發(fā)
@RequestMapping("demo")
public void demo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/list").forward(request, response);
}
轉(zhuǎn)發(fā)的特點
- 轉(zhuǎn)發(fā)是一次請求以蕴,訪問了多個servlet
- 轉(zhuǎn)發(fā)之后,地址欄不變
- 轉(zhuǎn)發(fā)所涉及的各個Web組件可以共享同一個request對象和response對象
何時用轉(zhuǎn)發(fā)
1)用戶調(diào)用list.do
2)有ListServlet到數(shù)據(jù)庫查詢數(shù)據(jù)
3)ListServlet將查詢到的結(jié)果通過Servlet引擎(通信模塊)轉(zhuǎn)發(fā)給負責顯示的empList.jsp
4)empList.jsp將數(shù)據(jù)通過友好的界面顯示給用戶辛孵,比如用戶作刪除操作時丛肮,刪除操作已做完,重定向訪問list.do
轉(zhuǎn)發(fā)和重定向的區(qū)別
1)轉(zhuǎn)發(fā)的目的地只能是同一個應用內(nèi)部某個組件的地址觉吭,而重定向的目的地是任意的腾供。
2)轉(zhuǎn)發(fā)之后,瀏覽器地址欄的地址不變鲜滩,而重定向會變伴鳖。
3)轉(zhuǎn)發(fā)所涉及的各個Web組件可以共享request對象,而重定向不可以徙硅。
4)轉(zhuǎn)發(fā)是一件事情未做完榜聂,而重定向是一件事情已經(jīng)做完。