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

好的,根据您的要求,以下是第2章Servlet编程基础的教案。 一、授课形式: 本节课采用讲授和实例演示相结合的授课形式。讲授部分主要介绍Servlet编程基础的相关知识点,实例演示部分则通过具体案例演示,展示Servlet编程基础在实际开发中的应用。 二、教学目的要求: 1. 理解Servlet编程基础的相关知识点; 2. 掌握http(请求数据、响应数据)的知识; 3. 了解Servlet获取请求参数的方法(获取请求请求方式、路径); 4. 掌握请求和响应中的中文乱码问题及其解决方法; 5. 能够用Servlet搭建小型应用系统(系统原型、JDBC、连接数据库、查看数据、提问上报、请求重定向)。 三、教学重点: 1. http(请求数据、响应数据)的知识; 2. Servlet获取请求参数的方法(获取请求请求方式、路径); 3. 请求和响应中的中文乱码问题及其解决方法; 4. Servlet的基本原理及其应用。 四、教学难点: 1. 掌握http(请求数据、响应数据)的知识; 2. 理解Servlet获取请求参数的方法(获取请求请求方式、路径); 3. 理解请求和响应中的中文乱码问题及其解决方法; 4. 理解Servlet的基本原理及其应用。 五、教学方法手段: 1. 讲授:通过PPT和板书等方式,介绍Servlet编程基础的相关知识点; 2. 实例演示:通过具体案例演示,展示Servlet编程基础在实际开发中的应用; 3. 互动讨论:通过提问、回答等方式,促进学生对Servlet编程基础的理解和掌握。 六、教学内容及过程设计: 1. Servlet编程基础概述 a. 什么是Servlet? b. Servlet的基本原理和应用场景。 2. http(请求数据、响应数据) a. http请求的基本格式。 b. http响应的基本格式。 3. Servlet获取请求参数 a. 获取请求的方式。 b. 获取请求请求方式。 c. 获取请求的路径。 4. 请求和响应中的中文乱码问题 a. 中文编码的基本概念。 b. 请求中的中文乱码问题及其解决方法。 c. 响应中的中文乱码问题及其解决方法。 5. Servlet的应用实例 a. 搭建开发环境。 b. 设计系统原型。 c. 编写Servlet程序,连接数据库。 d. 查看数据,提问上报。 e. 请求重定向,返回数据。 七、作业: 1. 搭建Servlet开发环境,并编写一个简单的Servlet程序,实现http(请求数据、响应数据)、Servlet获取请求参数、请求和响应中的中文乱码问题的处理。 八、课后小结: 通过本节课的学习,我们了解了Servlet编程基础的相关知识点,掌握了http(请求数据、响应数据)的知识,了解了Servlet获取请求参数的方法,了解了请求和响应中的中文乱码问题及其解决方法,掌握了Servlet的基本原理及其应用。在实际开发中,我们可以根据具体需求选择合适的Servlet开发框架,以提高开发效率和应用性能。 九、参考资料: 1. 《Java Servlet技术详解》 2. 《Servlet和JSP技术教程》 3. 《Head First Servlets and JSP: Passing the Sun Certified Web Component Developer Exam》
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值