几乎所有的Web开发语言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通过作用域 (scope )这个概念来实现的。
作用域分为四种,分别为:
page | 在当前页面有效(仅用于JSP中) |
request | 在当前请求中有效 |
session | 在当前会话中有效 |
application | 在所有应用程序中有效 |
是不是看不太明白?page因为仅用于JSP中,这里只讲述其他三种作用域。 首先要声明的一点,所谓“作用域”就是“信息共享的范围 ”, 也就是说一个信息能够在多大的范围内有效。
话说武松一日来到景阳岗,见一旗帜迎风飘扬,旗子上书五个大字“三碗不过岗”。 武松叫道:“店家,拿三碗酒来,再切两斤熟牛肉!”店小二应声道:“三碗好酒, 二斤熟牛肉啰~~”里面厨师赶忙当当当当切好牛肉,店小二倒上三碗酒,店小二端上前来。
武松咕咚咕咚连干三碗,叫一声“好酒!店家,再来三碗!”小二忙又倒上三碗好酒, 武松一饮而尽。就这样前前后后武松一共喝了十八大腕。付了帐刚要走,店小二道: “客官,这前面山上有大虫,客官刚刚喝完十八碗酒恐怕过不得岗,不如在小店暂住一夜, 待明天和猎户一同过岗岂不是好?”
之后武松说什么就留待各位看官自己去回忆啦。在这段武松打虎中, 大家有没有看到些熟悉的东西?
- 武松 : 浏览器。
- 酒馆 : 服务器。
- 店小二、厨师 : Servlet或者JSP。
- 来三碗好酒! : 浏览器向服务器发出HTTP请求。
- 店小二上酒 : 服务器的响应。
- 武松从进店到离开 : 一个HTTP对话。
我们可以看到,Web交互的最基本单位为HTTP请求 (武松点菜 )。 每个用户从进入网站到离开网站这段过程称为一个HTTP会话 (武松进店到出店 ),一个服务器的运行过程中会有多个用户访问, 就是多个HTTP会话(酒馆当然不可能只接待武松一个客人 )。 那么作用域就可以理解为:
request | HTTP请求开始到结束这段时间 |
session | HTTP会话开始到结束这段时间 |
application | 服务器启动到停止这段时间 |
request
一个HTTP请求的处理可能需要多个Servlet合作(武松点菜时店小二就要吩咐厨房做菜 ), 几个Servlet之间可以通过某种方式传递信息(店小二就用吆喝的方式通知厨房 ), 但这个信息在请求结束后就无效了(厨房在做完菜之后就不用再管这道菜的事儿了 )。
Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:
doGet()、doPost()函数的第一个参数就是 HttpServletRequest 对象, 使用这个对象的 setAttribute 即可传递信息。
那么设置好信息之后,如何将信息传给其他Servlet? 这就要用到 RequestDispatcher 接口的 forward 方法,将请求转发给其他Servlet。
因此,只要在当前Servlet中先 setAttribute,然后forward,最后在forward到的Servlet中 getAttribute即可实现信息传递。
PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念, 一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。 而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。 需要注意两点:
- 转发不是重定向 ,转发是在Web应用内部进行的。PHP支持重定向但没有转发。
- 转发对浏览器是透明的 ,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。
session
session作用域比较容易理解,同一浏览器访问多次,在这多次访问之间传递信息,就是session作用域。 ('''武松每次点菜帐房先生都要记一笔账,等武松走之前结帐用。 这笔帐在武松吃饭过程中始终有效,即位于session作用域中''')
session是通过HttpSession接口实现的。
而通过HttpServletRequest.getSession()方法可以获得HttpSession对象。
session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始), 但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”), 所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。 Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。
如果想主动让会话结束,如用户单击“注销”的时候,可以使用 HttpSession 的 invalidate 方法:
application
application作用域就是服务器启动到关闭的整段时间, 在这个作用域内设置的信息可以被所有应用程序使用。 (餐馆打烊后结帐,用到的即是开张到打烊之间的所有信息。 )
还记得上一节 提到的ServetContext吗? application作用域上的信息传递就是通过ServetContext实现的。
总结
可以看到,每个作用域除了实现接口不同、意义不同之外,它们的使用方法和作用都是相同的, 都是通过 getAttribute 和 setAttribute 方法进行信息传递。
作用域 | 意义 | 实现接口 |
request | HTTP请求内 | HttpServletRequest |
session | HTTP会话内 | HttpSession |
application | 服务器生命周期内 | ServletContext |
示例程序
这一节的示例程序是一个用户登录的模拟程序。文件较多。
- login.html 登录表单
- DoLogin.java 处理登录动作的Servlet
- LoginSuccess.java 用于显示登录成功信息的Servlet
- SessionTest.java 登录后的处理程序
- DoLogout.java 注销的处理程序
为了演示 request、application、session 各个作用域的使用方法, Servlet之间进行了数据传递,数据传递方式如下:
数据产生 | 数据接受 | 数据内容 | 作用域 |
DoLogin | LoginSuccess | 登录时间 | request |
DoLogin | SessionTest | 登录用户名 | session |
DoLogin | SessionTest | 系统登录次数 | application |
访问 http://localhost:8080/LearnJSP/sessiontest , 登录时输入用户名 charlee 和密码 123456 即可。
session-test.zip (6 KB)
相关推荐
在Java Web开发中,"四个范围"是指PageContext、Request、Session和Application这四个不同的作用域,它们分别代表了Web应用程序中数据存储的不同层级和生命周期。理解并熟练掌握这四个范围,对于编写高效且可维护的...
三大作用域 request作用域 session作用域 application作用域【servlet的上下文】
除了上述无耦合的方式外,还可以直接使用 Servlet API 中的方法来获取 Request、Session 和 Application,但这会导致代码与 Servlet API 耦合度过高。 **1. 获取方式** 在 Action 类中可以直接使用 `...
以下将详细介绍如何在Struts2的Action中获取request、response、session。 ### 1. 使用ActionContext获取request、response、session Struts2的Action可以通过`ActionContext`来间接获取`request`、`response`和`...
### JSP 页面间通过 Request/Session 传值详解 #### 一、背景介绍 在 Web 开发中,尤其是在 JavaServer Pages (JSP) 技术中,数据在不同页面之间的传递是一项基本且重要的功能。本篇文章将详细介绍如何利用 JSP 的 ...
Request、Session 作用域的理解 Request 作用域: ...Request、Session 和 Application 作用域是 Web 开发中非常重要的概念,它们可以帮助开发者实现信息共享和传递,提高应用程序的灵活性和可扩展性。
在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application 在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application
Servlet技术的核心在于其内置的四个对象:`request`、`session`、`page`和`application`,它们在购物车实现中起到关键作用。 1. **HttpServletRequest request对象**:每当用户发送一个HTTP请求时,服务器都会创建...
三者之间的主要区别在于生命周期和作用域,Request对象只在一次请求中有效,Session对象在整个会话中有效,Application对象在整个应用程序中有效。 6. JSP注释和HTML注释的区别:JSP注释以开始和结束,用于注释JSP...
默认情况下,SpringBoot 使用 Tomcat 作为嵌入式 Servlet 容器,而 Tomcat 中的 Session 超时时间可以通过配置文件来设置。例如,在 application.properties 或 application.yml 文件中可以添加以下配置: ``` ...
A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters perform filtering in the ...
每个阶段都有对应的内置对象,如page、request、response、session和application,开发者可以利用这些对象来操作页面和处理请求。 4. 请求转发与重定向 - 请求转发(Request Forwarding):发生在服务器端,使用`...
答:request,session,application,cookie等 7、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是类...
3. 使用Java代码传值:使用Java代码来传递数据,例如:servlet只能接收到session.setAttribute("testSession","Hello session")的内容,而不能接收到request的内容。 总结 getParameter()方法传递的是字符串,一般...
这个示例压缩包对初学者和有经验的开发者都极具价值,它不仅展示了JSP、Servlet和SQL的基本用法,还通过实际的源码展示了如何在项目中有效地整合这三个技术。通过学习和研究这些源码,开发者能够加深对Web开发的理解...
- 理解JSP的内置对象(如request、response、session、application)及其作用。 - 掌握数据库设计原则,包括ER模型、范式理论和索引优化。 - 学习如何使用JDBC连接和操作MySQL数据库,包括SQL语句的编写。 - 了解MVC...
### Servlet与JSP详解 #### 一、Servlet基础概述 **Servlet** 是Java Web开发的基础技术之一,主要用于处理客户端的HTTP请求,并返回响应结果。它是一种服务器端的Java应用程序,可以扩展服务器的功能。 ##### ...
通过`pageContext`,我们可以方便地获取到如`request`、`session`、`application`等内置对象,这对于实现自定义标签非常有帮助。 #### 2.2 获取`HttpSession`的具体方法 在自定义标签的Java类中,可以通过以下方式...
第三章集中讨论了JSP和Servlet的数据存储机制,包括Request对象、Response对象、Session对象、Application对象等。此外,本章节还介绍了JSP和Servlet的数据类型、数据转换等。 第四章至第九章涵盖了JSP和Servlet的...