HttpServlet的请求转发理解
一个http请求的流转,其实主要涉及到五部分的内容,第一部分就是request所包含的参数,也就是request.getAttribute能获取的东西;第二部分是request所携带的内容实体,这部分实体是由浏览器通过post发送过来的,可以通过request.getInputStream获得输入流之后通过输入流读取;第三部分是requese和response的各种头(对应到http的请求头和响应头)以及请求类型、响应状态码等;第四部分是request的各种path(ContextPath、ServletPath等,对应到http的请求行);第五部分是response的返回实体,可以通过response.getOutpuStream和response.getWriter来获取输出流之后由输出流向浏览器发送内容。
request除了有一个getAttribute之外,还有一个getParameter,getParameter专门用于获取表单信息,而且获取的都是字符串类型。虽然他也能随着请求转发而被转发,但是一般不常用,我们还是习惯于通过setAttribute来传递信息,一方面是因为他是获取表单数据,而表单数据一般都会在第一个Servlet就被处理掉,所以表单数据不需要被传递,另一方面是因为他只能获取字符串,而我们希望传递的是各种解析后的具体类型的参数,而不是字符串。
请求转发是通过RequestDispathcer来进行的,它有两个方法,一个是forward,另一个是include。二者的区别就是对上面提到的五部分内容的转发不一样。
1、首先说说他们的共性,共性体现在request携带的资源和参数上面,二者皆可以使得两个Servlet中request的资源和参数共享,也就是说在任何一个Servlet中setAttribute的参数,在另一个Servlet中都可以通过getAttribute拿到(资源是只读的,所以不存在改变,但也是共享的),并且都可以通过getParameter获取表单参数。出了这一点之外,其他的任何内容的对待方式,forward和include都不一样。
2、forward是把post过来的信息和request的各种Attribute以及Parameter都转发到目标Servlet,并且把状态码和各种path都调整成和目标Servlet相一致。但是会把response的缓存清理,也就是说它的资源不会被转发出去。转发之后再往response里写入数据或者改变response的状态,也不会起作用了。
3、include和forward不一样,它的作用是为了获取被include目标资源的response资源内容。除此之外,response不会得到任何改变,在include目标资源对response状态的任何改变,都不会得到效果。注意,在被inlude的资源中,可以继续include其他资源,这样后续的资源也会被写入到response实体缓存中。如果在include的目标资源中forward,则之前所有的response实体资源都会被清楚,只携带request参数和request资源,流程被跳转到第三个Servlet。
总结下来就是:forward只携带request的参数和Post过来的request资源,把流程转到了目标Servlet,其他的一切都和目标Servlet一致,就好像一开始就访问的是目标Servlet一样;include是只想把目标Servlet中的response实体资源拿过来,并让目标资源设置一些request参数。
HttpServlet的请求转发理解的更多相关文章
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
- 深入浅出Java 重定向和请求转发的区别
深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...
- 【Servlet】深入浅出JavaServlet重定向和请求转发
import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...
- 2.SpringMVC源码分析:DispatcherServlet的初始化与请求转发
一.DispatcherServlet的初始化 在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- servlet中请求转发(forword)与重定向(sendredirect)的区别
摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂 servlet请求转发与重定向的区别: request.s ...
- 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别
请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...
- HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. ...
- 7.java的请求转发和请求重定向
1.请求重定向:是客户端的行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变,一次新的转发. 2.请求转发:是服务器的行 ...
随机推荐
- log4net工作原理(2)
上回说道:Repository可以说成基于一个log4net配置节创建的log4net容器,它根据log4net配置节的指示创建其他所有对象(Logger/Appender/Filter/Layout ...
- Ubuntu不能上网解决办法
一.设置IP.网关.DNS 新安装的Ubuntu系统ifconfig后发现没有ip,所以要设置IP.网关.DNS等,编辑 /etc/networking/interfases sudo vi /et ...
- Linux安装Oracle调整tmpfs以突破1.7G的限制
调整/dev/shm的大小 ---------------------------------------------------------1.查看大小 df -h /dev/shm [@more@ ...
- jmeter函数助手(_random、_time)
jmeter函数助手 __random __time yyyyMMddHHmmdd 时间格式(年月日时分秒) 1.打开函数助手对话框,选项->函数助手对话框 2.生成函数字符串 (1)选择功能 ...
- loj #2255. 「SNOI2017」炸弹
#2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iXi,爆炸半径是 RiR_iRi,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...
- github for windows安装以及教程
更多资料,欢迎访问我的网站 Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中 ...
- Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
工作当中用到的:有是,用户会在文本框里输入一些无效的(错误的)内容,比如在手机号中输入#等等,一般使用正则表达式,但是只有点击的时候才会验证,用户体验不好,所以想屏蔽这些按键,让键盘根本打不出来,以下 ...
- 如何让ie8地址栏下拉框里不显示历史记录和收藏夹
打开浏览器,点击IE浏览器上方工具——Internet选项——内容——自动完成的设置——地址栏里面的勾勾去掉,浏览历史记录和收藏夹里面的东西就自动没有了
- Linux 安装python3.7.3 提示已经自动安装了pip和setuptools 可是使用时bash提示没有找到pip
Linux 安装python3.7.3 提示已经自动安装了pip和setuptools 可是使用时bash提示没有找到pip 今天的任务就是找到解决办法 另外就是用布置好python3的路径
- 洛谷 P3376【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...