副标题#e#
假如您的企业已经依赖于利用多层的企业 Java 应用,那么您也许比想象中更靠近无线科技的将来。通过描写一个样本应用,Aashish Patil 向您展示了如何用最少的人力物力把您现有的企业 Java 基本构件毗连到无线网络中去。利用现有的 EJB、修悔改的 Servlet 以及新的 WML 和 WMLScript 页面会使这个进程发生一个奔腾。
无线应用协议(Wireless Application Protocol,WAP)可以提高一个企业现有 Web 体系布局的含金量。假如您已经利用了企业 Java 应用,您可以容易地将它们与 WAP 处事集成,这样可觉得移动事情群体带来有用的数据和成果。在这篇文章里,我会涉及到利用与 WAP 相关的 J2EE 的根基要素,然后建设一个 WAP/企业 Java 样本应用,以展示您如何把本身的 EJB 毗连到无线网络中去。
配景:J2EE 和 WAP
在阅读本文前,您应该对 Java 2 平台,Enterprise Edition(J2EE)体系布局有个根基的相识。您可以通过下面的参考资料章节找到关于 J2EE 的更多信息的链接。作为一个回首,下面是一张为台式客户机设计的典范 J2EE 应用的示意图。
图 1 — J2EE 应用布局
在图 1 中,包括 JavaServer Page(JSP)和 Servlet 的那一层认真生成动态 HTML 页面。而在 WAP 应用中,这一层将生成动态的无线标志语言(Wireless Markup Language,简称 WML)页面。因此,为了转换一个尺度的 J2EE 应用使之为移动设备所利用,您将不得不编写新的 JSP,而且在某些环境下,还要编写新的 Servlet。企业 JavaBean(EJB)保持稳定,因为它们与数据表示无关。
有些人认为 Servlet 无需变动,可能说:只要把 Servlet 的输出简朴地重定向到生成动态 WML 页面的 JSP 上就已经足够了。然而,Servlet 不能区别从台式机和从 WAP 设备发来的请求;既然 WAP 应用大概无法实现基于 Web 的体系布局的所有成果,所以在这方面并没有夹杂的处所,这一点很重要。也正由于此,开拓人员凡是为 WAP 应用设计新的 Servlet。然而在大大都环境下,这些 Servlet 与那些在基于 Web 的体系布局上提供雷同成果的 Servlet 很是相似。
在图 1 中没有呈现但对 WAP 应用又很重要的另一个组件是 WAP 网关。这个组件认真 WAP 栈和 Internet 栈之间的彼此转换。
图 2 是图 1 的改造版,显示了利用 WAP 设备作为客户端的 J2EE 应用的布局:
图 2 — WAP/J2EE 应用的布局
凭据图示,所有自 WAP 客户端到 Web 处事器的请求必需通过 WAP 网关发送。尽量 WAP 网关也可以作为安排 WML/WMLScript 页面的 WAP 处事器,但利用 Web 处事器来安排这些页面更为利便。
有许多 WAP 网关的陈设要领。对付大都 WAP 应用来说,网关或由 ISP 陈设,或由提供这个应用的公司来陈设。后者更为安详,我们今后会表明;然而,假如用户要求在他们的 WAP 设备长举办多用途的网络会见,一个内部的 WAP 网关会很不利便。大大都非 ISP 不但愿他们的网关被用来会见他们本身站点以外的其他站点;因此,为了会见其他站点,用户将不得不利用 ISP 网关。但对付被 WAP 客户端利用的每一个网关来说,用户都必需界说一个差异的毗连,正如 Windows 98 的拨号网络一样 — 并且在每个设备上,这样毗连的数目凡是是有限的。这就增加了用户的未便性,而且在会见一个站点时造成 WAP 设备中的毗连阻塞。
#p#副标题#e#
WAP 应用设计的思量事项
当利用 WAP 时,一个习惯为台式客户机编写 J2EE 应用的开拓人员会碰着一些新的挑战。以下是在构建 WAP 应用时您也许会遇到的一些问题。
我可以在屏幕上显示几行信息?
事实上,对显示几多行没有出格限制,只要不高出面板的最大尺寸就行(随设备的差异而差异)。然而,为了制止太多滚屏,每屏(即卡片)5 至 7 行最佳。
我应该思量哪些安详问题?
一些电话不支持利用POST要领发送表单数据。因此,用户名和暗码必需通过GET要领发送。在 WAP 网关上,假如日志成果被激活而且请求已被记录,打点员就有能看到用户名和暗码。假如网关是由 ISP 或其它第三方提供的,这个问题就会出格突出。
纵然一个安详的毗连也不能完全消除安详隐患。那些发送到 WAP 网关的数据利用 WTLS(Wireless Transport Layer Security)加密,它利用与尺度 TLS 沟通的算法。然而,发送到 WAP 网关的数据是二进制的编码名目(对 WAP),所以这些加密后的数据必需用 TLS 解密和再加密以合用于因特网。颠末一段时间今后,敏感数据在 WAP 网关上以明文的形式呈现。黑客则会在适当的时刻,将内存中的信息转储出来,进而乐成地会见这些敏感数据。
#p#分页标题#e#
凭据注释,办理该问题的一种步伐是在本身公司(而不是在 ISP)设一个 WAP 网关。在这种环境下,一个可信的人可以操纵网关,而且可以封锁日志成果。
您也可以用 WMLScript 来编写自界说的加密算法,以对客户端的用户名和暗码举办加密。这只有在利用简朴的算法时才有大概实现;在支持 DES 类的算法上,WMLScript 不足强大。
我奈何保持 Session?
WAP 客户端不支持 Cookie。这样,当用户在您的站点的差异页面之间穿梭时,为了在处事器端保存关于客户端的信息,在向处事器发送每个请求的同时,一个 Session ID 必需被看成参数通报。Session ID 的参数名按照 Servlet 引擎的差异而差异。
有时,缺省的 Session ID 长度很大幅度地增加了每个请求的长度。功效导致客户端或 WAP 网关大概将此请求看作一个无效的 URL 而拒绝。这样有须要缩短 Session ID 的长度。请查察一下您正在利用的 Servlet 引擎的说明文档中关于 Session ID 参数名的部门。假如您遇到过无效 URL 的错误,这个说明文档也应提供有关缩短 Session ID 值长度的指南。
结构样本应用
XYZ Ltd. 是一家出产 PDA,可佩带的计较机,及其它普及计较设备的公司。公司的销售人员造访客户,提供 XYZ 产物的现场演示;某些演示要求销售人员必需跑很远的路去客户哪里。那么在路上,他们是怎么收到客户列表和其它重要数据的呢?
为此利用电子邮件会需要体积较大且昂贵的便携式电脑或无休止的 Internet cafés 的搜索;在客户端利用传真机则更不切实际。取而代之的是 XYZ 的销售人员会通过支持 WAP 成果的设备吸收数据,譬喻手机或 PDA。利用移动设备,销售人员能在造访客户时向公司提供实时的反馈。公司就能顿时布置给客户实时发货并维护今朝的销售统计信息。
我们的应用有两个主要方针。首先,我们活动的销售人员应该能利用它在 WAP 设备上查察客户列表。第二,假如一个客户但愿买货,那么销售人员应能利用设备来下订单。另外,任何 WAP 应用的一个重要方针应该是减罕用户须要的按键数目。由于受手持设备的用户界面限制,用户需要输入的数据量应节制在最少。
这是一张显示我们系统的体系布局的流程示意图
图 3 — 应用流程示意图
用户首先必需登录以会见系统;然后他们能欣赏客户列表和每个客户的具体信息。假如他们但愿为某一特定的客户下订单,那么系统会提供他们一个产物列表,他们可以从中为该客户选择一个特定的产物。
在本文余下的大大都内容中,我们会接头实现该应用的 Servlet 和 JSP 代码,并会考查 JSP 和 Servlet 一起事情的方法。关于每个 JavaServer Page 的接头还配有图解,显示了 JSP 在设备屏幕上的输出。
清单 1,Login.jsp接管用户名和暗码,并把它们作为参数来挪用LoginServlet。对这个和其它所有的 JSP 来说,MIME 范例都应被配置成text/vnd.wap.wml范例。在通报请求的同时,上面的Login.jsp还通报了一个叫SessionID的参数。它必需与每个传送随处事器的请求一起通报。参数名SessionID是一个占位符;请参考应用处事器的说明文档,找到合用于您特定的应用处事器的正确的参数名。Java 要领HttpServletResponse.encodeURL(String URL)自动添加 Session ID;在我们的应用里,这已经被遍及地利用在 Servelet 中。
验证空缺的输入域时会呈现问题。在input标志里有一个属性,它让您使输入域不为空:
<input name="name" type="text" emptyok="false"/>
一个手机用户必需会见各个独立的对话框屏幕去输入数据。问题呈现了,因为用户甘愿选择直接会见下一盒或下一张卡片而不肯通过对话框屏幕去输入数据。一个用户面临如图 4 所示的屏幕时也许会漏掉暗码并揿下 NEXT。
一个开拓人员可以通过利用 WMLScript 的验证来制止这个问题的产生(通过利用onclick事件)。然而,直到输入一个值到输入框今后,您通报到 WMLScript 函数的代表输入域值的谁人变量才开始被初始化。因此,若无暗码键入,通报到该函数的是未初始化的变量和剧本错误功效。这个问题的办理要领是在处事器端验证所有的输入域。
清单 2,LoginServlet是我们问题的办理方案:它可以认证销售人员,并把他记录在系统中。它也可以在处事器端为销售人员建设一个 Session。代码块上的注释指明白在那边这些操纵会被执行。一旦乐成登录,设备显示如清单 3 所示的主菜单(MainMenu.jsp)。
#p#分页标题#e#
如图 5 所示,该文件将两个链接显示在设备屏幕上。个中第二个终止了当前的 Session;第一个指向当前的客户列表。在当前版本的措施流程中,销售人员必需在开始任何销售生意业务之前先从列表中选择一个客户;有关销售产物的列表只能在后继的屏幕上显示(后头将会接头到细节)。也有其它大概的措施流:举例来说,用来直接将用户送到产物列表的链接可以被加到主菜单中。可是,您不该该在任一菜单中提供太多链接,不然支持 WAP 的设备的小屏幕会因此而变得杂乱不堪。
在图 5 的主菜单中揿下 View Clients 将挪用清单 4 中的ClientViewServlet,它抽取销售人员将要造访的客户列表。代码上的注释说明白 Servlet 奈何从客户端上找到该信息。接着 Servlet 将列表放到 Session 工具中并挪用ClientList.jsp。(这里和下一段中提到的 Session 工具是来自于 Java servlet 包中的HttpSession类。)
清单 5,ClientList.jsp抽取由ClientViewServlet安排在 Session 中的客户列表;它显示了客户的姓名,但不是完整的具体信息(请拜见图 6)。当选择一个用户时,销售人员则被定向到ClientDetails.jsp。
留意:显示客户列表的任务由三个独立的部门完成 —ClientViewServlet、ClientList.jsp和ClientDetails.jsp。这样设计的原因是什么呢?
1、大大都 J2EE 架构的权威人士发起 JSP 不该该直接会见 EJB;而应利用诸如 Servlet 的中间件来举办与 EJB 的交互。ClientViewServlet会见 EJB 并得到客户列表。
2、这个应用本可以如此设计,这样所有的用户信息城市包括在一个单一的 WML 文档中。在这个别系布局中,客户列表包括在 WML 盒中的一张卡片上,而单个客户的具体信息会包括在同一盒中的差异卡片上。不外该单一文档大概包括太大都据,以至于对一个低带宽的 WAP 设备来说不能立即下载。假如客户数目过于复杂,所生成的数据总量很容易高出 WML 卡片盒所答允的最大容量。(最大容量随设备差异而有所区别;如 Nokia 7110 的最大编译卡片盒容量为 1.3 KB)。因此我们利用两个 JSP:ClientList.jsp— 显示客户列表,尚有ClientDetails.jsp— 显示单个客户的具体信息。
清单 6,ClientDetails.jsp接管客户数组的索引号作为参数,个中索引号在 Session 中呈现。接下来它抽取所选客户的具体信息并显示。假如销售人员但愿为该客户下订单,他只要揿下 Items 按钮。这会挪用清单 7,ItemListServlet,而且显示该订单的可选产物。
清单 7,ItemListServlet抽取销售人员可以销售的产物列表,并将列表置于 Session 中。然后它挪用清单 8,ItemList.jsp。
清单 8,ItemList.jsp从 session 中抽取产物列表并显示产物名称。销售人员可选择一个产物去订货并揿下 Order 按钮去挪用PlaceOrder.jsp。数组中所选产物的索引被作为参数送到清单 9,PlaceOrder.jsp。
PlaceOrderServlet从 Session 中得到销售人员、客户及产物的 ID。接着通过建设新的 Order Entity EJB 可以发生一个新的订单。乐成的下单显示了订单的 ID 和下订单的时间。
在这一版本的应用中,销售人员在完成生意业务后的独一选择即是返回主菜单(请拜见图 9)。您也可修改代码以便利用户返回到客户或产物列表。
假如留意调查,您会觉察销售人员只输入两次数据:登录时和为客户输入购置产物数量时。
关于代码
附带文件包括本文所有的 JSP 和 Servlet 代码,也包括必须的 EJB 代码。EJB 的 jar 文件和陈设描写符也一起包括在内。所有屏幕截图均来自 Nokia WAP 模仿器 2.0 版。
结论
就像前面提到的那样,WAP 应用提供了很是好的增值处事。一个孤独的 WAP 应用是不行取的。然而,这样一个应用无需耗费许多财力人力就可以利便地集成到一个现有的 Web 应用体系布局中去。您所需要的独一新硬件是一台呆板,以及用于 WAP 网关的软件;假如您利用的是本身 ISP 的网关,那么这项开销也可省去了。
现有的 HTML 页面需要被转换成 WML。然而,WML 不像 HTML 那么巨大,因为它不支持 HTML 的很多成果。因此,这并不是一件费时的事情。
#p#分页标题#e#
WAP 也支持无线 BitMap(WBMP)名目标图片。然而,利用 WAP 设备的用户在毗连时间上耗费了不少钱,他们更感乐趣的是直接有效的信息而非奢华的界面。除非图片自己能通报信息,不然提供快速的信息比占用带宽和时间来传输图片会更好。
最后留意事项:尽量模仿器可以提供测试 WAP 应用的精采情况,但只有当它共同已陈设好的 WAP 网关,运行在所有大概的方针 WAP 设备上时,WAP 应用才算作真正意义上的被完全测试过了。所有动态生成的页面在网关上被编译。因此,有须要知道您的网关支持哪些版本的 WAP。假如网关编译器只利用 WML 1.1,那么用 WML 1.2 编写的页面是毫无用处的。