網(wǎng)站建設(shè) zzit6適合35歲女人的培訓(xùn)班
?我們先回顧一下Servlet的工作原理,Servlet的工作原理跟小豬同學(xué)食堂就餐的過程很類似。小豬同學(xué)點了烤雞腿(要奧爾良風(fēng)味的),食堂窗口的服務(wù)員記下了菜單,想了想后廚的所有廚師,然后將菜單和餐盤交給專門制作烤雞腿的廚師,這位大廚根據(jù)菜單制作出奧爾良烤雞腿并放進餐盤,交給窗口服務(wù)員,服務(wù)員將做好的烤雞腿交給小豬同學(xué),小豬同學(xué)飽餐一頓后,菜單和餐盤就都被清理掉了,模擬情景的圖示如圖1所示。
?■?圖1?Servlet工作原理模擬情景
上述過程對應(yīng)到j(luò)ava中其實就是用戶通過瀏覽器向Web服務(wù)器發(fā)出HTTP請求,服務(wù)器選擇相應(yīng)的Servlet響應(yīng)瀏覽器的請求,并將響應(yīng)結(jié)果返回給瀏覽器。服務(wù)器在選擇相應(yīng)Servlet的時候會出現(xiàn)一些問題,如果該Servlet無法完成本次請求,它會怎么處理這種情況呢?在Servlet中有兩種機制可以幫助我們解決上述問題,Servlet工作原理解釋如圖2所示。
■?圖2?Servlet工作原理
如果廚師不會做這道菜怎么辦呢?有兩種解決方案,就是我們本節(jié)的內(nèi)容請求轉(zhuǎn)發(fā)與重定向,模擬情景如圖3所示。
?■?圖3 重定向和轉(zhuǎn)發(fā)的由來
01、請求轉(zhuǎn)發(fā)原理
如果小豬到飯店點了麻辣涼粉,飯店的服務(wù)員記下了菜單,把這道菜交給了面點師傅。雖然涼粉是淀粉類食品,可是這道菜面點師傅不會做,應(yīng)該交給炒菜的師傅來完成這道菜,于是面點師傅將菜單還給服務(wù)員,讓服務(wù)員去找炒菜的師傅。服務(wù)員知道自己搞錯了之后立刻把菜單交給炒菜師傅,炒菜師傅根據(jù)菜單制作出了麻辣涼粉并放入盤中交給服務(wù)員,服務(wù)員再將做好的涼粉交給小豬同學(xué)。這種在同一個飯店更換廚師并且不需要顧客再次點菜的處理方式叫做請求轉(zhuǎn)發(fā),其模擬情景如圖4所示。
■?圖4 請求轉(zhuǎn)發(fā)模擬情景
用戶通過訪問Web瀏覽器提出請求,由Servlet引擎創(chuàng)建Servlet1實例以及request和response對象,然后調(diào)用Servlet1的service()函數(shù)響應(yīng)用戶請求,service方法讀取請求內(nèi)容,寫入響應(yīng)內(nèi)容,其工作原理如圖5所示。
■?圖5??Servlet工作原理
在執(zhí)行service()方法時如果遇到了請求轉(zhuǎn)發(fā)forward命令,說明當(dāng)前Servlet處理不了用戶的請求,就要立刻調(diào)整請求頭為forward命令中請求的Servlet2,清空響應(yīng)對象的響應(yīng)體,然后返回到Servlet引擎,請求轉(zhuǎn)發(fā)中執(zhí)行service方法的工作原理解釋如圖6所示。
■?圖6請求轉(zhuǎn)發(fā)的工作原理圖示2
service函數(shù)執(zhí)行完畢后返回,服務(wù)器將響應(yīng)結(jié)果發(fā)送到Web瀏覽器中,請求轉(zhuǎn)發(fā)中service方法執(zhí)行完畢后的工作原理解釋如圖7所示。
?■?圖7 請求轉(zhuǎn)發(fā)的工作原理圖示3
02、重定向原理
可是如果飯店里的廚師都不會做小豬同學(xué)點的菜該怎么辦呢?我們接下來就介紹另一種方式。如果小豬到川菜館點了一份壽司,服務(wù)員將菜單遞給廚師之后大廚發(fā)現(xiàn)所有的廚師都不會做壽司,于是川菜師傅將菜單還給服務(wù)員并告訴他日料館的地址,再由川菜館的服務(wù)員告訴小豬川菜館做不了壽司,他應(yīng)該去吃貨街的日料館。知道自己找錯地方之后小豬就來到吃貨街找到日料館向服務(wù)員點了一份壽司,經(jīng)過點菜,做菜,上菜的流程之后小豬終于如愿吃到了壽司。這種顧客需要到別的飯店重新提出請求的方式叫做重定向,如圖7和8所示。
?■?圖8?重定向模擬情景1
■?圖9 重定向模擬情景2
用戶通過訪問Web瀏覽器提出請求,由Servlet引擎創(chuàng)建Servlet1實例以及request和response對象,然后調(diào)用Servlet1的service()函數(shù)響應(yīng)用戶請求,其工作原理如圖10所示。
■圖10?Servlet工作原理
但是若在service中執(zhí)行到了sendRedirect重定向命令,說明當(dāng)前Servlet響應(yīng)不了用戶的請求,需要清空響應(yīng)體中已經(jīng)寫入的內(nèi)容,將能夠響應(yīng)用戶請求的Servlet2的地址寫入響應(yīng)體中,然后將結(jié)果返回至服務(wù)器,執(zhí)行sendRedirect方法的工作原理如圖11所示。
■?圖11?重定向工作原理1
瀏覽器接到包含重定向地址的響應(yīng)信息后會自動重新提交請求,Servlet引擎創(chuàng)建Servlet2實例同時創(chuàng)建新的request和response對象,然后調(diào)用Servlet2的service()函數(shù)響應(yīng)用戶請求,request和response方法的工作原理如圖12所示。
■?圖12 重定向工作原理2
瀏覽器接到包含重定向地址的響應(yīng)信息后會自動重新提交請求,Servlet引擎創(chuàng)建Servlet2實例同時創(chuàng)建新的request和response對象,然后調(diào)用Servlet2的service()函數(shù)響應(yīng)用戶請求,新的Servlet引擎執(zhí)行service方法的工作原理如圖13所示。
■?圖13 重定向工作原理3
service方法讀取請求信息,寫入響應(yīng)信息,執(zhí)行完畢之后返回,由服務(wù)器將結(jié)果發(fā)送至瀏覽器。
03、請求轉(zhuǎn)發(fā)和重定向
實現(xiàn)請求轉(zhuǎn)發(fā)的方式:
(1)得到RequestDispatcher對象:RequestDispatcher dispatcher=
request.getRequestDispatcher("a.jsp");
(2)轉(zhuǎn)發(fā) dispatcher.forward (request,response);
實現(xiàn)重定向的方式:
重定向response.sendRedirect("a.jsp");
RequestDispatcher.forward方法只能在同一個Web應(yīng)用程序內(nèi)的資源之間轉(zhuǎn)發(fā)請求。
sendRedirect方法還可以重定向到同一個站點上的其他應(yīng)用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
案例1:?中用判斷三角形的三邊是否滿足構(gòu)成三角形的條件來實現(xiàn)請求轉(zhuǎn)發(fā)和重定向,通過Example1_b_triangle_judge.jsp頁面輸入三角形的三標,然后提交到相應(yīng)的Servlet進行處理和邏輯的判斷,在Servlet代碼中獲取來自JSP頁面的三邊數(shù)據(jù)信息,若三邊不構(gòu)成三角形或者輸入的三邊均小于0則會重定向到初始頁面,即Example1_b_triangle_judge.jsp頁面重新輸入數(shù)據(jù)信息,若三邊滿足構(gòu)成三角形的條件則會轉(zhuǎn)發(fā)到Example1_c_triangle_judge_show.jsp頁面,并在該頁面中輸出三邊的邊長和面積。
注意:
web.xml<servlet>
<servlet-name>triangleServlet</servlet-name>
<servlet-class>com.programs.Example1_a_triangleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>triangleServlet</servlet-name>
<url-pattern>/triangle_judge</url-pattern>
</servlet-mapping>Example1_a_triangleServlet.java
?JSP頁面提交的目的地址對應(yīng)的Servlet需要與Web.xml文件中的<url-pattern>相對應(yīng),而不是<servlet-name>對應(yīng)。
@WebServlet(name = "triangleServlet")
public class Example1_a_triangleServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String sidea = request.getParameter("sidea");String sideb = request.getParameter("sideb");String sidec = request.getParameter("sidec");int sideA = Integer.parseInt(sidea);int sideB = Integer.parseInt(sideb);int sideC = Integer.parseInt(sidec);if (sideA < 0 || sideB < 0 || sideC < 0 ||(sideA + sideB <= sideC || sideB + sideC <= sideA || sideA + sideC <= sideB)) {response.sendRedirect("Example1_b_triangle_judge.jsp");} else {RequestDispatcher dispatcher = request.getRequestDispatcher("Example1_c_triangle_judge_show.jsp");dispatcher.forward(request, response);//請求轉(zhuǎn)發(fā)}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}Example1_b_triangle_judge.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>三角形判斷</title>
</head>
<body>
<form action="triangle_judge">
<p>使用三角形案例實現(xiàn)轉(zhuǎn)發(fā)和重定向</p>
<b>輸入邊長a:</b><input type="text" name="sidea"><br>
<b>輸入邊長b:</b><input type="text" name="sideb"><br>
<b>輸入邊長c:</b><input type="text" name="sidec"><br>
<input type="submit" value="提交">
</form>
</body>
</html>Example1_c_triangle_judge_show.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>符合三角形</title>
</head>
<body>
<h3>這是請求轉(zhuǎn)發(fā)得到的界面</h3>
<p>輸入的三角形三邊滿足構(gòu)成三角形的條件</p>
<%String sidea = request.getParameter("sidea");String sideb = request.getParameter("sideb");String sidec = request.getParameter("sidec");
%>
<p>三邊分別為:<%= sidea%>、<%= sideb%>、<%= sidec%>
</p>
<%int sideA = Integer.parseInt(sidea);int sideB = Integer.parseInt(sideb);int sideC = Integer.parseInt(sidec);double p = (sideA + sideB + sideC) / 2.0;double area = Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
%>
其面積為<%= area%>
</body>
</html>
?請求轉(zhuǎn)發(fā)和重定向的案例頁面顯示如圖14、15、16、17所示,當(dāng)輸入的三邊滿足構(gòu)成三角形條件時,轉(zhuǎn)發(fā)到顯示頁面并輸出三角形各邊信息和三角形的面積,若不滿足構(gòu)成三角形條件時,則重定向到初始頁面中。
?■?圖14 請求轉(zhuǎn)發(fā)和重定向案例6_6初始化頁面顯示
■?圖15 請求轉(zhuǎn)發(fā)和重定向案例6_6提交頁面顯示
■?圖16 請求轉(zhuǎn)發(fā)和重定向案例6_6轉(zhuǎn)發(fā)頁面顯示
■?圖17 請求轉(zhuǎn)發(fā)和重定向案例6_6重定向頁面顯示
04、重定向與轉(zhuǎn)發(fā)區(qū)別
第一:資源使用范圍不一樣。請求轉(zhuǎn)發(fā)的轉(zhuǎn)發(fā)對象只能是當(dāng)前Web應(yīng)用程序的服務(wù)器中的資源;重定向不僅可以在同一服務(wù)器中使用,還可以將請求重定向到其他Web服務(wù)器;
第二:請求響應(yīng)的次數(shù)不一樣,請求轉(zhuǎn)發(fā)只需要一次請求與響應(yīng)過程,重定向需要兩次請求與響應(yīng)過程;
第三:請求轉(zhuǎn)發(fā)的URL地址欄是不變,因為只有一次請求與響應(yīng),重定向會改變地址欄,因為有兩次請求與響應(yīng)過程;
第四:請求轉(zhuǎn)發(fā)的兩個Servlet實例共用請求響應(yīng)對象,重定向需要創(chuàng)建兩次請求與響應(yīng)對象。