Cool eye

BlogJava 首页 新随笔 联系 聚合 管理
  63 Posts :: 4 Stories :: 3 Comments :: 0 Trackbacks

#

ORACLE内置函数大全

                                      

ORACLE内置函数大全

SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;

        A         A      ZERO     SPACE
--------- --------- --------- ---------
       65        97        48        32


2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
赵 A

3.CONCAT
连接两个字符串;
SQL> select concat('010-','88888888')||'转23'  高乾竞电话 from dual;

高乾竞电话
----------------
010-88888888转23

4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith


5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1    被搜索的字符串
C2    希望搜索的字符串
I     搜索的开始位置,默认为1
J     出现的位置,默认为1
SQL> select instr('oracle traning','ra',1,2) instring from dual;

 INSTRING
---------
        9


6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;

NAME   LENGTH(NAME) ADDR             LENGTH(ADDR)       SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞            3 北京市海锭区                6   9999.99                    7

 

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;

AABBCCDD
--------
aabbccdd


8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;

UPPER
--------
AABBCCDD

 

9.RPAD和LPAD(粘贴字符)
RPAD  在列的右边粘贴字符
LPAD  在列的左边粘贴字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填满


10.LTRIM和RTRIM
LTRIM  删除左边出现的字符串
RTRIM  删除右边出现的字符串
SQL> select ltrim(rtrim('   gao qian jing   ',' '),' ') from dual;

LTRIM(RTRIM('
-------------
gao qian jing


11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr('13088888888',3,8) from dual;

SUBSTR('
--------
08888888


12.REPLACE('string','s1','s2')
string   希望被替换的字符或变量
s1       被替换的字符串
s2       要替换的字符串
SQL> select replace('he love you','he','i') from dual;

REPLACE('H
----------
i love you


13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether


14.TRIM('s' from 'string')
LEADING   剪掉前面的字符
TRAILING  剪掉后面的字符
如果不指定,默认为空格符

15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;

 ABS(100) ABS(-100)
--------- ---------
      100       100


16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;

 ACOS(-1)
---------
3.1415927


17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;

ASIN(0.5)
---------
.52359878


18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;

  ATAN(1)
---------
.78539816


19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
---------------
              4


20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
---------------
             -1


21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;

 COSH(20)
---------
242582598


22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;

   EXP(2)    EXP(1)
--------- ---------
7.3890561 2.7182818


23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
--------------
          2345


24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;

    LN(1)     LN(2) LN(2.7182818)
--------- --------- -------------
        0 .69314718     .99999999


25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;

 LOG(2,1)  LOG(2,4)
--------- ---------
        0         2


26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3)  MOD(3,3)  MOD(2,3)
--------- --------- ---------
        1         0         2


27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
----------- ----------
       1024         27


28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
         56          -55          55          -55


29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100)   SIGN(0)
--------- ---------- ---------
        1         -1         0


30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;

SIN(1.57079)
------------
           1


31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;

  SIN(20)  SINH(20)
--------- ---------
.91294525 242582598


32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

 SQRT(64)  SQRT(10)
--------- ---------
        8 3.1622777


33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;

  TAN(20)   TAN(10)
--------- ---------
2.2371609 .64836083


34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;

 TANH(20)   TAN(20)
--------- ---------
        1 2.2371609

 

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

   TRUNC1 TRUNC(124.16666,2)
--------- ------------------
      100             124.16

 

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;

TO_CHA
------
199910


37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;

TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
----------
31-5月 -04


38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;

MON_BETWEEN
-----------
          9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;

 MON_BETW
---------
      -60


39.NEW_TIME(date,'this','that')
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
  2  (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;

BJ_TIME             LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32


40.NEXT_DAY(date,'day')
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5月-2001','星期五') next_day from dual;

NEXT_DAY
----------
25-5月 -01

 

41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;

TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒
SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
  2  to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;

HH                  HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00

 

42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;

ROWID              ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES


43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;

conver
------
strutz


44.HEXTORAW
将一个十六进制构成的字符串转换为二进制


45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制

 

46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型

 

47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41

 

48.TO_DATE(string,'format')
将字符串转化为ORACLE中的一个日期


49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL>  select to_multi_byte('高') from dual;

TO
--


50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number('1999') year from dual;

     YEAR
---------
     1999


51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));


52.CONVERT('x','desc','source')
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
  2  0,'none',
  3  2,'insert',
  4  3,
  5  'select',
  6  6,'update',
  7  7,'delete',
  8  8,'drop',
  9  'other') cmd  from v$session where type!='background';

      SID   SERIAL# USERNAME                       CMD
--------- --------- ------------------------------ ------
        1         1                                none
        2         1                                none
        3         1                                none
        4         1                                none
        5         1                                none
        6         1                                none
        7      1275                                none
        8      1275                                none
        9        20 GAO                            select
       10        40 GAO                            none


53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;

GLOBAL_NAME                    DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD                   Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D


54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数


55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest('AA','AB','AC') from dual;

GR
--
AC
SQL> select greatest('啊','安','天') from dual;

GR
--


56.LEAST
返回一组表达式中的最小值
SQL> select least('啊','安','天') from dual;

LE
--


57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;

USERNAME                         USER_ID
------------------------------ ---------
GAO                                   25

 

58.USER
返回当前用户的名字
SQL> select user from  dual;

USER
------------------------------
GAO


59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA  查看当前用户是否是DBA如果是则返回true
SQL> select userenv('isdba') from dual;

USEREN
------
FALSE
SQL> select userenv('isdba') from dual;

USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')
--------------------
                 152
ENTRYID
返回会话人口标志
SQL> select userenv('entryid') from dual;

USERENV('ENTRYID')
------------------
                 0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv('instance') from dual;

USERENV('INSTANCE')
-------------------
                  1
LANGUAGE
返回当前环境变量
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv('lang') from dual;

USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv('terminal') from dual;

USERENV('TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;

VSIZE(USER) USER
----------- ------------------------------
          6 SYSTEM

 

60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('zhu',5555.55);
SQLWKS> commit;

SQL> select avg(distinct sal) from gao.table3;

AVG(DISTINCTSAL)
----------------
         3333.33

SQL> select avg(all sal) from gao.table3;

AVG(ALLSAL)
-----------
    2592.59


61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次

  返回选择列表项目的最大值,如果x是字符串数据类型,他返回一个VARCHAR2数据类型,如果X是一个DATA数据类型,返回一个日期,如果X是numeric数据类型,返回一个数字。注意distinct和all不起作用,应为最大值与这两种设置是相同的。
SQL> select max(distinct sal) from scott.emp;

MAX(DISTINCTSAL)
----------------
            5000


62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;

MIN(ALLSAL)
-----------
    1111.11


63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;

STDDEV(SAL)
-----------
  1182.5032

SQL> select stddev(distinct sal) from scott.emp;

STDDEV(DISTINCTSAL)
-------------------
           1229.951

 

64.VARIANCE(DISTINCT|ALL)
求协方差

SQL> select variance(sal) from scott.emp;

VARIANCE(SAL)
-------------
    1398313.9


65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       10         3      8750
       20         5     10875
       30         6      9400

 

66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400


67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

   DEPTNO ENAME            SAL
--------- ---------- ---------
       10 KING            5000
       10 CLARK           2450
       10 MILLER          1300
       20 SCOTT           3000
       20 FORD            3000
       20 JONES           2975
       20 ADAMS           1100
       20 SMITH            800
       30 BLAKE           2850
       30 ALLEN           1600
       30 TURNER          1500
       30 WARD            1250
       30 MARTIN          1250
       30 JAMES            950

posted @ 2006-11-04 19:16 joeyeezhang 阅读(258) | 评论 (0)编辑 收藏

 

计算机“端口”可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。

  本文向你讲述端口的基础常识及常用端口设置方法与技巧。

  一、端口基础   1.面向连接和无连接协议

  面向连接服务要经过三个阶段。即数据传数前,先建立连接,连接建立后再传输数据,数据传送完后,释放连接。面向连接服务,可确保数据传送的次序和传输的可靠性。

  无连接服务只有传输数据阶段。消除了除数据通信外的其他开销。只要发送实体是活跃的,无须接收实体也是活跃的。它的优点是灵活方便、迅速,特别适合于传送少量零星的报文,但无连接服务不能防止报文的丢失、重复或失序。

  区分“面向连接服务”和“无连接服务”的概念,特别简单、形象的例子是:打电话和写信。两个人如果要通电话,必须先建立连接——拨号,等待应答后才能相互传递信息,最后还要释放连接——挂电话。写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。TCP/IP协议在网络层是无连接的(数据包只管往网上发,如何传输和到达以及是否到达由网络设备来管理)。而“端口”,是传输层的内容,是面向连接的。协议里面低于1024的端口都有确切的定义,它们对应着因特网上常见的一些服务。这些常见的服务可以划分为使用TCP端口(面向连接如打电话)和使用UDP端口(无连接如写信)两种。

  网络中可以被命名和寻址的通信端口是操作系统的一种可分配资源。由网络OSI(Open System Interconnection Reference Model,开放系统互联参考模型)七层协议可知,传输层与网络层最大的区别是传输层提供进程通信能力,网络通信的最终地址不仅包括主机地址,还包括可描述进程的某种标识。所以TCP/IP协议提出的协议端口,可以认为是网络通信进程的一种标识符。

  应用程序(调入内存运行后一般称为进程)通过系统调用与某端口建立连接(binding,绑定)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写方式访问。

  类似于文件描述符,每个端口都拥有一个叫端口号的整数描述符,用来区别不同的端口。由于TCP/IP传输层的TCP和UDP两个协议是两个完全独立的软件模块,因此各自的端口号也相互独立。如TCP有一个255号端口,UDP也可以有一个255号端口,两者并不冲突。

  2.端口号的基本分配方式

  端口号有两种基本分配方式:

  (1)全局分配:这是一种集中分配方式,由一个公认权威的机构根据用户需要进行统一分配,并将结果公布于众。

  (2)本地分配:又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来。

  TCP/IP端口号的分配综合了以上两种方式,将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。每一个标准服务器都拥有一个全局公认的端口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP规定,小于256的端口才能作为保留端口。

  3.端口分类

  按端口号可分为3大类:

  (1)公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如,80端口实际上总是HTTP通讯。

  (2)注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其他目的。例如,许多系统处理动态端口从1024左右开始。

  (3)动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。

  4.端口“重定向”

  系统管理员可以“重定向”端口。

  一种常见的技术是把一个端口重定向到另一个地址。例如默认的HTTP端口是80,不少人将它重定向到另一个端口,如8080。

  实现重定向是为了隐藏公认的默认端口,降低受破坏率。这样如果有人要对一个公认的默认端口进行攻击则必须先进行端口扫描。大多数端口重定向与原端口有相似之处,例如多数HTTP端口由80变化而来,如81、88、8000、8080、8888。同样POP的端口原来在110,也常被重定向到1100。也有不少情况是选取统计上有特别意义的数,如1234、23456、34567等。许多人有其他原因选择奇怪的数,42、69、666、31337。近来,越来越多的远程控制木马采用相同的默认端口。如NetBus的默认端口是12345。Blake R. Swopes指出使用重定向端口还有一个原因,在UNIX系统上,如果你想侦听1024以下的端口需要有root权限。如果你没有root权限而又想开启Web服务,你就需要将其安装在较高的端口。此外,一些ISP的防火墙将阻挡低端口的通讯,这样的话即使你拥有整个机器你还是得重定向端口。

  二、常用端口对照详解

  下表列出TCP/UDP端口扫描在防火墙记录中的信息。

 

 

 

 

 

 

 

端口

 

 

 

 

服 务

 

 

 

 

说   明

 

 

 

0

 

Reserved

 

通常用于分析操作系统

 

 

 

 

1

 

tcpmux

 

显示有人在寻找SGI Irix计算机。默认情况下,tcpmux在Irix系统中被打开。Irix计算机在寻找是否包含有默认的无密码的账户,如,IP、GUEST

 

UUCP、NUUCP、DEMOS 、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘记删除这些账户。因此,攻击者在网络上搜索tcpmux并利用这些账户

 

 

 

 

7

 

Echo

 

搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息

 

 

 

 

19

 

Character Generator

 

一种仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。攻击者利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle

 

DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而拦载

 

 

 

 

21

 

FTP

 

FTP服务器开放该端口,用于上传、下载。攻击者用于寻找打开Anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly

 

Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口

 

 

 

 

22

 

SSH`

 

PCAnywhere建立的TCP和该端口的连接可能是为了寻找SSH。如果将该服务配置成为特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在

 

 

 

 

23

 

Telnet

 

远程登录,攻击者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到计算机所运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny

 

Telnet Server开放该端口

 

 

 

 

25

 

SMTP

 

SMTP服务器所开放的端口,用于发送邮件。攻击者寻找SMTP服务器是为了传递他们的SPAM。入侵者的账户被关闭,他们需要连接到E-mail服务器上,将简单的信息传递到不同的地址。木马Antigen、Email

 

Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放该端口

 

 

 

 

31

 

MSG Authentication

 

木马Master Paradise、Hackers Paradise开放该端口

 

 

 

 

42

 

WINS Replication

 

WINS复制

 

 

 

 

53

 

Domain Name Server(DNS)

 

DNS服务器所开放的端口,攻击者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口

 

 

 

 

67

 

Bootstrap Protocol Server

 

通过ADSL的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些计算机在向DHCP服务器请求一个地址。攻击者常进入它们,分配一个地址,把自己作为局部路由器而发起大量中间人攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址

 

 

 

 

69

 

Trival File Transfer

 

许多服务器与Bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使攻击者能从系统中窃取任何文件

 

 

 

 

79

 

Finger Server

 

攻击者用该服务获取用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描

 

 

 

 

80

 

HTTP

 

用于网页浏览。木马Executor开放该端口

 

 

 

 

88

 

-

 

Kerberos krb5。另外TCP的88端口也是这个用途

 

 

 

 

99

 

Metagram Relay

 

后门程序ncx99开放此端口

 

 

 

 

102

 

Message transfer agent(MTA)-X.400 over TCP/IP

 

消息传输代理

 

 

 

 

109

 

POP3

 

POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少有20个,这意味着攻击者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误

 

 

 

 

110

 

SUN公司的RPC服务所有端口

 

常见RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等

 

 

 

 

113

 

Authentication Service

 

是一个在许多计算机上运行的协议,用于鉴别TCP连接的用户。使用这种服务可以获得许多计算机的信息。但是它可作为服务的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。如果有客户通过防火墙访问这些服务,将会看到该端口的连接请求。如果关闭该端口,客户端会感觉到在防火墙另一边与E-mail服务器连接缓慢。许多防火墙支持TCP连接在阻断过程中发回RST。这将会停止缓慢的连接

 

 

 

 

119

 

Network News Transfer Protocol

 

NEWS新闻组传输协议。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM

 

 

 

 

135

 

Location Service

 

微软在该端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111端口的功能相似。使用DCOM和RPC的服务利用计算机上的end-point

 

mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。攻击者扫描计算机的这个端口是为了找到这个计算机上运行Exchange

Server吗?什么版本?还有些DoS攻击直接针对这个端口

 

 

 

 

137、138、139

 

NETBIOS Name Service

 

其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口则是用于获得NetBIOS/SMB服务。这个协议被用于Windows文件和打印机共享和SAMBA。还有WINS

 

Regisrtation也用它

 

 

 

 

137

 

-

 

其他协议名称查找上的SQL命名管道加密技术、其他协议名称查找上的SQL RPC加密技术、WINS NetBT名称服务和Wins

 

Proxy都用这个端口

 

 

 

 

143

 

IMAP2

 

和POP3的安全问题一样,许多IMAP服务器存在有缓冲区溢出漏洞

 

 

 

 

161

 

SNMP

 

SNMP允许远程管理设备。所有配置和运行信息储存在数据库中,通过SNMP可获得这些信息。管理员的错误配置将被暴露在Internet。攻击者将试图使用默认的密码访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络

 

 

 

 

161

 

-

 

简单网络管理协议

 

 

 

 

162

 

-

 

SNMP陷阱

 

 

 

 

177

 

X Display Manager Control Protocol

 

许多入侵者通过它访问X-windows控制台,它同时需要打开6000端口

 

 

 

 

389

 

LDAP、ILS

 

轻型目录访问协议和NetMeeting Internet Locator Server共用这一端口

 

 

 

 

443

 

Https

 

网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP

 

 

 

 

445

 

-

 

公共Internet文件系统

 

 

 

 

456

 

NULL

 

木马HACKERS PARADISE开放此端口

 

 

 

 

464

 

-

 

Kerberos kpasswd(v5)。另外TCP的464端口也是这个用途

 

 

 

 

500

 

-

 

Internet Key Exchange(IKE)(Internet密钥交换)

 

 

 

 

513

 

Login,remote login

 

是从使用ADSL登陆到子网中的UNIX计算机发出的广播。这些人为入侵者进入他们的系统提供了信息

 

 

 

 

553

 

CORBA IIOP (UDP)

 

使用ADSL或VLAN将会看到这个端口的广播。CORBA是一种面向对象的RPC系统。入侵者可以利用这些信息进入系统

 

 

 

 

555

 

DSF

 

木马PhAse1.0、Stealth Spy、IniKiller开放此端口

 

 

 

 

568

 

Membership DPA

 

成员资格DPA

 

 

 

 

569

 

Membership MSN

 

成员资格MSN

 

 

 

 

635

 

mountd

 

Linux的mountd Bug。这是扫描的一个流行BUG。大多数对这个端口的扫描是基于UDP的,但是基于TCP的mountd有所增加(mountd同时运行于两个端口)。记住mountd可运行于任何端口,只是Linux默认端口是635,就像NFS通常运行于2049端口

 

 

 

 

636

 

LDAP

 

SSL,Secure Sockets layer。安全套接层

 

 

 

 

666

 

Doom Id Software

 

木马Attack FTP、Satanz Backdoor开放此端口

 

 

 

 

993

 

IMAP

 

SSL,Secure Sockets layer。安全套接层

 

 

 

 

1001、1011

 

NULL

 

木马Silencer、WebEx开放1001端口。木马Doly Trojan开放1011端口

 

 

 

 

1024

 

Reserved

 

它是动态端口的开始,许多程序并不在乎用哪个端口连接网络,它们请求系统为它们分配下一个闲置端口。基于这一点分配从端口1024开始。这就是说第一个向系统发出请求的会分配到1024端口。你可以重启机器,打开Telnet,再打开一个窗口运行natstat

 

-a 将会看到Telnet被分配1024端口。还有SQL session也用此端口和5000端口

 

 

 

 

1080

 

SOCKS

 

这一协议以通道方式穿过防火墙,允许防火墙后的人通过一个IP地址访问Internet。理论上它应该只允许内部的通信向外到达Internet。但是由于错误的配置,它会允许位于防火墙外部的攻击穿过防火墙。WinGate常会发生这种错误,在加入IRC聊天室时常会看到这种情况

 

 

 

 

1170

 

NULL

 

木马Streaming Audio Trojan、Psyber Stream Server、Voice开放此端口

 

 

 

 

1234、1243、6711、6776

 

NULL

 

木马SubSeven2.0、Ultors Trojan开放1234、6776端口。木马SubSeven1.0/1.9开放1243、6711、6776端口

 

 

 

 

1245

 

NULL

 

木马Vodoo开放此端口

 

 

 

 

1433

 

SQL

 

SQL服务开放的端口

 

 

 

 

1492

 

stone-design-1

 

木马FTP99CMP开放此端口

 

 

 

 

1500

 

RPC client fixed port session queries

 

RPC客户固定端口会话查询

 

 

 

 

1503

 

NetMeeting T.120

 

NetMeeting T.120

 

 

 

 

1524

 

ingress

 

许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本。如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因。可以试试Telnet到用户的计算机上的这个端口,看看它是否会给你一个SHELL。连接到600/pcserver也存在这个问题

 

 

 

 

1600

 

issd

 

木马Shivka-Burka开放此端口

 

 

 

 

1645、1812

 

-

 

远程认证拨号用户服务

 

 

 

 

1646、1813

 

-

 

RADIUS记账(路由和远程访问)

 

 

 

 

1701

 

-

 

第2层隧道协议

 

 

 

 

1720

 

NetMeeting

 

NetMeeting H.233 call Setup

 

 

 

 

1731

 

NetMeeting Audio Call Control

 

NetMeeting音频调用控制

 

 

 

 

1801、3527

 

-

 

Microsoft消息队列服务器。还有TCP的135、1801、2101、2103、2105也是同样的用途

 

 

 

 

1807

 

NULL

 

木马SpySender开放此端口

 

 

 

 

1981

 

NULL

 

木马ShockRave开放此端口

 

 

 

 

1999

 

cisco identification port

 

木马BackDoor开放此端口

 

 

 

 

2000

 

NULL

 

木马GirlFriend 1.3、Millenium 1.0开放此端口

 

 

 

 

2001

 

NULL

 

木马Millenium 1.0、Trojan Cow开放此端口

 

 

 

 

2023

 

xinuexpansion 4

 

木马Pass Ripper开放此端口

 

 

 

 

2049

 

NFS

 

NFS程序常运行于这个端口。通常需要访问Portmapper查询这个服务运行于哪个端口

 

 

 

 

2115

 

NULL

 

木马Bugs开放此端口

 

 

 

 

2140、3150

 

NULL

 

木马Deep Throat 1.0/3.0开放此端口

 

 

 

 

2500

 

RPC client using a fixed port session replication

 

应用固定端口会话复制的RPC客户

 

 

 

 

2504

 

-

 

网络平衡负荷

 

 

 

 

2583

 

NULL

 

木马Wincrash 2.0开放此端口

 

 

 

 

2801

 

NULL

 

木马Phineas Phucker开放此端口

 

 

 

 

3024、4092

 

NULL

 

木马WinCrash开放此端口

 

 

 

 

3128

 

squid

 

这是squid HTTP代理服务器的默认端口。攻击者扫描这个端口是为了搜寻一个代理服务器而匿名访问Internet。也会看到搜索其他代理服务器的端口8000、8001、8080、8888。扫描这个端口的另一个原因是用户正在进入聊天室。其他用户也会检验这个端口以确定用户的机器是否支持代理

 

 

 

 

3129

 

NULL

 

木马Master Paradise开放此端口

 

 

 

 

3150

 

NULL

 

木马The Invasor开放此端口

 

 

 

 

3210、4321

 

NULL

 

木马SchoolBus开放此端口

 

 

 

 

3333

 

dec-notes

 

木马Prosiak开放此端口

 

 

 

 

3389

 

超级终端

 

Windows 2000终端开放此端口

 

 

 

 

3700

 

NULL]

 

木马Portal of Doom开放此端口

 

 

 

 

3996、4060

 

NULL

 

木马RemoteAnything开放此端口

 

 

 

 

4000

 

QQ客户端

 

腾讯QQ客户端开放此端口

 

 

 

 

4092

 

NULL

 

木马WinCrash开放此端口

 

 

 

 

4590

 

NULL

 

木马ICQTrojan开放此端口

 

 

 

 

5000、5001、5321、50505

 

NULL

 

木马blazer5开放5000端口。木马Sockets de Troie开放5000、5001、5321、50505端口

 

 

 

 

5400、5401、5402

 

NULL

 

木马Blade Runner开放此端口

 

 

 

 

5550

 

NULL

 

木马xtcp开放此端口

 

 

 

 

5569

 

NULL

 

木马Robo-Hack开放此端口

 

 

 

 

5632

 

PCAnywere

 

有时会看到很多这个端口的扫描,这依赖于用户所在的位置。当用户打开PCAnywere时,它会自动扫描局域网C类网以寻找可能的代理。攻击者也会寻找开放这种服务的计算机。所以应该查看这种扫描的源地址。一些搜寻PCAnywere的扫描包常含端口22的UDP数据包

 

 

 

 

5742

 

NULL

 

木马WinCrash1.03开放此端口

 

 

 

 

6267

 

NULL

 

木马广外女生开放此端口

 

 

 

 

6400

 

NULL

 

木马The tHing开放此端口

 

 

 

 

6670、6671

 

NULL

 

木马Deep Throat开放6670端口。而Deep Throat 3.0开放6671端口

 

 

 

 

6883

 

NULL

 

木马DeltaSource开放此端口

 

 

 

 

6969

 

NULL

 

木马Gatecrasher、Priority开放此端口

 

 

 

 

6970

 

RealAudio

 

RealAudio客户将从服务器的6970-7170的UDP端口接收音频数据流。这是由TCP-7070端口外向控制连接设置的

 

 

 

 

7000

 

NULL

 

木马Remote Grab开放此端口

 

 

 

 

7300、7301、7306、7307、7308

 

NULL

 

木马NetMonitor开放此端口。另外NetSpy1.0也开放7306端口

 

 

 

 

7323

 

NULL

 

SyGate服务器端

 

 

 

 

7626

 

NULL

 

木马Giscier开放此端口

 

 

 

 

7789

 

NULL

 

木马ICKiller开放此端口

 

 

 

 

8000

 

OICQ

 

腾讯QQ服务器端开放此端口

 

 

 

 

8010

 

WinGate

 

WinGate代理开放此端口

 

 

 

 

8080

 

代理端口

 

WWW代理开放此端口

 

 

 

 

9400、9401、9402

 

NULL

 

木马Incommand 1.0开放此端口

 

 

 

 

9872、9873、9874、9875、10067、10167

 

NULL

 

木马Portal of Doom开放此端口

 

 

 

 

9989

 

NULL

 

木马iNi-Killer开放此端口

 

 

 

 

11000

 

NULL

 

木马SennaSpy开放此端口

 

 

 

 

11223

 

NULL

 

木马Progenic trojan开放此端口

 

 

 

 

12076、61466

 

NULL

 

木马Telecommando开放此端口

 

 

 

 

12223

 

NULL

 

木马Hack'99 KeyLogger开放此端口

 

 

 

 

12345、12346

 

NULL

 

木马NetBus1.60/1.70、GabanBus开放此端口

 

 

 

 

12361

 

NULL

 

木马Whack-a-mole开放此端口

 

 

 

 

13223

 

PowWow

 

PowWow是Tribal Voice的聊天程序。它允许用户在此端口打开私人聊天的连接。该程序对于建立连接非常具有攻击性。它会常驻在TCP端口等待回应。如果一个拨号用户从另一个聊天者手中继承了IP地址就会发生好象有很多不同的人在测试这个端口的情况。这一协议使用OPNG作为其连接请求的前4个字节

 

 

 

 

16969

 

NULL

 

木马Priority开放此端口

 

 

 

 

17027

 

Conducent

 

这是一个外向连接,是由于公司内部有人安装了带有Conducent"adbot"的共享软件。Conducent"adbot"是为共享软件显示广告服务的。使用这种服务的一种流行的软件是Pkware

 

 

 

 

19191

 

NULL

 

木马蓝色火焰开放此端口

 

 

 

 

20000、20001

 

NULL

 

木马Millennium开放此端口

 

 

 

 

20034

 

NULL

 

木马NetBus Pro开放此端口

 

 

 

 

21554

 

NULL

 

木马GirlFriend开放此端口

 

 

 

 

22222

 

NULL

 

木马Prosiak开放此端口

 

 

 

 

23456

 

NULL

 

木马Evil FTP、Ugly FTP开放此端口

 

 

 

 

26274、47262

 

NULL

 

木马Delta开放此端口

 

 

 

 

27374

 

NULL

 

木马Subseven 2.1开放此端口

 

 

 

 

30100

 

NULL

 

木马NetSphere开放此端口

 

 

 

 

30303

 

NULL

 

木马Socket23开放此端口

 

 

 

 

30999

 

NULL

 

木马Kuang开放此端口

 

 

 

 

31337、31338

 

NULL

 

木马BO(Back Orifice)开放此端口。另外木马DeepBO也开放31338端口

 

 

 

 

31339

 

NULL

 

木马NetSpy DK开放此端口

 

 

 

 

31666

 

NULL

 

木马BOWhack开放此端口

 

 

 

 

33333

 

NULL

 

木马Prosiak开放此端口

 

 

 

 

34324

 

NULL

 

木马Tiny Telnet Server、BigGluck、TN开放此端口

 

 

 

 

40412

 

NULL

 

木马The Spy开放此端口

 

 

 

 

40421、40422、40423、40426

 

NULL

 

木马Masters Paradise开放此端口

 

 

 

 

43210、54321

 

NULL

 

木马SchoolBus 1.0/2.0开放此端口

 

 

 

 

44445

 

NULL

 

木马Happypig开放此端口

 

 

 

 

50766

 

NULL

 

木马Fore开放此端口

 

 

 

 

53001

 

NULL

 

木马Remote Windows Shutdown开放此端口

 

 

 

 

65000

 

NULL

 

木马Devil 1.03开放此端口


爱卖艺

posted @ 2006-11-01 10:06 joeyeezhang 阅读(336) | 评论 (0)编辑 收藏

 事务是一个非常重要的编程概念,使用事务,可以很简单地构造出可靠稳定的应用程序,本文以许多具体的例子介绍了事务服务的概念和事务服务的具体实现。
  本文共分两部分:第一部分从事务服务整体描述的角度简要介绍了事务服务产生的动机、事务服务的应用和事务服务的功能,其中以具体的例子解释了相关概念和事务服务涉及到的一些术语;第二部分以J2EE中的事务服务为例对事务的实现作简要的介绍。
第I部分 事务服务简述
 

1. 事务综述
 

事务是一个非常重要的编程概念,使用事务,可以很简单地构造出可靠稳定的应用程序,尤其对那些需要进行并发数据访问的应用程序,事务更是重要的多。事务的概念最初应用在那些用于商务操作的应用程序上,在这些应用中,事务用来保护中央数据库中的数据。随后,随着分布式计算的发展,事务在分布式计算领域中也得到了广泛的应用。现在,在分布式计算领域中,公认为事务是构造可靠性分布式应用程序的关键。

1.1事务产生的动机

1.1.1原子操作

考虑这样一个应用:用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。

可以使用异常处理来处理上述问题,代码如下:

try{  //从账户1中取款}catch(Exception e){	//如果发生错误,则终止操作	return;}try {	//如果第一步没有发生错误,则将提取出的资金存入账户2	}catch(Exception e) {//如果发生错误,则终止这步操作,并且将从账户1中取出的资金再重新存回到账户1中return ;}

上面这种解决方法从存在着下面的问题:

  • 程序拖沓冗长
  • 必须考虑到每一步中可能发生的每一个问题,并且要编写错误处理程序来考虑如何撤销所作的操作
  • 如果执行的是比简单的取款、存款操作要复杂的多的程序,那么错误处理程序将会变得难以控制。
  • 编写测试程序将会非常困难

因此,需要一种事务处理机制来保证这种原子性的操作。

1.1.2 网络故障或机器故障

为了在发生严重故障之后,能够保证系统的状态是一致的,所以需要一种恢复性的机制来保证这一点。

1.1.3 数据共享

需要一种机制来保证多用户并发访问数据的问题。

以上这些问题的解决方法,便是使用事务服务。

1.2 使用事务服务带来的好处

使用事务,便可以利用事务的四个重要属性:ACID。

  • 原子性( atomic):事务中包含的各项操作必须全部成功执行或者全部不执行。任何一项操作失败,将导致整个事务失败,其他已经执行的任务所作的数据操作都将被撤销,只有所有的操作全部成功,整个事务才算是成功完成。
  • 一致性( consistent):保证了当事务结束后,系统状态是一致的。那么什么是一致的系统状态?例如,如果银行始终遵循着"银行账号必须保持正态平衡"的原则,那么银行系统的状态就是一致的。上面的转账例子中,在取钱的过程中,账户会出现负态平衡,在事务结束之后,系统又回到一致的状态。这样,系统的状态对于客户来说,始终是一致的。
  • 隔离性( isolated):使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发执行的事务顺序执行,而不会导致系统状态不一致。
  • 持久性( durable):保证了事务完成后所作的改动都会被持久化,即使是发生灾难性的失败。可恢复性资源保存了一份事务日志,如果资源发生故障,可以通过日志来将数据重建起来。

2. 事务应用
 

事务服务支持的应用由下列实体组成:

  • 事务客户(TC,Transactional Client)
  • 事务对象(TO,Transactional Objects)
  • 可恢复对象(Recoverable Objects)
  • 提供事务支持的服务器(Transactional Servers)
  • 可恢复资源服务器(Recoverable Servers)

下图展示了一个简单的事务应用,包含了基本的事务元素:


  • 事务客户:事务客户是一个独立的程序,调用参与事务的多个事务对象。发起事务的程序被称为事务发起者(Transaction Originator)。
  • 事务对象:指那些在事务范围内行为会被影响的对象。事务对象自身包含了对持久化数据的操作或者通过事务请求间接对持久化数据进行操作。事务服务并不要求所有的事务请求都具有事务性的行为。与事务对象相对的是非事务对象。
  • 可恢复对象(Recoverable Objects)和资源对象(Resource Objects):如果事务提交和事务的回滚将影响某个对象里面的数据,那么这个对象称为一个可恢复对象。一个对象可以是事务对象而不是可恢复对象,因为事务对象可以使用其他的可恢复对象。可恢复对象必须将自己注册为事务服务中的一个资源对象,才可以参与到事务中。
  • 支持事务的服务器:例如应用服务器
  • 可恢复服务器:例如数据库

3. 事务服务提供的功能
 

事务服务提供下列操作:

  • 控制事务的范围和持续时间
  • 让多个对象参与到一个单独的原子性事务中
  • 将对象内部状态的改变同事务相联系
  • 协调事务完成

3.1事务模型

  • 平面型事务模型整个事务是一个整体,不可划分为子事务。
  • 嵌套式事务模型嵌套有子事务,子事务中还可以嵌套有子事务,整个是一个树形结构。旅行计划问题:
    • 购买从美国波士顿到美国纽约的火车票
    • 购买从美国纽约到英国伦敦的飞机票
    • 购买从英国伦敦到法国巴黎的气艇票
    • 发现没有飞往法国巴黎的气艇票
    这对于平面型事务来说,只能有一个选择:事务失败。这样由于没有飞往巴黎的气艇票,将会取消所有的出行计划。但是在这里,完全可以采用其他的旅行方式(购买火车票或者飞机票)来代替气艇。因此需要一个更加健壮的事务模型来解决这个问题。可以将整个事务划分为若干个子事务,整个事务可以重新执行单个子事务来尝试完成事务,如果最终某个单个子事务无法完成,则整个事务失败。
  • 其他事务模型
    锁链式模型、传奇式模型等。

3.2 事务的终止

通过发出提交请求或回滚请求来终止事务。通常,事务是由发起事务的客户(事务发起者)来终止的。

3.3事务的完整性

某些事务服务的实现为了保证事务的完整性,在事务服务接口的使用上施加了一些限制。这称为checked事务行为。例如,在事务的所有任务完成之前提交事务会导致数据不完整。事务服务的Checked实现会阻止事务的过早提交。其他事务服务的实现则完全依赖应用程序来提供事务的完整性保证,这称为unchecked事务行为。

3.4事务的上下文

事务上下文惟一标识了一个事务,保存了事务的当前状态。通过查询事务上下文,可以得知自身是否处于事务中,所在事务的状态以及其他一些有用的信息。

事务上下文可以作为事务操作调用的一部分隐式地传递给事务对象。事务服务也允许程序员将事务上下文作为事务请求的显示参数来传递。

4. 分布式事务
 

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。为了实现分布式事务,需要使用下面将介绍的两阶段提交协议。

  • 阶段一:开始向事务涉及到的全部资源发送提交前信息。此时,事务涉及到的资源还有最后一次机会来异常结束事务。如果任意一个资源决定异常结束事务,则整个事务取消,不会进行资源的更新。否则,事务将正常执行,除非发生灾难性的失败。为了防止会发生灾难性的失败,所有资源的更新都会写入到日志中。这些日志是永久性的,因此,这些日志会幸免遇难并且在失败之后可以重新对所有资源进行更新。
  • 阶段二:只在阶段一没有异常结束的时候才会发生。此时,所有能被定位和单独控制的资源管理器都将开始执行真正的数据更新。

在分布式事务两阶段提交协议中,有一个主事务管理器负责充当分布式事务协调器的角色。事务协调器负责整个事务并使之与网络中的其他事务管理器协同工作。


为了实现分布式事务,必须使用一种协议在分布式事务的各个参与者之间传递事务上下文信息,IIOP便是这种协议。这就要求不同开发商开发的事务参与者必须支持一种标准协议,才能实现分布式的事务。

以上从事务整体描述的角度简要介绍了事务服务产生的动机、事务服务的应用和事务服务的功能,下面以J2EE中的事务服务为例对事务的实现作简要的介绍。

 

第II部分 J2EE中的事务服务
 

简介
 

Java TM2 Platform, Enterprise Edition(J2EE)简化了分布式事务管理应用程序的编写。J2EE包括了两套规范,用来支持分布式的事务,一种是Java Transaction API(JTA),另一种是Java Transaction Service(JTS)。JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object Transaction Service(OTS) 1.1规范的Java映射。JTS使用Internet Inter-ORB Protocol(IIOP)来传播事务。作为J2EE平台实现的一部分,SUN实现了一个支持JTS的事务管理器,同时还实现了JTA。

JTA和JTS让J2EE应用服务器完成事务管理,这样就使得组件开发人员摆脱了事务管理的负担。开发者只需在部署描述符中声明事务管理属性,便可以使得EJB组件参与到事务之中,由应用服务器来负责事务的管理。

  • JTS规范定义了事务管理器的实现。JTS规范中定义的事务管理器在高层支持JTA接口规范,在底层则实现了OTS1.1(CORBA Object Transaction Service)的标准Java映射。OMG使用IDL(接口定义语言)定义了事务服务语言中性的实现,JTS则对这个IDL的事务服务实现作了标准的Java映射。JTS使用OTS接口实现了互操作和移植性。OTS接口定义了一组标准的机制,使得JTS事务管理器之间可以使用IIOP(Internet InterORB协议)来生成并传播事务上下文。
  • 从事务管理器的角度出发,事务服务的具体实现是不需要暴露出来的,只需要定义高层接口,使得事务服务的用户可以驱动事务界限、资源获取、事务同步和事务恢复过程。JTA的目的是定义事务管理器所要求的本地Java接口,从而在企业级分布计算环境中支持事务管理。下图中的小半圆代表JTA规范。


J2EE事务服务的层次关系
 

企业级Java中间件的分布式事务服务包括五层:事务管理器(Transaction Manager)、应用服务器(Application Server)、资源管理器(Resource Manager)、应用程序(Application Program)和通信资源管理器(Communication Resource Manager)。每一层都通过实现一组事务API和相关机制参与到分布式事务处理系统中。

  • 事务管理器:是一个系统级的组件,是事务服务的访问点。提供了一组服务和相关的管理机制,用于支持事务划分、事务资源管理、事务同步和事务上下文的传播。
  • 应用服务器(或者称为TP monitor)提供了支持应用程序运行环境的基础设施,这个运行环境包括了事务状态管理。应用服务器的一个例子是EJB服务器。
  • 资源管理器(通过资源适配器[Resource Adapter],资源适配器类似于数据库连接)为应用程序提供了对资源的访问。资源管理器通过实现一组事务资源接口来参与到分布式事务中。事务管理器使用这组事务资源接口在处理事务联系、事务完成和事务恢复的相关工作。资源管理器的一个例子是关系数据库服务器。
  • 基于组件的事务性应用运行在应用服务器环境中,需要依赖应用服务器通过事务属性声明设置所提供的事务管理支持。这种类型应用的典型例子是EJB。除此之外,一些独立的Java客户端程序需要使用应用服务器或事务管理器所提供的高层接口来控制事务界限。
  • 通讯资源管理器(CRM)支持事务上下文的传播和事务服务的访问请求。JTA文档中没有规定通信的要求。请参考JTS规范[2]获得有关事务管理器之间互操作的详细信息。

从事务管理器的角度出发,事务服务的具体实现是不需要暴露出来的,只需要定义高层接口,使得事务服务的用户可以驱动事务界限、资源获取、事务同步和事务恢复过程。JTA的目的是定义事务管理器所要求的本地Java接口,从而在企业级分布计算环境中支持事务管理。下图中的小半圆代表JTA规范。


JTS中规定的事务管理器的实现
 

本节从事务管理器实现者的角度描述了实现方面的要求。如下图,事务管理器必须实现JTA接口,用于支持应用服务器和资源管理器。不要求实现对JDBC 1.0 Driver和非JTA资源管理器支持。也不要求实现对各种CORBA应用实体的支持,如事务客户端(Transactional Client)、事务服务器(Transactional Server)和恢复服务器(Recoverable Server)。


Java Transaction API
 

Java Transaction API由三部分组成:高层的应用事务划分接口(供事务客户使用)、高层的事务管理器接口(供应用服务器使用)和X/Open XA协议的标准Java映射(供事务性资源管理器使用)。

4.1 UserTransaction接口

Javax.transaction.UserTransaction接口使得应用程序能够编程控制事务边界。这个接口可以由Java客户端程序或者EJB来使用。

4.1.1在EJB Server中的UserTransaction支持

EJB中对事务的管理有两种类型:

  1. Bean自管理事务对于自管理事务的EJB,需要从EJB上下文中获取UserTransaction的接口引用,由自己负责完成事务的开始、提交或者回滚。
    try {javax.transaction.UserTransaction userTran = ctx.getUserTransaction();userTran.begin();… //执行事务性的程序逻辑userTran.commit();}catch(Exception e) {	userTran.rollBack();	throw new Exception("……");}
    EJB这样处理事务称为编程型事务。
  2. 由容器负责事务管理对于这样的EJB,只需在其部署描述符中指定所需的事务相关属性,便可由EJB容器代替EJB进行事务管理。这称为声明式事务。

4.1.2 事务客户端中的UserTransaction支持

Java客户端程序需要首先通过JNDI来获得UserTransaction对象的引用,然后使用该对象的方法完成事务的开始、提交或者回滚。

java.util.Properties env = …Context ctx = new InitialContext(env);Javax.transaction.UserTransaction userTran = (javax.transaction.UserTransaction)ctx.lookup("javax.transaction.UserTransaction");userTran.commit()try {	userTran.commit();}catch(Exception e) {	userTran.rollBack();	throw new Exception("……");}

4.2 TransactionManager接口

应用服务器使用javax.transaction.TransactionManager接口来代表受控的应用程序控制事务的边界。例如,EJB容器为事务性EJB组件管理事务状态。

4.3 Transaction接口

使用Transaction接口可以执行与目标对象相关联的事务操作。

4.4 XAResource接口

Javax.transaction.xa.XAResource接口是基于X/Open CAE规范(分布式事务处理:XA规范)工业标准XA接口的Java映射。 XAResource接口定义了分布式事务处理环境(DTP)中资源管理器和事务管理器之间是如何交互的。资源管理器的资源适配器实现了XAResource接口,将事务同事务资源联系起来,类似关系数据库的一个连接。


4.5 Xid接口

Javax.transaction.xa.Xid接口是X/Open事务标识符XID结构的Java映射。这个接口由事务管理器和资源管理器来使用,对于应用程序和应用服务器而言这个接口是不可见的。

posted @ 2006-10-23 09:42 joeyeezhang 阅读(269) | 评论 (0)编辑 收藏

第14章 事务

Dale Green著

JSP WU 译

一个典型的企业应用程序在一个或多个数据库中访问和存储信息。因为这些信息对于商业操作非常重要,它必须精确、实时、可靠。如果允许多个程序同时更新相同的数据,就会破坏数据的完整性。如果在一个商业交易处理过程中,部分数据被更新后系统崩溃也将破坏数据完整性。事务通过预防以上情况的发生确保数据的完整性。事务控制多个应用程序对数据库的并发操作。如果发生系统崩溃,事务确保恢复的数据崩溃前将保持一致。

本章内容:

什么是事务

容器管理事务

事务的属性

回滚容器管理事务

同步会话bean实例变量

容器管理事务中不允许使用的方法

Bean 管理事务

JDBC事务

JTA  事务

非提交返回事务

在Bean管理事务中不允许使用的方法

企业Bean事务摘要

事务超时

隔离级别

更新多个数据库

Web 组件事务

 

一.什么是事务

模拟一个商业交易,应用程序需要完成几个步骤。例如,一个财物应用程序,可能会将资金从经常性帐户(checking account)转到储蓄性账户(saving account),该交易的伪码表示如下:

begin transaction

debit checking account

credit savings account

update history log

commit transaction

三个步骤要么全部完成,要么一个都不做。否则数据完整性将被破坏。因为事务中的所有步骤被看作一个统一的整体,所以事务一般被定义为一个不可分割的工作单元。

结束事务有两种方法:提交或者回滚。当一个事务提交,数据修改被保存。如果事务中有一个步骤失败,事务就回滚,这个事务中的已经执行的动作被撤销。例如在上面的伪码中,如果在处理第二步的时候硬盘驱动器崩溃,事务的第一步将被撤销。尽管事务失败,数据的完整性不会被破坏,因为帐目仍然保持平衡。

前面伪码中,begin和commit标明了事务的界限。当设计一个企业Bean的时候,你要决定怎样通过容器管理或bean管理事务来指定事务界限。

二.容器管理事务

在容器管理事务的企业Bean中,EJB容器来设定事务界线。你能够在任何企业Bean中使用容器管理事务:会话Bean、实体Bean或者 Message-driven Bean。容器管理事务简化了开发,因为企业Bean不用编码来显式制定事务界限。代码不包括开始结束事务的语句。典型的,容器会在一个企业Bean的方法被调用前立即开始一个事务,在这个方法退出以前提交这个事务。每个方法都关联一个事务。在一个方法中不允许嵌套或多个的事务存在。容器管理事务不需要所有的方法都关联事务。当部署一个Bean时,通过设定部署描述符中的事务属性来决定方法是否关联事务和如何关联事务。

事务的属性

一个事务的属性控制了事务的使用范围。图 14-1说明了为什么控制事务的范围很重要。图中,method-A开始一个事务然后调用Bean-2中的method-B.它运行在method-A开始的事务中还是重新执行一个新的事务?结果要看method-B中的事务属性。

图 14-1 Transaction Scope

一个事务属性可能有下面的属性之一:

☆ Required

☆ RequiresNew

☆ Mandatory

☆ NotSupported

☆ Supports

☆ Never

Required

如果客户端正在一个运行的事务中调用一个企业Bean的方法,这个方法就在这个客户端的事务中执行。如果客户端不关联一个事务,这个容器在运行该方法前开始一个新的事务。

Required属性在许多事务环境中可以很好的工作,因此你可以把它作为一个默认值,至少可以在早期开发中使用。因为事务的属性是在部署描述符中声明的,在以后的任何时候修改它们都很容易。

RequiresNew

如果客户端在一个运行的事务中调用企业Bean的方法,容器的步骤是:

1.挂起客户端的事务

2.开始一个新的事务

3.代理方法的调用

4.方法完成后重新开始客户端的事务

如果客户端不关联一个事务,容器运行这个方法以前同样开始一个新的事务。如果你想保证该方法在任何时候都在一个新事物中运行,使用RequiresNew属性。

Mandatory

如果客户端在一个运行的事务中调用企业Bean的方法,这个方法就在客户端的事务中执行。如果客户端不关联事务,容器就抛出TransactionRequiredException 异常。

如果企业Bean的方法必须使用客户端的事务,那么就使用Mandatory属性。

NotSupported

如果客户端在一个运行的事务中调用企业Bean的方法,这个容器在调用该方法以前挂起客户端事务。方法执行完后,容器重新开始客户端的事务。

如果客户端不关联事务,容器在方法运行以前不会开始一个新的事务。为不需要事务的方法使用NotSupported属性。因为事务包括整个过程,这个属性可以提高性能。

Supports

如果客户端在一个运行的事务中调用企业Bean的方法,这个方法在客户端的事务中执行,如果这个客户端不关联一个事务,容器运行该方法前也不会开始一个新的事务。因为该属性使方法的事务行为不确定,你应该谨慎使用Supports属性。

Never

如果客户端在一个运行的事务中调用企业Bean的方法,容器将抛出RemoteException异常。如果这个客户端不关联一个事务,容器运行该方法以前不会开始一个新的事务。

Summary of Transaction Attributes(事务属性概要)

表 14-1 列出了事务属性的影响。事务T1和T2都被容器控制。T1是调用企业Bean方法的客户端的事务环境。在大多数情况下,客户端是其它的企业Bean。T2是在方法执行以前容器启动的事务。在表 14-1中,“None”的意思是这个商业方法不在容器控制事务中执行。然而,该商业方法中的数据库操作可能在DBMS管理控制的事务中执行。

Setting Transaction Attributes (设定事务属性)

因为事务属性被保存在配置描述符中,他们会在J2EE应用程序开发的几个阶段被改变:创建企业Bean,应用程序装配和部署。然而, 当创建这个Bean的时候指定它的属性是企业Bean开发者的责任。只有将该组件装配到一个更大的应用程序时可以由开发者修改该属性,而不要期待J2EE应用程序部署者来指定该事务属性。

表 14-1 事物属性和范围 

事务属性

客户端事务

商业方法事务

Required

None

T2

T1

T1

RequiresNew

None

T2

T1

T2

Mandatory

None

error

T1

T1

NotSupported

None

None

T1

None

Supports

None

None

T1

T1

Never

None

None

T1

Error

你可以为整个企业Bean或者单个方法指定事务属性。如果你为整个企业Bean和它某个方法各指定一个事务属性,为该方法指定的事务属性优先。当为单个方法指定事务属性时,不同类型企业Bean的要求也不同。会话Bean需要为商业方法定义属性属性,但create方法不需要定义事务属性。实体Bean需要为商业方法、create方法、remove方法和查找(finder)方法定义事务属性。Message-driven Bean需要为onMessage方法指定属性事务,而且只能是Required和NotSupported其中之一。

容器管理事务的回滚

  在以下两中情况下,事务将回滚。第一,如果产生一个系统异常,容器将自动回滚该事务。第二,通过调用EJBContext接口SetRollbackOnly方法,Bean方法通知容器回滚该事务。如果Bean抛出一个应用异常,事务将不会自动回滚,但可以调用SetRollbackOnly回滚。对于一个系统和应用的异常,参考第5章的处理异常一节。

下面这个例子的代码在j2eetorial/examples/src/bank目录下。在命令行窗口下进入j2eetutorial/examples目录执行ant bank命令编译这些代码,执行 ant create-bank-table命令创建要用到的表。一个BankApp.ear样本文件在j2eetutorial/examples/ears目录下。通过BnankEJB 实例的transferToSaving方法来说明setRollbackOnly方法的用法。如果余额检查出现负数,那么transferToSaving调用setRollBackOnly回滚事务并抛出一个应用程序异常(InsufficientBalanceException)。updateChecking和updateSaving 方法更新数据表。如果更新失败,这两个方法抛出SQLException异常而transgerToSaving方法抛出EJBException异常。因为EJBException是一个系统异常,它使容器事务自动回滚事务。TransferTuSaving 方法的代码如下:

public void transferToSaving(double amount) throws

   InsufficientBalanceException  {

  checkingBalance -= amount;

   savingBalance += amount;

  try {

      updateChecking(checkingBalance);

      if (checkingBalance < 0.00) {

         context.setRollbackOnly();

         throw new InsufficientBalanceException();

      }

      updateSaving(savingBalance);

   } catch (SQLException ex) {

       throw new EJBException

          ("Transaction failed due to SQLException: "

          + ex.getMessage());

   }

}

当一个容器回滚一个事务,它总是会撤消事务中已执行的SQL语句造成的数据改动。然而,仅仅在实体Bean中容器回滚才会改变Bean的实例变量(与数据库状态有关的字段)。(这是因为容器会自动调用实体Bean的ejbLoad方法,该方法从数据库中读入实例变量的值。)当发生回滚,会话Bean必须显式重新设置所有被事务改动过的实例变量。重设会话Bean的实例变量最简单的方法是实现SessionSynchronization接口。

同步会话Bean的实例变量

SessionSynchronization接口是可选的,它允许你在Bean的实例变量和它们在数据库中的相应值之间保持同步。容器会在事务的几个主要阶段调用SessionSynchronization接口的对应方法—afterBegin、beforeCompletion和afterCompletion。

AfterBegin方法通知Bean实例一个新的事务已经开始。容器在调用商业方法以前立即调用afterBegin方法。afterBegin方法是从数据库中读入实例变量值的最佳位置。例如,在BanBean类中,在afterBegin方法中从读入了CheckingBalance和savingBalance变量的值:

  public void afterBegin() {

  System.out.println("afterBegin()");

   try {

      checkingBalance = selectChecking();

      savingBalance = selectSaving();

   } catch (SQLException ex) {

       throw new EJBException("afterBegin Exception: " +

           ex.getMessage());

   }

}

商业方法方法完成以后,容器调用beforeCompletion方法,不过仅仅是在事务提交以前。BeforeCompletion方法是会话Bean回滚事务的最后时机(通过调用setRollbackOnly方法).如果会话Bean还没有实例变量的值更新数据库,就在beforCompletion方法里实现。

afterCompletion方法指出事务已经完成。它只有一个布尔型的参数,true表示事务被正确提交false表示事务回滚。如果事务回滚,会话Bean可以在该方法中从数据库中重新读取它的实例变量值:

public void afterCompletion(boolean committed) {

  System.out.println("afterCompletion: " + committed);

   if (committed == false) {

      try {

         checkingBalance = selectChecking();

         savingBalance = selectSaving();

      } catch (SQLException ex) {

          throw new EJBException("afterCompletion SQLException:

         " + ex.getMessage());

      }

   }

}

容器管理事务中不允许使用的方法

你不应该调用可能干扰容器设置的事务界线的方法,下面列出了所有禁止的方法:

☆ java.sql.Connection接口的commit、setAutoCommit和rollback方法

☆ javax.ejb.EJBContext 接口的getUserTransaction方法

☆ javax.transaction.UserTransaction接口的所有方法

然而你可以在Bean管理事务中使用这些方法设置事务界限。

三.Bean管理事务

在一个Bean管理事务中,会话Bean或者Message-driven Bean是用代码显式设置事务界线的。实体Bean不能使用Bean管理事务,只能使用容器管理的事务。虽然容器管理事务Bean需要较少的代码,但它也有一个局限:方法执行时,它只能关联一个事务或不关联任何事务。如果这个局限使你Bean编码困难,你应该考虑使用Bean管理事务。(译者:实际上J2EE服务器不支持嵌套事物,那么Bean管理事务唯一的优点就是可以在一个方法中一次启动多个事务)

下面的伪码很好说明了Bean管理事对商业逻辑的紧密控制。通过检查各种条件,伪码决定是否在商业方法中启动或停止不同的事务。

begin transaction

...

update table-a

...

if (condition-x)

   commit transaction

else if (condition-y)

   update table-b

   commit transaction

else

   rollback transaction

   begin transaction

   update table-c

   commit transaction

当为会话Bean或Message-driver Bean的Bean管理事务编码时,你必须决定是使用jdbc或者JTA事务。下面的内容论述了两种事务类型。

JDBC 事务

JDBC事务通过DBMS事务管理器来控制。你可能会为了使用会话Bean中的原有代码而采用JDBC事务将这些代码封装到一个事务中。使用JDBC事务,要调用java.sql.Connection接口的commit和rollback方法。事务启动是隐式的。一个事务的从最近的提交、回滚或连接操作后的第一个SQL的语句开始。(这个规则通常是正确的,但可能DBMS厂商的不同而不同)

代码资源

下面的例子在j2eetutorial/examples/src/ejb/warehouse目录下。在命令行窗口中进入j2eetutorial/examples目录执行ant bank命令编译这些源文件,执行ant create-warehouse-table命令创建要用到的表,一个样本WarehouseApp.ear文件在j2eetutorial/example/ears 目录下。

下面的代码来自WarehouseEJB例子,一个会话Bean通过使用Connection接口的方法来划定Bean管理事务界限。ship方法以调用名为con的连接对象的setAutoCommit方法开始,该方法通知DBMS不要自动提交每个SQL语句。接下来ship 方法更新order_item和inventory数据表。如果更新成功,这个事务就会被提交。如果出现异常,事务就回滚。

public void ship (String productId, String orderId, int

quantity) {

  try {

      con.setAutoCommit(false);

      updateOrderItem(productId, orderId);

      updateInventory(productId, quantity);

      con.commit();

   } catch (Exception ex) {

       try {

          con.rollback();

          throw new EJBException("Transaction failed: " +

             ex.getMessage());

       } catch (SQLException sqx) {

           throw new EJBException("Rollback failed: " +

              sqx.getMessage());

       }

   }

}

JTA 事务

JTA是Java Transaction API 的缩写。这些API 允许你用独立于具体的事务管理器实现的方法确定事务界限。J2EE SDK 事务管理器通过Java事务服务(Java Transaction Service, JTS)实现。但是你的代码并不直接调用JTS中的方法,而是调用JTA方法来替代,JTA方法会调用底层的JTS实现。

JTA事务被J2EE 事务管理器管理。你可能需要使用一个JTA事务,因为它能够统一操作不同厂商的数据库。一个特定DBMS的事务管理器不能工作在不同种类的数据库上。然而J2EE事务管理器仍然有一个限制——它不支持嵌套事务。就是说,它不能在前一个事务结束前启动另一个事务。

下面例子的源代码在j2eetutorial/examples/src/ejb/teller目录下,在命令行窗口进入j2eetutorial/examples目录,执行ant teller命令编译这些源文件,执行ant create-bank-teller命令创建要用到的表。一个样本TellerApp.ear文件在j2eetutorial/examples/ears目录下。

要自己确定事务界限,可以调用javax.transaction.UserTransaction接口的begin、commit和rollback方法来确定事务界限(该接口只能在SessionBean中使用,实体Bean不允许使用用户自定义的)。下面选自TellerBean类的代码示范了UserTransaction的用法。begin和commit方法确定了数据库操作的事务界限,如果操作失败则调用rollback回滚事务并抛出EJBException异常。

public void withdrawCash(double amount) {

  UserTransaction ut = context.getUserTransaction();

  try {

      ut.begin();

      updateChecking(amount);

      machineBalance -= amount;

      insertMachine(machineBalance);

      ut.commit();

   } catch (Exception ex) {

       try {

          ut.rollback();

       } catch (SystemException syex) {

           throw new EJBException

              ("Rollback failed: " + syex.getMessage());

       }

       throw new EJBException

          ("Transaction failed: " + ex.getMessage());

    }

}

非提交返回事务

使用Bean管理事务的无状态会话Bean在事务返回前必须提交或者返回事务,而有状态的会话Bean没有这个限制。

对于使用JTA事务的有状态会话Bean,Bean实例和事务的关联越过大量用户调用被保持,甚至被调用的每个商业方法都打开和关闭数据库连接,该市无关联也不断开,直到事务完成(或回滚)。

对于使用JDBC事务的有状态会话Bean,JDBC连接越过用户调用保持Bean和事务之间的关联。连接关闭,事务关联将被释放。

在Bean管理事务中不允许使用的方法

在Bean管理的事务中不能调用EJBContext接口的getRollbackOnly和setRollbackOnly方法,这两个方法只能在容器管理事务中被调用。在Bean管理事务中,应调用UserTransaction接口的getStatus和rollback方法。

四.企业Bean事务摘要

如果你不能确定怎么在企业Bean中使用事务,可以用这个小技巧:在Bean的部署描述符中,制定事务类型为容器管理,把整个Bean(所有方法)的事务属性设置为Required。大多数情况下,这个配置可以满足你的事务需求。

表14-2列出了不同类型的企业Bean所允许使用的事务类型。实体Bean只能使用容器管理事务,但可以在部署描述符中配置事务属性,并可以调用EJBContext接口的setRollbackOnly方法来回滚事务。

表 14-2 企业Bean 允许的事务类型

企业Bean 类型

容器管理事务

Bean管理事务

 

JTA

JDBC

 

实体Bean

Y

N

N

 

会话Bean

Y

Y

Y

 

Message-driven

Y

Y

Y

 

会话Bean既可以使用容器管理事务也可以使用Bean管理事务。Bean管理事务又有两种类型:JDBC事务和JTA事务。JDBC事务使用Connection接口的commit和rollback方法来划分事务界限。JTA事务使用UserTransaction接口的begin、commit和rollback方法来划分事务界限。

在Bean管理事务的会话Bean中,混合使用JTA事务和JDBC事务是可能的。但是我不推荐这样使用,因为这样会造成代码的调试和维护都很困难。

Message-driver Bean和会话Bean一样既可以使用容器管理事务也可以使用Bean管理事务。

五.事务超时

对于容器管理事务,事务超时间隔是通过设置default.properties文件中ransaction.timeout属性的值来确定的,该文件在J2EE SDK安装目录的config子目录下。如下例将事务超时间隔设置为5秒钟:

transaction.timeout=5

这样,当事务在5秒钟内还没有完成,容器将回滚该事务。

J2EE SDK安装后,超时间隔的缺省值为0,表示不计算超时,无论事务执行多长时间,除非异常出错回滚,一直等待事务完成。

只有使用容器管理事务的企业Bean才会受到transaction.timeout属性值的影响。Bean管理的JTA事务使用UserTransaction接口的setTransactionTimeout方法来设置事务超时间隔。

六.隔离级别

事务不仅保证事务界限内的数据库操作全部完成(或回滚)同时还隔离数据库更新语句。隔离级别描述被修改的数据对其他事物的可见度。

假如一个应用程序在事务中修改一个顾客的电话号码,在事务结束前另一个应用程序要读取该条记录的电话号码。那么第二个应用程序是读取修改过但还没提交的数据,还是读取未修改前的老数据呢?答案就取决于事务的隔离级别。如果事务允许其他程序读取未提交的数据,会因为不用等待事务结束而提高性能,同时也有一个缺点,如果事务回滚,其他应用程序读取的将是错误的数据。

容器管理持久性(CMP)的实体Bean的事务级别无法修改,它们使用DBMS的默认个理解别,通常是READ_COMMITTED。

Bean管理持久性(BMP)的实体Bean和两种会话Bean都可以通过在程序中调用底层DBMS提供的API来设置事务级别。例如,一个DBMS可能允许你如下调用setTransactionIsolation方法将隔离级别设置成可读取未提交数据:

Connection con;

...

con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);

不要在事务执行期间更改隔离级别,通常隔离级别的更改会引起DBMS产生一次隐式提交。因为隔离级别的控制会跟具体的DBMS厂商不同而不同,具体的信息请参考DBMS的文档。J2EE平台规范不包括隔离级别标准。

七.更新多个数据库

J2EE事务管理器控制着除了Bean管理的JDBC事务以外的所有企业Bean事务,它允许企业Bean在同一个事务中更新多个数据库。下面示范在单个事务中更新多个数据库的两个应用。

图14-2中,客户端调用Bean-A的商业方法,商业方法启动一个事务,更新数据库X和Y,Bean-A的商业方法有调用Bean-B的商业方法,Bean-B的商业方法更新数据库Z然后返回事务的控制权给Bean-A的商业方法,由Bean-A提交该事务。三个数据库的更新都在同一个事务中发生。

图 14-2 更新多个数据库

图14-3中,客户端调用Bean-A的商业方法,该商业方法启动一个事务并更新数据库X,然后调用另一个J2EE服务器中的Bean-B的方法,该方法更新数据库Y。J2EE服务器保证两个数据库的更新都在同一个事务中进行(笔者认为应该是第一个J2EE服务器的事务管理器管理整个事物)。

图 14-3 跨越J2EE服务器更新多个数据库

八.Web 组件事务

Web组件中划分事务界限可以使用java.sql.Connection接口和javax.transaction.UserTransaction接口中的任意一个。跟Bean管理事务的会话Bean使用一样的两个接口。这两个接口的使用方法参考前面几节的内容。Web组件事务的例子在第10章Servlet技术第四节共享信息的访问数据库小节讲述过。

posted @ 2006-10-20 16:39 joeyeezhang 阅读(314) | 评论 (0)编辑 收藏

TCP:传输控制协议 SOAP:简单对象访问协议 XML:The Extensible Markup Language(可扩展标识语言) HTML:超文本标记语言(HypertextMarkupLanguage) JNDI:Java Naming and Directory Interface LDAP:Lightweight Directory Access Protocol 轻型目录访问协议 JMS:Java Messaging Service Java消息服务 ODBC:Open Database Connectivity JDBC:Java版本的ODBC
LDAP:Lightweight Directory Access Protocol (version 3)轻量级目录访问协议
posted @ 2006-10-07 09:39 joeyeezhang 阅读(291) | 评论 (0)编辑 收藏

mime大全
<mime-mapping>
        <extension>abs</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ai</extension>
        <mime-type>application/postscript</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>aif</extension>
        <mime-type>audio/x-aiff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>aifc</extension>
        <mime-type>audio/x-aiff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>aiff</extension>
        <mime-type>audio/x-aiff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>aim</extension>
        <mime-type>application/x-aim</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>art</extension>
        <mime-type>image/x-jg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>asf</extension>
        <mime-type>video/x-ms-asf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>asx</extension>
        <mime-type>video/x-ms-asf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>au</extension>
        <mime-type>audio/basic</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>avi</extension>
        <mime-type>video/x-msvideo</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>avx</extension>
        <mime-type>video/x-rad-screenplay</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>bcpio</extension>
        <mime-type>application/x-bcpio</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>bin</extension>
        <mime-type>application/octet-stream</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>bmp</extension>
        <mime-type>image/bmp</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>body</extension>
        <mime-type>text/html</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>cdf</extension>
        <mime-type>application/x-cdf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>cer</extension>
        <mime-type>application/x-x509-ca-cert</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>class</extension>
        <mime-type>application/java</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>cpio</extension>
        <mime-type>application/x-cpio</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>csh</extension>
        <mime-type>application/x-csh</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>css</extension>
        <mime-type>text/css</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>dib</extension>
        <mime-type>image/bmp</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>doc</extension>
        <mime-type>application/msword</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>dtd</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>dv</extension>
        <mime-type>video/x-dv</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>dvi</extension>
        <mime-type>application/x-dvi</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>eps</extension>
        <mime-type>application/postscript</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>etx</extension>
        <mime-type>text/x-setext</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>exe</extension>
        <mime-type>application/octet-stream</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>gif</extension>
        <mime-type>image/gif</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>gtar</extension>
        <mime-type>application/x-gtar</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>gz</extension>
        <mime-type>application/x-gzip</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>hdf</extension>
        <mime-type>application/x-hdf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>hqx</extension>
        <mime-type>application/mac-binhex40</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>htc</extension>
        <mime-type>text/x-component</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>htm</extension>
        <mime-type>text/html</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>html</extension>
        <mime-type>text/html</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>hqx</extension>
        <mime-type>application/mac-binhex40</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ief</extension>
        <mime-type>image/ief</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jad</extension>
        <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jar</extension>
        <mime-type>application/java-archive</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>java</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jnlp</extension>
        <mime-type>application/x-java-jnlp-file</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jpe</extension>
        <mime-type>image/jpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jpeg</extension>
        <mime-type>image/jpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jpg</extension>
        <mime-type>image/jpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>js</extension>
        <mime-type>text/javascript</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jsf</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jspf</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>kar</extension>
        <mime-type>audio/x-midi</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>latex</extension>
        <mime-type>application/x-latex</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>m3u</extension>
        <mime-type>audio/x-mpegurl</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mac</extension>
        <mime-type>image/x-macpaint</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>man</extension>
        <mime-type>application/x-troff-man</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>me</extension>
        <mime-type>application/x-troff-me</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mid</extension>
        <mime-type>audio/x-midi</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>midi</extension>
        <mime-type>audio/x-midi</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mif</extension>
        <mime-type>application/x-mif</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mov</extension>
        <mime-type>video/quicktime</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>movie</extension>
        <mime-type>video/x-sgi-movie</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mp1</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mp2</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mp3</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpa</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpe</extension>
        <mime-type>video/mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpeg</extension>
        <mime-type>video/mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpega</extension>
        <mime-type>audio/x-mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpg</extension>
        <mime-type>video/mpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>mpv2</extension>
        <mime-type>video/mpeg2</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ms</extension>
        <mime-type>application/x-wais-source</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>nc</extension>
        <mime-type>application/x-netcdf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>oda</extension>
        <mime-type>application/oda</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pbm</extension>
        <mime-type>image/x-portable-bitmap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pct</extension>
        <mime-type>image/pict</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pdf</extension>
        <mime-type>application/pdf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pgm</extension>
        <mime-type>image/x-portable-graymap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pic</extension>
        <mime-type>image/pict</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pict</extension>
        <mime-type>image/pict</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pls</extension>
        <mime-type>audio/x-scpls</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>png</extension>
        <mime-type>image/png</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pnm</extension>
        <mime-type>image/x-portable-anymap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>pnt</extension>
        <mime-type>image/x-macpaint</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ppm</extension>
        <mime-type>image/x-portable-pixmap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ppt</extension>
        <mime-type>application/powerpoint</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ps</extension>
        <mime-type>application/postscript</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>psd</extension>
        <mime-type>image/x-photoshop</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>qt</extension>
        <mime-type>video/quicktime</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>qti</extension>
        <mime-type>image/x-quicktime</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>qtif</extension>
        <mime-type>image/x-quicktime</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ras</extension>
        <mime-type>image/x-cmu-raster</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>rgb</extension>
        <mime-type>image/x-rgb</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>rm</extension>
        <mime-type>application/vnd.rn-realmedia</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>roff</extension>
        <mime-type>application/x-troff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>rtf</extension>
        <mime-type>application/rtf</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>rtx</extension>
        <mime-type>text/richtext</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>sh</extension>
        <mime-type>application/x-sh</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>shar</extension>
        <mime-type>application/x-shar</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>smf</extension>
        <mime-type>audio/x-midi</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>sit</extension>
        <mime-type>application/x-stuffit</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>snd</extension>
        <mime-type>audio/basic</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>src</extension>
        <mime-type>application/x-wais-source</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>sv4cpio</extension>
        <mime-type>application/x-sv4cpio</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>sv4crc</extension>
        <mime-type>application/x-sv4crc</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>swf</extension>
        <mime-type>application/x-shockwave-flash</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>t</extension>
        <mime-type>application/x-troff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tar</extension>
        <mime-type>application/x-tar</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tcl</extension>
        <mime-type>application/x-tcl</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tex</extension>
        <mime-type>application/x-tex</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>texi</extension>
        <mime-type>application/x-texinfo</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>texinfo</extension>
        <mime-type>application/x-texinfo</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tif</extension>
        <mime-type>image/tiff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tiff</extension>
        <mime-type>image/tiff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tr</extension>
        <mime-type>application/x-troff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>tsv</extension>
        <mime-type>text/tab-separated-values</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>txt</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ulw</extension>
        <mime-type>audio/basic</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>ustar</extension>
        <mime-type>application/x-ustar</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xbm</extension>
        <mime-type>image/x-xbitmap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xht</extension>
        <mime-type>application/xhtml+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xhtml</extension>
        <mime-type>application/xhtml+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xml</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xpm</extension>
        <mime-type>image/x-xpixmap</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xsl</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xwd</extension>
        <mime-type>image/x-xwindowdump</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wav</extension>
        <mime-type>audio/x-wav</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svgz</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>vsd</extension>
        <mime-type>application/x-visio</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wbmp</extension>
        <mime-type>image/vnd.wap.wbmp</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wml</extension>
        <mime-type>text/vnd.wap.wml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wmlc</extension>
        <mime-type>application/vnd.wap.wmlc</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wmls</extension>
        <mime-type>text/vnd.wap.wmlscript</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wmlscriptc</extension>
        <mime-type>application/vnd.wap.wmlscriptc</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>wrl</extension>
        <mime-type>x-world/x-vrml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>Z</extension>
        <mime-type>application/x-compress</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>z</extension>
        <mime-type>application/x-compress</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>zip</extension>
        <mime-type>application/zip</mime-type>
    </mime-mapping>
posted @ 2006-09-12 11:35 joeyeezhang 阅读(476) | 评论 (0)编辑 收藏

JavaScript就这么回事1:基础知识

1 创建脚本块

1: <script language=”JavaScript”>
2: JavaScript code goes here
3: </script>

 

2 隐藏脚本代码

1: <script language=”JavaScript”>
2: <!--
3: document.write(“Hello”);
4: // -->
5: </script>


在不支持JavaScript的浏览器中将不执行相关代码

3 浏览器不支持的时候显示

1: <noscript>
2: Hello to the non-JavaScript browser.
3: </noscript>

 

4 链接外部脚本文件

1: <script language=”JavaScript” src="/”filename.js"”></script>


5 注释脚本

1: // This is a comment
2: document.write(“Hello”); // This is a comment
3: /*
4: All of this
5: is a comment
6: */

 

6 输出到浏览器

1: document.write(“<strong>Hello</strong>”);

 

7 定义变量

1: var myVariable = “some value”;

 

8 字符串相加

1: var myString = “String1” + “String2”;

 

9 字符串搜索

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: var therePlace = myVariable.search(“there”);
5: document.write(therePlace);
6: // -->
7: </script>

 

10 字符串替换

1: thisVar.replace(“Monday”,”Friday”);


11 格式化字串

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: document.write(myVariable.big() + “<br>”);
5: document.write(myVariable.blink() + “<br>”);
6: document.write(myVariable.bold() + “<br>”);
7: document.write(myVariable.fixed() + “<br>”);
8: document.write(myVariable.fontcolor(“red”) + “<br>”);
9: document.write(myVariable.fontsize(“18pt”) + “<br>”);
10: document.write(myVariable.italics() + “<br>”);
11: document.write(myVariable.small() + “<br>”);
12: document.write(myVariable.strike() + “<br>”);
13: document.write(myVariable.sub() + “<br>”);
14: document.write(myVariable.sup() + “<br>”);
15: document.write(myVariable.toLowerCase() + “<br>”);
16: document.write(myVariable.toUpperCase() + “<br>”);
17:
18: var firstString = “My String”;
19: var finalString = firstString.bold().toLowerCase().fontcolor(“red”);
20: // -->
21: </script>

 

12 创建数组

1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “First Entry”;
5: myArray[1] = “Second Entry”;
6: myArray[2] = “Third Entry”;
7: myArray[3] = “Fourth Entry”;
8: myArray[4] = “Fifth Entry”;
9: var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);
10: // -->
11: </script>

 

13 数组排序

1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “z”;
5: myArray[1] = “c”;
6: myArray[2] = “d”;
7: myArray[3] = “a”;
8: myArray[4] = “q”;
9: document.write(myArray.sort());
10: // -->
11: </script>

 

14 分割字符串

1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “a,b,c,d”;
4: var stringArray = myVariable.split(“,”);
5: document.write(stringArray[0]);
6: document.write(stringArray[1]);
7: document.write(stringArray[2]);
8: document.write(stringArray[3]);
9: // -->
10: </script>

 

15 弹出警告信息

1: <script language=”JavaScript”>
2: <!--
3: window.alert(“Hello”);
4: // -->
5: </script>

 

16 弹出确认框

1: <script language=”JavaScript”>
2: <!--
3: var result = window.confirm(“Click OK to continue”);
4: // -->
5: </script>

 

17 定义函数

1: <script language=”JavaScript”>
2: <!--
3: function multiple(number1,number2) {
4: var result = number1 * number2;
5: return result;
6: }
7: // -->
8: </script>

 

18 调用JS函数

1: <a href=”#” onClick=”functionName()”>Link text</a>
2: <a href="/”javascript:functionName"()”>Link text</a>

 

19 在页面加载完成后执行函数

1: <body onLoad=”functionName();”>
2: Body of the page
3: </body>


20 条件判断

1: <script>
2: <!--
3: var userChoice = window.confirm(“Choose OK or Cancel”);
4: var result = (userChoice == true) ? “OK” : “Cancel”;
5: document.write(result);
6: // -->
7: </script>

 

21 指定次数循环

1: <script>
2: <!--
3: var myArray = new Array(3);
4: myArray[0] = “Item 0”;
5: myArray[1] = “Item 1”;
6: myArray[2] = “Item 2”;
7: for (i = 0; i < myArray.length; i++) {
8: document.write(myArray[i] + “<br>”);
9: }
10: // -->
11: </script>

 

22 设定将来执行

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: window.setTimeout(“hello()”,5000);
7: // -->
8: </script>

 

23 定时执行函数

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: window.setTimeout(“hello()”,5000);
6: }
7: window.setTimeout(“hello()”,5000);
8: // -->
9: </script>

 

24 取消定时执行

1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: var myTimeout = window.setTimeout(“hello()”,5000);
7: window.clearTimeout(myTimeout);
8: // -->
9: </script>

 

25 在页面卸载时候执行函数

1: <body onUnload=”functionName();”>
2: Body of the page
3: </body>

JavaScript就这么回事2:浏览器输出


26 访问document对象

1: <script language=”JavaScript”>
2: var myURL = document.URL;
3: window.alert(myURL);
4: </script>

 

27 动态输出HTML

1: <script language=”JavaScript”>
2: document.write(“<p>Here’s some information about this document:</p>”);
3: document.write(“<ul>”);
4: document.write(“<li>Referring Document: “ + document.referrer + “</li>”);
5: document.write(“<li>Domain: “ + document.domain + “</li>”);
6: document.write(“<li>URL: “ + document.URL + “</li>”);
7: document.write(“</ul>”);
8: </script>


28 输出换行

1: document.writeln(“<strong>a</strong>”);
2: document.writeln(“b”);

 

29 输出日期

1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: document.write(thisDate.toString());
4: </script>

 

30 指定日期的时区

1: <script language=”JavaScript”>
2: var myOffset = -2;
3: var currentDate = new Date();
4: var userOffset = currentDate.getTimezoneOffset()/60;
5: var timeZoneDifference = userOffset - myOffset;
6: currentDate.setHours(currentDate.getHours() + timeZoneDifference);
7: document.write(“The time and date in Central Europe is: “ + currentDate.toLocaleString());
8: </script>


31 设置日期输出格式

1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: var thisTimeString = thisDate.getHours() + “:” + thisDate.getMinutes();
4: var thisDateString = thisDate.getFullYear() + “/” + thisDate.getMonth() + “/” + thisDate.getDate();
5: document.write(thisTimeString + “ on “ + thisDateString);
6: </script>


32 读取URL参数

1: <script language=”JavaScript”>
2: var urlParts = document.URL.split(“?”);
3: var parameterParts = urlParts[1].split(“&”);
4: for (i = 0; i < parameterParts.length; i++) {
5: var pairParts = parameterParts[i].split(“=”);
6: var pairName = pairParts[0];
7: var pairValue = pairParts[1];
8: document.write(pairName + “ :“ +pairValue );
9: }
10: </script>

你还以为HTML是无状态的么?

33 打开一个新的document对象

1: <script language=”JavaScript”>
2: function newDocument() {
3: document.open();
4: document.write(“<p>This is a New Document.</p>”);
5: document.close();
6: }
7: </script>

 

34 页面跳转

1: <script language=”JavaScript”>
2: window.location = “http://www.liu21st.com/”;
3: </script>

 

35 添加网页加载进度窗口

1: <html>
2: <head>
3: <script language='javaScript'>
4: var placeHolder = window.open('holder.html','placeholder','width=200,height=200');
5: </script>
6: <title>The Main Page</title>
7: </head>
8: <body onLoad='placeHolder.close()'>
9: <p>This is the main page</p>
10: </body>
11: </html>

 

JavaScript就这么回事3:图像

 

36 读取图像属性

1: <img src="/”image1.jpg"” name=”myImage”>
2: <a href=”# ” onClick=”window.alert(document.myImage.width)”>Width</a>
3:


37 动态加载图像

1: <script language=”JavaScript”>
2: myImage = new Image;
3: myImage.src = “Tellers1.jpg”;
4: </script>


38 简单的图像替换

1: <script language=”JavaScript”>
2: rollImage = new Image;
3: rollImage.src = “rollImage1.jpg”;
4: defaultImage = new Image;
5: defaultImage.src = “image1.jpg”;
6: </script>
7: <a href="/”myUrl"” onMouseOver=”document.myImage.src = rollImage.src;”
8: onMouseOut=”document.myImage.src = defaultImage.src;”>
9: <img src="/”image1.jpg"” name=”myImage” width=100 height=100 border=0>


39 随机显示图像

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var imageChoice = Math.floor(Math.random() * imageList.length);
8: document.write(‘<img src=”’ + imageList[imageChoice] + ‘“>’);
9: </script>


40 函数实现的图像替换

1: <script language=”JavaScript”>
2: var source = 0;
3: var replacement = 1;
4: function createRollOver(originalImage,replacementImage) {
5: var imageArray = new Array;
6: imageArray[source] = new Image;
7: imageArray[source].src = originalImage;
8: imageArray[replacement] = new Image;
9: imageArray[replacement].src = replacementImage;
10: return imageArray;
11: }
12: var rollImage1 = createRollOver(“image1.jpg”,”rollImage1.jpg”);
13: </script>
14: <a href=”#” onMouseOver=”document.myImage1.src = rollImage1[replacement].src;”
15: onMouseOut=”document.myImage1.src = rollImage1[source].src;”>
16: <img src="/”image1.jpg"” width=100 name=”myImage1” border=0>
17: </a>


41 创建幻灯片

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = new Image;
4: imageList[0].src = “image1.jpg”;
5: imageList[1] = new Image;
6: imageList[1].src = “image2.jpg”;
7: imageList[2] = new Image;
8: imageList[2].src = “image3.jpg”;
9: imageList[3] = new Image;
10: imageList[3].src = “image4.jpg”;
11: function slideShow(imageNumber) {
12: document.slideShow.src = imageList[imageNumber].src;
13: imageNumber += 1;
14: if (imageNumber < imageList.length) {
15: window.setTimeout(“slideShow(“ + imageNumber + “)”,3000);
16: }
17: }
18: </script>
19: </head>
20: <body onLoad=”slideShow(0)”>
21: <img src="/”image1.jpg"” width=100 name=”slideShow”>


42 随机广告图片

1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var urlList = new Array;
8: urlList[0] = “http://some.host/”;
9: urlList[1] = “http://another.host/”;
10: urlList[2] = “http://somewhere.else/”;
11: urlList[3] = “http://right.here/”;
12: var imageChoice = Math.floor(Math.random() * imageList.length);
13: document.write(‘<a href=”’ + urlList[imageChoice] + ‘“><img src=”’ + imageList[imageChoice] + ‘“></a>’);
14: </script>

JavaScript就这么回事4:表单


还是先继续写完JS就这么回事系列吧~
43 表单构成

1: <form method=”post” action=”target.html” name=”thisForm”>
2: <input type=”text” name=”myText”>
3: <select name=”mySelect”>
4: <option value=”1”>First Choice</option>
5: <option value=”2”>Second Choice</option>
6: </select>
7: <br>
8: <input type=”submit” value=”Submit Me”>
9: </form>


44 访问表单中的文本框内容

1: <form name=”myForm”>
2: <input type=”text” name=”myText”>
3: </form>
4: <a href='#' onClick='window.alert(document.myForm.myText.value);'>Check Text Field</a>


45 动态复制文本框内容

1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText”><br>
3: Copy Text: <input type=”text” name=”copyText”>
4: </form>
5: <a href=”#” onClick=”document.myForm.copyText.value =
6: document.myForm.myText.value;”>Copy Text Field</a>


46 侦测文本框的变化

1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText” onChange=”alert(this.value);”>
3: </form>


47 访问选中的Select

1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: <option value=”Third Choice”>3</option>
6: </select>
7: </form>
8: <a href='#' onClick='alert(document.myForm.mySelect.value);'>Check Selection List</a>


48 动态增加Select项

1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: </select>
6: </form>
7: <script language=”JavaScript”>
8: document.myForm.mySelect.length++;
9: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].text = “3”;
10: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].value = “Third Choice”;
11: </script>


49 验证表单字段

1: <script language=”JavaScript”>
2: function checkField(field) {
3: if (field.value == “”) {
4: window.alert(“You must enter a value in the field”);
5: field.focus();
6: }
7: }
8: </script>
9: <form name=”myForm” action=”target.html”>
10: Text Field: <input type=”text” name=”myField”onBlur=”checkField(this)”>
11: <br><input type=”submit”>
12: </form>


50 验证Select项

1: function checkList(selection) {
2: if (selection.length == 0) {
3: window.alert(“You must make a selection from the list.”);
4: return false;
5: }
6: return true;
7: }


51 动态改变表单的action

1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br>
3: Password: <input type=”password” name=”password”><br>
4: <input type=”button” value=”Login” onClick=”this.form.submit();”>
5: <input type=”button” value=”Register” onClick=”this.form.action = ‘register.html’; this.form.submit();”>
6: <input type=”button” value=”Retrieve Password” onClick=”this.form.action = ‘password.html’; this.form.submit();”>
7: </form>


52 使用图像按钮

1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br>
3: Password: <input type=”password”name=”password”><br>
4: <input type=”image” src="/”login.gif"” value=”Login”>
5: </form>
6:


53 表单数据的加密

1: <SCRIPT LANGUAGE='JavaScript'>
2: <!--
3: function encrypt(item) {
4: var newItem = '';
5: for (i=0; i < item.length; i++) {
6: newItem += item.charCodeAt(i) + '.';
7: }
8: return newItem;
9: }
10: function encryptForm(myForm) {
11: for (i=0; i < myForm.elements.length; i++) {
12: myForm.elements[i].value = encrypt(myForm.elements[i].value);
13: }
14: }
15:
16: //-->
17: </SCRIPT>
18: <form name='myForm' onSubmit='encryptForm(this); window.alert(this.myField.value);'>
19: Enter Some Text: <input type=text name=myField><input type=submit>
20: </form>

 


JavaScript就这么回事5:窗口和框架


54 改变浏览器状态栏文字提示

1: <script language=”JavaScript”>
2: window.status = “A new status message”;
3: </script>


55 弹出确认提示框

1: <script language=”JavaScript”>
2: var userChoice = window.confirm(“Click OK or Cancel”);
3: if (userChoice) {
4: document.write(“You chose OK”);
5: } else {
6: document.write(“You chose Cancel”);
7: }
8: </script>


56 提示输入

1: <script language=”JavaScript”>
2: var userName = window.prompt(“Please Enter Your Name”,”Enter Your Name Here”);
3: document.write(“Your Name is “ + userName);
4: </script>


57 打开一个新窗口

1: //打开一个名称为myNewWindow的浏览器新窗口
2: <script language=”JavaScript”>
3: window.open(“http://www.liu21st.com/”,”myNewWindow”);
4: </script>


58 设置新窗口的大小

1: <script language=”JavaScript”>
2: window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300');
3: </script>


59 设置新窗口的位置

1: <script language=”JavaScript”>
2: window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300,left=200,screenX=200,top=100,screenY=100');
3: </script>


60 是否显示工具栏和滚动栏

1: <script language=”JavaScript”>
2: window.open(“http:


61 是否可以缩放新窗口的大小

1: <script language=”JavaScript”>
2: window.open('http://www.liu21st.com/' , 'myNewWindow', 'resizable=yes' );</script>


62 加载一个新的文档到当前窗口

1: <a href='#' onClick='document.location = '125a.html';' >Open New Document</a>


63 设置页面的滚动位置

1: <script language=”JavaScript”>
2: if (document.all) { //如果是IE浏览器则使用scrollTop属性
3: document.body.scrollTop = 200;
4: } else { //如果是NetScape浏览器则使用pageYOffset属性
5: window.pageYOffset = 200;
6: }</script>


64 在IE中打开全屏窗口

1: <a href='#' onClick=”window.open('http://www.juxta.com/','newWindow','fullScreen=yes');”>Open a full-screen window</a>


65 新窗口和父窗口的操作

1: <script language=”JavaScript”>
2: //定义新窗口
3: var newWindow = window.open(“128a.html”,”newWindow”);
4: newWindow.close(); //在父窗口中关闭打开的新窗口
5: </script>
6: 在新窗口中关闭父窗口
7: window.opener.close()


66 往新窗口中写内容

1: <script language=”JavaScript”>
2: var newWindow = window.open(“”,”newWindow”);
3: newWindow.document.open();
4: newWindow.document.write(“This is a new window”);
5: newWIndow.document.close();
6: </script>


67 加载页面到框架页面

1: <frameset cols=”50%,*”>
2: <frame name=”frame1” src="/”135a.html"”>
3: <frame name=”frame2” src="/”about:blank"”>
4: </frameset>
5: 在frame1中加载frame2中的页面
6: parent.frame2.document.location = “135b.html”;


68 在框架页面之间共享脚本
如果在frame1中html文件中有个脚本

1: function doAlert() {
2: window.alert(“Frame 1 is loaded”);
3: }

那么在frame2中可以如此调用该方法

1: <body onLoad=”parent.frame1.doAlert();”>
2: This is frame 2.
3: </body>


69 数据公用
可以在框架页面定义数据项,使得该数据可以被多个框架中的页面公用

1: <script language=”JavaScript”>
2: var persistentVariable = “This is a persistent value”;
3: </script>
4: <frameset cols=”50%,*”>
5: <frame name=”frame1” src="/”138a.html"”>
6: <frame name=”frame2” src="/”138b.html"”>
7: </frameset>


这样在frame1和frame2中都可以使用变量persistentVariable
70 框架代码库
根据以上的一些思路,我们可以使用一个隐藏的框架页面来作为整个框架集的代码库

1: <frameset cols=”0,50%,*”>
2: <frame name=”codeFrame” src="/”140code.html"”>
3: <frame name=”frame1” src="/”140a.html"”>
4: <frame name=”frame2” src="/”140b.html"”>
5: </frameset>

转自:动态网站制作指南 | www.knowsky.com
posted @ 2006-09-06 22:18 joeyeezhang 阅读(333) | 评论 (0)编辑 收藏

javascript事件列表解说
事件 浏览器支持 解说
一般事件 onclick IE3、N2 鼠标点击时触发此事件
ondblclick IE4、N4 鼠标双击时触发此事件
onmousedown IE4、N4 按下鼠标时触发此事件
onmouseup IE4、N4 鼠标按下后松开鼠标时触发此事件
onmouseover IE3、N2 当鼠标移动到某对象范围的上方时触发此事件
onmousemove IE4、N4 鼠标移动时触发此事件
onmouseout IE4、N3 当鼠标离开某对象范围时触发此事件
onkeypress IE4、N4 当键盘上的某个键被按下并且释放时触发此事件.
onkeydown IE4、N4 当键盘上某个按键被按下时触发此事件
onkeyup IE4、N4 当键盘上某个按键被按放开时触发此事件
页面相关事件 onabort IE4、N3 图片在下载时被用户中断
onbeforeunload IE4、N 当前页面的内容将要被改变时触发此事件
onerror IE4、N3 出现错误时触发此事件
onload IE3、N2 页面内容完成时触发此事件
onmove IE、N4 浏览器的窗口被移动时触发此事件
onresize IE4、N4 当浏览器的窗口大小被改变时触发此事件
onscroll IE4、N 浏览器的滚动条位置发生变化时触发此事件
onstop IE5、N 浏览器的停止按钮被按下时触发此事件或者正在下载的文件被中断
onunload IE3、N2 当前页面将被改变时触发此事件
表单相关事件 onblur IE3、N2 当前元素失去焦点时触发此事件
onchange IE3、N2 当前元素失去焦点并且元素的内容发生改变而触发此事件
onfocus IE3 、N2 当某个元素获得焦点时触发此事件
onreset IE4 、N3 当表单中RESET的属性被激发时触发此事件
onsubmit IE3 、N2 一个表单被递交时触发此事件
滚动字幕事件 onbounce IE4、N 在Marquee内的内容移动至Marquee显示范围之外时触发此事件
onfinish IE4、N 当Marquee元素完成需要显示的内容后触发此事件
onstart IE4、 N 当Marquee元素开始显示内容时触发此事件
编辑事件 onbeforecopy IE5、N 当页面当前的被选择内容将要复制到浏览者系统的剪贴板前触发此事件
onbeforecut IE5、 N 当页面中的一部分或者全部的内容将被移离当前页面[剪贴]并移动到浏览者的系统剪贴板时触发此事件
onbeforeeditfocus IE5、N 当前元素将要进入编辑状态
onbeforepaste IE5、 N 内容将要从浏览者的系统剪贴板传送[粘贴]到页面中时触发此事件
onbeforeupdate IE5、 N 当浏览者粘贴系统剪贴板中的内容时通知目标对象
oncontextmenu IE5、N 当浏览者按下鼠标右键出现菜单时或者通过键盘的按键触发页面菜单时触发的事件
oncopy IE5、N 当页面当前的被选择内容被复制后触发此事件
oncut IE5、N 当页面当前的被选择内容被剪切时触发此事件
ondrag IE5、N 当某个对象被拖动时触发此事件 [活动事件]
ondragdrop IE、N4 一个外部对象被鼠标拖进当前窗口或者帧
ondragend IE5、N 当鼠标拖动结束时触发此事件,即鼠标的按钮被释放了
ondragenter IE5、N 当对象被鼠标拖动的对象进入其容器范围内时触发此事件
ondragleave IE5、N 当对象被鼠标拖动的对象离开其容器范围内时触发此事件
ondragover IE5、N 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
ondragstart IE4、N 当某对象将被拖动时触发此事件
ondrop IE5、N 在一个拖动过程中,释放鼠标键时触发此事件
onlosecapture IE5、N 当元素失去鼠标移动所形成的选择焦点时触发此事件
onpaste IE5、N 当内容被粘贴时触发此事件
onselect IE4、N 当文本内容被选择时的事件
onselectstart IE4、N 当文本内容选择将开始发生时触发的事件
数据绑定 onafterupdate IE4、N 当数据完成由数据源到对象的传送时触发此事件
oncellchange IE5、N 当数据来源发生变化时
ondataavailable IE4、N 当数据接收完成时触发事件
ondatasetchanged IE4、N 数据在数据源发生变化时触发的事件
ondatasetcomplete IE4、N 当来子数据源的全部有效数据读取完毕时触发此事件
onerrorupdate IE4、N 当使用onBeforeUpdate事件触发取消了数据传送时,代替onAfterUpdate事件
onrowenter IE5、N 当前数据源的数据发生变化并且有新的有效数据时触发的事件
onrowexit IE5、N 当前数据源的数据将要发生变化时触发的事件
onrowsdelete IE5、N 当前数据记录将被删除时触发此事件
onrowsinserted IE5、N 当前数据源将要插入新数据记录时触发此事件
外部事件 onafterprint IE5、N 当文档被打印后触发此事件
onbeforeprint IE5、N 当文档即将打印时触发此事件
onfilterchange IE4、N 当某个对象的滤镜效果发生变化时触发的事件
onhelp IE4、N 当浏览者按下F1或者浏览器的帮助选择时触发此事件
onpropertychange IE5、N 当对象的属性之一发生变化时触发此事件
onreadystatechange IE4、N 当对象的初始化属性值发生变化时触发此事件
posted @ 2006-09-06 22:03 joeyeezhang 阅读(183) | 评论 (0)编辑 收藏

1.I love you not because who you are,but because who I am when I am with you.我爱你不是因为你是谁,而是我在你面前是谁。

2.No man or woman is worth your tears,and the one who is,won't make you cry.没有男人或女人值得你流泪,值得的那位不会让你哭泣。

3.Atrue friend is some one who reaches for your hand and touches your heart.一个真正的朋友是向你伸出手,触动你心灵的人。

4.The worst way to miss some one is to be sitting right beside him knowing you can't have him.想念一个人最糟糕的方式就是坐在他身旁,而知道你不能拥有他。

5.Never frown,even when you are sad,because youn ever know who is falling in love with your smile.就算你不快乐也不要皱眉,因为你永远不知道谁会爱上你的笑容。

6.To the world you may be one person,but to one person you may be the world.在世界上你可能只是某人,但对于某人你可能是世界。

7.Don't cry because it is over,smile because it happened.不要因为完结而哭泣,要为曾经发生而微笑。

8.Make yourself a better person and know who you are before you try and know someone else and expect them to know you.在你尝试了解他人和盼望他人了解你之前,先把你变成一个更好的人和了解自己的人。

9.Don't try so hard,the best things come when you lease expect them to.不要太努力去找,最好的事情是在最预计不到的时候出现的。

10.Life is apure flame,and we live by an invisible sun within us.生命是一束纯净的火焰,我们依靠自己内心看不见的太阳而存在。
posted @ 2006-09-01 16:15 joeyeezhang 阅读(201) | 评论 (0)编辑 收藏

NetBeans 5.0 快捷键和代码模板
在源代码编辑器中键入代码时,可以通过键入以下列表左列中的
缩写,然后按空格键来生成右列中的文本。
Java 编辑器代码模板
En Enumeration
Ex Exception
Ob Object
Psf public static final
Psfb public static final boolean
Psfi public static final int
Psfs public static final String
St String
ab abstract
bo boolean
br break
ca catch (
cl class
cn continue
df default:
dowhile do {
} while (condition);
eq equals
ex extends
fa false
fi final
fl float
forc for (Iterator it = collection.iterator();
it.hasNext();) {
Object elem = (Object) it.next();
}
fore for (Object elem : iterable) {
}
fori for (int i = 0; i < arr.length; i++) {
}
fy finally
ie interface
ifelse if (condition){}else {
}
im implements
iof instanceof
ir import
le length
newo Object name = new Object(args);
pe protected
pr private
psf private static final
psfb private static final boolean
psfi private static final int
psfs private static final String
pst printStackTrace();
psvm public static void main(String[] args){
}
pu public
re return
serr System.err.println ("|");
sout System.out.println ("|");
st static
sw switch (
sy synchronized
tds Thread.dumpStack();
th throws
trycatch try {}
catch (Exception e) {}
tw throw
twn throw new
wh while (
whilei while (it.hasNext()) {
Object elem = (Object) it.next();
}
JSP 编辑器代码模板
ag application.getAttribute("|")
ap application.putAttribute("|",)
ar application.removeAttribute("|")
cfgi config.getInitParameter("|")
jspf <jsp:forward page="|"/>
jspg <jsp:getProperty name="|" property="" />
jspi <jsp:include page="|"/>
jspp <jsp:plugin type="|" code=""
codebase=""></jsp:plugin>
jsps <jsp:setProperty name="|" property=""/>
jspu <jsp:useBean id="I" type=""/>
oup out.print("|")
oupl out.println("|")
pcg pageContext.getAttribute("|")
pcgn pageContext.getAttributeNamesInScope("|")
pcgs pageContext.getAttributesScope("|")
pcr pageContext.removeAttribute("|")
pcs pageContext.setAttribute("|",)
pg <%@page |%>
pga <%@page autoFlush="false"%>
pgb <%@page buffer="|kb"%>
pgc <%@page contentType="|"%>
pgerr <%@page errorPage="|"%>
pgex <%@page extends="|"%>
pgie <%@page isErrorPage="true"%>
pgim <%@page import="|"%>
pgin <%@page info="|"%>
pgit <%@page isThreadSafe="false"%>
pgl <%@page language="java"%>
pgs <%@page session="false"%>
rg request.getParameter("|")
sg session.getAttribute("|")
sp session.setAttribute("|", )
sr session.removeAttribute("|")
tglb <%@taglib uri="|"%>
XML/DTD 编辑器代码模板
?xm <?xml version="1.0" encoding="UTF-8"?>
!do <!DOCTYPE>
!cd <![CDATA[|]]>
!at <!ATTLIST |>
!el <!ELEMENT |>
!en <!ENTITY |>
pu PUBLIC "|"
sy SYSTEM "|"
!no <!NOTATION |>
cd CDATA
em EMPTY
en ENTITY
ens ENTITIES
fi #FIXED
im #IMPLIED
nm NMTOKEN
nms NMTOKENS
nn NOTATION
pc #PCDATA
NetBeans 5.0 快捷键和代码模板
查找、搜索和替换
Ctrl-F3 搜索位于插入点的词
F3/Shift-F3 在文件中查找下一个/上一个
Ctrl-F/H 在文件中查找/替换
Alt-F7 查找使用实例
Ctrl-Shift-P 在项目中查找
Alt-Shift-U 显示“使用实例”窗口
Alt-Shift-H 关闭搜索结果突出显示
Alt-Shift-L 跳转列表中的下一个(所有文件)
Alt-Shift-K 跳转列表中的上一个(所有文件)
Ctrl-R 重新装入窗体
Alt-U-U 将选定内容转换为大写
Alt-U-L 将选定内容转换为小写
Alt-U-R 对选定内容切换大小写
在源代码中导航
Alt-Shift-O 转至类
Alt-Shift-E 转至 JUnit 测试
Alt-O 转至源代码
Alt-G 转至声明
Ctrl-B 转至超级实现
Alt-K/Alt-L 后退/前进
Ctrl-G 转至行
Ctrl-F2 切换添加/删除书签
F2/Shift-F2 下一个/上一个书签
F12/Shift-F12 下一个/上一个使用实例/编译错误
Ctrl-Shift-1/2/3 在“项目”/“文件”/“收藏夹”中选择
Ctrl-[ 将插入记号移至匹配的方括号
Ctrl-^ Ctrl-[(法语/比利时语键盘)
用 Java 编码
Ctrl-I 覆盖方法
Alt-Shift-F/I 修复全部/选定类的导入
Alt-Shift-W 以 try-catch 块围绕
Ctrl-Shift-F 重新设置选定内容的格式
Ctrl-D/Ctrl-T 左移/右移一个制表符
Ctrl-Shift-T/D 添加/撤消注释行 ("//")
Ctrl-L/K 插入下一个/上一个匹配的词
Esc/Ctrl-空格键关闭/打开代码完成
Ctrl-M 选择下一个参数
Shift-空格键输入空格,不展开缩写
Alt-F1/Shift-F1 显示/搜索 Javadoc
Ctrl-Shift-M 提取方法
Alt-U-G 将 “get” 放置到标识符前面
Alt-U-S 将 “set” 放置到标识符前面
Alt-U-I 将 “is” 放置到标识符前面
Ctrl-Backspace/Del 删除上一个/当前词
Ctrl-E 删除当前行
Ctrl-J-S/E 开始/结束录制宏
Ctrl-Shift-J 插入国际化字符串
Ctrl-数字键盘上的 - 折叠(隐藏)代码块
Ctrl-数字键盘上的 + 展开已折叠的代码块
Ctrl-Shift-数字键盘上的 - 折叠所有代码块
Ctrl-Shift-数字键盘上的 + 展开所有代码块
Alt-Enter 显示建议/提示
打开和切换视图
Ctrl-Shift-0 显示“搜索结果”窗口
Ctrl-0 显示源代码编辑器
Ctrl-1 显示“项目”窗口
Ctrl-2 显示“文件”窗口
Ctrl-3 显示“收藏夹”窗口
Ctrl-4 显示“输出”窗口
Ctrl-5 显示“运行环境”窗口
Ctrl-6 显示“待做事项”窗口
Ctrl-7 显示“导航”窗口
Ctrl-Shift-7 显示“属性”对话框
Ctrl-Shift-8 显示组件面板
Ctrl-8 显示“版本控制”窗口
Ctrl-9 显示“VCS 输出”窗口
Shift-F4 显示“文档”对话框
Alt-向左方向键移动到左侧窗口
Alt-向右方向键移动到右侧窗口
Ctrl-Tab (Ctrl-`) 在打开的文档之间切换
Shift-Escape 最大化窗口(切换)
Ctrl-F4/Ctrl-W 关闭当前选定的窗口
Ctrl-Shift-F4 关闭所有窗口
Shift-F10 打开上下文菜单
编译、测试和运行
F9 编译选定的包或文件
F11 生成主项目
Shift-F11 清理并生成主项目
Ctrl-Q 设置请求参数
Ctrl-Shift-U 创建 JUnit 测试
Ctrl-F6/Alt-F6 为文件/项目运行 JUnit 测试
F6/Shift-F6 运行主项目/文件
调试
F5 开始调试主项目
Ctrl-Shift-F5 开始调试当前文件
Ctrl-Shift-F6 开始为文件调试测试 (JUnit)
Shift-F5/Ctrl-F5 停止/继续调试会话
F4 运行到文件中的光标位置
F7/F8 步入/越过
Ctrl-F7 步出
Ctrl-Alt-向上方向键转至被调用的方法
Ctrl-Alt-向下方向键转至调用方法
Ctrl-F9 计算表达式的值
Ctrl-F8 切换断点
Ctrl-Shift-F8 新建断点
Ctrl-Shift-F7 新建监视
Ctrl-Shift-5 显示 HTTP 监视器
Ctrl-Shift-0 显示“搜索结果”窗口
Alt-Shift-1 显示“局部变量”窗口
Alt-Shift-2 显示“监视”窗口
Alt-Shift-3 显示“调用栈”窗口
Alt-Shift-4 显示“类”窗口
Alt-Shift-5 显示“断点”窗口
Alt-Shift-6 显示“会话”窗口
Ctrl-Shift-6 切换到“执行”窗口
Alt-Shift-7 切换到“线程”窗口
Alt-Shift-8 切换到“源”窗口
NetBeans 5.0 快捷键和代码模板
Emacs 快捷键
通用快捷键
Ctrl-W、Alt-W、Ctrl-Y 剪切/复制/粘贴
Ctrl-X-U 撤消
Ctrl-Shift-Z 重做
Ctrl-X-H 全选
Ctrl-X,然后按 Ctrl-S 保存
Ctrl-X-S 全部保存
查找、搜索和替换
Ctrl-S/Ctrl-H 在文件中查找/替换
Alt-S/Alt-R 在文件中查找下一个/上一个
Alt-F7 查找使用实例
Ctrl-Shift-P 在项目中查找
Ctrl-Alt-F 显示“使用实例”窗口
Ctrl X,然后按 Ctrl-U 将选定内容转换为大写
Ctrl-X,然后按 Ctrl-L 将选定内容转换为小写
在源代码中导航
Ctrl-I 覆盖方法
Alt-Shift-F 修复全部导入
Alt-Shift-I 修复选定类的导入
Alt-Shift-W 以 try-catch 块围绕
Ctrl-Shift-F 重新设置选定内容的格式
Alt-Shift-O 转至类
Alt-Shift-E 转至 JUnit 测试
Alt-句点转至声明
Ctrl-G 转至行
Ctrl-B 左移一个字符
Ctrl-F 右移一个字符
Alt-B/F 左移/右移一个词
Ctrl-N/P 下移/上移一行
Ctrl-A/Ctrl-E 转至行首/行尾
Alt-V/Ctrl-V 上翻/下翻一页
Alt-Shift-逗号转至文档开头
Alt-Shift-句点转至文档结尾
Ctrl-Shift-1/2/3 在“项目”/“文件”/“收藏夹”中选择
Ctrl-F2 切换添加/删除书签
F2/Shift-F2 下一个/上一个书签
F12/Shift-F12 下一个/上一个错误
用 Java 编码
Alt-Enter 显示建议/提示
Alt-0,然后按 Ctrl-X,
再按 Tab 键
左移一个制表符
Ctrl-X-Tab 右移一个制表符
Ctrl-C,再按 Ctrl-C 将行标记为注释 ("//")
Alt-0,然后按 Ctrl-C,
再按 Ctrl-C
撤消对行的注释 ("//")
Alt-正斜杠插入下一个匹配的词
Ctrl-Q-Tab 插入制表符
Ctrl-X,然后按 Shift-9/0 开始/停止录制宏
Alt-D 删除下一个词
Alt-Backspace 删除上一个词
Ctrl-D 删除下一个字符
Backspace 删除上一个字符
Alt-0,然后按 Ctrl-K 剪切光标至行首的内容
Ctrl-K 剪切光标至行尾的内容
Ctrl-Shift-减号折叠所有代码块
Ctrl-Shift-加号展开所有代码块
Ctrl-Shift-M 提取方法
打开和切换视图
Ctrl-Alt-N 新建文件
Ctrl-Shift-N 新建项目
Ctrl-X,然后按 Ctrl-F 打开文件
Ctrl-Shift-O 打开项目
Ctrl-X-B 显示“文档”对话框
Ctrl-X-1 最大化窗口(切换)
Ctrl-X,然后按 Ctrl-K 关闭当前选定的文档
Ctrl-X-K (同上)
Ctrl-X,然后按 Ctrl-C 退出 IDE
Ctrl-Shift-0 显示“搜索结果”窗口
Ctrl-0 显示源代码编辑器
Ctrl-1 显示“项目”窗口
Ctrl-2 显示“文件”窗口
Ctrl-3 显示“收藏夹”窗口
Ctrl-4 显示“输出”窗口
Ctrl-5 显示“运行环境”窗口
Ctrl-6 显示“待做事项”窗口
Ctrl-7 显示“导航”窗口
Ctrl-Shift-7 显示“属性”对话框
Ctrl-8 显示“版本控制”窗口
Ctrl-Shift-8 显示组件面板
Ctrl-9 显示“VCS 输出”窗口
Alt-向左方向键移动到左侧窗口
Alt-向右方向键移动到右侧窗口
Ctrl-Tab (Ctrl-`) 在打开的文档之间切换
编译、测试和运行
F9 编译选定的包或文件
F11 生成主项目
Shift-F11 清理并生成主项目
Ctrl-Q 设置请求参数
Ctrl-Shift-U 创建 JUnit 测试
Ctrl-F6/Alt-F6 为文件/项目运行 JUnit 测试
F6/Shift-F6 运行主项目/文件
调试
F5 开始调试主项目
Ctrl-Shift-F5 开始调试当前文件
Ctrl-Shift-F6 开始为文件调试测试 (JUnit)
Shift-F5/Ctrl-F5 停止/继续调试会话
F4 运行到文件中的光标位置
F7/F8 步入/越过
Ctrl-F7 步出
Ctrl-Alt-向上方向键转至被调用的方法
Ctrl-Alt-向下方向键转至调用方法
Ctrl-F9 计算表达式的值
Ctrl-F8 切换断点
Ctrl-Shift-F8 新建断点
Ctrl-Shift-F7 新建监视
NetBeans 5.0 快捷键和代码模板
Eclipse 快捷键
查找、搜索和替换
FIND/Ctrl-Shift-F 在文件中查找/替换
Ctrl-K/Ctrl-Shift-K 在文件中查找下一个/上一个
Alt-F7 查找使用实例
Ctrl-H 在项目中查找
Alt-Shift-U 显示“使用实例”窗口
Ctrl-Shift-X 将选定内容转换为大写
Ctrl-Shift-Y 将选定内容转换为小写
在源代码中导航
Alt-Shift-O 转至类
Alt-Shift-E 转至 JUnit 测试
Ctrl-F3 转至源代码
F3 转至声明
Ctrl-L 转至行
向左方向键左移一个字符
向右方向键右移一个字符
Ctrl-向左/向右方向键左移/右移一个词
向上方向键/向下方向键下移/上移一行
Ctrl-Shift-1/2 在“项目”/“文件”中选择
Ctrl-F2 切换添加/删除书签
Shift-F2 上一个书签
Ctrl-句点下一个使用实例/编译错误
Ctrl-逗号上一个使用实例/编译错误
Ctrl-Alt-Shift-P 将插入记号移至匹配的方括号
Alt-向左方向键后退
Alt-向右方向键前进
用 Java 编码
Ctrl-I 覆盖方法
Alt-Shift-W 以 try-catch 块围绕
Ctrl-Shift-O 修复全部导入
Ctrl-Shift-M 修复选定类的导入
Alt-Enter 显示建议/提示
Alt-正斜杠插入下一个匹配的词
Ctrl-Delete 删除下一个词
Ctrl-Backspace 删除上一个词
Delete 删除下一个字符
Backspace 删除上一个字符
Ctrl-D 删除当前行
Ctrl-Shift-减号折叠所有代码块
Ctrl-Shift-加号展开所有代码块
Alt-Shift-M 提取方法
打开和切换视图
Ctrl-N 新建文件
Ctrl-Shift-N 新建项目
Ctrl-O 打开文件
Ctrl-Shift-O 打开项目
Ctrl-Shift-E 显示“文档”对话框
Ctrl-M 最大化窗口(切换)
Ctrl-F4/Ctrl-W 关闭当前选定的文档
Ctrl-Shift-0 显示“搜索结果”窗口
F12 显示源代码编辑器
Ctrl-1 显示“项目”窗口
Ctrl-2 显示“文件”窗口
Ctrl-3 显示“收藏夹”窗口
Ctrl-4 显示“输出”窗口
Ctrl-5 显示“运行环境”窗口
Ctrl-6 显示“待做事项”窗口
Ctrl-7 显示“导航”窗口
Ctrl-Shift-7 显示“属性”对话框
Ctrl-8 显示“版本控制”窗口
Ctrl-Tab 在打开的文档之间切换
编译、测试和运行
F9 编译选定的包或文件
F11 生成主项目
Shift-F11 清理并生成主项目
Ctrl-Q 设置请求参数
Ctrl-Shift-U 创建 JUnit 测试
Ctrl-F6/Alt-F6 为文件/项目运行 JUnit 测试
Ctrl-Shift-F11 运行主项目
Shift-F6 运行文件
调试
F11 开始调试主项目
Ctrl-Shift-F5 开始调试当前文件
Ctrl-Shift-F6 开始为文件调试测试 (JUnit)
Shift-F5/F8 停止/继续调试会话
Ctrl-R 运行到文件中的光标位置
F5/F6 步入/越过
Ctrl-F7 步出
Ctrl-Alt-向上方向键转至被调用的方法
Ctrl-Alt-向下方向键转至调用方法
Ctrl-F9 计算表达式的值
Ctrl-Shift-B 切换断点
Ctrl-Shift-F8 新建断点
Ctrl-Shift-F7 新建监视
更改代码模板或快捷键:
1. 从主菜单中选择“工具”>“选项”。
2. 对于代码模板:
• 在左边栏中选择“编辑器”。
• 单击“代码模板”标签。
• 从“语言”下拉列表中选择一种语言。
3. 对于快捷键:
• 在左边栏中选择“键映射”。
• 从“配置文件”下拉列表中选择一个配置文件。
4. 更改相应项,然后单击“确定”。
更改代码模板的展开方式:
1. 从主菜单中选择“工具”>“选项”。
2. 在左边栏中选择“编辑器”。
3. 单击“代码模板”标签。
4. 从“语言”下拉列表中选择一种语言。
5. 从“展开模板”下拉列表中选择展开键,然后单击“确
定”。
选择其他配置文件:
1. 从主菜单中选择“工具”>“选项”。
2. 在左边栏中选择“键映射”。
3. 从“配置文件”下拉列表中选择一个配置文件,然
后单击“确定”。
posted @ 2006-08-31 16:43 joeyeezhang 阅读(223) | 评论 (0)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页