??xml version="1.0" encoding="utf-8" standalone="yes"?> 参加 Brian ?多线E?Java ~程讨论论坛以获得?zhn)工程中的U程和ƈ发问题的帮助? ~写U程安全cL困难的。它不但要求仔细分析在什么条件可以对变量q行dQ而且要求仔细分析其它c能如何使用某个cR?有时Q要在不影响cȝ功能、易用性或性能的情况下使类成ؓ(f)U程安全的是很困隄。有些类保留从一个方法调用到下一个方法调用的状态信息,要在实践中ɘq样的类成ؓ(f)U程安全的是困难的?/p>
理非线E安全类的用比试图使类成ؓ(f)U程安全的要更容易些。非U程安全c通常可以安全地在多线E程序中使用Q只要?zhn)能确保一个线E所用的cȝ实例不被其它U程使用。例如,JDBC 不? 什么是U程局部变量(thread-local variableQ? U程局部变?/em>高效Cؓ(f)每个使用它的U程提供单独的线E局部变量值的副本。每个线E只能看C自己相联pȝ|而不知道别的U程可能正在使用或修改它们自q副本。一些编译器Q例?Microsoft Visual C++ ~译器或 IBM XL FORTRAN ~译器)(j)用存储类别修饰符Q像 因ؓ(f)U程局部变量是通过一个类来实现的Q而不是作?Java 语言本n的一部分Q所?Java 语言U程局部变量的使用语法比内建线E局部变量语a的用语法要W拙一些。要创徏一个线E局部变量,请实例化c? q个实现的性能不会(x)很好Q因为每? U程局部变量常被用来描l有状?#8220;单子”QSingletonQ?或线E安全的׃n对象Q或者是通过把不安全的整个变量封装进 M创徏的花Ҏ(gu)使用的花费相Ҏ(gu)贵些的有状态或非线E安全的对象Q例?JDBC 其它适合使用 在?zhn)的代码中Q?zhn)可以调? ThreadLocal 的线E安全性稍差的堂兄弟,InheritableThreadLocal ThreadLocal cL一个亲戚,InheritableThreadLocalQ它以相似的方式工作Q但适用于种cd全不同的应用E序。创Z个线E时如果保存?jin)所? 虽然U程局部变量早已赫赫有名ƈ被包?Posix ?JDK 1.2 中, Java q_版本 1.3 提供? 不幸的是Q即使有?jin)这些改q,Java 1.3 中的 ?Java q_的最新版本,即版?1.4b2 中, 我希望?zhn)从这个系列中得到了(jin)乐,也学C(jin)知识Q我也鼓励?zhn)到我?讨论论坛中来深入研究多线E问题? 2.如何~写U程安全的代? CSS全称Cascading Style Sheet。层叠式样式表。从三年前就开始用CSS?jin),但一直以来都看?jin)它。CSS的出现其实是一ơ革命,它试囑ְ|站的内容与表现分开? 2.外链式:(x) 3.导入?/p>
3.属性式Q? #fontRed 注明两点 CSS 标签属?属性参? CSS 标签属?属?/p>
行ؓ(f)属?behavior 字体和文本属?direction* direction 颜色和背景属?background-attachment 版面属?border 分类属?display list-style 定位属?bottom* clip 打印属?page** pageBreakAfter 滤镜属?filter 伪类和其它属?:active @charset 我们知道Dreamweaver在表格制作方面做得非常出Ԍ但是在某些时候还是必ȝ合css才能辑ֈ一些特定效果,下面我们先把有关表格Ҏ(gu)的css语法整理出来Q然后另外介l怎样用css化表格的边框?/p>
有关表格Ҏ(gu)的css语法 具体内容包括Q上Ҏ(gu)宽度、右Ҏ(gu)宽度、下Ҏ(gu)宽度、左Ҏ(gu)宽度、边框宽度、边框颜艌Ӏ边框样式、上Ҏ(gu)、下Ҏ(gu)、左Ҏ(gu)、右Ҏ(gu)、边框、宽度、高度、有x{?/p>
1.上边框宽?/p>
语法: border-top-width: <?gt; 允许? thin | medium | thick | <长度> 初始? medium 适用? 所有对?/p>
向下兼容: ?/p>
上边框宽度属性用于指定一个元素上Ҏ(gu)的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄(jing)响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在上边框、边框的宽度或边框的属性略写?/p>
2.双框宽?/p>
语法: border-right-width: <?gt; 允许? thin | medium | thick | <长度> 初始? medium 适用? 所有对?/p>
向下兼容: ?/p>
双框宽度属性用于指定元素的双框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄(jing)响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在双框、边框的宽度或边框的属性略写?/p>
3.下边框宽?/p>
语法: border-bottom-width: <?gt; 允许? thin | medium | thick | <长度> 初始? medium 适用? 所有对?/p>
向下兼容: ?/p>
下边框宽度属性用于指定元素的下边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄(jing)响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在下边框、边框的宽度或边框的属性略写?/p>
4.左边框宽?/p>
语法: border-left-width: <?gt; 允许? thin | medium | thick | <长度> 初始? medium 适用? 所有对?/p>
向下兼容: ?/p>
左边框宽度属性用于指定元素的左边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄(jing)响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在左边框、边框的宽度或边框的属性略写?/p>
5.Ҏ(gu)宽度 语法: border-width: <?gt; 允许? [ thin | medium | thick | <长度> ]{1,4} 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
Ҏ(gu)宽度属性用一到四个值来讄元素的边界,值是一个关键字或长度。不允许使用负值长度。如果四个值都l出?jin),它们分别应用于上、右、下和左Ҏ(gu)的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给Z(jin)Q省略了(jin)的g对边相等?q个属性是上边框宽度、右Ҏ(gu)宽度、下Ҏ(gu)宽度和左Ҏ(gu)宽度属性的略写。也可以使用略写的边框属性?/p>
6.Ҏ(gu)颜色 语法: border-color: <?gt; 允许? <颜色>{1,4} 初始? 颜色属性的?/p>
适用? 所有对?/p>
向下兼容: ?/p>
Ҏ(gu)颜色属性设|一个元素的Ҏ(gu)颜色。可以用一到四个关键字。如果四个值都l出?jin),它们分别应用于上、右、下和左Ҏ(gu)的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给Z(jin)Q省略了(jin)的g对边相等。也可以使用略写的边框属性?/p>
7.Ҏ(gu)样式 语法: border-style: <?gt; 允许? [ none | dotted | dashed | solid | double | groove | ridge | inset | outset ]{1,4} 初始? none 适用? 所有对?/p>
向下兼容: ?/p>
Ҏ(gu)样式属性用于设|一个元素边框的样式。这个属性必ȝ于指定可见的Ҏ(gu)。可以用一到四个关键字。如果四个值都l出?jin),它们分别应用于上、右、下和左Ҏ(gu)的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给Z(jin)Q省略了(jin)的g对边相等。也可以使用略写的边框属性?/p>
noneQ无样式Q? 语法: border-top: <?gt; 允许? <上边框宽?gt; || <Ҏ(gu)式样> || <颜色> 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
上边框属性是一个用于设|一个元素上Ҏ(gu)的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p>
9.双?/p>
语法: border-right: <?gt; 允许? <双框宽?gt; || <Ҏ(gu)式样> || <颜色> 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
双框属性是一个用于设|一个元素右Ҏ(gu)的宽度、式栗和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性。 10.下边?/p>
语法: border-bottom: <?gt; 允许? <下边框宽?gt; || <Ҏ(gu)式样> || <颜色> 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
下边框属性是一个用于设|一个元素的下边框的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p>
11.左边?/p>
语法: border-left: <?gt; 允许? <左边框宽?gt; || <Ҏ(gu)式样> || <颜色> 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
左边框属性是一个用于设|一个元素左Ҏ(gu)的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p>
12.Ҏ(gu) 语法: border: <?gt; 允许? <Ҏ(gu)宽度> || <Ҏ(gu)式样> || <颜色> 初始? 未定?/p>
适用? 所有对?/p>
向下兼容: ?/p>
Ҏ(gu)属性是一个用于设|一个元素边框的宽度、式样和颜色的略写?/p>
Ҏ(gu)声明的例子包括:(x) H2 { border: groove 3em } Ҏ(gu)属性只能设|四U边框;只能l出一l边框的宽度和式栗ؓ(f)?jin)给Z个元素的四种Ҏ(gu)的不同的||页制作者必ȝ一个或更多的属性,如:(x)上边框、右Ҏ(gu)、下Ҏ(gu)、左Ҏ(gu)、边框颜艌Ӏ边框宽度、边框式栗上Ҏ(gu)宽度、右Ҏ(gu)宽度、下Ҏ(gu)宽度或左Ҏ(gu)宽度? 13.宽度 语法: width: <?gt; 允许? <长度> | <癑ֈ?gt; | auto 初始? auto 适用? 块和替换元?/p>
向下兼容: ?/p>
宽度属性的初始gؓ(f)“auto”,即ؓ(f)该元素的原有宽度(有就是元素自q宽度)。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p>
14.高度 语法: height: <?gt; 允许? <长度> | auto 初始? auto 适用? 块和替换元?/p>
向下兼容: ?/p>
高度属性的初始gؓ(f)“auto”,即ؓ(f)该元素的原有高度(有就是元素自q高度Q?。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p>
15.有关标签 tableQ表格标{,Ҏ(gu)个表格样式的定义要放在table中; css滤镜 随着|页设计技术的发展Qh们已l不满于原有的一些HTML标记Q而是希望能够为页面添加一些多媒体属性,例如滤镜的和渐变的效果。CSS技术的飞快发展使这些需求成Z(jin)现实。从现在开始我要ؓ(f)大家介绍一个新的CSS扩展部分QCSS滤镜属性(F(tun)ilter Properties)。用这U技术可以把可视化的滤镜和{换效果添加到一个标准的HTML元素上,例如囄、文本容器、以?qing)其他一些对象。对于o(h)镜和渐变效果Q前者是基础Q因为后者就是o(h)镜效果的不断变化和演C更ѝ当滤镜和渐变效果结合到一个基本的SCRIPT程序中后,|页设计者就可以拥有一个徏立动态交互文档的强大工具。也是CSS FILTER+ SCRIPTQ?q就说明惌建立动态的文档q要一些SCRIPT Q脚本语aQ的基础? 备注Q可惜只有IE4.0以上支持Q如果是别的览器,那就....... 元素 说明 IE4.0以上支持的o(h)镜属性表 滤镜效果 描述 1、Alpha 滤镜 语法Q{FILTERQALPHA(opacity=opacity,finishopacity=finishopacity,style=style,startx=startx, "Alpha"属性是把一个目标元素与背景混合。设计者可以指定数值来控制混合的程度。这U“与背景混合”通俗地说是一个元素的透明度。通过指定坐标Q可以指定点、线、面的透明度。他们的参数含义分别如下Q? 效果如下Q?/p>
2、Blur 滤镜 语法Q对于HTMLQ{ilter:blur(add=add,direction=direction,strength=strength)} 3、FlipH, FlipV 滤镜 语法Q{filter:filph} ,{filter:filpv} 分别是水q_转和垂直反{Q具体如下:(x) 4、Chroma 滤镜 语法Q{filter:chroma(color=color)} 滴水檐坊 5、DropShadow 滤镜 语法Q{filter:dropshadow(color=color,offx=ofx,offy=offy,positive=positive)} “DropShaow"思义是d对象的阴影效果。其工作原理是徏立一个偏U量Q加上较深?Color"代表投射阴媄(jing)的颜Ԍ"offx"?offy"分别是X方向和Y方向阴媄(jing)的饿偏移量?Positive"参数是一个布?yu)(dng)|如果为“TRUEQ非0Q”,那么׃ؓ(f)M的非透明像素建立可见的投影。如果ؓ(f)“FASLEQ?Q”,那么׃ؓ(f)透明的像素部分徏立透明效果 6、Glow 滤镜 语法Q{filter:glow(color=color,strength)} 7、Gray ,Invert,Xray 滤镜 语法Q{filter:gray} ,{filter:invert},{filter:xray} Gray滤镜是把一张图片变成灰度图QInvert滤镜是把对象的可视化属性全部翻转,包括色彩、饱和度、和亮度|Xray滤镜是让对象反映出它的轮廓ƈ把这些轮廓加亮,也就是所谓的“X”光片?/p>
效果如下Q?/p>
、Light 滤镜 语法QFilter{light} q个属性模拟光源的投射效果。一旦ؓ(f)对象定义?jin)“LIGHT"滤镜属性,那么可以调用它的“方?Method)"来设|或者改变属性。“LIGHT"可用的方法有Q?/p>
AddAmbient 加入包围的光? 9、Mask 滤镜 语法Q{filter:mask(color=color)} 使用"MASK"属性可以ؓ(f)对象建立一个覆盖于表面的膜Q其效果p戴者有色眼镜看物体一栗?/p>
10、Shadow 滤镜 语法Q{filter:shadow(color=color,direction=direction)} 利用“Shadow”属性可以在指定的方向徏立物体的投媄(jing)QCOLOR是投pQDIRECTION是设|投q方向。其?度代表垂直向上,然后?5度ؓ(f)一个单位。它的默认值是向左?70度?/p>
filter:shadow(color=red,direction=225) 11、Wave 滤镜 语法Q{filter:wave(add=add,freq=freq,lightstrength=strength,phase=phase,strength=strength)} “FREQ”是波纹的频率,也就是指定在对象上一共需要生多个完整的LU, “LIGHTSTRENGTH”参数可以对于LU增强光q效果Q范?----100Q?/p>
“PHASE”参数用来设|正弦L的偏U量?/p>
“STRENGTH”代表振q大?/p>
Java虚拟机的深入研究 作者:(x)刘学?
1 Java技术与Java虚拟?/b>
说vJavaQh们首先想到的是Java~程语言Q然而事实上QJava是一U技术,它由四方面组? Java~程语言、JavacL件格式、Java虚拟机和Java应用E序接口(Java API)。它们的关系如下图所C:(x)
? Java四个斚w的关p?/p>
q行期环境代表着Javaq_Q开发h员编写Java代码(.java文g)Q然后将之编译成字节?.class文g)。最后字节码被装入内存,一旦字节码q入虚拟机,它就?x)被解释器解释执行,或者是被即时代码发生器有选择的{换成机器码执行。从上图也可以看出Javaq_由Java虚拟机和Java应用E序接口搭徏QJava语言则是q入q个q_的通道Q用Java语言~写q编译的E序可以q行在这个^C。这个^台的l构如下图所C:(x)
在Javaq_的结构中, 可以看出QJava虚拟?JVM) 处在核心(j)的位|,是程序与底层操作pȝ和硬件无关的关键。它的下Ҏ(gu)UL接口Q移植接口由两部分组成:(x)适配器和Java操作pȝ, 其中依赖于^台的部分UCؓ(f)适配器;JVM 通过UL接口在具体的q_和操作系l上实现Q在JVM 的上Ҏ(gu)Java的基本类库和扩展cd以及(qing)它们的APIQ?利用Java API~写的应用程?application) 和小E序(Java applet) 可以在Q何Javaq_上运行而无需考虑底层q_, 是因ؓ(f)有Java虚拟?JVM)实现?jin)程序与操作pȝ的分,从而实C(jin)Java 的^台无x?
那么到底什么是Java虚拟?JVM)呢?通常我们谈论JVMӞ我们的意思可能是Q?
对JVM规范的的抽象说明是一些概늚集合Q它们已l在书《The Java Virtual Machine Specification》(《Java虚拟范》)(j)中被详细地描qC(jin)Q对JVM的具体实现要么是软gQ要么是软g和硬件的l合Q它已经被许多生产厂商所实现Qƈ存在于多U^C上;q行JavaE序的Q务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟?JVM)主要针对W三U情况而言。它可以被看成一个想象中的机器,在实际的计算Z通过软g模拟来实玎ͼ有自己想象中的硬Ӟ如处理器、堆栈、寄存器{,q有自己相应的指令系l?/p>
JVM在它的生存周期中有一个明的dQ那是q行JavaE序Q因此当JavaE序启动的时候,׃生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失?jin)。下面我们从JVM的体pȝ构和它的q行q程q两个方面来对它q行比较深入的研I?
2 Java虚拟机的体系l构
刚才已经提到QJVM可以׃同的厂商来实现。由于厂商的不同必然DJVM在实C的一些不同,然而JVMq是可以实现跨^台的Ҏ(gu),q就要归功于设计JVM时的体系l构?jin)?/p>
我们知道Q一个JVM实例的行Z光是它自q事,q涉?qing)到它的子系l、存储区域、数据类型和指o(h)q些部分Q它们描qC(jin)JVM的一个抽象的内部体系l构Q其目的不光规定实现JVM时它内部的体pȝ构,更重要的是提供了(jin)一U方式,用于严格定义实现时的外部行ؓ(f)。每个JVM都有两种机制Q一个是装蝲h合适名U的c?cL是接?Q叫做类装蝲子系l;另外的一个负责执行包含在已装载的cL接口中的指o(h)Q叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈q五个部分,q几个部分和c装载机制与q行引擎机制一L(fng)成的体系l构图ؓ(f)Q?/p>
? JVM的体pȝ?/p>
JVM的每个实例都有一个它自己的方法域和一个堆Q运行于JVM内的所有的U程都共享这些区域;当虚拟机装蝲cL件的时候,它解析其中的二进制数据所包含的类信息Qƈ把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线E创建的时候,都会(x)拥有自己的程序计数器和Java栈,其中E序计数器中的值指向下一条即被执行的指令,U程的Java栈则存储U程调用JavaҎ(gu)的状态;本地Ҏ(gu)调用的状态被存储在本地方法栈Q该Ҏ(gu)栈依赖于具体的实现?/p>
下面分别对这几个部分q行说明?/p>
执行引擎处于JVM的核?j)位|,在Java虚拟范中Q它的行为是由指令集所军_的。尽对于每条指令,规范很详l地说明?jin)当JVM执行字节码遇到指令时Q它的实现应该做什么,但对于怎么做却a之甚。Java虚拟机支持大U?48个字节码。每个字节码执行一U基本的CPUq算,例如,把一个整数加到寄存器,子程序{Uȝ。Java指o(h)集相当于JavaE序的汇~语a?/p>
Java指o(h)集中的指令包含一个单字节的操作符,用于指定要执行的操作,q有0个或多个操作?提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成?/p>
׃指o(h)pȝ的简单?使得虚拟机执行的q程十分?从而有利于提高执行的效率。指令中操作数的数量和大是由操作符军_的。如果操作数比一个字节大,那么它存储的序是高位字节优先。例?一?6位的参数存放时占用两个字?其gؓ(f):
W一个字?256+W二个字节字节码?
指o(h)一般只是字节对齐的。指令tableswitch和lookup是例?在这两条指o(h)内部要求强制?字节边界寚w?
对于本地Ҏ(gu)接口Q实现JVMq不要求一定要有它的支持,甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可UL性的考虑Q当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情Q需要确保垃圑֛收器不会(x)那些正在被本地Ҏ(gu)调用的对象释放掉?
Java的堆是一个运行时数据?cȝ实例(对象)从中分配I间Q它的管理是由垃圑֛收来负责?不给E序员显式释攑֯象的能力。Java不规定具体用的垃圾回收法,可以Ҏ(gu)pȝ的需求用各U各L(fng)法?
JavaҎ(gu)Z传统语言中的~译后代码或是Unixq程中的正文D늱伹{它保存Ҏ(gu)代码(~译后的java代码)和符可。在当前的Java实现?Ҏ(gu)代码不包括在垃圾回收堆中,但计划在来的版本中实现。每个类文g包含?jin)一个JavacL一个Java界面的编译后的代码。可以说cL件是Java语言的执行代码文件。ؓ(f)?jin)保证类文g的^台无x?Java虚拟范中对类文g的格式也作了(jin)详细的说明。其具体l节请参考Sun公司的Java虚拟范?
Java虚拟机的寄存器用于保存机器的q行状?与微处理器中的某些专用寄存器cM。Java虚拟机的寄存器有四种: 在上qCpȝ构图中,我们所说的是第一U,即程序计数器Q每个线E一旦被创徏拥有了(jin)自己的程序计数器。当U程执行JavaҎ(gu)的时候,它包含该U程正在被执行的指o(h)的地址。但是若U程执行的是一个本地的Ҏ(gu)Q那么程序计数器的值就不会(x)被定义?
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区?/p>
局部变量区
每个JavaҎ(gu)使用一个固定大的局部变量集。它们按照与vars寄存器的字偏U量来寻址。局部变量都?2位的。长整数和双_ֺ点数占据了(jin)两个局部变量的I间,却按照第一个局部变量的索引来寻址?例如,一个具有烦(ch)引n的局部变?如果是一个双_ֺ点?那么它实际占据了(jin)索引n和n+1所代表的存储空?虚拟范ƈ不要求在局部变量中?4位的值是64位对齐的。虚拟机提供?jin)把局部变量中的D载到操作数栈的指?也提供了(jin)把操作数栈中的值写入局部变量的指o(h)?/p>
q行环境?/b>
在运行环境中包含的信息用于动态链?正常的方法返回以?qing)异常捕捉?
动态链?/b>
q行环境包括Ҏ(gu)向当前类和当前方法的解释器符可的指?用于支持Ҏ(gu)代码的动态链接。方法的class文g代码在引用要调用的方法和要访问的变量时用符受动态链接把W号形式的方法调用翻译成实际Ҏ(gu)调用,装蝲必要的类以解释还没有定义的符?q把变量讉K译成与q些变量q行时的存储l构相应的偏Ud址。动态链接方法和变量使得Ҏ(gu)中用的其它cȝ变化不会(x)影响到本E序的代码?
正常的方法返?/b>
如果当前Ҏ(gu)正常地结束了(jin),在执行了(jin)一条具有正类型的q回指o(h)?调用的方法会(x)得到一个返回倹{执行环境在正常q回的情况下用于恢复调用者的寄存?q把调用者的E序计数器增加一个恰当的数?以蟩q已执行q的Ҏ(gu)调用指o(h),然后在调用者的执行环境中l执行下厅R?
异常捕捉
异常情况在Java中被UCError(错误)或Exception(异常),是Throwablecȝ子类,在程序中的原因是:①动态链接错,如无法找到所需的class文g。②q行旉,如对一个空指针的引用。程序用了(jin)throw语句?
当异常发生时,Java虚拟机采取如下措?
操作数栈?/b>
机器指o(h)只从操作数栈中取操作?对它们进行操?q把l果q回到栈中。选择栈结构的原因?在只有少量寄存器或非通用寄存器的机器(如Intel486)?也能够高效地模拟虚拟机的行ؓ(f)。操作数栈是32位的。它用于l方法传递参?q从Ҏ(gu)接收l果,也用于支持操作的参数,q保存操作的l果。例?iadd指o(h)两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指o(h)压进堆栈的。这两个整数从堆栈弹出、相?q把l果压回到操作数栈中?
每个原始数据cd都有专门的指令对它们q行必须的操作。每个操作数在栈中需要一个存储位|?除了(jin)long和double?它们需要两个位|。操作数只能被适用于其cd的操作符所操作。例?压入两个intcd的数,如果把它们当作是一个longcd的数则是非法的。在Sun的虚拟机实现?q个限制由字节码验证器强制实行。但?有少数操?操作Wdupe和swap),用于对运行时数据行操作时是不考虑cd的?
本地Ҏ(gu)栈,当一个线E调用本地方法时Q它?yu)׃再受到虚拟机关于l构和安全限制方面的U束Q它既可以访问虚拟机的运行期数据区,也可以用本地处理器以及(qing)Mcd的栈。例如,本地栈是一个C语言的栈Q那么当CE序调用C函数Ӟ函数的参C某种序被压入栈Q结果则q回l调用函数。在实现Java虚拟机时Q本地方法接口用的是C语言的模型栈Q那么它的本地方法栈的调度与使用则完全与C语言的栈相同?/p>
3 Java虚拟机的q行q程
上面对虚拟机的各个部分进行了(jin)比较详细的说明,下面通过一个具体的例子来分析它的运行过E?/p>
虚拟机通过调用某个指定cȝҎ(gu)main启动Q传递给main一个字W串数组参数Q指定的类被装载,同时链接该类所使用的其它的cdQƈ且初始化它们。例如对于程序:(x) ~译后在命o(h)行模式下键入Q?java HelloApp run virtual machine
通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字W串"run"?virtual"?machine"的数l。现在我们略q虚拟机在执行HelloApp时可能采取的步骤?
开始试图执行类HelloApp的mainҎ(gu)Q发现该cdƈ没有被装载,也就是说虚拟机当前不包含该类的二q制代表Q于是虚拟机使用ClassLoader试图Lq样的二q制代表。如果这个进E失败,则抛Z个异常。类被装载后同时在mainҎ(gu)被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶D:(x)(g)验,准备和解析。检验检查被装蝲的主cȝW号和语义,准备则创建类或接口的静态域以及(qing)把这些域初始化ؓ(f)标准的默认|解析负责(g)查主cd其它cL接口的符号引用,在这一步它是可选的。类的初始化是对cM声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过E如下:(x)
?Q虚拟机的运行过E?/p>
4 l束?/b>
本文通过对JVM的体pȝ构的深入研究以及(qing)一个JavaE序执行时虚拟机的运行过E的详细分析Q意在剖析清楚Java虚拟机的机理?/p>
cL(zhn)?zhn)地出现?Java q_版本 1.2 中的。虽然支持线E局部变量早是许多U程工具Q例?Posix
工具Q的一部分Q但 Java Threads API 的最初设计却没有q项有用的功能。而且Q最初的实现也相当低效。由于这些原因,
极少受到xQ但对简化线E安全ƈ发程序的开发来_(d)它却是很方便的。在 L使用U程的第 3 部分QJava 软gN Brian Goetz 研究?
q提供了(jin)一些用技巧?
cL非线E安全的 ?两个U程不能在小_度U上安全地共享一?
?但如果每个线E都有它自己?
Q那么多个线E就可以同时安全地进行数据库操作?
为每个线E维护一个单独的 JDBC q接Q或M其它对象Q当然是可能的;Thread API l了(jin)我们把对象和U程联系h所需的所有工兗?ThreadLocal 则我们能更Ҏ(gu)地把U程和它的每U程Qper-threadQ数据成功地联系h?
?
Q把对线E局部变量的支持集成C(jin)其语a中。Java ~译器对U程局部变量不提供特别的语a支持Q相反地Q它?
cd现这些支持,
cM有这个类的特别支持?
的一个对象?
cȝ行ؓ(f)?
中的各种
cȝ行ؓ(f)很相|
cd当存储或(g)索一个值时的间接句柄。清?1 昄?
接口?
清单 1. ThreadLocal 接口
public class ThreadLocal {
public Object get();
public void set(Object newValue);
public Object initialValue();
}
讉K器检索变量的当前U程的|
讉K器修改当前线E的倹{?
Ҏ(gu)是可选的Q如果线E未使用q某个变量,那么(zhn)可以用q个Ҏ(gu)来设|这个变量的初始|它允许gq初始化。用一个示例实现来说明 ThreadLocal 的工作方式是最好的Ҏ(gu)。清?2 昄?
的一个实现方式。它不是一个特别好的实玎ͼ虽然它与最初实现非常相|(j)Q所以很可能性能不佳Q但它清楚地说明?ThreadLocal 的工作方式?
清单 2. ThreadLocal 的糟p实?/font>
public class ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object get() {
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread)) {
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
public Object initialValue() {
return null;
}
}
?
操作都需?
映射表上的同步,而且如果多个U程同时讉K同一?
Q那么将发生争用。此外,q个实现也是不切实际的,因ؓ(f)?
对象?
映射表中的关键字导致无法在U程退出后?
q行垃圾回收Q而且也无法对ȝE的
的特定于U程的D行垃圑֛收?
回页?/u>
Q或者是通过把对象的特定于线E的状态封装进
。例如,在与数据库有紧密联系的应用程序中Q程序的很多Ҏ(gu)可能都需要访问数据库。在pȝ的每个方法中都包含一?
作ؓ(f)参数是不方便???#8220;单子”来访问连接可能是一个虽然更_糙Q但却方便得多的技术。然而,多个U程不能安全地共享一?JDBC
。如清单 3 所C,通过使用“单子”中的
Q我们就能让我们的程序中的Q何类Ҏ(gu)地获取每U程
的一个引用。这P我们可以认ؓ(f)
允许我们创徏 每线E单?/em>?
清单 3. 把一?JDBC q接存储C个每U程 Singleton ?/font>
public class ConnectionDispenser {
private static class ThreadLocalConnection extends ThreadLocal {
public Object initialValue() {
return DriverManager.getConnection(ConfigurationSingleton.getDbUrl());
}
}
private ThreadLocalConnection conn = new ThreadLocalConnection();
public static Connection getConnection() {
return (Connection) conn.get();
}
}
或正则表辑ּ匚w器,都是可以使用每线E单子(singletonQ技术的好地斏V当?dng)在类DL(fng)地方Q?zhn)可以使用其它技术,例如用池Q来安全地管理共享访问。然而,从可伸羃性角度看Q即使是用池也存在一些潜在缺陗因为池实现必须使用同步Q以l护池数据结构的完整性,如果所有线E用同一个池Q那么在有很多线E频J地Ҏ(gu)q行讉K的系l中Q程序性能因争用而降低?
回页?/u>
但用池却不能成ؓ(f)很好的替代技术的应用E序包括存储或篏U每U程上下文信息以备稍后检索之用这L(fng)应用E序。例如,假设(zhn)想创徏一个用于管理多U程应用E序调试信息的工兗?zhn)可以用如清?4 所C的
cM为线E局部容器来累积调试信息。在一个工作单元的开_(d)(zhn)清I容器,而当一个错误出现时Q?zhn)查询该容器以(g)索这个工作单元迄今ؓ(f)止生成的所有调试信息?
清单 4. ?ThreadLocal 理每线E调试日?/font>
public class DebugLogger {
private static class ThreadLocalList extends ThreadLocal {
public Object initialValue() {
return new ArrayList();
}
public List getList() {
return (List) super.get();
}
}
private ThreadLocalList list = new ThreadLocalList();
private static String[] stringArray = new String[0];
public void clear() {
list.getList().clear();
}
public void put(String text) {
list.getList().add(text);
}
public String[] get() {
return list.getList().toArray(stringArray);
}
}
来保存?zhn)的程序正在做什么的信息Q而且Q稍后如果有必要Q例如发生了(jin)一个错误)(j)Q?zhn)能够?gu)地检索与某个特定U程相关的调试信息?与简单地把所有信息{储到一个日志文Ӟ然后努力扑և哪个日志记录来自哪个U程Q还要担?j)线E争用日志纪录对象)(j)相比Q这U技术简便得多,也有效得多?
在基?servlet 的应用程序或工作单元是一个整体请求的M多线E应用程序服务器中也是很有用的,因ؓ(f)在处理请求的整个q程中将要用到单个线E。?zhn)可以通过前面讲述的每U程单子技术用
变量来存储各U每hQper-requestQ上下文信息?
回页?/u>
对象的|那么q些g自动传递给子线E。如果一个子U程调用
?
Q那么它?yu)与它的父线E看到同一个对象。ؓ(f)保护U程安全性,(zhn)应该只对不可变对象Q一旦创建,其状态就永远不会(x)被改变的对象Q?
Q因为对象被多个U程׃n?
很合适用于把数据从父U程传到子线E,例如用户标识Quser idQ或事务标识Qtransaction idQ,但不能是有状态对象,例如 JDBC
?
回页?/u>
规范在内的很多线E框架支持,但最初的 Java U程设计中却省略?jin)它Q只是在 Java q_的版?1.2 中才d上去。在很多斚wQ?
仍在发展之中Q在版本 1.3 中它被重写,版本 1.4 中又重写?jin)一ơ,两次都专门是Z(jin)性能问题?
的实现方式与清单 2 中的方式非常怼Q除?jin)用同?
代替
来存?values 之外。(以一些额外的性能开销ZP使用 WeakHashMap 解决?jin)无法?Thread 对象q行垃圾回收的问题。)(j)不用_(d)
的性能是相当差的?
版本已经量更好?jin);它不使用M同步Q从而不存在可~性问题,而且它也不用弱引用。相反地Qh们通过l?
d一个实例变量(该变量用于保存当前线E的从线E局部变量到它的值的映射?
Q来修改
cM支持
。因为检索或讄一个线E局部变量的q程不涉?qing)对可能被另一个线E读写的数据的读写操作,所以?zhn)可以不用M同步实?
?
。而且Q因为每U程值的引用被存储在自已?
对象中,所以当?
q行垃圾回收Ӟ也能对该
的每U程D行垃圑֛收?
的性能仍然出奇地慢。据我的_略量Q在双处理器 Linux pȝ上的 Sun 1.3 JDK 中进?
操作Q所耗费的时间大U是无争用同步的两倍。性能q么差的原因?
Ҏ(gu)的花贚w常大Q占?
q行旉的三分之二还多。虽然有q些~点QJDK 1.3
仍然比争用同步快得多Q所以如果在M存在严重争用的地方(可能是有非常多的U程Q或者同步块被频J地执行Q或者同步块很大Q,
可能仍然要高效得多?
?
的性能都有?jin)很大提高。有?jin)这些提高?
应该比其它技术,如用池,更快。由于它比其它技术更单,也更不易出错Qh们最l将发现它是避免U程间出C希望的交互的有效途径?
回页?/u>
能带来很多好处。它常常是把有状态类描绘成线E安全的Q或者封装非U程安全cM使它们能够在多线E环境中安全C用的最Ҏ(gu)的方式。?
使我们可以绕qؓ(f)实现U程安全而对何时需要同步进行判断的复杂q程Q而且因ؓ(f)它不需要Q何同步,所以也改善?jin)可伸羃性。除单之外,?
存储每线E单子或每线E上下文信息在归档方面还有一个颇有h(hun)值好??通过使用
Q存储在
中的对象都是 ?/em>被线E共享的是清晰的Q从而简化了(jin)判断一个类是否U程安全的工作?
]]>
struts下的action也类|同样在多U程环境下。可以参考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一? Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
?为多U程环境~写代码。我们的controller servlet指挥创徏你的Action cȝ一个实例,用此实例来服务所有的h。因此,你必ȝ写线E安全的ActioncR遵循与写线E安全的servlet同样的方针?
1.什么是U程安全的代?
在多U程环境下能正确执行的代码就是线E安全的?
安全的意思是能正执行,否则后果是程序执行错误,可能出现各种异常情况?/p>
很多书籍里都详细讲解?jin)如何这斚w的问题,他们主要讲解的是如何同步U程对共享资源的使用的问题。主要是对synchronized关键字的各种用法Q以?qing)锁的概c(din)?
Java1.5中也提供?jin)如d锁这cȝ工具cR这些都需要较高的技巧,而且相对难于调试?
但是Q线E同步是不得以的Ҏ(gu),是比较复杂的,而且?x)带来性能的损失。等效的代码中,不需要同步在~写Ҏ(gu)度和性能上会(x)更好些?
我这里强调的是什么代码是始终为线E安全的、是不需要同步的。如?
1)帔R始终是线E安全的Q因为只存在L作?
2)Ҏ(gu)造器的访?new 操作)是线E安全的Q因为每ơ都新徏一个实例,不会(x)讉K׃n的资源?
3)最重要的是:局部变量是U程安全的。因为每执行一个方法,都会(x)在独立的I间创徏局部变量,它不是共享的资源。局部变量包括方法的参数变量?
struts user guide里有Q?
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
?只用用局部变量?-~写U程安全的代码最重要的原则就是,在ActioncM只用局部变量,不用实例变量?/p>
ȝQ?
在Java的Web服务器环境下开发,要注意线E安全的问题。最单的实现方式是在Servlet和Struts Action里不要用类变量、实例变量,但可以用类帔R和实例常量?
如果有这些变量,可以它们{换ؓ(f)Ҏ(gu)的参C入,以消除它们?
注意一个容易淆的地方Q被Servlet或Action调用的类?如值对象、领域模型类)中是否可以安全的使用实例变量Q如果你在每ơ方法调用时
新徏一个对象,再调用它们的Ҏ(gu)Q则不存在同步问?--因ؓ(f)它们不是多个U程׃n的资源,只有׃n的资源才需要同?--而Servlet和Action的实例对于多个线E是׃n的?
换句话说QServlet和Action的实例会(x)被多个线E同时调用,而过?jin)这一?如果在你自己的代码中没有另外启动U程Q且每次调用后箋业务对象旉是先新徏一个实例再调用Q则都是U程安全的?
]]>
|
+--javax.servlet.GenericServlet
|
+--javax.servlet.http.HttpServlet
|
+--org.apache.struts.action.ActionServlet
Struts提供?jin)一个缺省版本的ActionServletc,你可以承这个类Q覆盖其中的一些方法来辑ֈ你的Ҏ(gu)处理的需要。ActionServletl承与javax.servlet.http.HttpServletQ所以在本质上它和一个普通的servlet没有区别Q你完全可以把它当做一个servlet来看待,只是在其中完成的功能不同|了(jin)。ActionServlet主要完成如下功能Q?br>
一个来自客L(fng)的URI映射C个相应的Actionc?br>
省版本的ActionServlet?x)从配置文gweb.xml中读取如下初始化参数Q?br>
应用使用的资源包(resources bundle)的基c?br>
用于创徏应用的MessageResources对象的MessageResourcesFactory的类名。确省是org.apache.struts.util.PropertyMessageResourcesFactory?br>
Struts的配|文Ӟ省?WEB-INF/struts-config.xml。注意这儿是与应用Context兌的相对\径?br>
定义?jin)确省的内容cd和编码格式,它会(x)被自动地被设|到每个response中,如果JSP/Servlet中没有明的讄。确省是text/html?br>
调试信息的别。默认ؓ(f)0Q比当前U别高的调试信息?x)被log到日志文件中?br>
与debug的作用类|只是q个detail是initMapping()时专用的。调试信息会(x)被打印到System.outQ而不是日志文件?br>
ActionFormBean的实现类Q确省ؓ(f)org.apache.struts.action.ActionFormBean
应用中用的ActionForwardc,省是org.apache.struts.action.ActionForward?br>
指定?jin)确省用的Locale对象。设为trueQ当得到一个sessionӞ?x)自动在session中存储一个以Action.LOCALE_KEY标示的Locale对象Q如果session中还没有与Action.LOCALE_KEYl定的Locale对象?br>
应用中用的ActionMappingc,省是org.apache.struts.action.ActionMapping?br>
文g上传使用的MutipartRequestHandler的实现类。确省ؓ(f)org.apache.struts.upload.DiskMultipartRequestHandler
如果设ؓ(f)trueQ那么ActionServlet?x)自动在每个到客L(fng)的响应中dnocache的HTML_(d)q样客户端就不会(x)对应用中的页面进行缓存。确省ؓ(f)false
如果讄为trueQ那么应用在得到一个未定义的message资源Ӟ?x)返回nullQ而不是返回一个错误信息。确省是true?br>
文g上传的大上限,省?50M
文g上传时的~冲区的大小Q确省ؓ(f)4M
讄用于上传时的临时目录。工作目录会(x)作ؓ(f)一个Servlet环境QContextQ的属性提供?br>
Are we using the new configuration file format?省为true?br>
在解析配|XML文g是是否进行有效性的验证。确省ؓ(f)true
ActionServlet中应用了(jin)命o(h)设计模式?br>
一个Servlet在由容器生成Ӟ首先?x)调用init()Ҏ(gu)q行初始化,在接C个HTTPhӞ调用相应的方法进行处理;比如GETh调用doGet()Ҏ(gu)QPOSTh调用doPost()Ҏ(gu)。所以首先看看ActionServlet的init()Ҏ(gu)Q你׃(x)很清楚ؓ(f)什么ActionServlet可以完成q些功能?jin)?br>
init()
在它的init()Ҏ(gu)中,ActionServlet依次调用如下protected的方法完成初始化Q?br>
首先把actions设ؓ(f)slow模式Q这时对FastHashMap的访问是U程同步的,然后清除actions中的所有的已存在的?值对Q最后再把actions的模式设为fast。由于FastHashMap是struts在java.util.HashMap的基上的一个扩展类Q是Z(jin)适应多线E、ƈ且对HashMap的访问大部分是只ȝҎ(gu)环境的需要。大家知道java.util.HashMap是非U程安全的,所以HashMap一般适用于单U程环境下。org.apache.struts.FastHashMap是l承于java.util.HashMapQ在其中d多线E的支持产生的。在fast模式下的工作方式是这L(fng)Q读取是非线E同步的Q写入时首先克隆当前mapQ然后在q个克隆上做写入操做Q完成后用这个修改后的克隆版本替换原来的map。那么在什么时候会(x)把ActionscL加到q个map中呢Q我们已l提C(jin)struts是动态的生成Actioncȝ实例的,在每ơActionServlet接收C个GET或POST的HTTPhӞ?x)在q个map中查扑֯应的Actioncȝ实例Q如果不存在Q那么就实例化一个,q放入map中。可见这个actions属性vC(jin)对Actioncd例的~存的作用?br>
说明Q文中引用的代码片断可能?x)省略?jin)一些例外检查等非主U的内容Q敬h意?br>
首先从配|文件中dfactory参数Q如果这个参C为空Q那么就在MessageResourcesFactory中用这个指定的Factoryc;否则Q用默认的工厂corg.apche.struts.util.PropertyMessageResourceFactory。然后调用MessageResourcesFactory的静态createFactory()Ҏ(gu)Q生成一个具体的MessageResourceFactory对象Q注意:(x)MessageResourcesFactory是抽象类Q。这样就可以调用q个具体的MessageResourceFactory的createResource()Ҏ(gu)得到配置文g(web.xml)中定义的资源文g?jin)?br>上面的application对象cd为MessageResources。在web.xml中在配置ActionServlet时可以指定一个特定的工厂cR不能直接MessageResourcesFactory的createResources()Ҏ(gu)Q因个方法是abstract的。创建factoryObject的过E如下:(x)
<li>initMapping() Q?nbsp; 为应用初始化mapping信息ActionServlet有一个protected的属性:(x)mappingQ封装了(jin)一个ActionMapping的对象集合,以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappingscȝ实例。主要有两个Ҏ(gu)QaddMapping(ActionMapping mapping)和findMapping(String path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMapcL存储所有的ActionMapping对象?br>
在initMapping()中,首先链接mappings对象到本servlet实例。其实这句话的作用很单,在ActionMappings中会(x)有一个ActionServletcd的属性,q个属性就界定?jin)这个ActionMappings对象所属的ActionServlet。Struts的实现比较灵z,其中的ActionFormBean、ActionForward、ActionMappingcM完全可以使用自己实现的子c,来定制Struts的工作方式。上面的代码׃配置文gQweb.xmlQ中dformBean、forward、mapping参数Q这些参数就是你定制的ActionFormBean、ActionForward、ActionMappingcd?br>
从web.xmldStruts的配|文件的位置。用org.apache.struts.digester.Digester解析config参数标示的配|文Ӟ通常?#8220;/WEB-INF/struts-config.xml”Q解析出所有的data-source、form-bean、action-mapping、forward。从上面的程序片断看刎ͼDigester仅仅调用?jin)一个parse()Ҏ(gu)Q那么,Digester是怎样把解析struts-config.xml文gq把解析的结果form-bean{信息存储到属性变量formBeans{中的呢Q你可以注意到在调用digester.parse(InputStream)之前Q首先调用了(jin)initDigester()Ҏ(gu)Q?br>
在这个方法中首先生成一个Digester对象Q然后设|解析的规则和回调,如果你对XML、SAX不是很熟Q这儿不必纠~太深。要注意的是addSetNext()Ҏ(gu)Q设|了(jin)每一个要解析元素的Set Next回调Ҏ(gu)Q而这个方法就是由digester解析器的父提供的。上面的片断中的“addMapping”是ActionServlet本n定义的一个方法,由Digester回调。Digester是c此把解析出的每一个FormBean、ActionForward、ActionMapping{存储到属性变量formBeans、forwards、mappings{中的?br>
getServletContext().setAttribute(key,dataSource);
getServletContext().setAttribute(Action.FORWARDS_KEY, forwards);
getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);
]]>
一、CSS的四U实现方式:(x)
1.内嵌式:(x)
?CSS的定义:(x)
选择对象{属?:?;属?:?;属?:?;属性n:值n……}
如:(x)
td{font-size:12px;color:#FFFF00}
.myname{font-size:12px;color:#FFFF00}
a:hover{font-size:12px;color:#FFFF00;text-decoration: underline;}
?四种选择对象
1.HTML selector (TagName)
2.class selector (.NAME)
3.ID selector (#IDname)
4.Ҏ(gu)对象 (a:hover a:link a:visited a:active)
1.HTML selector
HTML selector是HTML的置标符Q如QDIV、TD、H1。HTML selector的作用范围是应用?jin)该样式的所有页面中的所有该|标W?
例:(x)
td
{ color: #FF0000;
}
-->
注意Q在中没有应用什么,其中文字自动变红艌Ӏ?
2.class selector
定义class selector需要往其名U其加一个点?”。如?classname”。class selector的作用范围是所有包含“class="classname"”的|标W?
例:(x)
.fontRed
{ color: #FF0000;
} -->
注意Q在W二个中没有“class="fontRed"”,所以文字没有变U色?
3.ID selector
定义ID selector需要往其名U其加一个点?”。如?IDname”。ID selector的作用范围是所有包含“ID="classname"”的|标W?
例:(x)
{ color: #FF0000;
} -->
注意Q在W二个中没有“ID="fontRed"”,所以文字没有变U色?
4.Ҏ(gu)对象
Ҏ(gu)对象包括四种Q是针对链接对象讄?
a:hover 鼠标UM时的链?
a:link 常规Q非讉K链?
a:visited 讉Kq的链?
a:active 鼠标点击时的链?
Ҏ(gu)对象的作用范围是所有置标符Q这句话有待商榷Q因Z面很快就有一U方法可以把“所有”两个字推翻Q?
例:(x)
a:hover
{ color: #0000FF;
text-decoration: underline;
} -->
注意下面Q很有用Q!Q?
a.classname:hover
a#IDname:hover
q两U写法,是分别配?classname?IDname使用的。它的作用范围变成了(jin)所有包含“class="classname"”或“ID="IDname"”的|标W。这U写法,可以帮助你在同一面中实现多Ua:hover效果Q可以看一下艺|的主页上导航栏文字与普通文章标题在鼠标时的区别?
?应用Q?
1.|标W 自动应用
2.特制cRclass="NAME"
3.ID ID="IDname"
4.Ҏ(gu)对象 自动应用
?CSS属?
CSS的属性有很多Q像上文中用到最多的colorQ表C文字的颜色。background-color表示背景艌Ӏ这个是最主要的,但是因ؓ(f)没有什么难度,参考一下相x册就可以?jin)?/p>
W一点:(x)css的方式现在一般都采用外部q接Q这个用h方便Q编译v来也方便
W二点:(x)我用的是frontpage2003Q很多css的参数都?x)自动提C,g好像以前我没有用到过~~dw有的
q里列出?jin)目前支持的样式?CSS)标签属性。标有星?*)的标{ֱ性可?Microsoft] Internet Explorer 5 中用。标有两个星?**)的标{ֱ性可?Internet Explorer 5.5 中用。带有两个加?++)的标{ֱ性可?Internet Explorer 6 中用。如果某个标{ֱ性或属性已l提交给万维|协?W3C)但尚未作为标准发布,则标有“已提交”。若某个标签属性或属性既未提交给 W3C 也不是标准,标有“扩展”?/p>
font
font-family
font-size
font-style
font-variant
font-weight
ime-mode
layout-grid
layout-grid-char
layout-grid-line
layout-grid-mode
layout-grid-type
letter-spacing
line-break
line-height
min-height ++
ruby-align
ruby-overhang
ruby-position
text-align
text-autospace
text-decoration
text-indent
text-justify
text-kashida-space
text-overflow ++
text-transform
text-underline-position
unicode-bidi
vertical-align
white-space**
word-break
word-spacing ++(?Macintosh 版本 4.0 中可?
word-wrap
writing-mode
background-color
background-image
background-position
background-position-x
background-position-y
background-repeat
color
border-bottom
border-bottom-color
border-bottom-style
border-bottom-width
border-collapse*
border-color
border-left
border-left-color
border-left-style
border-left-width
border-right
border-right-color
border-right-style
border-right-width
border-style
border-top
border-top-color
border-top-style
border-top-width
border-width
clear
float
layout-flow
margin
margin-bottom
margin-left
margin-right
margin-top
padding
padding-bottom
padding-left
padding-right
padding-top
scrollbar-3dlight-color
scrollbar-arrow-color
scrollbar-base-color
scrollbar-darkshadow-color
scrollbar-face-color
scrollbar-highlight-color
scrollbar-shadow-color
table-layout*
zoom
list-style-image
list-style-position
list-style-type
height
left
overflow
overflow-x
overflow-y
position
right*
top
visibility
width
z-index
pageBreakBefore
cursor
:first-letter**
:first-line**
@font-face
:hover
@import
!important
:link
@media*
@page**
:visited
有关表格Ҏ(gu)的css语法整理
dottedQ点U;
dashedQ虚U;
solidQ实U;
doubleQ双U;
grooveQ槽U;
ridgeQ脊U;
insetQ内凹;
outsetQ外凸?
8.上边?/p>
A:link { border: solid blue }
A:visited { border: thin dotted #800080 }
A:active { border: thick double red }
tdQ单元格标签Q对单元格样式的定义要放在td中?
可视化o(h)镜属性只能用在HTML控g元素上。所谓的HTMLI间元素是它们在页面上定义?jin)一个矩形空_(d)览器的H口可以昄q些I间。下面列Z(jin)HTML合法的控件和它们的说明?/p>
BODY |页文档的主体元素,所有的可见范围都在<BODY>元素?
BUTTON 表单域的按钮Q可以有“发?submit)”、“重|?reset)”等形式
DIV 定义?jin)网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的
IMG 囄元素Q通过指定“src"属性来指定囄的来?
INPUT 输入表单?
MARQUEE Ud字幕效果
SPAN 定义?jin)网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的
TABLE 表格
TD 表格数据单元?
TEXTAREA 文本区域
TFOOT 多行输入文本?
TH 表格标题单元?
THEAD 表格标题
TR 表格?
Alpha 讄透明?
Blru 建立模糊效果
Chroma 把指定的颜色讄为透明
DropShadow 建立一U偏Uȝp轮廓Q即投射阴媄(jing)
FlipH 水^反{
FlipV 垂直反{
Glow 为对象的外边界增加光?
Grayscale 降低囄的彩色度
Invert 色彩、饱和度以及(qing)亮度值完全反转徏立底片效?
Light 在一个对象上q行灯光投媄(jing)
Mask Z个对象徏立透明?
Shadow 建立一个对象的Z轮廓Q即阴媄(jing)效果
Wave 在X轴和Y轴方向利用正弦LUҎ(gu)乱图?
Xray 只显C对象的轮廓
starty=starty,finishx=finishx,finishy=finishy)}
“opacity"代表透明度水准。默认的范围是从0 ?100Q他们其实是癑ֈ比的形式。也是_(d)0代表完全透明Q?00代表完全不透明。”finishopacity"是一个可选参敎ͼ如果惌讄渐变的透明效果Q就可以使用他们来指定结束时的透明度。范围也? ?100。“style" 参数指定?jin)透明区域的Ş状特征。其?代表l一形状?代表UŞ?代表攑ְ状?代表长方形。”STARTX“和”STARTY“代表渐变透明效果的开始X和Y坐标。”FINISHX“和”FINISHY“代表渐变透明效果l束X和Y 的坐标?/p>
对于Script语言Q?[oblurfilter=] object.filters.blur
用手指在一q尚未干透的油画上迅速划q时Q画面就?x)变得模p。”Blur"是产生同样的模p效果?
“ADD”参数是一个布?yu)(dng)判断“TRUEQ默认)(j)”或者“FALSE”。它指定囄是否被改变成印象z模糊效果。模p效果是按顺旉的方向进行的Q“DIRECTION”参数用来设|模p的方向。其?度代表垂直向上,然后?5度ؓ(f)一个单位。它的默认值是向左?70度。“STRENGTH“值只能用整数来指定Q她代表有多像素的宽度受到模p媄(jing)响。默认是5个。对于网上的字体,如果讄他的模糊”ADD=1“,那么q些字体的效果会(x)非常好看的。如下:(x)
filter:blur(add=ture,direction=135,strength=10Q?/p>
使用”Chroma"属性可以设|一个对象中指定的颜色ؓ(f)透明Ԍ参数COLOR卌透明的颜艌Ӏ下面是兰色文字Q然后用Chroma 滤镜qo(h)掉兰Ԍ成?jin)下面的样子?
filter:chroma(color=blue)
当对一个对象?glow"属性后Q这个对象的边缘׃(x)产生cM发光的效果。“COLOR”是指定发光的颜Ԍ“STRENGTH”则是强度的表现Q可以从1?55之间的Q何整数来指定q个力度?
filter:glow(color=red,strength=10) 后的效果
AddCone 加入锥Ş光源
AddPoint 加入点光?
Changcolor 改变光的颜色
Changstrength 改变光源的强?
Clear 清除所有的光源
MoveLight Ud光源
可以定义光源的虚拟位|,以及(qing)通过调整X轴和Y轴的数值来控制光源焦点的位|,q可以调整光源的形式Q点光源或者锥形光源)(j)指定光源是否模糊边界、光源的颜色、亮度等属性。如果动态的讄光源Q可能回产生一些意想不到的效果。后面几会(x)有具体范例?/p>
filter:shadow(color=blue,direction=225)
filter:shadow(color=gray,direction=225)
效果分别如下Q?/p>
"wave" 属性把对象按垂直的波Ş样式打ؕ。默认是“TRUEQ非0Q”,
“ADD”表C是否要把对象按照L形样式打乱,
]]>
虚拟机的内层循环的执行过E如?
do{
取一个操作符字节;
Ҏ(gu)操作W的值执行一个动?
}while(E序未结?
class HelloApp
{
public static void main(String[] args)
{
System.out.println("Hello World!");
for (int i = 0; i < args.length; i++ )
{
System.out.println(args[i]);
}
}
}
附一个正则表辑ּ的资料:(x)
正则表达?regular expression)描述?jin)一U字W串匚w的模式,可以用来(g)查一个串是否含有某种子串、将匚w的子串做替换或者从某个串中取出W合某个条g的子串等?br /> 列目录时Q dir *.txt或ls *.txt中的*.txt?/p>
?/ins>是一个正则表辑ּ,因ؓ(f)q里*与正则式?的含义是不同的?a name="more"> Z于理解和记忆Q先从一些概念入手,所有特D字W或字符l合有一个总表在后面,最后一些例子供理解相应的概c(din)?/p>正则表达?/h3>
是由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W)(j)l成的文字模式。正则表辑ּ作ؓ(f)一个模板,某个字W模式与所搜烦(ch)的字W串q行匚w?br /> 可以通过在一对分隔符之间攑օ表达式模式的各种lg来构造一个正则表辑ּQ即/expression/ 普通字W?/h3>
由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以?qing)一些符受?非打印字W?/h3>
字符 含义 \cx 匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?/td> \f 匚w一个换늬。等价于 \x0c ?\cL?/td> \n 匚w一个换行符。等价于 \x0a ?\cJ?/td> \r 匚w一个回车符。等价于 \x0d ?\cM?/td> \s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> \S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> \t 匚w一个制表符。等价于 \x09 ?\cI?/td> \v 匚w一个垂直制表符。等价于 \x0b ?\cK?/td> Ҏ(gu)字符
所谓特D字W,是一些有Ҏ(gu)含义的字W,如上面说?*.txt"中的*Q简单的说就是表CZQ何字W串的意思。如果要查找文g名中有*的文Ӟ则需要对Q进行{义,卛_其前加一个\。ls \*.txt。正则表辑ּ有以下特D字W?br />特别字符 说明 $ 匚w输入字符串的l尾位置。如果设|了(jin) RegExp 对象?Multiline 属性,?$ 也匹?'\n' ?'\r'。要匚w $ 字符本nQ请使用 \$?/td> ( ) 标记一个子表达式的开始和l束位置。子表达式可以获取供以后使用。要匚wq些字符Q请使用 \( ?\)?/td> * 匚w前面的子表达式零ơ或多次。要匚w * 字符Q请使用 \*?/td> + 匚w前面的子表达式一ơ或多次。要匚w + 字符Q请使用 \+?/td> . 匚w除换行符 \n之外的Q何单字符。要匚w .Q请使用 \?/td> [ 标记一个中括号表达式的开始。要匚w [Q请使用 \[?/td> ? 匚w前面的子表达式零ơ或一ơ,或指明一个非贪婪限定W。要匚w ? 字符Q请使用 \??/td> \ 下一个字W标Cؓ(f)或特D字W、或原义字符、或向后引用、或八进制{义符。例如, 'n' 匚w字符 'n'?\n' 匚w换行W。序?'\\' 匚w "\"Q?'\(' 则匹?"("?/td> ^ 匚w输入字符串的开始位|,除非在方括号表达式中使用Q此时它表示不接受该字符集合。要匚w ^ 字符本nQ请使用 \^?/td> { 标记限定W表辑ּ的开始。要匚w {Q请使用 \{?/td> | 指明两项之间的一个选择。要匚w |Q请使用 \|?/td>
构造正则表辑ּ的方法和创徏数学表达式的Ҏ(gu)一栗也是用多U元字符与操作符小的表辑ּl合在一h创徏更大的表辑ּ。正则表辑ּ的组件可以是单个的字W、字W集合、字W范围、字W间的选择或者所有这些组件的Ll合?/strong>限定W?/h3>
限定W用来指定正则表辑ּ的一个给定组件必要出现多少ơ才能满_配。有*??或{n}或{n,}或{n,m}?U?br />*??限定W都是贪婪的Q因为它们会(x)可能多的匹配文字,只有在它们的后面加上一?可以实现非贪婪或最匹配?br /> 正则表达式的限定W有Q?br />字符 描述 * 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?/td> + 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?/td> ? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?/td> {n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td> {n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?/td> {n,m} m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?/td> 定位W?/h3>
用来描述字符串或单词的边界,^?分别指字W串的开始与l束Q\b描述单词的前或后边界Q\B表示非单词边界?/p>不能对定位符使用限定W?/ins>选择
用圆括号所有选择Ҏ(gu)hQ相?c)选择之间用|分隔。但用圆括号?x)有一个副作用Q是相关的匹配会(x)被缓存,此时可用?:攑֜W一个选项前来消除q种副作用?br /> 其中?:是非捕获元之一Q还有两个非捕获元是?=?!Q这两个q有更多的含义,前者ؓ(f)正向预查Q在M开始匹配圆括号内的正则表达式模式的位置来匹配搜索字W串Q后者ؓ(f)负向预查Q在M开始不匚w该正则表辑ּ模式的位|来匚w搜烦(ch)字符丌Ӏ?后向引用
对一个正则表辑ּ模式或部分模式两Ҏ(gu)加圆括号导致相兛_配存储到一个(f)时缓冲区中,所捕获的每个子匚w都按照在正则表达式模式中从左臛_所遇到的内容存储。存储子匚w的缓冲区~号?1 开始,q箋~号直至最?99 个子表达式。每个缓冲区都可以?'\n' 讉KQ其?n Z个标识特定缓冲区的一位或两位十进制数?br /> 可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匚w的保存?各种操作W的q算优先U?/h3>
相同优先U的从左到右q行q算Q不同优先的运先高后低。各U操作符的优先从高C如下Q?br />操作W? 描述 \ 转义W?/td> (), (?:), (?=), [] 圆括号和Ҏ(gu)?/td> *, +, ?, {n}, {n,}, {n,m} 限定W?/td> ^, $, \anymetacharacter 位置和顺?/td> | “或”操?/td> 全部W号解释
字符 描述 \ 下一个字W标Cؓ(f)一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td> ^ 匚w输入字符串的开始位|。如果设|了(jin) RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td> $ 匚w输入字符串的l束位置。如果设|了(jin)RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td> * 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?/td> + 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?/td> ? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?/td> {n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td> {n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?/td> {n,m} m ?n 均ؓ(f)非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?/td> ? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦(ch)的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦(ch)的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td> . 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td> (pattern) 匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td> (?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td> (?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦(ch)Q而不是从包含预查的字W之后开始?/td> (?!pattern) 负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦(ch)Q而不是从包含预查的字W之后开?/td> x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td> [xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td> [^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td> [a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td> [^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td> \b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td> \B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td> \cx 匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符。x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?/td> \d 匚w一个数字字W。等价于 [0-9]?/td> \D 匚w一个非数字字符。等价于 [^0-9]?/td> \f 匚w一个换늬。等价于 \x0c ?\cL?/td> \n 匚w一个换行符。等价于 \x0a ?\cJ?/td> \r 匚w一个回车符。等价于 \x0d ?\cM?/td> \s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?/td> \S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]?/td> \t 匚w一个制表符。等价于 \x09 ?\cI?/td> \v 匚w一个垂直制表符。等价于 \x0b ?\cK?/td> \w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td> \W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td> \xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ(f)定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码? \num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W?/td> \n 标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td> \nm 标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ(f)八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td> \nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ(f)八进制数?(0-7)Q则匚w八进制{义?nml?/td> \un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)?/td> 部分例子
正则表达?/td> 说明 /\b([a-z]+) \1\b/gi 一个单词连l出现的位置 /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 一个URL解析为协议、域、端口及(qing)相对路径 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位|?/td> /[-a-z]/ A至z?6个字母再加一?受?/td> /ter\b/ 可匹配chapterQ而不能terminal /\Bapt/ 可匹配chapterQ而不能aptitude /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找C个匹配后Q从Windows后面开始进行下一ơ的(g)索匹配?/td>
]]>
撞的偶pp上,那叫一个险。幸亏是撞的pp上,而且车速不快。n上是些皮外伤?br />
所以奉劝大家宁{?时Q别?妙?br />
要是真有急事儿,非要抢那1妙,那就别犹豫,跑快炏V?img height="19" src="http://www.tkk7.com/Emoticons/emsmilep.gif" width="19" border="0" />
]]>
明天?01?jin),感觉刚过?1?br />
回家修养几天?img height="19" src="http://www.tkk7.com/Emoticons/emteeth.gif" width="19" border="0" />
]]>