servlet中转发请求与重定向小结


请求转发:
方式:request.getRequestDispacther("/test.jsp").forword(request,response); 
过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,然后调用
request.getRequestDispacther("/test.jsp").forword(request,response); 
从字面上也可以理解:带着request,response向test.jsp前进!进!(完全自己意淫的,不要当真...)
请求和响应都被送到另一个Servlet或者jsp(特殊的Servlet)中。这样整个过程中,只有一个请求、一个响应,所有 Servlet和JSP都共享它俩(好可怜..偷笑),所以所有的Servlet和Jsp都可以从request中获取请求参数。


重定向:
方式:response.sendRedirect("test.jsp");
过程分析:客户端发出一个请求reqeust到服务器,服务器找到相应的Servlet处理数据,到这里都是一样一样的。然后调用
response.sendRedirect("test.jsp");
从字面上也可以理解:返回客户端一个叫test.jsp的页面。(不要当真...)
注意,这个方法是response的方法哦,这个时候它就已经给客户端响应了,这一次的请求、响应过程已经结束了!
但是呢,临了的时候它还告诉客户端,你要去test.jsp哈(死了都不老实,难怪活不过两集敲打)
于是乎客户端又向服务器发出一次去test.jsp的请求,根据http(s)特性,每次请求之间是完全独立的,所以本次请求到test.jsp页面,是不会再获取上一次request中的参数的。


不同点列举:
1、安全性
显然 请求转发更安全。一个请求在完成的过程中可能会通过多个Servlet,最终到达一个jsp页面,在整个过程中,url是不会变的。这样从客户端就看不出来服务器是由哪些资源来处理数据的。
而重定向更遵循”所见即所得“,也就是你所请求的资源,就是url显示的。比如重定向到test.jsp,url可能就是“localhost:8080/project_name/test/test.jsp”.这样不仅不安全,也限制了服务器端的灵活性。
2、可定位范围
重定向范围更广,应该说它可以重定向到任何有效的url。
而转发就比较杯具了,只能在服务器内部转发。


转发或重定向的url问题:
web.xml中有如下配置:
    <servlet>
        <servlet-name>testServlet</servlet-name>
        <servlet-class>com.test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/servlet/testServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>test</servlet-name>
        <jsp-file>/WEB-INF/test.jsp</jsp-file>//直接指向jsp的标签和指向servlet的标签是不同的
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/servlet/test.d</url-pattern>
    </servlet-mapping>

客户端发出请求,url:localhost/project_name/servlet/testServlet(注意这个url,下面的url都和这个链接有着密切的关系)。
服务器接收到请求并匹配TestServlet去处理这个请求。然后准备请求转发。
1、url为服务器外的目标,比如百度。
url="www.baidu.com";
request.getRequestDispacther(url).forword(request,response); 
这样是不会成功的。转发的最终请求链接是:localhost/project_name/servlet/www.baidu.com(这里前缀是亮点)。完全没有跳转到百度的意思...
那试试重定向吧:
url="www.baidu.com";
response.sendRedirect(url);
也不行...最终请求还是:localhost/project_name/servlet/www.baidu.com,根本没这个url地址嘛!
修改url:
url="https://www.baidu.com";
request.getRequestDispacther(url).forword(request,response); 
还是不成功。转发的最终请求链接是:localhost/project_name/servlet/https:/www.baidu.com(还被偷吃了一个/)。
那试试重定向吧:
url="https://www.baidu.com";
response.sendRedirect(url);
成了!就是这么无耐!哼!
2、url为服务器内的目标
url="servlet/test.d";
request.getRequestDispacther(url).forword(request,response); 
不成功。转发的最终请求链接是:localhost/project_name/servlet/servlet/test.d,显然不是一个可用的url嘛。
因为同样的原因,重定向也是失败的。
修改url:
url="test.d";
都成功。
小结:
1、
1-1、如果下一个地址是服务器以外的,则只能选择重定向了。
1-2、如果是服务器内的地址,要看是否需要第一次请求时的请求参数而定,推荐使用请求转发。
2、
2-1、对于新目录中没有http(s)的:
进入该servlet时的请求是:http(s)://ip:port/project_name/preA/preB/serv.do,
Servlet中下个目标地址是url,则转发或重定向的最终请求地址是:http(s)://ip:port/project_name/preA/preB/url.
2-2、对于下个目标地址中有http(s)的:
最终请求地址:
转发:http(s)://ip:port/project_name/preA/preB/url(url如果有连续的/会被删除一个)
重定向:url




addtion:
不管是重定向还是转发,并没有return这样功能,如果后面有代码的话,还会继续执行,直到所有代码执行完毕。
但是不要出现既有重定向又有请求转发的情况,不管哪个出现在前哪个出现在后,服务器会蒙*的。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值