作者:佚名 文章来源:yesky
摘要
在这个MIDP系列的最后一部分,我将介绍MIDlet和外部系统之间的通信方法。使用Java2 Micro Edition的MIDP中包含的API,开发者可以与外部的系统交互。这篇文章将以一个详细的例子介绍这些API,它演示了J2ME设备和一个基于servlet的Web系统可以进行的交互。
在前面的两个部分,我介绍的MIDP API的特性和功能都是和设备自身的运作和信息存储相关的。在这个最后的部分,我将集中介绍网络设备和大型网络的交互。
网络设备可以使用数不清的协议来进行互相通信。在这篇文章中,我将集中介绍HttpConnection接口,你可以通过它来访问存储在一个Web服务器上的信息。在介绍本文的例子之前,我将讨论javax.microedition.io接口和类的交互,而例子则集中介绍一个MIDP设备和一个基于JSP系统之间的交互。
Connection层次
javax.microedition.io包中的所有接口都是基于Connection接口的。其它的连接接口继承Connection中的方法,并且定义了用来访问相关变量和该Connection类型动作的方法。我将在本文中谈论最常用的接口,其它的接口留给读者研究。
HTTPConnection说明
HTTPConnection接口建立在Connection接口上,它还提供了一些其它的方法来进行HTTP交互。以下就是其中一些有用的方法列表:
String getHeaderField(int index)
String getHeaderField(String name)
long getHeaderFieldDate(String name, long def)
int getHeaderFieldInt(String name, int def)
String getHeaderFieldKey(int n)
String getHost()
long getLastModified()
int getPort()
String getProtocol()
String getQuery()
String getRef()
String getRequestMethod()
String getRequestProperty(String key)
int getResponseCode()
String getResponseMessage()
String getURL()
void setRequestMethod(String method)
void setRequestProperty(String key, String value)
这些方法可让你如基于servlet的系统一样访问HTTP字段。
其它的接口在API规范文档中有明确的定义。这些接口带有一些方法,可以使用不同的协议与设备收发数据包或者流数据。在这里我将不会很详细地讨论这些,因为在形式上是一样的。
Connector对象
MIDP API如何知道要创建哪个接口并返回给调用的类呢?答案是返回的Connector是根据传送给连接字符串的值。
以下的连接字符串是提醒Connector对象系统正在查找一个HttpConnection:
HttpConnection httpConn = Connector.open("http://www.itpath.com");
MIDP Connector对象分析连接的字符串,知道这是一个用作访问网页的URL,于是就会返回一个HttpConnection接口的实现给调用的类。
其它的连接协议需要不同的连接字符串。下表就是它们的一个列表:
协议 连接字符串
Http http://www.yahoo.com
Stream-based Socket Socket://localhost:6160
Datagram-based Socket - listening datagram://:6160
Datagram-based Socket - sending datagram://121.232.121.232:6160
Serial Port comm.:0;baudrate=5000
File file://helloWorld.txt
例子
以下的例子将本文讨论的东西都结合在一起。在这个例子中,MIDlet访问存储在一个远程系统上的信息。该信息以一个XML的形式返回给MIDlet。通过分析该XML,MIDlet就会根据这些数据构造一个用户界面。
用户界面由一个问题构成。用户提交后将会请求服务器将数据加进去。然后返回更新的数据给用户。
通过这个详细的例子,你可以对J2ME Connection API的基本用法和语法有更进一步的了解。
VoterMidlet
VoterMidlet是本例子中唯一的MIDlet。在下载时,它创建VoteResults对象的一个实例:
public class VoterMidlet extends MIDlet implements ScreenCallback
{;
private Display _display;
// midlet has three screens
private VoteResults voteResults = new VoteResults(
(ScreenCallback) this);
public VoterMidlet()
{;
_display = Display.getDisplay(this);
_display.setCurrent(voteResults);
};
public void exit()
{;
try
{;
this.destroyApp(true);
}; catch (MIDletStateChangeException e)
{;};
};
...
};
ScreenCallback
如上所示,VoterMidlet实现了ScreenCallback接口。该接口将UI类和一些事件隐藏起来,否则UI类可能需要一个到MIDlet的引用。ScreenCallback接口包含有一个单一的方法public void exit(),UI屏幕使用这个方法来提醒MIDlet,用户已经按下“Exit”按钮。
通过为ScreenCallback写代码,其它的MIDlet方法就与UI屏幕的开发者无关。这是很重要的,因为如果使用不当,一些MIDlet方法会给程序带来破坏性的后果。
VoteResults
VoteResults是一个用户接口类,用来显示投票的结果给用户。为了让例子简化,该接口实现了两个Model-View-Controller类:View和Controller。
该构造器由MIDlet中接收唯一一个参数--ScreenCallback接口。如上所述,该接口可让Screen能够回调MIDlet的一些方法。
构造器初始化该对象并且创建例子的用户界面,以下是其中令人感兴趣的部分:
VoteSummary voteSummary = ResourceUtility.getVoteSummary();
initialize(voteSummary);
以上的代码是负责初始化MIDlet和JSP页面的通信,它模拟的是一个真实的系统。ResourceUtility通过HTTP参数访问一个URL,并且由该JSP中得到信息。它使用该信息来创建一个VoteSummary对象。在后面的例子中我们还将进一步讨论这个接口。
然后就会调用initialize()方法来创建UI显示,它包括有两个StringItems显示前面的投票结果,还有一个ChoiceGroup包含有所有可能的投票和相应的投票值:
public void initialize(VoteSummary voteSummary)
{;
append( getNumVotesString( voteSummary.getNumVotes() )) ;
append( getAvgVoteString( voteSummary.getAvgVote() ));
append( showVoteResults( voteSummary.getVotes() ));
};
当用户输入时,就会调用commandAction()方法。该方法接收设备的输入。如果输入的命令是“Vote”,当前的选项