循序渐进写一个 Servlet (2) - 第一个 servlet

Servlet(Server Applet),全称 Java Servlet,是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。本系列将一步步地写出一个 Servlet 程序。

这篇博文将演示如何创建一个 servlet。

新建项目

首先,使用 Maven 的 maven-archetype-webapp 创建一个 Java Webapp 项目。这样就可以得到一个 Java Webapp 项目的基本骨架。将项目命名为 servletdemo

创建 Servlet 对象

新建一个名为 DemoServlet 的类。

因为 GenericServlet 已经实现了一个 servlet 的生命周期方法,而且这里也不需要对生命周期方法做定制化,所以直接继承一个 GenericServlet 就可以。

1
2
3
4
5
6
7
public class DemoServlet extends GenericServlet {

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

}
}

实现这个 servlet 的功能

service() 方法定义了这个 servlet 的具体实现,这里先让它返回一个 HTML。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

// 设定返回内容的MIME类型
res.setContentType("text/html");

// 设定内容以UTF-8编码
res.setCharacterEncoding("utf-8");

// Java 8 新特性 - try with resources
// 该特性优点在于,try代码块执行完毕后,会自动close相关资源
// 要求资源所属的类必须实现了 AutoCloseable 或 Closeable 接口
try (PrintWriter writer = res.getWriter()) {
// 开始输出HTML文本
writer.print("<html lang=\"en\">");
writer.print("<body>");
writer.print("<b>Response from DemoServlet</b>");
writer.print("</body>");
writer.print("</html>");
}
}

注册到容器

光有 servlet 还不够,下面还需要让容器知道有这个 servlet,以及知道要把哪些请求发往这个 servlet。这里可以通过修改 web.xml 的方式,也可以通过注解的方式完成注册。

web.xml

web.xml 位于 src/main/webapp/WEB_INF/web.xml

向其中添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- servlet属性定义了一个servlet的名字和对应的类 -->
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.boris.tomcatlistener.servlet.DemoServlet</servlet-class>
</servlet>

<!-- servlet-mapping属性定义了匹配某个URL的请求应该发往哪个servlet -->
<servlet-mapping>
<!-- 目标servlet的servlet-name -->
<servlet-name>DemoServlet</servlet-name>
<!-- 匹配的URL -->
<url-pattern>/demoServlet</url-pattern>
</servlet-mapping>

注解

WebServlet(String value) 注解表明了这个类是一个 servlet,其中 value 的值等同于 web.xmlurl-patterm 参数。

在项目部署时,容器会处理 WebServlet 注解,并将这个 servlet 与指定的 URL pattern 绑定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@WebServlet(value = "/demoServlet")
public class DemoServlet extends GenericServlet {

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

// 设定返回内容的MIME类型
res.setContentType("text/html");

// 设定内容以UTF-8编码
res.setCharacterEncoding("utf-8");

// Java 8 新特性 - try with resources
// 该特性优点在于,try代码块执行完毕后,会自动close相关资源
// 要求资源所属的类必须实现了 AutoCloseable 或 Closeable 接口
try (PrintWriter writer = res.getWriter()) {
// 开始输出HTML文本
writer.print("<html lang=\"en\">");
writer.print("<body>");
writer.print("<b>Response from DemoServlet</b>");
writer.print("</body>");
writer.print("</html>");
}
}
}

运行起来吧,servlet 哟!

在上面步骤中,创建一个 servlet 的所有步骤就完成了,尽管这个 servlet 的功能及其有限,它甚至不能区分发来的 HTTP 请求。

那么,就将这个 servlet 部署到容器中,让它开始工作吧。启动成功后,使用浏览器,或者 HTTP 请求构造工具,向 http://localhost:8080/servletdemo/DemoServlet(假设 Tomcat 在监听 8080 端口)发一条请求。

如果一切正常的话,就可以看到服务器返回了上面 service() 方法中指定的内容。

系列博文