文章目录
一、Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。
生命周期:
- 初始化:Servlet 调用 init () 方法进行初始化。
- 执行:Servlet 调用 service() 方法来处理客户端的请求。
- 销毁:Servlet 调用 destroy() 方法终止。
- GC:最后,Servlet 由 JVM 的垃圾回收器进行垃圾回收的。
1.初始化(init() )
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
也就是说init()方法运行只运行一次,第一次后就不会再进入init()方法运行init()中的代码。
方法:
@Override
public void init() throws ServletException {
// 初始化代码...
}
2.执行
2.1 service()
service() 方法是执行实际任务的主要方法。
当请求来的时候,Servlet会调用service()方法来处理客户端(也就是浏览器)的请求。处理完后返回数据给客户端浏览器
只要你写了service()方法不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有 service 方法,则优先调用 Service 方法。
如果你在service() 方法中只写了这一句,super.service(req, resp);。那么service方法会自动调用doGet()或doPost()方法的。
方法:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 执行实际任务...
}
2.2 doGet() 和 doPost()
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。他们可以根据请求类型,get请求或post请求来分别调用。。
在没有 service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法是doGet()。
在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法是doPost()
方法:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// get请求
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// post请求
}
3.销毁(destroy())
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
你想看一下destroy()的调用,是可以在服务器停止运行stop后看到的。你可以尝试在destroy()方法中加一句控制台输出,然后运行服务器,运行后再stop看一眼控制台就可以看到这个方法调用了。
方法:
@Override
public void destroy() {
// 结束代码
}
一、示例代码
可以参考我前面创建项目的文章(Java EE基础(3):第一个Web项目)。
然后把下面代码敲进入。一定要自己敲!
1.Servlet代码
下面是Servlet代码,包含了即将体验的方法。
(post因为需要表单jsp文件,暂时先不体验,但是我们可以体验一下get方法。体验一下是怎么回事)
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
@Override
public void init() throws ServletException {
// 初始化代码...
System.out.println("MyServlet init...");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do get...");
resp.getWriter().append("do get!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do post...");
resp.getWriter().append("do post!");
}
@Override
public void destroy() {
// 销毁...
System.out.println("destroy MyServlet...");
}
}
2.web.xml文件:
web.xml文件和
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<!--配置Servlet -->
<servlet>
<!-- servlet名字 -->
<servlet-name>MyServlet</servlet-name>
<!-- servlet类位置(包名加类名,写完后按住ctrl鼠标移到下面这行看能不能点击跳转,可以跳转说明写对了) -->
<servlet-class>com.changsheng.servlet.MyServlet</servlet-class>
</servlet>
<!--配置Sevlet访问方式 -->
<servlet-mapping>
<!-- 对应访问的servlet名 -->
<servlet-name>MyServlet</servlet-name>
<!-- 浏览器输入的地址 -->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
三、运行
部署项目可以参考我这篇文章:Java EE基础(4):优化第一个Web项目:Eclipse集成Tomcat并部署web项目
你问我为什么这样部署?原因很简单。这样Eclipse继承Tomcat后部署web项目简单,方便,快速。而且直接在控制台就可以看到信息,这多舒服。部署好了启动运行Tomcat
1.启动Tomcat
没有报错,启动成功!
2.浏览器访问
直接使用URL访问的话是get请求的。
http://localhost:8080/MyServlet
3.看一眼控制台
看看我们的控制台打印出了什么。
4.停止服务器
总结一下:我们经过这个案例,了解了Servlet的生命周期。
如果你什么地方感觉理解欠佳,推荐再回头去看一下我之前的文章,如果我文章什么地方描述的不太容易理解可以私信我。
参考:
Servlet 生命周期菜鸟教程:https://www.runoob.com/servlet/servlet-life-cycle.html
相关
更多Java EE基础的 Servlet与JSP相关 请点击:【Servlet + JSP】 目录