`
CB-13
  • 浏览: 21525 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Servlet属性作用域

    博客分类:
  • Web
阅读更多
属性是存在于3个Servlet API对象(ServletContext、HttpSession和HttpServletRequest)中的对象集。简单来说,我们可以认为它们是键值对的集合。

对于属性的作用域也有3个,即Context、Session和Request作用域,属性可以绑定到这三个作用域上。每个作用域都有它的优点和缺点。取决于具体的需求,我们会将一个属性存放到其中的一个作用域中。

用于存储、查询和删除这些属性的方法对于所有的作用域都是相同的。它们是:
Object getAttribute(String name);   
  
void setAttribute(String name, Object value);   
  
void removeAttribute(String name);   
  
Enumeration getAttributeNames();  

请求作用域

用于将属性存储到请求作用域中的类为ServletRequest。

绑定到请求作用域上的属性仅仅在同一个请求中可用。一旦请求完成,所有绑定到该请求上的属性都会被清空。因此对于该作用域中的属性,没有办法在不同的请求间共享。

因此,当你确信该属性不会由其他Servlet或同一的Servlet的不同请求使用时,可以使用该作用域。

会话作用域

用于将属性存储到会话作用域中的类为HttpSession。

绑定到会话作用域上的属性在同一会话中的所有Servlet操作期间都可用(当然它应该在同一个应用中)。

会话作用域中的属性是非线程安全的。因为会话作用域中的属性在会话期间对所有的Servlet操作都是可用的,因此出现两个不同的Servlet修改同一个会话属性是可能的。举例来说:

Servlet1.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp)   
        throws ServletException, IOException {   
     HttpSession session = req.getSession();   
     session.setAttribute("attr1", "1");   
     String attr1 = (String) session.getAttribute("attr1");   
     PrintWriter writer = resp.getWriter();   
     writer.print(attr1);   
     writer.close();   
}
  
Servlet2.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp)   
        throws ServletException, IOException {   
     HttpSession session = req.getSession();   
     String attr1 = (String) session.getAttribute("attr1");   
     session.setAttribute("attr1", "3");   
     attr1 = (String) session.getAttribute("attr1");   
     PrintWriter writer = resp.getWriter();   
     writer.print(attr1);   
     writer.close();   
}   

打开浏览器让后在两个浏览器标签页里输入servlet1和servlet2的URL,然后查看下结果。在很少的情况下,你会看到servlet1的输出结果为3.你可能会很惊讶因为servlet1中将attr1的值设置为1.这个是可能发生的,因为会话作用域属性不是线程安全的。

现在,让我们看一下,该如何解决该问题呢。我们知道对于Servlet的请求,web容器会创建一个新线程。因此大部分开发者会尝试同步doGet方法来避免并发问题。确实,同步doGet方法将保证同时只有一个线程会进入doGet方法但是它仍然不能解决2个不同的Servlet同时更新会话作用域的属性。因此,最好的方法是同步HttpSession对象。修改后的代码如下:

Servlet1.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp)   
        throws ServletException, IOException {   
     HttpSession session = req.getSession();   
     String attr1 = "";   
    synchronized (session) {   
         session.setAttribute("attr1", "1");   
         attr1 = (String) session.getAttribute("attr1");   
     }   
     PrintWriter writer = resp.getWriter();   
     writer.print(attr1);   
     writer.close();   
}  

上述代码将保证在servlet1执行的时候不会有同步问题。无论执行多少次servlet1,输出总是1.

而同步doGet是一个非常大的错误。这将既不能解决该问题也不允许多用户同时访问该Servlet。

上下文作用域

用于将属性存储到上下文作用域的类是ServletContext。

绑定到该作用域的属性在整个应用期间都是可用的(从应用启动和运行后)。因此,要注意,不能绑定任何消耗内存的对象到该作用域上因为这些对象对垃圾回收是不可见的(不会被回收)。

同样,上下文作用域中的属性也是非线程安全的。因此要避免同步问题,我们需要同步ServletContext中存储的对象。

什么时候将属性存储在请求作用域、会话作用域和上下文作用域中?

请求作用域会话作用域上下文作用域
当我们需要使请求参数仅仅对当前请求有效时使用该作用域参数需要在整个会话期间有效时使用该作用域当我们需要存储对整个应用都有效的属性时,使用该作用域
请求参数被存放到该作用域中登录信息和有状态的对象像数据库链接、JNDI查询等资源
线程安全非线程安全非线程安全
分享到:
评论

相关推荐

    JSP/Servlet Java面试逻辑题

    1、说一说Servlet的生命周期?★★★★★ 答: servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。...这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

    Session Cookie的HttpOnly和secure属性

    其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session Cookie的...

    Servlet与JSP核心编程第2版

    16.5 访问作用域变量 16.6 访问bean的属性 16.7 访问集合 16.8 引用隐式对象 16.9 表达式语言中运算符的应用 16.10 表达式的条件求值 16.11 表达式语言其他功能概览 第ⅲ部分 支持技术 第17章 数据库...

    servlet + jstl + el 分页小程序 带源码

    这是一个jsp分页程序,使用JSTL + servlet...在servlet中必须要把封装好的page对象存到作用域中 index.jsp 输出数据 writepage.jsp 是一个单独的分页jsp,直接通过导入引用就可以了,只需要在此传入要跳转的url即可。

    jsp servlet 入门学习资料-新手一看就懂

    6.10.5 JavaBeans的作用域 6.10.6 利用JavaBeans制作的购物车 6.11 使用application对象 6.11.1 应用的概念 6.11.2 application对象可用的方法和属性 6.11.3 application对象内包含的系统信息 6.11.4 利用...

    spring mvc注释文档

    本文内容包括: • 概述 • 一个简单的基于注解的 Controller ... 使模型对象的特定属性具有 Session 范围的作用域 • 请求处理方法的签名规约 • 注册自己的属性编辑器 • 如何准备数据 • 小结 • 参考资料

    自定义_分页标签

    4、name(在路径中分页模型存放的作用域的属性名); 5、scope(作用域); 6.value(实体对象名,便于用EL表达式打印数据); 7、colspan(要跨的行数,用于分页哪一行与数据行统一) (注:使用时一定要导入标签的路径,...

    使用Spring2.5基于注解驱动的SpringMVC

    使模型对象的特定属性具有Session范围的作用域请求处理方法的签名规约注册自己的属性编辑器如何准备数据小结参考资料基于注解的配置有越来越流行的趋势,Spring2.5顺应这种趋势,为SpringMVC提供了完全基于注解的...

    基于JSP+JavaBean+Servlet三层架构员工考勤管理系统源码+数据库+项目说明.zip

    7) 操作完数据库,如果是查询数据 将结果集返回到servlet页面,通过setAttribute(key,value)将数据存入request作用域,跳转回JSP页面,再通过JSP页面的EL表达式获取存入的数据。 8) 如果是修改数据,修改完成后...

    JAVA程序员面试题

    会话作用域ServletsJSP 页面描述 page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成...

    JSP技术知识点考查 jsp动态建站技术

    pageContext对象是Jsp页面本身的上下文,它提供唯一一组方法来管理具有不同作用域的属性 request对象提供对Http请求数据的访问,同时还提供用于加入特定请求数据的上下文 response对象允许直接访问...

    jsp与java bean学习.rar

    jsp+servlet+tomact应用从零开始学(第二版)第9章代码 :在jsp中使用bean,设置bean属性,bean的作用域等应用(包括产品名称编码价格信息等提取,圆的半径周长,面积等计算,用户登录验证,数据库连接查询访问,el...

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    7.2.3 JavaBean作用域范围 158 7.3 设置或获取JavaBean属性 162 7.3.1 设置JavaBean属性 162 7.3.2 获取JavaBean属性 165 7.4 扩展练习 168 第8章 Servlet技术 171 8.1 Servlet简介 171 8.1.1 Servlet概述 171 ...

    数据库测试test.sql

    再存放到application作用域中 context.setAttribute("count",count2); //http://192.168.58.250:8080/myservlet2/servlet/admin/success.jsp response.sendRedirect("../admin/success.jsp"); }else{ //失败...

    JSP 相关对象的使用介绍

    作用域 数据类型 request 此对象封装了由WEB浏览器或其它客户端生成的HTTP请求的细节(参数,属性,头标和数据); request(用户请求期) ServletRequest的子类型 response 此对象封装了返回到HTTP客户端的输出,...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    Spring中文帮助文档

    2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. ...

    Spring API

    2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. ...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

Global site tag (gtag.js) - Google Analytics