分析:重定向和请求转发
分析:重定向和请求转发
重定向
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
分析:重定向和请求转发相关推荐
- JSP中的重定向和请求转发以及它们的区别
我们先硬着头皮看一下重定向的定义: 重定向(Redirect): 客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方 ...
- 3.相应重定向与请求转发的比较
响应重定向与请求转发类似,但有下面的区别: (1)RequestDispatcher对象是一个Web资源的包装器,可以用来把当前请求转发到该资源.这种转发是服务器端控制权的转向,客户端发来的请求将交由 ...
- 请求转发和重定向的区别_WEB之重定向和请求转发的区别
一次重定向的过程 我的代码里面已经写好了,redirectAndFoward.jsp页面上有一个表单,表单重定向到redirectAndFowardTarget.jsp,那么这一次的重定向过程为: 1 ...
- 重定向与请求转发的区别及什么时候使用
重定向与请求转发的区别 一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求-->web服务器接受此请求-->调用内 ...
- SpringMVC重定向与请求转发
SpringMVC重定向与请求转发 一,请求转发 ①请求转发地址栏不会发生改变 ②请求转发只发送一次请求.能携带原有的参数 ③请求转发只可以在同一个服务器中进行转发 ④实际上视图解析器的转发本质也是请 ...
- java | (二十五)Servlet(1)req,resp,重定向,请求转发,数据共享
今天(2021.9.24)开始学习一些有难度的知识了,如题 先安装和配置好Tomcat,具体下载和idea的配置可以参考 目录 开发步骤 Servlet对象生命周期 httpServletRespon ...
- 页面的跳转——请求重定向和请求转发
目录 一.重定向(Redirect) 二.转发(Forward) 三.重定向和请求转发的区别 相同点 不同点 一.重定向(Redirect) 请求重定向是客户端行为.是指当浏览器请求一个URL时,服务 ...
- 相对地址与绝对地址的区别?请求重定向与请求转发的区别?jsp有哪九大内置对象?servlet如何获取session和application对象?
目录 1.说说相对地址与绝对地址的区别? 2.说说请求重定向与请求转发的区别? 3.jsp有哪九大内置对象?servlet如何获取session和application对象? 1.说说相对地址与绝对地 ...
- 重定向与请求转发的具体讲解
本篇供个人学习使用,有问题欢迎讨论 多个Servlet来处理同一次请求方案 一.前提 1.一个 servlet 只负责实现一个功能 2.浏览器在一次请求时,只能请求一个资源文件 3.如果浏览器的请求需 ...
最新文章
- 剑指offer_第17题_树的子结构_Python
- TensorRT(3)-C++ API使用:mnist手写体识别
- 关于miniconda的安装,配置以及包批量安装和使用
- 模板题——图论相关(1)
- ARC098E Range Minimum Queries
- Linux下安装配置maven
- 各地的磁倾角_中国各地磁偏角
- HTML 网页特殊符号代码大全
- LaTeX简介及其在Mardown中的用法
- UML工具大全(上)
- php 风水起名网站源代码_202002年PHP开运网运势测算网站源码 鼠年风水起名/八字算命/算财运姻缘/易经周易/占卜+安装说明...
- Prim算法(JAVA实现-邻接矩阵)
- java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...
- 健康饮食(地中海式饮食+DASH饮食)
- 手机支付平台付款码分析
- (六)温故知新系列之RXJS——RXJS操作符基础(转化类)
- OpenCV头像识别采集训练数据
- 腾讯云Linux服务器如何安装Discuz个人论坛?
- rpc wmi 服务不可用_“RPC服务器不可用”使用WMI查询
- 高清,图片,ppt,下载