实例演练2-3:使用forward()方法转送HTTP请求
在实例演练2-3中,您将学习如何使用forward()方法,实现步骤如下:
(1) 建立两个Servlet:ServletA与ServletB
(2) 在ServletA的doGet()方法内调用forward()方法,将HTTP请求转送给ServletB
n Step 1:撰写ServletA.java
首先,请利用文字编辑器撰写一个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范例程序中,下列两点应值得注意:
为了方便管理,笔者将ServletA.java包含在scwcd.lab02组件包内。这意味着您必须先在<Tomcat安装路径>\webapps\ROOT\WEB-INF\classes目录内建立一个scwcd目录,再建立一个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()方法来取得RequestDispatcher对象的。注意,path变量设定为"/servlet/scwcd.lab02.ServletB"(假设ServletB也位于scwcd/lab02目录下)。第19行则是利用forward()方法执行“请求转送”动作。
n Step 2:撰写ServletB.java
以下是ServletB的完整程序代码。这个Servlet被调用时将传回“ 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,请在命令提示符下切换到该目录,然后执行javac编译这两个Servlet。
n 如果ServletA.java与ServletB.java存放在其他目录下,可先行编译这两个Servlet,然后将ServletA.class与ServletB.class复制到C:\Tomcat\webapps\ROOT\WEB-INF\classes\scwcd\ lab02目录下。
n Step 4:在浏览器内执行ServletA
完成Servlet的编译后,重新启动Tomcat服务器,然后在浏览器内输入下列网址:
http://localhost:8080/servlet/scwcd.lab02.ServletA
执行结果如图2-14所示。
screen.width-333)this.width=screen.width-333">
图2-14 ServletA的执行结果(由ServletB予以回应)
依照ServletA.java的程序代码(第12~15行),应该会由PrintWriter对象(out)打印出“This is generated by ServletA!”信息,但是执行结果却只有ServletB的回应信息,这是因为调用forward()方法前,原先存放在HttpResponse对象的内容已经被清除,所以浏览器内只会显示ServletB的回应结果。这一点是在调用forward()方法时必须特别小心的。
|