1.引子

转发和重定向是我们在做web项目中常用到的两个术语,有必要理清两者的区别和与之相关的参数、属性获取问题。

2.转发和重定向

1).转发

转发是服务器行为,将当前请求(Request)和响应(Response)处理打包发送给目标服务(Servlet),这样下一个目标服务就能获取或操作上一个服务中的请求和响应。

客户浏览器发送http请求—>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源 发送给客户

转发行为是同一次请求,其URL地址仍是以前的地址,不会发生变化,但页面内容却是新页面的东西了。转发只能是在同一应用中使用,不能跨应用转发请求,比如,京东页面的请求就不可能转发给淘宝的服务器。

2).重定向

重定向就如其名字一样,是将页面定位到一个新位置。重定向客户端行为,是全新的请求,客户端不能保存当前的请求,在定位到新的页面或servlet服务时,上次的请求超出请求的作用范围了,那个请求即失效了。

客户浏览器发送http请求—>web服务器接受后发送302状态码响应及对应新的location给客户浏览器—>客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址—>服务器根据此请求寻找资源并发送给客户。

重定向至少是两次请求,重定向后URL地址是新的地址了,当然页面内容也更新为目标页面的内容了。重定向可以定位到任意页面,可以跨越不同的应用程序。比如,天猫的页面就可以重定向到淘宝的页面上。

参数(parameter)、属性(attribute)的区别,可以看我另一篇帖子-----Servlet中的属性(attribute)和参数(parameter)的区别

3.简单示例

登录页html代码

<form action="loginServlet" method="post">
用户名:
<input type="text" name="username" /> <br/>
密&nbsp;&nbsp;码:
<input type="password" name="pwd"/><br/>
<!-- 默认的submit,提交给loginServlet处理 -->
<input type="submit" value="提交至将转发的servlet"> <br/>
<!-- 一个表单内容可以提交给不同的servlet,而formaction属性值就对应提交的目标地址,
这里提交给loginServlet2进行请求处理 -->
<input type="submit" formaction="loginServlet2" value="提交至将重定向的servlet">
</form>

要转发的servlet

 @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//转发
request.getRequestDispatcher("forward_page.jsp?url_param=test_url_param").forward(request, response);
}

要重定向的servlet

  @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
System.out.println("用户名:"+name+"\t密码:"+pwd);
//request域中设置一个属性
request.setAttribute("nowDate", new Date());
//重定向
response.sendRedirect("redirect_page.jsp?url_param=test_url_param");
}

将转发的登录页面

转发页的html代码

<body>
<h3>这是一个转发后的页面</h3>
request中获取参数(用户名):<label>${param.username}</label> <br/>
request中获取参数(密码):<label>${param.pwd}</label> <br/>
request中获取的属性(‘nowDate’):<label>${nowDate}</label> <br/>
url中获取的一个参数:<label>${param.url_param}</label> <br/>
</body>

servlet转发到的页面

从上图可以看出,所有的参数和属性(包括url中拼接的参数)都可以正确地获取,并显示在页面上。但url地址还是"loginServlet",不是当前页面所对应的"forward_page.jsp"地址。

将重定向的登录页面

重定向页的HTML代码

<body>
<h3>这是一个重定向后的页面</h3>
request中获取参数(用户名):<label><c:out value="${param.username}" default="空"/></label> <br/>
request中获取参数(密码):<label><c:out value="${param.pwd}" default="空"/></label> <br/>
request中获取属性‘nowDate’:<label><c:out value="${nowDate}" default="空"/></label> <br/>
url中获取的一个参数:<label><c:out value="${param.url_param}" default="空"/></label> <br/>
</body>

servlet重定向到的页面

从上图可以看出,上次请求的所有属性、参数均不能获取到。另外url地址更新了,不再是servlet的映射地址了,而当前新页面的"redirect_page.jsp"地址。
除此之外,可以看到重定向的URL中拼接的键值对参数“url_param=test_url_param”在新页面还是能获取到的。

4.总结

1.重定向,是一次新的请求,不能获得上次请求中的参数、属性;转发,是同一次请求,之前所有的参数、属性在新的页面或servlet中都可见的,它们保存在同一个request域中。
       2.转发操作,(即使转至新页面)其URL地址不会变化;而在重定向操作中,URL地址会更新变为重定向的目标地址。
       3.若要页面内容、URL地址均更新,并且新页面还要获取上次请求的参数、属性,可以通过一种曲线救国的方式实现:在重定向的URL中以键值对的方式来拼接上次请求的参数、属性;并在新页面中通过EL表达式“${param.name}”获取。

转发和重定向简介及与之相关的(URL)参数(parameter)、属性(attribute)问题探讨的更多相关文章

  1. php 后台转发和重定向的区别及kohana框架当前url加参数方式

    1.重定向是浏览器行为,浏览器地址有变化:转发是后台服务器完成, url地址不变化. 2.kohana获取URL 当前url是http://soyoung.kohana.com/blog/add?id ...

  2. jsp:和属性相关的方法,请求的转发,重定向

    jsp中与属性相关的方法: 方法: void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name):获取 ...

  3. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  4. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  5. HttpRequest,HttpResponse,乱码,转发和重定向

    HttpServletRequest简介 Web服务器收到客户端的http请求,会针对每一次请求,创建一个用于代表请求的HttpServletRequest类型的request对象,并将"H ...

  6. HttpServlet的转发和重定向

    HttpServletResponse重定向 1.HTTP协议规定了一种重定向的机制,重定向的运作流程如下 用户在浏览器输入特定的URL,请求访问服务端的某个组件. 服务端的组件返回一个状态码为302 ...

  7. Servlet(四):转发与重定向、路径问题

    在上次的小案例中用到了转发的技术,今天来仔细聊聊转发和重定向的问题,以及一些小知识的汇总. 一.转发 1.转发的概念 转发主要是将浏览器的请求交给另外一个servlet或jsp来处理,借助reques ...

  8. SpringMVC中使用forward和redirect进行转发和重定向以及重定向时如何传参详解

    转自:http://blog.51cto.com/983836259/1877188 2016-11-28 09:45:59   如题所示,在SpringMVC中可以使用forward和redirec ...

  9. springMVC3.0(文件上传,@RequestMapping加參数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传參,ajax,拦截器)

    1.项目包结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsiz ...

随机推荐

  1. chrome浏览器安装vue调试器vue-devtools

    chrome浏览器安装vue调试器vue-devtools https://blog.csdn.net/zhangjnwei/article/details/76693053

  2. UVA - 1647 Computer Transformation(计算机变换)(找规律)

    题意:初始串为一个1,每一步会将每个0改成10,每个1改成01,因此1会依次变成01,1001,01101001,……输入n(n<=1000),统计n步之后得到的串中,"00" ...

  3. UVA - 12107 Digit Puzzle(数字谜)(IDA*)

    题意:给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜中所有涉及的数必须是没有前导零的正数.输入数字谜一定形如a*b=c,其中a.b.c分别最 ...

  4. 每天一点点之vue框架开发 - vue 动态替换路由(地址栏)参数

    import merge from 'webpack-merge': // 修改原有参数 this.$router.push({ query:merge(this.$route.query,{'max ...

  5. POJ 1584:A Round Peg in a Ground Hole

    A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5741   Acc ...

  6. 支持 UTF-8 中文的串口调试工具

    最近使用 mdk526,编辑设置使用 utf-8,编辑窗口中文正常,但是编译的时候提示 warning: #870-D: invalid multibyte character sequence,解决 ...

  7. javascript数组日期

    arr forEach(callback,thisArg) thisArg:指明回调函数的this指向 callback(element,index,arr) element:每次取到的数组元素值 i ...

  8. PAT Advanced 1151 LCA in a Binary Tree (30) [树的遍历,LCA算法]

    题目 The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both ...

  9. docker修改存储路径(转载)

    系统盘只有40G,有时docker镜像会占据大量的存储空间,于是想把docker的默认存储位置改成挂载的数据盘.docker的默认存储位置未为:/var/lib/docker 更改docker的默认存 ...

  10. 身边的人工智能&人工智能发展史

    智能家具 扫地机器人 智能音箱 个人助手 在线翻译 谷歌翻译 微软翻译 YouTube 视频翻译 图像识别 人脸识别 AI+摄像头 下棋高手 Alphago 2017年打败柯洁 成为世界第一 Alph ...