浅析servlet

前言:最近两个礼拜,在和同学搞一个项目,面临上线,测试等一系列问题,又出现了很多bug…所以博客断了那么一段时间,现在有时间了,还是要坚持写博客。

什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

上面这段话来自百度百科
官方的话总有这么一个尿性,用专业的话解释专业的词语。总是能让人感觉一头雾水…。咱们好好说人话行吗…那我就来说一句人话吧----什么是servlet呢?servlet就可以运行在服务器端的一段java代码

针对Servlet技术的开发,Sun公司提供了一些列接口和类,其中有一个比较重要的接口javax.servlet.Servlet;Servlet就是一种实现了Servlet接口的类,它是由Web容器负责创建并且调用,用于接收和相应用户的请求。下面来看一下Servlet这个接口中定义的方法。
在这里插入图片描述
如上图所示:Servlet接口定义了5个方法:
init方法:负责Servlet初始化的工作。Servlet首次被创建时候调用。
getServletConfig:返回容器调用init时创建的ServletConfig对象
getServletInfo返回一个字符串消息,其中包含了关于Servlet信息
service负责相应用户的请求 ,当容器接收到客户访问Servlet对象请求时,就会调用此方法。
destory负责释放Servlet对象所占有的资源。当Servlet对象被销毁时,容器会调用此方法。


Servlet的生命周期如下:

在这里插入图片描述
Servlet的生命周期主要分为3个阶段。1.初始化阶段 2.运行阶段 3.销毁阶段 下面对这三个阶段简单介绍一下:

1.初始化阶段

当客户端发送了HTTP请求之后,Servlet容器首先会解析请求,检查内存只能怪是否有了该Servlet对象。如果有那么直接使用该Servlet对象。如果没有就创建Servlet实例对象。然后就会调用**init()**方法。那么也就是说,在Servlet的整个生命周期内他的init初始化方法只会被调用一次

2.运行阶段

这是Servlet中最重要的阶段,Servlet容器会创建请求的ServletRequest和相应的ServletResponse。然后将他们作为参数传递给Servlet的service方法。所有的请求信息在ServletRequest中,然后通过ServletResponse对象生成相应结果。在Servlet的生命周期内,对于Servlet的每一次访问请求,Servlet都会调用一次service()方法,并且新创建的ServletRequest和ServletResponse对象。service()会在生命周期中执行多次

3.销毁阶段

当服务器关闭或web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁之前会调用**destory()**方法,这样servlet对象就会释放它所占有的资源。在Servlet的生命周期当中destory()也只会被调用一次。服务器关闭或web应用被移出容器

来看一下Servlet的继承关系。

在这里插入图片描述
由于大多数WEB应用都是通过HTTP和客户端进行交互,在Servlet接口中,提供了一个抽象类javax.servlet.http.HttpServlet,他是GenericServlet的子类专门用户创建HTTP的servlet,源码片段如下:


// 根据请求的不同 定义不同的处理方法
 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);
        }
    }
// 将请求和相应分别转为 HttpServletRequest 与HttpServletResponse     
public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException
    {
        HttpServletRequest  request;
        HttpServletResponse response;
        
        if (!(req instanceof HttpServletRequest &&
                res instanceof HttpServletResponse)) {
            throw new ServletException("non-HTTP request or response");
        }

        request = (HttpServletRequest) req;
        response = (HttpServletResponse) res;

        service(request, response);
    }
    

分析上述代码发现,HttpServlet主要有两大功能:
1、根据用户请求方式的不同,定义相应的doXXX()处理方法请求
2、通过service()方法将HTTP请求和相应分别转为HttpServlet和HttpServletResponse类型的对象

由于大多数的请求都是GET和POST提交。当我们定义我们自己的Servlet的时候,就可以通过继续·HttpServlet然后重写doget 和dopost方法。


小结
servlet的生命周期。
1、创建 调用service()方法,第一次被访问时加载
2、初始化 调用init()方法,每次访问时都会被调用
3、销毁destory()方法,当服务器关闭,或web应用被移除时。

发布了98 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/100179945