XMLUtil XMLUtil对象的作用是将由JSP接收的XML转换为一个VoteSummary对象,以便应用使用。要完成转换,它必须使用一个XML分析器来解析数据。为了减少MIDlet的整体大小,所以要使用一个轻量级的分析器以令MIDlet的整体大小最小化。在这个例子中,我使用的是Enhydra的kXML分析器。 以下就是这个对象中的getVoteResults()方法,我们来看看转换过程是如何进行的: public static VoteSummary getVoteResults(InputStreamReader insr) throws IOException {; XmlParser parser = new XmlParser (insr); Document document = new Document(); document.parse( parser ); file://uncomment to see the document written to your console. file://document.write( new XmlWriter( new OutputStreamWriter( System.out) ) ); 前几行是设置XmlParser和Document对象的。在创建这些对象后,就会调用Document.parse()方法,并且传送XmlParser作为参数。结果的文档包含有一个由JSP传送来的XML信息。如果你对验证信息的格式感兴趣,你可以将ocument.write调用前面的注释去掉,以看请文档的结构: Element voteExampleElement = document.getElement("vote-example"); Element voteElement = voteExampleElement.getElement("votes"); String numVotes = getTextFromElement(voteElement, "number"); String avgVote = getTextFromElement(voteElement, "average"); 在创建Document后,我们现在可使用DOM方法来得到Element对象并且获取其中的值。头两行是用来在XML文档中移动,以到达含有数据的节点。在得到voteElement节点后,我们就可以使用getTextFromElement()方法,这个方法执行多个命令从文档中得到文本节点,并且返回它的值: Element choicesElement = voteElement.getElement("choices"); int childCount = choicesElement.getChildCount(); 上面的两行代码用来取得在选择区域下的节点数目。使用childCount,你可以构造节点,这样就无需使用当前的投票数目。这样做是很重要的,因为以后你可能需要加入更多的投票。使用这些调用,你可以无需修改代码就做到这一点: for (int i = 0; i < childCount; i++) {; if ( choicesElement.getType(i) == Xml.ELEMENT) {; choiceElement = choicesElement.getElement(i); choicevalue = getTextFromElement(choiceElement,"value"); choiceName = getTextFromElement(choiceElement,"name"); choiceVotes = getTextFromElement(choiceElement,"number"); vote = new Vote(choicevalue, choiceName, choiceVotes); vEntries.addElement(vote); }; }; return new VoteSummary( numVotes, avgVote, vEntries); 这样我们就可以得到子元素的数目,然后可以遍历它们并且取得其中的投票信息。其中一些子节点是Element,而其它的是没有数据的Text节点。在这个例子中,我们仅关心Elements,因此我们要在循环中设置相应的条件。该循环将由选项Element中得到每个子Elements,并且构造一个Vote对象,该对象包含有值(用作计算)、名字和投票的数目。这些vote对象都被依次加入到Vector中。最后,这个方法初始化一个新的VoteSummary对象,该对象包含有以上三个信息。 private static String getTextFromElement(Element elementRoot, String elementName) {; String returnText = elementRoot.getElement(elementName).getText(); return returnText; }; 我们使用getTextFromElement()方法来令代码的可读性更强。它的作用是深入树形结构一层,并且得到其中的Text节点信息。 voter.jsp 这个系统的最后一个元素是模拟后端系统的JSP。在这个例子中,我创建了一个简单的JSP,它使用类变量来跟踪投票计算。 具体的JSP见源代码。它只是跟踪投票并且返回以XML表示的数据。 最后的要点 这个例子讲解了MIDP和一个服务器端的组件如果通过HttpConnection来进行交互。通过发出一个请求,MIDP可以通过普通的HTTP GET/POST调用来与JSP组件通信。在这个例子中,调用返回XML信息。 使用kXML分析器,XML可以被有效地转换为一个对象,图形类就可以由该对象中获取数据。你也要注意到,在应用中的ChoiceGroup中并没有定义选项的数目,而是通过服务器端的组件动态设置。 与任何多层开发任务一样,要考虑如何有效地实现Model-View-Controller模型而避免创建多余的代码,这个想法在这个例子中也有体现,这个模型就是JSP。view就是显示全部数据信息的VoteResults对象。在这里的controller也是VoteResults对象,由于它实现了CommandListener接口。 通信 在这篇文章中,我们主要讨论了一个可产生HTTP请求的MIDP通信系统。这些请求可以是由使用标准协议的已知端口到任何使用私有协议的应用级协议。其中的API都可以很灵活地以一个很类似的方式处理这些请求。 在与远程机器交互的时候,如果你处于一个覆盖以外的区域(例如进入一个隧道时),这时会怎样呢?与WAP不同,在处于覆盖以外的区域时,具有MIDP功能的电话仍然可以继续运行它的应用。这个技术可以做到让用户使用离线的功能,并且在回到覆盖区域时,具有与在线应用同步的能力。例如一个基于MIDP的email应用:用户可以继续读取和回应已经下载到本地RMS datastore的email。在回到覆盖区域时,回复的信息可以发送到服务器,从而分发到不同的接收者。 当前发布的J2ME Wireless Toolkit版本并不支持HTTPS协议。不过,早些发布的开发者版本确实支持HTTPS。通过这些API的支持,你可以实现在Java电话上交易股票或者进行买卖。
查看本文来源