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 閱讀(271) | 評論 (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 閱讀(347) | 評論 (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 閱讀(283) | 評論 (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 閱讀(331) | 評論 (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 閱讀(329) | 評論 (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 閱讀(489) | 評論 (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 閱讀(362) | 評論 (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 閱讀(193) | 評論 (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 閱讀(212) | 評論 (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?添加/撤消注釋行?("http://")
          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?將行標記為注釋?("http://")
          Alt-0,然后按?Ctrl-C,
          再按?Ctrl-C
          撤消對行的注釋?("http://")
          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 閱讀(230) | 評論 (0)編輯 收藏

          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 卢氏县| 武山县| 北票市| 白城市| 临武县| 翁牛特旗| 电白县| 会宁县| 康保县| 灵石县| 梁山县| 江山市| 长宁区| 东兴市| 永州市| 沐川县| 竹山县| 江山市| 山西省| 普兰县| 惠州市| 逊克县| 阿鲁科尔沁旗| 凭祥市| 山东省| 深州市| 都匀市| 永兴县| 无极县| 五莲县| 桃园县| 临潭县| 项城市| 呼玛县| 遂溪县| 甘洛县| 杭锦后旗| 龙海市| 海南省| 剑川县| 张掖市|