侯新宇
(中國(guó)傳媒大學(xué)圖書(shū)館,北京 100024)
WAP作為一項(xiàng)全球性的網(wǎng)絡(luò)通信協(xié)議,使移動(dòng)互聯(lián)網(wǎng)有了一個(gè)通行的標(biāo)準(zhǔn),把互聯(lián)網(wǎng)上HTML語(yǔ)言的信息轉(zhuǎn)換成用WML(Wireless Markup Language)描述的信息,顯示在移動(dòng)電話的顯示屏上。基于WAP技術(shù)的圖書(shū)館OPAC(Online Public Access Catalogue)系統(tǒng),可以利用現(xiàn)有OPAC系統(tǒng)與數(shù)據(jù)庫(kù)接口對(duì)數(shù)據(jù)進(jìn)行檢索操作,無(wú)需單獨(dú)建立數(shù)據(jù)庫(kù),保證了檢索數(shù)據(jù)的時(shí)效性、精確性,無(wú)冗余數(shù)據(jù)。
中國(guó)傳媒大學(xué)圖書(shū)館(以下簡(jiǎn)稱我館)因書(shū)庫(kù)面積狹小,無(wú)法放置足夠的檢索終端,在借閱繁忙時(shí)段,檢索終端前讀者人數(shù)激增,讀者需要花費(fèi)較長(zhǎng)的時(shí)間才能借閱所需圖書(shū)。為了方便讀者檢索館藏文獻(xiàn),節(jié)省讀者檢索時(shí)間,我館基于北京郵電大學(xué)Melinets自動(dòng)化業(yè)務(wù)管理系統(tǒng),使用JSP腳本語(yǔ)言,結(jié)合WML標(biāo)記語(yǔ)言構(gòu)建了WAP OPAC檢索平臺(tái),讀者可以手機(jī)為檢索終端,直接進(jìn)入開(kāi)架書(shū)庫(kù),隨時(shí)隨地進(jìn)行檢索,提高了檢索效率.
WML1.1規(guī)范標(biāo)準(zhǔn)對(duì)于標(biāo)記格式的使用十分嚴(yán)格。一些智能手機(jī)平臺(tái)上安裝的第三方瀏覽器,如UC、Opera等手機(jī)瀏覽器雖然可以過(guò)濾一些腳本及頁(yè)面顯示錯(cuò)誤,但為了保證在非智能及智能手機(jī)平臺(tái)上的兼容性,我們應(yīng)確保頁(yè)面編寫(xiě)要嚴(yán)格使用規(guī)范的WML1.1標(biāo)記。
〈?xml version="1.0"encoding="UTF-8"?〉
〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml"〉〈wml〉
〈card id="index"title="WAP OPAC For CUC Library"〉
〈p〉
歡迎訪問(wèn)中國(guó)傳媒大學(xué)圖書(shū)館〈br/〉WAP OPAC 檢索系統(tǒng)! 〈br/〉〈br/〉
〈a href="search.wml"〉書(shū)刊檢索〈/a〉〈br/〉〈br/〉
〈a href="reader.wml"〉讀者信息〈/a〉〈br/〉〈br/〉
中國(guó)傳媒大學(xué)圖書(shū)館 版權(quán)所有All Rights Reserved
〈/p〉
〈/card〉
〈/wml〉
上面的代碼保存為index.wml,就是一個(gè)最簡(jiǎn)單的WML腳本,在WML語(yǔ)言中,〈?xml version="1.0"encoding="UTF-8"?〉〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml"〉是必須出現(xiàn)在*.wml文件(包括使用JSP腳本語(yǔ)言編寫(xiě)的*.jsp文件)前兩行的標(biāo)記中,否則瀏覽器就會(huì)報(bào)錯(cuò)。
〈wml〉〈/wml〉則像 html語(yǔ)言中〈body〉〈/body〉一樣,在其中編寫(xiě)代碼。〈card〉〈/card〉標(biāo)記則是WML語(yǔ)言特有的標(biāo)記,每個(gè)手機(jī)上顯示的內(nèi)容都是這個(gè)標(biāo)記中編寫(xiě)的代碼內(nèi)容。一個(gè)wml文件中可以擁有多個(gè)〈card〉〈/card〉標(biāo)記。
手機(jī)默認(rèn)只顯示第一個(gè)標(biāo)記中的內(nèi)容,使用〈ahref="#cardID"〉go〈/a〉超鏈接標(biāo)記實(shí)現(xiàn)在多個(gè)〈card〉〈/card〉標(biāo)記之間跳轉(zhuǎn),實(shí)現(xiàn)多個(gè)頁(yè)面的顯示內(nèi)容。
encoding="UTF-8"標(biāo)記表示此文件使用UTF-8編碼顯示,此標(biāo)記也可以不寫(xiě)或?qū)懗桑B2312",對(duì)于有多語(yǔ)種圖書(shū)的圖書(shū)館應(yīng)使用UTF-8編碼顯示,確保小語(yǔ)種字符的正確顯示。在保存*.wml和*.jsp文件時(shí)也應(yīng)將其文件保存為UTF-8編碼格式,與頁(yè)面顯示語(yǔ)言保持一致,否則瀏覽器顯示時(shí)也會(huì)顯示為亂碼。
〈p〉
檢索詞: 〈input type="text"name="content"value=""/〉
〈anchor〉
〈go href="result.jsp"method="post"acceptcharset="UTF-8"〉
〈postfield name = "search_content"value = "$(content)"/〉
〈/go〉
查詢
〈/anchor〉
〈/p〉
上面的代碼是search.wml文件中的一段。用戶在輸入檢索詞內(nèi)容并點(diǎn)擊“查詢”后,系統(tǒng)將輸入框中的文本命名為search_content,并將內(nèi)容傳送給result.jsp文件,這樣就完成了一個(gè)簡(jiǎn)單的參數(shù)傳遞過(guò)程。在result.jsp文件中使用如下語(yǔ)句進(jìn)行參數(shù)獲取:
request.setCharacterEncoding("UTF-8");
String search_content= request.getParameter("search_content");
search.wml文件用 accept-charset="UTF-8"設(shè)置以UTF-8編碼傳送參數(shù),那么在result.jsp文件中也要將接收參數(shù)先設(shè)置接收編碼為UTF-8,這樣就可以正常的進(jìn)行頁(yè)面之間的參數(shù)傳送了。
〈?xml version="1.0"encoding="UTF-8"?〉〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml"〉
〈%@page contentType="text/vnd.wap.wml;
charset=UTF-8"language="java"%〉
〈%@page import="java.sql.*"%〉
〈wml〉
〈card title="檢索結(jié)果"〉〈p〉
〈%
Class.forName("com.sybase.jdbc2.jdbc.SybDriver");//裝載 JDBC 驅(qū)動(dòng)程序
String url="jdbc:sybase:Tds:IP:PORT/
melinets";//設(shè)置數(shù)據(jù)庫(kù)連接字符串
Connection conn=DriverManager.
getConnection(url,"username","password");//連接數(shù)據(jù)庫(kù)
request.setCharacterEncoding("UTF-8");//設(shè)置參數(shù)編碼是UTF-8格式
String search_content=request.get
Parameter("search_content").toUpperCase();//獲取檢索內(nèi)容,并將小寫(xiě)字母全部換成大寫(xiě)
String strSelect= "select rec_ctrl_id,title,authors,publisher,pubdate_date";
String strFrom = "from manager.index_title";String strWhere;
strWhere="where title_abs like%"+search_content+"%";//index_title表中title_abs字段存儲(chǔ)的都是已經(jīng)轉(zhuǎn)換為大寫(xiě)的字符
strOrder= "order by pubdate_date desc ";
String strSql=strSelect+strFrom+strWhere+strOrder;//SQL語(yǔ)句
ResultSet main_bibli_Rs=main_bibli_Stmt.executeQuery(strSql);//結(jié)果集對(duì)象
while{main_bibli_Rs.next()}{
String main_bibli_rec_ctrl_id=main_bibli_Rs.getString("rec_ctrl_id");
String main_bibli_title=main_bibli_Rs.get-String("title");
String main_bibli_authors=main_bibli_Rs.get-String("authors");
String main_bibli_publisher=main_bibli_Rs.getString("publisher");
main_bibli_title = main_bibli_title.replaceAll{"([u0000-u001F]|&|〈|〉)",""};//替換掉手機(jī)瀏覽器中不支持的不可見(jiàn)字符,和wml中的保留字符如“&”、“〈”、“〉”等。
main_bibli_authors=main_bibli_authors.
replaceAll{"([u0000-u001F]|&|〈|〉)",""};
main_bibli_publisher=main_bibli_
publisher.replaceAll{"([u0000-u001F]|&|〈|〉)",""};
%〉
〈%=main_bibli_title%〉〈br/〉
〈%=main_bibli_authors%〉〈br/〉
〈%=main_bibli_publisher%〉
〈% =main_bibli_Rs.getString("pubdate_date").substring(0,4)%〉〈br/〉
〈anchor〉
〈go href="detail.jsp"method="
post"accept-charset="UTF-8"〉
〈postfield name="sid"value="〈%=main_bibli_rec_ctrl_id%〉"/〉
〈/go〉
查看館藏信息
〈/anchor〉
〈%
main_bibli_Rs.close();
main_bibli_Stmt.close();
conn.close();
}%〉
〈/p〉〈/card〉
〈/wml〉
上面的代碼是result.jsp文件中的一段。文件在接收到search.wml傳送過(guò)來(lái)的檢索內(nèi)容后,對(duì)數(shù)據(jù)庫(kù)進(jìn)行檢索查詢,并輸出檢索結(jié)果,配合WML標(biāo)記語(yǔ)言,實(shí)現(xiàn)手機(jī)瀏覽器的內(nèi)容顯示。由于WML1.1規(guī)范對(duì)于字符顯示比較嚴(yán)格,雖然UC、QQ瀏覽器等第三方瀏覽器可以自動(dòng)將一些不可見(jiàn)字符過(guò)濾,但對(duì)于非智能手機(jī),瀏覽器在接收到這些不可見(jiàn)字符后會(huì)出現(xiàn)錯(cuò)誤提示,無(wú)法正確顯示網(wǎng)頁(yè),所以要對(duì)從數(shù)據(jù)庫(kù)中提取的內(nèi)容進(jìn)行過(guò)濾,replaceAll{"([u0000-u001F]|&|〈|〉)",""}函數(shù)就是使用正則表達(dá)式將所有不可見(jiàn)字符使用十六進(jìn)制方式將其讀取并進(jìn)行過(guò)濾,對(duì)于“&”、“〈”、“〉”等這些WML中的保留字符,可以使用replace("&","&")函數(shù)將其轉(zhuǎn)換為可以顯示的轉(zhuǎn)義字符,其他類似字符這里就不再贅述。
由于篇幅所限,上述代碼中沒(méi)有對(duì)檢索結(jié)果進(jìn)行分頁(yè)顯示,對(duì)于符合WML1.1規(guī)范的非智能手機(jī),單個(gè)wml文件大小不能超過(guò)255 KB。如果超過(guò)這個(gè)限制,手機(jī)會(huì)自動(dòng)截?cái)囗?yè)面文件,從而造成了頁(yè)面中缺少〈/card〉或〈/wml〉等結(jié)尾標(biāo)記,導(dǎo)致頁(yè)面無(wú)法正常顯示而報(bào)錯(cuò)。所以,必須使用分頁(yè)顯示技術(shù),且每頁(yè)顯示記錄數(shù)不宜過(guò)多。
手機(jī)屏幕比普通顯示器要小,并且分辨率不高。因此,在一個(gè)頁(yè)面中不宜顯示過(guò)多數(shù)據(jù)。檢索結(jié)果應(yīng)當(dāng)簡(jiǎn)單明了,可顯示題名、著者、出版社、出版年等一些重要信息,讀者點(diǎn)擊查看館藏信息頁(yè)面detail.jsp時(shí)再顯示圖書(shū)的詳細(xì)信息。這樣一方面可以減少服務(wù)器負(fù)擔(dān),加快檢索速度;另一方面可以減少手機(jī)GPRS流量。
Melinets系統(tǒng)在sybase數(shù)據(jù)庫(kù)端編寫(xiě)了大量存儲(chǔ)過(guò)程,如續(xù)借、預(yù)約等。我們?cè)谶M(jìn)行這些操作時(shí)調(diào)用這些編寫(xiě)好的存儲(chǔ)過(guò)程即可,如circul.up_renewal就是續(xù)借操作的存儲(chǔ)過(guò)程。將相應(yīng)的參數(shù)傳遞給存儲(chǔ)過(guò)程,執(zhí)行存儲(chǔ)過(guò)程,即可完成續(xù)借操作,下面的代碼就是一個(gè)簡(jiǎn)單的調(diào)用續(xù)借存儲(chǔ)過(guò)程,完成圖書(shū)續(xù)借操作。
〈?xml version="1.0"encoding="UTF-8"?〉〈!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml"〉
〈%@page contentType="text/vnd.wap.wml;
charset=UTF-8"language="java"%〉
〈%@include file="include/conn.jsp"%〉
〈wml〉
〈card title="讀者信息 -WAP OPAC For CUC Library"〉〈p〉
〈%
request.setCharacterEncoding("UTF-8");//設(shè)置參數(shù)編碼是UTF-8格式,或者用下面的字符轉(zhuǎn)換方法轉(zhuǎn)換編碼
String input_barcode=request.get
Parameter("username");//讀取用戶名
String input_pwd=request.get
Parameter("userpwd");//讀取密碼
String book_barcode=request.get
Parameter("book_barcode");//讀取圖書(shū)條碼
String library_id = "A";//圖書(shū)所在館
String note = "";//流通備注
String holdtype = "";//預(yù)約類型
String userid = "wap";//操作員代碼
StringstrProc= "{callcircul.up_renewal(?,?,?,?,?,?,?,?,?,?,?)}";//存儲(chǔ)過(guò)程語(yǔ)句
CallableStatementCStmt= conn.prepareCall(strProc);//準(zhǔn)備可調(diào)用語(yǔ)句對(duì)象
CStmt.setString(1,library_id);//設(shè)置輸入?yún)?shù)
CStmt.setString(2,book_barcode);
CStmt.setString(3,note);
CStmt.setString(4,holdtype);
CStmt.setString(5,userid);
CStmt.registerOutParameter(6,java.sql.Types.IN TEGER);//登記輸出參數(shù)
CStmt.registerOutParameter(7,java.sql.Types.DATE);
CStmt.registerOutParameter (8,java.sql.Types.INTEGER);
CStmt.registerOutParameter(9,java.sql.Types.IN TEGER);
CStmt.registerOutParameter(10,java.sql.Types.VA RCHAR);
CStmt.registerOutParameter (11,java.sql.Types.INTEGER);
CStmt.executeUpdate();//執(zhí)行該存儲(chǔ)過(guò)程并返回結(jié)果集
String strMsg=CStmt.getString(10);
int strRetu=CStmt.getInt(11);
if(strRetu == 0){//續(xù)借成功
%〉
續(xù)借成功! 〈br/〉
〈%=strMsg%〉〈br/〉
〈%
}
else{//續(xù)借失敗
%〉
續(xù)借失敗! 〈br/〉
〈%=strMsg%〉〈br/〉
〈%
}
CStmt.close();
conn.close();
%〉
〈/p〉〈/card〉
〈/wml〉
通過(guò)上述代碼編寫(xiě),一個(gè)簡(jiǎn)單的WAP OPAC檢索站點(diǎn)已經(jīng)建立。它擁有書(shū)刊檢索和讀者信息查詢、續(xù)借等常用功能,但還需完善。2011年9月試運(yùn)行以來(lái),極大地緩解了我館檢索終端不足的現(xiàn)狀,目前已很少出現(xiàn)排隊(duì)等待檢索的情況。