一、Servlet规范
- Servlet规范来自于JavaEE规范,是JavaEE规范中的一种
1. Servlet规范作用
- 在Servlet规范中,指定动态资源文件开发步骤(三步)
- 在Servlet规范中,指定HTTP服务器调用动态资源文件规则(new对象,调用service方法,根据浏览器请求方式调用doGet或者doPost方法)
- 在Servlet规范中,指定HTTP服务器管理动态资源文件实例对象规则(Servlet生命周期)
二、servlet接口实现类
- Servlet接口来自于Servlet规范下的一个接口,这个接口存在于HTTP服务器提供的jar包中
- tomcat服务器下lib文件中有一个servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
- Servlet规范中认为,HTTP服务器能调用的动态资源文件必须是一个Servlet接口实现类(实现Servlet接口的Java类)
三、Servlet接口实现类开发步骤
1. 步骤一
- 创建一个Java类继承(extends)HttpServlet父类,使之成为一个Servlet接口实现类(HttpServlet继承自GenericServlet,GenericServlet实现了Servlet接口,则HttpServlet也实现了Servlet接口),而不是直接实现(implements)Servlet接口,这是为了简化开发难度,因为每次需要重写Servlet接口的5个方法(init、getServletConfig、service、getServletInfo、destroy),而我们通常只需要service这一个方法,而抽象类HttpServlet、GenericServlet的作用就是降低接口实现类(创建的Java类)对接口Servlet实现过程的难度,会将Servlet接口中不需要使用的抽象方法交给抽象类HttpServlet、GenericServlet进行完成,这样接口实现类(创建的Java类)只需要对接口Servlet需要的方法进行重写
1.1 tomcat根据Servlet规范调用Servlet接口实现类规则:
- tomcat创建Servlet接口实现类实例对象
Servlet demoServlet = new DemoServlet();
- tomcat根据实例对象调用service方法处理当前请求
通过父类决定在何种情况下调用子类中的方法(模板设计模式)
demoServlet.service();
2. 步骤二
- 重写HttpServlet父类两个方法,doGet或者doPost
3. 步骤三
- 将Servlet接口实现类信息注册到tomcat服务器,目录结构:webapp---->WEB-INF---->web.xml(写注册信息)
<web-app>
<!--配置相对应的Servlet类-->
<servlet>
<!--声明一个变量存储Servlet接口实现类类路径,与类名相同,首字母小写-->
<servlet-name>demoServlet</servlet-name>
<!--声明Servlet接口实现类类路径,相当于反射,完全限定名-->
<servlet-class>com.lzj.controller.DemoServlet</servlet-calss>
</servlet>
<!--以上即:
String demoServlet = "com.lzj.controller.DemoServlet";
-->
<!--配置Servlet对应的映射-->
<!--为了降低用户访问Servlet接口实现类难度,设置一个请求别名-->
<servlet-mapping>
<!--之前声明的变量-->
<servlet-name>demoServlet</servlet-name>
<!--设置请求别名,以“/”开头-->
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
四、Servlet生命周期
- 网站中所有的Servlet接口实现类的实例对象,只能由HTTP服务器负责创建,开发人员不能手动创建Servlet接口实现类的实例对象,即demoServlet由HTTP服务器负责,不需要我们额外干预
- 在默认情况下,HTTP服务器接收到对于当前Servlet接口实现类第一次请求时,自动创建这个Servlet接口实现类的实例对象。在手动配置的情况下,可以要求HTTP服务器在启动时自动创建某个Servlet接口实现类的实例对象
<servlet>
<!--声明一个变量存储Servlet接口实现类类路径,与类名相同,首字母小写-->
<servlet-name>demoServlet</servlet-name>
<!--声明Servlet接口实现类类路径,相当于反射,完全限定名-->
<servlet-class>com.lzj.controller.DemoServlet</servlet-calss>
<!--启动时创建实例对象-->
<load-on-startup>1</load-on-startup><!--填写一个大于0的整数(默认是0)数字大小代表优先级-->
</servlet>
- 在HTTP服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象(构造方法执行一次,可以理解为单例模式)
- 在HTTP服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁