Servlet

简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:

  • 性能明显更好。
  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
  • Servlet 是独立于平台的,因为它们是用 Java 编写的。
  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

使用

1 导入依赖

1
2
3
4
5
6
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

一定要加上标签,并且设置为provided。因为在tomcat中,已经内置了该依赖包。如果在生成war包中添加jar,会和tomcat中的jar包发生冲突。

2 实现Servlet接口

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
package tk.wian;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo1 implements Servlet {

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello world");
}
public void init(ServletConfig servletConfig) throws ServletException {

}

public ServletConfig getServletConfig() {
return null;
}

public String getServletInfo() {
return null;
}

public void destroy() {

}
}

3 配置访问路径

只需在类的上面使用@WebServlet注解即可,格式如下:

1
@WebServlet("/demo")     //访问路径必须在前面加上斜杠

4 访问

打开浏览器输入对应的url。如上面的url为:

1
http://localhost:8080/select-demo/demo1
  • localhost:8080:本地8080端口。tomcat默认端口
  • select-demo:模块名
  • demo1:@WebServlet指定的路径

生命周期

对象的生命周期指一个对象从被创建到被销毁的整个过程。而Servlet的生命周期主要是下面四步:

  1. 加载和实例化

    默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

    但是我们可以使用设置WebServlet中的loadOnStarcancan参数,让服务器启动时,便加载和实例化:

    @WebServlet(urlPatterns = “/demo1”,loadOnStartup = 1)
    loadOnstartup的取值有两类情况
    (1)负整数:第一次访问时创建Servlet对象
    (2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高

  2. 初始化

    在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次

  3. 请求处理

    每次请求Servlet时,Servlet容器都会调用Servlet的ervice()方法对请求进行处理

  4. 服务终止

    当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。此方法也只调用一次

体系结构

我们都是针对Http协议开发项目的。所以有一个类HttpServlet间接实现了Servlet接口,让我们的开发效率进一步提升。

HttpServlet是实现了GenericServlet接口,而GenericServlet接口继承了Serclet接口,所以说HttpServlet间接实现了Servlet接口。

在HttpServlet中提供了很多方法,但是我们主要使用**doPost()doGet()**方法分别处理post请求和get请求。

urlPattern配置

1 多配置

一个类可以配置多个访问路径。

1
@WebServlet(urlpattern={"/demo1","/dem01"})

2 精准匹配

给出准确的访问路径,只能通过此路径访问。

1
@WebServlet("/aaa/bbb")

3 目录匹配

在该目录下输入任意字符,均可访问。

1
@WebServlet("/demo/*")

如下所示的url,均能访问

1
2
http://localhost:8080/select-demo/demo/aaa
http://localhost:8080/select-demo/demo/bbb

4 拓展名匹配

只要拓展名符合要求就能够访问

1
@WebServlet("*.ai")

如下所示的url,均能访问

1
2
http://localhost:8080/select-demo/aaa.ai
http://localhost:8080/select-demo/bbb.ai

拓展名配置时。WebServlet中不能加上斜杠,否则会报错

5 任意匹配

输入任何url均能访问

1
2
@WebServlet("/")
@WebServlet("/*")

如下所示的url,均能访问

1
2
http://localhost:8080/select-demo/aaa
http://localhost:8080/select-demo/bbb

/和/*的区别:

  1. DefaultServlet是用来处理静态资源,如果配置了”/“会把默认的覆盖 掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问
  2. 当我们的项目中的Servlet配置了 “/“,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet

访问优先级

遵循小范围优先。即:

精确匹配 > 目录匹配> 扩展名匹配 > / > /*


如果有什么,可以通过下面的邮箱和我联系!!!

img