# 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 敏捷開發