Servlet配置

xml配置

配置好Tomcat后

  • 定义一个类继承Servlet
  • 实现接口中的方法
  • 在web.xml中配置Servlet
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 配置Servlet -->
<servlet>
<!-- 起名字 -->
<servlet-name>test</servlet-name>
<!-- 全类名 -->
<servlet-class>com.servlet.l.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<!-- 选择映射的类 -->
<servlet-name>test</servlet-name>
<!-- 设置映射路径 -->
<url-pattern>/test1</url-pattern>
</servlet-mapping>

注解配置(servlet 3.0+)

  • 使用注解配置,可以不创建web.xml
  • 使用作用于类的注解@WebServlet
  • 如果同时使用注解和xml文件配置,则该Servlet将会创建两个对象

    • 然而,单独使用注解配置多个url则不会创建多个对象

    自定义注解只有一个属性时,且属性名不为value时,赋值时应与属性名保持一致。
    自定义注解只有一个属性时,且属性名为value时,赋值时value可省略。
    自定义注解有多个属性时,赋值时应与属性名保持一致。
    

WebServlet.class

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
@Target({ElementType.TYPE}) //作用于类
@Retention(RetentionPolicy.RUNTIME)//注解在jvm加载class文件之后,仍然存在
@Documented //生成到文档
public @interface WebServlet {

//对应web.xml中的<servlet-name>test</servlet-name>,在xml只是需要做对应关系,可以忽略不用再配置
String name() default "";

//注解里如果只写一个属性,且是value,则可以省略,这里的value与urlPatterns功能相同
//使用默认设置且只配置映射路径(路由)可以简写为@WebServlet("/route")、@WebServlet({"/route","/route2"})
String[] value() default {};

//[]可以配置多个路径
String[] urlPatterns() default {};

//同<load-on-startup>-1</load-on-startup>,在>=0时,启动Tomcat时创建被注解的类
int loadOnStartup() default -1;

WebInitParam[] initParams() default {};

boolean asyncSupported() default false;

String smallIcon() default "";

String largeIcon() default "";

String description() default "";

String displayName() default "";
}

执行原理

  1. 收到客户端请求,解析URL,获取访问Servlet的路径
  2. 查找xml中对应的标签体内容
  3. 如果有,查找对应的全类名
  4. Tomcat会将对应字节码文件加载进内存,并创建其对象(Class.forName())
    • 如果已创建直接调用
  5. 调用方法

生命周期

  1. 被创建:执行init方法
    • 默认:第一次调用时创建
    • 在web.xml文件中配置在servlet标签对内增加-1
      • 默认-1
      • 在大于等于0时,启动服务器时创建
  2. 提供服务:执行service方法
    • Servlet是单例的,多用户同时访问可能存在线程安全问题
    • 解决方案:只在Servlet中定义不可修饰的变量
  3. 被销毁:执行destroy方法(正常关闭Tomcat)
    • 在Servlet被销毁之前执行

体系结构

Servlet –接口



GenericServlet –抽象类



HTTPServlet –抽象类

  • GenericServlet
    • 只定义了一个抽象方法service
    • 其余都定义了默认值
  • HTTPServlet
    • 封装了7种请求方式
    • 一般情况下覆写doGet/doPost方法

路由原则

  1. 一个Servlet可以定义多个访问路径
  2. urlParttern的路由规则为:
    • /xxx 单个路由层
    • /xxx/xxx 多层路由
    • .do 特殊路由 /.do才能访问
    • /* 任意访问路径,优先级最低,可作为404特殊页
    • {/xxx,/xxxx} 多个路由
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
35
36
37
38
39
40
@WebServlet({"/anno","/a"})
public class ServletTest implements Servlet{

/**
* 初始化方法
* 在Servlet被创建的时候执行(只执行一次)
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init ... ");
}

@Override
public ServletConfig getServletConfig() {
return null;
}

/**
* 提供服务
* Servlet每次被访问执行
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hel");
}

@Override
public String getServletInfo() {
return null;
}


/**
* 服务器正常关闭时执行
*/
@Override
public void destroy() {

}
}