【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的生命周期结束

 

相关文章
|
8天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
13天前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
17 1
|
6天前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
17 0
|
11天前
|
Java Maven Android开发
解锁Web开发新技能:从零开始的Struts 2之旅——让你的Java编程之路更加宽广,首个应用实例带你飞!
【8月更文挑战第31天】对于初学者,掌握 Struts 2 框架不仅能提升 Web 开发能力,还能深入了解 MVC 架构。Struts 2 是一个基于 Servlet 的 Java 框架,提供表单验证、文件上传、国际化等功能,便于快速构建易维护的 Web 应用。本文通过示例演示如何从零开始搭建环境并创建一个简单的 Struts 2 项目,包括配置 `struts.xml`、编写 Action 类及视图文件,并配置 web.xml。通过这些步骤,你将学会基本的开发流程,为进一步学习高级功能打下基础。
23 0
|
11天前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
19 0
|
11天前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
23 0
|
11天前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
23 0
|
11天前
|
开发者 Java Spring
【绝技揭秘】掌握Vaadin数据绑定:一键同步Java对象,告别手动数据烦恼,轻松玩转Web应用开发!
【8月更文挑战第31天】Vaadin不仅是一个功能丰富的Java Web应用框架,还提供了强大的数据绑定机制,使开发者能轻松连接UI组件与后端Java对象,简化Web应用开发流程。本文通过创建一个简单的用户信息表单示例,详细介绍了如何使用Vaadin的`Binder`类实现数据绑定,包括字段与模型属性的双向绑定及数据验证。通过这个示例,开发者可以更专注于业务逻辑而非繁琐的数据同步工作,提高开发效率和应用可维护性。
31 0
|
13天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
12 0
|
23天前
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
59 1