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

请求重定向和转发

1、请求重定向:浏览器的行为(通过响应对象HttpServletResponse来执行)

特点:可以重新定向访问其他Web应用下的资源

浏览器发出了2次请求,得到了2次响应

地址栏地址会变,跳转到要求指定的Servlet

代码演示:

//请求重定向方式一:

public void sent1(HttpServletResponse response) {

response.setStatus(302);

response.setHeader("Location", "/ServletStudy/servlet/ServletDemo2");

//这个地址是要求浏览器重新访问的。

}

//请求重定向方式二:

public void send2(HttpServletRequest request,HttpServletResponse response)

throws IOException {

//服务器向访问的浏览器的请求中添加属性,当被请求重定向后,在新的Servlet中不能得到添加的属性。

//因为请求重定向后的请求request对象不懂,这就是request的生命周期。

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

//与方式一实现的原理相同,较为常用

response.sendRedirect("/ServletStudy/servlet/ServletDemo2");

}

2、请求转发:服务器的行为(转发的瞬间是一个ServletRequest的生命周期)

特点:转发只能发生在当前Web应用下

浏览器发出了1次请求,得到了1次响应

(源组件和目标组件共享request和response中的数据)

地址栏地址不会发生变化。

应用:

(1)可以利用request的域对象的特点,由源组件向其中存放写数据。

(2)可以让用户访问到存放在WEB-INF目录中的目标资源

代码演示:

//请求转发

public void send3(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException{

//在请求转发之前进行属性添加,在新的Servlet资源中能获取这个属性

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

//获取当前Servlet资源的转发器对象RequestDispatcher,传入当前应用的下要访问的那个Servlet资源

RequestDispatcher rd = getServletContext()

.getRequestDispatcher("/servlet/ServletDemo2");

//注意:传入的要访问的Servlet资源的地址中/代表的就是当前应用,所以就可以访问当前应用中WEB-INF中的信息

rd = getServletContext()

.getRequestDispatcher("/WEB-INF/form.html");

//也可以通过request得到转发器对象,用request得到的转发器在传入路径时,可以传入相对路径,不用加/

rd = request.getRequestDispatcher("/servlet/ServletDemo2");

//这里传入的路径地址:相对去被转发地址不同地方

//被转发地址:

http://localhost:8080/ServletStudy/servlet/ServletDemo1

//转发地址:

http://localhost:8080/ServletStudy/servlet/ServletDemo2

//所以填写相对资源地址:ServletDemo2

rd = request.getRequestDispatcher("ServletDemo2");

//调用转发器的forward()方法,进行请求转发

rd.forward(request, response);

}

3.RequestDispatcher中forward()转发和include()包含的区别

forword()转发:源组件<--->头+体

源组件转向目标组件,由目标组件显示响应正文结果(只有目标的响应)

转发前,容器会清空response对象的缓存,源组件的任何页面输出都无效,也就是会清空源组件的体

转发前不要刷新或关闭response的流

include()包含:

源组件包含目标组件,由源组件显示响应正文结果(还会把目标的响应结果包含进来)

包含前,容器会清空目标组件设置的响应头信息,目标组件所有设置的所有头都无效。

代码演示:

//RequestDispatch转发器中的:forward()和include()方法的区别

/*forword()转发:

源组件转向目标组件,由目标组件显示响应结果(只有目标的响应)

转发前,容器会清空response对象的缓存,源组件的任何页面输出都无效。

转发前不要刷新或关闭response的流

include()包含:

源组件包含目标组件,由源组件显示响应结果(还会把目标的响应结果包含进来)

包含前,容器会清空目标组件设置的响应头信息,目标组件所有设置的所有头都无效*/

public class ServletDemo3 extends HttpServlet {

//当做源组件

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

forwardTest(request, response);

}

public void forwardTest(HttpServletRequest request,

HttpServletResponse response) throws IOException, ServletException {

//response.setHeader("Refresh", "2");

OutputStream out = response.getOutputStream();

System.out.println("转发前向控制台输出");

out.write("转发前向页面输出".getBytes());

RequestDispatcher rd = request.getRequestDispatcher("ServletDemo4");

rd.forward(request, response);

System.out.println("转发后向控制台输出");

out.write("转发后向页面输出".getBytes());

}

public class ServletDemo4 extends HttpServlet {

//当做目标组件

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setHeader("Refresh", "2");

response.getOutputStream().write("目标组件".getBytes());

}

4.ServletContext和ServletRequest都能得到RequestDispatcher区别

(1)ServletContext

RequestDispatcher getRequestDispatcher(String path):path必须以"/"开头,代表当前的应用。这种写法,叫做绝对路径写法。

(2)ServletRequest

RequestDispatcher getRequestDispatcher(String path):

path可以以"/"开头:代表当前的应用。这种写法,叫做绝对路径写法。

也可以不以"/"开头:代表相对路径。

5.各种URL的写法:绝对路径和相对路径,建议大家使用绝对路径

绝对路径:如:/day05  地址前加了/就是一个绝对路径

原则:要不要加应用名称,看地址为谁服务的?

如果是给服务器用的,就不用加/MyApp,"/"代表的是当前应用。

如果是给客户端用的,要加上"/MyApp","/"代表的是要访问的服务器的URL地址(域名+端口),

getRequestDispatcher(String path):

path是一个路径。 不要加"/MyApp",只需要"/"即可

form action="url":要加"/MyApp"

a href="url":要加"/MyApp"

img src="url":要加"/MyApp"

link href="url":要加"/MyApp"

script src="url":要加"/MyApp"

302+Location="url":要加"/MyApp"



java web Servlet学习笔记-2 请求重定向和请求转发的区别的更多相关文章

  1. java Web Servlet学习笔记-1 HttpServletQequest对象的学习

     HttpServletQequest对象的学习 HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求 ...

  2. java web Servlet 学习笔记 -3 会话管理技术

     Cookie和HttpSession 什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 每个用户在使用浏览器与服务器进行会话的过 ...

  3. Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)

    ServletContext可以实现请求转发(ServletContext请求转发相关内容见之前博客:http://blog.csdn.net/megustas_jjc/article/details ...

  4. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象

     JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...

  5. java web(学习笔记)项目路径问题

    最近刚接触java web特别是是关于项目路径这一块很晕,就把自己遇到的一些疑惑和理解写下来. 首先贴上路径,这里用的是eclipse. 其中我们要注意看WebContent目录,这是web程序的根目 ...

  6. Java Web Service 学习笔记

    一.服务端 1. 创建Java工程 2. 创建接口HostipalServiceInterface package ws_server; import javax.jws.WebMethod; imp ...

  7. 【Java Web开发学习】跨域请求

    [Java Web开发学习]跨域请求 ================================================= 1.使用jsonp ===================== ...

  8. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  9. 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener

    [Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...

随机推荐

  1. Oracle之range,hash,list分区现实应用及优缺点汇总

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp51 [align=center;] Oracle之range,hash,l ...

  2. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  3. 微信小程序开发历程

    小程序:    帮助文档:(https://mp.weixin.qq.com/debug/wxadoc/dev/index.html) 优势:    一种无须安装即可运行的程序,与订阅号,服务号是同一 ...

  4. 新CCIE笔记之'口口相传'路由协议

    //由于思科所有命令行中没有尖括号"<>"这样的关键字,所以本文中出现命令行中的尖括号中的内容均为注释提示信息,代表此处应该填入那一类数据. 请容许我将RIP和EIGR ...

  5. RobotFramework自动化测试框架-移动手机自动化测试Input Text和Click Button关键字的使用

    Input Text和Click Button Input Text 关键字一般用来给输入框进行输入操作,该关键字接收两个参数[ locator | text ]. 示例1:启动安卓手机上一个APP的 ...

  6. 【1414软工助教】团队作业5——测试与发布(Alpha版本) 得分榜

    题目 团队作业5--测试与发布(Alpha版本) 作业提交情况情况 所有团队按时提交. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1 ...

  7. 201521123054《Java程序设计》第1周学习总结

    #1. 本章学习总结 你对于本章知识的学习总结 本章我们学习了各种java相关文件的使用,能够进行基本的程序操作: 学会使用博客.码云与PTA管理java: #2. 书面作业 1.为什么java程序可 ...

  8. 201521123065《java程序设计》第13周学习总结

    1. 本周学习总结 1.协议是端口之间进行网络通信的一种语言规则语法: 2.套接字Socket用于实现客户端与服务器端的连接,实现网络通信,进行数据交换: 3.LocalHost可以用来获取主机地址: ...

  9. 201521123119 《Java程序设计》第13周学习总结

    1. 本周学习总结 Q以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 Q1.1 比较ping www.baidu.com与ping cec. ...

  10. Linux SDK之uClinux、Broadcom、Atheros、Realtek、Ralink、Marvell、Intel

    接触的Linux SDK越来越多,整理整理,分享分享,不求系统全面,对您有帮助便足矣 文中大部分是与AP/Router SoC解决方案(单芯片WIFI 路由器解决方案)相关的Linux SDK SDK ...