Servlet知识点总结

来源:互联网 发布:linux查看hca卡 编辑:程序博客网 时间:2024/06/11 03:47

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.*的夹包里面的东西还有很多,我也没有研究完,就把自己分析到的写了一点笔记,若有问题,还希望各位大神指点,虚心求教。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 白色衣服被黑色衣服染了怎么办 夏天出汗衣服粘身上都是毛毛怎么办 支付宝租的手机坏了怎么办 新买的衣服布料扎人怎么办 洗衣服的时候卫生纸沾裤子上怎么办 洗衣服给白衣服染上色了怎么办 不小心喝了游泳池的水怎么办 铁水中硅的含量高了怎么办 视频拍摄单人变双人是怎么办的 四季青进来的货比淘宝还贵怎么办 淘宝还没收货价格买贵了怎么办 在微信上赌博庄跑了怎么办 微信赌博输了10000多怎么办 欠了信用卡说来来家里调查怎么办 没用过的超市购物卡丢了怎么办 体验服抢号成功手机号填错了怎么办 起亚kx3一键启动钥匙没电怎么办 逆战下载的时候显示文件损坏怎么办 移动公司买手机送话费套路怎么办 开通京东白条身份信息被占用怎么办 丰巢快递柜把东西寄丢了怎么办? 圆通快递把我寄的东西弄丢了怎么办 快递把我寄出去的东西弄丢了怎么办 京东被盗刷都是到付怎么办 订机票时护照号错了怎么办 请问网上不小心点了扣话费了怎么办 不小心被中国移动扣了话费怎么办 京东买东西已经付款了说无货怎么办 不小心提交了两次中信信用卡怎么办 淘宝买东西扣了银行卡两次钱怎么办 拼多多同一个订单支付了两次怎么办 京东手机号服务密码忘记了怎么办 京东买的东西转手给别人保修怎么办 改了无线网密码还是上不去网怎么办 买的京东e卡丢了怎么办 已认证未抵扣的发票发生退货怎么办 办的消费卡不给退怎么办 银行卡密码忘了手机号也换了怎么办 公务卡在当当购物的刷卡单怎么办 杭州市网签提示住宅均价异常怎么办 吃鸡账号没有绑定手机就买了怎么办