Servlet知识点总结

xiaoxiao2021-02-28  93

Servlet知识点总结

1.什么是Servlet?

      其实Servlet就是一个类,又称服务器端的小应用程序,处理客户端的请求和响应。

2.Servlet接口:

  (1)Servlet的使用规则:Servlet是一个接口,所以我们需要创建一类来实

      现它。

  (2)Servlet的五大方法:

init(ServletConfig config);//初始化

getsServletConfig();//此接口的实现负责存储 ServletConfig 对象,以便此 

方法可以返回该对象。实现此接口的 GenericServlet 类已经这样做了。      

Service(ServletRequest req, ServletResponse res);//服务     

getServletInfo();//返回有关 servlet 的信息,比如作者、版本和版权。

Destory();//销毁Servlet

  (3)Servlet的生命周期:其中构造方法和init方法只在第一次访问时被调用,  

     service时每次请求都被调用。

    a.构造servlet(属于默认构造),然后init方法将其初始化

    b.处理来自客户端的所有对servies方法的调用

C.由Servlet容器调用,指示从服务器取出servlet然后使用destroy方法

销毁它,最后进行垃圾回收并终止它

知识点:如何让Service在服务器启动时就创建,就需要在web.xml文件中,

进行配置:<load-on-startup>此处填写除0以为的任意正整   

          </load-on-startup>

  (4)Servlet执行过程:

   

   (5)Servlet线程安全:

       Servlet单实例,多线程,所以应该写局部变量,而不是全局变量。

3.Servlet的三种创建方式:

   a.如上所述,实现Servlet接口

 B.继承GenericServlet类(适配器模式):属于abstrack class,使编写Servlet

   更加简易了。

   extends Object

   implements Servlet, ServletConfig, Serializable

   实现了Servlet除service的所有方法,因此我们只需要重写抽象方法  

   service就可以了

 C.继承http.HttpServlet类(模板方法设计模式):属于public abstract

   class,此创建方法使我们经常用到的

   Extends: GenericServlet

Implements: java.io.Serializable

不需要重写父类的service方法,因为其属于模板方法,就体现在service

上,要想实现自己的需求,我们需要实现一系列的以do开头的方法,如

doget,dopost等等。

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重写GenriceServlet的service方法,来调用自己的service

   方法,其本身目的是把请求与响应强转成拥有http协议的:

 

    @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("non-HTTP request or response");

        }

        service(request, response);

    }

 

4.ServletContext对象(可从ServletConfig中得到):一个应用只有一个

  ServletContext对象,单实例,底层为map实现

   a.三个作用:

     域对象的方法:

         通过map来实现Servlet共享,用到的方法有(都是对map的操作)

         serAttribute(String name,Object value);

         getAttribute(String name);

         removeAttribute(String name);

      获取全局配置信息的方法:

          this.getServletContext().getInitParameter(“encoding”);

      获取资源路径的方法:

          String path=this.getServletContext().getRealPath(“给出路

          ”);

    Properties pro =new Properties();

Pro.load(new FileInputStream(path));

然后输出:pro.gerProperty(“key”);

  b.Servlet的转发:

     this.getServletContext.getRequestDispatcher(String 

      path).forward(request,response);

由于本人正在剖析tomacat的源码,所以对Servlet各个类之间的关系做了整理,如下图:

  

 

对于javax.servlet.*和javax.servlet.http.*的夹包里面的东西还有很多,我也没有研究完,就把自己分析到的写了一点笔记,若有问题,还希望各位大神指点,虚心求教。

转载请注明原文地址: https://www.6miu.com/read-83220.html

最新回复(0)