java web Servlet学习笔记-2 请求重定向和请求转发的区别
请求转发与请求重定向的区别
请求重定向和转发
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 请求重定向和请求转发的区别的更多相关文章
- java Web Servlet学习笔记-1 HttpServletQequest对象的学习
HttpServletQequest对象的学习 HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求 ...
- java web Servlet 学习笔记 -3 会话管理技术
Cookie和HttpSession 什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 每个用户在使用浏览器与服务器进行会话的过 ...
- Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)
ServletContext可以实现请求转发(ServletContext请求转发相关内容见之前博客:http://blog.csdn.net/megustas_jjc/article/details ...
- java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象
JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...
- java web(学习笔记)项目路径问题
最近刚接触java web特别是是关于项目路径这一块很晕,就把自己遇到的一些疑惑和理解写下来. 首先贴上路径,这里用的是eclipse. 其中我们要注意看WebContent目录,这是web程序的根目 ...
- Java Web Service 学习笔记
一.服务端 1. 创建Java工程 2. 创建接口HostipalServiceInterface package ws_server; import javax.jws.WebMethod; imp ...
- 【Java Web开发学习】跨域请求
[Java Web开发学习]跨域请求 ================================================= 1.使用jsonp ===================== ...
- 【Java Web开发学习】Servlet、Filter、Listener
[Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...
- 【Java Web开发学习】Spring MVC添加自定义Servlet、Filter、Listener
[Java Web开发学习]Spring MVC添加自定义Servlet.Filter.Listener 转载:https://www.cnblogs.com/yangchongxing/p/9968 ...
随机推荐
- 排序--SelectionSort 选择排序
选择排序 no implementation 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的元素中中选出最小(或最大)的一个元素,存放在序列的起始位置 ...
- mybaties-plus入门
目前正在维护的公司的一个项目是一个ssm架构的java项目,dao层的接口有大量数据库查询的方法,一个条件变化就要对应一个方法,再加上一些通用的curd方法,对应一张表的dao层方法有时候多达近20个 ...
- 团队作业4--第一次项目冲刺(Alpha版本)6
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.对功能界面进行优化 2.对算法进行改进优化,提高运行速度 四.困难与问题 首先我们团队通过讨论,对功能界面进行了优化,让界 ...
- Java 第四周总结
1. 本周学习总结 2. 书面作业 注释的应用: (1)源文件注释采用 /** -- */,在每个源文件的头部要有必要的注释信息,包括:文件名:文件编号:版本号:作者:创建时间:文件描述包括本文件历史 ...
- 201521123086《java程序设计》第四周
本章学习总结 尝试使用思维导图总结有关继承的知识点 1.2 使用常规方法总结其他上课内容. 为了不必要写重复的代码,可以运用继承,用关键字extends来定义一个类,被继承的类叫做父类,继承的类叫做子 ...
- 201521123095 《Java程序设计》第1周学习总结
1. 本周学习总结 开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序. 了解了Java的诞生及发展以及如何运用JVN JRE JDK JVM让JAVA可以 ...
- 201521123006 《java程序设计》 第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...
- 火狐html5拖拽 弹出新页面解决办法
今天做项目时,需要实现一个拖拽排序的功能,遂想到了html5的拖拽,便开始查资料,写代码.功夫不复有心人,通过网上资料作参考,排序功能成功实现.谷歌浏览器测试,拖拽平滑,无问题.火狐浏览器测试时,却无 ...
- lintcode.22 平面列表
平面列表 描述 笔记 数据 评测 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 注意事项 如果给定的列表中的要素本身也是一个列表,那么它也可以包含 ...
- 关于maven项目的一些报错问题
本文为自己记录的笔记略显粗糙后续会把遇到的问题追加进来.忘大神多指点 1.父工程红色感叹号 此类问题解决方法,一般打开pom文件查看红色标记处是否有报错,也就是看哪个jar包没有下下来.分为两种情况. ...