`

关于servlet中request,session,application三者关系的形象解析

    博客分类:
  • HTTP
 
阅读更多

几乎所有的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接口的两个方法来实现的:

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之间传递信息。 需要注意两点:

  1. 转发不是重定向 ,转发是在Web应用内部进行的。PHP支持重定向但没有转发。
  2. 转发对浏览器是透明的 ,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个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

示例程序

这一节的示例程序是一个用户登录的模拟程序。文件较多。

  • 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)

分享到:
评论

相关推荐

    四个范围 pagecontext request session application

    在Java Web开发中,"四个范围"是指PageContext、Request、Session和Application这四个不同的作用域,它们分别代表了Web应用程序中数据存储的不同层级和生命周期。理解并熟练掌握这四个范围,对于编写高效且可维护的...

    三大作用域request、session、application

    三大作用域 request作用域 session作用域 application作用域【servlet的上下文】

    struts2访问request,session,application作用域

    除了上述无耦合的方式外,还可以直接使用 Servlet API 中的方法来获取 Request、Session 和 Application,但这会导致代码与 Servlet API 耦合度过高。 **1. 获取方式** 在 Action 类中可以直接使用 `...

    Struts2的Action中获得request response session几种方法

    以下将详细介绍如何在Struts2的Action中获取request、response、session。 ### 1. 使用ActionContext获取request、response、session Struts2的Action可以通过`ActionContext`来间接获取`request`、`response`和`...

    jsp页面间通过request/session传值

    ### JSP 页面间通过 Request/Session 传值详解 #### 一、背景介绍 在 Web 开发中,尤其是在 JavaServer Pages (JSP) 技术中,数据在不同页面之间的传递是一项基本且重要的功能。本篇文章将详细介绍如何利用 JSP 的 ...

    request、session作用域的理解

    Request、Session 作用域的理解 Request 作用域: ...Request、Session 和 Application 作用域是 Web 开发中非常重要的概念,它们可以帮助开发者实现信息共享和传递,提高应用程序的灵活性和可扩展性。

    EOS运算逻辑中获取session和request

    在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application 在普元Primeton EOS运算逻辑中获取HttpSession和Httprequest以及application

    购物车技术(servlet实现)

    Servlet技术的核心在于其内置的四个对象:`request`、`session`、`page`和`application`,它们在购物车实现中起到关键作用。 1. **HttpServletRequest request对象**:每当用户发送一个HTTP请求时,服务器都会创建...

    jsp/servlet阶段测试

    三者之间的主要区别在于生命周期和作用域,Request对象只在一次请求中有效,Session对象在整个会话中有效,Application对象在整个应用程序中有效。 6. JSP注释和HTML注释的区别:JSP注释以开始和结束,用于注释JSP...

    详解SpringBoot中Session超时原理说明

    默认情况下,SpringBoot 使用 Tomcat 作为嵌入式 Servlet 容器,而 Tomcat 中的 Session 超时时间可以通过配置文件来设置。例如,在 application.properties 或 application.yml 文件中可以添加以下配置: ``` ...

    servlet2.4doc

    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 ...

    jsp网站开发的课后习题,application,session,周期,转发和跳的区别,模拟淘宝等

    每个阶段都有对应的内置对象,如page、request、response、session和application,开发者可以利用这些对象来操作页面和处理请求。 4. 请求转发与重定向 - 请求转发(Request Forwarding):发生在服务器端,使用`...

    JSP/Servlet Java面试逻辑题

    答:request,session,application,cookie等 7、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是类...

    JSP与Servlet传值技术总结

    3. 使用Java代码传值:使用Java代码来传递数据,例如:servlet只能接收到session.setAttribute("testSession","Hello session")的内容,而不能接收到request的内容。 总结 getParameter()方法传递的是字符串,一般...

    JSP+servlet+SQL示例.rar(含源码)

    这个示例压缩包对初学者和有经验的开发者都极具价值,它不仅展示了JSP、Servlet和SQL的基本用法,还通过实际的源码展示了如何在项目中有效地整合这三个技术。通过学习和研究这些源码,开发者能够加深对Web开发的理解...

    JSP+Servlet+Mysql个人网站

    - 理解JSP的内置对象(如request、response、session、application)及其作用。 - 掌握数据库设计原则,包括ER模型、范式理论和索引优化。 - 学习如何使用JDBC连接和操作MySQL数据库,包括SQL语句的编写。 - 了解MVC...

    Servlet+jsp.docx

    ### Servlet与JSP详解 #### 一、Servlet基础概述 **Servlet** 是Java Web开发的基础技术之一,主要用于处理客户端的HTTP请求,并返回响应结果。它是一种服务器端的Java应用程序,可以扩展服务器的功能。 ##### ...

    struts中自定义的tag的Java类中如何获得session

    通过`pageContext`,我们可以方便地获取到如`request`、`session`、`application`等内置对象,这对于实现自定义标签非常有帮助。 #### 2.2 获取`HttpSession`的具体方法 在自定义标签的Java类中,可以通过以下方式...

    吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案

    第三章集中讨论了JSP和Servlet的数据存储机制,包括Request对象、Response对象、Session对象、Application对象等。此外,本章节还介绍了JSP和Servlet的数据类型、数据转换等。 第四章至第九章涵盖了JSP和Servlet的...

Global site tag (gtag.js) - Google Analytics