Servlet请求转发 RequestDispatcher接口

在Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应。

一,RequestDispatcher接口方法简介  

     1,RequestDispatcher对象由Servlet容器来创建,封装一个由路径所标识的服务器资源。    

     2,RequestDispatcher接口中定义了二种方法用于请求转发:    

           forward(ServletRequest,ServletResponse)方法:      

                   将请求转发给服务器上另外一个Servlet,JSP页面,或者HTML文件      这个方法必须在响应被提交给客户端之前调用,否则抛出异常。      

                  方法调用后在响应中的没有提交的内容被自动消除。    

           include(ServletRequest,ServletResponse)方法 :     

                 用于在响应中包含其他资源(Servlet,JSP页面或HTML文件)的内容。      

                 即请求转发后,原先的Servlet还可以继续输出响应信息,转发到的Servlet对请求做出的响应将并入原先Servlet的响应对象中。      

      3,forward方法和include方法的区别:

                  forward方法调用后在响应中的没有提交的内容被自动消除。   include方法使原先的Servlet和转发到的Servlet都可以输出响应信息。   

 

二,得到RequestDispatcher对象  

      三种方法可以得到RequestDispatcher对象:   

             1,利用ServletRequest接口中的getRequestDispatcher(String  path)方法。   

             2,ServletContext接口中getNamedDispatcher(String  path)和getRequestDispatcher(String  path)方法。 

     ServletRequest接口和ServletContext接口中getRequestDispatcher方法区别:   

              1,参数的区别    

                      参数虽然都是资源路径名,ServletContext接口的中参数路径必须以“/”开始,是相对于当前Servlet上下文根,    ServletRequest接口中的参数路径不仅可以相对于当前Servlet上下文根,还可以相对与当前Servlet路径    

             2,跨WEB应用程序访问资源    

                      通过ServletContext.getContext()方法获取另个WEB应用程序的上下文环境对象来    调用getRequestDispatcher(String  path)方法 将请求转发到另个WEB应用程序的资源。                       

                     还需要在当前WEB应用程序配置中设置<context>元素,指定crossContext属性值为true。

三,ServletResqonse接口中的sendReadirect()方法和forward()方法的区别  

       二个方法都是用于请求转发的方法,转发给另外的资源为客户端服务。但二者有本质的区别

       sendReadirect()方法原理:   

              1,客户端发送请求,Servlet1做出处理。   

              2,Servlet1调用sendReadirect()方法,将客户端的请求 重新定位 到Servlet2。   

              3,客户端浏览器访问Servlet2.  

              4,Servlet2对客户端浏览器做出响应。 

       forward()方法原理:  

             1,客户端发送请求,Servlet1做出处理。  

             2,Servlet1调用sendReadirect()方法,将请求转发给Servlet2来处理请求,为客户端服务。   

             3,Servlet2对客户端浏览器做出响应。      

      区别:   

           1,定位与转发   

                    sendReadirect()方法是重新定位到另外一个资源来处理请求,URL会重新定位,让客户端重新访问另外一个资源。    forward()方法是转发到另外一个资源来处理请求。URL不会变化。隐藏了处理对象的变化。   

           2,处理请求的资源的范围   

                  sendReadirect()方法可以跨WEB应用程序和服务器重新定位资源来处理请求。    forward()方法只能在应用程序内部转发。

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,这是一个基本的客户端和服务器端C语言程序的示例: 服务器端代码(server.c): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int serv_sock, clnt_sock; struct sockaddr_in serv_addr, clnt_addr; socklen_t clnt_addr_size; char buf[BUF_SIZE]; FILE *fp; if (argc != 2) { printf("Usage: %s <port>\n", argv[0]); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); if (serv_sock == -1) { perror("socket"); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { perror("bind"); exit(1); } if (listen(serv_sock, 5) == -1) { perror("listen"); exit(1); } printf("Waiting for client...\n"); clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size); if (clnt_sock == -1) { perror("accept"); exit(1); } printf("Client connected: %s:%d\n", inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port)); fp = fopen("test.txt", "r"); if (fp == NULL) { perror("fopen"); exit(1); } while (fgets(buf, BUF_SIZE, fp) != NULL) { write(clnt_sock, buf, strlen(buf)); } fclose(fp); close(clnt_sock); close(serv_sock); printf("Disconnected.\n"); return 0; } ``` 客户端代码(client.c): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int sock; struct sockaddr_in serv_addr; char buf[BUF_SIZE]; int read_len; if (argc != 3) { printf("Usage: %s <IP> <port>\n", argv[0]); exit(1); } sock = socket(PF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("socket"); exit(1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { perror("connect"); exit(1); } while ((read_len = read(sock, buf, BUF_SIZE)) > 0) { write(STDOUT_FILENO, buf, read_len); } close(sock); return 0; } ``` 注意:在运行前,需要在同一目录下创建一个名为test.txt的文件,里面写入一些文字内容。 运行方法: 1. 在终端进入到程序所在目录。 2. 编译服务器端程序:gcc -o server server.c 3. 编译客户端程序:gcc -o client client.c 4. 运行服务器端程序:./server 8080 5. 在另一个终端运行客户端程序:./client 127.0.0.1 8080 运行结果: 客户端会收到服务器端返回的test.txt文件的内容,并在终端显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值