Tomcat了解

368 阅读8分钟

Tomcat 是什么?

Tomcat 是来自 Apache Software Foundation 的开源服务器。它是一个 Web 应用服务器,这说明它支持 JavaServer Pages (JSP) 和 servlet 进行编程。Tomcat 服务器是一个学习 JSP、servlet 和 Web 服务的的优秀平台。

自 2000 年初期,Tomcat 一直担当着最新的 Java Servlet 和 JSP 规范的参考实现。Tomcat 5.5 是编写本教程时的最新版本,支持最新的 Java Servlet 2.4 和 JavaServer Pages 2.0 标准(参见 参考资料)。Tomcat 还包括一个受限的 Web 服务器,该服务器以独立模式(默认情况下)执行时能服务于静态网页。

由于有多种开源库和扩展,因此 Tomcat 支持:

  • 使用 Apache Axis servlet 的 Web 服务
  • 开发框架,如 Apache Struts
  • 模板引擎,如 Apache Jakarta Velocity
  • 对象关系映射技术,如 Hibernate

Tomcat上部署JSP应用程序

JSP简介

JSP 是一种流行的脚本和模板语言,用于创建服务器端 Java 应用程序的表示层。通常,JSP 与动态用户界面一起用于网页。它可以动态地生成 HTML、XML、级联样式表(Cascading Style Sheets,CSS)、JavaScript 以及任何客户端表示内容。最新的广泛实现的 JSP 版本是 2.0,基于 Java 规范要求(Java Specification Request,JSR)152(参见 参考资料)。

JSP 内建了访问 JavaBean 的能力。在生产应用程序中,JavaBean 通常用于在应用程序逻辑(使用 servlet 和其他组件实现)和 JSP 中传递数据值。JSP 代码的主要职责是显示 JavaBean 中包含的值。

JSP 频繁使用的一个标记库是 JSP 标准标记库(JSP Standard Tag Library,JSTL)。JSTL 在 JSR 52 中定义(参见 参考资料),它包含一个大型的标记库,可与 JSP 中的 EL 联合使用。JSTL 的最新版本(到 2005 年 10 月为止)是 1.1。

与 Java 程序不同,JSP 程序不需要进行预编译。Tomcat 在 JSP 首次执行时对它进行编译,并保留一份编译的二进制文件副本,用于后续执行。这能够加快开发和测试周期。

对于早期的 JSP 版本(2.0 之前),如果不求助于嵌入式 Java 编码,则很难编写一般的应用程序逻辑。事实上,2.0 之前的 JSP 版本允许并鼓励使用混合 Java/JSP 编码。该实践通常会创建混乱和难以维护的代码。

从 JSP 2.0 开始,因为支持 EL 和 JSTL,所以 JSP 程序中不再需要 Java 代码。建议所有新的 JSP 开发人员不要将嵌入式 Java 代码与 JSP 混用。此方法通常称为无脚本 JSP。

JSP 语言的基本元素如下:

  • 指令
  • 标准动作
  • 表达式语言(Expression Language,EL)
  • 自定义标记库
  • JavaBean

一个简单 JSP 程序

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="timeNow" class="java.util.Date" />
 
<html>
<head>
<title>developerWorks Tomcat Tutorial</title>
<link rel=stylesheet type="text/css" href="specials.css">
</head>
<body>
<table width="600">
  <tr>
    <td class="mainHead" colspan="9">
      <h1>Today is 
         <fmt:formatDate value="${timeNow}"
         type="date" dateStyle="long" /></h1>
    </td>
  </tr>
  <tr>
    <c:forEach var="i" begin="1" end="9" step="1">
      <th>${i}x</th>
    </c:forEach>
  </tr>
    <c:forEach var="row" begin="1" end="9" step="1">
      <tr>
      <c:forEach var="col" begin="1" end="9" step="1">
        <td><c:out value="${row * col}" /></td>
      </c:forEach>
      </tr>
    </c:forEach>
</table>
</body>
</html>

该程序中一些要注意的 JSP 技术包括:

  • < %@taglib > 指令,用于包含 JSTL 的核心和格式化组件,并将它们的标记分别与名称空间前缀 c: 和 fmt: 关联。
  • jsp:useBean 标准动作将 java.util.Date 类的一个实例实例化为一个 JavaBean,表示当前时间。
  • 在 ${timeNow} 表达式中使用 EL,表示 java.util.Date 的 JavaBean 实例,以输出当前的月和日。
  • 使用 JSTL 中的日期格式化库标记来格式化日期值。
  • 使用 JSTL 中的 <c:forEach> 标记创建输出乘法表的循环。
  • 将静态 HTML 内容与 JSP 生成动态内容混合。

准备在 Tomcat 上运行 JSP 应用程序

通常需要按照以下步骤操作:

  • 创建 JSP 应用程序。如果只使用一个页面,则称它为 index.jsp,就像在示例程序中所做的 一样。
  • 创建一个部署描述符(一个 web.xml 文件)并将它放在 WEB-INF 目录中。
  • 将 JSTL 库复制到 WEB-INF/lib 目录。
  • 使用 JDK 中的 JAR 工具将所有代码捆绑成一个 Web 应用程序归档 (WAR) 文件,用于部署。
  • 使用 Tomcat Web 应用程序管理器部署和运行 WAR 文件。

WAR 文件是一个标准 Java 企业版(Java Enterprise Edition,Java EE)部署单元。它是一种格式非常特殊的 JAR 文件,文件扩展名为 .war。 在此 WAR 文件中,必须已经部署了一个名为 web.xml 的部署描述符文件,其中包含一些指令告诉服务器如何部署 WAR 内容。

对于该示例程序,web.xml 文件(参见清单 2)的作用不大,因为应用程序只包含一个 JSP 页面:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
 
    <description>
   developerWorks Beginning Tomcat Tutorial
    </description>
    <display-name>IBM developerWorks Beginning Tomcat Tutorial
    </display-name>
</web-app>

示例中的 web.xml 文件只为 Tomcat 提供描述和显示名称,这些内容稍后将被 Tomcat 应用程序管理器使用。

使用 Tomcat 进行 servlet 部署

servlet 简介

Servlet 是服务器端 Java 代码,在 servlet 容器(如 Tomcat 服务器)的控制下执行。Servlet 与 JSP 一样,接受传入请求,进行处理或转换,然后生成传出响应。因为 servlet 实际上是 Java 代码,所以可以任意使用 Java 编程语言的功能和灵活性来创建服务器端逻辑。

所有 servlet 都会直接或间接通过实现 javax.servlet.Servlet 接口的辅助类来实现该接口。Servlet 还可以使用容器提供的 API 公开容器服务。例如,servlet 可以从容器获得数据库连接来访问关系数据库。

Servlet 通常用于实现 Web 应用程序逻辑。Servlet 可以获取和处理数据,然后将数据传递给 JSP 进行显示(例如,动态生成用户界面)。Servlet 还可用于频繁地处理通过基于 Web 形式提交的数据。

生成菜单特价项的 Servlet 示例

本例演示 Web 应用程序中的一种典型模式:

  1. 一个 servlet 接受来自用户的传入请求。
  2. 该 servlet 根据传入请求进行处理。
  3. 该 servlet 使用作为属性附加的数据将请求分派给一个 JSP。
  4. JSP 生成一个动态响应来显示数据。
package com.ibm.dw.tutorial.tomcat;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
 
public class SpecialsServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response) 
       throws ServletException, IOException {
         ServletContext context = getServletContext();
         request.setAttribute("specials", getSpecials());
        context.getRequestDispatcher("/showspecials.jsp")
            .forward(request, response);
        }   
    protected void doPost(HttpServletRequest request, 
       HttpServletResponse response) 
             throws ServletException, IOException {
              doGet(request, response);
        }    
    private List getSpecials() {
         List retval = new Vector();
         retval.add(new Special("Coq au Vin", 15));
         retval.add(new Special("Pad Thai", 10));
         retval.add(new Special("Lobster Thermador", 10));
         retval.add(new Special("Baked Alaska", 8));
         return retval;
    }
    public class Special {
         int price;
         String menuItem;
         public Special(String item, int inPrice)  {
              menuItem = item;
              price = inPrice;
         }
         public int getPrice() {
              return price;
         }
         public String getMenuItem() {
              return menuItem;
         }     
     }
    }

清单 4 中的 servlet 代码:

  1. 声明一个名为 Special 的内部类来保存菜单特价项。
  2. 在名为 getSpecials() 的方法中创建特价项项列表。
  3. 在 doGet() 方法(Tomcat 调用该方法来处理传入 HTTP 请求)中,将特价项列表作为名为 specials 的属性附加到 request。
  4. 将请求转发给 showspecials.jsp 进行显示。

显示当日特价项的 JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<jsp:useBean id="timeNow" class="java.util.Date" />
<%@ page session="true"%>
<html>
<head>
<title>developerWorks Tomcat Tutorial</title>
<link rel=stylesheet type="text/css" href="specials.css">
</head>
<body>
<table width="600">
     <tr>
          <td class="mainHead" colspan="2">
          Today's specials for 
          <fmt:formatDate value="${timeNow}" type="date"
               dateStyle="long" />
          </td>
     </tr>
     <tr>
      <th>Specialty</th>
      <th>Price</th>
     </tr>
     <c:forEach var="special" items="${specials}">
          <tr>
            <td>${special.menuItem}</td>
            <td>\?{special.price}</td>
          </tr>
     </c:forEach>
</table>
</body>
</html>

示例使用的技术:

  • JSTL 日期格式化标记格式化一个 java.util.Date JavaBean 实例。
  • <c:forEach> JSTL 循环标记迭代 specials 的 List 属性(通过 SpecialServlet 附加到 request 对象)。
  • EL 表达式显示特价项的值。

将 servlet 部署到 Tomcat

Servlet 存在于 Web 应用程序中,方式与 JSP 的相同。在将 JSP 和 servlet 部署到 Tomcat 之前,需要将应用程序包装成一个 WAR 文件。将应用程序中 servlet 的类放在 WEB-INF/类子目录下。

web.xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
     version="2.4">
 
     <description>developerWorks Beginning Tomcat Tutorial
      </description>
     <display-name>
          IBM developerWorks Beginning Tomcat Tutorial Step 2
     </display-name>
 
     <servlet>
          <servlet-name>Specials</servlet-name>
          <servlet-class>
               com.ibm.dw.tutorial.tomcat.SpecialsServlet
          </servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>Specials</servlet-name>
          <url-pattern>/showspecials.cgi</url-pattern>
     </servlet-mapping>
 
</web-app>

该部署描述符包含一个 元素,告诉 Tomcat 有关 servlet 实现类的信息。 元素告诉服务器应该将发往 showspecials.cgi 的请求传递给 servlet。

编译 servlet 后,才能创建 WAR 文件。因为 servlet 是 Java 代码,所以在部署 servlet 之前必须对它们进行编译。为此,可以使用代码分发版(参见 下载)中的 compile.bat 批处理文件。但是,需要修改它来指向您自己的 Tomcat 目录,因为来自 Tomcat common/lib 目录的 servlet-api.jar 包含编译 servlet 所需的一些接口和辅助类。

使用 Tomcat 探索 Web 服务开发

Web 服务简介

Web 服务是服务器端代码组件,可以公开其功能以使用标准 HTTP 协议访问 TCP/IP 网络。这种公开允许 Web 服务用户(称为消费者)使用大多数网络连接上的 Web 服务 -- 甚至能穿越防火墙。

Web 服务处理传入请求并生成响应。这正是 servlet 所做的工作,所以自然要使用 servlet 实现 Web 服务。

Web 服务正日益流行,因为它们可以有效地用于 B2B 或 B2C 接口。它们允许通过 Internet 发送请求和接收响应。任何能访问网站的用户都可以访问 Web 服务。例如,eBay 和 Amazon.com 都为其合作伙伴和用户提供了 Web 服务。

Web 服务依赖于在消费者和服务之间传递基于 XML 的消息。此消息被包装并按照简单对象访问协议(Simple Object Access Protocol,SOAP)发送。