搭建开发环境:
这里开发环境我使用诺基亚提供的开发者软件: 编写、调试软件:Nokia.Mobile.Internet.Toolkit.4.1 安装这个软件之前需要安装JDK,版本要1.6以上的,安装完JDK之后,就可以安装诺基亚提供的软件了,安装的时候需要到诺基亚开发者论坛上注册一个用户,网址为:注册之后,会收到一封电子邮件,点击邮件中的确认连接,完成激活帐户。在安装程序中使用帐号登录后,诺基亚会向你的注册邮箱发一封电子邮件,里面有软件的使用序列号,复制粘贴后,就可以安装了,安装过程简单,出来其中需要开发帐号和序列号之外,和其他软件安装没什么区别
手机模拟器SDK:Nokia.Mobile.Browser.Simulator.4.0 安装了开发.wml文件的软件后,还需要安装一个手机模拟器,有了这个模拟器,才能访问.wml手机网页文件。 下载这个文件后,解压安装,模拟器同样需要序列号,到诺基亚开发者论坛上获取即可。这里提供一个:ZCygAB6ZMmtt/I4L1c2gppNX1H0= 将序列号复制粘贴后,即可安装,需要注意的是,安装路径要和上面安装的Nokia.Mobile.Internet.Toolkit.4.1路径一致,安装完成后,打开NMIT 4.1,可以看到 SDK Panel 面板中 显示Nokia Mobile Browser (v4.0) 了, 如果没有安装则显示 No Devices,安装成功界面: 点击右边的绿色按钮,就可以打开手机模拟器了:
测试一下,打开:file:///D:/Nokia/Tools/Nokia_Mobile_Internet_Toolkit/samples/WML/readme.wml 可以在模拟器中打开这个文件。
我的诺基亚开发者帐号: 序列号:HB7qzgYG/2bZH00jrtwmbaycXTo=
编写一个HelloWorld:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" ""> <wml> <card> <p> HelloWrold! </p> </card> </wml>
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" ""> 这个是头部, 每个 .wml 都必须有,和html的头信息一个道理。 当我们编写的wml页面的时候就可以 复制过去 。 <wml>....</wml> 里面的是 正文了,相当于 html 网页的 <body>....</body> <card></card> 可以理解为卡片,多个界面都是有多个<card></card>组成。
最后就是运行,在手机模拟器进行浏览 点击 File -> Open File
找到刚才的文件打开就可以了 如果你修改了 页面, 只要在手机模拟器上按下Ctrl+R刷新一下就可以了 当你要显示当前卡片的 标题则要加入 card 的其中一个属性 <card title="www.17rumen.com">
多卡片card管理和导航:
上面说到了<card></card> 我们把它可以理解为卡片,现在呢,我想在手机模拟器上再显示其他东西呢?我们不需要另外做一个界面,只要在<wml>....</wml>标签里面多写一个<card></card>就可以了,因为在一个.wml文件里面出现了多个<card></card>组,所以为了以示区别,加入一个属性id: <wml> <card id="c1" title="c1 card"> <do type="accept" label="Next"> <go href="#c2" /> </do>
<p>Hello World</p> </card>
<card id="c2" title="c2 card"> <do type="prev"> <prev/> </do>
<p>Hi , c2</p> </card> </wml>
do 可以看着是一个 动作,ccept 你可以理解成 后操作, label="Next" 显示给用户操作的信息, 也就是用户会看到 Next 这个选项, 当用户点击了 Next 就会 执行 <go href="#c2" />这不难理解, 就会 跳转到 c2 显示 <p>Hi , c2</p> 内容了。
动作事件:
<wml> <card id="c1" title="c1 card" ontimer="#c2"> <timer value="30" /> <p>Hello World</p> </card>
<card id="c2" title="c2 card"> <p>Hi , c2</p> </card> </wml>
加入 ontimer 事件,3秒后 进入 c2 的卡片
<wml> <card onenterforward="wml_04.wml"> <p>Hello World</p> </card> </wml>
格式化文本 <p> <b>Hello World</b> <br/> <u> hi</u> <br/> <i>www.17rumen.com</i> </p>
此类标签和html标签区别不是很大,用手册查看一下就能明白的
用户输入数据:
wml 也有这样的一个标签 input , 就像 html 一样, 提供一个输入框 假设 要做一个 用户登陆的界面 <card id="c1" title="Login!"> <p> Name:<input name="userName" /> </p> </card> 在html网页中,点击一般会提供按钮,但是在wml语言中,是不支持buttion的,wml语言中,基本是一些链接,它只支持<a>标签。 做一个登陆按钮: <a href="#c2">Login</a> 当点击 Login 就会跳转到card2 去 现在我们要实现这样一个功能,当用户输入用户名后,点击Login后,在另外一个card上显示我们刚才的用户信息。这里需要涉及到获取用户值的问题了,在wml中非常方便做此类操作: <p>$(userName)</p> 只需使用 $(input的名字) 这样就可以获取 刚才输入的值了
input 标签, 如果想做成密码框的话,就要加入 type="password" 了,也就是<input type="password" name="password" />,这样就会看到输入的东西用 "*" 显示出来,input 标签还有很多属性,例如限制文本框的长度 size,还有 format , 其中 format 中有很多可以限制用户 输入
Select标签 多选、单选:
Wml语言中除了文本输入框之外,还有别的标签可以使用如select <select> <option>Java</option> <option>WML</option> <option>C++</option> </select> 如何在另一个卡片上显示所选择的数据呢? <select name="s_1"> <option value="java">Java</option> <option value="wml">WML</option> <option value="c++">C++</option> </select> 这样数据就可以获取、并且显示出来了 上面的只是单选,多选的时候只需要在 select 加入 multiple="true" 就代表多选了
wml script脚本:
在html网页中,我们经常使用javascript来对用输入的数据进行验证,在wml中,并不支持javascript语言,而是使用更轻量级的WMLScript 脚本。WMLScript示例: extern function disp(str) { var userName = WMLBrowser.getVar( str );
if( userName == "" ) Dialogs.alert( "Please enter your name, Try again." ); else WMLBrowser.go( "hhb.wml#c2" ); } 脚本文件的命名方式和javascript也有所不同,WMLScript文件使用.wmls后缀。
写好了一个脚本文件,如何调用它呢? <a href="hhb.wmls#disp('userName')">Login</a> Wmlscript如何要执行运算的话,就会用到数据类型转换,Wmlscript中将字符类型转为数字类型的函数为:Lang.parseInt()
Wml和后台通信:
通常动态网页是这样运作的,前台页面提交数据给后台,后台接收后进行处理,然后返回一个页面给前台显示,wml也不例外。这里我们使用wml和servlet进行通讯:
Wml页面: <a href="(userName)"> Login </a>
Servlet代码: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet {
public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/vnd.wap.wml"); PrintWriter out = response.getWriter(); String userName = request.getParameter("userName");
if( !userName.equals("hehongbo") ) { response.sendRedirect("/wml/wml_06.wml"); }
out.println("<?xml version=\"1.0\"?>"); out.println("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""); out.println(" \"\">"); out.println("<wml>"); out.println("<card title=\"Welcome!\">"); out.println(" <p align=\"center\">");
out.println("Hello, "+ userName );
out.println("</p>"); out.println("</card>"); out.println("</wml>"); } }
Wml页面传递一个参数过来,后台servlet对数据进行判断,如果手机用户输入的名字不是hehongbo,则返回到输入页面,如果输入的名字是hehongbo那么就会显示一个Hello,hehongbo。 |