一、 什么是Servlet
1.1、定义
servlet就是指一个在web服务器上运行的java程序, Servlet从web客户端接收服务请求并响应之,通常使用继承了servlet接 口的HttpServlet进行web业务操作。servlet是一个单例多线程的java应用程序,多个客户端(游览器)可以访问同一个servlet。
1.2、servlet 生命周期
生命周期特点:
(1)一个实例只会执行一次无参构造器和init()初始化方法;
(2)游览器每提交一次servlet请求,就会执行一次service方法;
(3)服务端应用程序停止时,执行destory方法销毁当前的servlet示例;
(4)一般不会为servlet定义可修改的成员变量,因为servlet是单例多线程的,而成员变量存放于JVM虚拟机 堆区可由多个线程共享操作,当达到一定的并发量,则会造成线程安全问题。
(5) 默认情况下web容器启动时不会实例化servlet,只有我们设置web.xml中的<load-on-startup>标签的值设置为大于0的整数。
1.3、web.xml配置文件
作用:web.xml配置文件是用来存放servlet配置信息的文件,建立与servlet程序的mapping映射关系,是web工程中最重要的一部分。
常用标签如下:
标签名称 | 标签作用 |
---|---|
url-patterns | 用于设置servlet的URL请求路径,可以设置多个。 |
load-on-startup | 设置servlet示例化的优先级,优先级高的先实例化,如果标签数值为负数则不会实例化这个servlet。 |
init-param | 设置servlet的初始化参数,键值对的方式赋值,仅仅适用于当前servlet |
context-param | 上下文参数也有init-param标签,可以以键值对的方式设置初始化参数,作用范围是整个应用程序,它是独立于servlet标签的,当前工程下的所有servlet都可以获取此标签的初始化参数。 |
servlet-name | 设置servlet的名字。 |
1.4、web.xml映射原理
PS:web.xml默认有两张映射表,如果请求url通过Map1找不到要请求得servlet示例,则会继续通过Map2的class 名称找到对应的servlet示例,如果Map1能查找的到servlet示例,则不会执行Map2。
二、HttpServlet详解
HttpServlet是采用了http协议通讯的servlet,HttpServlet继承了Servlet接口并实现了Servlet所有的特性,http协议是一种无状态的TCP协议,故http协议主要是以字节流端对端的方式进行传输,是目前web工程开发的主要协议。
2.1、HttpServlet容器响应客户端请求流程如下
(1)web客户向servlet容器发送http请求;
(2)servlet容器解析客户端的http请求;
(3)servlet容器创建一个HttpServlet对象,在这个对象中封装HTTP请求信息;
(4) servlet容器创建一个HttpServletResponse对象;
(5)servlet容器调用httpservlet的service方法,把HttpServletRequest和HttpServletResponse对象作为service方法的参数传递给HttpServlet对象;
(6)HttpServlet调用HttpServletRequest的有关方法,获取Http请求信息;
(7)HttpServlet调用HttpServletResponse的有关方法,生成响应数据;
(8)Servlet容器把HttpServlet的相应结果传递给Web客户
2.2、ServletConfig基础点
定义:ServletConfig是获取web.xml中servlet标签内配置信息的对象,每一个servlet都有一个ServletConfig对象,通过这个对象我们可以获得应用程序的上下文以及当前servlet的所有信息,可以通过getServletConfig获取。
ServletConfig常用方法:
方法名 | 方法作用 | 使用范围 |
getServletContext | 获取上下文对象,一个web工程仅有一个上下文,多个servlet共享 | |
getInitParameterNames | 获取servlet标签中自定义的初始化参数名数组 | 当前servlet |
getServletName | 获取当前servlet的名字 | 当前servlet |
getInitParamter(name) | 通过参数名获取制定的初始化参数 | 当前servlet |
ServletContext常用方法:
方法名 | 方法作用 | 使用范围 |
getInitParameterNames | 获取<context-param>标签内初始化参数名数组 | 整个web应用工程,多个servlet共享 |
getInitParamter(name) | 通过参数名获取<context-param>标签内制定的参数 | 整个web应用工程,多个servlet共享 |
setAttribute(key,value) | 以键值对的方式设置上下文的域属性 | 整个web应用工程,多个servlet共享 |
getContextPath() | 获取当前web工程的根路径 |
2.3、HttpRequest和HttpResponse
定义:HttpServletRequest继承了ServletRequest,HttpServletResponse继承了ServletResponse,这两个对象参数主要存在于HttpServlet的doGet()、doPost()、doPut()等方法中。
Servlet主要服务方法介绍:
(1)doGet():调用服务器的资源,doGet的调用在URL里显示正在传送给servlet的数据,这在系统的安全方面会带来很大的问题,常见的是用户登录账户和密码信息泄露;
(2)doPost():用于把客户端的数据传给服务端,使用它可以以隐藏方式将数据传递给服务端,post适合发送大量的数据。
HttpRequest方法详解:
(1) getParameter(name):通过参数名获取请求参数的值;
(2) getParameterNames():获取所有请求参数名,以枚举数组的方式返回;
(3) getParamterValues(name):通过参数名获取name对应的所有参数值以一个数组的方式返回;
(4) getParamterMap():获取请求参数存放的Map对象;
(5) 请求参数Map原理分析:Map<name,value[...]> 用于存放前端递交过来的参数,一个name可能对应多个参数。servlet后台服务器本质上是从Map中拿到相应的参数值。
HttpResponse方法详解:
(1)getWriter():获取字符输出流;
(2)getOutputStream():获取字节输出流 ;
(3)addCookie():响应流中添加cookie
三、Servlet三大作用域
定义:servlet三大作用域是ServletContext域属性、Request域属性、session域属性。何为作用域属性,作用域属性就是attribute,使用作用域可以传递数据和存储数据。作用域属性与param参数最大的不同点是param只能在java代码中获取不能通过java代码创建,而域属性则可以在后台代码中创建和获取,常用的方法就是getAttribut(name)和setAttribute(name,value)。
作用范围列表:
web应用程序内 | 会话范围(跨请求,多个servlet) | 当前请求 | 用处 | |
---|---|---|---|---|
ServletContext(Application) | Y | Y | Y | 所有用户均能获取此信息,只需要设置一次,一般用于在多个客户端间共享数据时使用 |
Session | Y | Y | 常用于web开发中的登录验证界面 | |
HttpServletRequest(Jsp) | Y | 用于服务器间同一请求不同页面之间的参数传递,常用于表单控件值的传递 |
生命周期:
(1)request:只限于一次请求,随着请求的消亡而消亡
(2)session:基于一次会话(多次请求),会话结束时消亡
(3)servletContext:项目的加载到卸载