在介绍Servlet之前,简单对web方面的知识做个小结。

一、Web知识小结

1.1 软件架构

这里的软件架构,指服务器软件工作的两种方式:

  1. C/S:客户端/服务器端
  2. B/S:浏览器/服务器端

1.2 网络通信三要素

  1. IP:电子设备(计算机)在网络中的唯一标识。作用:用于定位到具体的电子设备,这里指具体的一台计算机。
  2. port(端口):应用程序在计算机中的唯一标识,其范围在0~65536。作用:用于定位计算机中的具体应用程序(每个应用程序都在监听着具体的端口号)。
  3. 传输协议:规定了数据传输的规则(该如何发送数据,又该如何接受数据,最后该对接受到的数据如何解析)。
    1. 基础协议
      • tcp:安全协议,三次握手,速度稍慢。
      • udp:不安全协议,速度较快。

1.2 资源分类

  1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器解析。

    如:html、css、JavaScript...

  2. 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,在返回给浏览器。

    如:servlet/jsp、php、asp...

客户端像服务器端请求的形式如下图:

资源分类

浏览器通过具体的ip:port向服务器端发送请求,当请求的资源是静态资源时,服务器将请求的资源返回(响应)给客户端,浏览器对静态资源进行解析,展示给用户;当请求的资源时动态资源时,服务器内部先将动态资源转换为静态资源,再将该资源响应给浏览器,最后由浏览器对资源进行解析,展示给用户。

二、Servlet相关介绍

Servlet执行原理

概念:ServletJ2EE众多规范中的一种,是运行在服务器端的小程序。其中,Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。以后,只要我们自定义一个类,实现Servlet接口,复写其方法,就可进行Web开发。

从上图中我们可以看到,浏览器端对服务器发送请求,请求动态资源时,是由服务器内部的服务器软件(这里假设是Tomcat服务器)对该请求进行处理。其中我们定义的Java类必须遵守一定的规范(Servlet/JSP规范),这个类才能被Tomcat识别,进而对请求进行处理。

2.1 执行原理

首先创建JavaEE项目,定义一个类,实现Servlet接口,并实现其中的service抽象方法。

1
2
3
4
5
6
7
public class ServletDemo1 implements Servlet{

@Override
public void service(){
System.out.println("hello world");
}
}

然后配置Servlet,即web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
<!--配置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执行原理

首先客户端发送请求,请求来到Tomcat服务器,查询web.xml配置文件,由于请求路径中包含demo1资源路径,对应着<url-pattern>中的值,继而就找到了<servlet-name>标签中的值(因为两者同属于<servlet-mapping>标签)——demo1,然后通过demo1定位到servlet标签中的<servlet-name>,继而找到<servlet-class>中的全类名,通过反射将全类名对应的字节码文件加载进内存,创建对象,由于必须符合serlvet规范,所以调用能够service方法。

执行原理总结:

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

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

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

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

  5. 调用其方法。

2.2 实现原理

Servlet具体原理见下图:

4servlet原理

首先客户端将发送http请求到服务器中(Web容器,这里是Tomcat),由Tomcat创建Servlet容器,调用其service方法对请求进行处理,处理的逻辑是由我们自己进行编写。将处理的结果交给Response,最终由web容器将Response响应给客户端。

因为ServletJ2EE中的规范之一,其中处理请求的方法servcice是事先约定好的,我们只需要重写servcie方法,由Tomcat创建的Servlet容器自行帮我们处理请求。

2.4 Mapping详解

1
2
3
4
5
6
7
8
9
10
11
12
<!--配置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>

mapping是请求路径的映射,可以将Mapping想象成一个value,而servlet是一个key,我们通过value来映射key,所以我们的访问路径可以设置多组,由访问路径找到servlet-class,最终将class加载进内存由Servlet容器对其进行处理。因此,我们可以设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--配置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>demo1</servlet-name>
<!-- 访问路径 -->
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<!-- 访问路径 -->
<url-pattern>/demo3</url-pattern>
</servlet-mapping>

其中,访问路径demo1,demo2,demo3都可以映射到<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>,对其servlet进行处理。

同时也可以使用通配符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--配置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>/*</url-pattern> <!-- 任何请求 -->
</servlet-mapping>

<servlet-mapping>
<servlet-name>demo1</servlet-name>
<!-- 访问路径 -->
<url-pattern>/*.do</url-pattern> <!-- 以.do结尾的请求 -->
</servlet-mapping>

Comment