3.4.3 Java

Java诞生于1995年,由Sun Microsystems公司创造。它不仅是一种通用编程语言,更是一套平台体系(包括JVM,即Java虚拟机在内)。Java的应用领域相当广泛,不只是服务器编程,它还是Android系统的主要编程语言。本文主要讨论它在服务器端的应用。

关于Java语言本身,有很多在线教程以及出版物可供参考。作者在此推荐 Cay S. Horstmann的《Core Java for the Impatient》——Horstmann的Core Java系列一直是Java学习的经典,内容翔实、厚重;这本书是Core Java的瘦身版,专为缺乏耐心的读者而写。

Java在服务器端编程主要通过Servlet实现。以下是一个Servlet版的“Hello, world”:

package mypackage;

import java.io.*;
import javax.servlet.*;

public class Hello extends GenericServlet {
  public void service(final ServletRequest request, final ServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    final PrintWriter pw = response.getWriter();
    try {
      pw.println("<p>Hello, Servlet!</p>");
    } finally {
      pw.close();
    }
  }
}

通过实现javax.servlet.Servlet接口,我们就建立了一个Servlet。GenericServlet抽象类实现了该接口的大部分方法,我们只需实现service方法来响应请求即可。在这里我们简单输出了一段(不完整的)HTML:

<p>Hello, Servlet!</p>

并且手工设置了应答头(response header)“Content-Type”的值为“text/html”。

要运行Servlet程序,你需要一个Servlet容器(container)。Servlet容器可以理解为一个Java Sevelet专用的Web服务器——这与Apache和Nginx等“通用”的Web服务器很不一样:后者可以为PHP、Python、Ruby等等服务器编程语言所用,而前者只服务于Java Servlet。

这里列出了一些开源/商业的Servlet容器:https://en.wikipedia.org/wiki/Web_containerTomcat是其中比较流行的一个开源产品。请读者根据它的文档建立一个Servlet运行环境,实际运行一下上面的示例。

需要说明的是,与PHP等动态语言不同,Java程序需要编译,例如,Hello.java要编译为Hello.class才能被执行。另外,按照Servlet的规范,程序的目录结构必须符合一定的要求1。以上面的Hello, world程序为例,一个最小的目录结构如下:

.
└── WEB-INF
    ├── classes
    │   └── mypackage
    │       └── Hello.class
    └── web.xml

其中的web.xml文件叫做Web应用部署描述符(Web Application Deployment Descriptor)。我们的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">

    <display-name>Hello Servlet</display-name>
    <description>
      This is a simple "Hello, world" program.
    </description>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>mypackage.Hello</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

其中,servlet-mapping把我们的HelloServlet对应到URL“/hello”。当这个URL被访问时,HelloServlet就会做出应答。

Servlet作为一种底层的基础接口,很少在Web开发中直接使用——人们往往使用一些高级的编程框架来解决问题,比如流行的Spring。但了解那些基础的原理对于高级的编程是十分有益的。

1. 这个文档对目录结构做了更多说明:http://tomcat.apache.org/tomcat-8.0-doc/appdev/deployment.html

results matching ""

    No results matching ""