Servlet零散知识点总结

本文详细介绍了Servlet的生命周期,包括构造方法、init方法、service方法及destroy方法的调用时机。探讨了如何通过配置提前加载Servlet以优化首次访问速度,并讨论了多线程并发问题及其解决方案。

一、Servlet重要的四个生命周期方法

构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。

init方法: 创建完servlet对象的时候调用。只调用1次。

service方法: 每次发出请求时调用。调用n次。

destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。


二、servlet的生命周期时序图:




三、默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。

      改变servlet创建对象的时机: 提前到加载web应用的时候。在servlet的配置信息中,加上一个<load-on-startup>即可!!

<servlet>

    <servlet-name>LifeDemo</servlet-name>

    <servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>

    <!-- servlet对象自动加载 -->

    <load-on-startup>1</load-on-startup>  注意: 整数值越大,创建优先级越低!! 

</servlet>

 四、Servlet的多线程并发问题

注意: servlet对象在tomcat服务器是单实例多线程的。

 

因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

 

解决办法:

1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。


五、ServletConfig对象

ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)

对象创建和得到

创建时机: 在创建完servlet对象之后,在调用init方法之前创建。

得到对象: 直接从有参数的init方法中得到!


servlet的初始化参数配置

<servlet>

    <servlet-name>ConfigDemo</servlet-name>

    <servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>

    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->

    <init-param>

    <param-name>path</param-name>

    <param-value>e:/b.txt</param-value>

    </init-param>

 </servlet>

注意: servlet的参数只能由当前的这个sevlet获取!!!!

 

ServletConfigAPI

java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值

java.util.Enumeration getInitParameterNames()    获取所有参数

ServletContext getServletContext()     得到servlet上下文对象

java.lang.String getServletName()       得到servlet的名称


六、ServletContext对象

6.1 引入

ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一 ServletContext对象。

6.2 对象创建和得到

创建时机:加载web应用时创建ServletContext对象。

得到对象:ServletConfig对象的getServletContext方法得到


Sun公司设计

1)创建ServletContext对象  

 ServletContext  context = new ServletContext()

 

2)创建ServletConfig对象   

ServetConfig config = new ServletConfig();

         config.setServletContxt(context);

 class ServletConfig{

  ServletContext context;

public ServletContext getServletContxt(){

  return contxt;

}

 }

 

public void init( ServletConfig config ){

得到ServletConfig对象

ServletConfig对象中得到ServletContext对象

SerlvetContext context = config.getServletContext();

6.2 得到web应用路径

java.lang.String getContextPath()  用在请求重定向的资源名称中

6.3 得到web应用的初始化参数(全局)

java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数

java.util.Enumeration getInitParameterNames()  

 

web应用参数可以让当前web应用的所有servlet获取!!!

6.4域对象有关的方法

域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据


ServletContext就是一个域对象!!!!

 

保存数据:void setAttribute(java.lang.String name, java.lang.Object object)

获取数据: java.lang.Object getAttribute(java.lang.String name)  

删除数据: void removeAttribute(java.lang.String name)  

 

ServletContext域对象:作用范围在整个web应用中有效!!!

 

所有域对象:

HttpServletRequet 域对象

ServletContext域对象

HttpSession 域对象

PageContext域对象

 

6.5 转发

  RequestDispatcher getRequestDispatcher(java.lang.String path)

 

1)转发

  a)地址栏不会改变

  b)转发只能转发到当前web应用内的资源

c)可以在转发过程中,可以把数据保存到request域对象中

 

2)重定向

a)地址栏会改变,变成重定向到地址。

b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。

c)不能再重定向的过程,把数据保存到request中。

 

结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值