自学内容网 自学内容网

JavaWeb学习--Servlet的创建方法、Servlet的生命周期(重要)

目录

(一)什么是Servlet

 (二)Servlet实现方式

实现Servlet有三种方式

方式一:实现javax.sevlet.Servlet接口

1.创建一个java文件,实现Servlet接口

2. 需要在web.xml中对Servlet进行配置

3.Servlet的生命周期 

Servlet的出生

Servlet服务

Servlet的离去

方式二:继承GenericServlet

 方式三:继承HttpServlet类, 专门处理http请求


(一)什么是Servlet

       Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;

  • 处理请求;

  • 完成响应。

       WEB开发,客户端与服务器: 一问一答 请求-响应

  例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口

 (二)Servlet实现方式

在实际开发中, Servlet需要程序员进行开发

实现Servlet有三种方式

  • 实现javax.servlet.Servlet接口

  • 继承javax.servlet.GenericServlet类;

  • 继承javax.servlet.http.HttpServlet类(后期都是这个)

  通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。  

方式一:实现javax.sevlet.Servlet接口

1.创建一个java文件,实现Servlet接口

Servlet对象创建,不需要程序员手动创建 new,  而是由Tomcat服务器创建
init(), service(),destroy() 三个方法调用, 由Tomcat服务器调用,称为生命周期方法

package com.fs.study.web;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Servlet的第一种实现方式: 实现Servlet接口
 * Servlet对象创建,不需要程序员手动创建 new,  而是由Tomcat服务器创建
 *  init(), service(),destroy() 三个方法调用, 由Tomcat服务器调用,称为生命周期方法
 */
public class AServlet implements Servlet {
    private ServletConfig config;
    /**
     * 初始化方法, Servlet类的对象创建之后, 调用init()  只执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Servlet出生...");
        this.config = servletConfig;
    }

    /**
     * 获取Servlet相关的配置
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return this.config;
    }

     /**
     * 服务方法:  处理客户端请求的方法
     *  客户端每请求该Servlet一次, service() 方法就执行一次  执行n次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("很高兴为您服务...");
        //获取初始化参数:使用ServletConfig对象的方法
        System.out.println(this.config.getInitParameter("k1"));
        //获取所有初始化参数的名字,使用ServletConfig对象的方法
        Enumeration<String> initParameterNames = this.config.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String key=initParameterNames.nextElement();
            String value=this.config.getInitParameter(key);
        }
    }

    /**
     * 返回Servlet描述信息, 无关紧要
     * @return
     */
    @Override
    public String getServletInfo() {
        return "你好,我是一个Servlet!!";
    }

    /**
     * 销毁方法, 当该Servlet被销毁之前,即关闭tomcat服务器之后调用该方法  只执行一次
     */
    @Override
    public void destroy() {
        System.out.println("拜拜");
    }
}

init()初始化方法:Servlet类的对象创建之后, 调用init(),在servlet的生命周期里只执行一次

service()服务方法:  处理客户端请求的方法,客户端每请求该Servlet一次,service() 方法就执行一次,总共执行n次

destroy()销毁方法:当该Servlet被销毁之前,即关闭tomcat服务器之后调用该方法,只执行一次

2. 需要在web.xml中对Servlet进行配置
<!--配置AServlet-->
    <servlet>
        <!--给Servlet类取一个名字, 推荐写类名 -->
        <servlet-name>AServlet</servlet-name>
        <!--对应Servlet类, 写的Servlet的包.类名-->
        <servlet-class>com.fs.study.web.AServlet</servlet-class>
        <!--初始化参数-->
        <init-param>
            <param-name>k1</param-name>
            <param-value>v1</param-value>
        </init-param>
        <init-param>
            <param-name>k2</param-name>
            <param-value>v2</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--通过servlet-name关联servlet标签 -->
        <servlet-name>AServlet</servlet-name>
        <!--配置servlet绑定的url:
           第一种写法: /url字符串    推荐写 /类名
         -->
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>

       在web.xml中配置Servlet的目的其实只有一个,就是把访问路径与一个Servlet绑定到一起,上面配置是把访问路径:“/AServlet”与“com.fs.study.web.AServlet”绑定到一起。

  • <servlet>指定AServlet这个Servlet的名称为AServlet;

  • <servlet-mapping>指定/AServlet访问路径所以访问的Servlet名为AServlet。

    <servlet><servlet-mapping>通过<servlet-name>这个元素关联在一起了!

在Servlet获取初始化参数

3.Servlet的生命周期 

       所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:

  • void init(ServletConfig);

  • void service(ServletRequest,ServletResponse);

  • void destroy();

Servlet的出生

        服务器会在Servlet 第一次被访问时创建Servlet ,或者是在 服务器启动时创建Servlet 。 如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。

       在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生 。 这个方法只会被调用一次。这好比小孩子出生后马上就要去剪脐带一样,而且剪脐带一生只有一次。

       我们可以把一些对Servlet的初始化工作放到init方法中!

Servlet服务

       当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。 服务器接收到一次请求,就会调用service() 方法一次 ,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

  • ServletRequest: 请求对象 核心对象

  • ServletResponse: 响应对象 核心对象

    每请求一次, tomcat为该次请求创建一个ServletRequest对象,ServletResponse对象

Servlet的离去

       Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。

 出生:

服务:

离去:

方式二:继承GenericServlet

       GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。GenericServlet类帮我们把其他四个方法都实现类, 只留下一个抽象service() 让我们重写,下面是编写Servlet类继承GenericServlet的源代码:

/**
 * Serclet第二种实现方式:继承GenericServlet类
 */
public class BServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("BServlet 为您服务^_^");
    }
}

 GenericServlet类的源代码:

package javax.servlet;

import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;

    public GenericServlet() {
    }

    public void destroy() {
    }

    public String getInitParameter(String name) {
        return this.getServletConfig().getInitParameter(name);
    }

    public Enumeration<String> getInitParameterNames() {
        return this.getServletConfig().getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }

    public ServletContext getServletContext() {
        return this.getServletConfig().getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

    public void init() throws ServletException {
    }

    public void log(String msg) {
        this.getServletContext().log(this.getServletName() + ": " + msg);
    }

    public void log(String message, Throwable t) {
        this.getServletContext().log(this.getServletName() + ": " + message, t);
    }

    public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletName() {
        return this.config.getServletName();
    }
}
  • 实现了Servlet的init(ServletConfig)方法,把参数config赋给了本类的成员config,然后再调用本类自己的无参的init()方法。

  • init()这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。

 方式三:继承HttpServlet类, 专门处理http请求

http请求中,提交方式: get请求, post请求, put请求, delete请求….

HttpServlet类专门提供处理指定提交方式的方法:

  1. doGet() 处理get请求
  2. doPost() 处理post请求

       在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。

Get请求:

  • 直接在浏览器地址栏输入网址

  • 使用<a href=""/> 也是get请求

  • 使用提交表单form, method没有写, 写get

post请求:

  • 使用提交表单form, method =“post”

get请求,post请求区别:

  1. get请求,请求参数通过url传递, post请求: 通过请求体传递参数
  2. get请求不安全, 有敏感字段, 一定不能使用get, post请求安全一些
  3. get请求无法传递文件参数, 提交文件必须使用post请求
  4. get请求参数有大小限制: 4KB, post请求没有限制

 Servlet基于xml配置

web3.0版本, 提供注解替换xml配置 @WebServlet(“绑定url”)


原文地址:https://blog.csdn.net/2301_76890677/article/details/144325961

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!