生命是一種過程

          事情的結果盡管重要,但是做事情的過程更加重要,因為結果好了我們會更加快樂,但過程使我們的生命充實!
          posts - 13, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2005年12月19日

          轉自 http://blog.csdn.net/arcow/

          在b/s開發中經常用到的javaScript技術?
          一、驗證類
          1、數字驗證內
          ? 1.1 整數
          ? 1.2 大于0的整數 (用于傳來的ID的驗證)
          ? 1.3 負整數的驗證
          ? 1.4 整數不能大于iMax
          ? 1.5 整數不能小于iMin
          2、時間類
          ? 2.1 短時間,形如 (13:04:06)
          ? 2.2 短日期,形如 (2003-12-05)
          ? 2.3 長時間,形如 (2003-12-05 13:04:06)
          ? 2.4 只有年和月。形如(2003-05,或者2003-5)
          ? 2.5 只有小時和分鐘,形如(12:03)
          3、表單類
          ? 3.1 所有的表單的值都不能為空
          ? 3.2 多行文本框的值不能為空。
          ? 3.3 多行文本框的值不能超過sMaxStrleng
          ? 3.4 多行文本框的值不能少于sMixStrleng
          ? 3.5 判斷單選框是否選擇。
          ? 3.6 判斷復選框是否選擇.
          ? 3.7 復選框的全選,多選,全不選,反選
          ? 3.8 文件上傳過程中判斷文件類型
          4、字符類
          ? 4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
          ? 4.2 判斷字符由字母和數字組成。
          ? 4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
          ? 4.4 字符串替換函數.Replace();
          5、瀏覽器類
          ? 5.1 判斷瀏覽器的類型
          ? 5.2 判斷ie的版本
          ? 5.3 判斷客戶端的分辨率
          ?
          6、結合類
          ? 6.1 email的判斷。
          ? 6.2 手機號碼的驗證
          ? 6.3 身份證的驗證
          ?

          二、功能類

          1、時間與相關控件類
          ? 1.1 日歷
          ? 1.2 時間控件
          ? 1.3 萬年歷
          ? 1.4 顯示動態顯示時鐘效果(文本,如OA中時間)
          ? 1.5 顯示動態顯示時鐘效果 (圖像,像手表)
          2、表單類
          ? 2.1 自動生成表單
          ? 2.2 動態添加,修改,刪除下拉框中的元素
          ? 2.3 可以輸入內容的下拉框
          ? 2.4 多行文本框中只能輸入iMax文字。如果多輸入了,自動減少到iMax個文字(多用于短信發送)
          ?
          3、打印類
          ? 3.1 打印控件
          4、事件類
          ? 4.1 屏蔽右鍵
          ? 4.2 屏蔽所有功能鍵
          ? 4.3 --> 和<-- F5 F11,F9,F1
          ? 4.4 屏蔽組合鍵ctrl+N
          5、網頁設計類
          ? 5.1 連續滾動的文字,圖片(注意是連續的,兩段文字和圖片中沒有空白出現)
          ? 5.2 html編輯控件類
          ? 5.3 顏色選取框控件
          ? 5.4 下拉菜單
          ? 5.5 兩層或多層次的下拉菜單
          ? 5.6 仿IE菜單的按鈕。(效果如rongshuxa.com的導航欄目)
          ? 5.7 狀態欄,title欄的動態效果(例子很多,可以研究一下)
          ? 5.8 雙擊后,網頁自動滾屏
          6、樹型結構。
          ? 6.1 asp+SQL版
          ? 6.2 asp+xml+sql版
          ? 6.3 java+sql或者java+sql+xml
          7、無邊框效果的制作
          8、連動下拉框技術
          9、文本排序


          一、驗證類
          1、數字驗證內
          ? 1.1 整數
          ????? /^(-|+)?d+$/.test(str)
          ? 1.2 大于0的整數 (用于傳來的ID的驗證)
          ????? /^d+$/.test(str)
          ? 1.3 負整數的驗證
          ????? /^-d+$/.test(str)
          2、時間類
          ? 2.1 短時間,形如 (13:04:06)
          ????? function isTime(str)
          ????? {
          ??????? var a = str.match(/^(d{1,2})(:)?(d{1,2})2(d{1,2})$/);
          ??????? if (a == null) {alert('輸入的參數不是時間格式'); return false;}
          ??????? if (a[1]>24 || a[3]>60 || a[4]>60)
          ??????? {
          ????????? alert("時間格式不對");
          ????????? return false
          ??????? }
          ??????? return true;
          ????? }
          ? 2.2 短日期,形如 (2003-12-05)
          ????? function strDateTime(str)
          ????? {
          ???????? var r = str.match(/^(d{1,4})(-|/)(d{1,2})2(d{1,2})$/);
          ???????? if(r==null)return false;
          ???????? var d= new Date(r[1], r[3]-1, r[4]);
          ???????? return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
          ????? }
          ? 2.3 長時間,形如 (2003-12-05 13:04:06)
          ????? function strDateTime(str)
          ????? {
          ??????? var reg = /^(d{1,4})(-|/)(d{1,2})2(d{1,2}) (d{1,2}):(d{1,2}):(d{1,2})$/;
          ??????? var r = str.match(reg);
          ??????? if(r==null)return false;
          ??????? var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
          ??????? return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
          ????? }
          ? 2.4 只有年和月。形如(2003-05,或者2003-5)
          ? 2.5 只有小時和分鐘,形如(12:03)
          3、表單類
          ? 3.1 所有的表單的值都不能為空
          ????? <input onblur="if(this.value.replace(/^s+|s+$/g,'')=='')alert('不能為空!')">
          ? 3.2 多行文本框的值不能為空。
          ? 3.3 多行文本框的值不能超過sMaxStrleng
          ? 3.4 多行文本框的值不能少于sMixStrleng
          ? 3.5 判斷單選框是否選擇。
          ? 3.6 判斷復選框是否選擇.
          ? 3.7 復選框的全選,多選,全不選,反選
          ? 3.8 文件上傳過程中判斷文件類型
          4、字符類
          ? 4.1 判斷字符全部由a-Z或者是A-Z的字字母組成
          ????? <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有錯')">
          ? 4.2 判斷字符由字母和數字組成。
          ????? <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有錯')">
          ? 4.3 判斷字符由字母和數字,下劃線,點號組成.且開頭的只能是下劃線和字母
          ????? /^([a-zA-z_]{1})([w]*)$/g.test(str)
          ? 4.4 字符串替換函數.Replace();
          5、瀏覽器類
          ? 5.1 判斷瀏覽器的類型
          ????? window.navigator.appName
          ? 5.2 判斷ie的版本
          ????? window.navigator.appVersion
          ? 5.3 判斷客戶端的分辨率
          ????? window.screen.height;? window.screen.width;
          ?
          6、結合類
          ? 6.1 email的判斷。
          ????? function ismail(mail)
          ????? {
          ??????? return(new RegExp(/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/).test(mail));
          ????? }
          ? 6.2 手機號碼的驗證
          ? 6.3 身份證的驗證
          ????? function isIdCardNo(num)
          ????? {
          ??????? if (isNaN(num)) {alert("輸入的不是數字!"); return false;}
          ??????? var len = num.length, re;
          ??????? if (len == 15)
          ????????? re = new RegExp(/^(d{6})()?(d{2})(d{2})(d{2})(d{3})$/);
          ??????? else if (len == 18)
          ????????? re = new RegExp(/^(d{6})()?(d{4})(d{2})(d{2})(d{3})(d)$/);
          ??????? else {alert("輸入的數字位數不對!"); return false;}
          ??????? var a = num.match(re);
          ??????? if (a != null)
          ??????? {
          ????????? if (len==15)
          ????????? {
          ??????????? var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
          ??????????? var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          ????????? }
          ????????? else
          ????????? {
          ??????????? var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
          ??????????? var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
          ????????? }
          ????????? if (!B) {alert("輸入的身份證號 "+ a[0] +" 里出生日期不對!"); return false;}
          ??????? }
          ??????? return true;
          ????? }

          3.7 復選框的全選,多選,全不選,反選
          <form name=hrong>
          <input type=checkbox name=All onclick="checkAll('mm')">全選<br/>
          <input type=checkbox name=mm onclick="checkItem('All')"><br/>
          <input type=checkbox name=mm onclick="checkItem('All')"><br/>
          <input type=checkbox name=mm onclick="checkItem('All')"><br/>
          <input type=checkbox name=mm onclick="checkItem('All')"><br/>
          <input type=checkbox name=mm onclick="checkItem('All')"><br/><br/>


          <input type=checkbox name=All2 onclick="checkAll('mm2')">全選<br/>
          <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
          <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
          <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
          <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
          <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>

          </form>

          <SCRIPT LANGUAGE="JavaScript">
          function checkAll(str)
          {
          ? var a = document.getElementsByName(str);
          ? var n = a.length;
          ? for (var i=0; i<n; i++)
          ? a[i].checked = window.event.srcElement.checked;
          }
          function checkItem(str)
          {
          ? var e = window.event.srcElement;
          ? var all = eval("document.hrong."+ str);
          ? if (e.checked)
          ? {
          ??? var a = document.getElementsByName(e.name);
          ??? all.checked = true;
          ??? for (var i=0; i<a.length; i++)
          ??? {
          ????? if (!a[i].checked){ all.checked = false; break;}
          ??? }
          ? }
          ? else all.checked = false;
          }
          </SCRIPT>

          3.8 文件上傳過程中判斷文件類型
          <input type=file onchange="alert(this.value.match(/^(.*)(.)(.{1,8})$/)[3])">

          畫圖:
          <OBJECT
          id=S
          style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px"
          height=240
          width=392
          classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">
          </OBJECT>
          <SCRIPT>
          S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);
          S.DrawingSurface.ArcRadians(30,0,0,30,50,60);
          S.DrawingSurface.Line(10,10,100,100);
          </SCRIPT>

          posted @ 2006-04-28 09:47 隱語者 閱讀(247) | 評論 (0)編輯 收藏

          壓縮解壓
          linux下怎么解后綴名是gzip的文件?
          1.以.a為擴展名的文件:
          #tar xv file.a

          2.以.z為擴展名的文件:
          #uncompress file.Z

          3.以.gz為擴展名的文件:
          #gunzip file.gz

          4.以.bz2為擴展名的文件:
          #bunzip2 file.bz2

          5.以.tar.Z為擴展名的文件:
          #tar xvZf file.tar.Z
          或 #compress -dc file.tar.Z | tar xvf -

          6.以.tar.gz/.tgz為擴展名的文件:
          #tar xvzf file.tar.gz
          或 gzip -dc file.tar.gz | tar xvf -

          7.以.tar.bz2為擴展名的文件:
          #tar xvIf file.tar.bz2
          或 bzip2 -dc file.tar.bz2 | xvf -

          8.以.cpio.gz/.cgz為擴展名的文件:
          #gzip -dc file.cgz | cpio -div

          9.以.cpio/cpio為擴展名的文件:
          #cpio -div file.cpio
          或cpio -divc file.cpio

          10.以.rpm為擴展名的文件安裝:
          #rpm -i file.rpm

          11.以.rpm為擴展名的文件解壓縮:
          #rpm2cpio file.rpm | cpio -div

          12.以.deb為擴展名的文件安裝:
          #dpkg -i file.deb

          13.以.deb為擴展名的文件解壓縮:
          #dpkg-deb --fsys-tarfile file.deb | tar xvf - ar p
          file.deb data.tar.gz | tar xvzf -

          14.以.zip為擴展名的文件:
          #unzip file.zip
          在linux下解壓Winzip格式的文件
            要是裝了jdk的話,可以用jar命令;還可以使用unzip命令。
          直接解壓.tar.gz文件
            xxxx.tar.gz文件使用tar帶zxvf參數,可以一次解壓開。XXXX為文件名。 例如:
          $tar zxvf xxxx.tar.gz 各種壓縮文件的解壓(安裝方法)

          文件擴展名 解壓(安裝方法)

          .a ar xv file.a
          .Z uncompress file.Z
          .gz gunzip file.gz
          .bz2 bunzip2 file.bz2
          .tar.Z tar xvZf file.tar.Z
          compress -dc file.tar.Z | tar xvf -
          .tar.gz/.tgz tar xvzf file.tar.gz
          gzip -dc file.tar.gz | tar xvf -
          .tar.bz2 tar xvIf file.tar.bz2
          bzip2 -dc file.tar.bz2 | xvf -
          .cpio.gz/.cgz gzip -dc file.cgz | cpio -div
          .cpio/cpio cpio -div file.cpio
          cpio -divc file.cpio
          .rpm/install rpm -i file.rpm
          .rpm/extract rpm2cpio file.rpm | cpio -div
          .deb/install dpkg -i file.deb
          .deb/exrtact dpkg-deb --fsys-tarfile file.deb | tar xvf -
          ar p file.deb data.tar.gz | tar xvzf -
          .zip unzip file.zip

          bzip2 -d myfile.tar.bz2 | tar xvf

          tar xvfz myfile.tar.bz2

          x 是解壓
          v 是復雜輸出
          f 是指定文件
          z gz格式

          gzip
          gzip[選項]要壓縮(或解壓縮)的文件名
          -c將輸出寫到標準輸出上,并保留原有文件。
          -d將壓縮文件壓縮。
          -l對每個壓縮文件,顯示下列字段:壓縮文件的大小,未壓縮文件的大小、壓縮比、未壓縮文件的名字
          -r遞歸式地查找指定目錄并壓縮或壓縮其中的所有文件。
          -t測試壓縮文件是正完整。
          -v對每一個壓縮和解壓縮的文件,顯示其文件名和壓縮比。
          -num-用指定的數字調整壓縮的速度。
          舉例:
          把/usr目錄并包括它的子目錄在內的全部文件做一備份,備份文件名為usr.tar
          tar cvf usr.tar /home
          把/usr 目錄并包括它的子目錄在內的全部文件做一備份并進行壓縮,備份文件名是usr.tar.gz
          tar czvf usr.tar.gz /usr
          壓縮一組文件,文件的后綴為tar.gz
          #tar cvf back.tar /back/
          #gzip -q back.tar
          or
          #tar cvfz back.tar.gz /back/
          釋放一個后綴為tar.gz的文件。
          #tar zxvf back.tar.gz
          #gzip back.tar.gz
          #tar xvf back.tar

          tar的使用方法:


          1:壓縮一組文件為tar.gz后綴
          tar cvf backup.tar /etc
          或gzip -q backup.tar.gz

          2:釋放一個后綴為tar.gz的文件
          gunzip backup.tar.gz
          或tar xvf backup.tar

          3:用一個命令完成壓縮
          tar cvf -/etc | gzip -qc > backup.tar.gz

          4:用一個命令完成釋放
          gunzip -c backup.tar.gz | tar xvf -

          5:如何解開ta.Z的文件
          tar xvfz backup.tar.Z
          或uncompress backup.tar.Z
          tar xvf backup.tar

          6:如何解開.tgz文件
          gunzip backup.tgz

          7:如何壓縮和解壓縮.bz2的包
          bzip2 /etc/smb.conf 這將壓縮文件smb.conf成smb.conf.bz2
          bunzip2 /etc/smb.conf.bz2 在當前目錄下還原smb.conf.bz2為smb.conf

          posted @ 2006-01-25 14:28 隱語者 閱讀(658) | 評論 (0)編輯 收藏

          # /etc/hosts :“hosts”文件,定義了主機名和ip地址的對應,其中也有將要運行dns這臺電腦的ip地址和主機名。內容:
          127.0.0.1 localhost.localdomain localhost

          #/etc/host.conf :“host.conf”文件,"order hosts bind"語句,指定了對主機名的解析順序是先到hosts中查找,然后到dns服務器的記錄里查找。“multi on”則是允許一個主機名對應多個ip地址。內容:
          order hosts, bind
          multi on
          nospoof on

          #/etc/resolv.conf:“resolv.conf”文件,“nameserver 11.0.0.1”指定了DNS服務器的地址。注意,這個文件對普通非dns服務器的電腦(非windows的系統;Windows系統是在“網絡屬性”中設置這項的)來說,是必不可少的。你如果沒有設置本機為dns服務器,你又要能夠解析域名,就必須指定一個dns服務器的地址。你可以最多寫上三個地址,作為前一個失敗時的候選dns服務器。“domain honston.com”指定默認的域。文件內容:
          domain 21php.com
          nameserver 11.0.0.1

          網關配置文件:

          #/etc/sysconfig/network-scripts/ifcfg-eth0(第一塊網卡的網絡配置文件)。文件內容:

          DEVICE=eth0
          BOOTPROTO=none
          BROADCAST=192.168.0.255
          HWADDR=00:50:FC:76:51:DB
          IPADDR=192.168.0.2
          NETMASK=255.255.255.0
          NETWORK=192.168.0.0
          ONBOOT=yes
          TYPE=Ethernet
          USERCTL=no
          PEERDNS=yes
          IPV6INIT=no
          GATEWAY=192.168.0.1

          網絡配置命令: ifconfig 具體用法使用, ifconfig --help命令查詢。

          down掉網關: ifconfig eth0 down(關掉第一塊網卡)

          激活網關: ifconfig eth0 up(激活第一塊網卡)

          posted @ 2006-01-25 11:36 隱語者 閱讀(400) | 評論 (0)編輯 收藏

          tomcat5的連接池配置:
              <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource"
                  factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                  maxActive="10"
                  maxIdle="10"
                  maxWait="10"
                  username="sa"
                  password=""
                  driverClassName="com.jnetdirect.jsql.JSQLDriver"
                  defaultAutoCommit="true"
                  url="jdbc:JSQLConnect://localhost/testDB"
                  removeAbandoned="true"
                  removeAbandonedTimeout="10"
              />
          tomcat4的連接池配置:
              <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource"/>
              <ResourceParams name="jdbc/testDB">
                  <parameter>
                      <name>factory</name>
                      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                  </parameter>
                  <parameter>
                      <name>maxActive</name>
                      <value>10</value>
                  </parameter>
                  <parameter>
                      <name>maxIdle</name>
                      <value>10</value>
                  </parameter>
                  <parameter>
                      <name>maxWait</name>
                      <value>10</value>
                  </parameter>
                  <parameter>
                      <name>username</name>
                      <value>sa</value>
                  </parameter>
                  <parameter>
                      <name>password</name>
                      <value></value>
                  </parameter>
                  <parameter>
                      <name>driverClassName</name>
                      <value>com.jnetdirect.jsql.JSQLDriver</value>
                  </parameter>
                  <parameter>
                      <name>defaultAutoCommit</name>
                      <value>true</value>
                  </parameter>
                  <parameter>
                      <name>url</name>
                      <value>jdbc:JSQLConnect://localhost/testDB</value>
                  </parameter>
                  <parameter>
                      <name>removeAbandoned</name>
                      <value>true</value>
                  </parameter>
                  <parameter>
                      <name>removeAbandonedTimeout</name>
                      <value>10</value>
                  </parameter>
                  <parameter>
                      <name>logAbandoned</name>
                      <value>true</value>
                  </parameter>
              </ResourceParams>

          如果將tomcat4的連接池配置直接用到tomcat5中的話,會出現:
          Cannot create JDBC driver of class '' for connect URL 'null'的錯誤

          posted @ 2005-12-29 17:01 隱語者 閱讀(712) | 評論 (0)編輯 收藏

          parseInt(obj) —— 判斷obj是否為整數,如果為有小數點的數字(包括后面多個小數點)則自動截掉小數后的所有位數(不四舍五入);如果不為數字,則返回NaN。

          parseFloat(obj)——判斷obj是否為浮點數,如果為有小數點的數字(包括后面多個小數點)則自動截掉第2個小數點的所有位數(不四舍五入);如果不為數字,則返回NaN。

          isNaN(obj)——判斷obj是否為字符串,如果返回true,則為字符串;如果返回為false,則為數值(帶小數點)。


          文章來源:http://java.mblogger.cn/love_java/posts/18171.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(2130) | 評論 (0)編輯 收藏

          轉載地址:

          http://www.matrix.org.cn/resource/article/43/43634_java_generics.html

          J2SE 5.0中的泛型

          作者:Budi Kurniawan

          翻譯:RR00

          email:di_feng_ro@hotmail.com


          版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
          英文原文地址:
          http://www.onjava.com/pub/a/onjava/2005/07/06/generics.html
          中文地址:
          http://www.matrix.org.cn/resource/article/43/43634_java_generics.html
          關鍵詞: java generics java5

          摘要
          泛型是J2SE 5.0最重要的特性。他們讓你寫一個type(類或接口)和創建一個實例通過傳遞一個或多個引用類型。這個實例受限于只能作用于這些類型。比如,在 java 5,java.util.List 已經被泛化。當建立一個list對象時,你通過傳遞一個java類型建立一個List實例,此list實例只能作用于所傳遞的類型。這意味著如果你傳遞一個String ,此List實例只能擁有String對象;如果你傳遞一個Integer,此實例只能存貯Integer對象。除了創建參數化的類型,你還能創建參數化的函數。
          泛型的第一個好處是編譯時的嚴格類型檢查。這是集合框架最重要的特點。此外,泛型消除了絕大多數的類型轉換。在JDK 5.0之前,當你使用集合框架時,你不得不進行類型轉換。
          本文將教你如何操作泛型。它的第一部分是“沒有泛型的日子”,先讓我們回憶老版本JDK的不便。然后,舉一些泛型的例子。在討論完語法以及有界泛型的使用之后,文章最后一章將解釋如何寫泛型。


          沒有泛型的日子
          所有的java類都源自java.lang.Object,這意味著所有的JAVA對象能轉換成Object。因此,在之前的JDK的版本中,很多集合框架的函數接受一個Object參數。所以,collections是一個能持有任何對象的多用途工具,但帶來了不良的后果。

          舉個簡單的例子,在JDK 5.0的之前版本中,類List的函數add接受一個Object參數:

          public boolean add(java.lang.Object element)


          所以你能傳遞任何類型給add。這是故意這么設計的。否則,它只能傳遞某種特定的對象,這樣就會出現各種List類型,如,StringList, EmployeeList, AddressList等。
          add通過Object傳遞能帶來好處,現在我們考慮get函數(返回List中的一個元素).如下是JDK 5之前版本的定義:

          public java.lang.Object get(int index) throws IndexOutOfBoundsException


          get返回一個Object.不幸的事情從此開始了.假如你儲存了兩個String對象在一個List中:

          List stringList1 = new ArrayList();
          stringList1.add("Java 5");
          stringList1.add("with generics");


          當你想從stringList1取得一個元素時,你得到了一個Object.為了操作原來的類型元素,你不得不把它轉換為String。

          String s1 = (String) stringList1.get(0);


          但是,假如你曾經把一個非String對象加入stringList1中,上面的代碼會拋出一個ClassCastException. 有了泛型,你能創建一個單一用途的List實例.比如,你能創建一個只接受String對象的List實例,另外一個實例只能接受Employee對象. 這同樣適用于集合框架中的其他類型.


          泛型入門

          像一個函數能接受參數一樣,一個泛型也能接受參數.這就是一個泛型經常被稱為一個參數化類型的原因.但是不像函數用()傳遞參數,泛型是用<>傳遞參數的.聲明一個泛型和聲明一個普通類沒有什么區別,只不過你把泛型的變量放在<>中.
          比如,在JDK 5中,你可以這樣聲明一個java.util.List : List<E> myList;
          E 稱為類型變量.意味著一個變量將被一個類型替代.替代類型變量的值將被當作參數或返回類型.對于List接口來說,當一個實例被創建以后,E 將被當作一個add或別的函數的參數.E 也會使get或別的參數的返回值.下面是add和get的定義:

          boolean add<E o>
          E get(int index)


          NOTE:一個泛型在聲明或例示時允許你傳遞特定的類型變量: E.除此之外,如果E是個類,你可以傳遞子類;如果E是個接口,你可以傳遞實現接口的類;

          -----------------------------譯者添加--------------------
          List<Number> numberList= new ArrayList<Number>();
          numberList.add(2.0);
          numberList.add(2);
          -----------------------------譯者添加--------------------


          如果你傳遞一個String給一個List,比如:

          List<String> myList;


          那么mylist的add函數將接受一個String作為他的參數,而get函數將返回一個String.因為返回了一個特定的類型,所以不用類型轉化了。

          NOTE:根據慣例,我們使用一個唯一的大寫字目表示一個類型變量。為了創建一個泛型,你需在聲明時傳遞同樣的參數列表。比如,你要想創建一個ArrayList來操作String ,你必須把String放在<>中。如:

          List<String> myList = new ArrayList<String>();


          再比如,java.util.Map 是這么定義的:

          public interface Map<K,V>


          K用來聲明map鍵(KEY)的類型而V用來表示值(VALUE)的類型。put和values是這么定義的:

          V put(K key, V value)
          Collection<V> values()


          NOTE:一個泛型不準直接的或間接的是java.lang.Throwable的子類。因為異常是在運行時拋出的,所以它不可能預言什么類型的異常將在編譯時拋出.

          列表1的例子將比較List在JDK 1.4 和JDK1.5的不同

          package com.brainysoftware.jdk5.app16;
          import java.util.List;
          import java.util.ArrayList;

          public class GenericListTest {
            public static void main(String[] args) {
              // in JDK 1.4
              List stringList1 = new ArrayList();
              stringList1.add("Java 1.0 - 5.0");
              stringList1.add("without generics");
              // cast to java.lang.String
              String s1 = (String) stringList1.get(0);
              System.out.println(s1.toUpperCase());

              // now with generics in JDK 5
              List<String> stringList2 = new ArrayList<String>();
              stringList2.add("Java 5.0");
              stringList2.add("with generics");
              // no need for type casting
              String s2 = stringList2.get(0);
              System.out.println(s2.toUpperCase());
            }
          }


          在列表1中,stringList2是個泛型。聲明List<String>告訴編譯器List的實例能接受一個String對象。當然,在另外的情況中,你能新建能接受各種對象的List實例。注意,當從List實例中返回成員元素時,不需要對象轉化,因為他返回的了你想要的類型,也就是 String.

          NOTE:泛型的類型檢查(type checking)是在編譯時完成的.

          最讓人感興趣的事情是,一個泛型是個類型并且能被當作一個類型變量。比如,你想你的List儲存lists of Strings,你能通過把List<String>作為他的類型變量來聲明List。比如:

          List<List<String>> myListOfListsOfStrings;


          要從myList中的第一個List重新取得String,你可以這么用:

          String s = myListOfListsOfStrings.get(0).get(0);


          下一個列表中的ListOfListsTest類示范了一個List(命名為listOfLists)接受一個String List作為參數。

          package com.brainysoftware.jdk5.app16;
          import java.util.ArrayList;
          import java.util.List;
          public class ListOfListsTest {
            public static void main(String[] args) {
              List<String> listOfStrings = new ArrayList<String>();
              listOfStrings.add("Hello again");
              List<List<String>> listOfLists = new ArrayList<List<String>>();
              listOfLists.add(listOfStrings);
              String s = listOfLists.get(0).get(0);
              System.out.println(s); // prints "Hello again"
            }
          }


          另外,一個泛型接受一個或多個類型變量。比如,java.util.Map有兩個類型變量s。第一個定義了鍵(key)的類型,第二個定義了值(value)的類型。下面的例子講教我們如何使用個一個泛型Map.

          package com.brainysoftware.jdk5.app16;
          import java.util.HashMap;
          import java.util.Map;
          public class MapTest {
            public static void main(String[] args) {
              Map<String, String> map = new HashMap<String, String>();
              map.put("key1", "value1");
              map.put("key2", "value2");
              String value1 = map.get("key1");
            }
          }


          在這個例子中,重新得到一個key1代表的String值,我們不需要任何類型轉換。

          沒有參數的情況下使用泛型

          既然在J2SE 5.0中收集類型已經泛型化,那么,原來的使用這些類型的代碼將如何呢?很幸運,他們在JAVA 5中將繼續工作,因為你能使用沒有參數的泛型。比如,你能繼續像原來一樣使用List接口,正如下面的例子一樣。

          List stringList1 = new ArrayList();
          stringList1.add("Java 1.0 - 5.0");
          stringList1.add("without generics");
          String s1 = (String) stringList1.get(0);


          一個沒有任何參數的泛型被稱為原型(raw type)。它意味著這些為JDK1.4或更早的版本而寫的代碼將繼續在java 5中工作。

          盡管如此,一個需要注意的事情是,JDK5編譯器希望你使用帶參數的泛型。否則,編譯器將提示警告,因為他認為你可能忘了定義類型變量s。比如,編譯上面的代碼的時候你會看到下面這些警告,因為第一個List被認為是原型。

          Note: com/brainysoftware/jdk5/app16/GenericListTest.java
          uses unchecked or unsafe operations.
          Note: Recompile with -Xlint:unchecked for details.

          當你使用原型時,如果你不想看到這些警告,你有幾個選擇來達到目的:
          1.編譯時帶上參數-source 1.4
          2.使用@SupressWarnings("unchecked")注釋
          3.更新你的代碼,使用List<Object>. List<Object>的實例能接受任何類型的對象,就像是一個原型List。然而,編譯器不會報錯。

          使用 ? 通配符
          前面提過,如果你聲明了一個List<aType>, 那么這個List對aType起作用,所以你能儲存下面這些類型的對象:
          1.一個aType的實例
          2.它的子類的實例(如果aType是個類)
          3.實現aType接口的類實例(如果aType是個接口)
          但是,請注意,一個泛型本身是個JAVA類型,就像java.lang.String或java.io.File一樣。傳遞不同的類型變量給泛型可以創建不同的JAVA類型。比如,下面例子中list1和list2引用了不同的類型對象。

          List<Object> list1 = new ArrayList<Object>();
          List<String> list2 = new ArrayList<String>();


          list1 指向了一個類型變量s為java.lang.Objects 的List而list2指向了一個類型變量s為String 的List。所以傳遞一個List<String>給一個參數為List<Object>的函數將導致compile time錯誤。下面列表可以說明:
          package com.brainysoftware.jdk5.app16;
          import java.util.ArrayList;
          import java.util.List;

          public class AllowedTypeTest {
            public static void doIt(List<Object> l) {
            }
            public static void main(String[] args) {
              List<String> myList = new ArrayList<String>();
              // 這里將產生一個錯誤
              doIt(myList);
            }
          }

          上面的代碼無法編譯,因為你試圖傳遞一個錯誤的類型給函數doIt。doIt的參數是List<Object>二你傳遞的參數是List<String>。
          可以使用 ? 通配符解決這個難題。List<?> 意味著一個對任何對象起作用的List。所以,doIt可以改為:

          public static void doIt(List<?> l) {}


          在某些情況下你會考慮使用 ? 通配符。比如,你有一個printList函數,這個函數打印一個List的所有成員,你想讓這個函數對任何類型的List起作用時。否則,你只能累死累活的寫很多printList的重載函數。下面的列表引用了使用 ? 通配符的printList函數。
          package com.brainysoftware.jdk5.app16;
          import java.util.ArrayList;
          import java.util.List;

          public class WildCardTest {

            public static void printList(List<?> list) {
              for (Object element : list) {
                System.out.println(element);
              }
            }
            public static void main(String[] args) {
              List<String> list1 = new ArrayList<String>();
              list1.add("Hello");
              list1.add("World");
              printList(list1);

              List<Integer> list2 = new ArrayList<Integer>();
              list2.add(100);
              list2.add(200);
              printList(list2);
            }
          }


          這些代碼說明了在printList函數中,List<?>表示各種類型的List對象。然而,請注意,在聲明的時候使用 ? 通配符是不合法的,像這樣:

          List<?> myList = new ArrayList<?>(); // 不合法


          如果你想創建一個接收任何類型對象的List,你可以使用Object作為類型變量,就像這樣:

          List<Object> myList = new ArrayList<Object>();


          在函數中使用界限通配符
          在之前的章節中,你學會了通過傳遞不同的類型變量s來創建不同JAVA類型的泛型,但并不考慮類型變量s之間的繼承關系。在很多情況下,你想一個函數有不同的List參數。比如,你有一個函數getAverage,他返回了一個List中成員的平均值。然而,如果你把List<Number>作為getAverage的參數,你就沒法傳遞List<Integer> 或List<Double>參數,因為List<Number>和List<Integer> 和List<Double>不是同樣的類型。

          你能使用原型或使用通配符,但這樣無法在編譯時進行安全類型檢查,因為你能傳遞任何類型的List,比如List<String>的實例。你可以使用List<Number>作為參數,但是你就只能傳遞 List<Number>給函數。但這樣就使你的函數功能減少,因為你可能更多的時候要操作List<Integer>或 List<Long>,而不是List<Number>。

          J2SE5.0增加了一個規則來解決了這種約束,這個規則就是允許你定義一個上界(upper bound) 類型變量.在這種方式中,你能傳遞一個類型或它的子類。在上面getAverage函數的例子中,你能傳遞一個List<Number>或它的子類的實例,比如List<Integer> or List<Float>。

          使用上界規則的語法這么定義的:GenericType<? extends upperBoundType>. 比如,對getAverage函數的參數,你可以這么寫List<? extends Number>. 下面例子說明了如何使用這種規則。
          package com.brainysoftware.jdk5.app16;
          import java.util.ArrayList;
          import java.util.List;
          public class BoundedWildcardTest {
            public static double getAverage(List<? extends Number> numberList)
            {
              double total = 0.0;
              for (Number number : numberList)
                total += number.doubleValue();
              return total/numberList.size();
            }

            public static void main(String[] args) {
              List<Integer> integerList = new ArrayList<Integer>();
              integerList.add(3);
              integerList.add(30);
              integerList.add(300);
              System.out.println(getAverage(integerList)); // 111.0
              List<Double> doubleList = new ArrayList<Double>();
              doubleList.add(3.0);
              doubleList.add(33.0);
              System.out.println(getAverage(doubleList)); // 18.0
            }
          }

          由于有了上界規則,上面例子中的getAverage函數允許你傳遞一個List<Number> 或一個類型變量是任何java.lang.Number子類的List。

          下界規則
          關鍵字extends定義了一個類型變量的上界。通過使用super關鍵字,我們可以定義一個類型變量的下界,盡管使用的情況不多。比如,如果一個函數的參數是List<? super Integer>,那么意味著你可以傳遞一個List<Integer>的實例或者任何java.lang.Integer的超類 (superclass)。

          創建泛型

          前面的章節主要說明了如何使使用泛型,特別是集合框架中的類。現在我們開始學習如何寫自己的泛型。

          基本上,除了聲明一些你想要使用的類型變量s外,一個泛型和別的類沒有什么區別。這些類型變量s位于類型后面的<>中。比如,下面的Point 就是個泛型。一個Point對象代表了一個系統中的點,它有橫坐標和縱坐標。通過使Point泛型化,你能定義一個點實例的精確程度。比如,如果一個 Point對象需要非常精確,你就把Double作為類型變量。否則,Integer 就夠了。
          package com.brainysoftware.jdk5.app16;
          public class Point<T> {
            T x;
            T y;
            public Point(T x, T y) {
              this.x = x;
              this.y = y;
            }
            public T getX() {
              return x;
            }
            public T getY() {
              return y;
            }
            public void setX(T x) {
              this.x = x;
            }
            public void setY(T y) {
              this.y = y;
            }
          }


          在這個例子中,T是Point的類型變量 。T是getX和getY的返回值類型,也是setX和setY的參數類型。此外,構造函數結合兩個T參數。
          使用point類就像使用別的類一樣。比如,下面的例子創建了兩個Point對象:ponint1和point2。前者把Integer作為類型變量,而后者把Double作為類型變量。

          Point<Integer> point1 = new Point<Integer>(4, 2);
          point1.setX(7);
          Point<Double> point2 = new Point<Double>(1.3, 2.6);
          point2.setX(109.91);


          總結
          泛型使代碼在編譯時有了更嚴格的類型檢查。特別是在集合框架中,泛型有兩個作用。第一,他們增加了對集合類型在編譯時的類型檢查,所以集合類所能持有的類型對傳遞給它的參數類型起了限制作用。比如你創建了一個持有strings的java.util.List實例,那么他就將不能接受Integers或別的類型。其次,當你從一個集合中取得一個元素時,泛型消除了類型轉換的必要。
          泛型能夠在沒有類型變量的情況下使用,比如,作為原型。這些措施讓Java 5之前的代碼能夠運行在JRE 5中。但是,對新的應用程序,你最好不要使用原型,因為以后Java可能不支持他們。

          你已經知道通過傳遞不同類型的類型變量給泛型可以產生不同的JAVA類型。就是說List<String>和List< Object>的類型是不同的。盡管String是java.lang.Object。但是傳遞一個List<String>給一個參數是List<Object>的函數會參數會產生編譯錯誤(compile error)。函數能用 ? 通配符使其接受任何類型的參數。List<?> 意味著任何類型的對象。
          最后,你已經看到了寫一個泛型和別的一般JAVA類沒有什么區別。你只需要在類型名稱后面的<>中聲明一系列的類型變量s就行了。這些類型變量s就是返回值類型或者參數類型。根據慣例,一個類型變量用一個大寫字母表示。


          Budi Kurniawan是一個高級 J2EE 架構師和作家。

          文章來源:http://java.mblogger.cn/love_java/posts/18270.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(217) | 評論 (0)編輯 收藏

          select owner, view_name, text? from all_views where view_name='';

          使用該sql語句能查詢指定的視圖的創建腳本.


          文章來源:http://java.mblogger.cn/love_java/posts/18281.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(867) | 評論 (0)編輯 收藏

          假設select對象為oSelect,刪除該對象下面所有選項的方法是:

          oSelect.options.length=0;


          文章來源:http://java.mblogger.cn/love_java/posts/18309.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(921) | 評論 (1)編輯 收藏

          相同:
                     
          XSL和CSS都是屬于樣式的一種。樣式是用來設定外觀的,它并不影響原來的XML源代碼,
                      XSL雖然用的是轉換的方式,但轉換并不代表源代碼會遭到篡改。通常XSL轉換后的輸出碼是
                      另存到一個新的檔案或暫存在瀏覽器的記憶體中,原來的XMl文檔內容保持不變。

          不同:
                     1、XSL采用的是轉換方式,將一種格式的XML轉換為另一種,比如將Big5碼轉換為UTF-8碼一
                           樣。而CSS則來自完全不同的理念:它不含任何轉換動作,只針對XML文件中各個成分的外
                           觀屬性一一加以設定。瀏覽器便按照CSS樣式里的指示,將XML文件呈現為設定的樣式。整
                           個過程中沒有任何新碼產生。XML配上CSS、ECMAScript和DOM可以營造出類似DHTML般
                            的動態效果。XSL轉換則是死的,沒有互動性。

                     2、XSL樣式都是XML文件,完全按照XML的語法來;相對地,CSS在語法上自成一格,和
                           XML的寫法大相徑庭。 


          文章來源:http://java.mblogger.cn/love_java/posts/18639.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(789) | 評論 (0)編輯 收藏

          使用hex編輯器打開你vss數據庫所在的文件夾,打開data目錄下的um.dat文件.將文件中對應位置改為如下字符:

           0:80  55 55 bc 7f 41 64 6d 69 6e 00 00 00 00 00 00 00
           0:90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           0:a0  00 00 00 00 90 6e 00 00 a8 01 00 00 00 00 00 00

          保存修改文件,啟動vss admin工具,直接就能登錄.


          文章來源:http://java.mblogger.cn/love_java/posts/18676.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(1030) | 評論 (0)編輯 收藏

          (IT 人之歌)
          滿腔熱血投身社會,
          加入IT吃苦受累,
          摸爬滾打終日疲憊,
          市場信息必須到位,
          一日三餐時間不對,
          屁大點事反復開會,
          逢年過節值班應對,
          一時一刻不敢離位,
          各種報表讓人崩潰,
          陪同客戶回回喝醉,
          客戶總嫌價格太貴,
          臨管執法還要索賄,
          無暇顧家愧對長輩,
          回到家里內疚懼內,
          工資不高還要交稅,
          囊中羞澀,見人慚愧,
          青春身體已經耗廢,
          人生年華如此狼狽,
          哎,IT人真累!
          謹以此獻給IT的同行兄弟們!
          文章來源:http://java.mblogger.cn/love_java/posts/19658.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(315) | 評論 (0)編輯 收藏

          示例:String hql = “select cat.name, cat.age from Cat cat”;

          List list  = getHibernateTemplate().find(hql);

          if(list != null && list.size() > 0) {

               for(int i = 0 ; i < list.size(); i++) {

                    //查詢結果返回的是一個包含對象數組的list。
                     Object[] obj = (Object[]) list.get(i);

                     String name = obj[0];

                     Integer age = (Integer) obj[1];

                 }

          }

          這樣就取出list中的數值了。

          返回包含對象數組的list不能通過Iterator循環取值。


          文章來源:http://java.mblogger.cn/love_java/posts/19667.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(2203) | 評論 (0)編輯 收藏

          AJAX基礎教程

          本文來源于(有能夠提供最初翻譯者的朋友嗎?):
          http://developer.mozilla.org/en/docs/AJAX:Getting_Started 


            這篇文章將帶您瀏覽整個AJAX的基本概貌,并展示兩個簡單的例子讓您輕松上路.

            什么是 AJAX?
            AJAX (異步 JavaScript 和 XML) 是個新產生的術語,專為描述JavaScript的兩項強大性能.這兩項性能在多年來一直被網絡開發者所忽略,直到最近Gmail, Google suggest和google Maps的橫空出世才使人們開始意識到其重要性.

            這兩項被忽視的性能是:
            無需重新裝載整個頁面便能向服務器發送請求.
            對XML文檔的解析和處理.

          步驟 1 – "請!" --- 如何發送一個HTTP請求

            為了用JavaScript向服務器發送一個HTTP請求, 需要一個具備這種功能的類實例. 這樣的類首先由Internet Explorer以ActiveX對象引入, 被稱為XMLHTTP. 后來Mozilla, Safari 和其他瀏覽器紛紛仿效, 提供了XMLHttpRequest類,它支持微軟的ActiveX對象所提供的方法和屬性.

            因此, 為了創建一個跨瀏覽器的這樣的類實例(對象), 可以應用如下代碼:

          if (window.XMLHttpRequest) { // Mozilla, Safari, ...
              http_request = new XMLHttpRequest();
          } else if (window.ActiveXObject) { // IE
              http_request = new ActiveXObject("Microsoft.XMLHTTP");
          }

            (上例對代碼做了一定簡化,這是為了解釋如何創建XMLHTTP類實例. 實際的代碼實例可參閱本篇步驟3.)

            如果服務器的響應沒有XML mime-type header,某些Mozilla瀏覽器可能無法正常工作. 為了解決這個問題, 如果服務器響應的header不是text/xml,可以調用其它方法修改該header.

          http_request = new XMLHttpRequest();
          http_request.overrideMimeType('text/xml');

            接下來要決定當收到服務器的響應后,需要做什么.這需要告訴HTTP請求對象用哪一個JavaScript函數處理這個響應.可以將對象的onreadystatechange屬性設置為要使用的JavaScript的函數名,如下所示:

          http_request.onreadystatechange = nameOfTheFunction;

            注意:在函數名后沒有括號,也無需傳遞參數.另外還有一種方法,可以在扉頁(fly)中定義函數及其對響應要采取的行為,如下所示:

          http_request.onreadystatechange = function(){
              // do the thing
          };

            在定義了如何處理響應后,就要發送請求了.可以調用HTTP請求類的open()和send()方法, 如下所示:

          http_request.open('GET', 'http://www.example.org/some.file', true);
          http_request.send(null);

            open()的第一個參數是HTTP請求方式 – GET, POST, HEAD 或任何服務器所支持的您想調用的方式. 按照HTTP規范,該參數要大寫;否則,某些瀏覽器(如Firefox)可能無法處理請求.有關HTTP請求方法的詳細信息可參考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs
            第二個參數是請求頁面的URL.由于自身安全特性的限制,該頁面不能為第三方域名的頁面.同時一定要保證在所有的頁面中都使用準確的域名,否則調用open()會得到"permission denied"的錯誤提示.一個常見的錯誤是訪問站點時使用domain.tld,而當請求頁面時,卻使用www.domain.tld.
            第三個參數設置請求是否為異步模式.如果是TRUE, JavaScript函數將繼續執行,而不等待服務器響應.這就是"AJAX"中的"A".
            如果第一個參數是"POST",send()方法的參數可以是任何想送給服務器的數據. 這時數據要以字符串的形式送給服務器,如下所示:

          name=value&anothername=othervalue&so=on 


          步驟 2 – "收到!" --- 處理服務器的響應

            當發送請求時,要提供指定處理響應的JavaScript函數名.

          http_request.onreadystatechange = nameOfTheFunction; 

            我們來看看這個函數的功能是什么.首先函數會檢查請求的狀態.如果狀態值是4,就意味著一個完整的服務器響應已經收到了,您將可以處理該響應.

          if (http_request.readyState == 4) {
              // everything is good, the response is received
          } else {
              // still not ready
          }

            readyState的取值如下:
            0 (未初始化)
            1 (正在裝載)
            2 (裝載完畢)
            3 (交互中)
            4 (完成)

            接著,函數會檢查HTTP服務器響應的狀態值. 完整的狀態取值可參見 W3C site. 我們著重看值為200 OK的響應.

          if (http_request.status == 200) {
              // perfect!
          } else {
              // there was a problem with the request,
              // for example the response may be a 404 (Not Found)
              // or 500 (Internal Server Error) response codes
          }

            在檢查完請求的狀態值和響應的HTTP狀態值后, 您就可以處理從服務器得到的數據了.有兩種方式可以得到這些數據:

          http_request.responseText – 以文本字符串的方式返回服務器的響應 
          http_request.responseXML – 以XMLDocument對象方式返回響應.處理XMLDocument對象可以用JavaScript DOM函數 


          步驟 3 – "萬事俱備!" - 簡單實例

            我們現在將整個過程完整地做一次,發送一個簡單的HTTP請求. 我們用JavaScript請求一個HTML文件, test.html, 文件的文本內容為"I'm a test.".然后我們"alert()"test.html文件的內容.

          <script type="text/javascript" language="javascript">
              var http_request = false;
              function makeRequest(url) {

                  http_request = false;

                  if (window.XMLHttpRequest) { // Mozilla, Safari,...
                      http_request = new XMLHttpRequest();
                      if (http_request.overrideMimeType) {
                          http_request.overrideMimeType('text/xml');
                      }
                  } else if (window.ActiveXObject) { // IE
                      try {
                          http_request = new ActiveXObject("Msxml2.XMLHTTP");
                      } catch (e) {
                          try {
                              http_request = new ActiveXObject("Microsoft.XMLHTTP");
                          } catch (e) {}
                      }
                  }

                  if (!http_request) {
                      alert('Giving up :( Cannot create an XMLHTTP instance');
                      return false;
                  }
                  http_request.onreadystatechange = alertContents;
                  http_request.open('GET', url, true);
                  http_request.send(null);

              }

              function alertContents() {

                  if (http_request.readyState == 4) {
                      if (http_request.status == 200) {
                          alert(http_request.responseText);
                      } else {
                          alert('There was a problem with the request.');
                      }
                  }

              }
          </script>
          <span
              style="cursor: pointer; text-decoration: underline"
              onclick="makeRequest('test.html')">
                  Make a request
          </span>


            本例中:
            用戶點擊瀏覽器上的"請求"鏈接;
            接著函數makeRequest()將被調用.其參數 – HTML文件test.html在同一目錄下;
            這樣就發起了一個請求.onreadystatechange的執行結果會被傳送給alertContents();
            alertContents()將檢查服務器的響應是否成功地收到,如果是,就會"alert()"test.html文件的內容.

          步驟 4 – "X-文檔" --- 處理XML響應

            在前面的例子中,當服務器對HTTP請求的響應被收到后,我們會調用請求對象的reponseText屬性.該屬性包含了test.html文件的內容.現在我們來試試responseXML屬性.

            首先,我們新建一個有效的XML文件,后面我們將使用這個文件.該文件(test.xml)源代碼如下所示:

          <?xml version="1.0" ?>
          <root>
              I'm a test.
          </root>

            在該腳本中,我們只需修改請求部分:

          ...
          onclick="makeRequest('test.xml')">
          ...

            接著,在alertContents()中,我們將alert()的代碼alert(http_request.responseText);換成:

            var xmldoc = http_request.responseXML;
            var root_node = xmldoc.getElementsByTagName('root').item(0);
            alert(root_node.firstChild.data);


            這里,我們使用了responseXML提供的XMLDocument對象并用DOM方法獲取存于XML文件中的內容.

          文章來源:http://java.mblogger.cn/love_java/posts/20112.aspx

          posted @ 2005-12-19 09:34 隱語者 閱讀(402) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 麟游县| 吉首市| 吴江市| 夏津县| 疏附县| 刚察县| 潞西市| 文昌市| 库伦旗| 和静县| 大丰市| 黄龙县| 和龙市| 鄂托克前旗| 鲁山县| 迁西县| 邹城市| 正宁县| 武威市| 龙川县| 浪卡子县| 镇赉县| 文安县| 彰武县| 荥阳市| 延长县| 桐梓县| 金堂县| 罗城| 永善县| 三原县| 四会市| 莱阳市| 河曲县| 丹凤县| 岱山县| 吉木萨尔县| 阿拉善右旗| 高密市| 资兴市| 兴隆县|