Oracle 函數(shù)大全

          ?

          SQL中的單記錄函數(shù)
          1.ASCII
          返回與指定的字符對應的十進制數(shù);
          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
          給出整數(shù),返回對應的字符;
          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
          返回字符串并將字符串的第一個字母變?yōu)榇髮?
          SQL> select initcap('smith') upp from dual;

          UPP
          -----
          Smith


          5.INSTR(C1,C2,I,J)
          在一個字符串中搜索指定的字符,返回發(fā)現(xiàn)指定的字符的位置;
          C1??? 被搜索的字符串
          C2??? 希望搜索的字符串
          I???? 搜索的開始位置,默認為1
          J???? 出現(xiàn)的位置,默認為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 北京市海錠區(qū)??????????????? 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? 刪除左邊出現(xiàn)的字符串
          RTRIM? 刪除右邊出現(xiàn)的字符串
          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
          返回一個數(shù)字的反正切值
          SQL> select atan(1) from dual;

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


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

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


          20.COS
          返回一個給定數(shù)字的余弦
          SQL> select cos(-3.1415927) from dual;

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


          21.COSH
          返回一個數(shù)字反余弦值
          SQL> select cosh(20) from dual;

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


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

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


          23.FLOOR
          對給定的數(shù)字取整數(shù)
          SQL> select floor(2345.67) from dual;

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


          24.LN
          返回一個數(shù)字的對數(shù)值
          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的對數(shù)
          SQL> select log(2,1),log(2,4) from dual;

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


          26.MOD(n1,n2)
          返回一個n1除以n2的余數(shù)
          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
          取數(shù)字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
          返回一個數(shù)字的正弦值
          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
          返回數(shù)字n的根
          SQL> select sqrt(64),sqrt(10) from dual;

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


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

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


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

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

          ?

          35.TRUNC
          按照指定的精度截取一個數(shù)
          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時區(qū)=other時區(qū)的日期和時間
          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
          用來得到系統(tǒng)的當前日期
          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
          將字符數(shù)據(jù)類型轉換為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數(shù)據(jù)類型轉換為字符類型

          ?

          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
          將字符串中的單字節(jié)字符轉化為多字節(jié)字符
          SQL>? select to_multi_byte('高') from dual;

          TO
          --


          50.TO_NUMBER
          將給出的字符轉換為數(shù)字
          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函數(shù)以fmt指定的內(nèi)部數(shù)字格式返回一個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()
          這兩個函數(shù)都是用來對大數(shù)據(jù)類型字段進行初始化操作的函數(shù)


          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
          返回標識當前用戶的唯一整數(shù)
          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
          返回當前用戶環(huán)境的信息,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
          返回當前環(huán)境變量
          SQL> select userenv('language') from dual;

          USERENV('LANGUAGE')
          ----------------------------------------------------
          SIMPLIFIED CHINESE_CHINA.ZHS16GBK
          LANG
          返回當前環(huán)境的語言的縮寫
          SQL> select userenv('lang') from dual;

          USERENV('LANG')
          ----------------------------------------------------
          ZHS
          TERMINAL
          返回用戶的終端或機器的標志
          SQL> select userenv('terminal') from dual;

          USERENV('TERMINA
          ----------------
          GAO
          VSIZE(X)
          返回X的大小(字節(jié))數(shù)
          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表示對不同的值求最大值,相同的只取一次
          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)
          求協(xié)方差

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

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


          65.GROUP BY
          主要用來對一組數(shù)進行統(tǒng)計
          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
          對分組統(tǒng)計再加限制條件
          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-06-30 09:01 software5168 閱讀(2301) | 評論 (0)編輯 收藏

          SQL語句介紹

          如何從一位菜鳥蛻變成為高手,靈活使用的SQL語句是必不可少的。本文收集了部分比較經(jīng)典,常用的SQL語句供大家參考,希望對大家有所幫助。

            說明:復制表(只復制結構,源表名:a 新表名:b)  

            SQL: select * into b from a where 1<>1

            說明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標表名:b)  

            SQL: insert into b(a, b, c) select d,e,f from b;

            說明:顯示文章、提交人和最后回復時間  

            SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

            說明:外連接查詢(表名1:a 表名2:b)  

            SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

            說明:日程安排提前五分鐘提醒  

            SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5  

            說明:兩張關聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息

            SQL:   

            delete from info where not exists ( select * from infobz where info.infid=infobz.infid

            說明:--

            SQL:   

            SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

             FROM TABLE1,

             (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

             FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

             FROM TABLE2

             WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

             (SELECT NUM, UPD_DATE, STOCK_ONHAND

             FROM TABLE2

             WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

             TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') &brvbar;&brvbar; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y,

             WHERE X.NUM = Y.NUM (+)

             AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND B

            WHERE A.NUM = B.NUM

            說明:--

            SQL:   

            select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專業(yè)名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績

            說明:

            從數(shù)據(jù)庫中去一年的各單位電話費統(tǒng)計(電話費定額賀電化肥清單兩個表來源)

            SQL:  

            SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

             SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

            FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

             FROM TELFEESTAND a, TELFEE b

             WHERE a.tel = b.telfax) a

            GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

            說明:四表聯(lián)查問題:  

            SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

            說明:得到表中最小的未使用的ID號

            SQL: 

            SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

             FROM Handle

             WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a) 

          posted @ 2006-06-26 17:07 software5168 閱讀(408) | 評論 (0)編輯 收藏

          OC4J里配置數(shù)據(jù)源

          OC4J里配置數(shù)據(jù)源:

          1.application.xml的<data-sources>元素必須指出data-sources.xml文件的文件名和路徑,即:
          <data-sources
          path = "data-sources.xml"
          />
          一般application.xml文件和data-sources.xml 文件都在j2ee/home/config/下。所以<data-sources>元素的path屬性只包括data-sources.xml的文件名;

          2.data-sources.xml文件中定義數(shù)據(jù)源:
          <data-source
          ?class="com.evermind.sql.DriverManagerDataSource"
          ?name="OracleDS"
          ?location="jdbc/OracleCoreDS"
          ?xa-location="jdbc/xa/OracleXADS"
          ?ejb-location="jdbc/OracleDS"
          ?connection-driver="oracle.jdbc.driver.OracleDriver"
          ?username="hr"
          ?password="hr"
          ?url="jdbc:oracle:thin:@myhost:1521:ORCL"
          ?inactivity-timeout="30"
          />
          class屬性定義需要定義的數(shù)據(jù)源類型;
          location、xa-location和ejb-location定義JNDI名字;
          connection-driver指出連接驅動。
          例如:

          ?<data-source
          ??class="com.evermind.sql.DriverManagerDataSource"
          ??name="MyConnection"
          ??location="jdbc/MyConnection"
          ??connection-driver="oracle.jdbc.driver.OracleDriver"
          ??username="portal"
          ??password="pportalgis"
          ??url="jdbc:oracle:thin:@172.18.2.6:1521:apps"
          ??inactivity-timeout="30"
          ??max-connections="50"
          ??max-connect-attempts="2"
          ??min-connections="4"
          ?/>

          2.程序調(diào)用:
          Context env= new InitialContext();
          DataSource pool= (DataSource)env.lookup("jdbc/MyConnection");
          Connection conn=pool.getConnection();

          oracle.jdbc.OracleConnection 分為:
          ?getConnection(); //數(shù)據(jù)源中已定義用戶名和密碼
          ?getConnection(String username, String password); //數(shù)據(jù)源中未定義用戶名和密碼
          可以如下:
          oracle.jdbc.OracleConnection conn =(oracle.jdbc.OracleConnection) pool.getConnection();

          posted @ 2006-06-16 17:13 software5168 閱讀(997) | 評論 (1)編輯 收藏

          Ajax簡介

          作為J2EE開發(fā)人員,我們似乎經(jīng)常關注“后端機制(backend mechanics)”。我們通常會忘記,J2EE的主要成功之處在Web應用程序方面;許多原因使得人們喜歡利用Web開發(fā)應用程序,但主要還是因為其易于部署的特點允許站點以盡可能低的成本擁有上百萬的用戶。遺憾的是,在過去幾年中,我們在后端投入了太多的時間,而在使我們的Web用戶界面對用戶自然和響應靈敏方面卻投入不足。

            本文介紹一種方法,Ajax,使用它可以構建更為動態(tài)和響應更靈敏的Web應用程序。該方法的關鍵在于對瀏覽器端的JavaScript、DHTML和與服務器異步通信的組合。本文也演示了啟用這種方法是多么簡單:利用一個Ajax框架(指DWR)構造一個應用程序,它直接從瀏覽器與后端服務進行通信。如果使用得當,這種強大的力量可以使應用程序更加自然和響應靈敏,從而提升用戶的瀏覽體驗。

            該應用程序中所使用的示例代碼已打包為單獨的WAR文件,可供下載。

          簡介

            術語Ajax用來描述一組技術,它使瀏覽器可以為用戶提供更為自然的瀏覽體驗。在Ajax之前,Web站點強制用戶進入提交/等待/重新顯示范例,用戶的動作總是與服務器的“思考時間”同步。Ajax提供與服務器異步通信的能力,從而使用戶從請求/響應的循環(huán)中解脫出來。借助于Ajax,可以在用戶單擊按鈕時,使用JavaScript和DHTML立即更新UI,并向服務器發(fā)出異步請求,以執(zhí)行更新或查詢數(shù)據(jù)庫。當請求返回時,就可以使用JavaScript和CSS來相應地更新UI,而不是刷新整個頁面。最重要的是,用戶甚至不知道瀏覽器正在與服務器通信:Web站點看起來是即時響應的。

            雖然Ajax所需的基礎架構已經(jīng)出現(xiàn)了一段時間,但直到最近異步請求的真正威力才得到利用。能夠擁有一個響應極其靈敏的Web站點確實激動人心,因為它最終允許開發(fā)人員和設計人員使用標準的HTML/CSS/JavaScript堆棧創(chuàng)建“桌面風格的(desktop-like)”可用性。

            通常,在J2EE中,開發(fā)人員過于關注服務和持久性層的開發(fā),以至于用戶界面的可用性已經(jīng)落后。在一個典型的J2EE開發(fā)周期中,常常會聽到這樣的話,“我們沒有可投入UI的時間”或“不能用HTML實現(xiàn)”。但是,以下Web站點證明,這些理由再也站不住腳了:

            所有這些Web站點都告訴我們,Web應用程序不必完全依賴于從服務器重新載入頁面來向用戶呈現(xiàn)更改。一切似乎就在瞬間發(fā)生。簡而言之,在涉及到用戶界面的響應靈敏度時,基準設得更高了。

          定義Ajax

            Adaptive Path公司的Jesse James Garrett這樣定義Ajax

            Ajax不是一種技術。實際上,它由幾種蓬勃發(fā)展的技術以新的強大方式組合而成。Ajax包含:

          • 基于XHTMLCSS標準的表示;
          • 使用Document Object Model進行動態(tài)顯示和交互;
          • 使用XMLHttpRequest與服務器進行異步通信;
          • 使用JavaScript綁定一切。

            這非常好,但為什么要以Ajax命名呢?其實術語Ajax是由Jesse James Garrett創(chuàng)造的,他說它是“Asynchronous JavaScript + XML的簡寫”。

          Ajax的工作原理

            Ajax的核心是JavaScript對象XmlHttpRequest。該對象在Internet Explorer 5中首次引入,它是一種支持異步請求的技術。簡而言之,XmlHttpRequest使您可以使用JavaScript向服務器提出請求并處理響應,而不阻塞用戶。

            在創(chuàng)建Web站點時,在客戶端執(zhí)行屏幕更新為用戶提供了很大的靈活性。下面是使用Ajax可以完成的功能:

          • 動態(tài)更新購物車的物品總數(shù),無需用戶單擊Update并等待服務器重新發(fā)送整個頁面。
          • 提升站點的性能,這是通過減少從服務器下載的數(shù)據(jù)量而實現(xiàn)的。例如,在Amazon的購物車頁面,當更新籃子中的一項物品的數(shù)量時,會重新載入整個頁面,這必須下載32K的數(shù)據(jù)。如果使用Ajax計算新的總量,服務器只會返回新的總量值,因此所需的帶寬僅為原來的百分之一。
          • 消除了每次用戶輸入時的頁面刷新。例如,在Ajax中,如果用戶在分頁列表上單擊Next,則服務器數(shù)據(jù)只刷新列表而不是整個頁面。
          • 直接編輯表格數(shù)據(jù),而不是要求用戶導航到新的頁面來編輯數(shù)據(jù)。對于Ajax,當用戶單擊Edit時,可以將靜態(tài)表格刷新為內(nèi)容可編輯的表格。用戶單擊Done之后,就可以發(fā)出一個Ajax請求來更新服務器,并刷新表格,使其包含靜態(tài)、只讀的數(shù)據(jù)。

            一切皆有可能!但愿它能夠激發(fā)您開始開發(fā)自己的基于Ajax的站點。然而,在開始之前,讓我們介紹一個現(xiàn)有的Web站點,它遵循傳統(tǒng)的提交/等待/重新顯示的范例,我們還將討論Ajax如何提升用戶體驗。

          Ajax可用于那些場景?——一個例子:MSN Money頁面

            前幾天,在瀏覽MSN Money頁面的時候,有一篇關于房地產(chǎn)投資的文章引起了我的好奇心。我決定使用站點的“Rate this article”(評價本文)功能,鼓勵其他的用戶花一點時間來閱讀這篇文章。在我單擊vote按鈕并等待了一會兒之后,整個頁面被刷新,在原來投票問題所在的地方出現(xiàn)了一個漂亮的感謝畫面。

            而Ajax能夠使用戶的體驗更加愉快,它可以提供響應更加靈敏的UI,并消除頁面刷新所帶來的閃爍。目前,由于要刷新整個頁面,需要傳送大量的數(shù)據(jù),因為必須重新發(fā)送整個頁面。如果使用Ajax,服務器可以返回一個包含了感謝信息的500字節(jié)的消息,而不是發(fā)送26,813字節(jié)的消息來刷新整個頁面。即使使用的是高速Internet,傳送26K和1/2K的差別也非常大。同樣重要的是,只需要刷新與投票相關的一小節(jié),而不是刷新整個屏幕。

            讓我們利用Ajax實現(xiàn)自己的基本投票系統(tǒng)。

          原始的Ajax:直接使用XmlHttpRequest

            如上所述,Ajax的核心是JavaScript對象XmlHttpRequest。下面的示例文章評價系統(tǒng)將帶您熟悉Ajax的底層基本知識:http://tearesolutions.com/ajax-demo/raw-ajax.html。注:如果您已經(jīng)在本地WebLogic容器中安裝了ajax-demo.war,可以導航到http://localhost:7001/ajax-demo/raw-ajax.html

            瀏覽應用程序,參與投票,并親眼看它如何運轉。熟悉了該應用程序之后,繼續(xù)閱讀,進一步了解其工作原理細節(jié)。

            首先,您擁有一些簡單的定位點標記,它連接到一個JavaScriptcastVote(rank)函數(shù)。
          function castVote(rank) {
            var url = "/ajax-demo/static-article-ranking.html";
            var callback = processAjaxResponse;
            executeXhr(callback, url);
          }
          

            該函數(shù)為您想要與之通信的服務器資源創(chuàng)建一個URL并調(diào)用內(nèi)部函數(shù)executeXhr,提供一個回調(diào)JavaScript函數(shù),一旦服務器響應可用,該函數(shù)就被執(zhí)行。由于我希望它運行在一個簡單的Apache環(huán)境中,“cast vote URL”只是一個簡單的HTML頁面。在實際情況中,被調(diào)用的URL將記錄票數(shù)并動態(tài)地呈現(xiàn)包含投票總數(shù)的響應。

            下一步是發(fā)出一個XmlHttpRequest請求:
          function executeXhr(callback, url) {
            // branch for native XMLHttpRequest object
            if (window.XMLHttpRequest) {
              req = new XMLHttpRequest();
              req.onreadystatechange = callback;
              req.open("GET", url, true);
              req.send(null);
            } // branch for IE/Windows ActiveX version
            else if (window.ActiveXObject) {
              req = new ActiveXObject("Microsoft.XMLHTTP");
              if (req) {
                req.onreadystatechange = callback;
                req.open("GET", url, true);
                req.send();
              }
            }
          }
          
          

            如您所見,執(zhí)行一個XmlHttpRequest并不簡單,但非常直觀。和平常一樣,在JavaScript領域,大部分的工作量都花在確保瀏覽器兼容方面。在這種情況下,首先要確定XmlHttpRequest是否可用。如果不能用,很可能要使用Internet Explorer,這樣就要使用所提供的ActiveX實現(xiàn)。

          executeXhr()方法中最關鍵的部分是這兩行:

          req.onreadystatechange = callback;
          req.open("GET", url, true);
          

            第一行定義了JavaScript回調(diào)函數(shù),您希望一旦響應就緒它就自動執(zhí)行,而req.open()方法中所指定的“true”標志說明您想要異步執(zhí)行該請求。

            一旦服務器處理完XmlHttpRequest并返回給瀏覽器,使用req.onreadystatechange指派所設置的回調(diào)方法將被自動調(diào)用。
          function processAjaxResponse() {
            // only if req shows "loaded"
            if (req.readyState == 4) {
              // only if "OK"
              if (req.status == 200) {
                502 502'votes').innerHTML = req.responseText;
              } else {
                alert("There was a problem retrieving the XML data:
          " +
                req.statusText);
              }
            }
          } 
          

            該代碼相當簡潔,并且使用了幾個幻數(shù),這使得難以一下子看出發(fā)生了什么。為了弄清楚這一點,下面的表格(引用自http://developer.apple.com/internet/webcontent/xmlhttpreq.html)列舉了常用的XmlHttpRequest對象屬性。

          屬性

          描述

          onreadystatechange

          每次狀態(tài)改變所觸發(fā)事件的事件處理程序

          readyState

          對象狀態(tài)值:

          • 0 = 未初始化(uninitialized)
          • 1 = 正在加載(loading)
          • 2 = 加載完畢(loaded)
          • 3 = 交互(interactive)
          • 4 = 完成(complete)

          responseText

          從服務器進程返回的數(shù)據(jù)的字符串形式

          responseXML

          從服務器進程返回的DOM兼容的文檔數(shù)據(jù)對象

          status

          從服務器返回的數(shù)字代碼,比如404(未找到)或200(就緒)

          statusText

          伴隨狀態(tài)碼的字符串信息

            現(xiàn)在processVoteResponse()函數(shù)開始顯示出其意義了。它首先檢查XmlHttpRequest的整體狀態(tài)以保證它已經(jīng)完成(readyStatus == 4),然后根據(jù)服務器的設定詢問請求狀態(tài)。如果一切正常(status == 200),就使用innerHTML屬性重寫DOM的“votes”節(jié)點的內(nèi)容。

            既然您親眼看到了XmlHttpRequest對象是如何工作的,就讓我們利用一個旨在簡化JavaScript與Java應用程序之間的異步通信的框架來對具體的細節(jié)進行抽象。

          Ajax: DWR方式

            按照與文章評價系統(tǒng)相同的流程,我們將使用Direct Web Remoting(DWR)框架實現(xiàn)同樣的功能。

            假定文章和投票結果存儲在一個數(shù)據(jù)庫中,使用某種對象/關系映射技術來完成抽取工作。為了部署起來盡可能地簡單,我們不會使用數(shù)據(jù)庫進行持久性存儲。此外,為使應用程序盡可能通用,也不使用Web框架。相反,應用程序將從一個靜態(tài)HTML文件開始,可以認為它由服務器動態(tài)地呈現(xiàn)。除了這些簡化措施,應用程序還應該使用Spring Framework關聯(lián)一切,以便輕松看出如何在一個“真實的”應用程序中使用DWR。

            現(xiàn)在應該下載示例應用程序并熟悉它。該應用程序被壓縮為標準的WAR文件,因此您可以把它放置到任何一個Web容器中——無需進行配置。部署完畢之后,就可以導航到http://localhost:7001/ajax_demo/dwr-ajax.html來運行程序。

            可以查看HTML 源代碼,了解它如何工作。給人印象最深的是,代碼如此簡單——所有與服務器的交互都隱藏在JavaScript對象ajaxSampleSvc的后面。更加令人驚訝的是,ajaxSampleSvc服務不是由手工編寫而是完全自動生成的!讓我們繼續(xù),看看這是如何做到的。

          引入DWR

            如同在“原始的Ajax”一節(jié)所演示的那樣,直接使用XmlHttpRequest創(chuàng)建異步請求非常麻煩。不僅JavaScript代碼冗長,而且必須考慮服務器端為定位Ajax請求到適當?shù)姆账枳龅墓ぷ鳎⒔Y果封送到瀏覽器。

            設計DWR的目的是要處理將Web頁面安裝到后端服務上所需的所有信息管道。它是一個Java框架,可以很輕松地將它插入到Web應用程序中,以便JavaScript代碼可以調(diào)用服務器上的服務。它甚至直接與Spring Framework集成,從而允許用戶直接向Web客戶機公開bean。

            DWR真正的巧妙之處是,在用戶配置了要向客戶機公開的服務之后,它使用反射來生成JavaScript對象,以便Web頁面能夠使用這些對象來訪問該服務。然后Web頁面只需接合到生成的JavaScript對象,就像它們是直接使用服務一樣;DWR無縫地處理所有有關Ajax和請求定位的瑣碎細節(jié)。

            讓我們仔細分析一下示例代碼,弄清它是如何工作的。

          應用程序細節(jié):DWR分析

            關于應用程序,首先要注意的是,它是一個標準的Java應用程序,使用分層架構(Layered Architecture)設計模式。使用DWR通過JavaScript公開一些服務并不影響您的設計。

            下面是一個簡單的Java服務,我們將使用DWR框架直接將其向JavaScript代碼公開:

          package com.tearesolutions.service;
          
          public interface AjaxSampleSvc { 
            Article castVote(int rank);
          }
          

            這是一個被簡化到幾乎不可能的程度的例子,其中只有一篇文章可以投票。該服務由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求則依賴于ArticleDao。詳情請參見applicationContext.xml。

            為了把該服務公開為JavaScript對象,需要配置DWR,添加dwr.xml文件到WEB-INF目錄下:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE dwr PUBLIC
           "-//GetAhead Limited//DTD Direct Web Remoting 0.4//EN"
           "http://www.getahead.ltd.uk/dwr/dwr.dtd">
          	
          <dwr>
           <allow>
            <create creator="spring" javascript="ajaxSampleSvc">
             <param name="beanName" value="ajaxSampleSvc" />
            </create>
            <convert converter="bean" match="com.tearesolutions.model.Article"/>
            <exclude method="toString"/>
            <exclude method="setArticleDao"/>
           </allow>
          </dwr>
          

            dwr.xml文件告訴DWR哪些服務是要直接向JavaScript代碼公開的。注意,已經(jīng)要求公開Spring bean ajaxSampleSvc。DWR將自動找到由應用程序設置的SpringApplicationContext。為此,必須使用標準的servlet過濾器ContextLoaderListener來初始化Spring ApplicationContext。

            DWR被設置為一個servlet,所以把它的定義添加到web.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD 
           Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
          
          <web-app>
           <display-name>Ajax Examples</display-name>
          
           <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
           </listener>
          	
           <servlet>
            <servlet-name>ajax_sample</servlet-name>
            <servlet-class>com.tearesolutions.web.AjaxSampleServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
           </servlet>
          
           <servlet>
            <servlet-name>dwr-invoker</servlet-name>
            <display-name>DWR Servlet</display-name>
            <description>Direct Web Remoter Servlet</description>
            <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
            <init-param>
             <param-name>debug</param-name>
             <param-value>true</param-value>
            </init-param>
           </servlet>
          
           <servlet-mapping>
            <servlet-name>ajax_sample</servlet-name>
            <url-pattern>/ajax_sample</url-pattern>
           </servlet-mapping>
          
           <servlet-mapping>
            <servlet-name>dwr-invoker</servlet-name>
            <url-pattern>/dwr/*</url-pattern>
           </servlet-mapping>
          </web-app>
          

            做完這些之后,可以加載http://localhost:7001/ajax-demo/dwr,看看哪些服務可用。結果如下:

          圖3. 可用的服務

            單擊ajaxSampleSvc鏈接,查看有關如何在HTML頁面內(nèi)直接使用服務的示例實現(xiàn)。其中包含的兩個JavaScript文件完成了大部分的功能:
          <script type='text/javascript' 
             src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script>
          <script type='text/javascript' 
             src='/ajax-demo/dwr/engine.js'></script>
          

          ajaxSampleSvc.js是動態(tài)生成的:

          function ajaxSampleSvc() { }
          
          ajaxSampleSvc.castVote = function(callback, p0)
          { 
            DWREngine._execute(callback, '/ajax-demo/dwr', 
           'ajaxSampleSvc', 'castVote', p0);
          }
          

            現(xiàn)在可以使用JavaScript對象ajaxSampleSvc替換所有的XmlHttpRequest代碼,從而重構raw-ajax.html文件。可以在dwr-ajax.html文件中看到改動的結果;下面是新的JavaScript函數(shù):

          function castVote(rank) {
            ajaxSampleSvc.castVote(processResponse, rank);
          }
          function processResponse(data) {
           var voteText = "

          Thanks for Voting!

          " + "

          Current ranking: " + data.voteAverage + " out of 5

          " + "

          Number of votes placed: " + data.numberOfVotes + "

          "; 502 502'votes').innerHTML = voteText; }

            驚人地簡單,不是嗎?由ajaxSampleSvc對象返回的Article域對象序列化為一個JavaScript對象,允許在它上面調(diào)用諸如numberOfVotes()和voteAverage()之類的方法。在動態(tài)生成并插入到DIV元素“votes”中的HTML代碼內(nèi)使用這些數(shù)據(jù)。

          下一步工作

             在后續(xù)文章中,我將繼續(xù)有關Ajax的話題,涉及下面這些方面:

          • Ajax最佳實踐

            像許多技術一樣,Ajax是一把雙刃劍。對于一些用例,其應用程序其實沒有必要使用Ajax,使用了反而有損可用性。我將介紹一些不適合使用的模式,突出說明Ajax的一些消極方面,并展示一些有助于緩和這些消極方面的機制。例如,對Netflix電影瀏覽器來說,Ajax是合適的解決方案嗎?或者,如何提示用戶確實出了一些問題,而再次單擊按鈕也無濟于事?

          • 管理跨請求的狀態(tài)

            在使用Ajax時,最初的文檔DOM會發(fā)生一些變化,并且有大量的頁面狀態(tài)信息存儲在客戶端變量中。當用戶跟蹤一個鏈接到應用程序中的另一個頁面時,狀態(tài)就丟失了。當用戶按照慣例單擊Back按鈕時,呈現(xiàn)給他們的是緩存中的初始頁面。這會使用戶感到非常迷惑!

          • 調(diào)試技巧

            使用JavaScript在客戶端執(zhí)行更多的工作時,如果事情不按預期方式進行,就需要一些調(diào)試工具來幫助弄清出現(xiàn)了什么問題。

          結束語

            本文介紹了Ajax方法,并展示了如何使用它來創(chuàng)建一個動態(tài)且響應靈敏的Web應用程序。通過使用DWR框架,可以輕松地把Ajax融合到站點中,而無需擔心所有必須執(zhí)行的實際管道工作。

            特別感謝Getahead IT咨詢公司的Joe Walker和他的團隊開發(fā)出DWR這樣神奇的工具。感謝你們與世界共享它!

          下載

            本文中演示的應用程序源代碼可供下載:ajax-demo.war(1.52 MB)。

          參考資料

          原文出處

          An Introduction To Ajax

          http://dev2dev.bea.com/pub/a/2005/08/ajax_introduction.html

          posted @ 2006-06-01 16:10 software5168 閱讀(188) | 評論 (0)編輯 收藏

          關于Java用戶界面本地化實例探索

          國際化是使程序具有足夠的靈活性、能在世界上任何地區(qū)運行的過程。國際化所要求的必然結果是地方化――使一個程序能夠運行在特定地區(qū)的過程。本文嘗試用一個簡單的例子來演示Java用戶界面本地化。Java語言內(nèi)核基于Unicode3.0(Java 1.4)提供了對不同國家和不同語言文字的內(nèi)部支持,由于先天的原因,Java對于國際化的支持遠遠要比C/C++來的優(yōu)越。
            
            在我看來本地化必須滿足以下的三個條件:
            
            1、程序必須能讀、寫和操作本地化的文本。
            
            2、程序在顯示日期和時間、使數(shù)字格式化以及排序子串時,必須符合地方習慣。(通過java.text包里面的類可以實現(xiàn)這些要求)
            
            3、所有用戶可見的文本都能在運行時獲得,而不是直接寫入程序中。(通過java.util包里的ResourceBundle類和他的子類可以實現(xiàn)這些要求。)
            
            實現(xiàn)這三個方面可以真正實現(xiàn)程序的國際化。
            
            首先讓我們來了解一下地區(qū)。地區(qū)代表一個地理上、政治上或文化上的區(qū)域。在Java中,地區(qū)由java.util.Locale類表示。地區(qū)常常以一種語言來定義,該語言則由其標準的小寫雙字母代碼表示。(例如:en代表英國,fr代表法國,zh代表中國),但有時候語言是不能代表一個地區(qū)的,那就要在語言后面再加上一個國家或該國家的地域(例如:en_US代表美國,zh_TW)。Locale類保存著一個靜態(tài)的默認地區(qū),它可以用Locale.setDefault()和Locale.getDefault()來設置和查詢。一個程序可以生成和使用任意數(shù)目的非默認Locale對象。
            
            讓我們再來看一下Unicode字符編碼。Java使用Unicode的字符編碼,其本身就是邁向國際化的一大步。Unicode編碼其每個字符都占兩個字節(jié)。用\u****的形式表示。Unicode的字符可以等價于其他編碼的字符(例如:從\u0020到\u007E的字符等價于ASCII和ISO8859-1字符的0x20到0x7E)。
            
            本文主要是對用戶界面地方化,由于我使用的是資源束!所以有必要對資源束作一下解釋。
            
            為定義一束地方化的資源,你需要生成一個ResourceBundle(資源束)的子類并且提供handleGetObject()和getKeys()方法的定義。為了在程序中使用來自ResourceBundle的地方化資源,就需要先調(diào)用靜態(tài)的getBundle()方法,用getBundle()獲得一個ResourceBundle對象,然后再用getObject()方法去按照名字來查找資源。當然也可以使用getString()簡單的把getObject()的返回值分配給一個String對象。GetBundle()方法采用basename_language_country_variait----沒找到的話->basename_language_country----沒找到的話->basename_language----沒找到的話->basename(默認資源文件)的算法尋找合適的資源。如果以上都沒找到的話,則會拋出一個MissingResourceException異常。
            
            現(xiàn)在我們來看一個簡單的例子,如何使Java程序用戶界面地方化的。
            
            首先我們的程序需要查找特定Locale對象關聯(lián)的資源包,所以應該定義一個Local對象,來獲取本地默認的地區(qū)!然后可以調(diào)用ResourceBundle的getBundle方法,并將locale對象作為參數(shù)傳入。
            
            清單一:
            
            Locale locale = Locale.getDefault(); //獲取地區(qū):默認
            //獲取資源束。如未發(fā)現(xiàn)則會拋出MissingResourceException異常
            ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
            
            清單一中的”Properties.Dorian”代表Properties包下以Dorian命名的默認資源文件。這樣就可以使用資源文件了!讓我們來看看資源文件是如何定義的。
            
            清單二:
            
            # Dorian.properties是默認的"Dorian"資源束文件。
            # 作為中國人,我用自己的地區(qū)作為默認
            
            Title=\u4e2d\u56fd;
            red.label=\u7ea2\u8272;
            green.label=\u7eff\u8272;
            blue.label=\u84dd\u8272;
            
            清單三:
            
            # 文件Dorian_en_US.properties,是美國地區(qū)的資源束
            # 它覆蓋了默認資源束
            
            Title=America;
            red.label=Red;
            green.label=Green;
            blue.label=Blue ;
            
            清單一和二定義了一個默認資源文件,和美國地區(qū)的資源文件。其中等號左邊的字符串表示主鍵,它們是唯一的。為了獲得主鍵對應的值,你可以調(diào)用ResourceBundle類的getString方法,并將主鍵作為參數(shù)。此外,文件中以“#”號開頭的行表示注釋行。需要注意的是清單二中的“\u4e2d\u56fd”,它是字符“中國”的Unicode字符碼。是使用Java自帶的native2ascii工具轉換的(native2ascii in.properties out.properties),這是為了不在程序界面中產(chǎn)生亂碼。
            
            清單四:
            
            cmdRed.setText(bundle.getString("red.label"));
            cmdBlue.setText (bundle.getString("blue.label"));
            cmdGreen.setText (bundle.getString("green.label"));
            
            清單二中的cmdRed、cmdBlue、cmdGreen 為按鈕。bundle.getString("red.label")為得到資源文件中主鍵是red.label的值。
            
            好了到此為止Java程序用戶界面的本地化就是這么簡單。不過,要提醒你的是在為用戶界面事件編寫事件監(jiān)聽器代碼時,要格外小心。請看下面這段代碼。
            
            清單五:
            
            public class MyApplet extends Japplet implements ActionListener{
            public void init(){
            JButton cancelButton=new JButton(“Cancel”);
            CancelButton.addActionListener(this);
            ...
            }
            
            public void actionPerformed(ActionEvent e){
            String s=e.getActionCommand();
            if(arg.equals(“Cancel”);
            doCancel();
            else ……
            }
            }
            
            如果你對清單五的代碼不進行本地化,她就可能會運行的很好。但當你的按鈕被本地化為中文時,“Cancel”變?yōu)榱恕叭∠薄_@時就會出現(xiàn)你不愿意看到的問題。下面有三個方法可以消除這個潛在的問題!
            
            1> 使用內(nèi)部類而不使用獨立的actionPerformed程序。
            
            2> 使用引號而不使用標簽來標識組件。
            
            3> 使用name屬性來標識組件
            
            本例稍后的代碼就是采用第一種方法來消除這個問題的。
            
            清單六:完整的代碼
            
            //:MyNative.java
            
            /**
            Copyright (c) 2003 Dorian. All rights reserved
            @(#)MyNative.java 2003-12-21
            @author Dorian
            @version 1.0.0
            visit http://www.Dorian.com/Java/
            */
            
            import java.awt.*;
            import java.awt.event.*;
            import javax.swing.*;
            import java.util.*;
            
            /**
            這是一個將Java程序界面地方化的例子本例采用讀取屬性文件來達到目的
            @see java.util.Locale;
            @see java.util.ResourceBundle;
            @see java.util.MissingResourceException;
            */
            
            public class MyNative{
            public static void main(String[] args){
            JFrame frame = new MyNativeFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
            frame.setVisible(true); // Pop the window up.
            }
            }
            
            class MyNativeFrame extends JFrame{
            public MyNativeFrame(){
            Locale locale = Locale.getDefault();//獲取地區(qū):默認
            //獲取資源束。如未發(fā)現(xiàn)則會拋出MissingResourceException異常
            //"Properties.Dorian"為在Properties下以Dorian為文件名的默認屬性文件
            ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
            setTitle(bundle.getString("Title"));//通過getString()的返回值來設置Title
            setSize(WIDTH,HEIGHT); // Set the window size.
            panel=new MyNativePanel();
            Container contentPane=getContentPane();
            contentPane.add(panel);
            
            //通過獲取資源束中*.label的值對三個按鈕設置其Label
            
            panel.setCmdRed(bundle.getString("red.label"));
            panel.setCmdBlue(bundle.getString("blue.label"));
            panel.setCmdGreen(bundle.getString("green.label"));
            }
            
            private MyNativePanel panel;
            private static final int WIDTH=400;
            private static final int HEIGHT=100;
            }
            
            class MyNativePanel extends JPanel{
            public MyNativePanel(){
            layout=new BorderLayout();
            setLayout(layout);
            
            txt=new JTextField(50);
            add(txt,layout.CENTER);
            cmdRed=new JButton();
            cmdBlue=new JButton();
            cmdGreen=new JButton();
            panel.add(cmdRed);
            panel.add(cmdBlue);
            panel.add(cmdGreen);
            add(panel,layout.SOUTH);
            cmdRed.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            String s = e.getActionCommand();
            txt.setBackground(Color.red);
            txt.setText(s);
            }
            });
            
            cmdBlue.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            String s = e.getActionCommand();
            txt.setBackground(Color.blue);
            txt.setText(s);
            }
            });

          posted @ 2006-05-25 17:40 software5168 閱讀(369) | 評論 (1)編輯 收藏

          Log4j使用

          Log4j基本使用方法

          作者:佚名 ????來自:未知

            Log4j由三個重要的組件構成:日志信息的優(yōu)先級,日志信息的輸出目的地,日志信息的輸出格式。日志信息的優(yōu)先級從高到低有ERROR、WARN、INFO、DEBUG,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。

            一、定義配置文件

            其實您也可以完全不使用配置文件,而是在代碼中配置Log4j環(huán)境。但是,使用配置文件將使您的應用程序更加靈活。Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。下面我們介紹使用Java特性文件做為配置文件的方法:

            1.配置根Logger,其語法為:

            log4j.rootLogger = [ level ] , appenderName, appenderName, …

            其中,level 是日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。Log4j建議只使用四個級別,優(yōu)先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。 appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。

            2.配置日志信息輸出目的地Appender,其語法為:

            log4j.appender.appenderName = fully.qualified.name.of.appender.class
            log4j.appender.appenderName.option1 = value1
            …
            log4j.appender.appenderName.option = valueN

            其中,Log4j提供的appender有以下幾種:
            org.apache.log4j.ConsoleAppender(控制臺),
            org.apache.log4j.FileAppender(文件),
            org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個日志文件),
            org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產(chǎn)生一個新的文件),
            org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)

            3.配置日志信息的格式(布局),其語法為:

            log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
            log4j.appender.appenderName.layout.option1 = value1
            …
            log4j.appender.appenderName.layout.option = valueN

            其中,Log4j提供的layout有以下幾種:
            org.apache.log4j.HTMLLayout(以HTML表格形式布局),
            org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
            org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
            org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間、線程、類別等等信息)

            Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下: %m 輸出代碼中指定的消息

            %p 輸出優(yōu)先級,即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
            %r 輸出自應用啟動到輸出該log信息耗費的毫秒數(shù)
            %c 輸出所屬的類目,通常就是所在類的全名
            %t 輸出產(chǎn)生該日志事件的線程名
            %n 輸出一個回車換行符,Windows平臺為“\r\n”,Unix平臺為“\n”
            %d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
            %l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java:10)

            二、在代碼中使用Log4j

            1.得到記錄器

            使用Log4j,第一步就是獲取日志記錄器,這個記錄器將負責控制日志信息。其語法為:

            public static Logger getLogger( String name)

            通過指定的名字獲得記錄器,如果必要的話,則為這個名字創(chuàng)建一個新的記錄器。Name一般取本類的名字,比如:

            static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

            2.讀取配置文件

            當獲得了日志記錄器之后,第二步將配置Log4j環(huán)境,其語法為:

            BasicConfigurator.configure (): 自動快速地使用缺省Log4j環(huán)境。
            PropertyConfigurator.configure ( String configFilename) :讀取使用Java的特性文件編寫的配置文件。
            DOMConfigurator.configure ( String filename ) :讀取XML形式的配置文件。

            3.插入記錄信息(格式化日志信息)

            當上兩個必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:

            Logger.debug ( Object message ) ;
            Logger.info ( Object message ) ;
            Logger.warn ( Object message ) ;
            Logger.error ( Object message ) ;

          posted @ 2006-05-24 14:37 software5168 閱讀(546) | 評論 (1)編輯 收藏

          Http協(xié)議

          眾所周知,Internet的基本協(xié)議是TCP/IP協(xié)議,目前廣泛采用的FTP、Archie Gopher等是建立在TCP/IP協(xié)議之上的應用層協(xié)議,不同的協(xié)議對應著不同的應用。
            WWW服務器使用的主要協(xié)議是HTTP協(xié)議,即超文體傳輸協(xié)議。由于HTTP協(xié)議支持的服務不限于WWW,還可以是其它服務,因而HTTP協(xié)議允許用戶在統(tǒng)一的界面下,采用不同的協(xié)議訪問不同的服務,如FTP、Archie、SMTP、NNTP等。另外,HTTP協(xié)議還可用于名字服務器和分布式對象管理。

          2.1 HTTP協(xié)議簡介
            HTTP是一個屬于應用層的面向對象的協(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。
            HTTP協(xié)議的主要特點可概括如下:
          1.支持客戶/服務器模式。
          2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同。
          由于HTTP協(xié)議簡單,使得HTTP服務器的程序規(guī)模小,因而通信速度很快。
          3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。
          4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
          5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

          2.2 HTTP協(xié)議的幾個重要概念
            1.連接(Connection):一個傳輸層的實際環(huán)流,它是建立在兩個相互通訊的應用程序之間。
            2.消息(Message):HTTP通訊的基本單位,包括一個結構化的八元組序列并通過連接傳輸。
            3.請求(Request):一個從客戶端到服務器的請求信息包括應用于資源的方法、資源的標識符和協(xié)議的版本號
            4.響應(Response):一個從服務器返回的信息包括HTTP協(xié)議的版本號、請求的狀態(tài)(例如“成功”或“沒找到”)和文檔的MIME類型。
            5.資源(Resource):由URI標識的網(wǎng)絡數(shù)據(jù)對象或服務。
            6.實體(Entity):數(shù)據(jù)資源或來自服務資源的回映的一種特殊表示方法,它可能被包圍在一個請求或響應信息中。一個實體包括實體頭信息和實體的本身內(nèi)容。
            7.客戶機(Client):一個為發(fā)送請求目的而建立連接的應用程序。
            8.用戶代理(User agent):初始化一個請求的客戶機。它們是瀏覽器、編輯器或其它用戶工具。
            9.服務器(Server):一個接受連接并對請求返回信息的應用程序。
            10.源服務器(Origin server):是一個給定資源可以在其上駐留或被創(chuàng)建的服務器。
            11.代理(Proxy):一個中間程序,它可以充當一個服務器,也可以充當一個客戶機,為其它客戶機建立請求。請求是通過可能的翻譯在內(nèi)部或經(jīng)過傳遞到其它的服務器中。一個代理在發(fā)送請求信息之前,必須解釋并且如果可能重寫它。
            代理經(jīng)常作為通過防火墻的客戶機端的門戶,代理還可以作為一個幫助應用來通過協(xié)議處理沒有被用戶代理完成的請求。
            12.網(wǎng)關(Gateway):一個作為其它服務器中間媒介的服務器。與代理不同的是,網(wǎng)關接受請求就好象對被請求的資源來說它就是源服務器;發(fā)出請求的客戶機并沒有意識到它在同網(wǎng)關打交道。
            網(wǎng)關經(jīng)常作為通過防火墻的服務器端的門戶,網(wǎng)關還可以作為一個協(xié)議翻譯器以便存取那些存儲在非HTTP系統(tǒng)中的資源。
            13.通道(Tunnel):是作為兩個連接中繼的中介程序。一旦激活,通道便被認為不屬于HTTP通訊,盡管通道可能是被一個HTTP請求初始化的。當被中繼的連接兩端關閉時,通道便消失。當一個門戶(Portal)必須存在或中介(Intermediary)不能解釋中繼的通訊時通道被經(jīng)常使用。
            14.緩存(Cache):反應信息的局域存儲。

          2.3 HTTP協(xié)議的運作方式
            HTTP協(xié)議是基于請求/響應范式的。一個客戶機與服務器建立連接后,發(fā)送一個請求給服務器,請求方式的格式為,統(tǒng)一資源標識符、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可能的內(nèi)容。服務器接到請求后,給予相應的響應信息,其格式為一個狀態(tài)行包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內(nèi)容。
            許多HTTP通訊是由一個用戶代理初始化的并且包括一個申請在源服務器上資源的請求。最簡單的情況可能是在用戶代理(UA)和源服務器(O)之間通過一個單獨的連接來完成(見圖2-1)。
          圖2-1
            當一個或多個中介出現(xiàn)在請求/響應鏈中時,情況就變得復雜一些。中介由三種:代理(Proxy)、網(wǎng)關(Gateway)和通道(Tunnel)。一個代理根據(jù)URI的絕對格式來接受請求,重寫全部或部分消息,通過URI的標識把已格式化過的請求發(fā)送到服務器。網(wǎng)關是一個接收代理,作為一些其它服務器的上層,并且如果必須的話,可以把請求翻譯給下層的服務器協(xié)議。一個通道作為不改變消息的兩個連接之間的中繼點。當通訊需要通過一個中介(例如:防火墻等)或者是中介不能識別消息的內(nèi)容時,通道經(jīng)常被使用。 圖2-2
            上面的圖2-2表明了在用戶代理(UA)和源服務器(O)之間有三個中介(A,B和C)。一個通過整個鏈的請求或響應消息必須經(jīng)過四個連接段。這個區(qū)別是重要的,因為一些HTTP通訊選擇可能應用于最近的連接、沒有通道的鄰居,應用于鏈的終點或應用于沿鏈的所有連接。盡管圖2-2是線性的,每個參與者都可能從事多重的、并發(fā)的通訊。例如,B可能從許多客戶機接收請求而不通過A,并且/或者不通過C把請求送到A,在同時它還可能處理A的請求。
            任何針對不作為通道的匯聚可能為處理請求啟用一個內(nèi)部緩存。緩存的效果是請求/響應鏈被縮短,條件是沿鏈的參與者之一具有一個緩存的響應作用于那個請求。下圖說明結果鏈,其條件是針對一個未被UA或A加緩存的請求,B有一個經(jīng)過C來自O的一個前期響應的緩存拷貝。
          圖2-3
            在Internet上,HTTP通訊通常發(fā)生在TCP/IP連接之上。缺省端口是TCP 80,但其它的端口也是可用的。但這并不預示著HTTP協(xié)議在Internet或其它網(wǎng)絡的其它協(xié)議之上才能完成。HTTP只預示著一個可靠的傳輸。
            以上簡要介紹了HTTP協(xié)議的宏觀運作方式,下面介紹一下HTTP協(xié)議的內(nèi)部操作過程。
            首先,簡單介紹基于HTTP協(xié)議的客戶/服務器模式的信息交換過程,如圖2-4所示,它分四個過程,建立連接、發(fā)送請求信息、發(fā)送響應信息、關閉連接。
          圖2-4
            在WWW中,“客戶”與“服務器”是一個相對的概念,只存在于一個特定的連接期間,即在某個連接中的客戶在另一個連接中可能作為服務器。WWW服務器運行時,一直在TCP80端口(WWW的缺省端口)監(jiān)聽,等待連接的出現(xiàn)。
            下面,討論HTTP協(xié)議下客戶/服務器模式中信息交換的實現(xiàn)。   1.建立連接   連接的建立是通過申請?zhí)捉幼?Socket)實現(xiàn)的。客戶打開一個套接字并把它約束在一個端口上,如果成功,就相當于建立了一個虛擬文件。以后就可以在該虛擬文件上寫數(shù)據(jù)并通過網(wǎng)絡向外傳送。
            2.發(fā)送請求
            打開一個連接后,客戶機把請求消息送到服務器的停留端口上,完成提出請求動作。
            HTTP/1.0  請求消息的格式為:
            請求消息=請求行(通用信息|請求頭|實體頭) CRLF[實體內(nèi)容]
            請求 行=方法 請求URL HTTP版本號 CRLF
            方  法=GET|HEAD|POST|擴展方法
            U R  L=協(xié)議名稱+宿主名+目錄與文件名
            請求行中的方法描述指定資源中應該執(zhí)行的動作,常用的方法有GET、HEAD和POST。不同的請求對象對應GET的結果是不同的,對應關系如下:
            對象      GET的結果
            文件      文件的內(nèi)容
            程序      該程序的執(zhí)行結果
            數(shù)據(jù)庫查詢   查詢結果
            HEAD——要求服務器查找某對象的元信息,而不是對象本身。
            POST——從客戶機向服務器傳送數(shù)據(jù),在要求服務器和CGI做進一步處理時會用到POST方法。POST主要用于發(fā)送HTML文本中FORM的內(nèi)容,讓CGI程序處理。
            一個請求的例子為:
            GET http://networking.zju.edu.cn/zju/index.htm HTTP/1.0
            頭信息又稱為元信息,即信息的信息,利用元信息可以實現(xiàn)有條件的請求或應答 。
            請求頭——告訴服務器怎樣解釋本次請求,主要包括用戶可以接受的數(shù)據(jù)類型、壓縮方法和語言等。
            實體頭——實體信息類型、長度、壓縮方法、最后一次修改時間、數(shù)據(jù)有效期等。
            實體——請求或應答對象本身。
            3.發(fā)送響應
            服務器在處理完客戶的請求之后,要向客戶機發(fā)送響應消息。
            HTTP/1.0的響應消息格式如下:
            響應消息=狀態(tài)行(通用信息頭|響應頭|實體頭) CRLF 〔實體內(nèi)容〕
            狀 態(tài) 行=HTTP版本號 狀態(tài)碼 原因敘述
            狀態(tài)碼表示響應類型
            1××  保留
            2××  表示請求成功地接收
            3××  為完成請求客戶需進一步細化請求
            4××  客戶錯誤
            5××  服務器錯誤
            響應頭的信息包括:服務程序名,通知客戶請求的URL需要認證,請求的資源何時能使用。
            4.關閉連接
            客戶和服務器雙方都可以通過關閉套接字來結束TCP/IP對話

          posted @ 2006-05-12 15:38 software5168 閱讀(314) | 評論 (0)編輯 收藏

          weblogc8.1第一個.war例子

          1)安裝 bea weblogic8.1 server版本。(server812_win32.exe)
          ?2)在安裝中一般的按默認值設置
          ?3)安裝完成后,在開始菜單中找到weblogic的安裝目錄下的“Configuration Wizard”,
          點擊進入,開始創(chuàng)建一個新的weblogic Configuration.一般的都可以采取默認值,其中要設置服務器密碼(如果式第一次使用),完成后可運行“starweblogic.cmd”;
          4)如果要簡單的使用一個符合基本web應用結構的文件夾,可以拷貝到%weblogic_home%/user_projects\domains\mydomain\applications
          5)重啟startweblogc.cmd
          6)在瀏覽器中輸入:http://localhost:7001/你的web應用的文件夾結構。
          7)如果要配置weblogic服務器的一些系統(tǒng)信息。可以登陸http://localhost:7001/console
          輸入用戶名和密碼進行登陸配置,在其中可以進行許多的web應用的部署。

          在weblogic的控制臺部署一個web應用(WAR),

          1)我發(fā)現(xiàn)既可以直接如上面的那樣把web的應用結構文件夾拷貝使用,也可以使用war包部署
          2)首先使用java的jar命令來進行壓縮(我發(fā)現(xiàn)weblogic不能識別jar包,不明白為什么)
          3)jar命令很簡單,詳細,可以輸入jar回車看jdk的中文幫助。
          如:(不知道我得jdk環(huán)境出了什么問題,不能識別jar外部命令,只好使用引用路徑)
          D:\j2sdk1.4\bin\web>d:\j2sdk1.4\bin\jar cvf web.war *.*
          //說明:使用jar命令把當前目錄下的所有文件(必須有web-inf文件夾)壓縮為web.war,其中cvf表示:
          ?//創(chuàng)建一個新的存檔/生成詳細輸出到標準輸出上/指定存檔文件名(即web.war)
          4)拷貝該文件到weblogic_home%/user_projects\domains\mydomain\applications\,
          5)登陸weblogic的控制臺console,在左側點擊mydomain/deployment/web/application Modules點擊后,在右側
          瀏覽到你的web.war文件,選中他,點擊deploy,如果沒有紅色的提示,表示部署成功,反之,檢查你的war文件是否正確。
          6)部署中你要輸入一個名字,用來管理。默認即可,重啟服務器,在瀏覽器中輸入:http://localhost:70001/web/你的具體目錄。
          進行訪問,如果能看到你的jsp說明一切ok。

          posted @ 2006-05-12 13:24 software5168 閱讀(666) | 評論 (0)編輯 收藏

          ANT的第二個例子

          項目結構﹕
          test3
          ???src
          ??????Test.java
          ???build.xml

          1.Test.java
          public class Test{
          ?public static void main(String[] args){
          ??System.out.println("ok!!!!!!!!");
          ?}
          }

          2.build.xml
          <?xml version="1.0"?>
          <project default="dist" name="Project">
          <description>
          ?project discription!!
          </description>

          <property name="srcDir" location="src"/>
          <property name="buildDir" location="build"/>
          <property name="distDir" location="dist"/>

          <target name="init">
          ?<tstamp/>
          ?<mkdir dir="${buildDir}"/>
          ?<mkdir dir="${distDir}"/>
          </target>

          <target name="compile" depends="init">
          ?<javac srcdir="${srcDir}" destdir="${buildDir}"/>
          </target>

          <target name="dist" depends="compile">
          ?<jar destfile="${distDir}/package-${DSTAMP}.jar" basedir="${buildDir}">
          ??<manifest>
          ???<attribute name="Built-By" value="${user.name}"/>
          ???<attribute name="Main-Class" value="package.Main"/>
          ??</manifest>
          ?</jar>
          ?<jar destfile="${distDir}/package-src-${DSTAMP}.jar" basedir="${srcDir}"/>
          </target>

          <target name="clean">
          ?<delete dir="${buildDir}"/>
          ?<delete dir="${distDir}"/>
          </target>
          </project>

          posted @ 2006-05-08 16:22 software5168 閱讀(159) | 評論 (0)編輯 收藏

          最簡單的ANT例子

          項目結構:
          test1
          ???src
          ??????test1
          ???WEB-INF
          ??????classes
          ???build.xml

          1.build.xml
          <?xml version="1.0"?>
          <project name="project" default="run" basedir=".">
          <target name="compile">
          ?<javac destdir="WEB-INF/classes" srcdir="src"></javac>
          </target>
          <target name="run" depends="compile">
          ?<java classname="test1.Hello" classpath="WEB-INF/classes"></java>
          </target>
          </project>
          ??????
          2.Hello.java?
          package test1;
          public class Hello{
          ?public static void main(String[] arg){
          ??System.out.println("hello world!!!!!!");
          ?}
          }

          命令行中輸入ant運行??

          posted @ 2006-05-08 14:21 software5168 閱讀(900) | 評論 (1)編輯 收藏

          Java學習第一步------環(huán)境配置

          1.下載安裝JDK1.4.2
          2.下載安裝Tomcat5
          3.下載安裝Eclipse3.1
          4.下載安裝MyEclipse4.0
          5.下載安裝ANT1.6.5
          6.配置環(huán)境變量﹕
          ??(1)?JAVA_HOME???D:\j2sdk1.4.2_10
          ???(2)CLASSPATH???.;D:\j2sdk1.4.2_10\lib\tools.jar;D:\j2sdk1.4.2_10\lib\dt.jar
          ? (3)ANT_HOME E:\javaLib\apache-ant-1.6.5
          ???(4)PATH??????%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\system32\Wbem;D:\j2sdk1.4.2_10\bin; E:\javaLib\apache-ant-1.6.5\bin
          ???(5)CALALINA_HOME???D:\Tomcat 5.0
          ??????註:(5)為可選﹐不配置也可以
          7.eclipse,myeclipse配置﹕
          ???(1)window/preferences/java/installed jres 新增jre﹐例如D:\j2sdk1.4.2_10, 並打勾
          ???(2)window/preferences/myeclipse/application servers/Tomcat5.0 單選設置為enable﹐路徑為D:\Tomcat 5.0
          ???(3)window/preferences/myeclipse/database explorer/drivers?新增MySQL Connector/J Driver﹐example URL﹕jdbc:mysql://localhost:3306/shop﹐driver class name﹕com.mysql.jdbc.Driver﹐driver libraries﹕D:\Borland\Together\Architect2006\eclipse\mysql-connector-java-3.0.16-ga-bin.jar???
          ???註:(3)中shop為數(shù)據(jù)庫名字﹐可根據(jù)情況變化﹔driver libraries中路徑為mysql驅動包地址


          ??????????????????????????????

          posted @ 2006-05-08 08:56 software5168 閱讀(381) | 評論 (0)編輯 收藏

          Java常用軟件下載地址

          J2SE,JSF??http://java.sun.com/
          Spring???http://www.springframework.org/
          Eclipse???http://www.eclipse.org/
          Ant,Tomcat???http://projects.apache.org/indexes.html
          Log4j???http://logging.apache.org/
          Hibernate???http://www.hibernate.org/
          MySQL http://www.mysql.com/

          posted @ 2006-04-30 08:33 software5168 閱讀(320) | 評論 (0)編輯 收藏

          僅列出標題
          共2頁: 上一頁 1 2 
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          JAVA學習網(wǎng)站

          綜合

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 梓潼县| 宣城市| 华亭县| 福建省| 绩溪县| 萍乡市| 拜城县| 志丹县| 澄城县| 汝南县| 天祝| 辽阳县| 阳春市| 同心县| 神池县| 江山市| 洛扎县| 日喀则市| 正镶白旗| 南阳市| 新建县| 汝南县| 太仓市| 南投县| 赤水市| 玉林市| 竹山县| 原平市| 洱源县| 富锦市| 广河县| 益阳市| 民和| 昌邑市| 成安县| 武平县| 当雄县| 峨边| 德保县| 剑阁县| 庆城县|