J2ME开发教程

J2ME开发教程 Part I ―― MIDlet 开发起步

By Jonathan Knudsen and Dana Nourie  January 2006

Download: HelloMIDlet.java

本文是Java Platform, Micro Edition (Java ME)技术的入门教程。我们将在文中讲述:如何安装J2ME开发工具;如何编写你的第一个J2ME程序,以及如何编译并在模拟器中运行。本文中将要建立的应用程序被称为MIDlet,它运行在MIDP(Mobile Information Device Profile, Java ME specifications的一种)的参考实现之上。如果你想了解更多的Wireless Java技术的背景,请参考"Introduction to Wireless"

因为运行MIDlet的大多数设备从某种意义上来说都是网络设备,我们将在本教程的第二部分中专门就这一问题进行讨论,在第二部分中,我们会介绍如何建立一个servlet开发环境来编译测试servlet,并最终开发一个MIDlet通过网络连接来访问我们的servlet。

行前准备

MIDP开发的系统要求并不很高,要求以下配置就可以方便我们开发Java应用程序。

MIDP开发软件具有Linux,Solairs,window这三种版本。

J2ME/MIDP开发环境由以下三部分组成:

  1. Java Platform, Standard Edition version 1.4.2 或更高版本.
  2. J2ME Wireless Toolkit Sun提供用于J2ME无线开发的一个小型的工具包,可以方便的生成和测试 MIDlet。
  3. 任意一种你喜欢的文本编辑器,例如,像是Windows中的笔记本(notepad),或是功能更强大的如 jEdit

当然,无论你选择任何一种文本编辑器都可以。但是我们确实需要一个文本编辑器,选择什么样的编辑器当然取决于你。Unix系统下程序员流行使用 emacs 或 vi。某些Windows 开发者使用笔记本(textpad),
但也许你像更专业一些,我个人喜欢使用 jEdit,它运行在 J2SE 5.0 环境中,这样我可以在Windows XP和Mac OS X 系统上使用相同的编辑器。

安装 J2SE SDK

在开始其他事情之前,首先你要安装Java 2, Standard Edition Software Development Kit 5.0 ( J2SE 5.0 )。请在这里( http://java.sun.com/j2se/1.5.0/download.jsp )下载。目前最新版本是1.5。J2SE SDK 5.0 共有Linux, Solaris,和Windows三个版本。

只所以需要安装 J2SE SDK 5.0 的原因是:首先,给 Sun Java Wireless Toolkit 提供一个Java运行平台。其次,J2ME WTK 需要SDK中的编译器和其他工具来编译MIDlet。

当你下载完毕 J2SE 5.0,你需要进行安装。在windows环境下,直接运行你所下载之文档即可。安装过程中会提示你几个问题,如果你接收默认, J2SE 5.0 将被安装在目录或是 c:\jdk1.5.0_06 中。然后请对你系统的autoexec.bat 文件(Windows 95/98中) 或系统属性 (Windows NT/2000)中的路径设置做一些调整-把 J2SE SDK 5.0 的bin目录添加到路径中去。

如,在Windows98中请在autoexec.bat文件中添加下面一行:

path %path%;c:\jdk1.5.0_06\bin

然后测试一些安装是否正常,请打开一个命令行窗口,(如果你改变的是autoexec.bat文件,请先重启动),键入java -version,如果得到类似如下的输出则证明安装正常。 

C:\>java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

C:\>

安装 Sun Java Wireless Toolkit

下一步安装 Sun Java Wireless Toolkit ( J2MEWTK ). J2MEWTK方便生成和测试MIDP应用程序的工具包,你可以把它当做一个小型的IDE,可以自动化一些生成MIDP应用相关的任务。

请在链接 http://java.sun.com/products/sjwtoolkit/ 处下载J2MEWTK,下载完毕后,执行安装文件,安装过程中会自动寻找你的 J2SE SDK 5.0 的安装位置;如果此时出现问题,请手工指定 J2SE SDK 5.0 的安装位置并确保其正确。默认情况下 J2MEWTK 将被安装在 c:\WTK23 目录下。并在Windows程序菜单上创建了一组快捷方式。

要运行 toolkit ,请选择 KToolbar ,单击,你会看到如下所示画面:

Sun Java Wireless Toolkit 示意图

J2MEWTK以项目(project)为开发单位,每个项目的最终完成的结果是一个MIDlet suite。J2MEWTK一次只能打开一个项目。你可以改变当前项目的属性,编译项目,在设备模拟器中运行项目。同时安装的还有几个项目示例,我们后文将会提到。

让我们先建立一个新项目一试身手,点击面板上的 New Project,J2MEWTK 提示输入项目名和MIDlet的class文件名。请分别填入 HelloSuite HelloMIDlet,如下图所示:

新建一个项目 

当你填毕项目名和class文件名,J2MEWTK这时会给你机会去设置项目的各项设定。这时不要去管他,只需接收默认设定即可。单击OK ,完成新项目的创建。这时请注意J2MEWTK的文本输出面板,你会发现一些有用的输出信息,提示你把源程序存放到哪里。在我的机子上,我得到了如下的输出:

Creating project "HelloSuite"
Place Java source files in "C:\WTK23\apps\HelloSuite\src"
Place Application resource files in "C:\WTK23\apps\HelloSuite\res"
Place Application library files in "C:\WTK23\apps\HelloSuite\lib"

J2MEWTK把每个项目的文件都存放在 apps 目录的子目录中. 子目录的目录名就是项目的名字。同样,这里我们的项目文件被 J2MEWTK 创建到 c:\WTK23\apps\HelloSuite 目录中。 每个项目的子目录这种标准的结构,如下图所示:

项目目录结构 

在图中,bin 目录包含编译过的MIDlet suite (即一个. jar文件)和MIDlet suite描述文件 (即一个.jad文件)。 lib 目录可以用来放置你的项目需要的附加的 JAR 文件。res 目录放置图片或是文本文件等资源文件, 这些文件会被打包到你的MIDlet suite中。最后,src 目录存放你的 MIDlet的源程序代码。如果你的代码中使用了 Package,src此时为Package机制的起始目录。例如,对于类 users.Root 的源码应该被存放为:src/users/Root.java

创建一个MIDlet

让我们先写一个简单的MIDlet程序,作为我们MIDP开发的开始。首先我们需要一个文本编辑器,选择什么样的编辑器当然取决于你。
Unix系统下程序员流行使用emacs 或 vi。某些Windows 开发者使用笔记本(textpad),
但也许你像更专业一些,我个人喜欢使用 jEdit,它运行在 J2SE 5.0 环境中,这样我可以在Windows XP和Mac OS X 系统上使用相同的编辑器。

当你选定编辑器,请敲入下述代码(你也可以从这里下载 HelloMIDlet.java ):

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet
    extends MIDlet
    implements CommandListener {
  private Form mMainForm;

  public HelloMIDlet() {
    mMainForm = new Form("HelloMIDlet");
    mMainForm.append(new StringItem(null, "Hello, MIDP!"));
    mMainForm.addCommand(new Command("Exit", Command.EXIT, 0));
    mMainForm.setCommandListener(this);
  }

  public void startApp() {
    Display.getDisplay(this).setCurrent(mMainForm);
  }

  public void pauseApp() {}

  public void destroyApp(boolean unconditional) {}

  public void commandAction(Command c, Displayable s) {
    notifyDestroyed();
  }
}

以文档名为 HelloMIDlet.java 将源代码保存在本项目的 src 子目录下。在我的电脑上,该文件被存放为:c:\WTK23\apps\HelloSuite\src\HelloMIDlet.java

接着,点击 KToolbar 的 Build 按键,J2MEWTK将编译你的项目。如果这时有任何编译时错误发生,你会在 KToolbar 的文本输出区上看到具体的错误输出。修改这些错误直到项目被成功编译。

当你使用KToolbar编译一个项目后, J2MEWTK又新建了几个子目录,如下图所示:

Project directory structure after building 

如视,J2MEWTK 创建了 classestmpclasses, 和 tmplib 这三个子目录,对于大多数时候,你可以不用管这些目录的作用,他们是被 J2MEWTK内部使用的。

现在,一切就绪开始测试你的 MIDlet suite 。点击 Run 按键。你会发现设备模拟器将会弹出,请参考下图:

HelloSuite running on the emulator 

模拟器显示当前 MIDlet suite 中 MIDlet 列表。在本例中,我们只有唯一的一个 MIDlet。我们这里看到名字为 HelloSuite,运行的 class 文件是 HelloMIDlet 。如果你想了解具体的对应关系,请单击KToolbar中的 Settings… 按键,然后点击 MIDlets  标签,你会看到该项目中MIDlet 的列表。

现在,回到模拟器, 点击 Launch 下面对应的 soft button,开始执行MIDlet。这时屏幕如下图所示。点击 Exit 退出 MIDlet,然后关闭模拟器窗口或是按一下 ESC 键,来结束我们的测试。

HelloMIDlet running on the emulator 

这里我们使用的模拟器是 DefaultColorPhone。J2MEWTK 还包括其他好几个模拟器: DefaultGrayPhone等。你可以使用其他模拟器来测试一下我们的 HelloMIDlet 。要使用其他的模拟器只需在 KToolbar 的 device 列表框中选择所需设备,然后再次点击 Run 键即可。

你是不是已经玩腻了 HelloMIDlet,试着运行一下 J2MEWTK 本身附带的示例,你可以试试 demos, games, 和 photoalbum 这些简单的示例.

底层一瞥

好,现在我们已经玩了好一会了,让我们坐下来谈谈J2MEWTK到底替我们做了那些工作。虽说没有什么复杂的底层机制,但J2MEWTK确实替我们做了好几项繁琐的步骤,使得工作只是轻而易举的按几下按键。

首先,当我们按下 Build 键时发生了什么?
J2MEWTK 首先找到 src 目录下所有 .java 文件并编译他们。然而由于我们的源文件需要在 MIDP 环境下编译而不是通常的 J2SE 5.0 环境,这就使得编译过程有其特殊之处。你可以这样理解,MIDlet 使用的 java.lang.System 类是与 J2SE 中相应的 API 是不同的。
也就是说,当 J2MEWTK 编译 MIDlet 时,使用的是 MIDP 版的 java.lang.System类文件。

当然你也可以手工达到同样的效果,即在命令行窗口中使用 javac 命令并添加 -bootclasspath 参数。
但使用 J2MEWTK 就显得简单多了。

除了编译外,生成的MIDP类文件还必须先被预审核(preverified),然后他们才能MIDP 设备上运行。你也许会记起J2SE有一个bytecode verifier 可以在载入.class文件之前先检查他们。在MIDP世界里, 审核(verification)分为两步。首先,类在编译时被预先审核,
然后当设备载入类时进行第二次审核。

这里J2MEWTK又一次简化了我们的工作,当然你也可以使用命令行程序 preverify 来手工完成这一步骤,但使用J2MEWTK使我们不需考虑这些细节。

最后,MIDlet被打包到MIDlet suite中以便于发布在实际设备上,也就是说把class文件,资源文件打包为一个Jar文件并在该Jar文件的清单(manifest)文件中添加一些额外的信息。
这里,J2MEWTK又一次发挥了它的职责。如果我们想要给MIDlet suite打包,只需要在菜单中选择 Project | Package 命令,
这样.jad 文件和.jar 文件就轻而易举的在该项目的bin 子目录中生成了。

相关资源

J2MEWTK 附带的User Guide 包含了许多有用的信息如application development cycle, MIDlet attributes, 如何配置模拟器,如何在命令行下使用J2MEWTK,如何与Forte for Java,集成使用等等。

如果你是MIDP的新手你会发现下述文章会对你有所帮助:


J2ME开发教程Part II 建立端对端(End to End)Java应用程序
By Jonathan Knudsen, January 2006  

在本教程的Part I中,我介绍了如何写一个简单的 Java Platform, Micro Edition (Java ME) 应用程序.。这种被称为MIDlet的应用程序被设计运行在MIDP(MobileInformation Device Profile, J2ME specification中的一种)的参考实现之上。现在我们将要教你一些更高级内容,通过本教程,你将学会如何开发一个servlet,并使用 MIDlet与该servlet进行通讯。通过本教程你将掌握建立端对端无线Java应用程序的基本知识。

本文有两个版本,分别对应Tomcat和J2EE RI server这两种servlet开发环境。

  • Tomcat Java servletJavaServer Pages (JSP) 的一种常见的参考实现,而且它是可以免费下载的。虽然与某些高质量的商业软件相比还显简陋,但对于开发与测试 servlet来说,却不失为一种良好的选择。

这两种 web server各有其特点和针对性,Tomcat 对于servlet开发来说更简单方便,但它的能力也只限于servlet和JSP开发。而 J2EERI server 则是J2EE 技术的一个完整的实现-其中包括:servlet,JSP,EJB,JMS,JNDI等等……。

本文讲述的是使用Tomcat来进行servlet开发。

安装并运行Tomcat

Tomcat 以 ZIP 文档的形式发布,你可以从 Apache Jakarta project 网站下载该文档。目前最新版本为 4.1.31

Tomcat 的安装非常简单,你只需解压缩该zip文档到一个任意你指定的目录即可。我把该文件解压到我的根目录下,即 c:\jakarta-tomacat-4.1.31

由于Tomcat 本身是由Java语言编写的。想要运行Tomcat你必须告知它你的J2SE的安装地址。要达到这一目的,你需要添加一个系统环境变量 JAVA_HOME,并设置它的值为你的J2SE 安装位置。根据你的Windows版本的不同,请参考下述的设置方法。对于Windows NT,请用鼠标右击“我的电脑”图标,从弹出菜单中选择属性,然后选择高级,接着点击环境变量按键。选择系统变量下的新建,在弹出的输入框中填入变量名: JAVA_HOME和合适的变量值(该值反映你的J2SE安装位置),对于我来说,则填入变量值: c:\jdk1.5.0_06

为了运行Tomcat,打开一个命令窗口。把改变当前目录到Tomcat的bin目录下。然后键入startup回车。一个新的命令窗口将会弹出并显示一些初始化信息。下图展示了当Tomcat启动完毕的状态。

Tomcat's initialization messages 

下面测试Tomcat是否运行正常。你可以用你的浏览器尝试打开 http://localhost:8080/,如果Tomcat 运行正常,你会发现浏览器将显示Tomcat的默认web页面,同时页面上还有指向一些servlet和JSP 示例的链接。

关闭Tomcat只需从新打开一个命令窗口,改变当前目录到Tomcat的bin目录下,运行shutdown命令即可。

开始与停止Tomcat的步骤略显繁琐,建议创建两个快捷方式来运行startup和 shutdown命令。

撰写Servlet程序

编写servlet 程序与写其他Java程序非常类似:首先使用你喜欢的文本编辑器生成.java源文件,在本例中,我们将介绍一个非常简单的servlet 并命名为HitServlet。该程序只是简单地计算Sevlet被调用的次数并把该次数输出到客户端上(本示例并未考虑线程安全性,因为在此处并不需要强调这一点)。

如下所示( HitServlet.java ):

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

public class HitServlet extends HttpServlet {
  private int mCount;

  public void doGet(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
    String message = "Hits: " + ++mCount;

    response.setContentType("text/plain");
    response.setContentLength(message.length());
    PrintWriter out = response.getWriter();
    out.println(message);
  }
}

把源码放到哪里呢?以后我们将讲述如何部署一个 webapplication 的一般步骤以及其目录结构规范。而现在我们只是简单地按如下目录结构把源文件放到 Tomcat 的根目录下即可:webapps/midp/WEB-INF/classes/HitServlet.java 。 (这里你需要自己创建 midp 子目录以及其他相应的子目录。)

编译Servlet

编译Servlet也与常规的Java 程序编译大体相同,即使用Java编译器javac来编译源文件。但这里请注意由于 servlet API 并未包括在J2SE平台的核心部分中。 所以当你编译servlet之前,你需要在你的 CLASSPATH 变量中添加 servletAPI 包的位置。

servlet API 位于Tomcat根目录下 common/lib/servlet.jar 文件中。你只需要简单的修改你的CLASSPATH然后你就可以使用javac来编译 HitServlet.java。请编辑你的系统属性中的CLASSPATH变量或是在命令行下执行下面命令:

C:\>set CLASSPATH=\jakarta-tomcat-4.1.31\common\lib\servlet.jar

C:\>javac HitServlet.java

部署Servlet

为了部署你的servlet,你首先要对web applications有所了解。web application 是一组静态的内容包括: HTML 、图片文件、servlet和许多其他的资源, 这些资源可通过web interface来进行访问。Tomcat本身包括几个已经预先安装好的web applications ,例如在Tomcat安装目录下的webapps目录下,你可以找到这两个子目录:examples和manager。下面我们将介绍如何来生成一个新的 web applicatoin 并将我们的servlet置于其中。

首先,让我们先生成一个 web application。 你前面已经在webapps生成了新目录midp,还在其中保存了servlet源码。现在你需要编辑Tomcat的配置文件来指定新的webapplication。 首先用某个文本编辑器打开conf/server.xml文件,在该文件中,每个web applications 被描述为 context。请在该文件中找到名为 examples 的web applicationde的Context子项,如下所示:

<!– Tomcat Examples Context –>
<context path="/examples" docbase="examples" debug="0" reloadable="true" crosscontext="true"></context>

拷贝上述内容,然后把拷贝的context的名字改为midp,并把context中的几个属性分别做相应修改, 然后添加一个reloadable属性,并置值为true,改动好的context如下所示:

<!– MIDP Context –>
<Context path="/midp" docBase="midp" reloadable="true"/>

把上述的midp context置于examples context之后,然后保存文件。

上述所作设置的实质是把收到的HTTP request映射到某个相应路径中的web application中去。 更确切地说,任何以 "/midp" (对应MIDP Context中的 path 属性)开头的HTTP request将传递给 位于"webapps/midp" (对应 docBase 属性)的web application 。 将 reloadable 属性设置为true时,当我们对servlet class文件做了改动后, Tomcat 会自动重载该servlet,这样就不再需要重新启动Tomcat server了,这为我们进行开发提供了便利。

好现在让我们进一步完成我们的web application。 Web application
具有标准的目录结构,这个结构是由servlets规范所定义的,这里我们不过多地讨论细节。web application的核心是一个名为web.xml 的文件,该文件描述web application的各个部分。它的位置是固定的,位于WEB-INF/web.xml。

下面为我们的web application建立自己的 web.xml 文件。
我们的目的是让我们的servlet可以被外界访问,该servlet的类名HitServlet,为并且我们想让该servlet在目录 /hits 下被访问。请注意servlet的路径是包含在 web application路径下的,所以该servlet的访问路径的全称应该为:http://localhost: 8080/midp/hits。拷贝下列文本,并保存为webapps/midp/WEB- INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <servlet>
    <servlet-name>bob</servlet-name>
    <servlet-class>HitServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>bob</servlet-name>
    <url-pattern>/hits</url-pattern>
  </servlet-mapping>
</web-app>

该文件告诉Tomcat 我们的servlet 名为 HitServlet,并把其路径映射为/hits。 至于 servlet-name 属性,是 web.xml 内部使用的,它充当了servlet 元素与servlet- mapping元素之间的联系。这里我使用了 bob 只是为了说明用法而已,你可选择其他自己喜欢的名称。

WEB-INF 目录下有一个标准子目录 classes 。该目录是Tomcat预设的寻找servlet的地方。前面我们曾经把我们的servlet源码放在了此处。这样当我们编译好源文件的同时就把servlet 放置到了正确的位置。

现在你的servlet 已经被部署在这个新的web application中了。请注意,要使你对 server.xml 的改动生效,请重新启动Tomcat 。

下面测试一下一切是否正常,打开你的浏览器,指向 http://localhost:8080/midp/hits。 这时你应该看到 HitServlet 的输出。刷新几次页面,观察Hit值的改变。

更多关于servlet 的相关内容,请参考sun的J2EE教程中的Java Servlet Technology部分。

使MIDlet 与 Servlet建立联系

这部分很有趣,我们将建立一个同时支持MIDP和servlet的开发环境并把这两个世界联系在一起来创建一个端对端的Java程序。我们在前文己经建立了一个servlet可通过HTTP访问。MIDlet一样可以通过HTTP访问servlet,所以通过MIDlet连接servlet是相当简便的。

启动J2MEWTK的 KToolbar ,然后打开你在教程的PartI部分建立的MIDletproject 。我们的目的是新创建一个MIDlet用以连接我们的servlet,接收其输出并显示出来。 如果你还不会创建J2ME Wireless Toolkitproject,请参考Part I 。 我们要创建的 HitServlet的源码如下:

import java.io.*;

import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HitMIDlet
    extends MIDlet
    implements CommandListener {
  private Display mDisplay;
  private Form mMainForm;
  private StringItem mMessageItem;
  private Command mExitCommand, mConnectCommand;

  public HitMIDlet() {
    mMainForm = new Form("HitMIDlet");
    mMessageItem = new StringItem(null, "");
    mExitCommand = new Command("Exit", Command.EXIT, 0);
    mConnectCommand = new Command("Connect",
        Command.SCREEN, 0);
    mMainForm.append(mMessageItem);
    mMainForm.addCommand(mExitCommand);
    mMainForm.addCommand(mConnectCommand);
    mMainForm.setCommandListener(this);
  }

  public void startApp() {
    mDisplay = Display.getDisplay(this);
    mDisplay.setCurrent(mMainForm);
  }

  public void pauseApp() {}

  public void destroyApp(boolean unconditional) {}

  public void commandAction(Command c, Displayable s) {
    if (c == mExitCommand)
      notifyDestroyed();
    else if (c == mConnectCommand) {
      Form waitForm = new Form("Waiting...");
      mDisplay.setCurrent(waitForm);
      Thread t =  new Thread() {
        public void run() {
          connect();
        }
      };
      t.start();
    }
  }

  private void connect() {
    HttpConnection hc = null;
    InputStream in = null;
    String url = getAppProperty("HitMIDlet.URL");

    try {
      hc = (HttpConnection)Connector.open(url);
      in = hc.openInputStream();

      int contentLength = (int)hc.getLength();
      byte[] raw = new byte[contentLength];
      int length = in.read(raw);

      in.close();
      hc.close();

      // Show the response to the user.
      String s = new String(raw, 0, length);
      mMessageItem.setText(s);
    }
    catch (IOException ioe) {
      mMessageItem.setText(ioe.toString());
    }
    mDisplay.setCurrent(mMainForm);
  }
}

HitMIDlet 的 main screen 与 HelloMIDlet 类似,不同的是荧幕中多了个 Connect 命令。 Connect命令执行时会建立另外一个线程(thread)来调用connect()方法, 该方法负责建立网络连接并取回结果。

拷贝上述代码,并以 HitMIDlet.java 为文件名存放在 apps/HelloSuite/src 目录下,上述目录位于J2MEWTK的根目录下。

下面我们对HitMIDlet进行一些配置使之可以工作。首先,我们要告诉J2MEWTK 这个新的MIDlet。点击Settings…,然后选择 MIDlets 表单。点击 Add,在MIDlet name和MIDlet calss中填入 HitMIDlet, Icon 保留为空。点击 OK ,你会发现HitMIDlet 被列在HelloMIDlet之后。然后,我们需要定义一个system property 来放置HitMIDlet需要用来进行网络连接的URL。(即通过String url = getAppProperty("HelloMIDlet.URL") 语句)。点击 Settings…,选择 User Defined 表单,按  Add 键,property name项填HelloMIDlet.URL ,该属性的值填入调用HitServlet的URL,即你通过浏览器可以访问该servlet的URL。填好后,点击 OK 完成设定。

现在点击Build 来编译MIDlet,如果没有什么差错的话,你现在可以试着运行该程序了。首先确保你的web server已经启动,然后运行该MIDlet,执行Connect命令。 如果一切正常HitMIDlet 会调用 HitServlet并在模拟器上显示结果,与下图所示类似。

Success! 

部署Servlet的几点注意

现在整个程序建立完成,你可以方便的修改HitServlet的源码,重新编译,并进行测试,当你再次调用该servlet时,Tomcat会自动使用修改过的版本。(我们前面对Tomcat的 server.xml 文件中的 reloadable 属性的设定确保了这一点。)

如果你想添加其他的servlet,你可能需要改动该web application的web.xml文件。 在这种情况下,你需要重新启动web server以使改动生效。总结

本教程详细介绍了如何建立端对端Java程序。Part I主要介绍如何建立并使用MIDP开发环境。而本部分着重于如果配置并使用 servlet开发环境。并介绍了如何连接MIDlet与servlet,给出了一个简单的端对端Java解决方案。

servlet 可以作为我们使用J2SE与J2EE更强大的功能的入口点,使我们建立功能强大的端对端Java程序。相对简单短小的MIDlet客户端通过servlet可以获得更多的功能。

关于端对端Java应用设计的更多信息,请参考sun的 Wireless Blueprints 白页。

注释

译注[1] 由于 Tomcat较为常见,且本文只涉及到servlet,所以只翻译了本文的Tomcat版本,对与J2EERI server读者可参考 原文文档。

译注[2] 新版的Tomcat具有windows安装版,这些快捷方式在安装时就会创建。目前最新版本为4.0.3

译注[3] 也可以把servlet.jar拷贝到jdk1.3\jre\lib\ext\目录下,这样就可以直接使用javac编译了。

译注[4] 此处有些问题,因为作者前文已经把HitServlet.java放置在 webapps/midp/WEB-INF/classes目录下。这里只要记着把编译好的class文件放入上述目录即可。

译注[5] 这种方法用来练习还可,但真正进行servlet开发则不应鼓励,该方法把源码也放置在/classes目录下了。