浅谈Java Servlet工作流程

浅谈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 {
    // NOOP by default
}

@Override

  public void init(ServletConfig config) throws ServletException {

    this.config = config;

    this.init();

}

 

在初始化完成后,服务器会创建两个对象:ServletRequest请求对象和ServletResponse响应对象,会封装浏览器的请求数据和返回给浏览器的响应数据。

接着服务器会调用Servlet中的service接口,并传入刚刚创建好的两个对象,该接口已被GenericServlet继承并抽象化以供HttpServlet调用。在HttpServlet中也有两个service,第一个是继承的GenericServlet中的,在这里service将ServletRequest和ServletResponse对象强转为HttpServletRequest和HttpServletResponse,然后调用另一个service并传入转完后的两个对象。

@Override

  public void service(ServletRequest req, ServletResponse res)

    throws ServletException, IOException {

  

    HttpServletRequest  request;

    HttpServletResponse response;

  

    try {

        request = (HttpServletRequest) req;

        response = (HttpServletResponse) res;

    } catch (ClassCastException e) {

        throw new ServletException(lStrings.getString("http.non_http"));

    }

    service(request, response);

}

 

后面这个service则判断了请求方式,再根据请求方式的不同调用不同的方法,比如这里请求方式为get,则调用了doGet方法,由于我们已经将doGet方法重写,所以会直接执行我们写的方法。

最后处理完业务,向浏览器响应数据。

 

 

 

 

 

 

 

 

刘玉江

2020年11月29日

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值