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

 

posted @ 2018-09-09 11:06  早起的虫儿去吃鸟  阅读(301)  评论(0编辑  收藏  举报