【Head First Servlets and JSP】笔记9:属性的作用域、线程安全
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、属性不好的一面.··.```..``..`.`.`...`..
- 上下文属性不是线程安全的!一个上下文属性可能同时被多个servlet所更改、访问。糟糕的解决方案是给doGet(或者是其它方法)加上synchronized,这样并不能解决问题,原因在于synchronized只能防止同一个servlet中的其他线程访问上下文属性,但是不能阻止另外一个servlet访问。关于synchronized参见java synchronized详解 by Gang.Wang。
正确的方法是:对上下文加锁,而不是对servlet加锁。怎么实现呢?看下面的代码:

- 会话属性是线程安全的吗?不是,因为用户可能打开好几个浏览器窗口...解决方案类似:

- 只有请求属性和局部变量是线程安全的!
要注意的是servlet的实例域不是线程安全的,除非实现了SingleThreadModel,或者是同步服务方法,但这是十分糟糕的做法,会让Web应用的效率变得非常差,所以,一个servlet根本不该有实例变量,有也应该是final的,如果真的需要在多个线程中共享一些东西,那就把它加到合适的作用域上去。
【Head First Servlets and JSP】笔记9:属性的作用域、线程安全的更多相关文章
- 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略
基本上是<Head First Servlets and JSP>内容的整理.扩充.顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例. 完整代码参考 ...
- jquery笔记之属性选择器 查找以某种条件开头的页面元素
jquery笔记之属性选择器 查找以某种条件开头的页面元素 转载:http://www.blogbus.com/amyqiong-logs/78340326.html $("div[id]& ...
- jsp四种属性范围
在JSP提供了四种属性的保存范围.所谓的属性保存范围,指的就是一个设置的对象,可以在多个页面中保存并可以继续使用.它们分别是:page.request.session.appliction. 1.pa ...
- 《APUE》读书笔记第十二章-线程控制
本章中,主要是介绍控制线程行为方面的内容,同时介绍了在同一进程中的多个线程之间如何保持数据的私有性以及基于进程的系统调用如何与线程进行交互. 一.线程属性 我们在创建线程的时候可以通过修改pthrea ...
- 《UNIX环境高级编程》(APUE) 笔记第十二章 - 线程控制
12 - 线程控制 GitHub 地址 1. 线程限制 下图为与 线程操作 有关的一些 限制: 可以通过 sysconf 函数进行查询 . 2. 线程属性 可使用 pthread_attr_t 结构修 ...
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- 【Head First Servlets and JSP】笔记22:直接从请求到JSP & 获取Person的嵌套属性
直接从请求到JSP,不经过servlet <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 【Head First Servlets and JSP】笔记18:JSP指令
mark. jetbrain tomcat配置:https://www.jetbrains.com/help/idea/2017.1/creating-and-running-your-first-w ...
- 【Head First Servlets and JSP】笔记 27: web 应用安全
典型的安全问题:假冒者.窃听者.非法升级者 认证方式: Base64 .摘要认证 .客户端证书.表单认证,重点熟悉摘要算法( HASH . MD5 等) 安全机制:授权.认证.数据完整性.机密性 80 ...
随机推荐
- eclipse通过maven远程发布应用到Tomcat
好久没有写博客了,今天为大家分享一下如何在eclipse通过maven远程发布应用到Tomcat. 一般情况下,我们发布应用到服务器需要现将应用导出成war包,然后连接服务器部署更新,这样是很耗时的, ...
- grails email 发送邮件插件
1.配置email插件,在Config.groovy文件中配置: plugins { compile ":mail:1.0.5" } 2.配置Config.groovy文件: gr ...
- 解决Bootstrap 试用手机端 布满全屏
@media (max-width: 767px) { body{ margin: 0; padding: 0; } } @media (max-width: 970px) { body{ margi ...
- Spring MVC生成XML
以下示例演示如何使用Spring Web MVC框架生成XML.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: 创建一个名 ...
- SVN服务器迁移,SVN版本库迁移(网络copy)
做法: 准备:系统平台:windows server 2003 版本库:vos 源服务器:10.10.13.48 目标服务器:10.10.13.129源SVN版本库的path: D:\svn\vos要 ...
- ios 集成阿里百川的坑-【SDK初始化-iOS】读取身份图片AppKey失败
最简易方法调用淘宝app: 引用文件 #import <AlibcTradeSDK/AlibcTradeSDK.h> AlibcWebViewController* view = [[Al ...
- ios -完全实现代码设置 Could not find a storyboard named 'Main' in bundle NSBundle
UIWindow *windows = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; windows.background ...
- 如何通过Mac 下的SVN拉取代码
背景:今天入职了一家新单位,用的svn,我之前一直用的win下的git和svn,然后我现在用自己的mac开发,所以有了标题的疑问 博文由来:看了几个博客写的都很繁琐,看半天才能解决我的疑问,所以自己写 ...
- linux中使用vi 打开文件时,能显示行号
方法一: 1.显示当前行行号,在VI的命令模式下输入 :nu 2.显示所有行号,在VI的命令模式下输入 :set nu方法二: 使用vi编辑~/.vimrc文件,在该文件中加入一行" ...
- spring cloud 订单调用用户
下面实现一个订单调用用户实现例子,使用技术只要是spring,为以后操作负载打基础.(基于昨天别人问我的基础上做了实例供大家参考) 1.用户工程截图 : 2.用户工程启动类 3.用户工程控制类 4. ...