實(shí)例演練2-3:使用forward()方法轉(zhuǎn)送HTTP請(qǐng)求 在實(shí)例演練2-3中,您將學(xué)習(xí)如何使用forward()方法,實(shí)現(xiàn)步驟如下: (1) 建立兩個(gè)Servlet:ServletA與ServletB (2) 在ServletA的doGet()方法內(nèi)調(diào)用forward()方法,將HTTP請(qǐng)求轉(zhuǎn)送給ServletB n Step 1:撰寫ServletA.java 首先,請(qǐng)利用文字編輯器撰寫一個(gè)ServletA.java,其完整程序代碼如下: 1. package scwcd.lab02; 2. 3. import java.io.*; 4. import javax.servlet.*; 5. import javax.servlet.http.*; 6. 7. public class ServletA extends HttpServlet { 8. public void doGet(HttpServletRequest request, 9. HttpServletResponse response) 10. throws IOException, ServletException { 11. response.setContentType("text/html"); 12. PrintWriter out = response.getWriter(); 13. out.println("<html><body>"); 14. out.println("This is generated by ServletA!"); 15. out.println("</body></html>"); 16. 17. String path = "/servlet/scwcd.lab02.ServletB"; 18. RequestDispatcher rd = request.getRequestDispatcher(path); 19. rd.forward(request, response); 20. } 21. } 在ServletA.java范例程序中,下列兩點(diǎn)應(yīng)值得注意: 為了方便管理,筆者將ServletA.java包含在scwcd.lab02組件包內(nèi)。這意味著您必須先在<Tomcat安裝路徑>\webapps\ROOT\WEB-INF\classes目錄內(nèi)建立一個(gè)scwcd目錄,再建立一個(gè)lab02子目錄,然后將ServletA.java存放在lab02目錄下(您也可以將ServletA.java存放在其他目錄,只將編譯后的ServletA.class存放在lab02目錄下)。這樣做的好處是有利于各種Servlet類文件的管理。 17. String path = "/servlet/scwcd.lab02.ServletB"; 18. RequestDispatcher rd = request.getRequestDispatcher(path); 19. rd.forward(request, response); 第17~18行是利用ServletRequest接口的getRequestDispatcher()方法來(lái)取得RequestDispatcher對(duì)象的。注意,path變量設(shè)定為"/servlet/scwcd.lab02.ServletB"(假設(shè)ServletB也位于scwcd/lab02目錄下)。第19行則是利用forward()方法執(zhí)行“請(qǐng)求轉(zhuǎn)送”動(dòng)作。 n Step 2:撰寫ServletB.java 以下是ServletB的完整程序代碼。這個(gè)Servlet被調(diào)用時(shí)將傳回“ This is generated by ServletB!”信息。注意,ServletB也隸屬于scwcd.lab02組件包。 1. package scwcd.lab02; 2. 3. import java.io.*; 4. import javax.servlet.*; 5. import javax.servlet.http.*; 6. 7. public class ServletB extends HttpServlet { 8. public void doGet(HttpServletRequest request, 9. HttpServletResponse response) 10. throws IOException, ServletException { 11. response.setContentType("text/html"); 12. PrintWriter out = response.getWriter(); 13. out.println("<html><body>"); 14. out.println("This is generated by ServletB!"); 15. out.println("</body></html>"); 16. } 17. } n Step 3:編譯ServletA與ServletB 參考下列方式編譯ServletA與ServletB: n 如果您是將ServletA.java與ServletB.java存放在C:\Tomcat\webapps\ROOT\WEB-INF\ classes\scwcd\lab02,請(qǐng)?jiān)诿钐崾痉虑袚Q到該目錄,然后執(zhí)行javac編譯這兩個(gè)Servlet。 n 如果ServletA.java與ServletB.java存放在其他目錄下,可先行編譯這兩個(gè)Servlet,然后將ServletA.class與ServletB.class復(fù)制到C:\Tomcat\webapps\ROOT\WEB-INF\classes\scwcd\ lab02目錄下。 n Step 4:在瀏覽器內(nèi)執(zhí)行ServletA 完成Servlet的編譯后,重新啟動(dòng)Tomcat服務(wù)器,然后在瀏覽器內(nèi)輸入下列網(wǎng)址: http://localhost:8080/servlet/scwcd.lab02.ServletA 執(zhí)行結(jié)果如圖2-14所示。 screen.width-333)this.width=screen.width-333"> 圖2-14 ServletA的執(zhí)行結(jié)果(由ServletB予以回應(yīng)) 依照ServletA.java的程序代碼(第12~15行),應(yīng)該會(huì)由PrintWriter對(duì)象(out)打印出“This is generated by ServletA!”信息,但是執(zhí)行結(jié)果卻只有ServletB的回應(yīng)信息,這是因?yàn)檎{(diào)用forward()方法前,原先存放在HttpResponse對(duì)象的內(nèi)容已經(jīng)被清除,所以瀏覽器內(nèi)只會(huì)顯示ServletB的回應(yīng)結(jié)果。這一點(diǎn)是在調(diào)用forward()方法時(shí)必須特別小心的。 |