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

请求重定向和转发

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. 02-TypeScript中新的字符串

    TypeScript中引入了字符串模板,通过字符串模板可以方便的实现字符串换行的连接.方便变量等. 1.在WebStorm中新建一个文件,后缀名为ts. 在建立ts文件时,WebStorm会问你是否需 ...

  2. [自制操作系统] JOS文件系统详解&支持工作路径&MSH

    本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...

  3. idea 给maven项目添加依赖(二)

    这里接着上一篇来 我们观察目录发现有两个pom.xml(project object module) 项目是里面的,所以外面的先不管它. 点击里面的pom.xml 1.在<url>节点下面 ...

  4. 团队作业4——第一次项目冲刺 fOURth DaY

    项目冲刺--Quadra Kill 兄弟们,再坚持一下,再坚持一下,再给我一个头我就五杀了. 今天可谓是项目的一个转折点,因为跳转和数据库已经基本写好啦,鼓掌~[啪啪啪啪啪啪] 让我们来看看今天大家做 ...

  5. 201521123056 《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源代码 1.3 结合1. ...

  6. 201521123106 《Java程序设计》第6周学习总结

    1. 本章学习总结 2. 书面作业 Q1. clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 答:在同一个包里或者 ...

  7. returned a response status of 403 OR 409

    当我们使用jersy把图片上传到我们的图片服务器中[tomcat],我们可能会有以下的错误: returned a response status of 403 OR 409 403和409我都遇到过 ...

  8. 06jQuery-01-基本选择器

    1.jQuery概要 JavaScript的一个库,只是一个jquery-xxx.js的文件,它可以让你写更少的代码,做更多的事. $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在 ...

  9. 鸟哥Linux学习笔记07

    1, vi 是 老式的文字处理器,不过功能已经很齐全了,但是还是有可以进步的地方. vim可以说是程序开发者的一项很好用的工具,vim官网(http://www.vim.org)自己也说vim是一个“ ...

  10. 《JavaScript闯关记》视频版硬广

    <JavaScript闯关记>视频版硬广 stone 在菜航工作时,兼任内部培训讲师,主要负责 JavaScript 基础培训,2016年整理的<JavaScript闯关记>课 ...