Java Web Servlet Basic

什么是 Servlet

我们在网上浏览网页,需要一个 web 服务器,浏览网页的过程就是浏览器通过 HTTP 协议与 WEB 服务器 交互的过程。
在过去,大多是静态网页,因此只须把资源放在 WEB 服务器上即可。如今随着应用的发展,客户与服务器需要动态的交互,为了实现这一目标,就需 要开发一个遵循 HTTP 协议的服务器端应用软件,来处理各种请求。
那么 servlet 是一个基于 java 技术的 WEB 组件,运行在服务器端,我们利用 sevlet 可以很轻松的扩展 WEB 服务器的功能,使它满足特定的应用需要。
servlet 由 servlet 容器管理,servlet 容器也叫 servlet 引擎,是 servlet 的运行环境,给发送的请求和响应之上提供网络服务。比如 tomcat 就是我们常用的一个 servlet 容器,其接受 客户端并做出响应的步骤如下:

  1. 客户端发送请求至服务器端;

  2. 服务器将请求信息发送至 Servlet;

  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

  4. 服务器将响应返回给客户端。

最简单的 Servlet 结构

Servlet 结构

servlet-api.jar

运行 Servlet 服务的基础包

web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<web-app>
<!-- filters -->
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>demo.HelloFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- servlets -->
<servlet>
<servlet-name>hello_world</servlet-name>
<servlet-class>demo.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>hello_world</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

HelloFilter.java

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
26
27
28
29
30
31
32
33
34
package demo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class HelloFilter implements Filter {

@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter 初始化");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {

HttpServletRequest request = (HttpServletRequest) req;
System.out.println("拦截 URI=" + request.getRequestURI());
chain.doFilter(req, res);

}

@Override
public void destroy() {
System.out.println("Filter 结束");
}
}

HelloServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

res.getWriter().println("Hello World! reqUrl=" + req.getRequestURI());
}

}

运行结果

  • 页面

  • 控制台

……… 省略
Filter 初始化
三月 19, 2015 11:43:35 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“http-nio-8080”]
三月 19, 2015 11:43:35 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler [“ajp-nio-8009”]
三月 19, 2015 11:43:35 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1458 ms
拦截 URI=/corning.test.servlet_basic/
拦截 URI=/corning.test.servlet_basic/hello