【java web】Servlet生命周期

简介: 在Java web中 Servlet 是根基。虽然工作中几乎没人再去写Servlet了,框架为我们完成了这些工作。我们只要专注于业务逻辑的实现。但是理解Servlet还是很有必要的。 1. Servlet的架构图 Servlet Container 指的是Tomcat这样可以处理Servlet的服务器。

在Java web中 Servlet 是根基。虽然工作中几乎没人再去写Servlet了,框架为我们完成了这些工作。我们只要专注于业务逻辑的实现。但是理解Servlet还是很有必要的。

1. Servlet的架构图

Servlet Container 指的是Tomcat这样可以处理Servlet的服务器。

2. Servlet是怎么处理请求的?

做一个实验,首先用Eclipse新建一个项目,如下

需要我们自己编辑的有四个文件

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="get">
<label>用户名</label>
<input name="username" type="text">
<br/>
<label>密码</label>
<input name="password" type="password">
<input type="submit" value="登陆">
</form>

</body>
</html>

doGet.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Get Success
</body>
</html>

doPost.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
post success
</body>
</html>

着重讲一下LoginServlet.java, 新建一个Servlet, Eclipse会默认生成doGet 和 doPost方法。 init()方法和destory()方法是从HttpServlet继承的, 我们只做一个打印,直接调用HttpServlet的实现,这样不会影响Servlet的运行

package com.yeyeck.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1L;
    
    
    @Override
    public void init() throws ServletException {
        System.out.println("init() worked");
        super.init();
    }
    
    
    @Override
    public void destroy() {
        System.out.println("destroy() worked");
        super.destroy();
    }
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service() worked");
        super.service(req, resp);
    }
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet() worked");
        System.out.println("hash: " + this.hashCode());
        // TODO Auto-generated method stub
        System.out.println(request.getParameter("username"));
        System.out.println(request.getParameter("password"));
        response.sendRedirect("doGet.jsp");
//        response.getWriter().append("登陆成功");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        System.out.println("doPost() worked");
        System.out.println("hash: " + this.hashCode());
        System.out.println(request.getParameter("username"));
        System.out.println(request.getParameter("password"));
        response.sendRedirect("doPost.jsp");
    }

}

 

把项目部署到Tomcat跑起来,浏览器键入访问地址

会看到

右键检查,会看到表单现在的提交方式是get

 

 在输入框内随便输入一些数据,提交。观察Eclipse控制台

页面跳转到

从控制台输出,我们可以看到,这次get请求,依次调用了 init()、service()、 doGet()方法

回到index,再请求一次,控制台显示

可以发现,第二次请求,只调用了 service() 和 doGet() 方法, 并且两次打印的hash值是一样的

我们再把index.jsp的表单改成post方式提交, ctrl+save

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="post">
<label>用户名</label>
<input name="username" type="text">
<br/>
<label>密码</label>
<input name="password" type="password">
<input type="submit" value="登陆">
</form>

</body>
</html>

回到首页右键检查, 此时的请求方式已经变为post

随便输入一些数据,提交。控制台显示如下

发现又多了一些打印,这次post请求调用了 service() 和 doPost() 方法, 而且打印的hash值依然没有变。

关闭tomcat

 

回到console, 显示如下

发现调用了destory()方法

以上过程表明

  1. Hash值始终没变

  2. 只有第一次请求的时候调用了 init() 方法

  3. 每次请求都调用了service() 方法

  4. 调用完service() 方法后,会根据数据提交的方式,选择调用doPost() 或者 doGet() 方法

  5. Tomcat关闭的时候,会调用destroy()方法。

所以

  1. servlet是单例的

  2. init()方法只会在第一次请求这个Servlet的时候调用, Servlet()的生命周期开始

  3. 每次请求都会调用service() 方法, 并且在调用完service() 方法后,会根据数据提交的方式,选择调用doPost() 或者 doGet() 方法

  5. 仅在tomcat关闭的时候调用destroy()方法, Servlet的生命周期结束

 

相关文章
|
2月前
|
Java API 调度
Java 线程的生命周期
在JDK 1.5之前,线程的生命周期包括五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。JDK 1.5及之后增加了三种阻塞状态,共六种状态:新建、可运行、终止、锁阻塞、计时等待和无限等待。这些状态描述了线程在操作系统和JVM中的不同阶段。
Java 线程的生命周期
|
3月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
46 1
[Java]线程生命周期与线程通信
|
3月前
|
Java 调度
Java一个线程的生命周期详解
Java中,一个线程的生命周期分为五个阶段:NEW(新建),RUNNABLE(可运行),BLOCKED(阻塞),WAITING(等待),TERMINATED(终止)。线程创建后处于新建状态,调用start方法进入可运行状态,执行中可能因等待资源进入阻塞或等待状态,正常完成或异常终止后进入终止状态。各状态间可相互转换,构成线程的生命周期。
88 9
|
4月前
|
Java 应用服务中间件 数据库连接
探索研究Servlet 生命周期
【9月更文挑战第22天】
65 7
|
3月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
58 0
|
5月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
56 3
|
5月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
51 1
|
5月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
286 0
|
5月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
132 0
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
212 3

热门文章

最新文章