最新国产AV无码专区亚洲,亚洲国模精品一区,亚洲精品tv久久久久久久久久http://www.tkk7.com/romkk-shi/zh-cnSat, 10 May 2025 19:03:30 GMTSat, 10 May 2025 19:03:30 GMT60Windows XP快捷鍵一覽http://www.tkk7.com/romkk-shi/archive/2007/08/15/136819.html路邊的石頭-java路邊的石頭-javaWed, 15 Aug 2007 01:45:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/15/136819.htmlhttp://www.tkk7.com/romkk-shi/comments/136819.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/15/136819.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136819.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136819.html
在 Win XP 中工作和Windows中工作時一樣,利用快捷鍵代替鼠標??梢岳面I盤快捷鍵打開、關閉和導航“開始”菜單、桌面、菜單、對話框以及網頁。鍵盤還可以讓您更簡單地與計算機交互。

  單擊一個標題或按 TAB 鍵可以突出顯示這個標題,然后按 ENTER 鍵。

  一、常規鍵盤快捷鍵

按鍵 目的
Ctrl + C 復制。
Ctrl + X 剪切。
Ctrl + V 粘貼。
Ctrl + Z 撤消。
DELETE 刪除。
Shift + Delete 永久刪除所選項,而不將它放到“回收站”中。
拖動某一項時按 CTRL 復制所選項。
拖動某一項時按 CTRL + SHIFT 創建所選項目的快捷鍵。
F2 重新命名所選項目。
CTRL + 向右鍵 將插入點移動到下一個單詞的起始處。
CTRL + 向左鍵 將插入點移動到前一個單詞的起始處。
CTRL + 向下鍵 將插入點移動到下一段落的起始處。
CTRL + 向上鍵 將插入點移動到前一段落的起始處。
CTRL + SHIFT + 任何箭頭鍵 突出顯示一塊文本。
SHIFT + 任何箭頭鍵 在窗口或桌面上選擇多項,或者選中文檔中的文本。
Ctrl + A 選中全部內容。
F3 搜索文件或文件夾。
Alt + Enter 查看所選項目的屬性。
Alt + F4 關閉當前項目或者退出當前程序。
ALT + Enter 顯示所選對象的屬性。
Alt + 空格鍵 為當前窗口打開快捷菜單。
Ctrl + F4 在允許同時打開多個文檔的程序中關閉當前文檔。
Alt + Tab 在打開的項目之間切換。
Alt + Esc 以項目打開的順序循環切換。
F6 在窗口或桌面上循環切換屏幕元素。
F4 顯示“我的電腦”和“Windows 資源管理器”中的“地址”欄列表。
Shift + F10 顯示所選項的快捷菜單。
Alt + 空格鍵 顯示當前窗口的“系統”菜單。
Ctrl + Esc 顯示“開始”菜單。
ALT + 菜單名中帶下劃線的字母 顯示相應的菜單。
在打開的菜單上顯示的命令名稱中帶有下劃線的字母 執行相應的命令。
F10 激活當前程序中的菜單條。
右箭頭鍵 打開右邊的下一菜單或者打開子菜單。
左箭頭鍵 打開左邊的下一菜單或者關閉子菜單。
F5 刷新當前窗口。
BackSpace 在“我的電腦”或“Windows 資源管理器”中查看上一層文件夾。
Esc 取消當前任務。
將光盤插入到 CD-ROM 驅動器時按 SHIFT 鍵 阻止光盤自動播放。

  二、對話框快捷鍵

按鍵 目的
Ctrl + Tab 在選項卡之間向前移動。
Ctrl + Shift +Tab 在選項卡之間向后移動。
Tab 在選項之間向前移動。
Shift + Tab 在選項之間向后移動。
ALT + 帶下劃線的字母 執行相應的命令或選中相應的選項。
Enter 執行活選項動或按鈕所對應的命令。
空格鍵 如果活選項動是復選框,則選中或清除該復選框。
箭頭鍵 活選項動是一組選項按鈕時,請選中某個按鈕。
F1 顯示幫助。
F4 顯示當前列表中的項目。
BackSpace 如果在“另存為”或“打開”對話框中選中了某個文件夾,則打開上一級文件夾。

  三、自然鍵盤快捷鍵

  在“Microsoft 自然鍵盤”或包含 Windows 徽標鍵(簡稱WIN) 和“應用程序”鍵(簡稱KEY) 的其他兼容鍵盤中,您可以使用以下快捷鍵。

按鍵 目的
WIN 顯示或隱藏"開始"菜單。
WIN+ BREAK 顯示"系統屬性"對話框。
WIN+ D 顯示桌面。
WIN+ M 最小化所有窗口。
WIN+ Shift + M 還原最小化的窗口。
WIN+ E 打開"我的電腦"。
WIN+ F 搜索文件或文件夾。
CTRL+WIN+ F 搜索計算機。
WIN+ F1 顯示 Windows 幫助。
WIN+ L 如果連接到網絡域,則鎖定您的計算機,或者如果沒有連接到網絡域,則切換用戶。
WIN+ R 打開"運行"對話框。
KEY 顯示所選項的快捷菜單。
WIN+ U 打開"工具管理器"。

  四、輔助鍵盤快捷鍵

按鍵 目的
右側 SHIFT 鍵八秒鐘 切換“篩選鍵”的開和關。
左邊的 ALT + 左邊的 SHIFT + PRINT SCREEN 切換“高對比度”的開和關。
左邊的 ALT + 左邊的 SHIFT + NUM LOCK 切換“鼠標鍵”的開和關。
Shift 鍵五次 切換“粘滯鍵”的開和關。
Num Lock 鍵五秒鐘 切換“切換鍵”的開和關。
WIN+ U 打開“工具管理器”。

  “Windows 資源管理器”鍵盤快捷鍵

按鍵 目的
END 顯示當前窗口的底端。
主頁 顯示當前窗口的頂端。
NUM LOCK + 數字鍵盤的星號 (*) 顯示所選文件夾的所有子文件夾。
NUM LOCK + 數字鍵盤的加號 (+) 顯示所選文件夾的內容。
NUM LOCK + 數字鍵盤的減號 (-) 折疊所選的文件夾。
左箭頭鍵 當前所選項處于展開狀態時折疊該項,或選定其父文件夾。
右箭頭鍵 當前所選項處于折疊狀態時展開該項,或選定第一個子文件夾。

 



]]>
如何編寫代碼才能使得效率高 http://www.tkk7.com/romkk-shi/archive/2007/08/14/136582.html路邊的石頭-java路邊的石頭-javaTue, 14 Aug 2007 02:27:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136582.htmlhttp://www.tkk7.com/romkk-shi/comments/136582.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136582.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136582.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136582.html

一、排版:
  1.關鍵詞和操作符之間加適當的空格。
  2.相對獨立的程序塊與塊之間加空行
  3.較長的語句、表達式等要分成多行書寫。
  4.劃分出的新行要進行適應的縮進,使排版整齊,語句可讀。
  5.長表達式要在低優先級操作符處劃分新行,操作符放在新行之首。
  6.循環、判斷等語句中若有較長的表達式或語句,則要進行適應的劃分。
  7.若函數或過程中的參數較長,則要進行適當的劃分。
  8.不允許把多個短語句寫在一行中,即一行只寫一條語句。
  9.函數或過程的開始、結構的定義及循環、判斷等語句中的代碼都要采用縮進風格。
  10.C/C++語言是用大括號‘{’和‘}’界定一段程序塊的,編寫程序塊時‘{’和
   ‘}’應各獨占一行并且位于同一列,同時與引用它們的語句左對齊。在函數體
    的開始、類的定義、結構的定義、枚舉的定義以及if、for、do、while、
    switch、case語句中的程序都要采用如上的縮進方式。

二、注釋
  1.注釋要簡單明了。
  2.邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。
  3.在必要的地方注釋,注釋量要適中。注釋的內容要清楚、明了,含義準確,防止
   注釋二義性。保持注釋與其描述的代碼相鄰,即注釋的就近原則。
  4.對代碼的注釋應放在其上方相鄰位置,不可放在下面。
  5.對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域
   的注釋應放在此域的右方;同一結構中不同域的注釋要對齊。
  6.變量、常量的注釋應放在其上方相鄰位置或右方。
  7.全局變量要有較詳細的注釋,包括對其功能、取值范圍、哪些函數或過程存取它
   以及存取時注意事項等的說明。
  8.在每個源文件的頭部要有必要的注釋信息,包括:文件名;版本號;作者;生成
   日期;模塊功能描述(如功能、主要算法、內部各部分之間的關系、該文件與其
   它文件關系等);主要函數或過程清單及本文件歷史修改記錄等。
  9.在每個函數或過程的前面要有必要的注釋信息,包括:函數或過程名稱;功能描
   述;輸入、輸出及返回值說明;調用關系及被調用關系說明等。

三、命名
  1.較短的單詞可通過去掉“元音”形成縮寫;
  2.較長的單詞可取單詞的頭幾發符的優先級,并用括號明確表達式的操作順序,避
   免使用默認優先級。
  3.使用匈牙利表示法

四、可讀性
  1.避免使用不易理解的數字,用有意義的標識來替代。
  2.不要使用難懂的技巧性很高的語句。
  3.源程序中關系較為緊密的代碼應盡可能相鄰。

五、變量
  1.去掉沒必要的公共變量。
  2.構造僅有一個模塊或函數可以修改、創建,而其余有關模塊或函數只訪問的公共
   變量,防止多個不同模塊或函數都可以修改、創建同一公共變量的現象。
  3.仔細定義并明確公共變量的含義、作用、取值范圍及公共變量間的關系。
  4.明確公共變量與操作此公共變量的函數或過程的關系,如訪問、修改及創建等。
  5.當向公共變量傳遞數據時,要十分小心,防止賦與不合理的值或越界等現象發生。
  6.防止局部變量與公共變量同名。
  7.仔細設計結構中元素的布局與排列順序,使結構容易理解、節省占用空間,并減
   少引起誤用現象。
  8.結構的設計要盡量考慮向前兼容和以后的版本升級,并為某些未來可能的應用保
   留余地(如預留一些空間等)。
  9.留心具體語言及編譯器處理不同數據類型的原則及有關細節。
  10.嚴禁使用未經初始化的變量。聲明變量的同時對變量進行初始化。
  11.編程時,要注意數據類型的強制轉換。

六、函數、過程
  1.函數的規模盡量限制在200行以內。
  2.一個函數最好僅完成一件功能。
  3.為簡單功能編寫函數。
  4.函數的功能應該是可以預測的,也就是只要輸入數據相同就應產生同樣的輸出。
  5.盡量不要編寫依賴于其他函數內部實現的函數。
  6.避免設計多參數函數,不使用的參數從接口中去掉。
  7.用注釋詳細說明每個參數的作用、取值范圍及參數間的關系。
  8.檢查函數所有參數輸入的有效性。
  9.檢查函數所有非參數輸入的有效性,如數據文件、公共變量等。
  10.函數名應準確描述函數的功能。
  11.避免使用無意義或含義不清的動詞為函數命名
  12.函數的返回值要清楚、明了,讓使用者不容易忽視錯誤情況。
  13/明確函數功能,精確(而不是近似)地實現函數設計。
  14.減少函數本身或函數間的遞歸調用。
  15.編寫可重入函數時,若使用全局變量,則應通過關中斷、信號量(即P、V操作)
    等手段對其加以保護。

七、可測性
  1.在編寫代碼之前,應預先設計好程序調試與測試的方法和手段,并設計好各種調
  測開關及相應測試代碼如打印函數等。
  2.在進行集成測試/系統聯調之前,要構造好測試環境、測試項目及測試用例,同時
  仔細分析并優化測試用例,以提高測試效率。

八、程序效率
  1.編程時要經常注意代碼的效率。
  2.在保證軟件系統的正確性、穩定性、可讀性及可測性的前提下,提高代碼效率。
  3.不能一味地追求代碼效率,而對軟件的正確性、穩定性、可讀性及可測性造成影
   響。
  4.編程時,要隨時留心代碼效率;優化代碼時,要考慮周全。
  5.要仔細地構造或直接用匯編編寫調用頻繁或性能要求極高的函數。
  6.通過對系統數據結構劃分與組織的改進,以及對程序算法的優化來提高空間效率。
  7.在多重循環中,應將最忙的循環放在最內層。
  8.盡量減少循環嵌套層次。
  9.避免循環體內含判斷語句,應將循環語句置于判斷語句的代碼塊之中。
  10.盡量用乘法或其它方法代替除法,特別是浮點運算中的除法。

九、質量保證
  1.在軟件設計過程中構筑軟件質量。
  代碼質量保證優先原則
  (1)正確性,指程序要實現設計要求的功能。
 ?。?)穩定性、安全性,指程序穩定、可靠、安全。
  (3)可測試性,指程序要具有良好的可測試性。
 ?。?)規范/可讀性,指程序書寫風格、命名規則等要符合規范。
 ?。?)全局效率,指軟件系統的整體效率。
 ?。?)局部效率,指某個模塊/子模塊/函數的本身效率。
 ?。?)個人表達方式/個人方便性,指個人編程習慣。
  2.只引用屬于自己的存貯空間。
  3.防止引用已經釋放的內存空間。
  4.過程/函數中分配的內存,在過程/函數退出之前要釋放。
  5.過程/函數中申請的(為打開文件而使用的)文件句柄,在過程/函數退出前要關閉。
  6.防止內存操作越界。
  7.時刻注意表達式是否會上溢、下溢。
  8.認真處理程序所能遇到的各種出錯情況。
  9.系統運行之初,要初始化有關變量及運行環境,防止未經初始化的變量被引用。
  10.系統運行之初,要對加載到系統中的數據進行一致性檢查。
  11.嚴禁隨意更改其它模塊或系統的有關設置和配置。
  12.不能隨意改變與其它模塊的接口。
  13.充分了解系統的接口之后,再使用系統提供的功能。
  14.要時刻注意易混淆的操作符。當編完程序后,應從頭至尾檢查一遍這些操作符。
  15.不使用與硬件或操作系統關系很大的語句,而使用建議的標準語句。
  16.建議:使用第三方提供的軟件開發工具包或控件時,要注意以下幾點:
  (1)充分了解應用接口、使用環境及使用時注意事項。
  (2)不能過分相信其正確性。
 ?。?)除非必要,不要使用不熟悉的第三方工具包與控件。

十、代碼編譯
  1.編寫代碼時要注意隨時保存,并定期備份,防止由于斷電、硬盤損壞等原因造成
   代碼丟失。
  2.同一項目組內,最好使用相同的編輯器,并使用相同的設置選項。
  3.合理地設計軟件系統目錄,方便開發人員使用。
  4.打開編譯器的所有告警開關對程序進行編譯。
  5.在同一項目組或產品組中,要統一編譯開關選項。
  6.使用工具軟件(如Visual SourceSafe)對代碼版本進行維護。

十一、代碼測試、維護
  1.單元測試要求至少達到語句覆蓋。
  2.單元測試開始要跟蹤每一條語句,并觀察數據流及變量的變化。
  3.清理、整理或優化后的代碼要經過審查及測試。
  4.代碼版本升級要經過嚴格測試。 



]]>
寫得蠻好的linux學習筆記 http://www.tkk7.com/romkk-shi/archive/2007/08/14/136581.html路邊的石頭-java路邊的石頭-javaTue, 14 Aug 2007 02:25:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136581.htmlhttp://www.tkk7.com/romkk-shi/comments/136581.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136581.html#Feedback1http://www.tkk7.com/romkk-shi/comments/commentRss/136581.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136581.html

linux目錄架構
/   根目錄
/bin    常用的命令 binary file 的目錄
/boot   存放系統啟動時必須讀取的檔案,包括核心 (kernel) 在內
     /boot/grub/menu.lst   GRUB設置
     /boot/vmlinuz   內核
     /boot/initrd     核心解壓縮所需 RAM Disk
/dev    系統周邊設備    
/etc    系統相關設定文件
     /etc/DIR_COLORS   設定顏色
     /etc/HOSTNAME   設定用戶的節點名
     /etc/NETWORKING   只有YES標明網絡存在
     /etc/host.conf 文件說明用戶的系統如何查詢節點名
     /etc/hosts 設定用戶自已的IP與名字的對應表
     /etc/hosts.allow 設置允許使用inetd的機器使用
     /etc/hosts.deny 設置不允許使用inetd的機器使用
     /etc/hosts.equiv 設置遠端機不用密碼
     /etc/inetd.conf 設定系統網絡守護進程inetd的配置
     /etc/gateways 設定路由器
     /etc/protocols 設定系統支持的協議
     /etc/named.boot 設定本機為名字服務器的配置文件
     /etc/sysconfig/network-scripts/ifcfg-eth0   設置IP
     /etc/resolv.conf    設置DNS 
     /etc/X11  X Window的配置文件,xorg.conf 或 XF86Config 這兩個 X Server 的設定檔
     /etc/fstab    記錄開機要mount的文件系統
     /etc/inittab 設定系統啟動時init進程將把系統設置成什么樣的runlevel
     /etc/issue 記錄用戶登錄前顯示的信息
     /etc/group 設定用戶的組名與相關信息
     /etc/passwd 帳號信息
     /etc/shadow 密碼信息
     /etc/sudoers 可以sudo命令的配置文件
     /etc/securetty 設定哪些終端可以讓root登錄
     /etc/login.defs 所有用戶登錄時的缺省配置
     /etc/exports 設定NFS系統用的
     /etc/init.d/   所有服務的預設啟動 script 都是放在這裡的,例如要啟動或者關閉
     /etc/xinetd.d/  這就是所謂的 super daemon 管理的各項服務的設定檔目錄
     /etc/modprobe.conf   內核模塊額外參數設定
     /etc/syslog.conf   日志設置文件
/home   使用者家目錄
/lib    系統會使用到的函數庫
     /lib/modules   kernel 的相關模塊
     /var/lib/rpm   rpm套件安裝處
/lost+found    系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
/mnt     外設的掛載點
/media   與/mnt類似
/opt     主機額外安裝的軟件
/proc    虛擬目錄,是內存的映射
      /proc/version   內核版本
       /proc/sys/kernel   系統內核功能
/root    系統管理員的家目錄
/sbin    系統管理員才能執行的指令
/srv     一些服務啟動之後,這些服務所需要取用的資料目錄
/tmp     一般使用者或者是正在執行的程序暫時放置檔案的地方
/usr     最大的目錄,存許應用程序和文件
    /usr/X11R6:   X-Window目錄
    /usr/src:    Linux源代碼
    /usr/include:系統頭文件
    /usr/openwin 存放SUN的OpenWin
    /usr/man 在線使用手冊
    /usr/bin           使用者可執行的 binary file 的目錄
    /usr/local/bin     使用者可執行的 binary file 的目錄
    /usr/lib           系統會使用到的函數庫
    /usr/local/lib     系統會使用到的函數庫
    /usr/sbin          系統管理員才能執行的指令
    /usr/local/sbin    系統管理員才能執行的指令
/var   日志文件
    /var/log/secure    記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中
    /var/log/wtmp      記錄登入者的訊息資料, last
    /var/log/messages  幾乎系統發生的錯誤訊息
    /var/log/boot.log  記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
    /var/log/maillog   紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄
    /var/log/cron      記錄 crontab 這個例行性服務的內容
    /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
    分別是幾個不同的網路服務的記錄檔
一些常用的基本命令:
uname -a    查看內核版本      
ls -al    顯示所有文件的屬性
pwd         顯示當前路徑       
cd -    返回上一次目錄     cd ~    返回主目錄
date s      設置時間、日期         
cal      顯示日歷     cal 2006
bc          計算器具              
man  & info     幫助手冊
locale     顯示當前字體     locale -a    所有可用字體     /etc/sysconfig/i18n設置文件
LANG=en    使用英文字體           
sync       將數據同步寫入硬盤       
shutdonw -h now & half & poweroff  關機
reboot     重啟                  
startx  &  init 5   進入圖形介面
/work  & ?work    向上、下查找文檔內容
chgrp      改變檔案群組  chgrp testing install.log   
chown     改變所屬人   chown root:root install.log
chmod      改變屬性     chmod 777 install.log     read=4  write=2  execute=1
cp   復制   cp filename
rm   刪除文件  rm -rf filename   強制刪除文件
rmdir   刪除文件夾
mv  移動    mv 123.txt 222.txt  重命名
mkdir     創建文件夾
touch     創建文件  更新當前時間
cat       由第一行開始顯示     cat |more  分頁
nl        在內容前加行號
more  &  less   一面一面翻動
head -n filename   顯示第N行內容
tail -n filename  顯示后N行內容
od        顯示非純文檔
df -h 顯示分區空間
du  顯示目錄或文件的大小
fdisk   分區設置    fdisk -l /dev/hda  顯示硬盤分區狀態
mkfs    建立各種文件系統  mkfs -t ext3  /dev/ram15  
fsck    檢查和修復LINUX檔案
ln      硬鏈接   ln -s  軟件鏈接
whereis   查找命令
locate    查找
find      查找   find / -name "***.***"
which     查看工具
whoami    顯示當前用戶
gcc -v    查看GCC版本
chattr +i filename  禁止刪除   chattr -i filename  取消禁止
lsattr    顯示隱藏檔屬性
updatedb  更新資料庫
mke2fs    格式化   mkfs -t ext3
dd if=/etc/passwd of=/tmp/passwd.bak    備份
mount     列出系統所有的分區
mount -t iso9660 /dev/cdrom /mnt/cdrom   掛載光盤
mount -t vfat /dev/fd0 /mnt/floppy       掛載軟盤
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2   掛載fat32分區
mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3         掛載ntfs分區
Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
umount /mnt/hda3  缷載
ifconfig   顯示或設置網絡設備
service network restart   重啟網卡 
ifdown eth0  關閉網卡
ifup eth0    開啟網卡
clear    清屏
history    歷史記錄       !55  執行第55個指令
stty   設置終端    stty -a
fdisk /mbr   刪除GRUB
at     僅進行一次的工作排程
crontab   循環執行的例行性命令    [e]編輯,[l]顯示,[r]刪除任務
&       后臺運行程序    tar -zxvf 123.tar.gz & --------->后臺運行
jobs    觀看后臺暫停的程序   jobs -l
fg      將后臺程序調到前臺   fg n ------>n是數字,可以指定進行那個程序
bg      讓工作在后臺運行
kill    結束進程    kill -9 PID     [9]強制結束,[15]正常結束,[l]列出可用的kill信號
ps aux  查看后臺程序  
top     查看后臺程序   top -d 2    每兩秒更新一次        top -d 2 -p10604   觀看某個PID
        top -b -n 2 > /tmp/top.txt ----->將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt   
pstree   以樹狀圖顯示程序    [A]以 ASCII 來連接, [u]列出PID, [p]列出帳號
killall   要刪除某個服務    killall -9 httpd
free      顯示內存狀態     free -m  -------->以M為單位顯示
uptime    顯示目前系統開機時間
netstat   顯示網絡狀態    netstat -tulnp------>找出目前系統上已在監聽的網路連線及其 PID
dmesg     顯示開機信息    demsg | more
nice      設置優先權      nice -n -5 vi & ----->用 root 給一個 nice 植為 -5 ,用於執行 vi
renice    調整已存在優先權
runlevel  顯示目前的runlevel
depmod    分析可載入模塊的相依性
lsmod     顯示已載入系統的模塊
modinfo   顯示kernel模塊的信息
insmod    載入模塊
modprobe   自動處理可載入模塊
rmmod     刪除模塊
chkconfig   檢查,設置系統的各種服務     chkconfig --list ----->列出各項服務狀態
ntsysv     設置系統的各種服務
cpio      備份文件

壓縮命令:
 *.Z      compress 程式壓縮的檔案;
 *.bz2    bzip2 程式壓縮的檔案;
 *.gz     gzip 程式壓縮的檔案;
 *.tar    tar 程式打包的資料,並沒有壓縮過;
 *.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮
compress filename  壓縮文件  加[-d]解壓  uncompress
gzip filename   壓縮  加[-d]解壓  zcat 123.gz 查看壓縮文件內容
bzip2 -z filename  壓縮  加[-d]解壓   bzcat filename.bz2  查看壓縮文件內容
tar -cvf /home/123.tar /etc  打包,不壓縮
tar -xvf 123.tar   解開包
tar -zxvf /home/123.tar.gz  以gzip解壓
tar -jxvf /home/123.tar.bz2  以bzip2解壓
tar -ztvf /tmp/etc.tar.gz   查看tar內容
cpio -covB  > [file|device]   份份
cpio -icduv < [file|device]   還原
 
vi一般用法
一般模式              編輯模式                  指令模式
h 左               a,i,r,o,A,I,R,O             :w 保存
j 下                進入編輯模式                :w! 強制保存
k 上                dd 刪除光標當前行           :q! 不保存離開
l 右                ndd 刪除n行                 :wq! 保存后離開
0 移動到行首        yy 復制當前行                :e! 還原原始檔
$ 移動到行尾        nyy 復制n行                  :w filename 另存為
H 屏幕最上          p,P 粘貼                     :set nu 設置行號
M 屏幕中央          u  撤消                      :set nonu 取消行號
L 屏幕最下          [Ctrl]+r 重做上一個動作       ZZ 保存離開
G 檔案最后一行      [ctrl]+z 暫停退出            :set nohlsearch   永久地關閉高亮顯示
/work 向下搜索                                   :sp 同時打開兩個文檔
?work 向上搜索                                   [Ctrl]+w 兩個文檔設換
gg 移動到檔案第一行                              :nohlsearch    暫時關閉高亮顯示
 
認識SHELL
alias    顯示當前所有的命令別名      alias lm="ls -al"   命令別名    unalias lm 取消命令別名
type      類似which
exprot    設置或顯示環境變量
exprot PATH="$PATH":/sbin  添加/sbin入PATH路徑
echo $PATH    顯示PATH路徑
bash      進入子程序
name=yang     設定變量
unset name    取消變量
echo $name    顯示變量的內容
myname="$name its me"   &   myname='$name its me'     單引號時$name失去變量內容
ciw=/etc/sysconfig/network-scripts/     設置路徑
env      列出所有環境變量
echo $RANDOM    顯示隨意產生的數
set      設置SHELL
PS1='[\u@\h \w \A #\#]\$ '     提示字元的設定
   [root@linux ~]# read [-pt] variable     -----------讀取鍵盤輸入的變量
   參數:
   -p  :後面可以接提示字元!
   -t  :後面可以接等待的『秒數!』
declare    聲明 shell 變量
ulimit -a   顯示所有限制資料
 ls /tmp/yang && echo "exist" || echo "not exist"
 意思是說,當 ls /tmp/yang 執行後,若正確,就執行echo "exist" ,若有問題,就執行echo "not exist"
 echo $PATH | cut -d ':' -f 5       以:為分隔符,讀取第5段內容
 export | cut -c 10-20      讀取第10到20個字節的內容
 last | grep 'root'    搜索有root的一行,加[-v]反向搜索
 cat /etc/passwd | sort    排序顯示
 cat /etc/passwd | wc      顯示『行、字數、字節數』
正規表示法
[root@test root]# grep [-acinv] '搜尋字串' filename
       參數說明:
       -a :將 binary 檔案以 text 檔案的方式搜尋資料
       -c :計算找到 '搜尋字串' 的次數
       -i :忽略大小寫的不同,所以大小寫視為相同
       -n :順便輸出行號
       -v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
 grep -n 'the' 123.txt     搜索the字符 -----------搜尋特定字串      
 grep -n 't[ea]st' 123.txt    搜索test或taste兩個字符---------利用 [] 來搜尋集合字元
 grep -n '[^g]oo' 123.txt     搜索前面不為g的oo-----------向選擇 [^]
 grep -n '[0-9]' 123.txt  搜索有0-9的數字
 grep -n '^the' 123.txt 搜索以the為行首-----------行首搜索^
 grep -n '^[^a-zA-Z]' 123.txt  搜索不以英文字母開頭
 grep -n '[a-z]$' 123.txt    搜索以a-z結尾的行---------- 行尾搜索$
 grep -n 'g..d' 123.txt     搜索開頭g結尾d字符----------任意一個字元 .
 grep -n 'ooo*' 123.txt     搜索至少有兩個oo的字符---------重複字元 *
sed    文本流編輯器    利用腳本命令來處理文本文件
awd    模式掃描和處理語言
 nl 123.txt | sed '2,5d'   刪除第二到第五行的內容
diff     比較文件的差異
cmp      比較兩個文件是否有差異
patch    修補文件
pr       要打印的文件格式化

帳號管理
/etc/passwd    系統帳號信息
/etc/shadow    帳號密碼信息    經MD5 32位加密
     在密碼欄前面加『 * 』『 ! 』禁止使用某帳號
/etc/group     系統群組信息
/etc/gshadow
newgrp    改變登陸組
useradd  &  adduser    建立新用戶  ---------> useradd -m test  自動建立用戶的登入目錄
          useradd -m -g pgroup test --------->指定所屬級
/etc/default/useradd   相關設定
/etc/login.defs       UID/GID 有關的設定
passwd    更改密碼 -----------> passwd test
usermod   修改用戶帳號
userdel   刪除帳號 ----------->userdel -r test
chsh      更換登陸系統時使用的SHELL   [-l]顯示可用的SHELL;[-s]修改自己的SHELL
chfn      改變finger指令顯示的信息
finger    查找并顯示用戶信息
id        顯示用戶的ID ----------->  id test
groupadd   添加組
groupmod   與usermod類似
groupdel   刪除組
su test    更改用戶   su -    進入root,且使用root的環境變量
sudo       以其他身份來執行指令
visudo     編輯/etc/sudoers      加入一行『 test ALL=(ALL) ALL 』
           %wheel ALL = (ALL) ALL               系統里所有wheel群組的用戶都可用sudo
           %wheel ALL = (ALL) NOPASSWD: ALL     wheel群組所有用戶都不用密碼NOPASSWD
       User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3         加入ADMPW組
       ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
       !/usr/bin/passwd root      可以更改使用者密碼,但不能更改root密碼 (在指令前面加入 ! 代表不可)
PAM (Pluggable Authentication Modules, 嵌入式模組)
who & w     看誰在線                    
last        最近登陸主機的信息
lastlog     最近登入的時間    讀取 /var/log/lastlog
talk        與其他用戶交談
write       發送信息    write test   [ctrl]+d 發送
mesg        設置終端機的寫入權限    mesg n 禁止接收     mesg y
wall        向所有用戶發送信息    wall this is q test
mail        寫mail  
/etc/default/useradd    家目錄默認設置
quota      顯示磁盤已使用的空間與限制     quota -guvs ----->秀出目前 root 自己的 quota 限制值
           quota -vu   查詢
quotacheck   檢查磁盤的使用空間與限制     quotacheck -avug  ----->將所有的在 /etc/mtab 內,含有 quota 支援的 partition 進行掃瞄
             [-m] 強制掃描 
     quota一定要是獨立的分區,要有quota.user和quota.group兩件文件,在/etc/fstab添加一句:
     /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
     chmod 600 quota*         設置完成,重啟生效
edquota    編輯用戶或群組的quota  [u]用戶,[g]群組,[p]復制,[t]設置寬限期限
           edquota -a yang       edquota -p yang -u young ----->復制   
quotaon    開啟磁盤空間限制     quotaon -auvg -------->啟動所有的具有 quota 的 filesystem
quotaoff   關閉磁盤空間限制     quotaoff -a  -------->關閉了 quota 的限制
repquota -av     查閱系統內所有的具有 quota 的 filesystem 的限值狀態
Quota 從開始準備 filesystem 的支援到整個設定結束的主要的步驟大概是:
1、設定 partition 的 filesystem 支援 quota 參數:
由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來說, 支援度最好的是 ext2/ext3 ,
其他的 filesystem 類型鳥哥我是沒有試過啦! 啟動 filesystem 支援 quota 最簡單就是編輯 /etc/fstab ,
使得準備要開放的 quota 磁碟可以支援 quota 囉;
2、建立 quota 記錄檔:
剛剛前面講過,整個 quota 進行磁碟限制值記錄的檔案是 aquota.user/aquota.group,
要建立這兩個檔案就必須要先利用 quotacheck 掃瞄才行喔!
3、編輯 quota 限制值資料:
再來就是使用 edquota 來編輯每個使用者或群組的可使用空間囉;
4、重新掃瞄與啟動 quota :
設定好 quota 之後,建議可以再進行一次 quotacheck ,然後再以 quotaon 來啟動吧!

開機流程簡介
1、載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號;
2、讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊;
3、載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
4、Kernel 執行 init 程式並取得 run-level 資訊;
5、init 執行 /etc/rc.d/rc.sysinit 檔案;
6、啟動核心的外掛模組 (/etc/modprobe.conf);
7、init 執行 run-level 的各個批次檔( Scripts );
8、init 執行 /etc/rc.d/rc.local 檔案;
9、執行 /bin/login 程式,並等待使用者登入;
10、登入之後開始以 Shell 控管主機。
在/etc/rc.d/rc3.d內,以S開頭的為開機啟動,以K開頭的為關閉,接著的數字代表執行順序
GRUB vga設定
彩度\解析度  640x480  800x600  1024x768  1280x1024   bit
    256        769      771      773       775      8 bit
   32768       784      787      790       793     15 bit
   65536       785      788      791       794     16 bit
   16.8M       786      789      792       795     32 bit

./configure    檢查系統信息       ./configure --help | more  幫助信息
make clean     清除之前留下的文件
make           編譯
make install   安裝
rpm -q  ----->查詢是否安裝             rpm -ql ------>查詢該套件所有的目錄
rpm -qi ----->查詢套件的說明資料       rpm -qc[d] ----->設定檔與說明檔
rpm -ivh  ---->安裝                    rpm -V  -------->查看套件有否更動過
rpm -e  ------>刪除                    rpm -Uvh ------->升級安裝 
--nodeps ----->強行安裝                --test ----->測試安裝





]]>
JavaScript:世界上誤解最深的語言 http://www.tkk7.com/romkk-shi/archive/2007/08/14/136579.html路邊的石頭-java路邊的石頭-javaTue, 14 Aug 2007 02:22:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136579.htmlhttp://www.tkk7.com/romkk-shi/comments/136579.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136579.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136579.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136579.html

JavaScript,是世界上最流行的編程語言之一。事實上世界上的每一臺個人電腦都安裝并在頻繁使用至少一個JavaScript解釋器。JavaScript的流行完全是由于他在WWW腳本語言領域中的地位決定的。


Despite its popularity, few know that JavaScript is a very nice dynamic object-oriented general-purpose programming language. How can this be a secret? Why is this language so misunderstood?

盡管它很流行,但是很少有人知道JavaScript是一個非常棒的動態面向對象通用編程語言。這居然能成為一個秘密!這門語言為什么被誤解如此之深?



The Name

名字

The Java- prefix suggests that JavaScript is somehow related to Java, that it is a subset or less capable version of Java. It seems that the name was intentionally selected to create confusion, and from confusion comes misunderstanding. JavaScript is not interpreted Java. Java is interpreted Java. JavaScript is a different language.

Java- 前綴很容易使人聯想到Java,并認為它是Java的子集或簡化版的Java??雌饋碜畛踅o它選這個名字是別有用心的,是故意混淆概念、故意制造"誤解"的。JavaScript不是解釋執行的Java。Java是解釋執行的Java。JavaScript是另外一種語言。


JavaScript has a syntactic similarity to Java, much as Java has to C. But it is no more a subset of Java than Java is a subset of C. It is better than Java in the applications that Java (fka Oak) was originally intended for.

JavaScript的語法和Java有相似之處,這就像Java的語法和C很相像一樣。但是它不是Java的子集,就像Java不是C的子集一樣。它在Java(Oak)最初打算進軍的領域中比Java更好。


JavaScript was not developed at Sun Microsystems, the home of Java. JavaScript was developed at Netscape. It was originally called LiveScript, but that name wasn't confusing enough.

JavaScript不是Sun Microsystems的產品,Sun是Java的家。JavaScript是在Netscape被開發出來的。它最初叫LiveScript,嗯……還是這個名字好。


The -Script suffix suggests that it is not a real programming language, that a scripting language is less than a programming language. But it is really a matter of specialization. Compared to C, JavaScript trades performance for expressive power and dynamism.

-Script后綴讓人認為他不是一門真正的編程語言,和一門"編程語言"還有相當的差距。但是這只是應用領域的問題。和C相比,JavaScript是犧牲了性能但換來了豐富的表現力和靈活的形態。


Lisp in C's Clothing

披著C皮的Lisp

JavaScript's C-like syntax, including curly braces and the clunky for statement, makes it appear to be an ordinary procedural language. This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists. Functions are first class. It has closures. You get lambdas without having to balance all those parens.

JavaScript的類C語法,包括大括號和語句的形式,讓它看起來像普通的面向過程編程語言。這是一種誤解,因為JavaScript和函數式語言,比如 Lisp 或 Scheme,有更多的相似之處,而不是和C或Java。它使用數組而不是列表,使用對象而不是屬性列表。函數是第一位的,它有閉包(closures),另外你還可以使用lambda表達式。

 




Typecasting

類型轉換

JavaScript was designed to run in Netscape Navigator. Its success there led to it becoming standard equipment in virtually all web browsers. This has resulted in typecasting. JavaScript is the George Reeves of programming languages. JavaScript is well suited to a large class of non-Web-related applications

JavaScript最初被設計成在Netscape Navigator中運行,它在Navigator中的成功引領它成為事實上所有web瀏覽器的標準裝備。這就造就了"類型轉換"。JavaScript是編程語言中的 George Reeves(超人),是大量非web程序的稱職之選。




Moving Target

移動靶

The first versions of JavaScript were quite weak. They lacked exception handling, inner functions, and inheritance. In its present form, it is now a complete object-oriented programming language. But many opinions of the language are based on its immature forms.

JavaScript的最初幾版非常弱,沒有異常處理,沒有內部函數和繼承。現如今,它已經成為完全面向對象的編程語言。但是這門語言的許多思想是基于它不成熟的形式的。


The ECMA committee that has stewardship over the language is developing extensions which, while well intentioned, will aggravate one of the language's biggest problems: There are already too many versions. This creates confusion.

ECMA委員會,這門語言的管家,正在對它進行擴展,也在蓄意惡化它最大的問題:有太多的版本。這是混亂的根源。





Design Errors

設計上的錯誤

No programming language is perfect. JavaScript has its share of design errors, such as the overloading of + to mean both addition and concatenation with type coercion, and the error-prone with statement should be avoided. The reserved word policies are much too strict. Semicolon insertion was a huge mistake, as was the notation for literal regular expressions. These mistakes have led to programming errors, and called the design of the language as a whole into question. Fortunately, many of these problems can be mitigated with a good lint program.

沒有什么編程語言是完美的。JavaScript也有它設計上的錯誤,比如重載的+號隨著類型的不同既表示"相加"又表示"連接",和本該避免的有錯誤傾向的 with 語句。它的保留字策略過于嚴格。分號的插入是一個巨大的錯誤,比如作為字面正則表達式的符號時。這些失誤已直接導致編程中的錯誤,也使這門語言的整體設計遭人質疑。還好,這些問題中有許多都可以在良好的 lint 程序中得以緩解。


The design of the language on the whole is quite sound. Surprisingly, the ECMAScript committee does not appear to be interested in correcting these problems. Perhaps they are more interested in making new ones.

這門語言的整體設計(上的問題)是相當明顯的。奇怪的是ECMAScript委員會并沒有對修正其中存在的問題表現出太大的興趣,也許他們更熱衷于制造新的問題。


 


Lousy Implementations

糟糕的實現

Some of the earlier implementations of JavaScript were quite buggy. This reflected badly on the language. Compounding that, those implementations were embedded in horribly buggy web browsers.

JavaScript的一些早期實現有許多bug,這反過來對語言本身產生了很壞的影響。更糟糕的是這些滿是bug的實現是嵌入在滿是bug的web瀏覽器中的。




Bad Books

糟糕的書

Nearly all of the books about JavaScript are quite awful. They contain errors, poor examples, and promote bad practices. Important features of the language are often explained poorly, or left out entirely. I have reviewed dozens of JavaScript books, and I can only recommend one: JavaScript: The Definitive Guide (4th Edition) by David Flanagan. (Attention authors: If you have written a good one, please send me a review copy.)

幾乎所有的JavaScript書都是相當可怕的。它們包含錯誤,包含不好的例子,并鼓勵不好的做法。JavaScript語言的一些重要特性它們要么沒有解釋清楚,要么根本就沒有提及。我看過很多JavaScript的書,但我只能推薦一本:David Flanagan著的 JavaScript: The Definitive Guide (4th Edition)  (《JavaScript權威指南 第四版》)。(作者們請注意:如果你們寫出了好書請發給我一份副本,我給你們校對。)




Substandard Standard

準標準”的標準

The official specification for the language is published by ECMA. The specification is of extremely poor quality. It is difficult to read and very difficult to understand. This has been a contributor to the Bad Book problem because authors have been unable to use the standard document to improve their own understanding of the language. ECMA and the TC39 committee should be deeply embarrassed.

ECMA公布的官方語言規范的質量極其的差。不僅難讀而且極其難懂。它可為那些"糟糕的書"做出了不小的貢獻,因為那些作者無法通過這個標準文檔來更深地理解這門語言。ECMA和TC39應該為此感到非常尷尬。




Amateurs

業余者

Most of the people writing in JavaScript are not programmers. They lack the training and discipline to write good programs. JavaScript has so much expressive power that they are able to do useful things in it, anyway. This has given JavaScript a reputation of being strictly for the amateurs, that it is not suitable for professional programming. This is simply not the case.

使用JavaScript的人大多不是程序員,他們缺少寫良好程序的培訓和訓練。JavaScript有非常強大的表現力,不管怎樣他們也能使用它做有用的事情。這給了JavaScript一個”全然適合業余愛好者而不適合專業程序員“的名聲。這很明顯是一個錯誤。




Object-Oriented

面向對象

Is JavaScript object-oriented? It has objects which can contain data and methods that act upon that data. Objects can contain other objects. It does not have classes, but it does have constructors which do what classes do, including acting as containers for class variables and methods. It does not have class-oriented inheritance, but it does have prototype-oriented inheritance.

JavaScript是面向對象的嗎?它有對象,它的對象可以包含數據以及對數據進行操作的方法,對象也可以包含其他的對象。它沒有類,但是它有構造函數來做類的事情,包括聲明類的變量和方法。它沒有面向類的繼承,但是他有面向原型的繼承。


The two main ways of building up object systems are by inheritance (is-a) and by aggregation (has-a). JavaScript does both, but its dynamic nature allows it to excel at aggregation.

構建對象系統的兩大主要方法是繼承(is-a)和聚合(has-a)。這兩者JavaScript都有,但是它的動態天性允許有比聚合更好的實現方式。


Some argue that JavaScript is not truly object oriented because it does not provide information hiding. That is, objects cannot have private variables and private methods: All members are public.

一些關于JavaScript不是真的面向對象的爭論其理由是它沒有提供信息隱藏。也就是說JavaScript的對象沒有私有變量和私有方法:它的所有成員都是公開的。


But it turns out that JavaScript objects can have private variables and private methods. (Click here now to find out how.) Of course, few understand this because JavaScript is the world's most misunderstood programming language.

但是事實是JavaScript 的對象可以有私有變量和私有方法(點擊這里來看如何實現)。當然,之所以很少有人知道這個是因為JavaScript是世界上誤解最深的語言嘛。


Some argue that JavaScript is not truly object oriented because it does not provide inheritance. But it turns out that JavaScript supports not only classical inheritance, but other code reuse patterns as well.

另一些關于JavaScript不是真的面向對象的爭論其理由是它沒有提供繼承。但是事實是JavaScript不但支持經典的繼承,而且支持其他一些代碼重用的模式。

覺得這篇文章很不錯,轉載過來與大家一起分享.



]]>
Javascript中最常用的55個經典技巧 http://www.tkk7.com/romkk-shi/archive/2007/08/14/136578.html路邊的石頭-java路邊的石頭-javaTue, 14 Aug 2007 02:21:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136578.htmlhttp://www.tkk7.com/romkk-shi/comments/136578.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/14/136578.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136578.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136578.html

1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標右鍵
<table border oncontextmenu=return(false)><td>no</table> 可用于Table

2. <body onselectstart="return false"> 取消選取、防止復制

3. onpaste="return false" 不準粘貼

4. oncopy="return false;" oncut="return false;" 防止復制

5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址欄前換成自己的圖標

6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖標


7. <input style="ime-mode:disabled"> 關閉輸入法


8. 永遠都會帶著框架
<script language="JavaScript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm為框架網頁
// --></script>


9. 防止被人frame
<SCRIPT LANGUAGE=JAVASCRIPT><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>


10. 網頁將不能被另存為
<noscript><*** src="/*.html>";</***></noscript>


11. <input type=button value="/查看網頁源代碼
onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">
12.刪除時確認
<a href=""javascript :if(confirm("確實要刪除嗎?"))location="boos.asp?&areyou=刪除&page=1"">刪除</a>


13. 取得控件的絕對位置
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>
//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>


14. 光標是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">


15. 判斷上一頁的來源
javascript :
document.referrer


16. 最小化、最大化、關閉窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="/Close"></OBJECT>
<input type=button value="/最小化 onclick=hh1.Click()>
<input type=button value="/blog/最大化 onclick=hh2.Click()>
<input type=button value=關閉 onclick=hh3.Click()>
本例適用于IE


17.屏蔽功能鍵Shift,Alt,Ctrl
<script>
function look(){
if(event.shiftKey)
alert("禁止按Shift鍵!"); //可以換成ALT CTRL
}
document.onkeydown=look;
</script>


18. 網頁不會被緩存
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">


19.怎樣讓表單沒有凹凸感?
<input type=text style="""border:1 solid #000000">

<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:
1 solid #000000"></textarea>


20.<div><span>&<layer>的區別?
<div>(division)用來定義大段的頁面元素,會產生轉行
<span>用來定義同一行內的元素,跟<div>的唯一區別是不產生轉行
<layer>是ns的標記,ie不支持,相當于<div>


21.讓彈出窗口總是在最上面:
<body onblur="this.focus();">


22.不要滾動條?
讓豎條沒有:
<body style="overflow:scroll;overflow-y:hidden">
</body>
讓橫條沒有:
<body style="overflow:scroll;overflow-x:hidden">
</body>
兩個都去掉?更簡單了
<body scroll="no">
</body>


23.怎樣去掉圖片鏈接點擊后,圖片周圍的虛線?
<a href="#" onFocus="this.blur()"><img src="/logo.jpg" border=0></a>


24.電子郵件處理提交表單
<form name="form1" method="post" action=mailto:****@***.com
enctype="text/plain">
<input type=submit>
</form>


25.在打開的子窗口刷新父窗口的代碼里如何寫?
window.opener.location.reload()


26.如何設定打開頁面的大小
<body onload="top.resizeTo(300,200);">
打開頁面的位置<body onload="top.moveBy(300,200);">


27.在頁面中如何加入不是滿鋪的背景圖片,拉動頁面時背景圖不動
<STYLE>
body
{background-image:url(/logo.gif); background-repeat:no-repeat;
background-position:center;background-attachment: fixed}
</STYLE>


28. 檢查一段字符串是否全由數字組成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>


29. 獲得一個窗口的大小
document.body.clientWidth; document.body.clientHeight


30. 怎么判斷是否是字符
if (/[^/x00-/xff]/g.test(s)) alert("含有漢字");
else alert("全是字符");


31.TEXTAREA自適應文字行數的多少
<textarea rows=1 name=s1 cols=27 onpropertychange
="this.style.posHeight=this.scrollHeight">
</textarea>


32. 日期減去天數等于第二個日期
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上錯誤處理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>


33. 選擇了哪一個Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then
window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="/style" checked>Style
<INPUT name="radio1" type="radio" value="/blog/barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>


34.腳本永不出錯
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide
function killErrors() {
return true;
}
window.onerror = killErrors;
// -->
</SCRIPT>


35.ENTER鍵可以讓光標移到下一個輸入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">


36. 檢測某個網站的鏈接速度:
把如下代碼加入<body>區域中:
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.cctv.com"
function butt(){
***("<form name=autof>")
for(var i=1;i<autourl.length;i++)
***("<input type=text name=txt"+i+" size=10 value="/測試中……> =》<input type=text
name=url"+i+" size=40> =》<input type=button value="/blog/GO
onclick=window.open(this.form.url"+i+".value)><br>")
***("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="/鏈接超時"}
else
{document.forms[0]["txt"+b].value="/blog/時間"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)***("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1
onerror=auto("http://"+autourl+"")>")}
run()</script>


37. 各種樣式的光標
auto :標準光標
default :標準箭頭
hand :手形光標
wait :等待光標
text :I形光標
vertical-text :水平I形光標
no-drop :不可拖動光標
not-allowed :無效光標
help :?幫助光標
all-scroll :三角方向標
move :移動標
crosshair :十字標
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize


38.頁面進入和退出的特效
進入頁面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出頁面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">  
這個是頁面被載入和調出時的一些特效。duration表示特效的持續時間,以秒為單位。transition表示使用哪種特效,取值為1-23:
  0 矩形縮小
  1 矩形擴大
  2 圓形縮小
  3 圓形擴大
  4 下到上刷新
  5 上到下刷新
  6 左到右刷新
  7 右到左刷新
  8 豎百葉窗
  9 橫百葉窗
  10 錯位橫百葉窗
  11 錯位豎百葉窗
  12 點擴散
  13 左右到中間刷新
  14 中間到左右刷新
  15 中間到上下
  16 上下到中間
  17 右下到左上
  18 右上到左下
  19 左上到右下
  20 左下到右上
  21 橫條
  22 豎條
  23 以上22種隨機選擇一種


39.在規定時間內跳轉
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">


40.網頁是否被檢索
<meta name="ROBOTS" content="屬性值">
  其中屬性值有以下一些:
  屬性值為"all": 文件將被檢索,且頁上鏈接可被查詢;
  屬性值為"none": 文件不被檢索,而且不查詢頁上的鏈接;
  屬性值為"index": 文件將被檢索;
  屬性值為"follow": 查詢頁上的鏈接;
  屬性值為"noindex": 文件不檢索,但可被查詢鏈接;
  屬性值為"nofollow": 文件不被檢索,但可查詢頁上的鏈接。


41、email地址的分割
把如下代碼加入<body>區域中
<a href="mailto:webmaster@sina.com">webmaster@sina.com</a>


42、流動邊框效果的表格
把如下代碼加入<body>區域中
<SCRIPT>
l=Array(6,7,8,9,'a','b','b','c','d','e','f')
Nx=5;Ny=35
t="<table border=0 cellspacing=0 cellpadding=0 height="+((Nx+2)*16)+"><tr>"
for(x=Nx;x<Nx+Ny;x++)
t+="<td width=16 id=a_mo"+x+"> </td>"
t+="</tr><tr><td width=10 id=a_mo"+(Nx-1)+"> </td><td colspan="+(Ny-2)+" rowspan="+(Nx)+"> </td><td width=16 id=a_mo"+(Nx+Ny)+"></td></tr>"
for(x=2;x<=Nx;x++)
t+="<tr><td width=16 id=a_mo"+(Nx-x)+"> </td><td width=16 id=a_mo"+(Ny+Nx+x-1)+"> </td></tr>"
t+="<tr>"
for(x=Ny;x>0;x--)
t+="<td width=16 id=a_mo"+(x+Nx*2+Ny-1)+"> </td>"
***(t+"</tr></table>")
var N=Nx*2+Ny*2
function f1(y){
for(i=0;i<N;i++){
c=(i+y)%20;if(c>10)c=20-c
document.all["a_mo"+(i)].bgColor=""""#0000"+l[c]+l[c]+"'"}
y++
setTimeout('f1('+y+')','1')}
f1(1)
</SCRIPT>


43、JavaScript主頁彈出窗口技巧
窗口中間彈出
<script>
window.open("http://www.cctv.com","","width=400,height=240,top="+(screen.availHeight-240)/2+",left="+(screen.availWidth-400)/2);
</script>
============
<html>
<head>
<script language="LiveScript">
function WinOpen() {
    msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
    msg.***("<HEAD><TITLE>哈 羅!</TITLE></HEAD>");
    msg.***("<CENTER><H1>酷 斃 了!</H1><h2>這 是<B>JavaScript</B>所 開 的 視 窗!</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" onclick="WinOpen()">
</form>
</body>
</html>
==============
一、在下面的代碼中,你只要單擊打開一個窗口,即可鏈接到賽迪網。而當你想關閉時,只要單擊一下即可關閉剛才打開的窗口。
  代碼如下:
  <SCRIPT language="JavaScript">
  <!--
  function openclk() {
  another=open('1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>http://www.ccidnet.com','NewWindow');
  }
  function closeclk() {
  another.close();
  }
  //-->
  </SCRIPT>
  <FORM>
  <INPUT TYPE="BUTTON" NAME="open" value="/打開一個窗口" onClick="openclk()">
  <BR>
  <INPUT TYPE="BUTTON" NAME="close" value="/blog/關閉這個窗口" onClick="closeclk()">
  </FORM>
  二、上面的代碼也太靜了,為何不來點動感呢?如果能給頁面來個降落效果那該多好?。?
  代碼如下:
  <script>
  function drop(n) {
  if(self.moveBy){
  self.moveBy (0,-900);
  for(i = n; i > 0; i--){
  self.moveBy(0,3);
  }
  for(j = 8; j > 0; j--){
  self.moveBy(0,j);
  self.moveBy(j,0);
  self.moveBy(0,-j);
  self.moveBy(-j,0);
  }
  }
  }
  </script>
  <body onLoad="drop(300)">
  三、討厭很多網站總是按照默認窗口打開,如果你能隨心所欲控制打開的窗口那該多好。
  代碼如下:
  <SCRIPT LANGUAGE="JavaScript">
  <!-- Begin
  function popupPage(l, t, w, h) {
  var windowprops = "location=no,scrollbars=no,menubars=no,toolbars=no,resizable=yes" +
  ",left=" + l + ",top=" + t + ",width=" + w + ",height=" + h;
  var URL = "http://www.80cn.com";
  popup = window.open(URL,"MenuPopup",windowprops);
  }
  // End -->
  </script>
  <table>
  <tr>
  <td>
  <form name=popupform>
  <pre>
  打開頁面的參數<br>
  離開左邊的距離: <input type=text name=left size=2 maxlength=4> pixels
  離開右邊的距離: <input type=text name=top size=2 maxlength=4> pixels
  窗口的寬度: <input type=text name=width size=2 maxlength=4> pixels
  窗口的高度: <input type=text name=height size=2 maxlength=4> pixels
  </pre>
  <center>
  <input type=button value="打開這個窗口!" onClick="popupPage(this.form.left.value, this.form.top.value, this.form.width.value,
this.form.height.value)">
  </center>
  </form>
  </td>
  </tr>
  </table>你只要在相對應的對話框中輸入一個數值即可,將要打開的頁面的窗口控制得很好。


44、頁面的打開移動
把如下代碼加入<body>區域中
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
for (t = 2; t > 0; t--) {
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,-x);
   }
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,x);
   }
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(x,0);
   }
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(-x,0);
     }
   }
}
//-->
//   End -->
</script>


45、顯示個人客戶端機器的日期和時間
<script language="LiveScript">
<!-- Hiding
   today = new Date()
   ***("現 在 時 間 是: ",today.getHours(),":",today.getMinutes())
   ***("<br>今 天 日 期 為: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>


46、自動的為你每次產生最後修改的日期了:
<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
   <script language="LiveScript">
   <!--   hide script from old browsers
     ***(document.lastModified)
   // end hiding contents -->
   </script>
</body>
</html>


47、不能為空和郵件地址的約束:
<html>
<head>
<script language="JavaScript">
<!-- Hide
function test1(form) {
   if (form.text1.value == "")
     alert("您 沒 寫 上 任 何 東 西, 請 再 輸 入 一 次 !")
   else {
    alert("嗨 "+form.text1.value+"! 您 已 輸 入 完 成 !");
   }
}
function test2(form) {
   if (form.text2.value == "" ||
       form.text2.value.indexOf('@', 0) == -1)
         alert("這 不 是 正 確 的 e-mail address! 請 再 輸 入 一 次 !");
   else alert("您 已 輸 入 完 成 !");
}
// -->
</script>
</head>
<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="輸 入 測 試" onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="輸 入 測 試" onClick="test2(this.form)">
</body>


48、跑馬燈
<html>
<head>
<script language="JavaScript">
<!-- Hide
var scrtxt="怎麼樣 ! 很酷吧 ! 您也可以試試."+"Here goes your message the visitors to your
page will "+"look at for hours in pure fascination...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;
function scroll() {
   pos++;
   var scroller="";
   if (pos==lentxt) {
     pos=1-width;
   }
   if (pos<0) {
     for (var i=1; i<=Math.abs(pos); i++) {
       scroller=scroller+" ";}
     scroller=scroller+scrtxt.substring(0,width-i+1);
   }
   else {
     scroller=scroller+scrtxt.substring(pos,width+pos);
   }
   window.status = scroller;
   setTimeout("scroll()",150);
   }
//-->
</script>
</head>
<body onLoad="scroll();return true;">
這里可顯示您的網頁 !
</body>
</html>


49、在網頁中用按鈕來控制前頁,后頁和主頁的顯示。
<html>
<body>
<FORM NAME="buttonbar">
      <INPUT TYPE="button" VALUE="Back" onClick="history.back()">
      <INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
      <INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
</FORM>
</body>
</html>
50、查看某網址的源代碼
把如下代碼加入<body>區域中
<SCRIPT>
function add()
{
var ress=document.forms[0].luxiaoqing.value
window.location="view-source:"+ress;
}
</SCRIPT>
輸入要查看源代碼的URL地址:
<FORM><input type="text" name="luxiaoqing" size=40 value="http://"></FORM>
<FORM><br>
<INPUT type="button" value="查看源代碼" onClick=add()>
</FORM>


51、title顯示日期
把如下代碼加入<body>區域中:
<script language="JavaScript1.2">
<!--hide
var isnMonth = new
Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
var isnDay = new
Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六","星期日");
today = new Date () ;
Year=today.getYear();
Date=today.getDate();
if (document.all)
document.title="今天是: "+Year+"年"+isnMonth[today.getMonth()]+Date+"日"+isnDay[today.getDay()]
//--hide-->
</script>


52、顯示所有鏈接
把如下代碼加入<body>區域中
<script language="JavaScript1.2">
<!--
function extractlinks(){
var links=document.all.tags("A")
var total=links.length
var win2=window.open("","","menubar,scrollbars,toolbar")
win2.***("<font size='2'>一共有"+total+"個連接</font><br>")
for (i=0;i<total;i++){
win2.***("<font size='2'>"+links[i].outerHTML+"</font><br>")
}
}
//-->
</script>
<input type="button" onClick="extractlinks()" value="顯示所有的連接">


53、回車鍵換行
把如下代碼加入<body>區域中
<script type="text/javascript">                
function handleEnter (field, event) {
   var keyCode = event.keyCode ? event.keyCode : event.which ?
event.which : event.charCode;
   if (keyCode == 13) {
    var i;
    for (i = 0; i < field.form.elements.length; i++)
     if (field == field.form.elements[i])
      break;
    i = (i + 1) % field.form.elements.length;
    field.form.elements[i].focus();
    return false;
   }
   else
   return true;
}      
</script>
<form>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<textarea>回車換行


54、確認后提交
把如下代碼加入<body>區域中
<SCRIPT LANGUAGE="JavaScript">
<!--
function msg(){
if (confirm("你確認要提交嘛!"))
document.lnman.submit()
}
//-->
</SCRIPT>
<form name="lnman" method="post" action="">
   <p>
     <input type="text" name="textfield" value="確認后提交">
   </p>
   <p>
     <input type="button" name="Submit" value="提交" onclick="msg();">
   </p>
</form>


55、改變表格的內容
把如下代碼加入<body>區域中
<script>
var arr=new Array()
arr[0]="一一一一一";
arr[1]="二二二二二";
arr[2]="三三三三三";
</script>
<select onchange="zz.cells[this.selectedIndex].innerHTML=arr[this.selectedIndex]">
   <option value=a>改變第一格</option>
   <option value=a>改變第二格</option>
   <option value=a>改變第三格</option>
</select>
<table id=zz border=1>
   <tr height=20>
     <td width=150>第一格</td>
<td width=150>第二格</td>
<td width=150>第三格</td>
   </tr>
</table>



]]>
使用xfire建立webservice http://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.html路邊的石頭-java路邊的石頭-javaMon, 13 Aug 2007 06:17:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.htmlhttp://www.tkk7.com/romkk-shi/comments/136371.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136371.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136371.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136371.html

webservice的工作原理

 

實際上,WebService的主要目標是跨平臺的可互操作性。為了達到這一目標,WebService完全基于XML(可擴展標記語言)、XSDXMLSchema)等獨立于平臺、獨立于軟件供應商的標準,是創建可互操作的、分布式應用程序的新平臺。由此可以看出,在以下四種情況下,使用WebService會帶來極大的好處。

 

優勢一:跨防火墻的通信

如果應用程序有成千上萬的用戶,而且分布在世界各地,那么客戶端和服務器之間的通信將是一個棘手的問題。因為客戶端和服務器之間通常會有防火墻或者代理服務器。在這種情況下,使用DCOM就不是那么簡單,通常也不便于把客戶端程序發布到數量如此龐大的每一個用戶手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應用程序的中間層暴露給最終用戶。這樣做的結果是開發難度大,程序很難維護。

 

舉個例子,在應用程序里加入一個新頁面,必須先建立好用戶界面(Web頁面),并在這個頁面后面,包含相應商業邏輯的中間層組件,還要再建立至少一個ASP頁面,用來接受用戶輸入的信息,調用中間層組件,把結果格式化為HTML形式,最后還要把“結果頁”送回瀏覽器。要是客戶端代碼不再如此依賴于HTML表單,客戶端的編程就簡單多了。

如果中間層組件換成WebService的話,就可以從用戶界面直接調用中間層組件,從而省掉建立ASP頁面的那一步。要調用WebService,可以直接使用MicrosoftSOAPToolkit.NET這樣的SOAP客戶端,也可以使用自己開發的SOAP客戶端,然后把它和應用程序連接起來。不僅縮短了開發周期,還減少了代碼復雜度,并能夠增強應用程序的可維護性。同時,應用程序也不再需要在每次調用中間層組件時,都跳轉到相應的“結果頁”。

從經驗來看,在一個用戶界面和中間層有較多交互的應用程序中,使用WebService這種結構,可以節省花在用戶界面編程上20%的開發時間。另外,這樣一個由WebService組成的中間層,完全可以在應用程序集成或其它場合下重用。最后,通過WebService把應用程序的邏輯和數據“暴露”出來,還可以讓其它平臺上的客戶重用這些應用程序。

 

優勢二:應用程序集成

允許在不同平臺上、以不同語言編寫的各種程序以基于標準的方式相互通信。企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM主機上的程序中獲取數據;或者把數據發送到主機或UNIX應用程序中去。即使在同一個平臺上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService,應用程序可以用標準的方法把功能和數據“暴露”出來,供其它應用程序使用。

例如,有一個訂單記錄程序,用于從客戶獲得新訂單,包括客戶信息、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程序,用于實際貨物發送的管理。這兩個程序來自不同軟件廠商。一份新訂單進來之后,訂單記錄程序需要通知訂單執行程序發送貨物。通過在訂單執行程序上面增加一層WebService,訂單執行程序可以把“AddOrder”函數“暴露”出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調用這個函數來發送貨物了。

 

優勢三:B2B的集成

WebService集成應用程序,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的界限時會怎么樣呢?跨公司的商務交易集成通常叫做B2B集成。

WebServiceB2B集成成功的關鍵。通過WebService,公司可以把關鍵的商務應用“暴露”給指定的供應商和客戶。例如,把電子下單系統和電子發票系統“暴露”出來,客戶就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料采購發票。當然,這并不是一個新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實現要比EDI簡單得多,而且WebService運行在Internet上,在世界任何地方都可輕易實現,其運行成本就相對較低。不過,WebService并不像EDI那樣,是文檔交換或B2B集成的完整解決方案。WebService只是B2B集成的一個關鍵部分,還需要許多其它的部分才能實現集成。

WebService來實現B2B集成的最大好處在于可以輕易實現互操作性。只要把商務邏輯“暴露”出來,成為WebService,就可以讓任何指定的合作伙伴調用這些商務邏輯,而不管他們的系統在什么平臺上運行,使用什么開發語言。這樣就大大減少了花在B2B集成上的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B集成。

 

優勢四:軟件和數據重用

軟件重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,另一種形式是二進制形式的組件重用。

WebService集成各種應用中的功能,為用戶提供一個統一的界面

當前,像表格控件或用戶界面控件這樣的可重用軟件組件,在市場上都占有很大的份額。但這類軟件的重用有一個很大的限制,就是重用僅限于代碼,數據不能重用。原因在于,發布組件甚至源代碼都比較容易,但要發布數據就沒那么容易,除非是不會經常變化的靜態數據。

WebService在允許重用代碼的同時,可以重用代碼背后的數據。使用WebService,再也不必像以前那樣,要先從第三方購買、安裝軟件組件,再從應用程序中調用這些組件;只需要直接調用遠端的WebService就可以了。舉個例子,要在應用程序中確認用戶輸入的地址,只需把這個地址直接發送給相應的WebService,這個WebService就會幫你查閱街道地址、城市、省區和郵政編碼等信息,確認這個地址是否在相應的郵政編碼區域。WebService的提供商可以按時間或使用次數來對這項服務進行收費。這樣的服務要通過組件重用來實現是不可能的,那樣的話你必須下載并安裝好包含街道地址、城市、省區和郵政編碼等信息的數據庫,而且這個數據庫還是不能實時更新的。

另一種軟件重用的情況是,把好幾個應用程序的功能集成起來。例如,要建立一個局域網上的門戶站點應用,讓用戶既可以查詢聯邦快遞包裹,查看股市行情,又可以管理自己的日程安排,還可以在線購買電影票?,F在Web上有很多應用程序供應商,都在其應用中實現了這些功能。一旦他們把這些功能都通過WebService“暴露”出來,就可以非常容易地把所有這些功能都集成到你的門戶站點中,為用戶提供一個統一的、友好的界面。

將來,許多應用程序都會利用WebService,把當前基于組件的應用程序結構擴展為組件/WebService的混合結構,可以在應用程序中使用第三方的WebService提供的功能,也可以把自己的應用程序功能通過WebService提供給別人。兩種情況下,都可以重用代碼和代碼背后的數據。

從以上論述可以看出,WebService在通過Web進行互操作或遠程調用的時候是最有用的。不過,也有一些情況,WebService根本不能帶來任何好處。

 

短處一:單機應用程序

目前,企業和個人還使用著很多桌面應用程序。其中一些只需要與本機上的其它程序通信。在這種情況下,最好就不要用WebService,只要用本地的API就可以了。COM非常適合于在這種情況下工作,因為它既小又快。運行在同一臺服務器上的服務器軟件也是這樣。最好直接用COM或其它本地的API來進行應用程序間的調用。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。

 

短處二:局域網的同構應用程序

在許多應用中,所有的程序都是用VBVC開發的,都在Windows平臺下使用COM,都運行在同一個局域網上。例如,有兩個服務器應用程序需要相互通信,或者有一個Win32WinForm的客戶程序要連接局域網上另一個服務器的程序。在這些程序里,使用DCOM會比SOAP/HTTP有效得多。與此相類似,如果一個.NET程序要連接到局域網上的另一個.NET程序,應該使用.NETremoting。有趣的是,在.NETremoting中,也可以指定使用SOAP/HTTP來進行WebService調用。不過最好還是直接通過TCP進行RPC調用,那樣會有效得多。

總之,只要從應用程序結構的角度看,有別的方法比WebService更有效、更可行,那就不要用WebService

Web Service定義為:通過 SOAP Web上提供的軟件服務,使用 WSDL 文件進行說明,并通過 UDDI 進行注冊。

 

 

Web Service架構:Web Service是獨立的、模塊化的應用,能夠通過因特網來描述、發布、定位以及調用。在Web Service的體系架構中包括三個角色:服務提供者(Service Provider)、服務請求者(Service Requestor)、服務注冊器(Service Registry)。角色間主要有三個操作:發布(Publish)、查找(Find)、綁定(Bind)。

下圖清楚的描述了三種角色,以及角色之間的作用關系。

Web Service協議標準

1、簡單對象訪問協議(SOAP

SOAPSimple Object Access Protocol的縮寫,是一種基于XML的不依賴傳輸協議的表示層協議,用來在分散或分布式的應用程序之間方便地以對象的形式交換數據。在SOAP的下層,可以是HTTP,也可以是SMTP/POP3,還可以是為一些應用而專門設計的特殊的通信協議。

SOAP包括三個主要部分:

SOAP封裝結構:定義了一個整體框架,以表示消息中包含什么內容,誰來處理這些內容以及這些內容是可選的或是必需的。

SOAP編碼規則:定義了用以交換應用程序定義的數據類型的實例的一系列機制。

SOAP RPC表示:定義了一個用來表示遠程過程調用和應答的協定。

2、Web Service描述語言(WSDL

WSDLWeb Service Description Language的縮寫,該語言將網絡服務定義成一個能交換消息的通信端點集,為分布式系統提供了幫助文檔,同時也可作為自動實現應用間通信的解決方案。

3、統一描述、發現和集成協議(UDDI

UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現標準規范,同時也包含一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標準。

 

 

       通過xfire實現了webservice。下面詳細介紹一下xfire。

XFire是一個免費的,開源的SOAP框架. 它不僅允許你輕松簡易地實現這么一個環境.而且還提供了很多先進的特性.如果你的Web應用有一個Java, 現在你希望這個類變成Web服務,XFire完成這一工作你不必寫一句代碼.僅需操作一下部署描述器,你就會得到一個Web服務.

一、建立接口文件com.resoft.recis.ws.ReCISService

public interface ReCISService {

       //請求系統設置信息

       public AppInfo getAppInfo();

}

public class ReCISServiceImp implements ReCISService {

       public com.resoft.recis.ws.AppInfo getAppInfo() {

              // TODO Auto-generated method stub

              return com.resoft.recis.ws.AppInfo.getAppInfo();

       }

}

二、已存在類com.resoft.recis.ws. AppInfo

public class AppInfo {

       double cardLeft;

       /** default constructor */

       public AppInfo() {

       }

       public double getCardLeft() {

              return cardLeft;

       }

       public void setCardLeft(double cardLeft) {

              this.cardLeft = cardLeft;

       }

       public static  AppInfo getAppInfo() {

              Session session = HibernateUtil.getSession();

              com.resoft.recis.biz.AppInfo dbappinfo = (com.resoft.recis.biz.AppInfo) Util

                            .getHQLResult(session, "from AppInfo");

              if (dbappinfo == null) {

                     return null;

              }           

              com.resoft.recis.ws.AppInfo appinfo = new com.resoft.recis.ws.AppInfo();

              appinfo.setOperid("");

              appinfo.setOrgcode("");

              appinfo.setCardHeight(dbappinfo.getCardHeight());

              appinfo.setCardLeft(dbappinfo.getCardLeft());

              appinfo.setCardTop(dbappinfo.getCardTop());

              appinfo.setCardWidth(dbappinfo.getCardWidth());

              HibernateUtil.closeSession();

              return appinfo;

       }

}

三、Web.xml應用的部署描述

    <!—        xfireservlet配置文件 -->

    <servlet>

       <servlet-name>XFireServlet</servlet-name>

       <display-name>XFire Servlet</display-name>

       <servlet-class>

           org.codehaus.xfire.transport.http.XFireConfigurableServlet

       </servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>XFireServlet</servlet-name>

       <url-pattern>/servlet/XFireServlet/*</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

       <servlet-name>XFireServlet</servlet-name>

       <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

四、創建services.xml文件

XFire本身就是基于Servlet的應用,xfire使用services.xml文件來完成Web服務配置。這個文件位于src/META-INF/xfire目錄下,

src\META-INF\xfire

下面是基本的配置條目,這個配置文件中配置了xfire的接口,實現與驗印控件的交互。

<beans xmlns="http://xfire.codehaus.org/config/1.0">

 <service>

    <name>ReCISService</name>   

    <namespace>http://resoft</namespace>

    <serviceClass>com.resoft.recis.ws.ReCISService</serviceClass>   <implementationClass>com.resoft.recis.ws.ReCISServiceImp</implementat          ionClass>

 </service>

</beans>

 

services.xml文件中的具體內容如下:

<service>元素:

Web服務的定義包含在<service>元素內。<service>元素下還有若干子元素。

<name>子元素:

可以提供任何有效的xml名字,這個名字會被客戶端程序和服務器上的其他組件使用.例如,當服務器起來以后,你可以在瀏覽器上使用這個名稱來查看WSDL.

<namespace>子元素:

任何有效地xml名稱都可以, <namespace>將作為你服務器的唯一標識變量使用.

<serviceClass>子元素:

包含Java類名用來指明方法的簽名.在這個例子中是ReCISService接口.如果Java類沒有實現任何接口,那就填入類名.只需要這一個入口來將他們轉換成Web服務.

<implementationClass>子元素:

記錄實現接口的Java類名.這是一個可選元素.如果前一個元素<serviceClass>填入的是接口,那么此處就要填入相應的實現類名.

五、XFire和所有必要的庫文件

訪問XFire官方網站http://xfire.codehaus.org/ 下載xfire-distribution-1.2.5.zip并解壓到本地文件夾中.參考xfire-distribution-1.2.5\xfire-1.2.5\manual\Dependency Guide.html中介紹拷貝相關jar包到WEB-INF\lib,xfire-distribution-1.2.5需要的jar包如下:

 

  xfire-all-1.2.5.jar

? activation-1.1.jar

commons-codec-1.3.jar

commons-httpclient-3.0.jar

commons-logging-1.0.4.jar

mail-1.4.jar

jaxen-1.1-beta-9.jar

jdom-1.0.jar

junit-3.8.1.jar

servlet-api-2.3.jar

spring-1.2.6.jar

stax-api-1.0.1.jar

wsdl4j-1.6.1.jar

wstx-asl-3.2.0.jar

xbean-2.2.0.jar

xbean-spring-2.8.jar

XmlSchema-1.1.jar

xfire-jsr181-api-1.0-M1.jar

六、通過URL驗證Web服務有效性

首先,我們先來看看WSDL是否有效。在瀏覽器中輸入URL地址為http://127.0.0.1/test/services/ReCISService?wsdl 注意URLIP地址和端口號是否需要修改。如果輸入了有效的URL,將會看到以<wsdl:definitions>為根結點的xml文件。這個文件叫做web服務的WSDL.如果你看到了這個文件,那么初步驗證你的Web服務有效。

但是這個驗證還不夠。有時候情況會復雜一些,你可以看到WSDL,但是客戶端卻無法訪問Web服務。因此要真正檢驗Web服務是否真的好使,就要用客戶端程序對Web服務作一次真正的調用。

七、客戶端驗證Web服務有效性

建立下面測試類測試Web服務器的有效性。

public class TestWebservice

{

    public static void main(String args[])

    {

        String serviceURL ="http://127.0.0.1/test/services/ReCISService";  

Service serviceModel = new ObjectServiceFactory().create(ReCISService.class,null,"http://resoft",null);

       

        XFireProxyFactory serviceFactory = new XFireProxyFactory();

       

        try

        {

            ReCISService service = (ReCISService) serviceFactory.create(serviceModel, serviceURL);

            Client client = Client.getInstance(service);

            System.out.println("begin");

            com.resoft.recis.ws.AppInfo ai=service.getAppInfo();

            System.out.println(ai.getCardHeight());

            System.out.println("end");

        }

        catch (MalformedURLException e)

        {

            e.printStackTrace();

        } catch (Exception e) {

           e.printStackTrace();

        }

    }

}



]]>
什么是Web Service?http://www.tkk7.com/romkk-shi/archive/2007/08/13/136370.html路邊的石頭-java路邊的石頭-javaMon, 13 Aug 2007 06:15:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136370.htmlhttp://www.tkk7.com/romkk-shi/comments/136370.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136370.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136370.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136370.html

Web service到底是什么;在什么情況下你應該使用Web service。

分布式應用程序和瀏覽器

研究一下當前的應用程序開發,你會發現一個絕對的傾向:人們開始偏愛基于瀏覽器的瘦客戶應用程序。這當然不是因為瘦客戶能夠提供更好的用戶界面,而是因為它能夠避免花在桌面應用程序發布上的高成本。發布桌面應用程序成本很高,一半是因為應用程序安裝和配置的問題,另一半是因為客戶和服務器之間通信的問題。

傳統的Windows富客戶應用程序使用DCOM來與服務器進行通信和調用遠程對象。配置好DCOM使其在一個大型的網絡中正常工作將是一個極富挑戰性的工作,同時也是許多IT工程師的噩夢。事實上,許多IT工程師寧愿忍受瀏覽器所帶來的功能限制,也不愿在局域網上去運行一個DCOM。在我看來,結果就是一個發布容易,但開發難度大而且用戶界面極其受限的應用程序。極端的說,就是你花了更多的資金和時間,卻開發出從用戶看來功能更弱的應用程序。不信?問問你的會計師對新的基于瀏覽器的會計軟件有什么想法:絕大多數商用程序用戶希望使用更加友好的Windows用戶界面。

關于客戶端與服務器的通信問題,一個完美的解決方法是使用HTTP協議來通信。這是因為任何運行Web瀏覽器的機器都在使用HTTP協議。同時,當前許多防火墻也配置為只允許HTTP連接。

許多商用程序還面臨另一個問題,那就是與其他程序的互操作性。如果所有的應用程序都是使用COM或.NET語言寫的,并且都運行在Windows平臺上,那就天下太平了。然而,事實上大多數商業數據仍然在大型主機上以非關系文件(VSAM)的形式存放,并由COBOL語言編寫的大型機程序訪問。而且,目前還有很多商用程序繼續在使用C++、Java、Visual Basic和其他各種各樣的語言編寫?,F在,除了最簡單的程序之外,所有的應用程序都需要與運行在其他異構平臺上的應用程序集成并進行數據交換。這樣的任務通常都是由特殊的方法,如文件傳輸和分析,消息隊列,還有僅適用于某些情況的的API,如IBM的"高級程序到程序交流(APPC)"等來完成的。在以前,沒有一個應用程序通信標準,是獨立于平臺、組建模型和編程語言的。只有通過Web Service,客戶端和服務器才能夠自由的用HTTP進行通信,不論兩個程序的平臺和編程語言是什么。

什么是Web Service

對這個問題,我們至少有兩種答案。從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程序。我們把調用這個Web service 的應用程序叫做客戶。例如,你想創建一個Web service ,它的作用是返回當前的天氣情況。那么你可已建立一個ASP頁面,它接受郵政編碼作為查詢字符串,然后返回一個由逗號隔開的字符串,包含了當前的氣溫和天氣。要調用這個ASP頁面,客戶端需要發送下面的這個HTTP GET請求:

http://host.company.com/weather.asp?zipcode=20171

返回的數據就應該是這樣:

21,晴

這個ASP頁面就應該可以算作是Web service 了。因為它基于HTTP GET請求,暴露出了一個可以通過Web調用的API。當然,Web service 還有更多的東西。

下面是對Web service 更精確的解釋: Web services是建立可互操作的分布式應用程序的新平臺。作為一個Windows程序員,你可能已經用COM或DCOM建立過基于組件的分布式應用程序。COM是一個非常好的組件技術,但是我們也很容易舉出COM并不能滿足要求的情況。

Web service平臺是一套標準,它定義了應用程序如何在Web上實現互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service ,只要我們可以通過Web service標準對這些服務進行查詢和訪問。

新平臺

Web service平臺需要一套協議來實現分布式應用程序的創建。任何平臺都有它的數據表示方法和類型系統。要實現互操作性,Web service平臺必須提供一套標準的類型系統,用于溝通不同平臺、編程語言和組件模型中的不同類型系統。在傳統的分布式系統中,基于界面(interface)的平臺提供了一些方法來描述界面、方法和參數(譯注:如COM和COBAR中的IDL語言)。同樣的,Web service平臺也必須提供一種標準來描述Web service,讓客戶可以得到足夠的信息來調用這個Web service。最后,我們還必須有一種方法來對這個Web service進行遠程調用。這種方法實際是一種遠程過程調用協議(RPC)。為了達到互操作性,這種RPC協議還必須與平臺和編程語言無關。下面幾個小節就簡要介紹了組成Web service平臺的這三個技術。

XML和XSD

可擴展的標記語言(XML)是Web service平臺中表示數據的基本格式。除了易于建立和易于分析外,XML主要的優點在于它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的:軟件廠商是不會選擇一個由競爭對手所發明的技術的。

XML解決了數據表示的問題,但它沒有定義一套標準的數據類型,更沒有說怎么去擴展這套數據類型。例如,整形數到底代表什么?16位,32位,還是64位?這些細節對實現互操作性都是很重要的。W3C制定的XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的數據類型,并給出了一種語言來擴展這套數據類型。Web service平臺就是用XSD來作為其數據類型系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合Web service標準,所有你使用的數據類型都必須被轉換為XSD類型。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。在第二章中,我們將深入XSD,學習怎樣轉換自定義的數據類型(例如類)到XSD的類型。

SOAP

Web service建好以后,你或者其他人就會去調用它。簡單對象訪問協議(SOAP)提供了標準的RPC方法來調用Web service。實際上,SOAP在這里有點用詞不當:它意味著下面的Web service是以對象的方式表示的,但事實并不一定如此:你完全可以把你的Web service寫成一系列的C函數,并仍然使用SOAP進行調用。SOAP規范定義了SOAP消息的格式,以及怎樣通過HTTP協議來使用SOAP。SOAP也是基于XML和XSD的,XML是SOAP的數據編碼方式。第三章我們會討論SOAP,并結識SOAP消息的各種元素。

WSDL

你會怎樣向別人介紹你的Web service有什么功能,以及每個函數調用時的參數呢?你可能會自己寫一套文檔,你甚至可能會口頭上告訴需要使用你的Web service的人。這些非正式的方法至少都有一個嚴重的問題:當程序員坐到電腦前,想要使用你的Web service的時候,他們的工具(如Visual Studio)無法給他們提供任何幫助,因為這些工具根本就不了解你的Web

service。解決方法是:用機器能閱讀的方式提供一個正式的描述文檔。Web service描述語言(WSDL)就是這樣一個基于XML的語言,用于描述Web service及其函數、參數和返回值。因為是基于XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應Web service的代碼。



]]>
Web Service在電信行業數據業務中的應用 http://www.tkk7.com/romkk-shi/archive/2007/08/13/136369.html路邊的石頭-java路邊的石頭-javaMon, 13 Aug 2007 06:11:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136369.htmlhttp://www.tkk7.com/romkk-shi/comments/136369.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136369.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136369.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136369.html
對運營商來說,所謂電信數據業務一般是指承載于GSM、GRPS、WirelessLAN等通信網絡,接入到基于IP(InternetProtocol)網絡技術的各類數據設備與服務器,以Internet為資源基礎提供內容與應用服務的各類新型業務的總稱,例如:短消息(SMS)、無線應用協議(WAP)、多媒體消息(MMS)、電子郵件(E-mail)、空中接口(下載)服務器(OTAServer)等。從商業模式的角度來看,電信運營商利用自己成熟的通信網絡和豐富的后端服務與計費系統,組成服務提供平臺(Service Delivery Platform),為新聞、游戲、郵件、商務等各種Internet服務提供用戶接入、管理、計費等基礎設施支持,擴展了對自身終端用戶的商業服務范圍;與Internet內容與應用服務商實行收入分成,開啟了新的營收渠道。長期以來,電信運營商掌握著三個技術制高點:通信渠道、用戶數據庫和營帳系統。圍繞著這些制高點,運營商進行了長期的投入與建設,并且在語音等傳統業務領域已經達到了很高的技術成熟度。然而,電信數據業務的開展為運營商的技術儲備帶來了新的需求和挑戰,新的業務系統與管理平臺大量涌現,彼此之間以及與舊有系統的整合迫在眉睫。獨特的商業合作模式創造了獨特的供應鏈管理(Supply-Chain Management)的需求,即合作服務提供商關系管理。據估計,電信行業傳統業務中運營商需要管理的設備元素與終端用戶數目的比例平均為1:10000,即一個設備元素平均被用于服務10000個用戶。隨著新業務的開展和數據網絡設備及服務器的增加,該比例已經縮減至1:500,即一個設備元素平均被用于服務500個用戶。很多數據業務靈活跨越多個通信渠道、用戶和合作服務提供商,進一步增加了設備整合的復雜性。

    基于上述原因,目前國內外成熟運營商的基礎設施建設重點已經從個別關鍵設備轉移到了端到端的設備整合,這種整合常常跨越大量合作伙伴的邊界。面臨這樣的變化,傳統的系統整合技術,如點對點的私有接口適配器、適用于企業內部使用的傳統分布式對象構件中間件和消息中間件等,已經顯得力不從心。電信互連互通和增值服務鏈的建設需要安全、靈活,有能力跨越合作伙伴IT管理域邊界的新技術。

    Web技術在廣域網應用中的極大成功,XML(eXtendedMark-upLanguage)在電子商務和企業數據交換與整合中的普遍應用以及分布式對象和消息中間件架構在企業內部應用整合中的推廣,從多方面啟發了業界的智慧,于2001年推出了整合三者優勢的WebService技術與面向服務架構(Service-Oriented Architecture,SOA),用以滿足包括電信行業在內的各商務領域對新型整合技術與框架的需求。結合電信行業數據業務的背景,本文介紹了該技術的基本概念及其在系統整合中的應用。

    一、基本概念

    WebService的國際標準由因制定Web和XML技術標準而名滿天下的W3C組織(WorldWideWeb Consortium)制定。目前,由 Web Services 架構組達成一致意見的Web Service的暫行定義為:Web Service是由URI(統一資源標識符)標識的軟件應用程序,其接口和綁定可以通過XML構件進行定義、描述和發現,Web Service支持通過基于因特網的協議使用基于XML的消息與其它軟件應用程序直接交互。

    仔細閱讀這個定義,我們可以看出WebService的用于軟件應用程序之間交互的技術,具有以下基本特征:

    通信層面上的Web特征:使用URI進行標識,并使用各種因特網協議進行通信。

    表示層面上的XML特征:使用XML描述服務接口和綁定信息,通信消息格式使用XML。

    架構層面上的分布式計算特征:服務可以被使用它的應用程序在網絡上查找和發現。

    從上個世紀90年代末開始,許多廠商已經自發的開始使用Web通信協議(HTTP)加XML消息的方法解決各種因特網上的服務整合的問題了。例如:基于位置服務中的LIF(LocationInteroperabilityForum)標準和愛立信、諾基亞、摩托羅拉等公司的實現都使用了HTTP承載XML消息的方式。各類電子商務標準普遍基于XML,并且在實現中使用HTTP協議進行傳輸。一個只有幾頁紙的因特網上遠程過程調用標準XML-RPC則是這類技術的典范,該標準規范了基于XML的調用描述與數據表示,至今仍然在被一些公司應用。

    業界早期零散的努力在W3C組織最終匯聚成為今天WebService標準的基礎。而標準中的服務發現機制則具有些OMG(ObjectManagementGroup)組織制定的CORBA(Common Object Request Broker Architecture)的基于命名服務(Naming Service)和IDL(Interface Definition Language)描述的服務查找的影子。然而,目前Web Service技術和以CORBA為代表的傳統分布式構件對象技術的一個顯著不同在于:Web Service傳遞的是XML數據,而不是對象或對象引用。事實上,在廣域網上不同的商家之間傳遞二進制對象和對象引用會導致服務與被服務方實現技術的緊耦合,是不合適、不現實的。因此,有人提出:Web Service也許更適合使用異步消息進行系統間對話,而不是現在流行的遠程過程調用(Remote Procedure Call,RPC)模式。基于消息的Web Service被稱為Message Web Service,基于RPC機制的Web Service為RPC Web Service。盡管Message Web Service從理論上說會更為靈活、高效,其編程模型卻比較復雜,需要應用開發者具有較高的IT架構設計與程序編制的能力。因此,目前各個IT廠商支持的主流仍然是編程模型較為簡單的RPC Web Service。此外,兩類技術變種有著共同的技術基礎,都采用面向服務架構,符合上述定義。

    二、面向服務的應用架構

    W3CWebService架構組建議了一個的面向服務的WebService架構,如圖1所示。在這個架構中,核心是服務這個概念。服務被定義為執行某類商業任務(比如零件采購或書籍查詢)的一組操作。在Web Service上下文中,可以使用標準的XML技術和Internet協議發布、查找和綁定服務。Web Service 架構定義了3個主要實體。

    圖1面向服務的WebService架構

    服務提供者:負責使用WSDL描述和定義WebService的功能,在UDDI注冊庫(位于服務代理)中發布這些服務的信息,使得它們可以被服務請求者訪問和調用。

    服務代理:負責宣傳服務提供者發布的WebService和允許服務請求者查找發布的WebService 定義。它的作用和電話本的黃頁相同。

    服務請求者:負責通過服務代理查找所需要的WebService后,下載描述WebService的WSDL文檔,根據服務描述來綁定和調用服務提供者提供的Web Service。

    WebService架構的這種三角形設計模式被稱為面向服務的體系結構。它包括了下面3個標準操作。

    發布:由服務提供者執行來宣傳和注冊一個服務的存在和功能,是服務提供者和服務代理之間的操作。

    查找:由服務請求者執行來查找符合特定需求或技術特征的服務,是服務請求者和服務代理之間的操作。

    綁定:由服務請求者執行來調用服務提供者提供的服務,是服務請求者和服務提供者之間的操作。

    WebService是面向服務的架構(ServiceOrientedArchitecture, SOA)的一種實現。SOA是分布式計算領域中采用的一種主要體系結構。和CORBA和DCOM這樣的分布式計算技術不同,Web Service是基于標準和松耦合的。首先,廣泛接受的Internet標準(如XML、SOAP、HTTP等)提供了在各不同廠商解決方案之間的交互性。開發者就可以開發出平臺獨立、編程語言獨立的Web Services,從而能夠充分利用現有的軟硬件資源和人力資源。其次,松耦合將分布計算中的參與者隔離開來,交互兩邊某一方的改動并不會影響到另一方。這兩者的結合意味著公司可以實現某些Web services而不用對使用這些Web Services的客戶端的知識有任何了解。

    SOA的強大和靈活性將給電子商務帶來巨大的好處。如果某企業將其IT基礎設施抽象出來,將其業務功能以某種粒度的服務形式表示并發布出來,每種服務都清晰地表示其業務價值,那么,這些服務的顧客(可能在公司內部,也可能是公司的某個業務伙伴)就可以通過已發布的業務接口來使用這些服務,而不用考慮服務實現的具體技術。

    三、WebService發展階段

    按照目前IT界較為公認的劃分方法,WebService技術從產生到成熟可以分成三個階段:

    基礎服務架構的完善;

    安全與可靠性支持的完善;

    跨域協同(Coordination)和快速服務鏈整合技術(Composition)的完善。

    在第一階段,WebService的發展重點在于服務通信、描述以及發現機制的標準化。在面向服務的架構下,具體的標準規范通信消息的SOAP(SimpleObjectAccess Protocol)協議,規范服務描述的WSDL語言,和用于服務注冊與發現的UDDI(Universal Description, Discovery, and Integration)服務和ebXML(e-Business XML)標準。該階段的主要工作目前已經完成。

    目前,WebService的發展已經到了第二階段,即消息級的WebService安全機制和WebService消息傳輸的可靠性機制的標準化。Web Service作為一種端到端的分布式技術,不同于以往的點對點的技術,傳遞的消息可能穿越各類信息服務中介,如:內容分類過濾的防火墻、商業導購中間商、專業計費服務提供商等。最終的服務,被服務方以及中介之間存在有限的商業信任,這意味著中介既需要看懂并處理部分消息內容,又無權看到與己無關的部分而傳統的因特網點對點安全技術不能滿足這樣的需求。所謂消息級安全是對點對點安全技術的加強與擴充,目的在于滿足端到端的通信安全需要。盡管實現效率還有待提高,目前在電子商務最具權威性的機構,OASIS(Organization for the Advancement of Structured Information Standards)組織中制定了 Web Service Security的發展框架,其核心的WS-Security標準也已經完成了第一版的工作。此外,大多數商業服務需要可靠的信息傳輸,它們共同的需求被抽取出來,就構成了對Web Service可靠性的需求。一些廠商試圖給出這些需求在系統一級的解決方案,提出了一系列的標準化方案,整個工作正在迅速的進行之中。

    此外,2002年7月IBM、微軟和BEA共同提出了WebService跨域協同、事務和服務鏈整合技術的三個標準草案(WebServiceCoordination、Web Service Transaction、Business Process Execution Language for Web Service)標志著Web Service第三階段研究與標準化工作也已經提上了日程。

    四、WebService在電信增值業務平臺的應用示例

    盡管WebService的商業模式目前還處于發展過程中,但其中一些模式已經通過大量的實踐得到了業界的承認,例如,企業之間的信息交換,信息門戶和商業流程的整合。這些模式結合電信領域的特點,產生了一些特有的基于電信的WebService的商業模式。此處以WebService在電信增值業務平臺的應用為示例,說明其在電信行業數據業務中的應用。

    電信增值業務平臺是增值業務價值鏈的技術支撐平臺,管理運營商和ServiceProvider(SP)之間業務集成的商業關系。對于運營商而言,平臺封裝了底層的通信網絡,向SP提供一個開放的安全的訪問網絡能力的標準接口集合。這個集合包括了網絡功能實體、認證、基于內容的計費以及服務定購關系等。SP可以利用這個平臺便捷地在這個平臺上實現新的電信增值業務。ParlayGroup、3GPP和ETSI聯合制定的Parlay/OSA[5]就是這樣一個面向電信增值業務平臺的電信規范。WebService在Parlay/OSA中得到了廣泛的應用。如圖1所示,采納Parlay Web Service的電信增值業務平臺體系結構。增值業務平臺由電信運營商管理和維護,分為兩個邏輯部分:框架和網絡資源能力服務器??蚣芟騍P提供兩種類型的接口支持。其一是面向企業法人的電信服務定購關系的接口支持,如圖2中②所示,包括了SP企業賬戶的管理、應用程序的管理、電信資源使用合同的管理。其二是向SP的電信增值業務的應用程序提供安全接入認證,電信資源查找、簽署服務等級合約、獲得電信服務實例入口和服務質量監控的接口支持,如圖2中③所示。SP應用程序使用的電信資源是由網絡資源能力服務器提供的,如圖2中④所示。這里的電信資源包括話音、短信、位置、用戶狀態和計費等,它們可以通過各種不同的私有協議映射到運營商現有的網絡設備和內部系統中。這些資源通過圖2中①所示的接口注冊到框架。從上可以看出,這種電信增值業務平臺是一個典型的B2B模式(SP和運營商)中采用Web Service進行業務集成的應用示例。

    此外,在OpenMobileAlliance(OMA)組織中的MobileWeb Service(MWS)工作組也在探討如何采用標準的Web Service的技術在移動運營商的網絡中部署并構建新的電信數據業務平臺。目前的工作還處于草案階段。鑒于Parlay在相同的領域中已經有了很多的標準和技術的積累,OMA MWS已經和Parlay簽署了一個合作協議,用于協調雙方的標準制定工作。

    圖2采納ParlayWeb Service的電信增值業務平臺體系結構



]]>
什么時候應該使用Web Servicehttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.html路邊的石頭-java路邊的石頭-javaMon, 13 Aug 2007 06:10:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.htmlhttp://www.tkk7.com/romkk-shi/comments/136367.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136367.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136367.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136367.html 現在我將列舉三種情況,在這三種情況下,你將會發現使用Web service會帶來極大的好處。此后,我還會舉出不應該使用Web service的一些情況。

  跨越防火墻的通信

  如果你的應用程序有成千上萬的用戶,而且他們都分布在世界各地,那么客戶端和服務器之間的通信將是一個棘手的問題。那是因為客戶端和服務器之間通常都會有防火墻或者代理服務器。在這種情況下,你想使用DCOM就不是那么簡單了,而且,通常你也不愿意把你的客戶端程序發布到如此龐大數量的每一個用戶手中。于是,你最終選擇了用瀏覽器作為客戶端,寫下一堆ASP頁面,把應用程序的中間層暴露給最終用戶。結果呢?運氣好的話,只是開發難度大了一些,運氣不好的話,就會得到一個根本無法維護的應用程序。

  想象一下你應該怎么在你的應用程序里面加入一個新的頁面:你必須先建立好用戶界面(Web頁面),以及在這個頁面后面,包含相應商業邏輯的中間層組件。這還不夠,你還要再建立至少一個ASP頁面,用來接受用戶輸入的信息,調用中間層組件,把結果格式化為HTML形式,最后還要把"結果頁"送回瀏覽器。要是客戶端代碼不再如此依賴于HTML表單,客戶端的編程不就簡單多了嗎?還有,建立ASP頁面的那一步可以省略掉嗎?

  當然。如果你的中間層組件是Web service的話,你完全可以從用戶界面直接調用中間層組件,從而省掉建立ASP頁面的那一步。要調用Web service,你可以直接使用Microsoft SOAP Toolkit或.NET這樣的SOAP客戶端,也可以使用你自己開發的SOAP客戶端,然后把它和你的應用程序連接起來。這樣做,不僅可以縮短開發周期,還可以減少代碼的復雜度,并增強整個應用程序的可維護性。同時,你的應用程序也不再需要在每次調用中間層組件時,都跳轉到相應的"結果頁"了。

  以我的經驗來看,在一個用戶界面和中間層有較多交互的應用程序中,使用Web service這種結構,可以輕松的節省花在用戶界面編程上的20%的開發時間。這樣做還有另一個好處,就是你將得到一個由Web service組成的中間層,這一層是完全可以在應用程序集成或其他場合下被重用的。最后,通過Web service把你的應用程序的邏輯和數據暴露出來,還可以讓其它平臺上的客戶重用你的應用程序。

  應用程序集成

  企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發的力量。你的應用程序經常都需要從運行在古老的IBM主機上的程序中獲取數據;或者再把數據發送到主機或UNIX應用程序中去。即使是在同一個平臺上,不同的軟件廠商生產的各種軟件也常常需要集成起來。通過Web service,應用程序可以用標準的方法把功能和數據暴露出來,供其它的應用程序使用。

  例如,你有一個訂單登錄程序,用于登錄從客戶來的新訂單,包括客戶信息、發貨地址、數量、價格和付款方式等信息。同時,你還有一個訂單執行程序,用于實際貨物發送的管理。這兩個程序是來自不同軟件廠商的。一份新訂單進來之后,訂單登錄程序需要通知訂單執行程序發送貨物。通過在訂單執行程序上面增加一層Web service,訂單執行程序可以把"AddOrder"函數暴露出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調用這個函數來發送貨物了。進而通過Web service集成應用程序

  B2B的集成

  用Web service集成應用程序,可以使你公司內部的商務處理更加自動化。但當交易跨越了你的供應商和客戶,突破了公司的界線時又會怎么樣呢?跨公司的商務交易集成通常叫做B2B集成。

  Web service是B2B集成成功的關鍵。通過Web service,你的公司可以把關鍵的商務應用暴露給指定的供應商和客戶。例如,把你的電子下單系統和電子發票系統暴露出來,你的客戶就可以以電子的方式向你發送購貨訂單,而你的供應商則可以以電子的方式把原料采購的發票發送給你。當然,這并不是一個新的概念:電子文檔交換(EDI)早就是這樣了。Web service和EDI之間的主要區別在于,Web service的實現要比EDI簡單得多,而且Web service是運行在Internet上的,在世界任何地方都可輕易實現,這樣其運行成本就相對較低。不過,Web service并不像EDI那樣,是文檔交換或B2B集成的一套完整的解決方案。Web service只是B2B集成的一個關鍵部分,還需要許多其它的部分才能完成這個集成。

  用Web service來實現B2B集成的最大好處在于可以輕易實現互操作性。只要把你的商務邏輯暴露出來,成為Web service,你就可以讓任何指定的合作伙伴輕松的調用你的商務邏輯,而不管他們的系統在什么平臺上運行,使用的是什么開發語言。這樣就大大減少了花在B2B集成的上的時間和成本。這樣的低成本讓許多原本無法承受EDI的投資成本的中小企業也能實現B2B集成。

  軟件重用

  軟件重用是一個很大的主題,它有很多的形式和程度。最基本的形式是源代碼模塊或者類一級的重用。另一種形式是二進制形式的組件重用。當前,像表格控件或用戶界面控件這樣的可重用軟件組件在市場上都占有很大的份額。但這類軟件的重用都有一個很嚴重的限制:重用僅限于代碼,而數據不能被重用。原因在于你可以很輕易的發布組件甚至源代碼,但要發布數據就沒那么容易了,除非那些數據都是不會經常變化的靜態數據。

  而Web service允許你在重用代碼的同時,重用代碼后面的數據。使用Web service,你不再像以前那樣,要先從第三方購買、安裝軟件組件,再從你的應用程序中調用這些組件。你只需要直接調用遠端的Web service就可以了。舉個例子,你想在你的應用程序中確認用戶輸入的郵件地址,那么,你只需把這個地址直接發送給相應的Web service,這個Web service 就會幫你查閱街道地址、城市、省區和郵政編碼等信息,確認這個地址的確在相應的郵政編碼區域。Web service 的提供商可以按時間或使用次數來對這項服務進行收費。這樣的服務要通過組件重用來實現是不現實的,因為那樣的話你必須下載并安裝好包含街道地址、城市、省區和郵政編碼等信息的數據庫,而且這個數據庫還是不能實時更新的。

  另一種軟件重用的情況是把好幾個應用程序的功能集成起來。例如,你想要建立一個局域網上的門戶站點應用,讓用戶既可以查詢他們的聯邦快遞包裹,察看股市行情,又可以管理他們的日程安排,還可以在線購買電影票?,F在Web上有很多應用程序供應商,都在其應用中實現了上面的這些功能。一旦他們把這些功能都通過Web service 暴露出來,你就可以非常輕易地把所有這些功能都集成到你的門戶站點中,為用戶提供一個統一的、友好的界面。

  用Web service來集成各種應用中的功能,為用戶提供一個統一的界面

  許多應用程序都會利用Web service,把當前基于組件的應用程序結構擴展為組件和Web service 的混合結構。你也可以在應用程序中使用第三方的Web service 提供的功能。你還可以把你自己的應用程序的功能通過Web service 提供給別人。所有這些情況下,你都可以重用代碼和代碼后面的數據??傊琖eb service 將是軟件重用的一種非常有力的形式。

  什么時候不應該使用Web Service

  一個對Web service的完整介紹還應該包括什么時候不該用Web service。經過前面的介紹,我們知道了Web service 在通過Web進行互操作或遠程調用的時候是最有用的。不過,還有許多情況,Web service根本不能給你帶來任何好處。

  單機應用程序

  目前,我們還有很多桌面應用程序是供商用和個人使用的。其中一些只需要與運行在本機上的其他程序通信。在這種情況下,我們最好就不要再用Web service ,只要用本地的API就可以了。COM非常適合于在這種情況下工作,因為它既小又快。運行在一臺服務器上的服務器軟件也是這樣:最好直接用COM或其他本地的API來進行應用程序間的調用。當然Web service 也能用在這些情況下,但那樣不僅消耗太大,而且不會給你帶來任何好處。

  局域網上的同構應用程序

  在許多應用中,你所有的程序都是用VB或VC開發的,都在Windows平臺下使用COM,都運行在同一個局域網上。例如,你有兩個服務器應用程序需要相互通信,或者你有一個Win32或WinForm的客戶程序要連接到局域網上的另一個服務器程序。在這些程序里使用DCOM會比SOAP/HTTP有效的多。類似的,如果你的一個.NET程序要連接到LAN上的另一個.NET程序,那么你應該使用.NET remoting。有趣的是,在.NET remoting中,你也可以指定使用SOAP/HTTP來進行Web service 調用。不過最好還是直接通過TCP進行RPC調用,那樣會有效得多??傊?,只要你從應用程序結構的角度看來,有別的方法比Web service 更有效,更可行,那就不要再用Web service。

  總結

  Web service是創建可互操作的分布式應用程序的新平臺。Web service 的主要目標是跨平臺的可互操作性。為了達到這一目標,Web service 是完全基于XML、XSD等獨立于平臺、獨立于軟件供應商的標準的。

  Web service在應用程序跨平臺和跨網絡進行通信的時候是非常有用的。Web service適用于應用程序集成、B2B集成、代碼和數據重用,以及通過Web進行客戶端和服務器的通信的場合。

  當然,Web service也不是萬能的,你不能到處濫用Web service。在有些情況下,Web service 會降低應用程序的性能,而不會帶來任何好處。例如,一臺機器或一個局域網里面運行的同構應用程序就不應該用Web service 進行通信。



]]>
使用Axis開發Web Service程序http://www.tkk7.com/romkk-shi/archive/2007/08/13/136281.html路邊的石頭-java路邊的石頭-javaMon, 13 Aug 2007 01:42:00 GMThttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136281.htmlhttp://www.tkk7.com/romkk-shi/comments/136281.htmlhttp://www.tkk7.com/romkk-shi/archive/2007/08/13/136281.html#Feedback0http://www.tkk7.com/romkk-shi/comments/commentRss/136281.htmlhttp://www.tkk7.com/romkk-shi/services/trackbacks/136281.html 今天是感恩節,差點又要在公司加班了。好在Web Service程序并不是特別難搞,下午終于在eclipse下調通過了,正確產生了服務器端和客戶端的Java代碼,apache的東西的確很不錯。

  說道Web Service的程序開發八個月前我加班調試公司和中國電信的商務領航系統的接口的時候,用的就是Web Service,Web Service有很多優點,使用Web Service可以在不同編程語言間實現數據交換,而我那時對Web Service也不熟,就由同事幫我生成了一大堆Web Service的框架代碼,我則只單獨開發業務代碼。

  這次的另外一個項目也要用Web Service了,不過人手也少了,沒有人幫做Web Service了,只好自己動手。

  好在開發前,有個同事先給我們不熟悉Web Service的程序員進行了一些培訓,我才知道原來以前的Web Service都是可以自動生成代碼的,而且也不難,試了一個下午客戶端和服務器端的Web Service代碼就都調試通過了,真不錯。

  為了更多喜愛開發的程序員也能迅速了解Web Service的開發,我這里整理了一些通過Axis開發Web Service的一些要點,希望能讓不熟悉Web Service的開發人員能夠迅速掌握Web Service。

  一、Axis環境的安裝

  1、安裝環境 J2SE SDK 1.4,Tomcat 5.0,eclipse 3.2。

  2、到 http://xml.apache.org 網站下載Axis安裝包。

  3、將Axis相關包文件放在WEB-INF\lib目錄下。

  4、Axis可選的包:activation.jar; mail.jar; xmlsec-1.4.Beta1.jar拷貝到WEB-INF目錄下,生成客戶端時候需要使用。

  Axis支持三種web service的部署和開發,分別為:

  1、Dynamic Invocation Interface (DII)

  2、Dynamic Proxy方式

  3、Stubs方式

  前兩種方式我就不介紹了,同事告訴我他們自己都不使用前兩種方式,他們建議我們使用Stubs方式,因此我就主要就介紹一下第三種方式。注意,我自己的Java源代碼是放在D:\workspace\test\目錄下,Axis相關包文件放在D:\workspace\test\WEB-INF目錄下。

  二、編寫wsdd發布web服務,編寫stub client訪問web服務

  1、編寫服務端程序server,SayHello.java,編譯server.SayHello.java

package server;
public class SayHello
{
    public String getName(String name)
    {
        return "hello "+name;
    }
}

  2、編寫wsdd文件

  deploy.wsdd文件內容如下:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <service name="SayHello" provider="java:RPC">
  <parameter name="className" value="server.SayHello.getName"/>
  <parameter name="allowedMethods" value="*"/>
 </service>
</deployment>

  3、發布服務:

  編輯一個deploy.bat,Axis_Lib為axis.jar路徑。內容如下:

set Axis_Lib=D:\workspace\test\WEB-INF\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://localhost:8080/test/servlet/AxisServlet
%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd

  執行這個批處理文件,這時候,如果提示成功的話,訪問http://localhost:8080/test/services 就會顯示服務列表。

  4、生成客戶端client stub文件

  在瀏覽器上訪問服務器端的服務,可以下載到WSDL文件,通過Axis的相關工具,可以自動從WSDL文件中生成Web Service的客戶端代碼。

  編寫一個WSDL2Java.bat文件,其內容如下:

set Axis_Lib=D:\workspace\test\WEB-INF\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:\workspace\test\src
set Package=server.SayHello
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% SayHello.wsdl

  執行這個批處理文件就可以生成client stub.

  生成的stub client文件列表為:SayHello.java,SayHelloService.java,SayHelloServiceLocator.java,SayHelloSoapBindingStub.java .

  5、編寫客戶端程序,編譯并執行

  下面是一段junit測試客戶端代碼。

import java.net.URL;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestWSClient extends TestCase {

    public TestWSClient(String string) {
        super(string);
    }

    public void SayHelloClient() throws Exception {

        SayHelloService service = new SayHelloServiceLocator();
        SayHello_PortType client = service.getSayHello() ;
        String retValue = client.getName("clientname");
        System.out.println(retValue);

    }

    public static Test suite() {
        TestSuite suite = new TestSuite();
        suite.addTest(new TestWSClient("SayHelloClient"));
        return suite;
    }
}

  至此,整個服務器端和客戶端的Web Service框架代碼就完成了,剩下的就是在里面加入你的業務代碼了,怎么樣,Web Service并不難開發吧。




]]>
主站蜘蛛池模板: 免费中文熟妇在线影片| 免费在线黄色电影| 亚洲av无码片vr一区二区三区| 亚洲日韩乱码中文无码蜜桃臀| 91精品国产亚洲爽啪在线影院| 日木av无码专区亚洲av毛片| 亚洲av午夜成人片精品网站| 亚洲a一级免费视频| 色拍自拍亚洲综合图区| 亚洲欧洲日产v特级毛片| 亚洲娇小性xxxx色| 亚洲中文字幕久久精品无码A | 成人免费视频软件网站| 成年女人毛片免费播放视频m| 日韩视频在线精品视频免费观看| 青青视频观看免费99| 久久精品免费一区二区喷潮| 搡女人真爽免费视频大全| 永久免费无码网站在线观看| 亚洲AV无码乱码在线观看牲色| 亚洲精品色婷婷在线影院| 国产亚洲AV夜间福利香蕉149| 久久精品国产亚洲网站| 亚洲美免无码中文字幕在线| 亚洲激情校园春色| 亚洲色成人网站WWW永久四虎| 国产产在线精品亚洲AAVV| 国产免费播放一区二区| 久久久免费精品re6| 美女视频黄的全免费视频网站| 午夜精品在线免费观看| 亚洲 另类 无码 在线| 亚洲精品乱码久久久久久按摩| 久久综合亚洲色一区二区三区| 国产成人精品日本亚洲专区6| 亚洲AV无码一区二区一二区 | 亚洲日本国产精华液| 亚洲av综合av一区二区三区| aa午夜免费剧场| 91免费在线播放| 日本视频免费在线|