在介绍Servlet
之前,简单对web
方面的知识做个小结。
一、Web知识小结
1.1 软件架构
这里的软件架构,指服务器软件工作的两种方式:
C/S
:客户端/服务器端B/S
:浏览器/服务器端
1.2 网络通信三要素
IP
:电子设备(计算机)在网络中的唯一标识。作用:用于定位到具体的电子设备,这里指具体的一台计算机。port(端口)
:应用程序在计算机中的唯一标识,其范围在0~65536
。作用:用于定位计算机中的具体应用程序(每个应用程序都在监听着具体的端口号)。- 传输协议:规定了数据传输的规则(该如何发送数据,又该如何接受数据,最后该对接受到的数据如何解析)。
- 基础协议
tcp
:安全协议,三次握手,速度稍慢。udp
:不安全协议,速度较快。
- 基础协议
1.2 资源分类
静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器解析。
如:
html、css、JavaScript...
动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,在返回给浏览器。
如:
servlet/jsp、php、asp...
客户端像服务器端请求的形式如下图:
浏览器通过具体的ip:port
向服务器端发送请求,当请求的资源是静态资源时,服务器将请求的资源返回(响应)给客户端,浏览器对静态资源进行解析,展示给用户;当请求的资源时动态资源时,服务器内部先将动态资源转换为静态资源,再将该资源响应给浏览器,最后由浏览器对资源进行解析,展示给用户。
二、Servlet相关介绍
概念:Servlet
是J2EE
众多规范中的一种,是运行在服务器端的小程序。其中,Servlet
就是一个接口,定义了Java
类被浏览器访问到(tomcat
识别)的规则。以后,只要我们自定义一个类,实现Servlet
接口,复写其方法,就可进行Web
开发。
从上图中我们可以看到,浏览器端对服务器发送请求,请求动态资源时,是由服务器内部的服务器软件(这里假设是Tomcat
服务器)对该请求进行处理。其中我们定义的Java
类必须遵守一定的规范(Servlet/JSP
规范),这个类才能被Tomcat
识别,进而对请求进行处理。
2.1 执行原理
首先创建JavaEE
项目,定义一个类,实现Servlet
接口,并实现其中的service
抽象方法。
1 | public class ServletDemo1 implements Servlet{ |
然后配置Servlet
,即web.xml
文件
1 | <!--配置Servlet --> |
首先客户端发送请求,请求来到Tomcat
服务器,查询web.xml
配置文件,由于请求路径中包含demo1
资源路径,对应着<url-pattern>
中的值,继而就找到了<servlet-name>
标签中的值(因为两者同属于<servlet-mapping>
标签)——demo1
,然后通过demo1
定位到servlet
标签中的<servlet-name>
,继而找到<servlet-class>
中的全类名,通过反射将全类名对应的字节码文件加载进内存,创建对象,由于必须符合serlvet
规范,所以调用能够service
方法。
执行原理总结:
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径;
查找web.xml文件,是否有对应的
<url-pattern>
标签体内容;如果有,则在找到对应的
<servlet-class>
全类名;tomcat
会将字节码文件加载进内存,并且创建其对象;调用其方法。
2.2 实现原理
Servlet具体原理见下图:
首先客户端将发送http
请求到服务器中(Web
容器,这里是Tomcat
),由Tomcat
创建Servlet
容器,调用其service
方法对请求进行处理,处理的逻辑是由我们自己进行编写。将处理的结果交给Response
,最终由web
容器将Response
响应给客户端。
因为Servlet
是J2EE
中的规范之一,其中处理请求的方法servcice
是事先约定好的,我们只需要重写servcie
方法,由Tomcat
创建的Servlet
容器自行帮我们处理请求。
2.4 Mapping详解
1 | <!--配置Servlet --> |
mapping
是请求路径的映射,可以将Mapping
想象成一个value
,而servlet
是一个key
,我们通过value
来映射key
,所以我们的访问路径可以设置多组,由访问路径找到servlet-class
,最终将class
加载进内存由Servlet
容器对其进行处理。因此,我们可以设置:
1 | <!--配置Servlet --> |
其中,访问路径demo1,demo2,demo3都可以映射到<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
,对其servlet
进行处理。
同时也可以使用通配符:
1 | <!--配置Servlet --> |