关于Servlet需要注意的地方

Servlet的生命周期是由servlet的容器来控制的。分为3个阶段:初始化阶段运行阶段销毁阶段

*  初始化阶段(客户端的第一次请求过来的时候)

Ø  Servlet容器加载servlet,把它的.Class文件中的数据读到内存中;

Ø  Servlet容器创建servletConfig对象ServletConfig对象包含了servlet的初始化配置信息。此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext相关联

Ø  Servlet容器创建servlet对象;

Ø  Servlet容器调用servlet对象init(ServletConfig config)方法。通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象与servletConfig对象相关联,而servletConfig对象又与当前对象的servletContext对相关联。而servlet容器完成servlet后,servlet对象只要通过getServletConfig()方法就能得到web应用的servletConfig对象;

注:关于init方法需要特别注意:Servlet内部有两个init方法可以重写(详细分析可见81),第一个是不带参数的init()方法,另外一个是带ServletConfig对象参数的init(ServletConfig config)方法。对于这两个方法的重写总结如下:带参数的init方法是给Tomcat容器调用的,如果用户想调用,请一定要记得重写父类的init方法:

super.init(config);否则调用具体的config对象时,如:

this.getServletConfig().getServletName();方法时就会报

NullPointrException的错误,而为了避免这种错误的出现(往往让不知情的程序员比较难找),于是提供了另一个不带参数的init()方法,而带参数的方法实现为:

public void init(ServletConfig config) throws ServletException {

    this.config = config;

    this.init();

}

这样,程序员就可以方便地通过重写不带参数的init()方法也能实现一些必要的初始化工作

注:servlet初始化的情况:

(1)web应用处于运行阶段时,特定的servlet被客户端首次请求访问;

(2)web.xml文件中为servlet设置了<load-on-startup>元素

<servlet>

<servlet-name>servlet1</servlet-name>

<servlet-class>servlet.servlet1</servlet-class>

<load-on-startup>0</load-on-startup>

</servlet>

   说明:在servlet配置中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动时候加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当值为一个负数或者没有启动时,则指示容器在该servlet被选择时才加载;正数的值越小,启动该servlet的优先级越高。

(3)web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化;

*  运行阶段:

在这个阶段servlet可以随时响应客户端的请求,当servlet容器接到访问特定的servlet请求时,servlet容器会创建针对与这个请求的servletRequestservletResponse对象,然后调用service()方法,并把这两个对象当作参数传递给service()方法,service()方法通过servletRequest对象获得请求信息,并处理该请求,再通过servletResponse对象生成相应结果。

注:不管是post还是get方法提交,都会在service中处理,然后,由service来交由响应的doPostdoGet方法处理,如果你重写了service方法,就不会再处理doPostdoGet了,如果重写service()方法,可以自己转向doPost()doGet()方法。当servlet容器把servlet生成的响应结果发给客户后,servlet容器会销毁servletRequestservletResponse对象。

*  销毁阶段:

web应用被终止时,servlet容器会先调用web应用中所有的servlet对象的destroy()方法,然后销毁servlet对象。此外容器还会销毁与servlet对象关联的servletConfig对象。在destroy()方法的实现中,可以释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。

注:servlet的生命周期中,servlet的初始化和销毁只会发生一次,因此init()destroy()方法只能被servlet容器调用一次,而service()方法取决于servlet被客户端访问的次数。

注:Servlet中还有个特殊的方法Service,参加网易笔试后才知道,郁闷~~

在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏??

正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像HttpServlet等具体的servlet都是直接或者间接实现了这个接口)里面就有这个方法,所以不管是怎样的servlet类,都有service方法,没有service就不能称为一个Servlet了。
而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGetdoPos以及其他的doXXXt方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。如果重写了service方法,那么servlet容器就会把请求交给这个方法来处理,倘若你重写的service方法没有调用doXXX,即使你在Servlet中又重写了其他doGet doPost等也是不回被调用的 因为Servletservice被自动调用(就像init destory一样),所以如果你由于某种需要,需要重写service方法,并且更具不同的method调用doPost doGet等时,就要在末尾加上一句super.service(),这样就可以解决问题了。

通过API可以看到在HttpServlet类中的两个service方法:service(ServletRequest, ServletResponse)方法是重写的其父类GenericServlet类的方法,这个方法是公共的(public),其作用是接受客户端的请求并将其传递给service(HttpServletRequest, HttpServletResponse)方法;service(HttpServletRequest, HttpServletResponse)方法是HttpServlet类定义的方法,是受保护的(protected),主要作用是接受标准的Http请求(HttpServletRequest),并根据请求方式不同分发到不同的doXXX(HttpServletRequest, HttpServletResponse)方法。 这就是HttpServlet有两个service方法的原因了。一般情况下我们的Servlet只需重写受保护的service方法就够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值