Servlet的继承关系
可以看出Servlet下面有GenericServlet,而HttpServlet继承了GenericServlet
Servlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package javax.servlet;
import java.io.IOException;
public interface Servlet { void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy(); }
|
service发起请求该方法会被自动调用,而在器Httpservlet中service方法中方法不是抽象的,而在 service方法中,会首先获取表单请求的方法,进行判断调用相关的方法
doget与dopost方法
1 2 3 4
| protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg = lStrings.getString("http.method_post_not_supported"); this.sendMethodNotAllowed(req, resp, msg); }
|
而在调用的sendMethodNotAllowed的方法,会给出响应的操作
而对于405方法,httpsServlet中这些do方法都是405的实现风格,否则会报405错误,因此在新建servlet时,我们会区重写do方法。
Servlet的生命周期
首先我们的Servlet方法是Tomact容器去调用的,而servlet的生命周期init,service,destory正是者三个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.zss.servlets;
import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet;
public class TestServlet extends HttpServlet { @Override public void init(){ System.out.println("正在初始化"); } @Override public void service(ServletRequest servletRequest, ServletResponse response){ System.out.println("正在服务中"); } @Override public void destroy(){ System.out.println("销毁"); } }
|
当我们启动tomcat时,并且发送请求,容器自动初始化,并且开启服务,而当我们刷新了页面,相当于我们重新提交了一次请求,会再一次调用service方法,当我们销毁的时候,也就是tomcat关闭的时候,会调用destroy方法。
而其实在底层时tomcat服务器通过反射给与我们进行实例化,所有的请求只会通过一个实例进行操作。
这样的好处是,我们的系统初始化比较快,但是第一次请求比较慢,如果需要提高servlet的效应速度,则应该初始化响应的时机
Servlet的初始化时机:
- 默认第一次进行初始化
- 通过servletload进行初始化,值最小,初始化越前,tomcat会自动进行服务,最小值为0
1 2 3 4 5 6 7 8 9
| <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.zss.servlets.TestServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping>
|
Servlet在容器中是单例的,线程不安全的,因为所有的实例都是通过一个实例进行请求,所以尽量不要在servlet中设置成员变量,也不要通过servlet的值进行一些逻辑判断