本章將主要介紹WML的相關(guān)知識,如何開發(fā)WAP應(yīng)用程序,。
WML是一種基于XML的標(biāo)記語言,,她的官方說明和規(guī)范是由WAP論壇維護的。WML的文檔類型定義是xml文件類型的,,http://www./DTD/wml_1.1.xml,。和HTML語言一樣,WML是為了顯示數(shù)據(jù)的,,而XML的目的則是描述數(shù)據(jù),,我們定義了一系列的標(biāo)記并組織成為語法規(guī)范把它稱為DTD(Document Type Definition)。支持WAP的手機里面都安裝了WAP瀏覽器他能夠解析這些標(biāo)記并正確顯示在手機屏幕上,。
通常在WML的文本的開頭都有這樣的內(nèi)容 <xml version=‘1.0‘> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> 我們把它叫做序言,。在后面就是<wml></wml>標(biāo)記了,我們所有的數(shù)據(jù)都是嵌套在這兩個標(biāo)記里面的,。WML的標(biāo)記非常少,,基本可以分為兩種一種稱為Deck/Card一種稱為Event。在這里不能一一講述,,在我們開發(fā)WML應(yīng)用的時候參考手冊就可以了,,我給大家提供一個在線的參考:Online WML Tag Reference。在<wml></wml>標(biāo)記內(nèi)的內(nèi)容我們把它稱為deck,每個屏幕的內(nèi)容我們把它定義為card,,由于WML是為無線網(wǎng)絡(luò)傳輸定義的,,充分考慮到帶寬的限制,我們允許在一個deck內(nèi)包含多個card并可以一起下載到用戶代理中,,這樣我們就可以在本地進行不同屏幕的切換了,,避免每次都去聯(lián)網(wǎng)。當(dāng)然這也給客戶端增加了負(fù)擔(dān),因此我們要避免在deck內(nèi)包含過多的card,。
下面我們編寫一個WML的例子test.wml,,內(nèi)容如下: <?xml version=‘1.0‘?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> <wml> <card id="Login" title="Login"> <do type="accept" label="Password"> <go href="#Password"/> </do> <p> UserName: <select name="name" title="Name:"> <option value="John Doe">John Doe</option> <option value="Paul Smith">Paul Smith</option> <option value="Joe Dean">Joe Dean</option> <option value="Bill Todd">Bill Todd</option> </select> </p> </card>
<card id="Password" title="Password:"> <do type="accept" label="Results"> <go href="#Results"/> </do> <p> Password: <input type="text" name="password"/> </p> </card>
<card id="Results" title="Results:"> <p> You entered:<br/> Name: $(name)<br/> Password: $(password)<br/> </p> </card> </wml> 在這個deck中包含了三個card,可以一并下載到客戶端,通過按鍵操作我們就可以在不同的card之間進行切換,,你可以在手機或者winwap模擬器中看看運行的效果,。下面是winwap下的運行截圖。
雖然我們已經(jīng)可以開發(fā)wml的應(yīng)用了,,但是這些畢竟都是些靜態(tài)的內(nèi)容,。如果我們要開發(fā)和服務(wù)器交互的功能呢?答案當(dāng)然是我們可以使用Servlet技術(shù),??聪旅娴睦樱?BR><?xml version=‘1.0‘?> <DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> <wml> <card id="Order" title="Query Inventory"> <p> <select name="Items" title="Items"> <option value="Books">Books</option> <option value="Music">Music</option> <option value="Video">Video</option> <option value="Software">Software</option> </select> </p> <do type="accept" label="Query"> <go href=" <postfield name="Items" value="$(Items)"/> </go> </do> </card> </wml> 用戶可以從列表中選擇Item,通過無線網(wǎng)絡(luò)傳輸給服務(wù)器后Servlet通過request.getParameter()方法得到用戶的選擇并發(fā)送給用戶,servlet的代碼如下:
package com.j2medev.mingjava;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class WapServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String select = request.getParameter("Items"); response.setContentType("text/vnd.wap.wml"); PrintWriter out = response.getWriter(); out.println("<?xml version=\"1.0\"?>"); out.println("<!DOCTYPE wml PUBLIC\"-//WAPFORUM//DTD WML 1.1//EN\""); out.println("\"http://www./DTD/wml_1.1.xml\">"); out.println("<wml>"); out.println("<card title=\"test\">"); out.println(" <p align=\"center\">"); out.println("you selected "+select); out.println("</p>"); out.println("</card>"); out.println("</wml>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } 正確部署Servlet和wml文件后,,在winwap下輸入http://222.28.218.222:8088/test2.wml 確認(rèn)后就可以看到y(tǒng)ou selected xxxx的內(nèi)容了,。
|