先看一個簡單的例子程序:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> <% response.setContentType("text/vnd.wap.wml"); %> <wml> <card id="start"> <do type="accept"> <go href="index.jsp#test"/> </do> <p> JSP Test:<br/> Press accept to continue!<br/> </p> </card> <card id="test"> <do type="prev"> <prev/> </do> <% out.println("<p>"); out.println("Hello from script code!<br/>"); out.println("</p>"); %> </card> </wml> 下面將要演示使用WML和Java Server API如何簡單快速地在WAP終端上生成動態(tài)的WML頁面。這里將不再去講每個WML標(biāo)記的作用,,而是給出一個簡單的例子,。這個例子體現(xiàn)出整個語言的特點。
這個JSP例子顯示了為一個移動用戶定時更新約會的例子,,例如:做一個給家里打電話的應(yīng)用程序,。這個應(yīng)用是在Windows NT下使用Java Server Web Development Kit(JSWDK)1.01和JSWDK配套的服務(wù)端工具,來建立的JSP頁面,。使用Nokia WAP Toolkit 1.2測試和瀏覽應(yīng)用,。 一個典型的路徑還包括在移動電話和WAP內(nèi)容服務(wù)之間的一個WAP網(wǎng)關(guān)。這樣安排的主要原因是要對WML進行編碼,,這樣來適應(yīng)其窄帶的特點,。但是Nokia WAP Toolkit包含了這樣一個編譯器,因此它可以直接從HTTP服務(wù)器提取WML內(nèi)容(在例子里是從服務(wù)端工具上來取的),。 當(dāng)建立WAP應(yīng)用的時候,,必須記住一點。WAP設(shè)備的顯示屏幕很小——典型的只有4行12個字符,,不要使用過多的滾動,。這樣會使用戶十分煩心。數(shù)據(jù)的輸入功能也十分有限,。而且設(shè)備的RAM有限,,CPU的能力有限。并且現(xiàn)在無線網(wǎng)絡(luò)的帶寬有限而且高延時,。因此WAP的應(yīng)用程序應(yīng)當(dāng)短小,,簡單。 應(yīng)用程序包括兩個頁面,。第一個是“pick_appointment.jsp”,。它有一個選擇卡片。當(dāng)用戶選擇了其中的一個約會時間的時候,,就會進入到“show_appointment_data.jsp”頁面(中間還傳遞了約會的ID號),。第二個頁面有兩個卡片。第一個顯示會面的時間,第二個顯示數(shù)據(jù)輸入,,允許工程師通過輸入ID取消約會,。 動態(tài)的約會數(shù)據(jù)是通過JavaBean的實例來取得的。在這里沒有它的代碼,,總的來說是通過JDBC連接到數(shù)據(jù)庫的過程,。取消的過程是通過Servlet來操作的,在這里其程序也沒有顯示,。既然用戶可能隨時取消某個約會,,因此需要定時地刷新“pick_appointment.jsp”。 pick_appointment.jsp
<%@ page language="java" contentType="text/vnd.wap.wml" %> <jsp:useBean id="appointmentBean" class="mwebber.samples.AppointmentBean" scope="application" /> <%! // This convenience method builds our <option> elements, one for each appointment. private String getOptions(mwebber.samples.AppointmentBean appointmentBean) { StringBuffer sb = new StringBuffer(); int[] appointmentIDs = appointmentBean.getAppointmentIDs(); for(int i=0; i<appointmentIDs.length; i++) { sb.append("<option onpick=\"show_appointment_data.jsp?id="); sb.append(i); sb.append("\">"); sb.append(appointmentBean.getAppointmentTime(i)); sb.append("</option>"); } return sb.toString(); } %> <%! String strXMLPrologue = "<?xml version=\"1.0\"?>"; %> <%-- WML CONTENT BEGINS --%> <%= strXMLPrologue %> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> <wml> <card id="pick" title="Appointments"> <!-- Refresh the deck every minute --> <onevent type="ontimer"> <go href="pick_appointment.jsp"/> </onevent> <timer value="600"/> <!-- Display a widget to navigate back by one in the history stack --> <do type="prev"> <prev/> </do> <!-- Display the "select" widget of appointments to pick --> <p> <select title="Appointments"> <%= getOptions(appointmentBean) %> </select> </p> </card> </wml> <%-- WML CONTENT ENDS --%> show_appointment_data.jsp
<%@ page language="java" contentType="text/vnd.wap.wml" %> <jsp:useBean id="appointmentBean" class="mwebber.samples.AppointmentBean" scope="application" /> <% // Grab the "id" parameter, using the in-built reference to the request object. int intAppointmentID = Integer.parseInt(request.getParameter("id")); %> <%! String strXMLPrologue = "<?xml version=\"1.0\"?>"; %> <%-- WML CONTENT BEGINS --%> <%= strXMLPrologue %> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www./DTD/wml_1.1.xml"> <wml> <card id="main_data" title="Main Data"> <p align="center"> <b> <%= appointmentBean.getAppointmentTime(intAppointmentID) %> </b> </p> <p> <br/> <%= appointmentBean.getAppointmentDetails(intAppointmentID) %> <br/> <a href="#check_off">Check off this appointment</a><br/> <a href="http://localhost:8080/pick_appointment.jsp">Back to appointments list</a> </p> </card> <card id="check_off" title="Check Off"> <!-- Set up a widget to send the input field data to the server --> <do type="accept"> <go href="/servlet/ProcessCheckOff" method="post"> <postfield name="check_off_code" value="$check_off_code"/> </go> </do> <p> <input name="check_off_code" emptyok="false" maxlength="6"/> </p> <p> <a href="#main_data">Back to appointment data</a> <br/> <a href="http://localhost:8080/pick_appointment.jsp">Back to appointments list</a> </p> </card> </wml> <%-- WML CONTENT ENDS --%> 在每一文件的開頭,,都要設(shè)置正確的MIME文件類型。如果文件類型不對,,那么這個頁面將遭到模擬器的拒絕,。在這個例子里,“text/vnd.wap.wml”表明是WML頁面,。其他類型例如“text/vnd.wap.wmlscript”是WMLScript源代碼,,而“image/vnd.wap.wbmp” 是WBMP文件。
既然WML頁面是一個XML文檔,,因此它包含了標(biāo)準的XML文件頭和一個DTD頭,,但是“<?”和“?>”標(biāo)記顯然與JSP的標(biāo)記有混合。因此將這一段隱藏到字符串變量當(dāng)中,。別忘記JSP將被編譯成Java源文件,,最后成為Servlet。 |
|
來自: E網(wǎng)天涯 > 《學(xué)代碼》