# Java Servlet 教程

> 原文： [http://zetcode.com/articles/javaservlet/](http://zetcode.com/articles/javaservlet/)

Java Servlets 教程展示了如何在 Java 中创建简单的 servlet。 我们使用 Java 注解和 XML 文件创建 servlet。

## Java Servlet

Servlet 是响应网络请求的 Java 类。 这主要是一个 HTTP 请求。 Java servlet 用于创建 Web 应用。 它们在 servlet 容器（例如 Tomcat 或 Jetty）中运行。 现代 Java Web 开发使用在 servlet 之上构建的框架。 例如，Spring 或 Vaadin 框架使用 servlet。

`javax.servlet`和`javax.servlet.http`包提供用于编写 ​​servlet 的接口和类。

```java
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

```

这些示例使用此 Maven 依赖项。 `javax.servlet-api`提供 Servlet API。 `provided`范围使依赖项在编译时可用，并指示它在运行时已可用。 包含在 Servlet 容器（Tomcat，Jetty）中。

## Java Servlet 注解示例

在下面的示例中，我们使用`@WebServlet`批注创建 Java Servlet。 从 Servlet 3.0 规范开始可以使用`@WebServlet`批注。 注解在部署时由容器处理。

```java
$ tree
.
├── nb-configuration.xml
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── zetcode
    │   │           └── web
    │   │               └── MyServlet.java
    │   ├── resources
    │   └── webapp
    │       ├── index.html
    │       ├── META-INF
    │       │   └── context.xml
    │       └── WEB-INF
    └── test
        └── java

```

这是项目结构。

`context.xml`

```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletAnnotation"/>

```

在 Tomcat `context.xml`文件中，我们定义了上下文路径。 它是 Web 应用的名称。

`MyServlet.java`

```java
package com.zetcode.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "MyServlet", urlPatterns = {"/MyServlet"})
public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/plain;charset=UTF-8");

        ServletOutputStream out = response.getOutputStream();

        out.print("This is MyServlet");
    }
}

```

`MyServlet` Servlet 将一条简单的文本消息返回给客户端。

```java
@WebServlet(name = "MyServlet", urlPatterns = {"/MyServlet"})

```

Java 类用`@WebServlet`注解修饰。 它映射到`MyServlet` URL 模式。

```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

```

GET 请求调用`doGet()`方法。 该方法接收`HttpServletRequest`和`HttpServletResponse`对象。

```java
response.setContentType("text/html;charset=UTF-8");

```

Servlet 将以纯文本格式输出数据，并且数据的编码设置为 UTF-8。

```java
ServletOutputStream out = response.getOutputStream();

```

通过`getOutputStream()`方法，我们获得了 servlet 输出流。

```java
out.print("This is MyServlet");

```

我们使用`print()`方法编写一条短信。

`index.html`

```java
<!DOCTYPE html>
<html>
    <head>
        <title>Home page</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <a href="MyServlet">Call MyServlet</a>
    </body>
</html>

```

在主页中，我们有一个调用 servlet 的链接。

## Java Servlet XML 示例

在第二个示例中，我们在`web.xml`部署描述符中定义了两个 servlet。 在 Servlet 3.0 规范之前，这是定义 Java Servlet 的唯一方法。

```java
$ tree
.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── zetcode
    │   │           └── web
    │   │               ├── FirstServlet.java
    │   │               └── SecondServlet.java
    │   └── webapp
    │       ├── index.html
    │       ├── META-INF
    │       │   └── context.xml
    │       └── WEB-INF
    │           └── web.xml
    └── test
        └── java

```

这是项目结构。

`context.xml`

```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletXML"/>

```

我们定义上下文路径。

`web.xml`

```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>com.zetcode.web.FirstServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>com.zetcode.web.SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/FirstServlet</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/SecondServlet</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

</web-app>

```

在`web.xml`文件中，我们定义了两个 Servlet：`FirstServlet`和`SecondServlet`。 `web.xml`位于`WEB-INF`目录中。

```java
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.zetcode.web.FirstServlet</servlet-class>
</servlet>

```

我们定义名称和 servlet 类。

```java
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

```

我们将 servlet 映射到 URL 模式。

`FirstServlet.java`

```java
package com.zetcode.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/plain;charset=UTF-8");

        ServletOutputStream out = response.getOutputStream();

        out.print("This is First Servlet");
    }
}

```

这是第一个 servlet。

`SecondServlet.java`

```java
package com.zetcode.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SecondServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/plain;charset=UTF-8");

        ServletOutputStream out = response.getOutputStream();

        out.print("This is Second Servlet");
    }
}

```

这是第二个 servlet。

`index.html`

```java
<!DOCTYPE html>
<html>
    <head>
        <title>Home page</title>
        <meta charset="UTF-8">
    </head>
    <body>

        <p>
            Call <a href="FirstServlet">First Servlet</a>
        </p>

        <p>
            Call <a href="SecondServlet">Second Servlet</a>
        </p>    

    </body>
</html>

```

在主页中，我们有两个链接来调用两个 servlet。

在本教程中，我们展示了如何创建简单的 Java Servlet。

您可能也对以下相关教程感兴趣： [Java Servlet 上传文件](/articles/javaservletuploadfile/)， [Java Log4j 教程](/java/log4j/)， [Java Servlet RESTful 客户端](/articles/javaservletrestclient/)， [Java `RequestDispatcher`](/java/requestdispatcher/) ，[从 Java servlet 提供纯文本](/articles/javaservlettext/) ， [Java servlet 图像教程](/articles/javaservletimage/)或 [Java 教程](/lang/java/)。