SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
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
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。
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>
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 正在运行,先关掉,再重新启动。
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
{
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 加进编译路
      径中。
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 目录中:
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”按钮。
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>");
    }
}
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 无法分析此文
      件,也就无法启动了。
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
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>
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 所示。
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。
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 程序代码。然后将其保存,就可以准备
运行了,不再需要把文件复制到正确的目录中。
210
      224                                  第九章




      图 9-11:把 Tomcat 外挂程序连接到 Tomcat 服务器




      图 9-12:建立新的 Tomcat 项目
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”按钮。
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" />
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 程序代码。
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>");
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 文件才是你调
试时实际用的文件。
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>");
            }
      }
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>
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 都能一手包办。

Más contenido relacionado

La actualidad más candente

Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend frameworkthinkinlamp
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训Cody Zhang
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南Shengyou Fan
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型裕波 周
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定Shengyou Fan
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯Hash Lin
 
Maven私服安装,Maven使用教程
Maven私服安装,Maven使用教程Maven私服安装,Maven使用教程
Maven私服安装,Maven使用教程kangzj
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5lovingprince58
 
Apache服务器配置全攻略
Apache服务器配置全攻略Apache服务器配置全攻略
Apache服务器配置全攻略Yiwei Ma
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Justin Lin
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Railsshaokun
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析wavefly
 

La actualidad más candente (18)

Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend framework
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
Phalcon the fastest php framework 阿土伯
Phalcon   the fastest php framework 阿土伯Phalcon   the fastest php framework 阿土伯
Phalcon the fastest php framework 阿土伯
 
Maven私服安装,Maven使用教程
Maven私服安装,Maven使用教程Maven私服安装,Maven使用教程
Maven私服安装,Maven使用教程
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5
 
Apache服务器配置全攻略
Apache服务器配置全攻略Apache服务器配置全攻略
Apache服务器配置全攻略
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
OSGi Small Lab
OSGi Small LabOSGi Small Lab
OSGi Small Lab
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
Rest Ruby On Rails
Rest Ruby On RailsRest Ruby On Rails
Rest Ruby On Rails
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析
 

Similar a test

Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 
用Maven管理專案的依賴關係
用Maven管理專案的依賴關係用Maven管理專案的依賴關係
用Maven管理專案的依賴關係Huang Bruce
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門Luo Korth
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南yiditushe
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletJustin Lin
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)xzdbd
 
Selenium介绍
Selenium介绍Selenium介绍
Selenium介绍lory hou
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程yiditushe
 
2009 / 11 / 25 meeting 用
2009 / 11 / 25 meeting 用2009 / 11 / 25 meeting 用
2009 / 11 / 25 meeting 用Che-Hsien Lin
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 

Similar a test (20)

Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
用Maven管理專案的依賴關係
用Maven管理專案的依賴關係用Maven管理專案的依賴關係
用Maven管理專案的依賴關係
 
Eclipse開發平台快速入門
Eclipse開發平台快速入門Eclipse開發平台快速入門
Eclipse開發平台快速入門
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Struts快速学习指南
Struts快速学习指南Struts快速学习指南
Struts快速学习指南
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
四天学会Ajax
四天学会Ajax四天学会Ajax
四天学会Ajax
 
RESTful
RESTfulRESTful
RESTful
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 ServletServlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
 
Java 1(Java概述)
Java 1(Java概述)Java 1(Java概述)
Java 1(Java概述)
 
Selenium介绍
Selenium介绍Selenium介绍
Selenium介绍
 
Java Web动态图表编程
Java Web动态图表编程Java Web动态图表编程
Java Web动态图表编程
 
2009 / 11 / 25 meeting 用
2009 / 11 / 25 meeting 用2009 / 11 / 25 meeting 用
2009 / 11 / 25 meeting 用
 
xcvx
xcvxxcvx
xcvx
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
Js培训
Js培训Js培训
Js培训
 

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 都能一手包办。