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路由,那么就会取代服务器中的,所以要慎重。