JavaScript--正則表達式
正則表達式(regular expression)對象包含一個正則表達式模式(pattern)。它具有用正則表達式模式去匹
配或代替一個串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。
正則表達式構造函數: new RegExp("pattern"[,"flags"]);
參數說明:
pattern -- 一個正則表達式文本
flags -- 如果存在,將是以下值:
g: 全局匹配
i: 忽略大小寫
gi: 以上組合
在構造函數中,一些特殊字符需要進行轉意(在特殊字符前加"\")。正則表達式中的特殊字符:
字符? 含意?
\ 轉意,即通常在"\"后面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜桿后/\b/,轉意為
匹配一個單詞的邊界。
-或-
對正則表達式功能字符的還原,如"*"匹配它前面元字符0次或多次,/a*/將匹配a,aa,aaa,加了"\"后,/a\*/
將只匹配"a*"。?
^? 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"?
$? 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"?
*? 匹配前面元字符0次或多次,/ba*/將匹配b,ba,baa,baaa?
+? 匹配前面元字符1次或多次,/ba*/將匹配ba,baa,baaa?
?? 匹配前面元字符0次或1次,/ba*/將匹配b,ba?
(x)? 匹配x保存x在名為$1...$9的變量中?
x|y? 匹配x或y?
{n}? 精確匹配n次?
{n,}? 匹配n次以上?
{n,m}? 匹配n-m次?
[xyz]? 字符集(character set),匹配這個集合中的任一一個字符(或元字符)?
[^xyz]? 不匹配這個集合中的任何一個字符?
[\b]? 匹配一個退格符
\b? 匹配一個單詞的邊界?
\B? 匹配一個單詞的非邊界
\cX? 這兒,X是一個控制符,/\cM/匹配Ctrl-M?
\d? 匹配一個字數字符,/\d/ = /[0-9]/?
\D? 匹配一個非字數字符,/\D/ = /[^0-9]/?
\n? 匹配一個換行符?
\r? 匹配一個回車符?
\s? 匹配一個空白字符,包括\n,\r,\f,\t,\v等?
\S? 匹配一個非空白字符,等于/[^\n\f\r\t\v]/?
\t? 匹配一個制表符?
\v? 匹配一個重直制表符?
\w? 匹配一個可以組成單詞的字符(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配"$5.98"
中的5,等于[a-zA-Z0-9]?
\W? 匹配一個不可以組成單詞的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
說了這么多了,我們來看一些正則表達式的實際應用的例子:
HTML代碼的屏蔽
?function mask_HTMLCode(strInput) {
?? var myReg = /<(\w+)>/;
?? return strInput.replace(myReg, "<$1>");
?}
E-mail地址驗證:
?function test_email(strEmail) {
? var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
? if(myReg.test(strEmail)) return true;
? return false;
?}
?
正則表達式對象的屬性及方法:
預定義的正則表達式擁有有以下靜態屬性:input, multiline, lastMatch, lastParen, leftContext,
rightContext和$1到$9。其中input和multiline可以預設置。其他屬性的值在執行過exec或test方法后被根據
不同條件賦以不同的值。許多屬性同時擁有長和短(perl風格)的兩個名字,并且,這兩個名字指向同一個值。(
JavaScript模擬perl的正則表達式)
正則表達式對象的屬性:
屬性 含義
$1...$9 如果它(們)存在,是匹配到的子串?
$_ 參見input?
$* 參見multiline?
$& 參見lastMatch?
$+ 參見lastParen?
$` 參見leftContext?
$'' 參見rightContext?
constructor ? 創建一個對象的一個特殊的函數原型?
global ? 是否在整個串中匹配(bool型)?
ignoreCase 匹配時是否忽略大小寫(bool型)?
input 被匹配的串?
lastIndex ? 最后一次匹配的索引?
lastParen ? 最后一個括號括起來的子串?
leftContext ? 最近一次匹配以左的子串?
multiline ? 是否進行多行匹配(bool型)?
prototype ? 允許附加屬性給對象?
rightContext 最近一次匹配以右的子串?
source ? 正則表達式模式?
lastIndex ? 最后一次匹配的索引?
正則表達式對象的方法:
方法 含義
compile ? 正則表達式比較?
exec 執行查找?
test 進行匹配?
toSource 返回特定對象的定義(literal
representing),其值可用來創建一個新的對象。重載Object.toSource方法得到的。?
toString 返回特定對象的串。重載Object.toString方法得到的。?
valueOf ? 返回特定對象的原始值。重載Object.valueOf方法得到
?
例子:
<script language = "JavaScript">
var myReg = /(w+)s(w+)/;
var str? = "John Smith";
var newstr = str.replace(myReg, "$2, $1");
document.write(newstr);
</script>
將輸出"Smith, John"
運行regedit,編輯注冊表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex
右側FilterFilesWithUnknownExtensions子鍵(REG_DEWORD類型)
的鍵值改為1。
數據倉庫應該說還是一個正在發展中的事物,它的技術發展及應用的
動力是商業競爭的需要。因而其定義及分類也會隨著時代的發展而有
所變化。目前流行的描述方法是:"數據倉庫是把企業中各分散的原始
操作數據和來自外部的數據匯集和整理成一個單一的關系數據庫,為
企業提供完整、及時、準確和明了的商業決策信息,并使最終用戶可
以直接從數據倉庫提取信息來進行各種決策分析"。
??? 從數據倉庫的數據來源及實施環境來看,它離不開數據庫,數據倉
庫技術與數據庫技術有緊密聯系,二者能相互連通,相互支持,又有著
重要差別。主要是數據倉庫側重于決策分析,而數據庫則側重于操作
和管理。
??? 其中Data Mart(專用數據倉庫)是為滿足用戶特定需求而創建的
數據倉庫,具有傳統意義上的數據倉庫的基本特征,可以看成是中央數
據倉庫的一個子集,是針對某個部門級的應用( 如市場、財務、銷售
、產品控制等)而建立的數據倉庫。企業最高級集中化的數據倉庫可
稱之為原子化(Atomic)數據倉庫。它主要用作其各個子集——Data M
art的集結基礎(Staging ground)以及作為參照(reference)用的中央
數據倉庫。
??? 各個Data Mart物理上往往散布到與最終用戶較近的地點以節約
通信開銷并提高響應速度。故相對于集中化的數據倉庫而言,把Data
Mart又稱分布式的數據倉庫。與中央數據倉庫相比它與(某組)用戶更
具交互性。
??? 應著重指出的是,建立Data Mart的著眼點主要在于它的目標而不
是規模。一般情況下D ata Mart比中央數據倉庫小一些,比如在大型
保險公司的數據倉庫中所涉及的"主題"可能是保險金、客戶等,而在
其地區辦事處建立的Data Mart可能僅涉及這些主題的一個子集——
本地區的客戶、保險金等。
??? 交互式數據倉庫解決方案Sybase IQ
??? 作為國際著名數據庫廠商之一的Sybase公司推出了交鑰匙型的數
據倉庫解決方案。
??? Sybase交互式數據倉庫解決方案的著眼點是以較低的花費,按一
個易于管理和擴充的基礎框架為企業用戶和信息技術部門提供快速的
解決方案。
??? Sybase的特色產品便是Sybase IQ,它能方便地為用戶建立Data M
art,即部門級的數據倉庫,或"面向應用系統的數據倉庫"。
??? 為使各Data Mart能與該企業中其它Data Mart保持一致的增長和
維護,在創建時就應有充分的考慮。因而Sybase推出了一個名為"Quic
k Start Data Mart"的交鑰匙型解決方案。它是以Sybase IQ為核心,
由Sybase及第三方(如:Business Object等)的產品和服務打包而成。
另外還包括了必要的專家咨詢和技術培訓,以保證在短期內為用戶創
建一個實用的Data M art。
??? 這一方案的特點包括:
??? ●能夠快速獲得效益,風險低;
??? ●以較經濟的方式能夠對大量用戶的即席查詢給出極快的響應;
。
??? ●易于實現企業內部數據倉庫與Inernet應用的有機結合。
??? Sybase IQ技術
??? Sybase IQ是針對DSS應用而提供的一個特定的數據庫服務器,它
能上百倍地提高交互式即席查詢的速度,特別適用于交互式數據倉庫
環境。
??? Sybase IQ服務器可透明地集成到Sybase的開放性客戶/服務器體
系結構中,它使用標準的SQL命令,支持DB-Lib、CT-Lib和ODBC客戶調
用。因而,利用Isql及各種流行的前端工具,如PowerBuilder、Access
、SAS Assist及Business Object等都可方便地訪問Sybase IQ服務器
。
??? Sybase IQ服務器可與SQL Server混合使用。一個內置的智能查
詢管理器可識別并透明地將對數據庫的更新傳遞到SQL Server以完成
OLTP;同時利用Sybase IQ來解決用于DSS的即席查詢。Sybase IQ的Bi
t-Wise索引可定期地在非高峰時刻批量地進行更新。SQL Server和Sy
base IQ有一個共同集成的目錄(Catalog),這樣,在Sybase環境中可統
一管理安全性和其他服務,Sybase IQ也可有效地支持SMP環境及多用
戶并發操作。
??? Sybase IQ服務器的技術特色
??? Sybase IQ服務器的主要特點為:
??? ●數據的垂直分割——數據是按"列"來儲存。查詢時僅需讀取在
該查詢中所涉及的各列的索引,因而徹底避免了耗時的全表掃描。
??? ●采用了突破性的數據存取方法——Bit-Wise索引技術。
??? ●在數據壓縮和并行處理方面有獨到之處。
??? ●提供有效的預連接(PreJoin)策略。
??? Sybase IQ服務器的核心由于采用了正在申請專利的Bit-Wise索
引技術,它在處理復雜的即席查詢時,能比傳統的B-Tree索引能提高響
應速度10~100倍。
??? 對B-Tree及Bit-Map索引的簡要回顧
??? 1.傳統的B-Tree(平衡樹)索引是通過跟蹤一個選擇的數據字段的
值和直接指向包含該數據項的數據頁的方式來提供快速查找數據記錄
。
圖1 傳統的B-Tree 樹索引
??? 若為一個特定的客戶查找信息記錄就只有快速讀取索引,然后直
接定位到包含該客戶信息的數據頁中。索引方式通過直接指向相關信
息來消除高代價的表掃描。
??? B-Tree非常適合于查找并取回少量的行。但對典型的數據倉庫的
復雜交互式查詢應用B -Tree有三個缺點:
??? 首先,B-Tree只在索引是高度可選擇(Highly Selective)又稱之
為高基數(Cardinality )的時候才有價值,對一些唯一值極少的(低基
數)數據字段就幾乎毫無價值。
??? B-Tree索引第二個限制是在數據倉庫中構造和維護索引的代價。
由于B-Tree索引包含實際數據和其他信息(如指針等),因而使得索引
需占用一定的空間和時間。如果構造所有相關的索引,數據倉庫就會
占據2~4倍原始數據空間。當成批插入刪除時,索引就非常敏感,有可
能失去平衡并降低性能。通常說來,10%~15%的數據修改會導致重建
索引。
??? 最后,B-Tree索引設計用于簡單查詢及已知公共存取路徑的環境
下才有優點,而在數據倉庫應用中,通常是復雜的查詢,并經常帶有分
組及聚合條件。此時,B-Tree索引往往是無能為力。
??? 2.Bit-Map(位圖)索引和使用B-Tree相比,位圖為每個記錄的名字
段用給定真或假("1"或"0")的方式表示。
??? 傳統的位圖索引突破了B-Tree索引的一些限制。位圖索引可以非
常有效地對低基數數據進行索引,但位圖式索引卻不適用于高基數數
據,在聚集數據、完成關系聯結和取回原始數據值等方面的效率不高
。
??? Bit-Wise的索引技術特點
??? 1.Sybase IQ在存儲數據的方式上與傳統的RDBMS完全不同,它不
是以"記錄行"而是按"列"為單位來存儲數據。即所謂的"對數據進行
垂直分割",它在Bit-Map索引基礎上擴充存放了該字段中的不同取值,
一般的DSS查詢往往僅涉及大量數據記錄中的少數列,因而不需訪問原
始數據就能快速獲得查詢結果。顯然,利用這些不同取值也就能快速
地進行數據聚集、分組、求最大值、最小值及平均值等。它彌補了位
圖式索引不適用于高基數數據的缺點。
??? 2.由于列數據比行數據更易進行壓縮,因而Sybase IQ以壓縮方式
存放原始數據時可節省50%的磁盤空間,在獲取查詢結果數據時減少了
I/O次數,響應速度自然加快。
??? 3.Sybase IQ采用操作系統級的并行處理機制,因而像分類、Bit-
Map操作及I/O操作都可由操作系統獨立地進行調度以消除瓶頸,進而
在數據加載時其能充分利用SMP環境中多CPU的資源潛力。
??? Bit-Wise"數據驅動的"索引機制在Sybase IQ中對每個字段所建
索引的類型和個數主要是取決于其數據的特征和經常被使用的情況而
不是針對某組特定的查詢(后者被稱為"查詢驅動的"索引機制)。Bit-
Wise索引是"數據驅動的",因而無需DBA為各種查詢分別考慮優化策略
。
??? Sybase IQ支持的主要索引類型為:
??? ·LowFast-LF(低基數)
??? ·HighGroup-HG(高基數)
??? ·HighNonGroup-HNG(高基數)
??? ·FastProjiectinFP
??? 建立Bit-Wise索引的一般原則
??? 1)在每個列上都建FP索引;
??? 2)在唯一值<1000的字段上建立LF索引;
??? 3)在參加連接的字段上建HG或LF索引;
??? 4)唯一值>1000且用在GROUP BY,SELCT DISITICT,COUNT DISITIC
T中的字段上建立HG索引;
??? 5)此外的其它列若出現在where條件中或聚集運算中,則建立HNG
索引。
??? Sybase IQ可利用預連接技術來提高即席查詢速度
??? Sybase IQ支持兩類連接處理:一類是即席連接(在查詢時處理);
另一類是預連接(在加載時處理)。大多數應用是二者的結合。
??? 即席連接適用于多對多的聯系,被連接的表之間的尺寸差別超過1
0倍。
??? 預連接適用于一對多的聯系,被連接的表之間的尺寸差別不大于1
0倍,如:等值或左、右外連接。但預連接將導致增大存儲量并降低加
載速度。
??? Sybase IQ能對已建立了HG或LF索引的列,再利用"Joined Indexs
et"完成預連接處理。它通常能使查詢速度提高10倍以上。
??? 我們可通過下表的比較來進一步理解Bit-Wise索引的技術特色:
表1
??? 設置Sybase IQ的基本步驟
??? 在安裝Sybase IQ產品之后:
??? 1.建立與Sybase IQ Indexspace相關的SQL Server基礎數據庫,I
ndexspace是SybaseIQ 用于存儲索引結構和部分數據的原始設備(raw
devices)或系統文件;
??? 2.建立同基礎數據庫同名的Sybase IQ Indexspace,最大為2GB,I
/O塊同壓縮比有關,調節范圍512B到32KB;
??? 3.在基礎數據庫上建表;
??? 4.運行Sybase IQ的存儲過程,估算所需空間;
??? 5.為表中的某列或所有列建立Sybase IQ Indexsets,Indexsets
是Sybase IQ存儲表中某列索引空間的,它存儲于Indexspace中;
??? 6.定義不同Sybase IQ的索引類型,(每列都建立一個FP索引然后
酌情建立別種索引);
??? 7.往Sybase IQ Indexset中加入新數據,從相關的數據庫中插入
數據到Sybase IQ Inde xes或利用ASCII文件加載;
??? 8.建立供預連接用的Joined Indexset;
??? 9.往Joined Indexset中加入新數據。
??? 現在已可通過Isql或其他前端工具查詢Sybase IQ數據了。
??? 測試比較
??? 經實際測試,Sybase IQ效果良好。
前言:
??????? 一個很不錯的php開源項目管理工具,有了它,不用project了,也不用自己開發項目管理工具了,足夠應付中小型軟件企業的日常項目管理工作。
1、軟件需求:
easyphp1.8?
dotProject_2_0_1_20050705_UTF-8_Chinese_by_Markwu2、安裝:
1)首先安裝:
easyphp1.8?;啟動apache/mysql/php服務。
創建MySql數據庫和用戶:
在Dos窗口下進入到MySql\bin下,輸入命令:mysql?-uroot -p 回車(默認安裝時沒密碼)然后執行下面語句。
????? CREATE DATABASE dotproject;
??????GRANT ALL PRIVILEGES ON dotproject.* TO 'dp_user'@'localhost' IDENTIFIED BY 'pw';
2)解壓dotProject_2_0_1_20050705_UTF-8_Chinese_by_Markwu到www目錄下,改目錄名為dotproject。注意要用這個utf-8版本,從dotproject下載的版本中文會亂碼。
3)執行安裝:
http://yourserverip/dotproject/install/index.php,則可以完成安裝過程,包括數據庫的建立。
4)到dotproject/index.php登陸,admin-passwd.
5)到system admin->default user confonrce,設置默認語言為簡體中文。
6)打開gd支持以顯示甘特圖:在easyPHP面板,配置->php擴展,把php-gd2選上,再重啟apache,則即可顯示甘特圖。
7)重新登陸dotproject,完成整個安裝過程。
//注意:如果自己更新語言包應放在www\dotproject\locales下;
如果mysql用高版本的應運行如下語句:
先用root登錄MYSQL服務器,執行
mysql>set password for dp_user@"localhost"=old_password('yourPassword');
原因是因為你使用的mysql服務器版本中使用了新的密碼驗證機制,這需要客戶端的版本要在4.0以上,原來的密碼函數被改為old_password();,這樣使用password()生成的密碼在舊的版本上的客戶端就不好使了,而PHP中的MYSQL客戶端都是3.23的(當然,mysqli的擴展除外),問題就在這了。
服務器重整以后,cvs update/commit時候會出現如下錯誤提示:
cvs server: cannot open directory . for empty check: Invalid argument
雖然不影響使用,但是卻很讓人不爽。
而chacl時候,則是:
cvs [server aborted]: cannot find .: No such file or directory
干脆就直接出錯。研究了一下cvsnt里面的設置,感覺應該只和cvsroot及temp目錄有關——畢竟只用到這兩個目錄而已。檢查之后發現winnt/temp沒有對cvsuser這個系統帳號的權限。設置之后問題解決。
雖然cvsuser只是一個停用了的cvs用戶綁定帳號,但是權限管理方面仍然遵循著ntfs的規則。這么說來停用的意義應該僅僅是限制登錄。
MyEclipse 4.1 Milestone2 has enhanced the JavaScript Editor and Debugger to include the following features:
- Editor
-
Syntax highlighting
-
Integrated outline and property views
-
Validation and syntax checking
-
Code assist for common JavaScript elements, functions, and variables
-
Code assist documentation for functions
-
Source formatting
-
Toggle comments
- Debugger
- Debug any web page containing JavaScript source or included JavaScript files, or standalone JavaScript files
- Operations: Pause, Resume, Step Into, Step Over, Step to Return, Terminate
- Views:
- Web Browser View
- Call Stack View
- Variables View
- Console View
- Set JavaScript breakpoints in:
- JavaScript files
- HTML with embedded JavaScript and linked JavaScript files
- JSP files
- Conditional breakpoints planned for MyEclipse 4.1.1
- Integrates with Eclipse Launch Manager
- Quick launch from context-menu using "Debug As"
- Launch from Eclipse Debug toolbar action
- Use Launch Profile to modify launch configuration
- Launch JavaScript resource from project location or deployed MyEclipse web-application
|
|
JavaScript Outline View |
The JavaScript outline view depicts method and variable declarations in their associated scope. Variables can be filtered from the view. Future releases will support for more complex JavaScript constructs.
|
|
JavaScript Validation and Syntax Checking |
The JavaScript Editor now has syntax validation with error and warning markers in the editor and Problems view. Varying levels of JavaScript validation can be configured in the MyEclipse preferences.
The JavaScript validation includes warnings for your javascript source code.
|
|
Code Assist for JavaScript |
Code assist is provided for most common DHTML objects like document, window, element, etc. The IE and Netscape icons identify browser support for the function or property. The MyEclipse JavaScript Editor preferences enable the customization of code-assist proposals to filter browser specific proposals and to hide the icons.
The code assist also provides proposals that include the current functions defined in the JavaScript file.
Global and local variables are also included in the code-assist proposals..
|
|
JavaScript Source Code Formatting |
The JavaScript editor now has an improved source code formatting.
|
|
JavaScript Quick Comment |
Quickly toggle single line comments on/off using the Ctrl+Shift+C key sequence or use the Source menubar action. Select a region or set the cursor on the line to toggle as a comment.
Enter Ctrl+Shift+C to add or remove the single line comments. |
|
MyEclipse JavaScript Debugger |
The MyEclipse JavaScript Debugger (Milestone 2) is the first fully integrated client-side Eclipse debugger for JavaScript. Feature highlights include:
- Debug any web page containing JavaScript source or included JavaScript files, or standalone JavaScript files
- Operations: Pause, Resume, Step Into, Step Over, Step to Return, Terminate
- Views:
-
- Web Browser View
- Call Stack View
- Variables View
- Console View
- Set JavaScript breakpoints in:
-
- JavaScript files
- HTML with embedded JavaScript and linked JavaScript files
- JSP files
- Conditional breakpoints planned for MyEclipse 4.1.1
- Integrates with Eclipse Launch Manager
-
- Quick launch from context-menu using "Debug As"
- Launch from Eclipse Debug toolbar action
- Use Launch Profile to modify launch configuration
- Launch JavaScript resource from project location or deployed MyEclipse web-application
Features planned for MyEclipse 4.1.1:
- Conditional JavaScript breakpoints
- JavaScript Snippet Evaluation Editor
- Smart Browser session organization
|
MyEclipse JavaScript Debugger -- Setting JavaScript breakpoints |
Set breakpoints in JavaScript, HTML and JSP using traditional breakpoint setting facilities.
<html BP image here>
Breakpoints appear in the left margin as a blue ball image,
|
MyEclipse JavaScript Debugger -- Quick JavaScript Launcher |
Launch JavaScript debuggable resources from the Debug As actions on the toolbar and the context-menu of the HTML, JSP and JavaScript editors or from the Run menubar.
|
|
MyEclipse JavaScript Debugger -- Configuring a JavaScript Launch Profile |
A custom JavaScript launch profile is created or edited using the Run>Debug... action from the menubar, toolbar, or context-menu context-menu of the HTML, JSP and JavaScript editors. The launch profile's Project and launch URL are provided. The launch URL can reference a deployed web resource, e.g., http://192.168.1.101/helloworld/helloajax.html or a local file in your project workspace, e.g., file://C:/...,
|
|
MyEclipse JavaScript Debugger -- Breakpoint/Stepping Operations in JavaScript |
When a JavaScript breakpoint is encountered in the browser, the source file containing the breakpoint opened in the corresponding editor and positioned to the breakpoint line-number. The JavaScript Debugger controls allow you to then Resume execution, Step Into a function at the next line, Step Over a function at the next line, Step to End of the current function, or Terminate the current application thread,
|
|
MyEclipse JavaScript Debugger -- Support for breakpoints in include JavaScript files |
The JavaScript Debugger supports breakpoints set in both top-level and included resources. In the following screenshot the breakpoint is set in a JavaScript file that is included in an HTML file.
|
|
|
New JavaScript Editor |
The new and improved Javascript Editor have new Outline View support for javascript variables and methods, content assist for javascript objects, and a preview capability.

Smart content assist is available for the javascript document object. Notice, that both IE and Netscape specifc objects are shown.

The javascript editor also have preview support using a builtin browser that will enable testing of javascript.

|
AJAX開發者的最新工具和技術
基于XML的異步JavaScript,簡稱AJAX,是當前Web創新(稱為Web2.0)中的一個王冠。感謝組成AJAX的各種技術,Web應用的交互如Flickr, Backpack和Google在這方面已經有質的飛躍。這個術語源自描述從基于網頁的Web應用到基于數據的應用的轉換。在基于數據的應用中,用戶需求的數據如聯系人列表,可以從獨立于實際網頁的服務端取得并且可以被動態地寫入網頁中,給緩慢的Web應用體驗著色使之像桌面應用一樣。
雖然大部分開發人員在過去使用過XMLHttp或者使用Iframe來加載數據,但僅到現在我們才看到傳統的開發人員和公司開始采用這些技術。就像新的編程語言或模型伴隨著更多的痛苦,開發人員需要學習新的技巧及如何最好利用這些新技術。
AJAX模式
許多重要的技術和AJAX開發模式可以從現有的知識中獲取。例如,在一個發送請求到服務端的應用中,必須包含請求順序、優先級、超時響應、錯誤處理及回調,其中許多元素已經在Web服務中包含了,就像現在的SOA。AJAX開發人員擁有一個完整的系統架構知識。同時,隨著技術的成熟還會有許多地方需要改進,特別是UI部分的易用性。
AJAX開發與傳統的CS開發有很大的不同。這些不同引入了新的編程問題,最大的問題在于易用性。由于AJAX依賴瀏覽器的JavaScript和XML,瀏覽器的兼容性和支持的標準也變得和JavaScript的運行時性能一樣重要了。這些問題中的大部分來源于瀏覽器、服務器和技術的組合,因此必須理解如何才能最好的使用這些技術。
綜合各種變化的技術和強耦合的客戶服務端環境,AJAX提出了一種新的開發方式。AJAX開發人員必須理解傳統的MVC架構,這限制了應用層次之間的邊界。同時,開發人員還需要考慮CS環境的外部和使用AJAX技術來重定型MVC邊界。最重要的是,AJAX開發人員必須禁止以頁面集合的方式來考慮Web應用而需要將其認為是單個頁面。一旦UI設計與服務架構之間的范圍被嚴格區分開來后,開發人員就需要更新和變化的技術集合了。
時刻想著用戶
AJAX的最大機遇在于用戶體驗。在使應用更快響應和創新的過程中,定義Web應用的規則正在被重寫;因此開發人員必須更注重用戶。現在用戶已經逐漸習慣如何使用Web應用了。例如用戶通常希望每一次按鈕點擊會導致幾秒的延遲和屏幕刷新,但AJAX正在打破這種長時間的狀況。因此用戶需要重新體驗按鈕點擊的響應了。
可用性是AJAX另人激動的地方而且已經產生了幾種新穎的技術。其中最引人注目的是一種稱為“黃色隱出”的技術,他在數據更新之前時將用戶界面變為黃色,更新完成后立刻恢復原來的顏色。AJAX開發人員將用戶從Web應用的負載中解放出來;小心地利用AJAX提供的豐富接口,不久桌面開發人員會發現AJAX是他們的方向。
幾種工具和技術
隨著AJAX迅速地引人注目起來,我想開發人員對這種技術的期待也迅速地增加。就像任何新技術,AJAX的興旺也需要一整個開發工具/編程語言及相關技術系統來支撐。
JavaScript
如名字所示AJAX的概念中最重要而最被忽視的是他也是一種JavaScript編程語言。JavaScript是一種粘合劑使AJAX應用的各部分集成在一起。在大部分時間,JavaScript通常被服務端開發人員認為是一種企業級應用不需要使用的東西應該盡力避免。這種觀點來來自以前編寫JavaScript代碼的經歷:繁雜而又易出錯的語言。類似的,他也被認為將應用邏輯任意地散布在服務端和客戶端中,這使得問題很難被發現而且代碼很難重用。在AJAX中JavaScript主要被用來傳遞用戶界面上的數據到服務端并返回結果。XMLHttpRequest對象用來響應通過HTTP傳遞的數據,一旦數據返回到客戶端就可以立刻使用DOM將數據放到網面上。
XMLHttpRequest
XMLHttpRequest對象在大部分瀏覽器上已經實現而且擁有一個簡單的接口允許數據從客戶端傳遞到服務端,但并不會打斷用戶當前的操作。使用XMLHttpRequest傳送的數據可以是任何格式,雖然從名字上建議是XML格式的數據。
開發人員應該已經熟悉了許多其他XML相關的技術。XPath可以訪問XML文檔中的數據,但理解XML DOM是必須的。類似的,XSLT是最簡單而快速的從XML數據生成HTML或XML的方式。許多開發人員已經熟悉Xpath和XSLT,因此AJAX選擇XML作為數據交換格式有意義的。XSLT可以被用在客戶端和服務端,他能夠減少大量的用JavaScript編寫的應用邏輯。
CSS
為了正確的瀏覽AJAX應用,CSS是一種AJAX開發人員所需要的重要武器。CSS提供了從內容中分離應用樣式和設計的機制。雖然CSS在AJAX應用中扮演至關重要的角色,但他也是構建創建跨瀏覽器應用的一大阻礙,因為不同的瀏覽器廠商支持各種不同的CSS級別。
服務器端
但不像在客戶端,在服務端AJAX應用還是使用建立在如Java,.Net和PHP語言基礎上機制;并沒有改變這個領域中的主要方式。
既然如此,我們對Ruby on Rails框架的興趣也就迅速增加了。在一年多前,Ruby on Rails已經吸引了大量開發人員基于其強大功能來構建Web和AJAX應用。雖然目前還有很多快速應用開發工具存在,Ruby on Rails看起來已經儲備了簡化構建AJAX應用的能力。
開發工具
在實際構建AJAX應用中,你需要的不只是文本編輯器。既然是JavaScript非編譯的,他可以容易地編寫和運行在瀏覽器中;然而,許多工具提供了有用的擴展如語法高亮和智能完成。
不同的IDE提供了對JavaScript支持的不同等級。來自JetBrains的IntelliJ IDEA是一個用來JavaScript開發的更好的IDE,雖然許多開發人員也喜歡Microsoft’s Visual Studio產品(允諾會在最新的版本中改善對AJAX的支持)。Eclipse包含了兩個免費的JavaScript編輯器插件和一個商業的來自ActiveStat的Komodo IDE。
另一個JavaScript和AJAX開發中的問題是調試困難。不同的瀏覽器提供不同的通常是隱藏的運行時錯誤信息,而JavaScript的缺陷如雙重變量賦值(通常是由于缺少數據類型)使得調試更加困難。在AJAX的開發中,調試就更復雜了,因為其需要標識究竟是客戶端還是服務端產生的錯誤。在過去,JavaScript調試的方法是刪除所有代碼然后一行行的增加直到錯誤出現。現在,更多開發人員回到為IE準備的Microsoft Script Debugger和為Mozilla瀏覽器準備的Venkman。
瀏覽器兼容性
JavaScript編程的最大問題來自不同的瀏覽器對各種技術和標準的支持。構建一個運行在不同瀏覽器(如IE和火狐)是一個困難的任務。因此幾種AJAX JavaScript框架或者生成基于服務端邏輯或標記庫的JavaScript,或者提供符合跨瀏覽器AJAX開發的客戶端JavaScript庫。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
這些框架給開發人員更多的空間使得他們不需要擔心跨瀏覽器的問題。雖然這些框架提升了開發人員構建應用的能力,但由于廠商已經開發了更細節的用戶界面的打包組件解決方案,因此在AJAX組件市場中需要考慮一些其他因素。例如提供通用用戶界面的組件如組合框和數據柵格的幾個廠商,都可以被用來在應用中創建良好的通過類似電子數據表方式來查看和編輯數據的體驗。但這些組件不僅是封裝了組件的用戶界面而且包括與服務端數據的通訊方式,這些組件通常使用基于標記方式來實現如ASP.Net或JSF控件。
展望
最近IE和火狐之間的瀏覽器之爭變得火熱起來,因此AJAX開發人員需要足夠敏捷的作出反應。關鍵點在一些問題如CSS或XML,雖然各種瀏覽器形成采用最新標準的不同陣營(如Mozilla擁抱SVG和E4X標準及在最新火狐BETA版本中使用XUL,而微軟使用自己的XAML技術)。所有這些技術代表當前AJAX主流JavaScript和XML的市場方向改變。
總的來說,AJAX開發人員必須盡快地跟進最新的技術并利用高產的工具集。成功的AJAX開發人員還需要留心他們的使用者以避免將任何問題擴大化。并且AJAX開發人員還需要持續地創新來創建增強Web應用易用性的新方法。
用Axis 1.1 for Java進行Web Services開發 下面的所有幾乎來自Axis1.1的文檔。但不完全來自文檔,本人做了部分修改,這些修改完全出自國內讀者的需要。 什么是SOAP? SOAP是一個基于XML的用于應用程序之間通信數據編碼的傳輸協議。最初由微軟和Userland Software提出,隨著不斷地完善和改進,SOAP很快被業界廣泛應用,目前完全發布版本是1.1。在其發展過程中,W3C XML標準工作小組積極促成SOAP成為一個真正的開放標準。在寫作此文檔之時,SOAP1.2草案已經發布,1.2對1.1中相對混亂的部分做了改進。 SOAP被廣泛作為新一代跨平臺、跨語言分布計算Web Services的重要部分。 這里太膚淺的說明,請參閱我的整理《一步一步學習SOAP》。 什么是Axis? Axis本質上就是一個SOAP引擎,提供創建服務器端、客戶端和網關SOAP操作的基本框架。Axis目前版本是為Java編寫的,不過為C++的版本正在開發中。 但Axis并不完全是一個SOAP引擎,它還包括: 是一個獨立的SOAP服務器。 是一個嵌入Servlet引擎(例如Tomcat)的服務器。 支持WSDL。 提供轉化WSDL為Java類的工具。 提供例子程序。 提供TCP/IP數據包監視工具。 Axis是第三代Apache SOAP,從2000年起,SOAP v2開發小組開始討論如何讓Axis更加靈活、可配置,以及能夠處理SOAP和來自W3C的各種XML標準。通過不斷地討論和代碼編寫,Axis目前取得了如下成果: 速度提高。 Axis通過基于事件的SAX對XML文檔進行處理,從而在速度和效率上比Apache SOAP有所提高。 靈活性提高。 穩定性提高。 提供面向組件的部署。 提供一個簡潔的傳輸抽象框架。其核心引擎完全于傳輸方式獨立。從而使基于何種協議傳輸的選擇更加靈活。 支持WSDL。包括到處WSDL和客戶代理生成等。 在目前發行1.1版本中有什么東西? SOAP1.1/1.2引擎。 靈活的配置和部署系統。 支持及時自動生成SOAP服務(JWS)。 支持所有的基本數據類型,為自定義串行操作提供類型映射系統。 JavaBean的自動串行操作,包括將自定義屬性類型映射到XML的屬性和元素。 RPC和基于消息的SOAP服務提供者。 從部署好的服務自動生成WSDL。 WSDL2Java工具可以從WSDL描述文件中產生相應的客戶和服務器端SOAP操作框架。 初步提供安全擴展,能夠與Servlet2.2安全集成。 通過HTTP Cookie和與傳輸無關的SOAP頭信息提供會話跟蹤。 初步支持帶附件的SOAP消息。 在EJB方面提供把EJB作為Web服務的訪問途經。 基于Servlet的HTTP傳輸。 基于JMS的傳輸。 獨立的服務器(但需要HTTP 服務器和Servlet容器支持)。 提供客戶端、服務器端相關應用程序的樣例。 Axis的運行需要如下組件包 axis.jar jaxrpc.jar saaj.jar commons-logging.jar commons-discovery.jar wsdl4j.jar 符合JAXP-1.1的XML處理器。 一步一步開始用Axis進行Web Services操作 下面給出一段簡單的調用Web Services方法的客戶端代碼(由于原文檔中直接用導入包的方式初學者不易了解那個類在那個包中,所以下面我做了一些簡單的修改,希望能給學習者清晰的思路): public class TestClient { public static void main(String[] args) { try{ String endpoint="http://localhost:8080/axis/SayHello.jws?wsdl";// 調用的web服務的url地址,這里是一個http請求,希望得到的結果是wsdl文檔。 org.apache.axis.client.Service service=new org.apache.axis.client.Service();//建立請求服務框架實例。 /* * org.apache.axis.client.Service實現JAX-RPC's javax.xml.rpc.Services接口 * 該接口充當產生下面提到的org.apache.axis.client.Call實例 * 的角色。 */ org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall();//從框架中生成一個維護調用的實例。 /* * org.apache.axis.client.Call實現了JAX-RPC's javax.xml.rpc.Call接口。 */ call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new javax.xml.namespace.QName("http://www.edu-edu.com.cn/luopc/ws","echoString"));//設置需要調用的函數名稱 String result=(String)call.invoke(new Object[]{"hello!"}); System.out.println(result); }catch(Exception e){ System.err.println(e.toString()); } } } 上面的代碼可能和原文檔中不同,并且在名稱空間、函數多態上會給用戶造成糊涂。不過別急,我在翻譯手冊的同時會加入很多解釋的代碼,如果哪位純粹看不懂可以通過郵件獲取幫助:luopc@edu-edu.com.cn ,郵件主題必須是我提供的文檔名稱。 通過上面的調用代碼,最終生成向服務器請求SOAP信息包,具體XML內容如下: <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <arg0 xsi:type="xsd:string">Hello!</arg0> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> 這里我不再多少,細心的朋友請從代碼中找相應的對應信息來進行自己的邏輯理解。至于SOAP協議在我以后的翻譯文檔中會加入進去。 從上面的代碼中我們在調用的時候輸入了參數new Object[]{“hello!”}。然后從生成的SOAP請求包中可以看到自動序列化成<arg0 xsi:type="xsd:string">Hello!</arg0>。你可以看到參數名稱為arg0,類型為xsd:string。其實在Axis客戶端我們可以直接通過具體的方法來設置每一個參數名稱、類型以及返回值類型。如下代碼: call.addParameter("testParam", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);call.setReturnType(org.apache.axis.Constants.XSD_STRING); 加入上面的代碼之后生成如下的SOAP信息: <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <testParam xsi:type="xsd:string">Hello!</testParam> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> 可以作簡單的對比。 也許你會疑惑設置參數名稱和不設置參數名稱有什么區別的疑問。這里作簡單的解釋: 1. 為什么要call.setReturnType(org.apache.axis.Constants.XSD_STRING)? 上面你可以調用或者可以不調用,但當返回結果中沒有標明數據類型時Axis就不知道如何進行數據類型轉換。當然如果返回類型你很清楚并且返回應答SOAP的結果中表明了相應的數據類型你便可以不進行上面的函數調用。 2. 為什么要設置參數名稱和類型? 好了,下在你知道了如何調用Web Services了,下面告訴你如何寫作和發布Web Services。 通過Axis發布Web Services 這里寫作一個簡單的類,然后一步一步進行發布。希望用戶能夠從中理出一些思路來。我在其他的關于Web Services的文章中會專門針對Web Services的通用發布方法。雖然Web Services牽涉到很多復雜的知識,但請大家不要感覺到這些操作簡單,也許你已經有很多疑問,沒關系,記下你的疑問,不斷的投試。 public class SayHello { public String echoString(String hello){ return hello; }} 哈哈,這個類是不是太簡單了。 一步一步來。 Axis提供兩種將Java類發布成Web Services的途徑,即即時快速自動發布和通過配置文件進行發布。我們首先從最容易部署的入手。 JWS----即時部署 簡單說就是將自己寫的Java類源文件按一定的規則Copy到特定的目錄下便可自行被Axis部署。具體步驟如下: 將上面寫的SayHello.java復制到axis目錄下。 改名為SayHello.jws。 注意:在你寫的類中不能有具體包的信息,因為這正是Axis即時部署不支持的。 運行我們前面寫的客戶端進行測試,運行結果是hello!。 目前你是否有如下的問題?
如果類中用多態的函數將如何處理? 其實很簡單,我們知道在每次發出調用請求之前代理程序在后臺會直接請求你給的URL,這里是http://localhost:8080/axis/SayHello.jws?wsdl,其實這一請求返回來的是WSDL描述文件,通過具體的描述文件的內容和你輸入的參數的類型比較,最終確定發送什么請求。細節上的解釋需要用戶閱讀SOAP的具體內容。我也會提供相應的權威文當翻譯的。
Axis的客戶端默認就是通過HTTP協議傳輸嗎?
如何將自己定義的類型進行映射? 通過WSDD自定義部署
上面的自動部署相當簡單,但當你需要 映射自己的類型時 不需要暴露源代碼時 需要自己的路徑和包管理時 對用戶操作Web Services的事件進行相應時
就需要通過WSDD來自定義部署。 前面新特性中提到過,Axis是一個很靈活的可配置系統,但在配置之前你得懂得Axis Web Services描述文檔(WSDD)的格式和意義。這里有一個簡單的例子(deploy.wsdd): <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="SayHello2" provider="java:RPC"> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 很簡短的描述就會自定義對特定類以Web Services的形式發布。上面的每一個service項都會意味著開通一個相應的可被WSDL文件引用的服務。其內部描述信息將會描述從請求-處理請求-應答需要的所有核心信息。這里provider=”java:RPC”對應著相應的服務類為org.apache.axis.providers.java.RPCProvider。其實你可以通過多種方式提供相應的服務。在關于Axis的架構文章中將會詳細解釋這些內容。
上面的各個參數我不再解釋,我想大家一看就明白。 下面讓我們在上面的簡單配置上開始一步一步的進行各種高級配置: 服務存活范圍 Axis提供Session、Request和Application三種可選范圍配置。具體配置標記為:
<service name="MyService"...> <parameter name="scope" value="value"/> ... </service> 一旦你完成上面的文件。可以寫一個腳本批處理文件來完成部署。批處理文件如下:
java -classpath F:\resource\tools\axis-1_1\lib\axis.jar;F:\resource\tools\axis-1_1\lib\commons-discovery.jar;F:\resource\tools\axis-1_1\lib\jaxrpc.jar;F:\resource\tools\axis-1_1\lib\commons-logging.jar;F:\resource\tools\axis-1_1\lib\log4j-1.2.8.jar;F:\resource\tools\axis-1_1\lib\wsdl4j.jar;F:\resource\tools\axis-1_1\lib\j2ee.jar org.apache.axis.client.AdminClient sayHelloD.wsdd。 上面的一些jar文件都是Axis運行需要的組件,所以必須添加到環境中。上面的目錄是我的機器里的目錄,你可以按自己的目錄進行。 如果部署成功,會輸出<Admin>Done processing</Admin>信息。 但本人這里再強調幾個: 你首先要將你編譯好的類放到axis/web-inf/classes/下面。 可以通過http://localhost:8080/axis/services/SayHello2來調用。 你可以從我的配置文件中發現了包的概念。 可以用相應的xml文件進行卸載已部署的服務。 卸載方法如下: 編寫如下XML文檔
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="MyService"/> </undeployment> 把上面的批處理文件中的sayHelloD.wsdd換成該文件便可。
繼續關注高級部署
如果你想知道自己的某個Web Services被調用多少次,你應該怎么做呢? Axis提供了相應的跟蹤機制。
首先你應該編寫一個滿足一定接口的事件處理類。 在配置文件中添加事件處理器信息。
我們先看看配置文件中的信息:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- define the logging handler configuration --> <handler name="track" type="java:samples.userguide.example4.LogHandler"> <parameter name="parameter1" value="訪問該services"/> </handler> <!-- define the service, using the log handler we just defined --> <service name="SayHello2" provider="java:RPC"> <requestFlow> <handler type="track"/> </requestFlow> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 上面的綠色部分起到核心的配置信息提供。
下面提供一個事件處理類,同樣來自原文檔,但為了更清晰我同樣將所有的類前面加上了包名稱。 package luopc.ws;
/** * @author luopc */ public class EventHandler extends org.apache.axis.handlers.BasicHandler{ public void invoke(org.apache.axis.MessageContext mtxt){ String param=(String)getOption("parameter1"); System.out.println(param); }
public static void main(String[] args) { } }
就這樣,我們對請求跟蹤了。嘻嘻。
可以遠程進行管理(不推薦)
前面就提到服務類型的問題,在Axis有四種類型的服務,分別為RPC、Document、Wrapped和Message。 |
Axis下 WebService 的調用問題
本人按照網上例子制作一個Sample,遇到一個問題,當用JAVA編寫的客戶端調用返回值類型是int的函數時能正確得到返回值,但是調用返回值類型是String的函數時,不能正確得到返回值。以下為服務器端程序源代碼: /** * 此處插入類型描述。 * 創建日期:(2005-10-27 10:32:48) * @author:Administrator */ import java.util.*; public class ZxjTest { protected String name="gaga"; protected int age=20; protected int sex=22; protected List items=new ArrayList(); /** * ZxjTest 構造子注解。 */ public ZxjTest() { super(); } public String getName() { return name; } public int getAge() { return age; } public int getSex() { return sex; } public List getItems() { return items; } } 客戶端調用的源代碼: String endpoint = "http://myserver:7001/ZxjTest.jws"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName("getName"); String ret = (String) call.invoke(new Object[] {}); 出錯的就是最后一句。如果這一句改成調用返回值是Int的函數,就不會出錯。請問,這是Axis的配置的問題嗎?如果是,該如何改? 應該不大可能是Axis的配置的問題,你調用的是 public String getName() { return name; } 因此返回的是String,這個是沒有錯誤的! 你的程序我在自己機器上運行的很好!不管調用哪個方法,都一樣輸出。你可以把String ret = (String) call.invoke(new Object[] {});改成Object ret = (Object)call.invoke(new Object[] {});這樣的話你就不用去類型轉換了! 或者如果你要類型轉換的話,也可以這樣做: 1,如果調用返回類型是string的方法 那么最后一句應該為 String ret = (String) call.invoke(new Object[] {}); 2,如果調用返回類型是int的方法,那么最后一句應該為 Integer ret = (Integer)call.invoke(new Object[] {}); 還有要注意的是在利用客戶端進行測試的時候,確保服務器已經啟動,否則會出錯。如果你是采用http://myserver:7001/ZxjTest.jws的話,你的web-inf下確保沒有 server-config.wsdd,否則也會出錯。 還有一個很簡單的錯誤,可能僅僅只是WebLogic配置的問題。最好重建一個應用并重新配置。 |
|
查找引擎之王 google 于 4/11 開放了它的查詢接口,可以讓全世界各地的 Java 以及 .NET 程序員,免費地以 WebServices 的方式,對 google 下查找指令,并且可以將結果使用于自己的程序或網頁中。不過使用上也有限制,它一天只允許未付費的程序員查找 1000 次。要使用前,必須先向 google 注冊帳號,取得一個 32 位長度的 license key ,每次呼叫查詢時,必須帶入這個 license key 即可使用。因為 WebServices 以 WSDL (Web Service Definition Language) 的方式描述所開放的接口,走的通訊協定是 SOAP on HTTP ,所以理論上可以穿越防火墻。 Java 范例程序如下∶
import java.io.*;
import com.google.soap.search.*; // 這是 googleapi.jar ,由 google 所提供
public class SearchGoogle {
public static void main(String[] args) {
if (args.length != 2)
{
System.err.println("Usage: java SearchGoogle LicenseKey 查詢字符串 ");
System.exit(1);
}
String clientKey = args[0];
String queryString = args[1];
System.out.println(" 查詢字符串 = " + queryString);
// 產生查找對象,設定輸出編碼 (big5)
GoogleSearch s = new GoogleSearch();
s.setKey(clientKey);
s.setOutputEncoding("big5");
try
{
s.setQueryString(qyeryString);
GoogleSearchResult r = s.doSearch();
System.out.println(" 查找結果 :");
System.out.println("======================");
System.out.println(r.toString());
}
catch (GoogleSearchFault e)
{
System.out.println(" 查找失敗 ");
}
}
}
使用方法以及查詢結果(執行環境∶ Linux + JDK 1.3.1_01 ,主機位于防火墻后端)∶
java -classpath .:../lib/googleapi.jar
SearchGoogle xxxxxxxxx- 我的 LicenseKey-xxxxxxxxx LinuxFab
查詢字符串 = LinuxFab
查找結果 :
======================
{
TM = 0.048257
Q = "LinuxFab"
CT = ""
TT = ""
CATs =
{
{SE="Big5", FVN="Top/World/Chinese_Traditional/ 計算機 /Operating_Systems/Unix/Linux"}
}
Start Index = 1
End Index = 10
Estimated Total Results Number = 11500
Document Filtering = true
Estimate Correct = false
Rs =
{
[
URL = "http://bbs.ee.ntu.edu.tw/boards/Linux/21/"
Title = " ◆ 【 LinuxFab 早報】 "
Snippet = " ◆ 【 LinuxFab 早報】 . ... 5, ◇ 【 LinuxFab 本周專欄】 如何制作簡易 Floppy Liunx, linuxfab. 07/13/01. ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "11k"
Related information present = true
Host Name = ""
],
[
URL = "http://bbs.ee.ntu.edu.tw/boards/Linux/21/73.html"
Title = " ◇ 【 LinuxFab 早報】 - Linux 2.4.10 內核中剽竊了 ┅ "
Snippet = " ◇ 【 LinuxFab 早報】 - Linux 2.4.10 內核中 剽竊了 ┅ . 發信人 : linuxfab.bbs ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "10k"
Related information present = true
Host Name = "bbs.ee.ntu.edu.tw"
],
[
URL = "http://www.lslnet.com/linux/docs/linux-3033.htm"
Title = "LinuxFab: Red Hat7.0 ? 新特色 - [? 森林 - 自由 ? 件 ]"
Snippet = " ... LinuxFab: Red Hat7.0 ? 新特色 ? 森林 http://www.lslnet.com 2000 年 9 月 24 日 09:59 ... 摘自∶ http:linuxfab.cx [ ?? 窗口 ]. ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "5k"
Related information present = true
Host Name = ""
],
下略
當然,輸出結果不是這么雜亂, google 所提供的 api 有各種查找設定方法,例如從第幾筆開始查找、設定傳回筆數、偏好查找(避免查找 java 時傳回 咖啡 的結果) ... 等等,各位可以好好玩一玩。
如果您不想使用 google 的 library ,您也可以利用手邊的 WebServices 工具程序,自動抓取 google 所提供的 WSDL 文檔(位于∶ http://api.google.com/GoogleSearch.wsdl ),并且產生相關的 java 對象。以下以 GLUE 這套 Java WebServices 軟體包做范例∶
$ wsdl2java http://api.google.com/GoogleSearch.wsdl -p example -d example/
write file example/IGoogleSearchPort.java
write file example/GoogleSearchServiceHelper.java
write file example/ResultElement.java
write file example/DirectoryCategory.java
write file example/GoogleSearchResult.java
write file GoogleSearchService.map
GLUE 的強處在于它自動為您處理所有 XML <-> Java Object Mapping 以及 SOAP 傳輸的問題,您甚至不需要看懂 WSDL 便可直接使用 WebServices !我們現在已經將 WSDL 轉換成 Java 對象, package 名為 example ,接下來便是撰寫 Client 去連接 google ∶
import java.io.*;
import electric.registry.Registry; // 包含于 GLUE-STD.jar ,為 GLUE 標準版的 library
import example.*; //GLUE 自動為您由 WSDL 產生出來的 Java 對象
public class SearchGoogle2 {
public static void main(String[] args) {
if (args.length != 2)
{
System.err.println("Usage: java SearchGoogle LicenseKey 查詢字符串 ");
System.exit(1);
}
String clientKey = args[0];
String queryString = args[1];
System.out.println(" 查詢字符串 = " + queryString );
String url = "http://api.google.com/GoogleSearch.wsdl";
try
{
// 利用 GLUE 產生的接口,去 bind google 的 WSDL
IGoogleSearchPort searcher = (IGoogleSearchPort) Registry.bind(url , IGoogleSearchPort.class);
// 查詢
GoogleSearchResult result = searcher.doGoogleSearch
( clientKey , queryString , 0 , 1 , false , "" , false , "" , "Big5" , "Big5" );
System.out.println(" 查找結果 :");
System.out.println("======================");
System.out.println(" 回應數量∶ " + result.resultElements.length );
System.out.println(" 第一筆結果∶ ");
System.out.println(" 簡介∶ " + result.resultElements[0].summary );
System.out.println("URL ∶ " + result.resultElements[0].URL );
System.out.println(" 片段∶ " + result.resultElements[0].snippet );
System.out.println(" 標頭∶ " + result.resultElements[0].title );
System.out.println(" 主機∶ " + result.resultElements[0].hostName );
System.out.println(" 目錄∶ " + result.resultElements[0].directoryTitle );
}
catch (electric.registry.RegistryException e)
{
System.out.println(" 錯誤∶ " + e.getMessage());
}
}
}
執行結果指令如下∶
$ java -classpath .:../lib/GLUE-STD.jar:../lib/j2ee.jar:../lib/jnet.jar
SearchGoogle2 xxxxxxxxx- 我的 LicenseKey-xxxxxxxxx LinuxFab
查詢字符串 = LinuxFab
查找結果 :
======================
回應數量∶ 1
第一筆結果∶
簡介∶
URL ∶ http://bbs.ee.ntu.edu.tw/boards/Linux/21/
片段∶◆ 【 LinuxFab 早報】 . ... 5, ◇ 【 LinuxFab 本周專欄】 如何制作簡易 Floppy Liunx, linuxfab. 07/13/01. ...
標頭∶◆ 【 LinuxFab 早報】
主機∶
目錄∶
要注意的是,這只是 google beta2 版本的 WSDL ,未來接口一定會有所更動,而且遠端主機 (api.google.com) 仍然不太穩定,有時候會連不過去,有時又會出現 Internal Server Error 的錯誤。不過以上的介紹應該可以給大家一個簡單的 WebServices 概念了吧?目前幾乎所有的程序語言都有 WebServices 的相關軟體包,不論您是 PHP 網頁制作者,或是 VB 窗口程序員,應該都找到相關的軟體包,直接在您的網頁 / 程序上面撰寫 WebServices 的 Client 以及 Server 。
截稿前消息∶全球最大的網絡書店 Amazon ,也開始提供 WebServices 接口給代銷商( associates ,可以在個人網頁上放置連往 Amazon 的 icon 或連結,藉此賺取部分成交金額)使用。代銷商現在可以利用 Amazon 提供的 WebServices 撰寫 Web/Desktop 應用程序了!看來類似的 WebServices 將會逐漸在許多大站點中陸續被采用,或許 LinuxFab/SourceFab 可以考慮引進此技術,使本站成為華人 Open Source 界的網絡運算中心。
用IBM的筆記本的朋友非常的多,大多數人都喜歡刪除原帶的系統,自己來按裝新的操作系統,可是重裝系統后對于IBM隨機帶的軟件可以說是一頭霧水,因為軟件大多都為英文,而且數量又多,沒辦法許多朋友就用全部按裝法,把只要是隨機帶的全部裝到機器上,可是有一部分是完全沒有必要裝的,或者說可以選擇性的按裝,本文的目的是為了讓大家了解大多數隨機軟件的用途,讓大家按自己的用途來按裝,從而結省了有限的內存空間,
注: 其中大部分軟件只能使用在T2x,X2x,R系列,A2x以后的機型,對于570這種老機器好多軟件是無法安裝的,系統為Windows XP
1. Battery MaxiMiser Wizard 按裝性:必裝~
這個軟件按字面來看是”電池最大化向導”,它是通過電池中的一塊芯片來查看電池的健康情況以及電池的充電次數和剩余電量等等一些相關參數的.它還可以自己定義電源管理模式,比如用電池時屏幕是4格亮度,CPU按最小的頻率使用等.,
2. IBM PM驅動 按裝性:必裝
PM的意為Power Management Driver,也就是電源管理驅動,它是十分重要的一個軟件,它可以來控制當本本在市電與電池之間切換時,CPU與主板PCI總線頻率的控制,也就是我們所說的CPU降頻使用,當然您的CPU必須支持Speed Step技術,此軟件也與上面的軟件配合使用
3.HotKey 驅動 按裝性:必裝
IBM的熱鍵驅動,它的功能有當用戶調整音量與屏幕亮度時,在屏幕下方顯示當前音量和亮度的等級,以圖形方式顯示.還包括打開鍵盤燈和屏幕放大的提示.等.
4. ThinkPad Configuration 按裝性:必裝
這個軟件相當于您系統中的設備管理器,它的功能可以說是相當強大,它可以管理IBM ThinkPad筆記本電腦中的所有硬件,以及內置的安全芯片,查看系統信息等等,它可以打開和屏蔽筆記本中的各種接口,如PCMCIA,紅外端口等.
5. Presentation Director 按裝性:可選
它叫演示向導,一個非常實用的驅動,它非常適合那些經常外出接投影儀和大屏幕顯示設備的商務人士,它的組合鍵是FN+F7,按下后會出現一個選擇分辯率的列表,當用戶外接一個顯示設備時可選擇一個適合的分辯率,演示后還可以直接切換回來,就不用來回的調整屏幕的分辯率了,如果去多個地方又要用到不同的分辯率和顯示設備,那么可以手動設置不同的分辯率和屏幕的顯示方式,方便快速,節約時間,從而提高的工作效率.
6. Keyboard Customizer Utility 按裝性:可選
用過ThinkPad本本的朋友都知道IBM的鍵盤沒有視窗鍵,這個軟件就可以讓你用其它的鍵來代替視窗鍵.當然它的功能不止這些,它還可以讓用戶按照自己的喜好把鍵盤上的一些組合健定義成快捷鍵,比如筆者就把Shift+右方向鍵,定義成為了光驅打開.它還可以當您外接鍵盤時可以用重新定義功能鍵,有興趣的朋友不仿自己試試.
7. EasyEject Utility 按裝性:可選
它的功能等同于系統中安全移除硬件向導,組合鍵為FN+F9,它的優點是界面十分直觀,當用戶要停用移動設備時,它可以以幫助您安全的移除您連接的設備,包括用戶接的擴展塢
8. IBM Active Protection System 按裝性:必裝
APS驅動,這個驅動只支持T41以后的本本,當然還包括R51等支持這個硬盤保護功能筆記本,APS是一種主動的硬盤保護系統,它的作用是當用戶在使用筆記本過程中,電腦意外下落,這個系統會在非常快的時間內做出反應,停止硬盤工作,保護用戶的數據,把損失降到最小,筆者建議有這個功能的本本用戶最好還是裝上,不在乎那幾M的內存,安全才是最重要的.
9. IBM Access Connections 按裝性:可選
筆都最喜歡用的一個軟件,個人認為是IBM隨機軟件中最最經典的一個,沒有一個共享軟件比的上它,說它經典是因為它非常試合網絡管理員來使用,也非常適合天天帶著本本在不同的網絡間漫游的人(不管有線網絡,無線網絡,ADSL,還是企業內網),有了它網管就不用來回更改本本的IP地址了,不用建立一大堆的連接方式,不用用腦子記住不同的DNS,不同的網關,它的方便之處只有你用了才可以深深的明白,呵呵,說多了有點.具體的說,它可以讓用戶分別定義不同的網絡配置文件,這件配置文件中包括不同的網絡連接方式,不同的IP地址,網關,DNS等等,當用戶從一個網絡中切換到另一個網絡中,不需要重新更改本機的IP地址,只要按一下FN+F5組合鍵,從定義好的列表中選擇一種適合的配置文件即可,真是太方便了.它的優點和細節功能真是一句兩句說不清楚,總之呢希望朋友們好好的利用它節省我們的時間,提高我們的工作效率
10. UltraNav Wizard 按裝性:可選
這個驅動只適合那些有觸模板的ThinkPad計算機,包括T30.T4x,R51等等,它的功能也很多,它可以調整觸模板的一些細節設置,比如可以把觸模板左右鍵設成快捷健,打開用戶的程序.還可以把觸模板的一邊設成滾輪來瀏覽網頁等等.
11.Access IBM 按裝性:可選)
就是按下本本右上角那個藍色的按鈕出來的東東,它包括幫助文件,還有恢復系統等等,筆者沒有按裝,個人感覺它是一個花瓶,所以我把那個藍色按鈕改成快捷鍵了.如果朋友們喜歡那個藍色按鈕打開時的界面,我想還是裝上去吧.對于那些對ThinkPad了解深入的朋友就沒有必要按裝了
12. Access IBM Message Center 按裝性:可選
IBM的消息中心,我想它是給像我這樣的懶人準備的,我一般很少去IBM的官方網站去看看出個什么新驅動沒有,裝上它就方便多了,有什么新驅動和關于您本本的新消息,它會馬上通知您下載和按裝,比較方便的
13. Software Installer 按裝性: 必裝 適用機型:全部
意為“軟件安裝者”當初在第一篇文章中,沒把它加入是我的失誤,現在隆重介紹此軟件,經常在Windows軟件區看到不少XD,求這個驅動,那個驅動的,其實只要裝了Software Installer您就不用在上IBM官方網站找驅動了,SI可以幫助你找到你的計算機所需要的最新驅動程序,當然前提是小黑必須連接入互聯網,它會自己搜索針對本機的驅動程序,讓用戶有選擇性的下載,速度還不錯。沒用過的XD快快裝上吧。
14.System Migration Assistant 按裝性: 建議安裝 適用機型:全部
英文意為“IBM 系統遷移輔助程序”,我想大多數的兄弟都不太喜歡重裝系統,因為有一些個人設置(如桌面、圖標、網絡設置、窗口大小、等一些小細節、甚至還包括聲音)都要重新來過,有時還會忘記一些重要設置,有了IBM 系統遷移輔助程序,就太方便了,它可以把用戶的個人設置,全部導出為擴展名為*.sma的備份文件,重裝系統后,再導入到新裝的系統中就可以完全1:1的回到您重裝系統之前,速度快不說、最重要是它備份文件的完整性、和可選擇性,它可以選擇您想備份的,去掉不想備份。全中文界面,就好比選擇性的克隆一樣
經我試用,SMA居然還可以把你在原系統中的共享文件夾也給備份了,當然包括用戶信息如:Administrator的設置等等,總之SMA帶給你的只有方便和簡單加上快速。
15. IBM Client Security Software 按裝性: 可選 適用機型:T2x\T4x\R5x\等
IBM 客戶端安全軟件,也就是IBM廣告中經常提到的CSS 1.0 2.0,CSS不光應用于小黑,也應用于ThinkCentre臺式電腦,CSS通過嵌入式安全子系統,也就是安全芯片,對用戶的重要數據進行加密,和保護,當然還包括管理用戶的常用密碼,如果有CSS的XD可以不防一試,想加密文件時,就不必在按裝第三方加密軟件了。
16. IBM File and Folder Encryption 按裝性:可選
意為IBM 文件和文件夾加密,是和CSS客戶端配合使用的一個程序,簡稱為IBM FFE,它的名氣沒有CCS那么大,FFE只能加密C盤的文件,對于其它驅動器,FFE是無法加密的。個人認為用CSS就可以了。FFE沒有必要安裝。
17. IBM Rescue and Recovery 按裝性:建議安裝
大名鼎鼎的IBM 營救和恢復程序,簡稱R&R,雖然我很少使用它,因為它太大了。4××MB,不過為了這個文章裝一下研究,事先說明R&R只支持Win2000和XP,R&R是一個超級強大的備份壓縮工具,個人認為R&R可以代替HPA了,R&R可以備份全部的系統文件到硬盤中,或者到其它的移動介質,它可以備份所有分區,或者單獨的分區,備份過程是在Windows下進行的,如果您想恢復您備份的系統,重裝啟動,按下F11鍵,一個很漂亮又熟悉的介面就會出現在你在眼前,他可以代替世面上所以的備份恢復軟件,大家不防一試。R&R太強大了,光*我的一個介紹難于讓大家直觀了解,大家可以裝上看看