使用GWT开发AJAX应用程序(1)(2)
另外,直到生成你的应用程序代码的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" failonerror="true"/> <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" failonerror="true" 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> <!--把Java servlet类复制到web应用程序--> <target name="deploy.classes" depends="gwt-compile" description="copy classes to web directory"> <copy todir="${web.classes.location}"> <fileset dir="${gwtproj.output.dir}"> </fileset> </copy> </target> <target name="all" depends="deploy.classes" description="build all"/> </project> |
你可以从IDE(在IntelliJ中)中或在包含该构建文件的目录下使用下列命令行来运行这个Ant文件:
ant -buildfile gwtproj.xml
大部分情况下,在修改应用程序和运行Ant后,你都可以通过重载浏览器页面而在浏览器中看到这些变化。
十一、 安装
注意,在安装时,你必须把gwt-user.jar库添加到你的web应用程序的/WEB-INF/lib目录下。
我把创建的JAR文件,还有javax包(gwt-user-deploy.jar)都添加到/WEB-INF/lib目录下。这是因为Tomcat不会加载单个的web应用程序的库文件,如果它已经包含servlet API类的话。
十二、 难点
applicationCreator还会为你创建Ajax应用程序的HTML前端,在这个例子中是MyForm.html。
如果你的应用程序的HTM必须满足一种标准(例如XHTML Transitional 或Strict),那么该怎么办呢?对于XHTML transitional,我首先把要求的DOCTYPE添加到MyForm.html的顶部以及该html标签的相关属性中:
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
然后,我把MyForm.html上传到WWW协会的HTM验证程序(位于http://validator.w3.org/)。
在运行该验证程序后,我略微修改了一下该HTML,例如适当关闭meta标签并且把一个type="text/javascript"添加到脚本标签。
然而,如果你想满足XHTML Strict标准,那么还需要进行更为复杂的修改。例如,W3C的验证程序将把iframe标签显示为“undefined element”,而这个标签是GWT的历史支持功能(提供与一个浏览器back按钮相同的功能)必需的。XHTML Strict中已经删除了iframe元素。
这个对你来说可能不是个问题(可能会在GWT的未来版本中得到解决,还有任何其它明显的问题);然而,你还可以实现其它可选策略,例如扩展GWT的类并创建你自己的兼容widget等。
十三、 位置对齐问题
一个在web开发中普通存在的问题就是应用程序的可视化设计问题。工程的设计者可能想使页面看上去如其在Adobe Illustrator创建一样的效果,对不对?
尽管当你开发一个复杂的Ajax工程时你可能无法实现这种理想的视觉效果;但是,你至少可以使用Firefox的DOM Inspector来观察你的Java类最终生成的HTML。然后,再从这里进行修改。
例如,转到Firefox的“Tools=>DOM Inspector”菜单项(见图5)。

图5:使用DOM Inspector观察后台实现内容。






