- 什么是Servlet?
- 如何使用Servler?
- Servlet生命周期
- Servlet方法体系
- Servlet3.0 注解
1. 什么是Servlet?
- Servlet是JavaEE的一个组件,也是JavaEE的一个规范
- Servlet程序类必须遵循Servlet的规范必须实现javax.servlet-Servlet接口
2. 如何使用Servler?
Servlet 本身不能独立运行,需要在一个web应用中运行的,而一个web应用是部署在tomcat中的。
所以开发一个servlet需要如下几个步骤:
- 创建普通的java类并继承HTTPServlet
- 覆写service方法
- 在service方法中书写逻辑代码
- 在webapp下的WEB-INF文件夹下的web。xml文件中配置servlet
示例代码 (前三步)
package servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello,Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
示例代码(配置xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
运行项目地址
image.png控制台打印输出结果
image.png解释:
- 服务器地址:端口号/webapp下的资源名称/请求名
- url : http://localhost:8080/虚拟主机/资源名
-
<servlet>
:要添加的Servlet节点-
<servlet-name>demo</servlet-name>
:Servlet请求名称 -
<servlet-class>servlet.ServletDemo</servlet-class>
:请求需要调用类名(全限定名,就是包名+类名)
-
-
<servlet-mapping>
:Servlet映射-
<servlet-name>demo</servlet-name>
:需要映射的请求名 -
<url-pattern>/demo</url-pattern>
:请求地址
-
3.Servlet 生命周期
- 加载Servlet类。
- 创建Servlet实例。调用Servlet类的
init()
方法。 - 调用Servlet类的
service()
方法。 - 调用Servlet类的
destroy()
方法
Servlet 生命周期流程图
Servlet生命周期.png如上图所显示,servlet有三种状态模式:新建、就绪、结束
- 创建新的Servlet的时候处于新建状态。
- 调用Servlet类的
init()
方法后,Servlet处于就绪状态,在就绪状态下Servlet执行任务。 - 当web容器调用Servlet类的
destroy()
方法后,Servlet处于结束状态。
分步骤解释生命周期
3.1 加载Servlet类
- 类加载器负责加载servlet类。
- 默认当Web容器接收到servlet的第一个请求时,将加载servlet类。
访问方式 |
<load-on-startup> 值 |
---|---|
第一次被访问时创建 | 负数 |
在服务器启动时创建 | 0或正整数 |
3.2 创建Servlet实例
- Web容器在加载servlet类之后创建一个servlet的实例。
- servlet实例在servlet生命周期中只创建一次
3.3 调用init方法
- Web容器在创建servlet实例后调用init方法一次。
- init方法用于初始化servlet。
- Servlet的
init()
方法,只执行一次
它是javax.servlet.Servlet接口的生命周期方法。init方法的语法如下:
public void init(ServletConfig config) throws ServletException
3.4 调用service方法
- 每当接收到servlet的请求时,Web容器都会调用
service()
方法。 - 如果servlet未初始化,则遵循上述前三个步骤,然后调用
service()
方法 - 如果servlet被初始化,它调用
service()
方法。 - 每次访问Servlet时,Service方法都会被调用一次
Servlet接口的service方法的语法如下:
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
3.5 调用destroy方法
- 从服务中删除servlet实例之前,Web容器调用
destroy()
方法。 - 它使servlet有机会清理所有资源,例如内存,线程等。
Servlet接口的destroy方法的语法如下:
public void destroy()
- servlet仅初始化一次
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
4.Servlet体系介绍
image.png- GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
-
HttpServlet:对http协议的一种封装,简化操作(只使用这个类)
- 定义类继承HttpServlet
- 复写doGet/doPost方法
5.Servlet3.0 注解
- 好处:支持注解配置。可以不需要web.xml了。
- 操作步骤:
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 复写方法
-
在类上使用@WebServlet注解,进行配置 @WebServlet("资源路径")
image.png
网友评论