标签:逻辑 有一个 att ebs port -name location 容器 创建
浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet,映射需要开发者手动配置,有两种配置方式
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的生命周期例子
作为一个对象来讲,一定会有创建、使用和回收的过程。
java有专门的垃圾回收机制,会自动的帮助我们回收对象,有不同的算法对对象进行回收。我们首先需要了解基础,后期深入了解垃圾回收机制和java虚拟机内存结构等等。学过C++,C++的对象一定要释放。但Java你只需要创建对象就好了。
- 声明周期显示到代码里,就是这样,Servlet类里面有五个方法:init、ServletConfig、service、getServletInfo、destory。
- 其中init是servlet的初始化,service是servlet业务方法、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的销毁"); }//设置输出 }以上代码在此三处设置输出,启动tomcat,执行并访问后,控制台输出如下:
说明调用了init方法,然后调用了service,再刷新几次又调用了很多次service:
init一次,servlet对象就存在了,之后的访问都是使用同一个servlet对象。首先检测servlet容器里面有没有目标Demo1的实体类对象。没有的话创建一个,然后调用它的service;第二次再检测,没有则创建,有就直接用。这样可以节约很多内存空间,而且只需要有一个servlet目标对象即可。类似于我们打电话只需要一部手机接打电话,可以无限循环的打电话,而不需要每次打电话都换一台手机。
destory方法什么时候执行呢?tomcat一关,开始释放资源,当tomcat服务停掉了,装载servlet的对象就停掉了。
那么对象怎样创建出来的呢,servlet方法是非静态方法,非静态方法的调用必须借助于对象。这里并没有看到new Demo1的对象,我们没看到并不代表不存在。而这一系列的完成都是由tomcat容器完成的。通过反射机制来创建对象。通反射机制拿到构造函数,反射创建对象一般都是调用无参的构造函数。我们可以把无参的构造函数重写一下,添加到代码里:
public Demo1(){ System.out.println("创建了Servlet对象"); }肯定是先构造对象,再调用方法。
输出结果印证了这一点,关闭tomcat:
Servlet的生命周期(从创建到销毁):
- 当浏览器访问Servlet的时候,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第三步。
- 调用init方法完成初始化操作
- 调用Servlet方法完成业务逻辑操作
- 关闭tomcat时,会调用destory方法,释放当前对象所占用的资源
Servlet声明周期方法
包括无参构造函数、init、service、destory
- 无参构造函数只调用一次,创建对象
- init只调用一次、初始对象
- service调用N次,执行业务方法
- destory只调用一次,卸载对象
标签:逻辑 有一个 att ebs port -name location 容器 创建
原文地址:https://www.cnblogs.com/yangf428/p/12522674.html