Head First Servlets and JSP】笔记9:属性的作用域、线程安全

什么是属性?

属性和参数

属性的3个作用域

属性API

属性不好的一面

1、到底什么是属性(Attribute)?

属性就是一个对象,可以被设置(bound,也可以叫绑定)到另外三个servlet API对象ServletContext、HttpSession、HttpServletRequest中。可以把它简单地认为是一个名/值对,名是String、值是object。在实际中,我们并不知道也不关心它具体如何实现,我们关心的只是属性所在的作用域。

2、属性不是参数(Parameter)!

笔记1中的参数——请求参数:

笔记7中的参数——servlet初始化参数:

以及,上下文初始化参数参数:

3、属性的3个作用域:

  • ServletContext属性(上下文属性)——Web应用中的每一部分都能访问
  • HttpSession属性(会话属性)——能访问特定的HttpSession的部分才可访问
  • HttpServletRequest属性(请求属性)——能访问特定的ServletRequest的部分才可访问

4、设置、访问属性的API——每个接口(ServletContext、HttpS......)的属性API完全相同

关于Enumeration,参见Java-Enumeration总结 by IAMTJW

5、属性不好的一面.··.```..``..`.`.`...`..

  1. 上下文属性不是线程安全的!一个上下文属性可能同时被多个servlet所更改、访问。糟糕的解决方案是给doGet(或者是其它方法)加上synchronized,这样并不能解决问题,原因在于关于synchronized只能防止同一个servlet中的其他线程访问上下文属性,但是不能阻止另外一个servlet访问。关于ynchronized参见java synchronized详解 by Gang.Wang

    正确的方法是:对上下文加锁,而不是对servlet加锁。怎么实现呢?看下面的代码:

  2. 会话属性是线程安全的吗?不是,因为用户可能打开好几个浏览器窗口...解决方案类似:
  3. 只有请求属性和局部变量是线程安全的!

    要注意的是servlet的实例域不是线程安全的,除非实现了SingleThreadModel,或者是同步服务方法,但这是十分糟糕的做法,会让Web应用的效率变得非常差,所以,一个servlet根本不该有实例变量,有也应该是final的,如果真的需要在多个线程中共享一些东西,那就把它加到合适的作用域上去。
时间: 2024-08-02 16:23:38

Head First Servlets and JSP】笔记9:属性的作用域、线程安全的相关文章

【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 EL隐式对象汇总 pageContext使用参考 EL表达式的基本规则 关于EL的一些细节 通过EL获得request参数 从request得到更多信息 获得Request Method? xxxxScope有意义吗? 通过EL调用函数 EL与数学运算 1.EL隐式对象汇总.如下所示: 更详细的内容可以参考 

【Head First Servlets and JSP】实践记录01:从有脚本到无脚本

试图章节式的阅读<Head First Servlets and JSP>总感觉不对劲,这本书前后的联系性很强,有点类似于“连续剧”,而不是通常的“知识清单”. 可以建立多态的bean引用吗 使用type,但没有class scope属性默认为“page” 从有脚本到无脚本 1.快速搭建一个测试环境:输入用户名,返回“Hello, 用户名” index.html <!DOCTYPE html> <html lang="en"> <head>

JSP笔记

溪云初起日沉阁,山雨欲来风满楼.--唐代许浑<咸阳城东楼 / 咸阳城西楼晚眺 / 西门> JSP基本语法 脚本标识 JSP 表达式 <%= 表达式%> 向页面输出信息 声明标识 <%! 声明的方法和变量的代码 %> <%! String s = "胖子"; int add(int x,int y){ return x+y; } %> 代码片段 <% java代码或是脚本代码 %> <% out.print("这

HTML学习笔记——disabled属性

1.适用范围:HTML中的input元素.option元素 2.作用:禁用元素.被禁用的 input 元素既不可用,也不可点击. 3.示例: ①如下代码的button元素都处于禁用状态 <input type="button" disabled="false" value="测试按钮"> <input type="button" disabled="123" value="测试按

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D

jquery笔记之属性选择器 查找以某种条件开头的页面元素

jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]")                查找所有含有 id 属性的div元素. $("div[id='ajaxa']")        查找 id 为 ajaxa 的 div 元素. $("div[id!='ajaxa']")       查找 id 不为 ajax

jsp四种属性范围

一:page属性范围 <%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.0

css笔记-display属性

css笔记-display属性 display属性可取值 display:none | inline | block | list-item | inline-block | table | inline-table | table-caption | table-cell | table-row | table-row-group | table-column | table-column-group | table-footer-group | table-header-group | co

cocos2dx-3.2 笔记 - 物理属性

PhysicsBody 添加物理属性,不多废话,直接上代码 Sprite *land = Sprite::createWithSpriteFrame(pngName); PhysicsBody *Landbody = PhysicsBody::create(); Landbody->addShape(PhysicsShapeBox::create( Size(land->getContentSize().width,land->getContentSize().height) ,Phys