在介绍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 --> |




