到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comwww.javaresearch.org无关,不对该信息负责.通过http://www.javaresearch.org/article//showarticle.jsp?column=3&thread=377访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
J2ME开发教程 Part II(翻译)
作者:ding 来源:www.javaresearch.org  发布时间:2006-02-27 16:13:32.437


<LINK href="css/sunstyle.css" rel=stylesheet>
<TITLE>Java研究组织-Java微型版</TITLE>
<blockquote>
<!-- headline --><span class="title">J2ME开发教程Part II</span><br>
<!-- subtitle --><span class="subtitle">建立端对端(End to End)Java应用程序</span><br>
<br>
<!-- byline --><span class="byline"><b>by Jonathan Knudsen</b><br>
March 7, 2002<br>
Download: <a href="http://wireless.java.sun.com/midp/articles/tutorial2/src/HitServlet.java">HitServlet.java</a> <a href="http://wireless.java.sun.com/midp/articles/tutorial2/src/HitMIDlet.java">HitMIDlet.java</a> </span><br><span class="byline"><b>翻译 Ding(wu_yi_ding@163.com)</b><br>日期 April 20,2002</span><br>
<p><b>译者说明:本文译自(wireless.java.sun.com网站),其著作权归原著者本人和原文档所在网站所有。译者的翻译未经原著者本人同意。翻译内容仅供自学和参考用,请读者不要擅自转载、传播本翻译内容。译者Ding对违反上述原则的人不负任何责任。特此说明。</b></p>
<p>在本教程的Part I中,我介绍了如何写一个简单的Java[tm] 2,Micro Edition (J2ME[tm]) 应用程序.。这种被称为MIDlet的应用程序被设计运行在MIDP(MobileInformation Device Profile,J2ME specification中的一种)的参考实现之上。现在我们将要教你一些更高级内容,通过本教程,你将学会如何开发一个servlet,并使用MIDlet与该servlet进行通讯。通过本教程你将掌握建立端对端无线Java应用程序的基本知识。</p>
<p>本文有两个版本,分别对应Tomcat和J2EE RI server这两种servlet开发环境<a href="#_edn1" name="_ednref1" title>[1]</a>。</p>
<ul>
<li><a href="http://jakarta.apache.org/tomcat/" target="_blank">Tomcat</a> 是<a href="http://java.sun.com/products/servlet/" target="_blank">Javaservlet</a>和<a href="http://java.sun.com/products/jsp/" target="_blank">Java Server Pages (JSP)</a>的一种常见的参考实现,而且它是可以免费下载的。虽然与某些高质量的商业软件相比还显简陋,但对于开发与测试servlet来说,却不失为一种良好的选择。
<li>The <a href="http://java.sun.com/j2ee/" target="_blank">Java[tm] 2,Enterprise Edition (J2EE[tm]) Reference Implementation</a> (J2EE RI) server是对J2EE规范的一个完整的参考实现。与Tomcat相类似,开发J2EE RI server的目的并不是开发出某种商品软件,而是着眼于为开发者提供一个良好的平台,给出供我们学习、测试的原型以增加开发者的经验。与Tomcat一样,J2EE RI server 也是可以免费下载的。</li>
</ul>
<p>这两种web server各有其特点和针对性,Tomcat 对于servlet开发来说更简单方便,但它的能力也只限于servlet和JSP开发。而J2EERI server 则是J2EE 技术的一个完整的实现-其中包括:servlet,JSP,EJB,JMS,JNDI等等……。</p>
<p>本文讲述的是使用Tomcat来进行servlet开发。对于 对于J2EE RI版本的实现,请参考<a href="http://wireless.java.sun.com/midp/articles/tutorial2/j2eeri.html">这里</a>。</p>
<!-- subhead --><span class="subtitle">安装并运行Tomcat</span><br>
<p>Tomcat以ZIP文档的形式发布,你可以从<a href="http://jakarta.apache.org/tomcat/" target="_blank">Apache Jakarta project</a>网站下载该文档。目前最新版本为<a href="http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.2/" target="_blank">4.0.2</a>。</p>
<p>Tomcat的安装非常简单,你只需解压缩该zip文档到一个任意你指定的目录即可。我把该文件解压到我的根目录下,即<i>c:\jakarta-tomcat-4.0.2\</i>。</p>
<p>由于Tomcat 本身是由Java语言编写的。 想要运行Tomcat你必须告知它你的J2SE的安装地址。要达到这一目的,你需要添加一个系统环境变量<code>JAVA_HOME</code>,并设置它的值为你的J2SE安装位置。根据你的Windows版本的不同,请参考下述的设置方法。对于Windows 2000,请用鼠标右击“我的电脑”图标, 从弹出菜单中选择<b>属性</b>,然后选择<b>高级</b>,接着点击<b>环境变量</b>按键。选择<b>系统变量</b>下的<b>新建</b>,在弹出的输入框中填入变量名:<code>JAVA_HOME</code>和合适的变量值(该值反映你的J2SE安装位置),对于我来说,则填入变量值:<code>c:\jdk1.3.1</code>。</p>
<p>为了运行Tomcat,打开一个命令窗口。把改变当前目录到Tomcat'的<i>bin</i>目录下。然后键入<code>startup</code>回车。一个新的命令窗口将会弹出并显示一些初始化信息。下图展示了当Tomcat启动完毕的状态。</p>
<table cellspacing="0" cellpadding="10" width="399" align="center" border="0">
<tbody>
<tr>
<td align="middle"><img alt="Tomcat's initialization messages" src="file:///I:/Documents%20and%20Settings/Administrator/My%20Documents/J2ME%20Project/finished/images/midp-articles-tutorial2-catalina.gif" border="0" width="399" height="239"><br>
<span class="rtbtitle">Tomcat's initialization messages</span></td>
</tr>
</tbody>
</table>
<p>下面测试Tomcat是否运行正常。你可以用你的浏览器尝试打开<i>http://localhost:8080/</i>,如果Tomcat 运行正常,你会发现浏览器将显示Tomcat的默认web页面,同时页面上还有指向一些servlet和JSP 示例的链接。</p>
<p>关闭Tomcat只需从新打开一个命令窗口,改变当前目录到Tomcat的<i>bin</i>目录下,运行<code>shutdown</code>命令即可。</p>
<p>开始与停止Tomcat的步骤略显繁琐,建议创建两个快捷方式来运行<code>startup</code>和<code>shutdown</code>命令。<a href="#_edn2" name="_ednref2" title>[2]</a></p>
<!-- subhead --><span class="subtitle">撰写Servlet程序</span><br>
<p>编写servlet 程序与写其他Java程序非常类似:首先使用你喜欢的文本编辑器生成<i>.java</i>源文件,在本例中,我们将介绍一个非常简单的servlet 并命名为<code>HitServlet</code>。该程序只是简单地计算Sevlet被调用的次数并把该次数输出到客户端上(本示例并未考虑线程安全性,因为在此处并不需要强调这一点)。
<a href="http://wireless.java.sun.com/midp/articles/tutorial2/src/HitServlet.java">源码</a>如下所示:</p>
<blockquote>
<pre><font color="#000000"><strong>import</strong></font> javax.servlet.http.*;
<font color="#000000"><strong>import</strong></font> javax.servlet.*;
<font color="#000000"><strong>import</strong></font> java.io.*;

<font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>class</strong></font> HitServlet <font color="#000000"><strong>extends</strong></font> HttpServlet <font color="#000000"><strong>{</strong></font>
  <font color="#000000"><strong>private</strong></font> <font color="#000000"><strong>int</strong></font> mCount;

  <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">doGet</font>(HttpServletRequest request,
      HttpServletResponse response)
      <font color="#000000"><strong>throws</strong></font> ServletException, IOException <font color="#000000"><strong>{</strong></font>
    String message <font color="#000000"><strong>=</strong></font> <font color="#404040">"Hits: "</font> <font color="#000000"><strong>+</strong></font> <font color="#000000"><strong>++</strong></font>mCount;

    response.<font color="#000099">setContentType</font>(<font color="#404040">"text/plain"</font>);
    response.<font color="#000099">setContentLength</font>(message.<font color="#000099">length</font>());
    PrintWriter out <font color="#000000"><strong>=</strong></font> response.<font color="#000099">getWriter</font>();
    out.<font color="#000099">println</font>(message);
  <font color="#000000"><strong>}</strong></font>
<font color="#000000"><strong>}</strong></font>
</pre>
</blockquote>
<p>把源码放到哪里呢?以后我们将讲述如何部署一个webapplication 的一般步骤以及其目录结构规范。而现在我们只是简单地按如下目录结构把源文件放到Tomcat的根目录下即可:<i>webapps/midp/WEB-INF/classes/HitServlet.java</i>。 (这里你需要自己创建<i>midp</i>子目录以及其他相应的子目录。)</p>
<!-- subhead --><span class="subtitle">编译Servlet</span><br>
<p>编译Servlet也与常规的Java 程序编译大体相同,即使用Java编译器<code>javac</code>来编译源文件。但这里请注意由于servlet API 并未包括在J2SE平台的核心部分中。 所以当你编译servlet之前,你需要在你的<code>CLASSPATH</code>变量中添加servletAPI 包的位置。<a href="#_edn3" name="_ednref3" title>[3]</a></p>
<p>servlet API 位于Tomcat根目录下<i>common/lib/servlet.jar</i>文件中。你只需要简单的修改你的<code>CLASSPATH</code>然后你就可以使用<code>javac</code>来编译<i>HitServlet.java</i>。请编辑你的系统属性中的<code>CLASSPATH</code>变量或是在命令行下执行下面命令:</p>
<blockquote>
<pre>C:\>set CLASSPATH=\jakarta-tomcat-4.0.2\common\lib\servlet.jar

C:\>javac HitServlet.java <a href="#_edn4" name="_ednref4" title>[4]</a>
</pre>
</blockquote>
<!-- subhead --><span class="subtitle">部署Servlet</span><br>
<p>为了部署你的servlet,你首先要对web applications有所了解。web application 是一组静态的内容包括:HTML 、图片文件、servlet和许多其他的资源, 这些资源可通过web interface来进行访问。Tomcat本身包括几个已经预先安装好的web applications , 例如在Tomcat安装目录下的<i>webapps</i>目录下,你可以找到这两个子目录:<i>examples</i>和<i>manager</i>。下面我们将介绍如何来生成一个新的web applicatoin 并将我们的servlet置于其中。</p>
<p>首先,让我们先生成一个web application。 你前面已经在<i>webapps</i>生成了新目录<i>midp</i>,还在其中保存了servlet源码。 现在你需要编辑Tomcat的配置文件来指定新的webapplication。 首先用某个文本编辑器打开<i>conf/server.xml</i>文件, 在该文件中,每个web applications 被描述为context。请在该文件中找到名为<b>examples</b> 的web applicationde的<b>Context</b>子项,如下所示:</p>
<blockquote>
<pre><font color="#009900"><em><!-- Tomcat Manager Context --></em></font>
<font color="#5e5e5e"><strong><Context path</strong></font>=<font color="#404040">"/manager"</font><font color="#5e5e5e"><strong> docBase</strong></font>=<font color="#404040">"manager"</font><font color="#5e5e5e"><strong> </strong></font>
<font color="#5e5e5e"><strong>    debug</strong></font>=<font color="#404040">"0"</font><font color="#5e5e5e"><strong> privileged</strong></font>=<font color="#404040">"true"</font><font color="#5e5e5e"><strong>/></strong></font>
</pre>
</blockquote>
<p>拷贝上述内容,然后把拷贝的context的名字改为<i>midp</i>,并把context中的几个属性分别做相应修改, 然后添加一个<b>reloadable</b>属性,并置值为true,改动好的context如下所示:</p>
<blockquote>
<pre><font color="#009900"><em><!-- MIDP context --></em></font>
<font color="#5e5e5e"><strong><Context path</strong></font>=<font color="#404040">"/midp"</font><font color="#5e5e5e"><strong> docBase</strong></font>=<font color="#404040">"midp"</font><font color="#5e5e5e"><strong> </strong></font>
<font color="#5e5e5e"><strong>    debug</strong></font>=<font color="#404040">"0"</font><font color="#5e5e5e"><strong> reloadable</strong></font>=<font color="#404040">"true"</font><font color="#5e5e5e"><strong> privileged</strong></font>=<font color="#404040">"true"</font><font color="#5e5e5e"><strong>/></strong></font>
</pre>
</blockquote>
<p>把上述的<b>midp</b> context置于<b>examples</b> context之后,然后保存文件。</p>
<p>上述所作设置的实质是把收到的HTTP request映射到某个相应路径中的web application中去。 更确切地说,任何以"/midp" (对应MIDP Context中的<b>path</b> 属性)开头的HTTP request将传递给 位于"webapps/midp" (对应<b>docBase</b>属性)的web application 。 将<b>reloadable</b>属性设置为true时,当我们对servlet class文件做了改动后, Tomcat会自动重载该servlet,这样就不再需要重新启动Tomcat server了, 这为我们进行开发提供了便利。</p>
<p>好现在让我们进一步完成我们的web application。 Web application
具有标准的目录结构,这个结构是由servlets规范所定义的,这里我们不过多地讨论细节。web application的核心是一个名为<i>web.xml</i> 的文件,该文件描述web application的各个部分。它的位置是固定的,位于<i>WEB-INF/web.xml</i>。</p>
<p>下面为我们的web application建立自己的<i>web.xml</i> 文件。
我们的目的是让我们的servlet可以被外界访问,该servlet的类名<code>HitServlet</code>,为并且我们想让该servlet在目录<i>/hits</i> 下被访问。请注意servlet的路径是包含在web application路径下的, 所以该servlet的访问路径的全称应该为:<i>http://localhost:8080/midp/hits</i>。拷贝下列文本,并保存为<i>webapps/midp/WEB-INF/web.xml</i> 。 (当然你也可以从此处<a href="http://wireless.java.sun.com/midp/articles/tutorial2/src/web.xml">下载</a>)</p>
<blockquote>
<pre><font color="#000000"><strong><?xml version="1.0" encoding="ISO-8859-1"?></strong></font>

<font color="#000000"><strong><!DOCTYPE web-app</strong></font>
<font color="#000000"><strong>    PUBLIC </strong></font><font color="#404040">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</font>
<font color="#000000"><strong>    </strong></font><font color="#404040">"http://java.sun.com/dtd/web-app_2_3.dtd"</font><font color="#000000"><strong>></strong></font>

<font color="#5e5e5e"><strong><web-app></strong></font>
  <font color="#5e5e5e"><strong><servlet></strong></font>
    <font color="#5e5e5e"><strong><servlet-name></strong></font>bob<font color="#5e5e5e"><strong></servlet-name></strong></font>
    <font color="#5e5e5e"><strong><servlet-class></strong></font>HitServlet<font color="#5e5e5e"><strong></servlet-class></strong></font>
  <font color="#5e5e5e"><strong></servlet></strong></font>

  <font color="#5e5e5e"><strong><servlet-mapping></strong></font>
    <font color="#5e5e5e"><strong><servlet-name></strong></font>bob<font color="#5e5e5e"><strong></servlet-name></strong></font>
    <font color="#5e5e5e"><strong><url-pattern></strong></font>/hits<font color="#5e5e5e"><strong></url-pattern></strong></font>
  <font color="#5e5e5e"><strong></servlet-mapping></strong></font>
<font color="#5e5e5e"><strong></web-app></strong></font>
</pre>
</blockquote>
<p>该文件告诉Tomcat 我们的servlet 名为 <code>HitServlet</code>,并把其路径映射为<i>/hits</i>。 至于 <b>servlet-name</b>属性,是web.xml 内部使用的,它充当了<b>servlet</b> 元素与<b>servlet-mapping</b>元素之间的联系。 这里我使用了bob只是为了说明用法而已,你可选择其他自己喜欢的名称。</p>
<p><i>WEB-INF</i> 目录下有一个标准子目录<i>classes</i>。该目录是Tomcat预设的寻找servlet的地方。前面我们曾经把我们的servlet源码放在了此处。这样当我们编译好源文件的同时就把servlet放置到了正确的位置。<a href="#_edn5" name="_ednref5" title>[5]</a></p>
<p>现在你的servlet 已经被部署在这个新的web application中了。请注意,要使你对<i>server.xml</i>的改动生效,请重新启动Tomcat 。</p>
<p>下面测试一下一切是否正常,打开你的浏览器,指向<i>http://localhost:8080/midp/hits</i>。 这时你应该看到<code>HitServlet</code>的输出。刷新几次页面,观察Hit值的改变。</p>
<p>更多关于servlet 的相关内容,请参考sun的J2EE教程中的<a href="http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets.html" target="_blank">JavaServlet Technology</a>部分。</p>
<!-- subhead --><span class="subtitle">使MIDlet 与 Servlet建立联系</span><br>
<p>这部分很有趣,我们将建立一个同时支持MIDP和servlet的开发环境并把这两个世界联系在一起来创建一个端对端的Java程序。我们在前文己经建立了一个servlet可通过HTTP访问。MIDlet一样可以通过HTTP访问servlet,所以通过MIDlet连接servlet是相当简便的。</p>
<p>启动J2MEWTK的<b>KToolbar</b> ,然后打开你在教程的PartI部分建立的MIDletproject 。 我们的目的是新创建一个MIDlet用以连接我们的servlet,接收其输出并显示出来。 如果你还不会创建J2ME Wireless Toolkitproject,请参考Part I 。 我们要创建的<code>HitServlet</code>的源码如下:</p>
<blockquote>
<pre><font color="#000000"><strong>import</strong></font> java.io.*;

<font color="#000000"><strong>import</strong></font> javax.microedition.io.*;
<font color="#000000"><strong>import</strong></font> javax.microedition.lcdui.*;
<font color="#000000"><strong>import</strong></font> javax.microedition.midlet.*;

<font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>class</strong></font> HitMIDlet
    <font color="#000000"><strong>extends</strong></font> MIDlet
    <font color="#000000"><strong>implements</strong></font> CommandListener <font color="#000000"><strong>{</strong></font>
  <font color="#000000"><strong>private</strong></font> Display mDisplay;
  <font color="#000000"><strong>private</strong></font> Form mMainForm;
  <font color="#000000"><strong>private</strong></font> StringItem mMessageItem;
  <font color="#000000"><strong>private</strong></font> Command mExitCommand, mConnectCommand;

  <font color="#000000"><strong>public</strong></font> <font color="#000099">HitMIDlet</font>() <font color="#000000"><strong>{</strong></font>
    mMainForm <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">Form</font>(<font color="#404040">"HitMIDlet"</font>);
    mMessageItem <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">StringItem</font>(<font color="#404040">null</font>, <font color="#404040">""</font>);
    mExitCommand <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">Command</font>(<font color="#404040">"Exit"</font>, Command.EXIT, <font color="#009191">0</font>);
    mConnectCommand <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">Command</font>(<font color="#404040">"Connect"</font>,
        Command.SCREEN, <font color="#009191">0</font>);
    mMainForm.<font color="#000099">append</font>(mMessageItem);
    mMainForm.<font color="#000099">addCommand</font>(mExitCommand);
    mMainForm.<font color="#000099">addCommand</font>(mConnectCommand);
    mMainForm.<font color="#000099">setCommandListener</font>(<font color="#404040">this</font>);
  <font color="#000000"><strong>}</strong></font>

  <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">startApp</font>() <font color="#000000"><strong>{</strong></font>
    mDisplay <font color="#000000"><strong>=</strong></font> Display.<font color="#000099">getDisplay</font>(<font color="#404040">this</font>);
    mDisplay.<font color="#000099">setCurrent</font>(mMainForm);
  <font color="#000000"><strong>}</strong></font>

  <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">pauseApp</font>() <font color="#000000"><strong>{}</strong></font>

  <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">destroyApp</font>(<font color="#000000"><strong>boolean</strong></font> unconditional) <font color="#000000"><strong>{}</strong></font>

  <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">commandAction</font>(Command c, Displayable s) <font color="#000000"><strong>{</strong></font>
    <font color="#000000"><strong>if</strong></font> (c <font color="#000000"><strong>==</strong></font> mExitCommand)
      <font color="#000099">notifyDestroyed</font>();
    <font color="#000000"><strong>else</strong></font> <font color="#000000"><strong>if</strong></font> (c <font color="#000000"><strong>==</strong></font> mConnectCommand) <font color="#000000"><strong>{</strong></font>
      Form waitForm <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">Form</font>(<font color="#404040">"Waiting..."</font>);
      mDisplay.<font color="#000099">setCurrent</font>(waitForm);
      Thread t <font color="#000000"><strong>=</strong></font>  <font color="#000000"><strong>new</strong></font> <font color="#000099">Thread</font>() <font color="#000000"><strong>{</strong></font>
        <font color="#000000"><strong>public</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">run</font>() <font color="#000000"><strong>{</strong></font>
          <font color="#000099">connect</font>();
        <font color="#000000"><strong>}</strong></font>
      <font color="#000000"><strong>}</strong></font>;
      t.<font color="#000099">start</font>();
    <font color="#000000"><strong>}</strong></font>
  <font color="#000000"><strong>}</strong></font>

  <font color="#000000"><strong>private</strong></font> <font color="#000000"><strong>void</strong></font> <font color="#000099">connect</font>() <font color="#000000"><strong>{</strong></font>
    HttpConnection hc <font color="#000000"><strong>=</strong></font> <font color="#404040">null</font>;
    InputStream in <font color="#000000"><strong>=</strong></font> <font color="#404040">null</font>;
    String url <font color="#000000"><strong>=</strong></font> <font color="#000099">getAppProperty</font>(<font color="#404040">"HelloMIDlet.URL"</font>);

    <font color="#000000"><strong>try</strong></font> <font color="#000000"><strong>{</strong></font>
      hc <font color="#000000"><strong>=</strong></font> (HttpConnection)Connector.<font color="#000099">open</font>(url);
      in <font color="#000000"><strong>=</strong></font> hc.<font color="#000099">openInputStream</font>();

      <font color="#000000"><strong>int</strong></font> contentLength <font color="#000000"><strong>=</strong></font> (<font color="#000000"><strong>int</strong></font>)hc.<font color="#000099">getLength</font>();
      <font color="#000000"><strong>byte</strong></font>[] raw <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000000"><strong>byte</strong></font>[contentLength];
      <font color="#000000"><strong>int</strong></font> length <font color="#000000"><strong>=</strong></font> in.<font color="#000099">read</font>(raw);

      in.<font color="#000099">close</font>();
      hc.<font color="#000099">close</font>();

      <font color="#009900"><em>// Show the response to the user.</em></font>
      String s <font color="#000000"><strong>=</strong></font> <font color="#000000"><strong>new</strong></font> <font color="#000099">String</font>(raw, <font color="#009191">0</font>, length);
      mMessageItem.<font color="#000099">setText</font>(s);
    <font color="#000000"><strong>}</strong></font>
    <font color="#000000"><strong>catch</strong></font> (IOException ioe) <font color="#000000"><strong>{</strong></font>
      mMessageItem.<font color="#000099">setText</font>(ioe.<font color="#000099">toString</font>());
    <font color="#000000"><strong>}</strong></font>
    mDisplay.<font color="#000099">setCurrent</font>(mMainForm);
  <font color="#000000"><strong>}</strong></font>
<font color="#000000"><strong>}</strong></font>
</pre>
</blockquote>
<p><code>HitMIDlet</code>的main screen 与HelloMIDlet类似,不同的是荧幕中多了个<b>Connect</b>命令。 <b>Connect</b>命令执行时会建立另外一个线程(thread)来调用<code>connect()</code>方法, 该方法负责建立网络连接并取回结果。</p>
<p>拷贝上述代码,并以<i>HitMIDlet.java</i> 为文件名存放在<i>apps/HelloSuite/src</i>目录下,上述目录位于J2MEWTK的根目录下。</p>
<p>下面我们对<code>HitMIDlet</code>进行一些配置使之可以工作。首先,我们要告诉J2MEWTK这个新的MIDlet。点击<b>Settings...</b>,然后选择<b>MIDlets</b> 表单。点击<b>Add</b>,在MIDlet name和MIDlet calss中填入HitMIDlet, <b>Icon</b>保留为空。点击<b>OK</b> ,你会发现<code>HitMIDlet</code> 被列在<code>HelloMIDlet</code>之后。然后,我们需要定义一个system property 来放置<code>HitMIDlet</code>需要用来进行网络连接的URL。(即通过<code>String url = getAppProperty("HelloMIDlet.URL")</code>语句)。点击 <b>Settings....</b> ,选择User Defined 表单,按<b>Add</b> 键,property name项填<b>HelloMIDlet.URL</b> , 该属性的值填入调用HitServlet的URL,即你通过浏览器可以访问该servlet的URL。填好后,点击<b>OK</b> 完成设定。</p>
<p>现在点击<b>Build</b> 来编译MIDlet,如果没有什么差错的话,你现在可以试着运行该程序了。首先确保你的web server已经启动,然后运行该MIDlet,执行<b>Connect</b>命令。 如果一切正常<code>HitMIDlet</code> 会调用<code>HitServlet</code>并在模拟器上显示结果,与下图所示类似。</p>
<table cellspacing="0" cellpadding="10" width="200" align="center" border="0">
<tbody>
<tr>
<td align="middle"><img alt="Success!" src="file:///I:/Documents%20and%20Settings/Administrator/My%20Documents/J2ME%20Project/finished/images/midp-articles-tutorial2-success.gif" border="0" width="96" height="128"><br>
<span class="rtbtitle">Success!</span></td>
</tr>
</tbody>
</table>
  <!-- subhead --><span class="subtitle">部署Servlet的几点注意</span><br>
<p>现在整个程序建立完成,你可以方便的修改<code>HitServlet</code>的源码, 重新编译,并进行测试,当你再次调用该servlet时,Tomcat会自动使用修改过的版本。(我们前面对Tomcat的<i>server.xml</i> 文件中的<b>reloadable</b>属性的设定确保了这一点。)</p>
<p>如果你想添加其他的servlet,你可能需要改动该web application的<i>web.xml</i>文件。 在这种情况下,你需要重新启动web server以使改动生效。
<!-- subhead --><span class="subtitle">总结</span><br>
<p>本教程详细介绍了如何建立端对端Java程序。Part I主要介绍如何建立并使用MIDP开发环境。而本部分着重于如果配置并使用servlet开发环境。并介绍了如何连接MIDlet与servlet,给出了一个简单的端对端Java解决方案。</p>
<p>servlet 可以作为我们使用J2SE与J2EE更强大的功能的入口点,使我们建立功能强大的端对端Java程序。相对简单短小的MIDlet客户端通过servlet可以获得更多的功能。</p>
<p>关于端对端Java应用设计的更多信息,请参考sun的<a href="http://java.sun.com/blueprints/wireless/" target="_blank">Wireless Blueprints</a> 白页。</p>
<!-- subhead --><span class="subtitle">注释</span><br>
<!-- refence -->
<p>译注<a href="#_ednref1" name="_edn1" title>[1]</a> 由于Tomcat较为常见,且本文只涉及到servlet,所以只翻译了本文的Tomcat版本,对与J2EERI server读者可参考<a href="http://wireless.java.sun.com/midp/articles/tutorial2/j2eeri.html">原文文档</a>。
<p>译注<a href="#_ednref2" name="_edn2" title>[2]</a> 新版的Tomcat具有windows安装版,这些快捷方式在安装时就会创建。目前最新版本为4.0.3</p>
<p>译注<a href="#_ednref3" name="_edn3" title>[3]</a> 也可以把servlet.jar拷贝到jdk1.3\jre\lib\ext\目录下,这样就可以直接使用javac编译了。</p>
<p>译注<a href="#_ednref4" name="_edn4" title>[4]</a>此处有些问题,因为作者前文已经把HitServlet.java放置在webapps/midp/WEB-INF/classes目录下。这里只要记着把编译好的class文件放入上述目录即可。</p>
<p>译注<a href="#_ednref5" name="_edn5" title>[5]</a>这种方法用来练习还可,但真正进行servlet开发则不应鼓励,该方法把源码也放置在/classes目录下了。</p>
<!-- double rule -->
<hr color="#cccccc" noshade size="1">
  <!-- about --><span class="byline"><b>About the Author:</b> Jonathan Knudsen <a href="mailto:jonathan.knudsen@sun.com">[e-mail]</a><a href="http://jonathanknudsen.com/" target="_blank">[home page]</a> is theauthor of several books, including <a href="http://www.apress.com/catalog/book/189311550X/" target="_blank"><i>MobileJava</i></a>, <a href="http://www.oreilly.com/catalog/lmstorms/" target="_blank"><i>The Unofficial Guide to LEGO MINDSTORMS Robots</i></a>, <a href="http://www.oreilly.com/catalog/learnjava/" target="_blank"><i>Learning Java</i></a>, and <a href="http://www.oreilly.com/catalog/java2d/" target="_blank"><i>Java 2D Graphics</i></a>. Jonathan has written extensively about Java and Lego robots, including a monthly online column called <a href="http://java.oreilly.com/bite-size/">Bite-Size Java</a>, and articles for JavaWorld, EXE, NZZ Folio, and the O'Reilly Network. Jonathan holds a degree in mechanical engineering from Princeton University.<br>
<br>
<b>关于译者:</b>Ding (wu_yi_ding@163.com),WWW.chinajavaworld.com论坛J2ME版版主,Java研究组织(www.javareseach.org)J2ME项目负责人。</span><br>
</blockquote>


 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读