首页 > 代码库 > Servlet的一些细节(2)

Servlet的一些细节(2)

 

1. Servlet的创建时间

Servlet是不能单独运行,调用它的叫做Servlet引擎,或者叫做web服务器

针对客户端的多长Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出,Servlet实例对象才会销毁。

 

Servlet对象一旦被创建,就会执行init方法,一旦销毁就会执行destroy方法。可以通过这两个方法观察Servlet对象的生命周期

所以如果编写了一个Servlet类Demo时,在启动服务器的时候,是不会创建Demo这个Servlet对象的,只有在浏览器的URL中访问到http://.../Demo的时候,才会执行init方法并创建这个对象。我们关掉浏览器后,这个对象并不会消失,以后再访问这个地址,还是原来的Servlet对象。

只有我们停掉这个服务器时,才会摧毁这个对象

但是每次访问请求都会调用Servlet的service方法,并且每次请求,Servlet请求都会创建一个HttpServletRequest请求对象和一个HttpServletResponse对象,然后将这两个对象作为参数给service方法,service方法再根据请求方式调用doXXX方法。

HttpServletRequest请求对象和HttpServletResponse对象的生命周期是很短的,比如说新浪的网站每天有几亿个请求,就会有几亿个对象,但是对象在请求结束后立即销毁,所以只要不是同时这么多请求,对服务器内存的压力还不是很大的。

 

2.Servlet对象也可以是web服务器启动的时候创建,而不是第一次访问的时候

  <servlet>    <servlet-name>ServletDemo</servlet-name>    <servlet-class>cn.school.ServletDemo</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>


structs框架其实就是一个大的Servlet程序,它就被配置服务器启动时候生成对象。

里面数字大小就确定了启动的顺序,数据越小优先级越高。

 

3. 缺省Servlet

如果某个Servlet的映射路径仅仅是一个正斜杠,那么这个Servlet就成为当前web应用程序的缺省Servlet

凡是在web,xml文件中找不到匹配的Servlet-mapping元素的URL,他们的访问请求都会交给缺省Servlet处理。

在Java中,所有的请求都会走Servlet。

不管是动态的,静态的,图片,视频还是什么什么的。

比如说我们新建一个1.html静态页面,然后什么也不做,在浏览器中输入http://localhost:8080/T_D623/1.html

就可以找到这个静态页面。

这是因为服务器为我们配置了一个默认Servlet路径

所有服务器配置文件都在C:\tomcat\conf这个文件夹下,有一个web.xml为服务器下的所有程序共享。

下面注册了一个Servlet,启动级别是服务器启动时启动

    <servlet>        <servlet-name>default</servlet-name>        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>0</param-value>        </init-param>        <init-param>            <param-name>listings</param-name>            <param-value>false</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>


它的注册路径是

    <servlet-mapping>        <servlet-name>default</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>


就是所有找不到正确路径的请求都走这一条路径

当我们请求一个静态页面时,就会通过这条路径请求,去查找项目中有没有对应名称的静态页面,如果没有就会返回

 

所以呢,如果我们在项目中自定义了一个默认Servlet路由,那么就会取代服务器中的,所以要慎重。