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新手,若有错误,欢迎指正!

posted @ 2020-04-18 10:39  跑调大叔!  阅读(411)  评论(0编辑  收藏  举报