zoukankan      html  css  js  c++  java
  • Servlet第一篇【Servlet简介、作用、生命周期、实现】

    一、Servlet简介

    Servlet是sun公司提供的一门用于开发动态web资源的技术。
    Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要 完成以下2个步骤:
      1、编写一个Java类,实现servlet接口。
      2、把开发好的Java类部署到web服务器中。
      按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

    简而言之,Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的运行在服务器端

    二、Servlet的作用

    Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互

    三、实现Servlet接口编写Servlet程序

    1、创建一个Servlet类,实现Servlet接口

    2、在Servlet中一共有5个方法需要我们实现,分别为:

    public class Servlet01 implements Servlet{
    	/**
    	 * 生命周期方法
    	 * 在Servlet被销毁之前调用,并且只会调用一次
    	 */
    	@Override
    	public void destroy() {
    		System.out.println("destroy()");
    	}
    
    	/**
    	 * 获取Servlet配置信息
    	 */
    	@Override
    	public ServletConfig getServletConfig() {
    		System.out.println("getServletConfig()");
    		return null;
    	}
    	
    	/**
    	 * 获取Servlet信息
    	 */
    	@Override
    	public String getServletInfo() {
    		System.out.println("getServletInfo()");
    		return null;
    	}
    	
    	/**
    	 * 生命周期方法
    	 * 在Servlet对象创建之后马上执行,并且只执行一次
    	 */
    	@Override
    	public void init(ServletConfig servletConfig) throws ServletException {
    		System.out.println("init()");
    	}
    	
    	/**
    	 * 生命周期方法
    	 * 会被调用多次
    	 * 每次处理请求都是调用这个方法
    	 */
    	@Override
    	public void service(ServletRequest request, ServletResponse response)
    			throws ServletException, IOException {
    		System.out.println("service()");
    	}
    }
    

    3、在WebRoot/WEB_INF/web.xml中进行配置

    <servlet>
      	<servlet-name>servlet01</servlet-name>
      	<servlet-class>com.zuobiao.servlet.Servlet01</servlet-class>
    </servlet>
    
    <servlet-mapping>
      	<servlet-name>servlet01</servlet-name>
      	<url-pattern>/Servlet01</url-pattern> 	<!-- 表示在浏览器中输入的访问路径 -->
    </servlet-mapping>
    

    当然,在以后的开发中都是使用的开发工具创建来Servlet类,创建完成之后也就自动在web.xml文件中配置好了,所以下面的实现都省去了这一步。

    四、Servlet的生命周期

    由第三点可以引出Servlet的生命周期方法共有三个:

    public void init(ServletConfig servletConfig) 
    public void service(ServletRequest request, ServletResponse response)
    public void destroy() 
    

    实际上Servlet生命周期可分为5个步骤:

    1. 加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
    2. 初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
    3. 处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
    4. 销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
    5. 卸载:当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
      简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。 destroy()只有在Tomcat关闭的时候才会被调用。

    五、Servlet的其他实现类

    (一)GenericServlet类

    ​ 由于有时候我们需要使用ServletConfig来获取项目的一些配置信息,即:读取web.xml中的一些信息,那么此时就还需要同时实现ServletConfig接口,这样就导致我们的Servlet类比较麻烦。
    ​ 因此sun公司就定义了另外的一个类,GenericServlet类,该类同时继承了Servlet接口和ServletConfig接口,也就是说该类同时实现了这两个接口的方法:

    init(ServletConfig config)
    destroy()
    getServletInfo()
    getServletConfig(ServletConfig config)
    getInitParameter(String name)
    getInitParameterNames()
    getServletContext()
    getServletName()
    

    并且在该类重载了一个无参init()方法,部分源码如下:

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
    
    /**
    *这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。
    */
    public void init() throws ServletException {
        // NOOP by default
    }
    

    这样就保证了我们可以405在往init()方法中添加代码的同时还不会重写有参init()方法,从而不会导致获取ServletConfig对象出现问题(这一方法非常值得学习)。

    然后我们当我们需要创建Servlet类时,只需要继承GenericServlet类,实现service方法即可。

    public class Servlet02 extends GenericServlet {
    	@Override
    	public void service(ServletRequest req, ServletResponse res)
    			throws ServletException, IOException {
    		
    	}
    }
    

    (二)HttpServlet类

    但GenericServlet类并不能满足我们的需求,因为通常我们都会和HTTP打交道,所以就出现了HttpServlet类。

    HttpServlet指能够处理HTTP请求的servlet,它继承了GenericServlet,并在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

    HttpServlet在实现Servlet接口时,重写了service方法,该方法会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法。

    注意:如果没有重写doGet或doPost方法,但是浏览器发送的请求的方法又是这两种的一种,则会报出405错误(表示该方法不支持)。

    public class Servlet03 extends HttpServlet {
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		System.out.println("doGet()...");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		System.out.println("doPost()...");
    	}
    }
    

    (三)总结

    实现Servlet有三种方式:

    1、实现javax.servlet.Servlet接口;
    2、继承javax.servlet.GenericServlet类;
    3、继承javax.servlet.http.HttpServlet类;
    通常我们会去继承HttpServlet类来完成我们的Servlet

    Java新手,若有错误,欢迎指正!

  • 相关阅读:
    gitlab文件夹的权限不要随便给777
    记python版本管理--pyenv
    centos7上基于kubernetes的docker集群管理
    centos下修改docker连接docker_host默认方式为tls方式
    微信公众帐号开发之一(java)
    java抓取12306火车余票信息
    对Word2Vec的理解
    软件工程课程助教总结
    2017面向对象程序设计(Java)第十七周助教工作总结
    2017面向对象程序设计(Java)第十三周助教工作总结
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12724512.html
Copyright © 2011-2022 走看看