Servlet配置方式
浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式 -- 基于xml的配置方式、基于注解的配置方式。
1.基于xml文件的配置方式
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>Demo</servlet-name> <servlet-class>com.nenu.Demo</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo</servlet-name> <url-pattern>/Demo</url-pattern> </servlet-mapping> </web-app>2.基于注解的配置方式
在需要配置的类前面加:
@WebServlet("/Demo1")例如前面的xml配置文件可以被替换为:
@WebServlet("/Demo1")//这里配置Servlet public class Demo1 implements Servlet { }我们会在xml文件配置不直观,麻烦,而且xml中需要配置所有其他的东西,所以后期Servlet一般都用注解的方式替代。Servlet有很多注解,可以对Servlet更方便的配置。
上述两种配置结果完全一样。
Servlet的生命周期
1.首先我们应该清楚Servlet层级关系:
Servlet(接口)-->GenericServlet(抽象类,与协议无关的Servlet)-->HttpServlet(抽象类,实现了Http协议的Servlet)-->Custom Servlet(自定义的Servlet)
Servlet(接口)-->GenericServlet(抽象类,与协议无关的Servlet)-->HttpServlet(抽象类,实现了Http协议的Servlet)-->Custom Servlet(自定义的Servlet)
2.下面通过Servlet接口来了解Servlet生命周期。
1.概述
1.作为一个对象来讲,一定会有创建、使用和回收的过程~
2.java有专门的垃圾回收机制,会自动的帮助我们回收对象,有不同的算法对对象进行回收。我们首先需要了解基础,后期深入了解垃圾回收机制和java虚拟机内存结构等等。学过C++,C++的对象一定要释放。但Java你只需要创建对象就好了。
- 声明周期显示到代码里,就是这样,Servlet类里面有五个方法:init、ServletConfig、service、getServletInfo、destory。
- 其中init是servlet的初始化,service是servlet业务方法、destory释放了servlet对象
- 其他两个方法与其声明周期无关
2.init、 service和destory方法:
我们在init、service、和destory三个方法设置后台输出输出,如果调用了相应方法就会在后台显示;
从而方便我们判断servlet的声明周期情况:
package com.nenu; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/Demo1") public class Demo1 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("执行servlet的初始化"); }//设置输出 @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("执行servlet业务逻辑"); }//设置输出 @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("servlet的销毁"); }//设置输出 }
(1)如下是启动项目之后后台的输出:
说明调用了init方法,然后调用了service
(2)再刷新几次,显示又调用了很多次service:
- init方法执行一次,servlet对象就存在了,之后的访问都是使用同一个servlet对象。首先检测servlet容器里面有没有目标Demo1的实体类对象。没有的话创建一个,然后调用它的service;第二次再检测,没有则创建,有就直接用。这样可以节约很多内存空间,而且只需要有一个servlet目标对象即可。类似于我们打电话只需要一部手机接打电话,可以无限循环的打电话,而不需要每次打电话都换一台手机。
- destory方法什么时候执行呢?tomcat一关,开始释放资源,当tomcat服务停掉了,装载servlet的对象就停掉了。
- 那么对象怎样创建出来的呢,servlet方法是非静态方法,非静态方法的调用必须借助于对象。这里并没有看到new Demo1的对象,我们没看到并不代表不存在。而这一系列的完成都是由tomcat容器完成的。通过反射机制来创建对象。通反射机制拿到构造函数,反射创建对象一般都是调用无参的构造函数。
下面通过实例感受无参构造函数的调用。
3.无参构造函数:
我们可以把无参的构造函数重写一下,添加到代码里:
public Demo1(){ System.out.println("创建了Servlet对象"); }启动后的输出结果:
输出结果印证了:是先构造对象(调用无参构造函数),再调用方法(init、service等)。
而后关闭tomcat,对象销毁↓↓↓
4.总结:
(1)Servlet的生命周期(从创建到销毁):
- 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第三步。
- 调用init方法完成初始化操作
- 调用Servlet方法完成业务逻辑操作
- 关闭tomcat时,会调用destory方法,释放当前对象所占用的资源
(2)Servlet声明周期方法
包括无参构造函数、init、service、destory
- 无参构造函数只调用一次,创建对象
- init只调用一次、初始对象
- service调用N次,执行业务方法
- destory只调用一次,卸载对象