众所周知,为了在页面、请求、和用户之间传递和共享数据,JSP提供了四个不同的作用域:page(页面作用域)、request(请求作用域)、session(会话作用域)、application(应用程序作用域),这些作用域就规定了数据可以传递和共享的范围以及数据的存活时间。
1:jsp默认的作用域是page(页面作用域),这个作用域中的对象只能在该页面中使用,不允许在其他页面使用。我们可以通过调用pageContext这个隐含的对象的getAttribute()和setAttribute()方法去获取和设置需要传递、共享具有这种范围类型的数据。(pageContext对象还提供了访问其他范围对象的getAttribute方法)。page范围内的对象,在客户端每次请求JSP页面时创建,在页面向客户端发送回响应或请求被转发(forward)到其他的资源后被删除。
2:request(请求作用域)作用于那些需要在 所有处理同一个request请求的页面中 都可以使用的对象。request作用域的隐含对象是request。要注意的是,因为请求对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。
3:session(会话作用域)的对象可用于同一个浏览器发出的所有请求。Session 的作用范围为一段用户持续和服务器所连接的时间,但与服务 器断线 ,这个属性就无效。当浏览器发出第一个请求时,就认为session的作用时间已经开始了,但是它的结束时间还是不太好判断,毕竟服务器也不是浏览器他爸,浏览器关闭并不会通知他。所以我们可以学习类似于处理“系统响应超时”这种情况的方法,设置:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置最大时长。
4:application(应用程序作用域)中的对象作用于这个应用程序的所有用户,从服务器一开始执行服务,一直到服务器关闭为止。从这看来,application的作用范围最广,作用的时间也最长。所以使用时要特别注意不然可能会造成服务器负载越来越重的情况。
注意:根据jsp规范,用于某个对象的名称必须在所有作用域中都是唯一的。也就是说,如果application作用域中有一个名为user的对象,而且在request作用域中用相同的名称保存着另一个对象,那么容器可能会移除第一个对象,尽管很少有容器会执行这项规则,但是为了使您的项目更加完善,还是应该确保在任何地方都是用唯一的名称,除非所保存的对象为同一个。
forward 和redirect的区别(扩展)
1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 2.从数据共享来说 forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据. 3.从运用地方来说 forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 4.从效率来说 forward:高. redirect:低.