这个类必须继承RemoteServiceServlet(这是本身继承自javax.servlet.http.HttpServlet的一个GWT API对象)。也就是说,这个类及其实现的接口必须被发布到你的servlet容器中。
七、 步骤 现在,既然定义了服务,那么让我们来回顾一个这个应用程序的目录结构。GWT包括一个命令行脚本applicationCreator,它能够为你生成一个框架性的工程目录结构。在你解压下载的GWT后,你会在顶级目录下发现该applicationCreator。我使用下列命令行作为开始:
applicationCreator -out /Users/bruceperry/1gwt/secondapp/ com.parkerriver.gwt.testapp.client.MyForm
图3展示了该目录看上去的样子。

附件:
您所在的用户组无法下载或查看附件图3:一个GWT和IntelliJ工程目录
applicationCreator生成./src目录以及MyForm-compile和MyForm-shell脚本。我的Ant文件执行的是MyForm-compile;另一个脚本将在GWT模式下启动主机方式。这个./src目录中包括了嵌套的目录以匹配你的包名,如图4所示。

附件:
您所在的用户组无法下载或查看附件图4.一个GWT应用程序的Java包和模块
MyForm.gwt.xml文件是一个生成的配置文件,它其实是GWT调用的一个“模块”。它指定描述你的应用程序“入口点”的Java类(这是一个类似于一个包含一个main()方法的Java类)。
<module>
<!—继承核心Web Toolkit。-->
<inherits name='com.google.gwt.user.User'/>
<!--指定应用程序入口点类。-->
<entry-point class='com.parkerriver.gwt.testapp.client.MyForm'/>
</module>
其它的文件或目录,包括./classes、./WEB-INF和./gwtproj.ipr,都是一个IntelliJ Web应用程序工程的必要组成部分;因此,你不必特别注意它们。
另外,直到生成你的应用程序代码的GWT编译器时,./www目录才出现(除非你自己创建它)。我的工程使用了Ant文件gwtproj.xml,还有定义在gwtproj.properties中的属性。在我向你展示Ant构建文件前,我们先来看一下描述应用程序入口点的MyForm.java类。
八、 入口点 这个MyForm.java类实现了GWT API接口EntryPoint;因此,该类必须实现onModuleLoad()方法,当浏览器加载你的Ajax应用程序时此方法为浏览器的JavaScript引擎所调用。
也就是说,GWT编译器把这个类编译成JavaScript代码。MyForm.java类为浏览器视图建立表单widget。该类还决定了点击OK和Submit按钮时用户的响应。代码中的注释已经作了详细的描述,所以在此不再多言。
注意,这个类中的大部分代码是处理GWT API。有意思的是,如果你必须实现JavaScript DOM编程(就象在showRpcStatus()方法中所展示的),那么你可以用Java来实现com.google.gwt.user.client.DOM类。
九、 构建文件 下面是Ant构建文件的主要功能;这个构建文件:
1. 把Java文件编译到工程目录的./classes目录下。
2. 执行GWT编译脚本(在这个例子中是MyForm-compile)。
3. 把在./www目录下生成的结果代码移动到一个较大的已经发布到Tomcat上的web应用程序。
4. 把编译的Java servlet及相关接口(ShowRespService)复制到同一个web应用程序下。
注意,这里的两个目标:编译Java类和初始化到JavaScript的转换有可能使整个构建过程失败,如果期间发生任何错误的话。
十、 Ant XML 下面是gwtpoj.properties文件包含的内容(省略了其它的内容):
web.deploy.location=/users/bruceperry/parkerriver/gwt
web.classes.location=/users/bruceperry/parkerriver/WEB-INF/classes
下列XML描述了刚才的Ant文件的主要功能:
<?xml version="1.0" encoding="UTF-8"?>
<project name="gwtproj" default="all">
<property file="gwtproj.properties"/>
<!—工程的顶级目录与ant文件存在的位置-->
<dirname property="module.gwtproj.basedir" file="${ant.file}"/>
<!--目录在顶级目录内的./classes-->
<property name="gwtproj.output.dir" value=
"${module.gwtproj.basedir}/classes"/>
<!--这个目标调用MyForm-compile以创建./www目录下的所有的内容-->
<target name="gwt-compile" depends=
"compile.production.classes"
description="use gwt's compiler">
<delete>
<fileset dir="${web.deploy.location}" includes="**/*"/>
</delete>
<exec executable=
"${module.gwtproj.basedir}/MyForm-compile"
fail/>
<copy todir="${web.deploy.location}">
<fileset dir=
"${module.gwtproj.basedir}/www">
</fileset>
</copy>
</target>
<target name="compile.production.classes" description=
"Compile the gwtproj production classes">
<mkdir dir="${gwtproj.output.dir}"/>
<javac destdir="${gwtproj.output.dir}" debug=
"on" fail nowarn=
"off" memoryMaximumSize="128m" fork=
"true" executable="${module.jdk.home.gwtproj}/bin/javac">
<classpath refid="gwtproj.module.classpath"/>
<src refid="gwtproj.module.sourcepath"/>
</javac>
</target>