分享

请求转送(Request Dispatching)(1)

 zhuge 2006-09-04



实例演练2-3:使用forward()方法转送HTTP请求

在实例演练2-3中,您将学习如何使用forward()方法,实现步骤如下:

(1)         建立两个ServletServletAServletB

(2)         ServletAdoGet()方法内调用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范例程序中,下列两点应值得注意:

1. package scwcd.lab02;

为了方便管理,笔者将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);

1718行是利用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:编译ServletAServletB

参考下列方式编译ServletAServletB

n           如果您是将ServletA.javaServletB.java存放在C:\Tomcat\webapps\ROOT\WEB-INF\ classes\scwcd\lab02,请在命令提示符下切换到该目录,然后执行javac编译这两个Servlet

n           如果ServletA.javaServletB.java存放在其他目录下,可先行编译这两个Servlet,然后将ServletA.classServletB.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的程序代码(第1215行),应该会由PrintWriter对象(out)打印出“This is generated by ServletA!”信息,但是执行结果却只有ServletB的回应信息,这是因为调用forward()方法前,原先存放在HttpResponse对象的内容已经被清除,所以浏览器内只会显示ServletB的回应结果。这一点是在调用forward()方法时必须特别小心的。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多