分析:重定向和请求转发

重定向

  HttpServletResponse对象的sendRedirect(java.lang.String location)方法称作重定向

  如果location地址前面加上“/”,则表示相对于Servlet容器的根来请求,比如http://localhost:8080;如果location地址前面没有加上“/”,则表示相对于当前请求的URI来寻找地址。

请求转发

  RequestDispatcher的:forward(ServletRequest request, ServletResponse response)方法叫做请求转发。

实验例子1:重定向和请求转发似乎都是造成页面跳转

  第一个页面first.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'first.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="Second"> <input type="text" name="username"> <input type="submit" value="submit"> </form> </body> </html>

  第二个页面是Servlet:

  用请求转发:

package com.shengqishiwind.servlet;import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Second extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 请求转发 RequestDispatcher rd = request.getRequestDispatcher("third.jsp"); rd.forward(request, response); } }

  用重定向,则把处理方法改为:

    private void process(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{// 重定向 response.sendRedirect("third.jsp"); }

  第三个页面是third.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'third.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my Third page. <br> </body> </html>

  不管用请求转发还是重定向的方法,第一个页面点击提交后,都能顺利转到第三个页面:

  但是其实实际进行的操作还是很不同的,看下面的例子。

实验例子2:如果要在第三个页面中取得第一个页面输入的用户名

  请求转发的实现比较简单,第二个页面的Servlet代码不用添加任何东西,可以直接从第三个页面getParameter,即把third.jsp中的body改为:

  <body>This is my Third page. <br> 用户名:<%=request.getParameter("username") %> </body>

  则在第一个页面输入shengqishiwind,提交后,第三个页面显示:

  重定向应该怎么实现获取第一个页面提交的用户名呢?

  第三个页面采用如上的代码(通过getParameter获取参数),把第二个页面中改为重定向的跳转方式,重新来一次,可以看到显示:

  再尝试第二个页面这样(通过setAttribute存储值):

    private void process(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{String username = request.getParameter("username"); // 重定向 request.setAttribute("username", username); response.sendRedirect("third.jsp"); }

  然后第三个页面这样获取:

     用户名:<%=request.getAttribute("username") %> 

  仍然是不行,得到的仍然是null值。

重定向和请求转发的区别

请求转发:

  RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。

  请求转发,整个过程处于同一个请求当中。

  不管经历了多少组件,都可以从request中直接取得想要的值。

  使用请求转发时,到结果页面的网址是:http://localhost:8080/HelloWeb/Second?username=wind

重定向:

  sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法。

  既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

  sendRedirect调用后会向客户端返回一个响应,这个响应告诉客户端要转向的页面,紧接着客户端又会发送一个新的请求,转向这个目标页面。

  也即是说,重定向的过程中实际上客户端会向服务器发送两个请求。

  使用重定向时,结果页面的网址是:http://localhost:8080/HelloWeb/third.jsp

  说明客户端已经知道了结果页面的地址,是重新发送的全新的请求。

  重定向方式在Firebug中的图:

  总结记忆请求转发只有一个请求,所以勇往直前,调用的方法叫forward;而重定向需要客户端重新发送请求,调用的是sendRedirect,名字里有个Re,表示重复。

参考资料:

  圣思园张龙老师视频教程。

  Java Document API with examples:

  http://www.javadocexamples.com/

转载于:https://www.cnblogs.com/liu-Gray/p/4840363.html

分析:重定向和请求转发相关推荐

  1. JSP中的重定向和请求转发以及它们的区别

    我们先硬着头皮看一下重定向的定义: 重定向(Redirect): 客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方 ...

  2. 3.相应重定向与请求转发的比较

    响应重定向与请求转发类似,但有下面的区别: (1)RequestDispatcher对象是一个Web资源的包装器,可以用来把当前请求转发到该资源.这种转发是服务器端控制权的转向,客户端发来的请求将交由 ...

  3. 请求转发和重定向的区别_WEB之重定向和请求转发的区别

    一次重定向的过程 我的代码里面已经写好了,redirectAndFoward.jsp页面上有一个表单,表单重定向到redirectAndFowardTarget.jsp,那么这一次的重定向过程为: 1 ...

  4. 重定向与请求转发的区别及什么时候使用

    重定向与请求转发的区别 一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求-->web服务器接受此请求-->调用内 ...

  5. SpringMVC重定向与请求转发

    SpringMVC重定向与请求转发 一,请求转发 ①请求转发地址栏不会发生改变 ②请求转发只发送一次请求.能携带原有的参数 ③请求转发只可以在同一个服务器中进行转发 ④实际上视图解析器的转发本质也是请 ...

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

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

  7. 页面的跳转——请求重定向和请求转发

    目录 一.重定向(Redirect) 二.转发(Forward) 三.重定向和请求转发的区别 相同点 不同点 一.重定向(Redirect) 请求重定向是客户端行为.是指当浏览器请求一个URL时,服务 ...

  8. 相对地址与绝对地址的区别?请求重定向与请求转发的区别?jsp有哪九大内置对象?servlet如何获取session和application对象?

    目录 1.说说相对地址与绝对地址的区别? 2.说说请求重定向与请求转发的区别? 3.jsp有哪九大内置对象?servlet如何获取session和application对象? 1.说说相对地址与绝对地 ...

  9. 重定向与请求转发的具体讲解

    本篇供个人学习使用,有问题欢迎讨论 多个Servlet来处理同一次请求方案 一.前提 1.一个 servlet 只负责实现一个功能 2.浏览器在一次请求时,只能请求一个资源文件 3.如果浏览器的请求需 ...

最新文章

  1. 剑指offer_第17题_树的子结构_Python
  2. TensorRT(3)-C++ API使用:mnist手写体识别
  3. 关于miniconda的安装,配置以及包批量安装和使用
  4. 模板题——图论相关(1)
  5. ARC098E Range Minimum Queries
  6. Linux下安装配置maven
  7. 各地的磁倾角_中国各地磁偏角
  8. HTML 网页特殊符号代码大全
  9. LaTeX简介及其在Mardown中的用法
  10. UML工具大全(上)
  11. php 风水起名网站源代码_202002年PHP开运网运势测算网站源码 鼠年风水起名/八字算命/算财运姻缘/易经周易/占卜+安装说明...
  12. Prim算法(JAVA实现-邻接矩阵)
  13. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...
  14. 健康饮食(地中海式饮食+DASH饮食)
  15. 手机支付平台付款码分析
  16. (六)温故知新系列之RXJS——RXJS操作符基础(转化类)
  17. OpenCV头像识别采集训练数据
  18. 腾讯云Linux服务器如何安装Discuz个人论坛?
  19. rpc wmi 服务不可用_“RPC服务器不可用”使用WMI查询
  20. 高清,图片,ppt,下载

热门文章

  1. sql server实用工具sql prompt的安装与注册
  2. linux安装thrift
  3. select, poll, epoll
  4. (7)Xilinx PCIE 接口调试总结(学无止境)
  5. (86)Verilog HDL:三分频设计
  6. FPGA设计思想与技巧
  7. FPGA资源不足导致vivado生成bit失败
  8. FPGA原语使用方法
  9. mysql yum安装包下载_yum 下载安装包
  10. python 博弈论 社会网络_【 统计应用 】 社会网络分析SNA报告-学习