开发一个Java应用程序(1)
App Engine上的Java Web应用程序通过Java Servlet标准接口与应用程序服务器交互。一个应用程序由一个或多个类组成,这些类都扩展自一个servlet基类。servlet是通过一个标准配置文件(叫做“部署描述符”)与URL映射起来的。当App Engine接收到一个请求时,首先会判断该使用哪个servlet类(根据URL和部署描述符),然后初始化该类,并调用这个servlet对象上的某个方法。
Java应用程序的所有文件(包括已编译的Java类、配置文件以及静态文件)都是以一种叫做Web应用程序档案(Web Application Archive,WAR)的标准目录结构组织起来的。WAR目录中的所有东西都会被部署到App Engine上去。WAR中的内容通常是在开发过程中由一组源文件生成的,你可以使用自动构建过程,也可以使用支持WAR的开发工具。
如果使用的是Eclipse IDE和GPlugin,则可以通过Web Application向导来创建新项目。在“File”菜单中,单击“New”,然后单击“Web Application Project”。在打开的窗口中,输入项目名(如Clock)和包名(如clock)。
取消“Use GWeb Toolkit”复选框的选中状态,并确保“Use GAE”复选框是选中的。( 如果选中了“GWT” 复选框, 则新项目在创建时会有一些初始文件。) 单击“Finish”即可创建该项目。
如果没有使用GPlugin for Eclipse,就要使用另一种办法来创建这些目录和文件了。如果对Java的Web开发已经很熟悉了,可以用你现有的工具和工序来生成最终的WAR。在本节余下的内容中,我们将假设该目录结构已经由GPlugin for Eclipse创建好了。
图2-8展示了该项目的文件结构,跟在Eclipse Package Explorer中显示的一样。
图2-8:一个新Java项目的结构,
跟Eclipse Package Explorer中所显示的一样
该项目的根目录(Clock)含有两个主要的子目录:src和war。src/目录所包含的是该项目全部的类文件,这是常见的Java包结构形式。根据clock的包路径,Eclipse将会在文件clock/ClockServlet.java中创建一个名为ClockServlet的servlet类。
war/目录所包含的是该应用程序完整的最终内容。Eclipse会自动编译src/中的源代码,并将编译后的类文件保存到war/WEB-INF/classes/中(默认情况下,该目录在Eclipse的Package Explorer中是不可见的)。Eclipse还会自动地将src/META-INF/中的内容复制到war/WEB-INF/classes/META-INF/。其他所有的东西都会被创建在war/目录中的指定位置。
下面,我们从一个简单的servlet开始构建咱们这个时钟应用程序,其功能就是显示当前时间。打开文件src/clock/ClockServlet.java(如果需要,应先创建),然后如示例2-10所示编辑其中的内容。
示例2-10:一个简单的
Java servletpackage clock;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class ClockServlet extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws IOException {
SimpleDateFormatfmt=newSimpleDateFormat
("yyyy-MM-dd hh:mm:ss.SSSSSS");
fmt.setTimeZone(new SimpleTimeZone(0, ""));
resp.setContentType("text/html");
PrintWriterout=resp.getWriter();
out.println("
The time is: " + fmt.format
(new Date()) + "
");
}
}
该servlet类继承自javax.servlet.http.HttpServlet,并为它所希望支持的所有HTTP方法重写了基类中的相应方法。为了能够处理HTTP GET请求,我们的这个servlet重写了doGet()方法。服务器在调用该方法时,将会以一个HttpServletRequest对象和一个HttpServletResponse对象作为参数。HttpServletRequest含有该请求相关的信息,比如URL、表单参数以及cookie等。而该方法则通过HttpServletResponse上的一系列方法来准备响应,如setContentType()和getWriter()等。当这个servlet方法退出时,AppEngine就会将响应发送出去。
为了告诉App Engine使用这个servlet来处理请求,我们还需要一个部署描述符。打开或创建文件war/WEB-INF/web.xml,如示例2-11所示修改其内容。
示例2-11:该web.xml文件(也就是部署描述符)将所有URL都映射到了ClockServlet上<?xmlversion ="1.0"encoding="utf-8"?>
web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
clock
clock.ClockServlet
clock
/*