多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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.")