• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Servlet:运行在服务器端的小程序

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Servlet: server applet

  • 概念:运行在服务器端的小程序
  • Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则(我是跳转内容)
  • 将来我们自定义一个类,实现Servlet接口,复写(重写Override)方法。

快速理解

快速入门

  1. 创建JavaEE项目

  2. 定义一个类,实现Servlet接口

1
2
3
4
5
6
7
8
9
/* ServletDemo1.java */
package cn.itcast.web.servlet;

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

public class ServletDemo1 implements Servlet {
//TODO
}

  1. 实现接口中的抽象方法
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
/* ServletDemo1.java */
package cn.itcast.web.servlet;

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

public class ServletDemo1 implements Servlet {

@Override
public void init(ServletConfig servletConfig) throws ServletException {

}

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

// 提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
}

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

@Override
public void destroy() {

}

}
  1. 配置Servlet,在web.xml的<web-app></web-app>中添加:
1
2
3
4
5
6
7
8
9
10
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>

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

servlet-mapping是做一个映射servlet-name对应servlet-classurl-pattern是资源路径(/开头

<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>,中的cn.itcast.web.servlet.ServletDemo1全类名,这里涉及到反射。日后补充。

  1. 启动服务,看看结果

浏览器中是空白的,

但是IDEA控制台中显示“Hello Servlet”

每刷新一次页面,控制台就多一句“Hello Servlet”。

执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。

  3. 如果有,则在找到对应的<servlet-class>全类名涉及到反射

  4. tomcat会将字节码文件加载进内存,并且创建其对象

  5. 调用其方法

    • 为什么能调用方法?

    • 因为实现了【规则】(点击我跳转)。实现规则,实现Servlet接口,实现了接口中的方法。

ServletDemo

可以调试、运行,看看每个方法的执行次数。

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import javax.servlet.*;
import java.io.IOException;

/**
* Servlet的方法
*/
public class ServletDemo1 implements Servlet {

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

/**
* 获取ServletConfig对象
* ServletConfig:Servlet的配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}

/**
* 提供服务的方法
* 每一次Servlet被访问时,执行。可执行多次。
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}

/**
* 获取Servlet的一些信息(版本、作者……)
* @return
*/
@Override
public String getServletInfo() {
return null;
}

/**
* 销毁的方法
* 在服务器正常关闭时,执行。只执行一次。
* 非正关闭时,destroy方法不会执行。
*/
@Override
public void destroy() {
System.out.println("destroy...");
}

}

Servlet中的生命周期方法

1.被创建:执行init方法,只执行一次

  • Servlet什么时候被创建?
  1. 默认情况下,第一次被访问时,被创建。
  2. 在服务器启动时,被创建。
  • 可以配置执行Servlet的创建时机,在<servlet></servlet>标签中配置<load-on-startup>整数值</load-on-startup>

1.第一次被访问时,创建

负整数

2.在服务器启动时,创建

0或正整数(一般0~10)

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 初始化的方法
* 在Servlet被创建时,执行,且只执行一次。
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");

// 定义局部变量,这样不存在多线程的安全问题
int number = 3;
}
  • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
  • 多个用户同时访问时,可能存在线程安全问题。
  • 解决:尽量不要在Servlet中定义成员变量(定义局部变量就不存在安全问题了)。即使定义了成员变量,也不要对修改值。

2.提供服务:执行service方法,可执行多次

  • 每次访问Servlet时,Service方法都会被调用一次。
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 提供服务的方法
* 每一次Servlet被访问时,执行。可执行多次。
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}

3.被销毁:执行destroy方法,只执行一次

  • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
  • 只有服务器正常关闭时,才会执行destroy方法。
  • destroy方法在Servlet被销毁之前执行,一般用于释放资源
1
2
3
4
5
6
7
8
9
/**
* 销毁的方法
* 在服务器正常关闭时,执行。只执行一次。
* 非正关闭时,destroy方法不会执行。
*/
@Override
public void destroy() {
System.out.println("destroy...");
}

Servlet 3.0

  • 官方提供新的标准 Servlet 3.0
  • Java EE 6 开始支持 Servlet 3.0

好处

  • 支持注解配置。可以不需要web.xml了

步骤

  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml

  2. 定义一个类,实现Servlet接口

  3. 复写方法

  4. 在类上使用@WebServlet注解,进行配置

    • @WebServlet("资源路径")
    • 比如:
      1
      2
      3
      4
      5
      @WebServlet(urlPatterns = "/demo2")

      @WebServlet(value = "/demo2")

      @WebServlet("/demo2")
  1. 访问:http://localhost:8080/Servlet3/demo2

@WebServlet注解

  • @WebServlet中有个很特殊的属性value
  • 一般表示最重要的属性,就用value表示。
  • 特性:如果只有一个属性,value可以省略不写。
  • 除去value,最重要的属性是urlPatterns
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {

String name() default ""; //相当于<Servlet-name>
String[] value() default {}; //代表urlPatterns()属性配置
String[] urlPatterns() default {}; //相当于<url-pattern>
int loadOnStartup() default -1; //相当于<load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";

}

Servlet 体系结构

跳转到我得下一篇博文???? [Servlet 体系结构](https://melodyjerry.gitee.io/blog/2020/02/20/Servlet 体系结构/)


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
微信小程序学习7--小程序架构分析发布时间:2022-07-18
下一篇:
微信小程序Nginx-SSL配置发布时间:2022-07-18
热门推荐
    热门话题
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap