javaWeb简单易懂

Advertisement

武松: 浏览器。
酒馆: 服务器。
店小二、厨师: Servlet或者JSP。
来三碗好酒!: 浏览器向服务器发出HTTP请求。
店小二上酒: 服务器的响应。
武松从进店到离开: 一个HTTP对话。
我们可以看到,Web交互的最基本单位为HTTP请求(武松点菜)。 每个用户从进入网站到离开网站这段过程称为一个HTTP会话 (武松进店到出店),一个服务器的运行过程中会有多个用户访问, 就是多个HTTP会话(酒馆当然不可能只接待武松一个客人)。 那么作用域就可以理解为:
request HTTP请求开始到结束这段时间 
session HTTP会话开始到结束这段时间 
application 服务器启动到停止这段时间

request
一个HTTP请求的处理可能需要多个Servlet合作(武松点菜时店小二就要吩咐厨房做菜), 几个Servlet之间可以通过某种方式传递信息(店小二就用吆喝的方式通知厨房), 但这个信息在请求结束后就无效了(厨房在做完菜之后就不用再管这道菜的事儿了)。
Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:
void setAttribute(String name, Object value) 将对象 value 以 name 为名称保存到request作用域中。Object getAttribute(String name) 从request作用域中取得指定名字的信息。doGet()、doPost()函数的第一个参数就是
HttpServletRequest 对象, 使用这个对象的 setAttribute 即可传递信息。
那么设置好信息之后,如何将信息传给其他Servlet? 这就要用到 RequestDispatcher 接口的 forward 方法,将请求转发给其他Servlet。
RequestDispatcher ServletContext.getRequestDispatcher(String path) 取得Dispatcher以便转发。path为转发的目的Servlet。void RequestDispatcher.forward(ServletRequest request, ServletResponse
response) 将request和response转发。因此,只要在当前Servlet中先 setAttribute,然后forward,最后在forward到的Servlet中 getAttribute即可实现信息传递。
PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念, 一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。 而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。 需要注意两点:

转发不是重定向,转发是在Web应用内部进行的。PHP支持重定向但没有转发。
转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。
session
session作用域比较容易理解,同一浏览器访问多次,在这多次访问之间传递信息,就是session作用域。 ('''武松每次点菜帐房先生都要记一笔账,等武松走之前结帐用。 这笔帐在武松吃饭过程中始终有效,即位于session作用域中''')
session是通过HttpSession接口实现的。
Object HttpSession.getAttribute(String name) 从session中获取信息void HttpSession.setAttribute(String name, Object value) 向session中保存信息而通过HttpServletRequest.getSession()方法可以获得HttpSession对象。
HttpSession HttpServletRequest.getSessio() 获取当前请求所在的session的对象。session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始), 但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”), 所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。
Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。
void setMaxInactiveInterval(int interval) 设置绘画的超时值。如果想主动让会话结束,如用户单击“注销”的时候,可以使用 HttpSession 的 invalidate 方法:
vooid invalidate() 强制结束当前session。application
application作用域就是服务器启动到关闭的整段时间, 在这个作用域内设置的信息可以被所有应用程序使用。 (餐馆打烊后结帐,用到的即是开张到打烊之间的所有信息。)
还记得 上一节 提到的ServetContext吗? application作用域上的信息传递就是通过ServetContext实现的。
Object getAttribute(String name) 从application中获取信息。void setAttribute(String name, Object value) 向application作用域中设置信息。总结
可以看到,每个作用域除了实现接口不同、意义不同之外,它们的使用方法和作用都是相同的, 都是通过 getAttribute 和 setAttribute 方法进行信息传递。
作用域 意义 实现接口 
request HTTP请求内 HttpServletRequest 
session HTTP会话内 HttpSession 
application 服务器生命周期内 ServletContext

Similar Posts:

  • 地图加机器人路点(简单易懂)

    地图加机器人路点(简单易懂) 有些地图像AWP等不带机器人程序,单机无法游戏,想加电脑人,简单得很,注意下面的步骤: 1先在CS快捷方式后输入 -console一定注意在-前有空格的,这样可以使用控制台了 2进入CS游戏选警察 3按~键调出控制台, 4输入waypoint on;(必须) 5输入pathwaypoint on:(必须) 6输入autowaypoint on:(必须)这时在你的背后将有一道道的绿色竖线并有当当当的响声 7按~键关控制台,从基地朝目的地进发,转遍整个地图 8再选匪,转

  • 让你一句话理解闭包(简单易懂)

    接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下. 本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出来,如果有不当之处,欢迎批评指正. <高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. (这句话怎么理解呢?照这句话理解的话,闭包就是一个嵌套函数嘛!嵌套函数对包含它的函数的变量当然可以访问,这是没有问题的.) 一般来说,内部函数是能够访

  • 腾讯tos怎么刷?用刷机精灵刷腾讯TOS操作方法图解 简单易懂易操作

    很多人不知道怎么刷腾讯TOS,其实用刷机精灵就很简单的.那么下面本站小编就分享下 用刷机精灵 刷腾讯TOS操作方法,简单易懂易操作.希望能对大家有所帮助!<TOS各机型安装包下载> 操作方法: 1.下载刷机精灵 http://www.shuame.com/ 2.一键刷机 页面简单明了. 3.刷机精灵连接手机 4.跳转到一键刷机页面 5.选择本地ROM(下载TOS各机型安装包) 6.选择“完整Rom”点击确定 7.需要备份的备份,或者用云备份.然后清空数据,点击刷机. 以上就是用刷机精灵刷腾讯T

  • Linux段页式管理思想--写操作系统内存管理必备知识,简单易懂

    [转帖] 一.概念 1.物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应. -- 这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大 空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样.所以,说它是"与地址 总线相对应",是更贴切一些,不过抛开对物理内存寻址方式的

  • 脚本登录blog(简单易懂)

    #!/use/bin/perl use strict; use warnings; use LWP::Simple; use LWP::UserAgent; my $login_url = 'http://bbs.chinaunix.net/logging.php?action=login&'; my $form_hash; my $user = "撒哈拉里的鱼"; my $pass = 'fake_password'; &GetFormHash( ); &Lo

  • 简单易懂 composer是干嘛的

    用composer ,不需要再自己Google开源扩展(not find...),自己下载(slow...),自己整合到项目框架里了.代替 pear. 有官方的服务器http://www.phpcomposer.com(中国镜像),整合了php常用的开源扩展 怎么用? 1.下载一个安装文件叫composer, 2.在你的项目文件下,简单配置一个json格式的文件,定义你项目需要的包名(包名还是要自己去看的),执行composer命令 就自动把开源代码下载到了你的本地. 3.在你项目的框架入口写一

  • 朴素贝叶斯分类器,有具体应用简单易懂

    学习重点: 理论基础:贝叶斯定理:P(A|B) = P(B|A)*P(A)/P(B). 一个类别Ci通常有多个特征F1,F2,...,Fn决定.已知足够多的统计样本,可以从统计数据中获得每个类别的概率P(Ci), 以及类别内某个特征概率(条件概率)P(Fi|Ci). 问题来了:已知一个特定的样本(F1,F2,...,Fn),判断它属于哪个类别(通常做法是计算出它属于每个类别Ci的概率P(Ci|F1,F2,...,Fn),然后选出概率最大对应的类别). P(Ci|F1,F2,...,Fn) = P

  • Android 跨进程通Messenger(简单易懂)

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通讯和传递数据.废话不多说,直接上代码. 首先是服务端: public class Ser extends Service{ @Override public IBinder onBind(Intent intent) {

  • MD(d)、MT(d)编译选项的区别————简单易懂

    http://www.cnblogs.com/cswuyg/archive/2012/02/03/2336424.html 一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1) 打开项目的Property Pages对话框 2) 点击左侧C/C++节 3) 点击Code Generation节 4) 右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCR

  • 简单易懂云计算(转自天涯感谢原楼主iamsatisfied)

    如果把计算机工业发展的历史做一个简单的回顾,之前可以大致上划分为两个阶段.第一个阶段是由IBM为代表的大型机时代.第二个阶段是上世纪70年代开始的微机(PC)时代.在大型机时代,计算机属于少数IT精英人群的玩物.所以有些人就想把这种计算机的设备和技术推广开来.接下来逐渐的,IT领域就成为Intel和微软的舞台了. 随着时代的发展,人们发现PC的推广造成了一些问题.比如,它的功能(计算及存储)似乎总是过剩的,并且软件的管理和数据的管理也会常常成为麻烦.一开始在九十年代人们提出:网络就是计算机,表明