• 关于servlet


    没事看了会儿servlet,觉得里面的很多东西自己以前都不懂,用spring mvc用多了,以为servlet就是一个DispatcherServlet,通过web.xml里面的servlet-mapping映射后,通过配置的url可以直接访问servlet,servlet通过里面的某一个方法来处理这个请求,通过httpservletresponse返回给客户端。

    对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息并处理该请求,通过ServletResponse对象向客户返回响应结果

    其实要理解httpservlet还得从HTTP协议入手啊!HTTP是一种基于请求/响应模式的协议。客户端发送一个请求,服务器返回对该请求的响应。HTTP使用可靠的TCP连接,默认端口是80。在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接。在会话开始后,浏览器或服务器都可以随时中断连接,例如,在浏览网页时可以随时点击“停止”按钮中断当前的文件下载过程,关闭与Web服务器的HTTP连接

    所以对于httpservlet而言,它能根据客户端发出的http请求,生成相应的http的响应。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpServletRequest对象,并把HTTP请求信息封装到HttpServletRequest对象中,这大大简化了HttpServlet解析请求数据的工作量。如果没有HttpServletRequest,HttpServlet只能直接处理Web客户发出的原始的字符串数据,有了HttpServletRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中任何一部分信息;Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的每一部分内容

    上面的内容大部分都是从网上摘抄下来的,现在说说我的想法吧。记得以前学servlet的时候老师就告诉我们直接继承httpServlet,然后重写doGet()和doPost()方法就可以了。以前不懂,只知道照着做,还以为servlet容器会自动判别是调用get方法还是调用post方法。今天看了一下httpservlet的源码,发现其实servelt是通过调用service()方法来处理客户端的请求的,不过httpservlet的service()方法里面是这样的:

    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;
                    try {
                        ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    } catch (IllegalArgumentException iae) {
                        // Invalid date header - proceed as if none was set
                        ifModifiedSince = -1;
                    }
                    if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                        // 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);
            }
        }

    原来是httpservlet里面的service()方法来判断是否是post方式还是get方式。至于为什么参数有ServletRequest变成了HttpServletRequest,我就不太清楚了,HttpServletRequest是ServletRequest的子类,也就是说HttpServletRequest更具体一点,可能是servlet容器来判断的吧,如果是一个http的客户端请求,servlet容器就把这些请求组装成一个httpservletrequest对象吧,如果不是http请求可能就组装成其它的servletrequest对象。个人看法,请各位指导指导,谢谢

  • 相关阅读:
    Hive初步认识,理解Hive(一)
    Beeline里面执行hive脚本 函数nvl2()与replace()报错
    Navicat定时在MySQL与MySQL数据库之间自动传输数据
    Hive 报错 Error while compiling statement: FAILED: ParseException line 1:0 character '' not supported here (state=42000,code=40000)
    关于大数据T+1执行流程
    Hive部分函数解析
    关于JDK动态代理与Cglib代理
    关于Excel做表小知识记录
    Java实现自定义注解开发
    bzoj1179[Apio2009]Atm
  • 原文地址:https://www.cnblogs.com/xiezhong/p/3988859.html
Copyright © 2020-2023  润新知