第3.45课 上课 Servlet导航与传值, 包含(include), 转向(…

3_45

Servlet导航与传值

 服务器端重定向和客户端重定向区别

 

request.getRequestDispatcher(String arg)是服务器端重定向;

 

response.sendRedirect(String arg)是客户端重定向;

 

 

转向的特点:

1.地址栏的URl是不变,

如:servletA转向到servletB的时候,地址栏还是 A它本身,但是内容其实上已经是B的内容了。

2.上一次的请求参数还可以获取

 

重定向的特点:

1.地址栏的URL是会改变的

如:servletA转向到servletB的时候,地址栏就变成B了

2.上一次的请求参数不可以获取

 包含(include)

把多个资源包含在当前这个资源中。

  步骤

   获取RequestDispatcher

   执行include方法

  注意点

   可以同时调用多次include方法来包含多个页面

 转向(forward)

服务器内部请求转发的过程,称之为“转向”。转向后,所有的响应以目标的资源的为准,当前资源的响应会忽略掉。

 

1.转向的时候,分发到服务器(应用)内部的另外一个资源(重定向时可以是服务器(应用)外部的资源),浏览器的URL不会改变。

2.转向因为是在服务器(应用)内部发生的,他们两个资源的收到Request是同一个!两个请求的请求Method、请求参数都一致,但是请求的URI不同。

 

 

// 先获取到一个请求到/test2的请求分发器

RequestDispatcher dispatcher = request.getRequestDispatcher("/test2");

// 通过请求分发器,负责把请求转向到新资源

dispatcher.forward(request, response);

 

 

常用的场景:

1.Servlet判断请求参数中包含的一些标记,然后针对这些标记转发到不同的jsp/servlet进行处理。

2.把请求转发给合适的类进行请求的处理

 

 

 

 

  步骤

   获取RequestDispatcher

   执行forward方法

  注意点

   forward前后两个Servlet收到的request是同一个

   转向后,所有的响应以目标的资源为准,当前资源的响应会忽略掉

   执行转向的目标资源以/开头表示应用的根目录,没有/开头表示当前目录

 include和forward的区别

不同点:

 

1.

include是把多个资源全部包含在一个页面上显示;

forward把当前请求转向到另外一个资源进行处理。

2.forward把当前请求转交给另外一个资源去处理,而当前这个资源的处理结果会被忽略。

 

3.每个Servlet只能forward一次,但是可以执行多次include。

 

 

相同点:

 

forward() 跟include() 在执行的时候,浏览器地址栏那的地址是不会改变。

  include

   合并多个资源

   可以include多次

  forward

   只返回最后一个资源的结果

 重定向(redirect)

特点:

1.redirect 会忽略所有的响应消息体的内容。

2.每个重定向其实都是一个新的GET请求。

 

重定向请求的规则:

1.前面以/开头,表示访问服务器的根目录

2.响应状态码是302

3.重定向不能发送POST请求

4.如果每次都重定向给自己,意味着循环重定向。所以避免重定向给自己。

 

 

每次重定向,都是一个新的GET请求!

应用场景:

1.删除(更新、)记录以后

2.登陆后

 

 

 

  告诉浏览器,重新发送一个Get请求

  步骤:response.sendRedirect("<新的资源>");

  注意点

   重定向目标URL

    如果以/开头,表示服务器根目录

    如果没有以/开头,表示当前目录

   重定向永远不会有内容,Content-Length永远为0

   重定向以后,浏览器发送新的GET请求到Location指定的资源,导致浏览器地址栏会发生变化

   重定向之前提交的数据,在重定向后的资源中无法获取到,因为两个request不同

 导航注意点

1.无论是forward还是include,甚至是重定向redirect,都要避免循环的分发请求。

例如:A forwardA、A include 、A include B,然后B include A。

 

2.如果在流关闭以后,就不能再include、forward、sendRedirect。

 

3.如果调用response对象的getWriter方法以后,就不能再调

用response的getOutputStream方法。反之亦然。

posted on 2018-01-31 23:03  東風★破  阅读(171)  评论(0)    收藏  举报

导航