Servlet
宏观上来讲:Servlet是连接Web服务器与服务端java程序的协议,是一种通信归范。这个规范是以一套接口的形式体现。
微观来讲:Servlet是Servlet接口实现类的一个实例对象,是运行在服务器上的一段java小程序
Servlet的主要功能:根据客户提交的请求,调用服务器相关的java代码,完成对请求的处理与运算。
**Servlet生命周期
1,Servlet对象的创建(实例化):执行无参构造器
2,Servlet对象的初始化:执行init()方法
3,Servlet对象服务的执行:执行service()
4,Servlet对象被销毁的整个过程:执行destroy()方法
该过程由Web服务器负责管理,程序员可以获取到Servlet的生命周期时间点,并可以指定Servlet做一些具体业务相关的事情。
**Servlet特征:
1,一个Sevlet实例对象只创建和初始化一次(第一次访问时),但它的service()方法用户每提交一次请求,就会执行一次,所以Servlet是单例多线程的。
2,Servlet单例多线程,存在线程安全问题,一般情况下不去在Servlet中定义可修改的成员变量。
3,一个Servlet实例只执行一次destroy()方法,即在应用停止时(关闭服务器)执行。
4,默认情况下,Servlet在Web容器启动时是不会实例化的,(直接创建会占用内存),但对客户响应速度有影响的重要Servlet,一般会在Web容器启动时先创建好(在WEB-INF下的web.xml中设置)。
<!--注册Servlet-->
<Servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>全限定性类名</servlet-class>
<!--
1,load-on-up元素标记容器是否应该在Web容器启动时就创建Servlet
2,这个值必须为整数,如果该值为负数或没有设置,Servlet还是会在请求发出时创建。
3,如果值为正整数或0,则值越小,优先级越高,越先被加载。
-->
<load-on-startup>数字<load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>some-servlet</servlet-name>
<url-pattern>/some</url-pattern>
</servlet-mapping>
Servlet执行原理:
两个Map:
Web容器中存在两个Map,这两个Map的key均为Servlet注册时的url-pattern的值,但其value是不同的。
第一个Map的value是Servlet实例对象的引用,第二个Map是
servlet-class的值,即Servlet类的全限定性类名。
过程:
当对Servlet的请求到达Sevlet容器时,会先对请求进行解析,使用解析出的URI,作为比较对象,从第一个Map中查找是否存在相匹配的key,若存在相匹配的key,那么读取其value,即Servlet对象的引用,执行该Servlet的service()方法。若不存在相匹配的key,则到第二个Map中查找是否有相匹配的key,若存在,则读取其value,即要访问的Servlet的全限定性类名。然后使用反射机制class.forName(“全限定性类名”)创建Servlet实例,并将该实例写入到第一个Map中,然后再执行该Servlet的service()方法,若第二个Map仍未找到匹配的key,就会跳转到系统错误处理页面404。
常用状态码:
2xx:表示对请求计算与响应成功。其中常用的状态码是200
4xx:表示请求错误。其中常见的状态码是404,表示资源找不到。一般都是请求路径书写问题。
5xx:表示服务器错误。其中常见的状态码是500,表示服务器内部错误。一般都是服务端的java代码发生错误。
默认404 页面对用户不友好,可以在web.xml中指定一个更加友好的页面
<!--指定404状态码的错误页面-->
<error-page>
<error-code>404</error-code>
<location>/errors.html</location>
</error-page>