美文网首页
🏠 JavaEE 规范|Servlet 规范

🏠 JavaEE 规范|Servlet 规范

作者: en_young | 来源:发表于2022-11-15 19:20 被阅读0次

    Servlet 规范存在于自第一版 JavaEE 规范至今的所有规范版本中。Spring 中也有这个规范,其中 Servlet Stack 那一栈的所有技术都是基于 Servlet 规范来实现的。Servlet 规范作为非常重要且基础规范的角色🎭而存在。

    💡🔥Servlet 规范是用来做服务器端的表现层的。第一版 JavaEE 规范中规定它接收前端传来的 Request,根据 Request 又将服务器端分为容器和组件两部分,其中容器称为 Servlet 容器,组件称为 Servlet。并用规范分别定义了容器和组件应该做什么,从而形成了 Servlet 规范。

    Servlet 原理

    ⬆️Servlet 具体原理如上图所示。Http Request 是经 Web 服务器接收,然后转发到 Servlet 容器的,Servlet 容器会根据 Http Request 的具体内容要求,创建相应的 Servlet 组件并将请求派发给它。开发者可以自行创建并编辑 Servlet 组件,自定义逻辑处理。

    javax.servlet 实现的部分类图

    🌲而对于如何编写 Servlet 组件,Java EE 也给出了相应的 Servlet 组件规范。Servlet 组件规范定义了一系列的接口和类。如上所示,是标准实现库 javax.servlet 中的部分类图。如果想自定义组件 Servlet 就需要继承某些基类或实现某些接口,这就叫在规范下写代码。

    🌰举个例子,对于上图来说,如果想写一个基于 HTTP 协议的 Servlet 组件,那么就需要创建一个继承 HttpServlet 的类,并实现 doGet、doPost 等抽象方法,可以在这些方法体中自定义自己的处理逻辑。
    实际上,当一个 HTTP 请求到来后,会 Mapping 到具体的 Servlet 组件类,如果没有类实例,就创建 Servlet 对象实例,然后调用其 Service 方法,在 Service 方法中会根据传入的 HttpServlet 参数进一步决定调用哪一个 do 方法。如下所示,是 javax.servlet 实现中 service 方法。

    public abstract class HttpServlet extends GenericServlet
    {
        protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
        {
            String method = req.getMethod();
    
            if (method.equals(METHOD_GET)) {
                long lastModified = getLastModified(req);
                if (lastModified == -1) {
                    // servlet doesn't support if-modified-since, no reason
                    // to go through further expensive logic
                    doGet(req, resp);
                } else {
                    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    if (ifModifiedSince < lastModified) {
                        // If the servlet mod time is later, call doGet()
                        // Round down to the nearest second for a proper compare
                        // A ifModifiedSince of -1 will always be less
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else {
                        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                    }
                }
    
            } else if (method.equals(METHOD_HEAD)) {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
    
            } else if (method.equals(METHOD_POST)) {
                doPost(req, resp);
                
            } else if (method.equals(METHOD_PUT)) {
                doPut(req, resp);
                
            } else if (method.equals(METHOD_DELETE)) {
                doDelete(req, resp);
                
            } else if (method.equals(METHOD_OPTIONS)) {
                doOptions(req,resp);
                
            } else if (method.equals(METHOD_TRACE)) {
                doTrace(req,resp);
                
            } else {
                //
                // Note that this means NO servlet supports whatever
                // method was requested, anywhere on this server.
                //
    
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
                
                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
            }
        }
    }
    

    🌶️ 遵循 Servlet 组件规范开发的 Servlet 组件可以不用修改地放在不同的 Servlet 容器中执行,因为不同的 Servlet 容器都是遵循 Servlet 容器规范开发的。这就是规范的力量。

    相关文章

      网友评论

          本文标题:🏠 JavaEE 规范|Servlet 规范

          本文链接:https://www.haomeiwen.com/subject/urvjxdtx.html