浅谈Java Servlet工作流程
1 引言
Java Servlet是运行在服务器上的程序,其工作在Http请求和数据库或其他应用程序的中间层。从客户端到Servlet服务器大致流程如下:
浏览器通过发送请求找到servlet-mapping,再根据映射找到servlet,然后根据servlet-class找到我们自定义的servlet。到这就开始执行我们所写的代码了吗?其实中间还有一系列过程。
2 工作流程
在我们写的HelloServlet中继承了HttpServlet,一步一步查找父类,我们可以得出以下关系:
Servlet接口
public interface Servlet { //容器在启动的被调用,仅调用一次 void init(ServletConfig var1) throws ServletException; //获取Servlet配置 ServletConfig getServletConfig(); //处理具体请求 void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; //获取Servlet的相关信息 String getServletInfo(); //Servlet销毁后释放资源 void destroy(); } |
在找到HelloServlet后通过反射机制创建对象,同时也创建servletConfig,里面存放着初始化信息。接下来就会执行init方法,但是我们并没有重写init方法,所以会到其父类HttpServlet中寻找,这里也没有,继续向上寻找,发现在GenericServlet中。其中有两个init方法,第一个是继承了Servlet接口中的init方法,另一个是空的,以供我们去重写,也是为了防止我们在有需求重写init方法时覆盖这里的初始信息。
public void init() throws ServletException {
|
在初始化完成后,服务器会创建两个对象:ServletRequest请求对象和ServletResponse响应对象,会封装浏览器的请求数据和返回给浏览器的响应数据。
接着服务器会调用Servlet中的service接口,并传入刚刚创建好的两个对象,该接口已被GenericServlet继承并抽象化以供HttpServlet调用。在HttpServlet中也有两个service,第一个是继承的GenericServlet中的,在这里service将ServletRequest和ServletResponse对象强转为HttpServletRequest和HttpServletResponse,然后调用另一个service并传入转完后的两个对象。
|
后面这个service则判断了请求方式,再根据请求方式的不同调用不同的方法,比如这里请求方式为get,则调用了doGet方法,由于我们已经将doGet方法重写,所以会直接执行我们写的方法。
最后处理完业务,向浏览器响应数据。
刘玉江
2020年11月29日