Servlet执行原理
servlet中并没有main方法,servlet中的方法是Tomcat进行调用的,在写好servlet后,配置好url,用户通过访问指定的url来访问Tomcat服务器,Tomcat服务器会根据用户的url去找对应的servlet
Servlet的创建与继承结构
要想实现一个servlet,java提供了Servlet接口
可以看到Servlet定义了一些基本方法:
- init:初始化servlet的方法
- service:提供服务的方法,当用户通过url访问servlet时,会调用该方法
- destroy:销毁servlet,在Tomcat容器关闭的时候,会调用该方法销毁servlet
我们可以直接通过实现Servlet接口来实现一个Servlet,比如这里的demo1
但是可以知道,实现一个接口必须要实现该接口的全部方法,但是有时候我们根本用不到一些方法,但是还是必须写出来,所以,Java中提供了抽象类GenericServlet
GenericServlet:
可以看到GenericServlet也是实现了Servlet接口,该抽象类为我们实现了一些方法,只有service方法没有实现,我们可以直接通过继承该类,来实现一个Servlet,而且我们只需要重写用到的方法,一起来看一下Demo2:
这样去创建一个Servlet是不是更简洁了些,但是我们却不经常这么写,我们一般都是直接继承HttpServlet
HttpServlet:
HttpServlet继承了GenericServlet,该类主要就是处理Http的,所以里面对Http做了一些处理,举个例子来说,继承了HttpServlet,我们的service方法就被分为了doGet和doPost方法,把服务的方法分成了服务Get请求和服务Post请求,一起来看一下这段逻辑:
首先获得了方法,然后判断方法时哪种,主要用到的就是GET和POST类型,如果是GET类型,就调用doGet方法,如果是POST类型,就调用doPost请求
一般的用法如Demo3所示:
Servlet生命周期
Servlet的生命周期可以分为实例化,初始化,请求服务,销毁四个过程。Servlet默认是懒加载机制,当第一次访问该Servlet的时候,会创建一个该Servlet,在后续的过程中就不会再进行创建,而是直接使用第一次创建好的
Servlet被加载实例之后,需要进行初始化,初始化调用init方法
初始化后的Servlet就处于就绪状态,调用service方法,由具体的Servlet实现。HttpServlet将service方法进行了拆分,分为doGet和doPost
通常Servlet容器停止或者冲重新启动都会引起销毁Servlet对象的动作,这时会调用destroy方法
下面看一下我的这段代码:
@WebServlet("/TestServletLife")
public class TestServletLife implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet init ..." + this.hashCode());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet service ..."+this.hashCode());
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("servlet destroy ..."+this.hashCode());
}
}
访问指定的url,发现init方法调用了,然后重新刷新页面不会再次调用init,可见init方法只会执行一次,每刷新一次service方法就会调用
关闭tomcat,会看到调用了destroy方法
配置Servlet的路径
上面我们已经提到了,在编写好Servlet后,并不能被直接访问,因为用户访问的是Tomcat服务器,而Tomcat服务器有很多Servlet,无法分辨到底是去调用哪一个Servlet,这就需要为Servlet配置一个url,可以通过web.xml中进行配置,在Servlet3.0版本之后还可以通过注解的方式进行配置
web.xml中进行配置:
servlet-name:这只是一个名字,可以随意起名
servlet-class:需要关联到对应的类
url-pattern:浏览器访问的url
注解进行配置
就在该类上面加注解,明确类了以后,这里只需要配置路径即可
补充:可以为一个类配置多个url
这三个url都可以路由到对应的Servlet
在路径中也可以加入通配符,但是通配符的优先级最低,比如:
有: /*,/demo
这两个url,但是如果访问/demo会优先访问第二个,Tomcat只有找不到的时候,才会去找通配符