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_container。Tomcat是其中比较流行的一个开源产品。请读者根据它的文档建立一个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 ↩