Servlet简介
- Servlet是一个符合特定规范的Java程序,基于Java技术的Web组件,Servlet运行在服务器端,由Servlet容器所管理,用于处理客户请求并做出响应
- 说明:Servlet容器也叫Servlet引擎,是Web服务器或应用程序服务器的一部分,
- 用于在发送和请求之上提供网络服务,
- 管理和运行Servlet/JSP的容器也称为Web容器
- Servlet主要用于生成动态的内容。他可以接受和处理请求,并动态生成HTML内容对客户端进行响应
Servlet与JSP的关系
- 服务器在运行JSP时,将JSP转化为Java类并编译执行,动态获取数据生成HTML,最终显示在客户端浏览器上。 - JSP在运行时会被Web容器翻译为一个Servlet,动态响应内容是通过这个Servlet类产生的。Servlet是Java web 动态交互技术的重要组件,也是JSP技术基础,容器运行JSP时,需要现将其内容翻译成Servlet的语法,再按照Servlet的方式运行。
Servlet API(开发Servlet需要用到的主要接口和类)
Servlet接口
方法名称 | 功能描述 |
---|
void init(ServletConfig config) | 由servlet容器调用,用于完成Servlet对象在处理客户端请求前的初始化工作 |
void service(ServletRequest req,ServletResponse res) | 由servlet容器调用,用于处理客户端的请求 |
void destroy() | 由servlet容器调用,释放Servlet对象所使用的资源,销毁实例 |
ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此Servlet的初始化和启动参数。返回的ServletConfig对象是传递给init()方法的对象 |
String getServletInfo() | 返回有关Servlet的信息,如作者,版本和版权。返回的是字符串的纯文本,而不是任何种类的标记(如HTML,XML等) |
GenericServlet抽象类
- 实现了Servlet接口和ServletConfig接口,给出了除了service()方法之外的其他方法的简单实现。定义了通用的,不依赖于协议的Servlet.
方法名称 | 功能描述 |
---|
void init(ServletConfig config) | 对Servlet接口中init(ServletConfig config)方法的实现,并将ServletConfig实例进行保存以备用。此方法还有一个无参的重载方法init(),可用于子类中重写,以实现用户定制的初始化工作 |
String getInitParameter(String name) | 通过调用ServletConfig的getInitParameter(String name)方法获取web.xml中设置的以name命名的初始化参数 |
ServletContext getServletContext() | 返回ServletContext对象的引用 |
HttpServlet抽象类
- 抽象类HttpServlet
继承自GenericServlet类,具有与GenericServlet类似的方法,并且提供了与Http相关的实现,支持对HTTP的post和get等请求方式进行差异化处理。 -
在开发中如果需要编写Servlet,主要就是继承HttPServlet类
方法名称 | 功能描述 |
---|
public void service(ServletRequest req,ServletResponse res) | GenericServlet类中service()方法的实现,将请求分发给protected void service(ServletRequest req,ServletResponse res)方法 |
protected void service(ServletRequest req,ServletResponse res) | 接收到HTTP请求,并将它们分发给次类中定义的doXXX()方法 |
protected void doXXX(ServletRequest req,ServletResponse res) | 根据请求方式的不同分别定义的处理方法,如doGet(),doPost()等 |
ServletConfig接口
-
Servlet容器使用ServletConfig接口的实例在Servlet初始化期间向其传递配置信息
方法名称 | 功能描述 |
---|
String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
ServletContext接口
- ServletContext接口表示
一个web应用的上下文,Servlet接口使用ServletConfig接口定义的方法与它的Servlet容器进行通信 - JSP内置对象application就是ServletContext的实例 - Servlet容器厂商负责提供ServletContext接口的实现,
容器在应用程序加载时创建ServletContext对象, ServletContext对象被Servlet容器的所有Servlet共享。
方法名称 | 功能描述 |
---|
String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值,可以再部署中使用元素定义 |
void setAttribute(String name,Object obj) | 设置名称为name的属性 |
Object getAttribute(String name) | 获取名称为name的属性 |
String getRealPath(String path) | 返回参数所代表的目录的真实路径 |
void log(String message) | 记录一般日志信息 |
ServletRequest接口和HttpServletRequest接口
ServletRequest接口
-
当客户请求时,由Servlet容器创建ServletRequest对象用于封装客户的请求信息,这个对象将被容器作为serevice()方法的参数之一传递给Servlet,Servlet对象能够利用ServletRequest对象获取客户端的请求数据
方法名称 | 功能描述 |
---|
Object getAttribute(String name) | 获取名称为name的属性值 |
void setAttribute(String name,Object obj) | 在请求中保存名称为name的属性 |
void removeAttribute(String name) | 清除请求中名称为name的属性 |
String getCharacterEncoding() | 返回请求体所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置请求体的字符编码 |
String getParameter(String name) | 返回指定请求参数的值 |
String[] getParameterValues(String name) | 返回指定请求参数的全部值 |
ReqeustDisPatcher(String path) | 返回指定路径的请求分发对象 |
HttpServletRequest接口
-
位于javax.servlet.http包中,继承ServletRequest接口 - 除了继承ServletRequest接口中的方法,还增加了读取请求信息的方法
方法名称 | 功能描述 |
---|
String getContextPath() | 返回URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
Cookie[] getCookies() | 返回客户端在此请求中发送的所有cookie对象 |
HttPSession getSession() | 返回和此请求相关的session,如果没有给客户端分配session,则创建一个新的session |
String getMethod() | 返回此次请求所使用的HTTP方法的名字,如get,post |
String getHeader(String name) | 获取指定的请求头信息 |
ServletResponse接口和HttpServletResponse接口
ServletResponse接口
-
用于封装响应的数据,并且同时将这两个对象一并作为参数传递给Servlet。 -
Servlet 利用ServletRequest对象获取客户端的请求数据,经过处理后由ServletResponse对象响应数据
方法名称 | 功能描述 |
---|
PrintWriter getWriter | 返回PrintWriter对象,用于向客户端发送文本 |
String getCharacterEncoding() | 返回在响应中发送的正文所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置发送到客户端的响应的字符编码 |
void setContentType(String type) | 设置发送到客户端响应的内容类型,此时响应的内容尚未提交 |
HttpServletResponse接口
-
继承自ServletResponse接口,用于对客户端的请求执行响应 - 除了具有ServletResponse接口的方法外,还增加了新的方法
方法名称 | 功能描述 |
---|
void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可以多次调用,设置多个cookie |
String addHeader(String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
void encodeURL(String url) | 使用session ID对用于重定向的URL进行编码 |
web.xml中常用的设置方法
- /xxx,精确匹配 - /xxx/*,路径匹配,如果没有精确匹配,对/xxx/路径的所有请求将有该Servlet进行处理 - *.xxx,如果没有精确匹配和路径匹配,则所有针对.xxx扩展名的请求将由该Servlet处理。
扩展:如果需要指定启动时Servlet的加载次序,可以在元素中增加元素,该元素的值必须是整数,如果为负数或没有指定这个元素,容器将在客户端首次访问时进行加载;如果为正数或0,容器加载启动时根据值得顺序加载Servlet,且值越小加载优先级越高
Servlet实现控制器
Servlet与JSP的区别
- 本质:服务器端运行的Java应用程序 - jsp文件在用户第一次请求时会编译成Servlet,然后有这个Servlet处理客户的请求,所以JSP也可以看成是运行时的Servlet。 - JSP页面在HTML元素中嵌入Java脚本和JSP标记,比使用传统的Servlet技术开发表示层更加容易。JSP的部署也更加简单,JSP容器(Servlet容器)会对扩展名.jsp的URL统一配置,将其转换为Servlet为客户端服务,无需为每一个JSP文件进行配置URL映射 - JSP页面HTML元素与Java脚本混合的语法,对于处理过程中编写流程控制代码,数据访问代码等却是不利的,难以模块化开发及重用,此时更适合采用传统Java类的形式进行开发。故而使用Servlet在服务器上解释和执行浏览器的请求,充当客户端和其他层之间的中间层角色更加合适。 -
jsp可以方便的开发表示层组件,而Servlet适合编写流程控制代码
实现Servlet控制器
-
Servlet充当控制器的角色,他接受请求,负责数理化JavaBean对象业务逻辑进行处理,并为JSP页面准备封装数据的JavaBean对象,接着将请求分发给适当的JSP页面来产生响应
实现Servlet的生命周期
- 通过Servlet接口中的init(),service()和destroy()方法来表示的,即Servlet从创建到销毁的过程,包括如何加载和实例化,初始化,处理请求,以及如何被销毁
加载和实例化
- Servlet不能单独运行,必须部署在Servlet容器(web服务器)中有容器实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内管理Servlet。当Servlet容启动或者当客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet的实例,如果不存在,就创建一个Servlet。如果存在该Servlet实例,就直接从内存中取出该实例响应请求。
初始化
- 在Servlet完成Servlet实例化后,Servlet容器将调用Servlet的init()方法进行初始化,初始化的目的是让Servlet对象在处理客户端请求前完成一些准备或资源加载工作,如:设置数据库连接参数,建立jdbc连接,或者建立对其他资源的引用。 -
注意:对于每一个Servlet实例,init()方法只被调用一次。
服务
- Servlet被初始化后就处于能被响应的就绪状态。当Servlet容器接收客户端请求时,调用Servlet的service()方法处理客户端请求,HttpServlet的service()方法会根据get或post请求转调doGet()或doPost()方法,Servlet实例通过ServletRequest对象获得客户端的请求,通过调用ServletResponse对象的方法设置响应信息
销毁
- Servlet的实例由Servlet容器所创建,所以实例的销毁也是有容器来完成的,Servlet容器判断一个Servlet是否应当被释放时(容器关闭或需要回收资源),容器就会调用Servlet的destroy()方法,该方法指明那些资源可以被系统回收,而不是由destroy()方法直接回收Servlet实例。
Servlet生命周期演示
graph LR
实例化-->Servlet容器创建Servlet的实例
初始化-->该容器调用init方法
服务-->如果请求Servlet,则容器调用service方法
销毁-->销毁实例之前调用destroy方法
初始化参数及访问应用上下文
获得Servlet初始化参数
-
通过初始化参数可以更灵活的控制Servlet的运行时的行为
-
设置初始化参数需修改web.xml文件,在元素中增加元素
示例:
//部署Servlet
helloServlet
cn.bdqn.test.HelloServlet
//设置初始化参数
innitParam
Hello Servlet
HelloServlet
/HelloServlet
说明:定义Servlet的初始化参数时使用元素。
元素是元素的子元素,使用 元素必须包括元素和元素
元素定义初始化参数的名字,元素指定初始化参数的值。
调用:通过ServletConfig实例的getInitParameter(String name)方法进行访问。例如:String innitParam=getInitParameter(“innitParam”)
获得上下文参数
- 可以被更多的web应用组件访问
<web-app>
<context-param>
<param-name>contextParam</param-name>
<param-value>ContextParamValue</param-value>
</context-param>
</web-app>
说明:
使用 元素声明web应用的全局范围参数, 元素包括 (指定参数的名字)元素和(指定参数的值)元素
调用:String contextParm=this.getServletContext().getInitParameter(“contextParam”)## Servlet简介
- Servlet是一个符合特定规范的Java程序,基于Java技术的Web组件,Servlet运行在服务器端,由Servlet容器所管理,用于处理客户请求并做出响应
- 说明:Servlet容器也叫Servlet引擎,是Web服务器或应用程序服务器的一部分,
- 用于在发送和请求之上提供网络服务,
- 管理和运行Servlet/JSP的容器也称为Web容器
- Servlet主要用于生成动态的内容。他可以接受和处理请求,并动态生成HTML内容对客户端进行响应
Servlet与JSP的关系
- 服务器在运行JSP时,将JSP转化为Java类并编译执行,动态获取数据生成HTML,最终显示在客户端浏览器上。 - JSP在运行时会被Web容器翻译为一个Servlet,动态响应内容是通过这个Servlet类产生的。Servlet是Java web 动态交互技术的重要组件,也是JSP技术基础,容器运行JSP时,需要现将其内容翻译成Servlet的语法,再按照Servlet的方式运行。
Servlet API(开发Servlet需要用到的主要接口和类)
Servlet接口
方法名称 | 功能描述 |
---|
void init(ServletConfig config) | 由servlet容器调用,用于完成Servlet对象在处理客户端请求前的初始化工作 |
void service(ServletRequest req,ServletResponse res) | 由servlet容器调用,用于处理客户端的请求 |
void destroy() | 由servlet容器调用,释放Servlet对象所使用的资源,销毁实例 |
ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此Servlet的初始化和启动参数。返回的ServletConfig对象是传递给init()方法的对象 |
String getServletInfo() | 返回有关Servlet的信息,如作者,版本和版权。返回的是字符串的纯文本,而不是任何种类的标记(如HTML,XML等) |
GenericServlet抽象类
- 实现了Servlet接口和ServletConfig接口,给出了除了service()方法之外的其他方法的简单实现。定义了通用的,不依赖于协议的Servlet.
方法名称 | 功能描述 |
---|
void init(ServletConfig config) | 对Servlet接口中init(ServletConfig config)方法的实现,并将ServletConfig实例进行保存以备用。此方法还有一个无参的重载方法init(),可用于子类中重写,以实现用户定制的初始化工作 |
String getInitParameter(String name) | 通过调用ServletConfig的getInitParameter(String name)方法获取web.xml中设置的以name命名的初始化参数 |
ServletContext getServletContext() | 返回ServletContext对象的引用 |
HttpServlet抽象类
- 抽象类HttpServlet
继承自GenericServlet类,具有与GenericServlet类似的方法,并且提供了与Http相关的实现,支持对HTTP的post和get等请求方式进行差异化处理。 -
在开发中如果需要编写Servlet,主要就是继承HttPServlet类
方法名称 | 功能描述 |
---|
public void service(ServletRequest req,ServletResponse res) | GenericServlet类中service()方法的实现,将请求分发给protected void service(ServletRequest req,ServletResponse res)方法 |
protected void service(ServletRequest req,ServletResponse res) | 接收到HTTP请求,并将它们分发给次类中定义的doXXX()方法 |
protected void doXXX(ServletRequest req,ServletResponse res) | 根据请求方式的不同分别定义的处理方法,如doGet(),doPost()等 |
ServletConfig接口
-
Servlet容器使用ServletConfig接口的实例在Servlet初始化期间向其传递配置信息
方法名称 | 功能描述 |
---|
String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
ServletContext接口
- ServletContext接口表示
一个web应用的上下文,Servlet接口使用ServletConfig接口定义的方法与它的Servlet容器进行通信 - JSP内置对象application就是ServletContext的实例 - Servlet容器厂商负责提供ServletContext接口的实现,
容器在应用程序加载时创建ServletContext对象, ServletContext对象被Servlet容器的所有Servlet共享。
方法名称 | 功能描述 |
---|
String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值,可以再部署中使用元素定义 |
void setAttribute(String name,Object obj) | 设置名称为name的属性 |
Object getAttribute(String name) | 获取名称为name的属性 |
String getRealPath(String path) | 返回参数所代表的目录的真实路径 |
void log(String message) | 记录一般日志信息 |
ServletRequest接口和HttpServletRequest接口
ServletRequest接口
-
当客户请求时,由Servlet容器创建ServletRequest对象用于封装客户的请求信息,这个对象将被容器作为serevice()方法的参数之一传递给Servlet,Servlet对象能够利用ServletRequest对象获取客户端的请求数据
方法名称 | 功能描述 |
---|
Object getAttribute(String name) | 获取名称为name的属性值 |
void setAttribute(String name,Object obj) | 在请求中保存名称为name的属性 |
void removeAttribute(String name) | 清除请求中名称为name的属性 |
String getCharacterEncoding() | 返回请求体所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置请求体的字符编码 |
String getParameter(String name) | 返回指定请求参数的值 |
String[] getParameterValues(String name) | 返回指定请求参数的全部值 |
ReqeustDisPatcher(String path) | 返回指定路径的请求分发对象 |
HttpServletRequest接口
-
位于javax.servlet.http包中,继承ServletRequest接口 - 除了继承ServletRequest接口中的方法,还增加了读取请求信息的方法
方法名称 | 功能描述 |
---|
String getContextPath() | 返回URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
Cookie[] getCookies() | 返回客户端在此请求中发送的所有cookie对象 |
HttPSession getSession() | 返回和此请求相关的session,如果没有给客户端分配session,则创建一个新的session |
String getMethod() | 返回此次请求所使用的HTTP方法的名字,如get,post |
String getHeader(String name) | 获取指定的请求头信息 |
ServletResponse接口和HttpServletResponse接口
ServletResponse接口
-
用于封装响应的数据,并且同时将这两个对象一并作为参数传递给Servlet。 -
Servlet 利用ServletRequest对象获取客户端的请求数据,经过处理后由ServletResponse对象响应数据
方法名称 | 功能描述 |
---|
PrintWriter getWriter | 返回PrintWriter对象,用于向客户端发送文本 |
String getCharacterEncoding() | 返回在响应中发送的正文所使用的字符编码 |
void setCharacterEncoding(String charset) | 设置发送到客户端的响应的字符编码 |
void setContentType(String type) | 设置发送到客户端响应的内容类型,此时响应的内容尚未提交 |
HttpServletResponse接口
-
继承自ServletResponse接口,用于对客户端的请求执行响应 - 除了具有ServletResponse接口的方法外,还增加了新的方法
方法名称 | 功能描述 |
---|
void addCookie(Cookie cookie) | 增加一个cookie到响应中,这个方法可以多次调用,设置多个cookie |
String addHeader(String name,String value) | 将一个名称为name,值为value的响应报头添加到响应中 |
void sendRedirect(String location) | 发送一个临时的重定向响应到客户端,以便客户端访问新的URL |
void encodeURL(String url) | 使用session ID对用于重定向的URL进行编码 |
web.xml中常用的设置方法
- /xxx,精确匹配 - /xxx/*,路径匹配,如果没有精确匹配,对/xxx/路径的所有请求将有该Servlet进行处理 - *.xxx,如果没有精确匹配和路径匹配,则所有针对.xxx扩展名的请求将由该Servlet处理。
扩展:如果需要指定启动时Servlet的加载次序,可以在元素中增加元素,该元素的值必须是整数,如果为负数或没有指定这个元素,容器将在客户端首次访问时进行加载;如果为正数或0,容器加载启动时根据值得顺序加载Servlet,且值越小加载优先级越高
Servlet实现控制器
Servlet与JSP的区别
- 本质:服务器端运行的Java应用程序 - jsp文件在用户第一次请求时会编译成Servlet,然后有这个Servlet处理客户的请求,所以JSP也可以看成是运行时的Servlet。 - JSP页面在HTML元素中嵌入Java脚本和JSP标记,比使用传统的Servlet技术开发表示层更加容易。JSP的部署也更加简单,JSP容器(Servlet容器)会对扩展名.jsp的URL统一配置,将其转换为Servlet为客户端服务,无需为每一个JSP文件进行配置URL映射 - JSP页面HTML元素与Java脚本混合的语法,对于处理过程中编写流程控制代码,数据访问代码等却是不利的,难以模块化开发及重用,此时更适合采用传统Java类的形式进行开发。故而使用Servlet在服务器上解释和执行浏览器的请求,充当客户端和其他层之间的中间层角色更加合适。 -
jsp可以方便的开发表示层组件,而Servlet适合编写流程控制代码
实现Servlet控制器
-
Servlet充当控制器的角色,他接受请求,负责数理化JavaBean对象业务逻辑进行处理,并为JSP页面准备封装数据的JavaBean对象,接着将请求分发给适当的JSP页面来产生响应
实现Servlet的生命周期
- 通过Servlet接口中的init(),service()和destroy()方法来表示的,即Servlet从创建到销毁的过程,包括如何加载和实例化,初始化,处理请求,以及如何被销毁
加载和实例化
- Servlet不能单独运行,必须部署在Servlet容器(web服务器)中有容器实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内管理Servlet。当Servlet容启动或者当客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet的实例,如果不存在,就创建一个Servlet。如果存在该Servlet实例,就直接从内存中取出该实例响应请求。
初始化
- 在Servlet完成Servlet实例化后,Servlet容器将调用Servlet的init()方法进行初始化,初始化的目的是让Servlet对象在处理客户端请求前完成一些准备或资源加载工作,如:设置数据库连接参数,建立jdbc连接,或者建立对其他资源的引用。 -
注意:对于每一个Servlet实例,init()方法只被调用一次。
服务
- Servlet被初始化后就处于能被响应的就绪状态。当Servlet容器接收客户端请求时,调用Servlet的service()方法处理客户端请求,HttpServlet的service()方法会根据get或post请求转调doGet()或doPost()方法,Servlet实例通过ServletRequest对象获得客户端的请求,通过调用ServletResponse对象的方法设置响应信息
销毁
- Servlet的实例由Servlet容器所创建,所以实例的销毁也是有容器来完成的,Servlet容器判断一个Servlet是否应当被释放时(容器关闭或需要回收资源),容器就会调用Servlet的destroy()方法,该方法指明那些资源可以被系统回收,而不是由destroy()方法直接回收Servlet实例。
Servlet生命周期演示
graph LR
实例化-->Servlet容器创建Servlet的实例
初始化-->该容器调用init方法
服务-->如果请求Servlet,则容器调用service方法
销毁-->销毁实例之前调用destroy方法
初始化参数及访问应用上下文
获得Servlet初始化参数
-
通过初始化参数可以更灵活的控制Servlet的运行时的行为
-
设置初始化参数需修改web.xml文件,在元素中增加元素
示例:
//部署Servlet
helloServlet
cn.bdqn.test.HelloServlet
//设置初始化参数
innitParam
Hello Servlet
HelloServlet
/HelloServlet
说明:定义Servlet的初始化参数时使用元素。
元素是元素的子元素,使用 元素必须包括元素和元素
元素定义初始化参数的名字,元素指定初始化参数的值。
调用:通过ServletConfig实例的getInitParameter(String name)方法进行访问。例如:String innitParam=getInitParameter(“innitParam”)
获得上下文参数
- 可以被更多的web应用组件访问
<web-app>
<context-param>
<param-name>contextParam</param-name>
<param-value>ContextParamValue</param-value>
</context-param>
</web-app>
说明:
使用 元素声明web应用的全局范围参数, 元素包括 (指定参数的名字)元素和(指定参数的值)元素
调用:String contextParm=this.getServletContext().getInitParameter(“contextParam”)