test
- 1. 195
第九章
Web 开发
Java 以其 JSP(JavaServer Page)和 Servlet 成功地踏上 Web 的版图。本章要谈的是运
用 Eclipse 来写 JSP 和 Servlet。我们的做法是使用 Tomcat 网页服务器,这是 Sun 针对
JSP 和 Servlet 所需的运行环境所做出来的参考版本,可以免费下载。
注意: 虽然本章用的是Tomcat,但是书中的Java程序和 XML文件并非针对Tomcat。 JSP和Servlet
两者都得满足各自的规范, 也就是说本章写的程序也能用于其他 J S P / S e r v l e t 网页容器
(Web container)。
安装和测试 Tomcat
你可以从 http://jakarta.apache.org/tomcat/ 下载 Tomcat 网页服务器。编写本书时,
Tomcat 的发布版是 4.1.29。下载和安装 Tomcat 并不难,只要解压缩或者用 tar 打开,就
可以得到下列的目录结构:
jakarta-tomcat-4.1.29
|__bin 可执行文件
|__common 内部类和 Web 程序共享的类
| |__classes 共享的 Java 类
| |__endorsed 已注释的 Java 类
| |__lib 共享的 JAR 文件
|__conf 配置文件(如密码文件)
|__logs 服务器的记录文件
|__server Tomcat 内部的类
|__shared 共享的文件
|__temp 临时的文件
|__webapps Web 程序的目录
|__work 临时文件的临时目录
209
- 2. 196
210 第九章
对 Web 开发人员而言,最重要的目录是 webapps,浏览器要读取的文件都存放在这里。
本章的范例会使用这个目录。
开发网站应用程序时,我们一开始的做法是不从 Eclipse 环境来运行 Tomcat,本章稍后
会说明怎么从 Eclipse 环境启动 Tomcat。我们的首要目标是让 Tomcat 能运作。从命令行
运行 Tomcat 之前,必须先设定两个环境变量:
JAVA_HOME
设为 Java 的安装目录,也就是 Java bin 目录的上层目录。例如,对 Windows 来讲,
也许是 C:jdk1.4。
CATALINA_HOME
设为 Tomcat 的安装目录,也就是 Tomcat bin 目录的上层目录。例如,对 Linux 来
讲,也许是 /usr/local/jakarta-tomcat-4.1.29。
你可以像这样在命令行提示符处设定这些环境变量:set JAVA_HOME=C:jdk1.4(若
在 Unix 的 tcsh 下,应改用 setenv)。对多数操作系统来讲,也可以用控制面板的对话
框或者设定配置文件这些比较固定的方式来设定环境变量。
注意: 在下载的Java 网页中的安装文件中,可以找到有关设定所有可以运行 Java 的操作系统的环
境变量的完整指示。 以下是各种操作系统的 URL:http://java.sun.com/j2se/1.4/install.html
(例如,对 Windows 系统,URL 就是 http://java.sun.com/j2se/1.4/install-windows.html)。
这些说明都是谈怎么设定 PATH 环境变量,但是,也可用来设定任何的环境变量。
设定这两个环境变量之后,可以改变目录到 Tomcat 的 bin 目录。于 Windows 下,应输
入“startup”来启动 Tomcat;在 Unix 下,就是运行 startup.sh 来启动 Tomcat。在
Windows 系统中,会打开一个新的 DOS 窗口,显示初始设定的信息。当你想关掉 Tomcat
时,Windows 下就输入“shutdown”,而 Unix 下就运行 shutdown.sh。
注意: 在 Tomcat 随附的 running.txt 文件中可以找到启动 Tomcat 的各种做法。
现在,Tomcat 在运行了,打开浏览器,连接到 http://localhost:8080,应该会打开 Tomcat
的欢迎页面,如图 9-1 所示。这个 URL 里头的“localhost”就是指本地的网页服务器(对
应到 IP 地址 127.0.0.1),而 8080 是端口号,网页服务器通常是用 80 端口,但是 Tomcat
为了避免和其他服务器相冲突,于是改用 8080。
- 3. 197
Web 开发 211
图 9-1:Tomcat 的欢迎网页
开发 JSP
网页服务器可以运行了,现在要开始运用了。以 Eclipse 来编写不需要编译的 JSP 文件,
是最简单的。这些文件可以把 Java 程序包在“小脚本元素”
(scriptlet element)“声明
、
元素”(declaration element)以及“表达式元素”(expression element)。最常用的是
小脚本元素,可以把好几行的 Java 程序包起来。小脚本元素的开头和结尾是“<%”和
“%>”这两种标记符号,如例 9-1 所示。你可以用 out 对象的 println()方法把文字送
回给浏览器。在此例中,我们只在此 JSP 中把文字“Using JSP”送回给浏览器。
例 9-1:JSP 的范例
<HTML>
<HEAD>
<TITLE>A Web Page</TITLE>
</HEAD>
<BODY>
<H1>Working With JSP</H1>
<% out.println("Using JSP"); %>
</BODY>
</HTML>
- 4. 198
212 第九章
创建此 JSP 文件的其中一种最简单的做法就是将之输入到 Eclipse 之中,如图 9-2 所示。
我们创建一个新的 Ch09_01 项目以及一个新的 Ch09_01.jsp 文件来储存 JSP 程序代码。
这里不会做任何的语法检查,Eclipse 用的是标准默认编辑器。
图 9-2:输入 JSP 程序代码
注意: 如果你真的想检查 JSP 文件的语法,可以试一试免费的 XML 编辑器:XML Buddy(网址
是 http://www.xmlbuddy.com)。
要怎么安装Ch09_01.jsp,Tomcat才能将之提供给客户端的浏览器?请使用本章的范例,
我们要在 Tomcat 的 webapps 目录下另建一个名为 Ch09 的子目录,而这个新的 Ch09 目
录下也必须有一个名为 WEB-INF 的子目录,其中再含 classes 和 lib 这两个子目录:
webapps
|_ _ch09 存放第九章范例的文件夹
|_ _WEB-INF 有关第九章 Web 应用程序的信息
|_ _classes 第九章的 Web 应用程序使用的 Java 类
|_ _lib 第九章的 Web 应用程序使用的 JAR 文件
此时,WEB-INF、classes 以及 lib 目录都是空的,但是一定要存在,不然 Tomcat 不会
把 Ch09 目录视为储存网页文件的有效目录。创建这些目录之后,将 Ch09_01.jsp 存放到
Ch09 目录下。然后,如果 Tomcat 正在运行,先关掉,再重新启动。
- 5. 199
Web 开发 213
注意: 当你新增一个目录到 webapps 目录下时,或者把“.class”文件设置到 webapps 目录下的某
个位置,都应该先关掉 Tomcat,再重新启动。默认情况下,Tomcat 会把 webapps 目录中
的内容复制到 work 目录下,且实际上是以 work 目录下的内容来运行。也就是说,当你对
webapps 目录下的内容做某些改变时,都应该重新启动 Tomcat。Tomcat 的配置可以改成
自行侦测这些改变而无需重新启动,但我们目前不打算这样做。
要察看 JSP 文件,可以让浏览器连接到 http://localhost:8080/Ch09/Ch09_01.jsp,如图
9-3 所示。Tomcat 会把 JSP 的 Java 程序代码转译成 Servlet 的形式,编译后,再运行它,
然后,你就能看到图 9-3 中所展示的结果。
图 9-3:察看 JSP 文件
以上就是我们初探 Tomcat 和 JSP 的内容,但是,如你所见,Eclipse 并没有涉及太多。
我们利用 Eclipse 创建 Ch09_01.jsp,但也仅止于此。现在,要让 Eclipse 当主角了。
开发 Servlet
引人 JSP 能让新手觉得 Java 的 Web 程序设计更加吸引人,让你能混合 HTML 和 Java 程
序代码。JSP 服务器实际上是建立在 Java Servlet 的基础上,运行前先转译成 Servlet 。
Servlet 是纯粹的 Java 程序,本章大部分的焦点都集中在此。例 9-2 就是一个 Servlet 的
范例。
例 9-2:Servlet 范例
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ch09_02 extends HttpServlet
{
- 6. 200
214 第九章
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
out.println("A Servlet Example");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>");
out.println("Working With Servlets");
out.println("</H1>");
out.println("Using servlets");
out.println("</BODY>");
out.println("</HTML>");
}
}
像以上的 Servlet 都需要基于 javax.servlet.http.HttpServlet 类,而且常常只是
改写 doGet()方法。这个 doGet()方法会接收一个请求对象(request object),其中的
数据包括了浏览器的种类以及来自任何 H T M L 控件的数据。 另外还有一个响应对象
(response object),可以让你把想响应的结果返回给客户端浏览器。
注意: 你需改写 doGet()方法来处理 HTTP GET 请求(当 HTML 窗体中的 METHOD 属性设为 GET
之时) ,或者说是默认的 Servlet 访问。另外,doPost()方法取用同样的自变量,用来处理
POST 请求(当 HTML 窗体的 METHOD 属性设为 POST 之时)。无论是处理 GET 或 POST 请
求都可以改写 Servlet 的 service()方法,而取用的自变量也一样(实际上此方法就是负
责调用 doGet()方法或 doPost()方法)。
在此例中,我们要以 response对象的 getWriter()方法来取得 printWriter对象,以
之来响应浏览器,而且以 PrinterWriter 对象的 println()方法把 HTML 送回给浏览
器。在此例中,只是把显示“Using servlets”文字的 HTML 网页送回去。
接着按步骤做。首先,创建一个新的 Ch09_02项目,再把上列程序输入到该项目中,保
存成 Ch09_02.java,包名是 org.eclipsebook.ch09。为了满足 import 语句所导入的内容,
我们要把 Tomcat 随附的 servlet.jar 加入编译路径(build path)中。你可以在 jakarta-
tomcat-4.1.29commonlibservlet.jar 找到 servlet.jar。接着,对“Package Explorer”视
图中的 Ch09_02 项目按鼠标右键,选择“Properties”选项,再将 servlet.jar 加进编译路
径中。
- 7. 201
Web 开发 215
此时,你应该可以选取“Package Explorer”视图中的 Ch09_02项目,再选“Project”→
“Build Project”选项来创建 Ch09_02 类。像这样的类文件会进入 Tomcat 的 classes 目
录。我们的 Servlet 位于 org.eclipsebook.ch09 包中,因此,目录结构必定反映此包
结构,所以 Ch09_02.class 是放在 webappsCh09WEB-INFclassorgeclipsebookch09
中:
webapps
|__ch09
|__WEB-INF
|_ _classes
| |_ _org
| |_ _eclipsebook
| |_ _ch09 Servlet程 序 所 在 的 目 录
程
|_ _lib
为了让 Tomcat 知道这个新类是 Servlet,你要用一个 web.xml 文件,保存该 Web 程序的
配置文件。在 web.xml 文件中,我们用两个 XML 元素 —— <servlet> 和 <servlet-
mapping>把 URL Ch09_02 连接到此 Servlet(org.eclipsebook.ch09.Ch09_02)实
际的 Java 程序。例 9-3 是这个 web.xml 的程序代码。
例 9-3:更新 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>
<display-name>Example Applications</display-name>
<servlet>
<servlet-name>Ch09_02</servlet-name>
<servlet-class>org.eclipsebook.ch09.Ch09_02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch09_02</servlet-name>
<url-pattern>/org.eclipsebook.ch09.Ch09_02</url-pattern>
</servlet-mapping>
</web-app>
现在,选定此项目后点击鼠标右键,选择“New”→“File”选项,要在 Eclipse 环境中
填入以上的 web.xml 内容。在 Eclipse 中打开 web.xml,应点击鼠标右键,选择“Open
With”→“Text Editor”选项(如果你双击该项目,以 Windows 为例,默认的 XML 编
辑器(Internet Explorer)就会打开该文件,除非你安装了像 XMLBuddy 之类的 XML 外
挂程序)。接着,输入例 9-3 的 XML 文件的程序代码,保存该文件,再将之复制到 WEB-
INF 目录下的 Ch09 目录中:
- 8. 202
216 第九章
webapps
|_ _ch09
|_ _WEB-INF 有关第九章 应用程序的信息
有关第九章Web应用程序的信息
|_ _classes
|_ _lib
最后,关掉 Tomcat,重新启动它。我们准备好了,让浏览器连接到 http://localhost:8080/
Ch09/org.eclipsebook.ch09.Ch09_02,应该就能看到如图 9-4 所示的结果。
图 9-4:新完成的 Servlet
还不赖,我们以 Eclipse 开发了一个新的 Servlet。此时,我们还是先开发好程序,再将
之复制到 Tomcat 的目录中,但是,Eclipse 也能替我们处理这些文件的问题。
运用 Eclipse 管理 Servlet 的开发
我们开发的程序必须放到 Tomcat 的目录中才能运行,而利用 Eclipse 替我们把编译好的
程序代码保存到 T o m c a t 的目录中并不困难。要了解其运作过程, 先创建一个新的
Ch09_03 项目。在“New Java Project”对话框中输入项目名称,按“Next”按钮打开
此对话框的第二个窗格。要设定编译好的程序代码默认的输出文件夹,可以点击
“Default output folder”字段旁的“Browse”按钮,打开“Folder Selection”对话框。
点击“Create new folder”按钮,再点击“New Folder”对话框的“Advanced”按钮。
现在,选取“Link to folder in the filesystem”复选框,再点击“Browse”按钮。浏览
到 jakarta-tomcat-4.1.29webappsCh09WEB-INFclasses 目录,也就是编译好的 servlet
的根目录,再点击“OK”按钮,再次打开“New Folder”对话框。在此文件夹中,给
这个新的文件一个名称:output,如图 9-5 所示,再点击“OK”按钮。
- 9. 203
Web 开发 217
图 9-5:建立新的输出文件夹
以此方式设定输出文件夹表示编译后的程序会自动放到classes 文件夹中(或者,就此例
而言,是放到 classesorgeclipsebookch09,其目录结构正好按照我们所用的包名来决
定)。现在,创建一个新的 Ch09_03 类,输入如例 9-4 所示的 Servlet 程序代码。
例 9-4:新的 Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ch09_03 extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
out.println("A Servlet Example");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>");
out.println("Working With Servlets");
out.println("</H1>");
out.println("Developing servlets in place");
out.println("</BODY>");
out.println("</HTML>");
}
}
- 10. 204
218 第九章
最后,如先前那样把 servlet.jar 加进编译路径中。当你编译此项目时,Ch09_03.class 会
自动保存到 Tomcat 的 webappsWEB-INFclassesorgeclipsebookch09 目录中,这也是
它该待的地方。
我们也必须编辑web.xml来安装这个新的Servlet。Eclipse能以一个“链接文件夹” linked
(
folder)来实现。在此例中,我们要链接到 Tomcat 安装目录下的 Ch09/WEB-INF 文件夹,
也就是 web.xml 所在位置。如欲创建链接文件夹,对 Ch09_03 项目按鼠标右键,选择
“New”→“Folder”选项。点击“New Folder”对话框的“Advanced”按钮,再选中
“Link to folder in the filesystem”复选框,然后点击“Browse”按钮,浏览至 jakarta-
tomcat-4.1.29webappsCh09WEB-INF。点击“OK”按钮打开“New Folder”对话框,
在“Folder Name”字段中,输入此新文件夹的名称:WEB-INF,再点击“OK”按钮。
这样就创建了一个名为“WEB-INF”的链接文件夹,然后,你可以在“Package Explorer”
视图中展开路径,并访问此文件夹的内容,包括 web.xml 在内,如图 9-6 所示。
图 9-6:使用链接文件夹
此项目使用的 web.xml 在例 9-5 中。注意,<servlet> 元素必须放在一起,后面再接着
一组 <servlet-mapping>元素。这两种元素不能混合交错,不然 Tomcat 无法分析此文
件,也就无法启动了。
- 11. 205
Web 开发 219
例 9-5: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>
<display-name>Example Applications</display-name>
<servlet>
<servlet-name>Ch09_02</servlet-name>
<servlet-class>org.eclipsebook.ch09.Ch09_02</servlet-class>
</servlet>
<servlet>
<servlet-name>Ch09_03</servlet-name>
<servlet-class>org.eclipsebook.ch09.Ch09_03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch09_02</servlet-name>
<url-pattern>/org.eclipsebook.ch09.Ch09_02</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Ch09_03</servlet-name>
<url-pattern>/org.eclipsebook.ch09.Ch09_03</url-pattern>
</servlet-mapping>
</web-app>
现在,输入 web.xml 的新版内容,再重新启动 Tomcat。Eclipse 会替我们解决文件的问
题,所以我们不用再复制文件到 Tomcat 的目录中了。你要做的就是把浏览器连接到此
Servlet 的 URL:http://localhost:8080/Ch09/org.eclipsebook.ch09.Ch09_03,如图 9-7 所
示。
图 9-7:通过 Eclipse 的管理来开发 Servlet
- 12. 206
220 第九章
渐入佳境了,现在我们完全靠 Eclipse 来开发 Servlet,Eclipse 已经替我们解决了文件的
处理问题了。
开发使用 JavaBean 的 JSP
JSP 文件也能连接到已编译且使用 JavaBean 的 Java 程序。现在你已经知道怎么使用链接
文件夹,所以,开发这些应用程序毫无问题。以下的范例是 Ch09_04 项目。在此例中,
我们让例 9-6 的 bean 类支持一个 msg 属性,返回信息“No worries!”。
例 9-6:使用 JavaBean 的类
package org.eclipsebook.ch09;
public class Ch09_04 {
private String message = "No worries!";
public void setMessage(String msg)
{
this.message = msg;
}
public String getMessage()
{
return this.message;
}
public Ch09_04()
{
}
}
程序编译后会得到 Ch09_04.class(注意,这里不需要把 servlet.jar 放到编译路径中),
应该放进 webappsCh09WEB-INFclasses 目录中,所以,我们要以此目录为输出目录。
输入程序代码后,编译此项目,即产生 Ch09_04.class。
在 JSP 中,可以用各种方式连接此 bean 类的程序,包括在 JSP 的小脚本元素中使用 Java
程序代码来创建 Ch09_04 类的对象。然后,最好的做法是用 JSP <jsp:useBean> 元素
来创建此 JavaBean 对象。然后,再以 <jsp:getProperty>元素取得 bean 对象的属性值,
或者以 <jsp:setProperty> 元素来设定 bean 对象的属性值。例 9-7 是 JSP 的,我们要
读取此 bean 对象的 msg 属性值,将其设定成新值,再读取该新值。
例 9-7:连接 JavaBean 组件
<HTML>
<HEAD>
<TITLE>Setting a Property Value</TITLE>
</HEAD>
- 13. 207
Web 开发 221
<BODY>
<H1>Setting a Property Value</H1>
<jsp:useBean id="bean1" class="org.eclipsebook.ch09.Ch09_04" />
The message is: <jsp:getProperty name="bean1" property="message" />
<BR>
<jsp:setProperty name="bean1" property="message"value="Hello again!" />
Now the message is: <jsp:getProperty name="bean1" property="message" />
</BODY>
</HTML>
这个 JSP 会显示 msg 属性中原本的信息,再设定新值并显示新值。使用链接文件夹将此
新 JSP 文件保存到 webappsCh09 目录,再用浏览器连接到 http://localhost:8080/Ch09/
Ch09_04.jsp,其结果如图 9-8 所示。
图 9-8:连接 JavaBean 元件
此时此刻,我们已经能以 Eclipse 开发在线 Java 程序,并且可以编写、编译并安装到
Tomcat 的目录中。在 Eclipse 以外要做的事就是启动 Tomcat 和中止 Tomcat。结果,现
在连 Tomcat 的启动和中止都能在 Eclipse 环境中来做了。
使用 Sysdeo Tomcat 外挂程序
Sysdeo 外挂程序让你可以在 Eclipse 的环境中启动和中止 Tomcat,我们要在此谈一谈这
个外挂程序。你可以从 http://www.sysdeo.com/eclipse/tomcatPlugin.html 免费下载这个
外挂程序。 plugins目录下将其展开之后, “Windows” “Customize Perspective”
在 选择 →
选项,打开“Other”节点,选取“Tomcat”项目,将之启动,如图 9-9 所示。
- 14. 208
222 第九章
图 9-9:启动 Tomcat 外挂程序
这样会让 Eclipse 多了一个“Tomcat”菜单,如图 9-10 所示,而且新增了三个 Tomcat
按钮到 Eclipse 的工具栏,就在“Navigate”菜单的下方,这些按钮可以启动、中止和重
新启动 Tomcat。
要把这个 Tomcat 外挂程序连接到你正在用的 Tomcat 版本,可以选择“ Window”→
“Preferences”选项,再点击“Tomcat”节点,如图 9-11 所示。
你可以用这个对话框把 Tomcat 外挂程序连接到 Tomcat 本身。本书写作时,Eclipse 2.1.1
的 Sysdeo 外挂程序还在测试阶段,和 4.1.29 版的 Tomcat 无法顺利配合运作,所以下两
个范例要用较早的 Tomcat 版本(你可以从 Apache 的文件库中取得较早版本的 Tomcat:
http://archive.apache.org/dist/jakarta/。Tomcat 4+ 版的文件库在 http://archive.apache.
org/dist/jakarta/tomcat-4/archive/)。当你读到这里时,这个 Tomcat 外挂程序应该可以
和 Tomcat 目前的版本配合运作了,如果还是不行,而且你还是想用这个外挂程序,可
以从 Tomcat 的网站下载较早版本的 Tomcat。
- 15. 209
Web 开发 223
图 9-10:工具栏中新的 Tomcat 按钮
在此对话框中,要设定 Tomcat 所在的位置(“Tomcat home”字段),也就是 Tomcat bin
目录的上层目录(相当于之前谈过的 CATALINA_HOME环境变量) 要设定此位置,
。 可
以点击旁边的“Browse”按钮,浏览到 Tomcat 安装目录,再点击“OK”按钮(这样做
也会自动填写“Configuration file”字段)。点击“OK”按钮,关闭“Preferences”对
话框。
配合 Sysdeo Tomcat 外挂程序来编写 JSP
我们先从 JSP 项目开始使用这个 Tomcat 外挂程序。要创建一个新的 Tomcat 项目,选择
“File”→“New”→“Project”选项,在打开的“New Project”对话框中选择左边选
项框中的“Java”,再选右边的“Tomcat project”,然后点击“Next”按钮。在“New
Tomcat Project”对话框中指定此新项目名为 Ch09_05,点击“OK”按钮。这样会创建
一个新的 Tomcat 项目,内置许多文件夹,如图 9-12 中的“Package Explorer”视图。
要创建新的 JSP 项目,在该项目上点击右键,选择“New”→“File”选项,将此新文
件命名为 Ch09_05.jsp。输入如例 9-8 所示的 JSP 程序代码。然后将其保存,就可以准备
运行了,不再需要把文件复制到正确的目录中。
- 16. 210
224 第九章
图 9-11:把 Tomcat 外挂程序连接到 Tomcat 服务器
图 9-12:建立新的 Tomcat 项目
- 17. 211
Web 开发 225
例 9-8:运用 Sysdeo 外挂程序创建 JSP
<HTML>
<HEAD>
<TITLE>A Web Page</TITLE>
</HEAD>
<BODY>
<H1>Using JSP</H1>
<% out.println("Using a Tomcat plug-in..."); %>
</BODY>
</HTML>
这个 Tomcat 外挂程序可以让你在本地编辑文件,而且借由编辑 Tomcat conf 目录下的
server.xml 文件, Tomcat <Context>元素替你的 JSP 文件设定所属的环境
以 (context)。
就此例而言,下面是这个外挂程序加进 server.xml 中的内容, Tomcat 能知道上哪儿去
让
找我们的 JSP 文件:
<Context path="/Ch09_05" reloadable="true"
docBase="D:eclipse211eclipseworkspaceCh09_05"
workDir="D:eclipse211eclipseworkspaceCh09_05workorgapachejsp"/>
对 server.xml做此修改,意指 Tomcat 可以找到我们的JSP 文件,所以点击“Start Tomcat”
按钮来启动 Tomcat,再把浏览器连接到 http://localhost:8080/Ch09_05/Ch09_05.jsp
(这
里的 URL 含有项目名称 Ch09_05,和前面范例中没有这个外挂程序时所用的 Ch09 目录
不同),你应该可以看到如图 9-13 所示的画面。
图 9-13:利用 Sysdeo 外挂程序建立新的 JSP
注意: 当你运行 Tomcat 时,
“Debug”视图会跑出来。当你运行完此范例之后,记得结束这个调
试过程,并点击“Debug”视图中的“Remove All Terminated Launches”按钮。
- 18. 212
226 第九章
就这样,这个 JSP 在运行了。如你所见,这个 Tomcat 外挂程序让你在 Eclipse 环境内开
发程序,也让你在 Eclipse 环境内启动和中止 Tomcat。
配合 Sysdeo Tomcat 外挂程序来编写 Servlet
Sysdeo 外挂程序也可以协助你编写 Servlet,如例 9-9 所示。到目前为止,我们把保存
Servlet 的输出目录设定在 Tomcat 的目录中,但是这个 Tomcat 外挂程序可以自动处理这
些细节。
例 9-9:利用 Sysdeo 外挂程序创建 Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Ch09_06 extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
out.println("A Web Page");
out.println("</TITLE>");
out.println("</HEAD>"
out.println("<BODY>");
out.println("<H1>");
out.println("Using Servlets");
out.println("</H1>");
out.println("Using a Tomcat plug-in... ");
out.println("</BODY>");
out.println("</HTML>");
}
}
要将其实现,先创建新的 Ch09_06 Tomcat 项目。新增 Ch09_06 类到此项目中,再将此
类置于 org.eclipsebook.ch09 包中。新的类会自动保存在 WEB-INF/src 目录中,如
图 9-14 中的“Package Explorer”视图所示。
一如往常,这个 Tomcat 外挂程序会编辑 Tomcat sever.xml 文件,让 Tomcat 知道该上何
处去找你的文件:
<Context path="/Ch09_06" reloadable="true"
docBase="D:eclipse211eclipseworkspaceCh09_06"
workDir="D:eclipse211eclipseworkspaceCh09_06workorgapachejsp" />
- 19. 213
Web 开发 227
图 9-14:使用 Tomcat 外挂程序的 Servlet 项目
运行此 Servlet 之前,还有一件事要做。这个 Tomcat 外挂程序不会在本地创建 web.xml
文件以告知 Tomcat 该 Ch09_06.class 是 Servlet,那是本章前几例中得做的事。为了让
Tomcat 运行还没有在 web.xml 文件中定义的匿名 Servlet 类,你可以移除 Tomcat conf 目
录中的 web.xml 文件中围绕于 <servlet-mapping> 元素两侧的批注,启用“Tomcat
invoker”Servlet:
<!-- The mapping for the invoker servlet -->
<!--
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
编辑 Tomcat conf 目录下的 web.xml 之后,这个 Servlet 就可以运行了。保存 Ch09_06.java
并编译此项目之后,点击 Tomcat 外挂程序的按钮来启动 Tomcat ,再把浏览器连接到
http://localhost:8080/Ch09_06/servlet/org.eclipsebook.ch09.Ch09_06。你应该可以看见
如图 9-15 所示的结果。恭喜,现在你可以用 Sysdeo Tomcat 外挂程序来开发 Servlet 了。
如果你不想编辑 Tomcat conf 目录下的 web.xml 来启用匿名 Servlet,另一种做法是替每
个用 Tomcat 外挂程序创建的项目都准备一份 web.xml。要这么做的话,可以对“Package
Explorer”视图中的 WEB-INF 文件夹按鼠标右键,选择“New”→“File”选项,输入
如例 9-10 所示的 XML 程序代码。
- 20. 214
228 第九章
图 9-15:运用 Tomcat 外挂程序来执行 Servlet
例 9-10:配合 Sysdeo 外挂程序所用的 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>
<display-name>Example Applications</display-name>
<servlet>
<servlet-name>Ch09_06</servlet-name>
<servlet-class>org.eclipsebook.ch09.Ch09_06</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch09_06</servlet-name>
<url-pattern>/org.eclipsebook.ch09.Ch09_06</url-pattern>
</servlet-mapping>
</web-app>
如果你替每个项目都准备一个像这样的 web.xml 文件,就不用在浏览器连接时所用的
URL 里多加上“servlet”这个词,那么在本范例中,只需连接到 http://localhost:8080/
Ch09_06/org.eclipsebook.ch09.Ch09_06 即可。
Web 项目的调试
这个 Tomcat 外挂程序让你能和 Servlet 的程序代码彼此进行交互式调试。例如,假设你
要在我们刚刚开发的Ch09_06 Servlet的其中一行程序代码中置入一个断点
(breakpoint):
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
- 21. 215
Web 开发 229
out.println("A Web Page");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>");
out.println("Using Servlets");
out.println("</H1>");
out.println("Using a Tomcat plug-in...");
out.println("</BODY>");
out.println("</HTML>");
当你启动 Tomcat 并在浏览器中连接到此 Servlet,那么当到达此断点时,运行就会暂停,
而 Eclipse 调试器会跳出来,如图 9-16 所示。你可以在此断点查看 Servlet 的程序代码,
看看目前发生什么事了。
图 9-16:以交互方式对 Servlet 调试
你也可以对 JSP 调试,但是你只能用转译成 Servlet 程序的 JSP 版本。例如, webapps/
Ch09 目录下的 JSP Ch09_04.jsp 文件在运行前会转译成 Ch09_04_jsp.java 这个 Servlet
文件(名称会随 Tomcat 的版本而异),放在 work/localhost/ch09 目录下(以最新版的
Tomcat 为例,会变成 work/Standalone/localhost/ch09 目录)。这个 Servlet 文件才是你调
试时实际用的文件。
- 22. 216
230 第九章
配置 Web 应用程序
本章最后要谈的内容是配置(deploy)Web 应用程序。这个过程很简单,你所要做的就
是把应用程序做成一个压缩的 WAR 文件( Web Archive file),再将之放进 Tomcat
webapps 目录中。下一次 Tomcat 启动时,就会自动把这个 WAR 文件展开,并配置此应
用程序。
举例而言,我们打算配置例 9-11 的 Servlet。要让 WAR 文件的制作简单一点,可以先创
建新的 Ch09_07 项目,存放在 webapps 目录下的 Ch09_07 目录中。将此项目做成标准的
Java 项目(不是 Tomcat 项目) 要确定你的 Ch09_07 文件夹下有 WEB-INF 目录, WEB-
。 而
INF 目录下又有 classes 和 lib 两个子目录,然后,将 classes 文件夹作为此项目的输出文
件夹。现在,一如往常那样创建我们的 Ch09_07.java,接着输入 Servlet 的程序代码并
编译此项目。
例 9-11:准备要配置的 Servlet
package org.eclipsebook.ch09;
import javax.servlet.http.HttpServlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Ch09_07 extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
out.println("A Web Page");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>");
out.println("Project Deployment!");
out.println("</H1>");
out.println("</BODY>");
out.println("</HTML>");
}
}
- 23. 217
Web 开发 231
此外,也要把例 9-12 的 web.xml 文件加进此项目的 WEB-INF 文件夹下,使得 Tomcat 知
道有这个 S e r v l e t 存在。这样一来,这个 S e r v l e t 就能用了,你可以用浏览器连接到
http://localhost:8080/Ch09_07/org.eclipsebook.ch09.Ch09_07 查看结果。
例 9-12:配置该 Servlet 所用的 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>
<display-name>Example Applications</display-name>
<servlet>
<servlet-name>Ch09_07</servlet-name>
<servlet-class>org.eclipsebook.ch09.Ch09_07</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch09_07</servlet-name>
<url-pattern>/org.eclipsebook.ch09.Ch09_07</url-pattern>
</servlet-mapping>
</web-app>
下一步是将此 Servlet 压缩成 WAR 文件来进行配置。在 Eclipse 中最简单的做法之一是
使用 Ant,如例 9-13 所示的 build.xml 就能办到。这个编译文件会把项目中所有的文件都
压缩成一个 WAR 文件,命名为 Ch09_07war.war。
例 9-13:配置该 Servlet 所用的 build.xml
<?xml version="1.0" encoding = "UTF-8"?>
<project name="Ch09_07" default="Main Build"basedir=".">
<property name="bin"
location="d:/tomcat/jakarta-tomcat-4.1.29/webapps/ch09_07"/>
<property name="wardir"
location="d:/tomcat/jakarta-tomcat-4.1.29/webapps/ch09_07"/>
<property name="warfile"location="${wardir}/Ch09_07war.war"/>
<property name="build.compilers"
value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<target name="Main Build" depends="War">
<echo message="Ant at work!"/>
</target>
<target name="War" >
<jar destfile="${warfile}" basedir="${bin}"/>
</target>
</project>
- 24. 218
232 第九章
要创建 WAR 文件的话,就将此 build.xml 加进此项目中。然后,选定 build.xml 后按鼠标
右键,选择“Run Ant”选项,再点击“Run”按钮即可创建 Ch09_07war.war 这个 WAR
文件。
你可以用这个文件来配置整个 Web 应用程序,只要将其放进 Tomcat webapps 目录,再
重新启动 Tomcat。Tomcat 会从 WAR 文件的文件名找出线索,将此 Web 应用程序安装
在一个名为 Ch09_07war 的目录中(注意,未将它命名为 Ch09_07.war,因为 Tomcat 将
此 WAR 文件展开时,会重写现存的 Ch09_07 目录)。
当此应用程序已配置完成,并由 Tomcat 依上述方式安装完毕后,你就可以用浏览器连
接到 http://localhost:8080/Ch09_07war/org.eclipsebook.ch09.Ch09_07 来运行了,如图
9-17 所示。这样这个 Servlet 就已经完成配置了。
图 9-17:配置项目
以上就是本章讨论 Eclipse 和 Web 开发的有关内容。如你所见,使用 Eclipse 来开发 Web
应用程序可说是相当轻松的。开发 JSP、开发 Servlet、设置文件、启动和中止 Tomcat、
创建 Web 配置包等,这些任务 Eclipse 都能一手包办。