package com.zs.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /*新建一个类实现Servlet接口并实现接口中的方法,可以看到有五个方法,我们学习Servlet生命周期 * 只需要看init(),service(),destroy()方法*/ @WebServlet("/aaa") /*这里的@WebServlet("/虚拟路径"),通过这样的写法,就可以直接设置虚拟路径,不需要配置文件了,比较方便*/ public class ServletDemo implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { // 被创建时执行该方法,只执行一次,用来创建servelt System.out.println("我被创建了"); } @Override public ServletConfig getServletConfig() { // 这个方法我们不关心 return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { // 执行servlet的内容 System.out.println("执行一次servelt服务"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { // 执行关闭销毁方法, System.out.println("我被销毁了"); } // 从上面我们可以看出,从init()被创建到destroy()被销毁,这就是servlet的生命周期 } /*代码编写完毕,我们运行tomcat,然后再浏览器中输入虚拟路径localhost:8080/aaa,就会得到运行结果如下: * 我被创建了 * 执行一次servelt服务 * 然后每刷新一次浏览器,就会多执行一次service方法,但是init方法只会执行一次,也就是只创建了一次servlet,多次刷新后结果如下: * 我被创建了 * 执行一次servelt服务 * 执行一次servelt服务 * 执行一次servelt服务 * 当我们关闭serlet服务器时,就会执行destory方法销毁这个servlet,,关闭服务器时,结果如下: * ...这里的日志文件就用...来替代了 * 10-Apr-2019 19:15:19.181 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-80"] * 10-Apr-2019 19:15:19.591 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"] * 我被销毁了 * 10-Apr-2019 19:15:19.971 信息 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina] * 10-Apr-2019 19:15:20.011 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-80"] * ... * 从上面可以知道,一个servelt的生命周期就是从init创建一直到destory销毁,中间的另外两个方法 * getServeltConfig,getServletInfo根据名字我们可以看出是获取Servlet的配置信息和Servlet信息的,我们现在不需要了解 * /
接着我们学习一下Servelt的结构体系:
之前我们已经 说过了,Servelt是一个接口,既然是接口就会有实现类,它有两个子类GenericServelt类和HttpServelt类,这两个类都是抽象类
GenericServelt 抽象类,需要重写service方法,
package com.zs.servlet; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; public class GenericServletDemo extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { /*从方法名我们可以看出,GenericServlet抽象类方法实现了Servlet接口的方法,并对Servelt接口的四个方法进行了重写,留下抽象方法service给我们实现,简化了代码*/ } }
HttpServlet 抽象类,对Http进行了封装,进行简化操作,doGet(),dopost()
package com.zs.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /*再idea中提供了一个快捷方式,直接在新建中找到servelt,然后输入类名就会自动生成下面代码*/ @WebServlet("/aaa") public class ServletHttpDemo extends HttpServlet { /*我们可以看出该类继承的HttpServelt抽象类中有两个抽象方法,分别是dopost,doget, 再之前学习Html时,我们学习过form表单有两种提交方式,分别是post和get,这两种提交方式就对应着两种方法, 当提交方式为post时,就执行dopost方法,当提交方式为get时,就调用doget方法*/ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }