JavaEE进阶 请求转发与请求重定向

本篇JavaEE进阶教程将为大家讲解JavaEE进阶编程的知识点,看完这篇文章会让你对JavaEE进阶编程的知识点有更加清晰的理解和运用。在转发的过程中,可以把数据存放到request域对象中去,但是在重定向的过程中,不能把数据存放到request域对象中去。

一. 请求转发的细节

1. forward方法用于将请求转发到RequestDispatcher对象封装的资源。

2. 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。

3. 如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。

二. 请求转发与请求重定向

1. 请求转发

一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

2. 请求重定向

一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

三. 请求转发与请求重定向的区别

1. 区别:

(1) RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

(2) 如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。

(3) 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

(4) HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

(5) RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

2. 总结:

(1) 转发

① 地址栏不会改变;

② 转发只能转发到当前web应用内的资源;

③ 在转发过程中,可以把数据保存到request域对象中;

(2) 重定向

① 地址栏会改变,变成重定向到的地址;

② 重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站;

③ 在重定向的过程,不能把数据保存到request域对象中。

注意:如果要使用request域对象进行数据共享,只能用转发技术。

四. 实例

1. 实例

(1) ForwardDemo1/*

* 转发(效果:跳转页面)

*/

@WebServlet("/ForwardDemo1")

public class ForwardDemo1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

* 保存数据到request域对象

*/

request.setAttribute("name", "Jack");

/*

* 注意:不能转发到当前web应用以外的资源

*/

/*

RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDateServlet");

rd.forward(request, response);

*/

this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);//注释内容的简写

}

}

(2) RedirectDemo1/*

* 重定向

*/

@WebServlet("/RedirectDemo1")

public class RedirectDemo1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

* 保存数据到request域对象

*/

request.setAttribute("name", "Rose");

// 重定向

/*

* 注意:可以跳转到web应用内或其他web应用,甚至其他外部域名。

*/

response.sendRedirect("/zw_Servlet/GetDateServlet");

}

}

(3) GetDateServlet@WebServlet("/GetDateServlet")

public class GetDateServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

* 从request域对象中获取数据

*/

String name = (String) request.getAttribute("name");

System.out.println("name=" + name);

}

}

2. 运行结果

3. 存在的问题与解决

(1) 疑问:为什么访问ForwardDemo1的时候可以读取出name=Jack,而访问RedirectDemo1的时候却读取出

name=null?

(2) 分析:

tomcat服务器中有转发ForwardDemo1和重定向RedirectDemo1,它们都要跳转到GetDataServlet。

①当用户访问ForwardDemo1的时候,转发的原理是:

用户发送request对象给ForwardDemo1,而ForwardDemo1把request对象转发给目标资源GetDateServlet,转发是服务器内部的行为,转发的这个request对象和用户发送的request对象是同一个对象而在ForwardDemo1中保存了数据,保存的数据放在了request对象中去,把数据发到另外一个Servlet中,那么另外一个Servlet是可以拿到这个数据的。因为是同一个请求。

②当用户访问RedirectDemo1的时候,重定向的原理是:

当用户发送请求request给RedirectDemo1,那么RedirectDemo1先进行数据保存,然后立刻发送一个响应给用户,响应的内容是302+location,接着用户请求GetDateServlet,这个GetDateServlet再返回一个响应给用户。但是我们是在GetDateServlet中去拿出数据,而第二次的请求和第一次的请求是完全不同的请求对象,所以第一次存的数据,第二次根本拿不了。

以上内容由职坐标整理并发布,欢迎大家前来职坐标学习!

java中请求转发与重定向_JavaEE进阶 请求转发与请求重定向相关推荐

  1. Java中的证书透明度验证

    因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易. 牺牲了整个周末的一半时间,我可以证明这并不是一件小事. 但是, 证书透明性是什么? ...

  2. springmvc java中转发_Springmvc中的转发重定向和拦截器的示例

    本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下: 可变参数在设计方法时,使用 数据类型...来声明参数类型,例如: public static void functio ...

  3. java | (二十五)Servlet(1)req,resp,重定向,请求转发,数据共享

    今天(2021.9.24)开始学习一些有难度的知识了,如题 先安装和配置好Tomcat,具体下载和idea的配置可以参考 目录 开发步骤 Servlet对象生命周期 httpServletRespon ...

  4. Java中重定向,转发深入理解 2021-04-26

    关于重定向还有转发的一些了解,首先这篇博文是写的关于没有视图解析器的情况下怎么进行重定向和转发- ·····转发与重定向的区别 实现转发调用的是HttpServletRequest对象中的方法 实现重 ...

  5. Java中重定向和转发的区别

    重定向的概念: 客户浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客     户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求 ...

  6. java中forward和redirect_java中转发forward和重定向redirect的区别

    Forward(转发) 是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是 ...

  7. java 异步请求重定向_JavaEE通过response实现请求重定向

    请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.302状态码和location头即可实现重定向. 请求重定向最常见的应用场景就是用户登录. 下面 ...

  8. Java中转发(Forward)和重定向(Redirect)的区别

    从URL来说,转发的地址栏没有发生改变,而重定向则是新的URL 从数据共享来说,转发可以共享request域里面的数据,而重定向则不能. 效率来说转发效率高,重定向效率低 转发一般用来登陆后转发到对应 ...

  9. java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据

    原标题:Java程序员必看之springmvc中的Model对象在重定向中的数据 在springmvc框架中,一个handler方法中的参数可以内置接收Model类型的对象,主要用于存储数据之用,主要 ...

最新文章

  1. Ubuntu 系统自带的截图工具screenshot
  2. Solr 中遇到的问题
  3. @EnableGlobalMethodSecurity(prePostEnabled = true)
  4. 一文带你了解mysql sql model的only_full_group_by模式含Error 1055问题分析
  5. get√—搜索微信公众号【Dotnet跨平台】指定文章的办法
  6. Java 8陷阱–提防Files.lines()
  7. ORACLE中数据类型
  8. element ui 多个子组件_ElementUI 技术揭秘(2) 组件库的整体设计
  9. 研究称语言能力比数学能力更重
  10. 学习python_day2
  11. 28.go fmt 与 gofmt
  12. Java开发笔记(一百四十九)引入预报告的好处
  13. Git和Github的基本操作
  14. 工程热力学c语言 朗肯循环第二题,软件工程上机实验报告_相关文章专题_写写帮文库...
  15. linux系统下的shell是什么,Linux系统中shell各命令的区别有什么?
  16. Oracle图书管理系统
  17. C# Chart 曲线(多曲线展示)
  18. 21世纪以来14起最大的数据泄露事件
  19. 大学生集体户口面临孩子落户困境
  20. CodeGear RAD 2007 SP4 最新下载及破解

热门文章

  1. 基于GPU的粒子系统
  2. 前端技术演进(六):前端项目与技术实践
  3. 可以用手机实现的移动端车牌识别功能
  4. 1、Springboot环境的搭建
  5. sbt创建web项目
  6. Oracle教程之SGA_MAX_SIZE参数
  7. SQL Server游标
  8. 学会python的基础操作题_Python基本操作题
  9. python装饰器详解51-python装饰器使用实例详解
  10. 【系统架构设计师】软考高级职称,来自订阅者真实反馈,从理论、实践、技巧让你掌握论文写作秘诀