# 3.4.3 Java
### 3.4.3 Java
Java诞生于1995年,由Sun Microsystems公司创造。它不仅是一种通用编程语言,更是一套平台体系(包括JVM,即Java虚拟机在内)。Java的应用领域相当广泛,不只是服务器编程,它还是Android系统的主要编程语言。本文主要讨论它在服务器端的应用。
关于Java语言本身,有很多在线教程以及出版物可供参考。作者在此推荐 Cay S. Horstmann的[《Core Java for the Impatient》](https://www.amazon.com/Core-Java-Impatient-Cay-Horstmann/dp/0321996321)——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](http://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html)接口,我们就建立了一个Servlet。[GenericServlet](http://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html)抽象类实现了该接口的大部分方法,我们只需实现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](https://en.wikipedia.org/wiki/Web_container)。[Tomcat](http://tomcat.apache.org/)是其中比较流行的一个开源产品。请读者根据它的文档建立一个Servlet运行环境,实际运行一下上面的示例。
需要说明的是,与PHP等动态语言不同,Java程序需要编译,例如,Hello.java要编译为Hello.class才能被执行。另外,按照Servlet的规范,程序的目录结构必须符合一定的要求[1](#fn_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](https://spring.io/)。但了解那些基础的原理对于高级的编程是十分有益的。
> 1. 这个文档对目录结构做了更多说明:<http://tomcat.apache.org/tomcat-8.0-doc/appdev/deployment.html>[↩](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超链接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客户端请求
- 1.5.2 服务器应答
- 1.5.3 进一步了解HTTP
- 1.6 HTTPS
- 2 Web浏览器
- 2.1 HTML
- 2.1.1 文档类型声明
- 2.1.2 标签和属性
- 2.1.3 文档结构
- 2.1.4 DOM
- 2.1.5 进一步了解HTML
- 2.2 CSS
- 2.2.1 样式与样式表
- 2.2.2 样式表语法
- 2.2.3 级联样式表
- 2.2.4 进一步了解CSS
- 2.3 JavaScript
- 2.3.1 script标签
- 2.3.2 操纵DOM
- 2.3.3 jQuery
- 2.3.4 进一步了解JavaScript
- 2.4 Ajax
- 2.5 移动设备与响应式Web设计
- 3 Web服务器
- 3.1 方法与资源
- 3.2 状态代码
- 3.3 静态内容与动态内容
- 3.4 编程语言与技术
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服务器架构
- 3.7 Web缓存
- 3.8 服务器推送
- 4 数据库
- 4.1 关系型数据库
- 4.2 NoSQL数据库
- 5 Web服务器的其他组件
- 5.1 Cron
- 5.2 消息队列
- 5.3 邮件服务器
- 6 开发工具与技术
- 6.1 Git
- 6.1.1 Git基础操作
- 6.1.2 Git基本原理
- 6.1.3 进一步了解Git
- 6.2 敏捷开发