Tomcat装载Servlet的三种情况

    xiaoxiao2021-03-25  85

    Tomcat装载Servlet的三种情况

    1.在Servlet容器启动后,客户首次向Servlet发送请求

    例如我的MyEclipse下有一个Web Project如下图所示:

    现在里面的代码如下:

    ServletTest1.java文件源代码:

    package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author huamanxi * Tomcat装载Servlet的第一种情况:首次访问 */ public class ServletTest1 extends HttpServlet { public ServletTest1() { System.out.println("ServletTest1的构造方法被执行..."); } public void destroy() { System.out.println("ServletTest1的销毁方法被执行..."); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ServletTest1的doGet()方法被执行..."); //注意在这里指定编码格式为utf-8,否则向浏览器输出中文时会产生乱码 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("<h1>你好,我是ServletTest1</h1>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ServletTest1的doPost()方法被执行"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("<h1>你好,我是ServletTest1</h1>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void init() throws ServletException { System.out.println("ServletTest1的初始化方法被执行..."); } }

    index.jsp文件的源代码:

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>Servlet生命周期</h1> <hr> <a href="servlet/ServletTest1">以Get方式请求ServletTest1</a> This is my JSP page. <br> </body> </html>

    Web.xml文件的源代码: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>LoadServlet</display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>ServletTest1</servlet-name> <servlet-class>servlet.ServletTest1</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletTest1</servlet-name> <url-pattern>/servlet/ServletTest1</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>

    在浏览器中的运行结果如下:

    点击链接进去后:

    MyEclipse的控制台内容:

    2.Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间

    添加:<loadon-startup>1</loadon-start-up>里面的数字越小表示优先级越高

    ServletTest2.java中的代码:

    package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author huamanxi * Tomcat装载Servlet的第二种情况:Servlet容器启动时自动装载Servlet * 这种情况下,这两个Servlet实例已经驻留在内存中,客户端并没有请求Servlet,但是在服务器启动时会自动装载 */ public class ServletTest2 extends HttpServlet { public ServletTest2() { System.out.println("ServletTest2构造方法执行..."); } public void destroy() { System.out.println("ServletTest2销毁方法执行..."); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ServletTest2的doGet()方法被执行..."); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("<h1>你好,我是ServletTest2</h1>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ServletTest2的doPost()方法被执行..."); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); System.out.println("<h1>你好,我是ServletTest2</h1>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void init() throws ServletException { System.out.println("ServletTest2的初始化方法被执行..."); } }

    然后在web.xml文件中加入下面两条代码:

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>LoadServlet</display-name> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>ServletTest1</servlet-name> <servlet-class>servlet.ServletTest1</servlet-class> <!-- 加入下面的语句 数字越大优先级越低 --> <load-on-startup>2</load-on-startup> </servlet> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>ServletTest2</servlet-name> <servlet-class>servlet.ServletTest2</servlet-class> <!-- 加入下面的语句 数据越小优先级越高--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletTest1</servlet-name> <url-pattern>/servlet/ServletTest1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletTest2</servlet-name> <url-pattern>/servlet/ServletTest2</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>

    加入这两行代码后,即使客户端没有请求Servlet也会自动装载,并且向装载ServletTest2类,再装载ServletTest1类,从下面控制台输出的内容可以看出 在Tomcat启动过程中Servlet就已经被加载

    控制台输出内容:

    3.Servlet类文件被更新后,会重新装载Servlet

    在修改之前记录.class文件的修改日期及时间,说明Tomcat容器重新装载了Servlet

    转载请注明原文地址: https://ju.6miu.com/read-24578.html

    最新回复(0)