日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tomcat(19)Manager应用程序的servlet类

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tomcat(19)Manager应用程序的servlet类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README 1)本文部分文字描述轉自:“深入剖析tomcat”,旨在學習“tomcat(19)Manager應用程序的servlet類”?的相關知識; 2)Manager應用程序用來管理已經部署的web 應用程序;在tomcat7中,manager應用程序位于 %CATALINA_HOME%webapps 目錄中;
【1】使用Manager應用程序 1)Manager應用程序中的主servlet類是 ManagerServlet類。在tomcat4中, 該類位于 org.apache.catalina.servlets包下; 而在tomcat5中,該類位于 org.apache.catalina.manager下,是作為 WEB-INF/lib 目錄下的一個JAR 文件部署的;
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- tomcat7 下面的 web.xml -->Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. --><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"metadata-complete="true"><display-name>Tomcat Manager Application</display-name><description>A scriptable management web application for the Tomcat Web Server;Manager lets you view, load/unload/etc particular web applications.</description><servlet><servlet-name>Manager</servlet-name><servlet-class>org.apache.catalina.manager.ManagerServlet</servlet-class><init-param><param-name>debug</param-name><param-value>2</param-value></init-param></servlet><servlet><servlet-name>HTMLManager</servlet-name><servlet-class>org.apache.catalina.manager.HTMLManagerServlet</servlet-class><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><!-- Uncomment this to show proxy sessions from the Backup manager or aStoreManager in the sessions list for an application<init-param><param-name>showProxySessions</param-name><param-value>true</param-value></init-param>--><multipart-config><!-- 50MB max --><max-file-size>52428800</max-file-size><max-request-size>52428800</max-request-size><file-size-threshold>0</file-size-threshold></multipart-config></servlet><servlet><servlet-name>Status</servlet-name><servlet-class>org.apache.catalina.manager.StatusManagerServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param></servlet><servlet><servlet-name>JMXProxy</servlet-name><servlet-class>org.apache.catalina.manager.JMXProxyServlet</servlet-class></servlet><!-- Define the Manager Servlet Mapping --><servlet-mapping><servlet-name>Manager</servlet-name><url-pattern>/text/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>Status</servlet-name><url-pattern>/status/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>JMXProxy</servlet-name><url-pattern>/jmxproxy/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>HTMLManager</servlet-name><url-pattern>/html/*</url-pattern></servlet-mapping><filter><filter-name>SetCharacterEncoding</filter-name><filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>SetCharacterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>CSRF</filter-name><filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class><init-param><param-name>entryPoints</param-name><param-value>/html,/html/,/html/list,/index.jsp</param-value></init-param></filter><filter-mapping><filter-name>CSRF</filter-name><servlet-name>HTMLManager</servlet-name><servlet-name>jsp</servlet-name></filter-mapping><!-- Define a Security Constraint on this Application --><!-- NOTE: None of these roles are present in the default users file --><security-constraint><web-resource-collection><web-resource-name>HTML Manager interface (for humans)</web-resource-name><url-pattern>/html/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-gui</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>Text Manager interface (for scripts)</web-resource-name><url-pattern>/text/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-script</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>JMX Proxy interface</web-resource-name><url-pattern>/jmxproxy/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-jmx</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>Status interface</web-resource-name><url-pattern>/status/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-gui</role-name><role-name>manager-script</role-name><role-name>manager-jmx</role-name><role-name>manager-status</role-name></auth-constraint></security-constraint><!-- Define the Login Configuration for this Application --><login-config><auth-method>BASIC</auth-method><realm-name>Tomcat Manager Application</realm-name></login-config><!-- Security roles referenced by this web application --><security-role><description>The role that is required to access the HTML Manager pages</description><role-name>manager-gui</role-name></security-role><security-role><description>The role that is required to access the text Manager pages</description><role-name>manager-script</role-name></security-role><security-role><description>The role that is required to access the HTML JMX Proxy</description><role-name>manager-jmx</role-name></security-role><security-role><description>The role that is required to access to the Manager Status pages</description><role-name>manager-status</role-name></security-role><error-page><error-code>401</error-code><location>/WEB-INF/jsp/401.jsp</location></error-page><error-page><error-code>403</error-code><location>/WEB-INF/jsp/403.jsp</location></error-page><error-page><error-code>404</error-code><location>/WEB-INF/jsp/404.jsp</location></error-page></web-app> 對以上代碼的分析(Analysis): A1)第1個servlet是 org.apache.catalina.manager.ManagerServlet;第2個是 org.apache.catalina.manager.HTMLManagerServlet; A2)org.apache.catalina.manager.ManagerServlet 的函數列表如下: protected void list(PrintWriter writer) {if (debug >= 1)log("list: Listing contexts for virtual host '" +host.getName() + "'");writer.println(sm.getString("managerServlet.listed",host.getName()));Container[] contexts = host.findChildren();for (int i = 0; i < contexts.length; i++) {Context context = (Context) contexts[i];String displayPath = context.getPath();if( displayPath.equals("") )displayPath = "/";if (context != null ) {if (context.getAvailable()) {writer.println(sm.getString("managerServlet.listitem",displayPath,"running","" + context.getManager().findSessions().length,context.getDocBase()));} else {writer.println(sm.getString("managerServlet.listitem",displayPath,"stopped","0",context.getDocBase()));}}}}protected void reload(PrintWriter writer, String path) {if (debug >= 1)log("restart: Reloading web application at '" + path + "'");if ((path == null) || (!path.startsWith("/") && path.equals(""))) {writer.println(sm.getString("managerServlet.invalidPath",RequestUtil.filter(path)));return;}String displayPath = path;if( path.equals("/") )path = "";try {Context context = (Context) host.findChild(path);if (context == null) {writer.println(sm.getString("managerServlet.noContext",RequestUtil.filter(displayPath)));return;}// It isn't possible for the manager to reload itselfif (context.getPath().equals(this.context.getPath())) {writer.println(sm.getString("managerServlet.noSelf"));return;}context.reload();writer.println(sm.getString("managerServlet.reloaded", displayPath));} catch (Throwable t) {log("ManagerServlet.reload[" + displayPath + "]", t);writer.println(sm.getString("managerServlet.exception",t.toString()));}}protected void resources(PrintWriter writer, String type) {if (debug >= 1) {if (type != null) {log("resources: Listing resources of type " + type);} else {log("resources: Listing resources of all types");}}// Is the global JNDI resources context available?if (global == null) {writer.println(sm.getString("managerServlet.noGlobal"));return;}// Enumerate the global JNDI resources of the requested typeif (type != null) {writer.println(sm.getString("managerServlet.resourcesType",type));} else {writer.println(sm.getString("managerServlet.resourcesAll"));}Class clazz = null;try {if (type != null) {clazz = Class.forName(type);}} catch (Throwable t) {log("ManagerServlet.resources[" + type + "]", t);writer.println(sm.getString("managerServlet.exception",t.toString()));return;}printResources(writer, "", global, type, clazz);}protected void printResources(PrintWriter writer, String prefix,javax.naming.Context namingContext,String type, Class clazz) {try {NamingEnumeration items = namingContext.listBindings("");while (items.hasMore()) {Binding item = (Binding) items.next();if (item.getObject() instanceof javax.naming.Context) {printResources(writer, prefix + item.getName() + "/",(javax.naming.Context) item.getObject(), type, clazz);} else {if ((clazz != null) &&(!(clazz.isInstance(item.getObject())))) {continue;}writer.print(prefix + item.getName());writer.print(':');writer.print(item.getClassName());// Do we want a description if available?writer.println();}}} catch (Throwable t) {log("ManagerServlet.resources[" + type + "]", t);writer.println(sm.getString("managerServlet.exception",t.toString()));}}protected void roles(PrintWriter writer) {if (debug >= 1) {log("roles: List security roles from user database");}// Look up the UserDatabase instance we should useUserDatabase database = null;try {InitialContext ic = new InitialContext();database = (UserDatabase) ic.lookup("java:comp/env/users");} catch (NamingException e) {writer.println(sm.getString("managerServlet.userDatabaseError"));log("java:comp/env/users", e);return;}if (database == null) {writer.println(sm.getString("managerServlet.userDatabaseMissing"));return;}// Enumerate the available roleswriter.println(sm.getString("managerServlet.rolesList"));Iterator roles = database.getRoles();if (roles != null) {while (roles.hasNext()) {Role role = (Role) roles.next();writer.print(role.getRolename());writer.print(':');if (role.getDescription() != null) {writer.print(role.getDescription());}writer.println();}}}protected void serverinfo(PrintWriter writer) {if (debug >= 1)log("serverinfo");try {StringBuffer props = new StringBuffer();props.append("OK - Server info");props.append("\nTomcat Version: ");props.append(ServerInfo.getServerInfo());props.append("\nOS Name: ");props.append(System.getProperty("os.name"));props.append("\nOS Version: ");props.append(System.getProperty("os.version"));props.append("\nOS Architecture: ");props.append(System.getProperty("os.arch"));props.append("\nJVM Version: ");props.append(System.getProperty("java.runtime.version"));props.append("\nJVM Vendor: ");props.append(System.getProperty("java.vm.vendor"));writer.println(props.toString());} catch (Throwable t) {getServletContext().log("ManagerServlet.serverinfo",t);writer.println(sm.getString("managerServlet.exception",t.toString()));}}protected void sessions(PrintWriter writer, String path, int idle) {if (debug >= 1) {log("sessions: Session information for web application at '" + path + "'");if (idle >= 0)log("sessions: Session expiration for " + idle + " minutes '" + path + "'");}if ((path == null) || (!path.startsWith("/") && path.equals(""))) {writer.println(sm.getString("managerServlet.invalidPath",RequestUtil.filter(path)));return;}String displayPath = path;if( path.equals("/") )path = "";try {Context context = (Context) host.findChild(path);if (context == null) {writer.println(sm.getString("managerServlet.noContext",RequestUtil.filter(displayPath)));return;}Manager manager = context.getManager() ;if(manager == null) {writer.println(sm.getString("managerServlet.noManager",RequestUtil.filter(displayPath)));return; }int maxCount = 60;int maxInactiveInterval = manager.getMaxInactiveInterval()/60;int histoInterval = maxInactiveInterval / maxCount;if ( histoInterval * maxCount < maxInactiveInterval ) histoInterval++;maxCount = maxInactiveInterval / histoInterval;if ( histoInterval * maxCount < maxInactiveInterval ) maxCount++;writer.println(sm.getString("managerServlet.sessions", displayPath));writer.println(sm.getString("managerServlet.sessiondefaultmax","" + maxInactiveInterval));Session [] sessions = manager.findSessions();int [] timeout = new int[maxCount];int notimeout = 0;int expired = 0;long now = System.currentTimeMillis();for (int i = 0; i < sessions.length; i++) {int time = (int)((now-sessions[i].getLastAccessedTimeInternal())/1000);if (idle >= 0 && time >= idle*60) {sessions[i].expire();idle++;}time=time/60/histoInterval;if (time < 0)notimeout++;else if (time >= maxCount)timeout[maxCount-1]++;elsetimeout[time]++;}if (timeout[0] > 0)writer.println(sm.getString("managerServlet.sessiontimeout","<" + histoInterval, "" + timeout[0]));for (int i = 1; i < maxCount-1; i++) {if (timeout[i] > 0)writer.println(sm.getString("managerServlet.sessiontimeout","" + (i)*histoInterval + " - <" + (i+1)*histoInterval,"" + timeout[i]));}if (timeout[maxCount-1] > 0)writer.println(sm.getString("managerServlet.sessiontimeout",">=" + maxCount*histoInterval,"" + timeout[maxCount-1]));if (notimeout > 0)writer.println(sm.getString("managerServlet.sessiontimeout","unlimited","" + notimeout));if (idle >= 0)writer.println(sm.getString("managerServlet.sessiontimeout","" + idle,"expired " + expired));} catch (Throwable t) {log("ManagerServlet.sessions[" + displayPath + "]", t);writer.println(sm.getString("managerServlet.exception",t.toString()));}} protected void undeploy(PrintWriter writer, String path) {if (debug >= 1)log("undeploy: Undeploying web application at '" + path + "'");if ((path == null) || (!path.startsWith("/") && path.equals(""))) {writer.println(sm.getString("managerServlet.invalidPath",RequestUtil.filter(path)));return;}String displayPath = path;if( path.equals("/") )path = "";try {// Validate the Context of the specified applicationContext context = (Context) host.findChild(path);if (context == null) {writer.println(sm.getString("managerServlet.noContext",RequestUtil.filter(displayPath)));return;}// Identify the appBase of the owning Host of this Context (if any)String appBase = null;File appBaseDir = null;if (context.getParent() instanceof Host) {appBase = ((Host) context.getParent()).getAppBase();appBaseDir = new File(appBase);if (!appBaseDir.isAbsolute()) {appBaseDir = new File(System.getProperty("catalina.base"),appBase);}}if (!isDeployed(path)) {writer.println(sm.getString("managerServlet.notDeployed",RequestUtil.filter(displayPath)));return;}if (!isServiced(path)) {addServiced(path);try {// Try to stop the context first to be nicer((Lifecycle) context).stop();} catch (Throwable t) {// Ignore}try {File war = new File(getAppBase(), getDocBase(path) + ".war");File dir = new File(getAppBase(), getDocBase(path));File xml = new File(configBase, getConfigFile(path) + ".xml");if (war.exists()) {war.delete();} else if (dir.exists()) {undeployDir(dir);} else {xml.delete();}// Perform new deploymentcheck(path);} finally {removeServiced(path);}}writer.println(sm.getString("managerServlet.undeployed",displayPath));} catch (Throwable t) {log("ManagerServlet.undeploy[" + displayPath + "]", t);writer.println(sm.getString("managerServlet.exception",t.toString()));}} 2)在部署描述符中,還有 security-constraint 元素:(also tomcat7) <!-- Define a Security Constraint on this Application --><!-- NOTE: None of these roles are present in the default users file --><security-constraint><web-resource-collection><web-resource-name>HTML Manager interface (for humans)</web-resource-name><url-pattern>/html/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-gui</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>Text Manager interface (for scripts)</web-resource-name><url-pattern>/text/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-script</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>JMX Proxy interface</web-resource-name><url-pattern>/jmxproxy/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-jmx</role-name></auth-constraint></security-constraint><security-constraint><web-resource-collection><web-resource-name>Status interface</web-resource-name><url-pattern>/status/*</url-pattern></web-resource-collection><auth-constraint><role-name>manager-gui</role-name><role-name>manager-script</role-name><role-name>manager-jmx</role-name><role-name>manager-status</role-name></auth-constraint></security-constraint> 對上述代碼的分析(Analysis): A1)上面的配置意思是: 整個應用程序被限制為只有帶manager前綴的用戶角色的用戶才能訪問; A2)auth-login 元素指明了權限認證使用 BASIC 身份驗證方式,只有當用戶輸入正確的用戶名和密碼時才能訪問受限資源; <login-config><auth-method>BASIC</auth-method><realm-name>Tomcat Manager Application</realm-name></login-config> 3)在tomcat中,用戶和角色列表都存儲在 tomcat-users.xml 中,該文件位于 %CATALINA_HOME%/conf 目錄下。因此,要訪問 Manager應用程序,必須添加一個 manager角色(如manager-gui)和一個擁有該角色的用戶, 例如: <tomcat-users><role rolename="<span style="font-family: Arial, Helvetica, sans-serif;">manager-gui</span><span style="font-family: Arial, Helvetica, sans-serif;">"/></span><user username="tomcat" password="tomcat" roles="manager-gui"/> </tomcat-users> 對以上代碼的分析(Analysis):通過這個 tomcat-users.xml 文件,就可以以tomcat為用戶名,以tomcat為密碼來訪問 Manager 應用程序了;
【2】ContainerServlet接口(org.apache.catalina.ContainerServlet接口) 1)intro:實現該接口的 servlet類可以訪問表示該 servlet實例的StandardWrapper對象,通過訪問該Wrapper實例,它也就可以訪問表示當前 web 應用程序的Context實例,以及該Context實例內的部署器(StandardHost類的實例)等對象; public interface ContainerServlet { public Wrapper getWrapper();public void setWrapper(Wrapper wrapper); } 2)Catalina實例會調用實現了?ContainerServlet接口的servlet類的 setWrapper方法:將該引用傳遞給表示該servlet類 的 StandardWrapper實例;
【3】初始化 ManagerServlet 1)intro:servlet 對象由一個 org.apache.catalina.core.StandardWrapper 實例表示,第一次調用servlet實例時,會調用 StandardWrapper.loadServlet()方法,然后調用 servlet實例的init()方法; (下面的圖片借用自tomcat(5)servlet容器?章節5.7)

【4】列出已經部署的web 應用程序? 1)通過?http://localhost:8888/manager/list 列出已經部署的web 應用程序; 2)上面的URL 會調用 ManagerServlet.list()方法, 源碼如下: protected void list(PrintWriter writer) { // org.apache.catalina.manager.ManagerServlet.list().if (debug >= 1)log("list: Listing contexts for virtual host '" +deployer.getName() + "'");writer.println(sm.getString("managerServlet.listed",deployer.getName()));String contextPaths[] = deployer.findDeployedApps();for (int i = 0; i < contextPaths.length; i++) {Context context = deployer.findDeployedApp(contextPaths[i]);String displayPath = contextPaths[i];if( displayPath.equals("") )displayPath = "/";if (context != null ) {if (context.getAvailable()) {writer.println(sm.getString("managerServlet.listitem",displayPath,"running","" + context.getManager().findSessions().length,context.getDocBase()));} else {writer.println(sm.getString("managerServlet.listitem",displayPath,"stopped","0",context.getDocBase()));}}}} 對以上代碼的分析(Analysis): A1)list()方法會調用部署器的 findDeployedApps()方法來獲取catalina中所有已經部署了的 Context的路徑; A2)然后,對path 數組進行迭代,獲取每一個Context,然后檢查該 Context是否可用; A3)對每個可用的 Context:list()方法輸出上下文路徑,字符串 "running",用戶session 的數量以及文檔的根路徑; A4)對那些不可用的 Context:list()方法輸出上下文路徑,字符串 "stopped",0 以及文檔的根路徑;
【5】啟動web 應用程序 1)使用如下URL 來啟動某個web 應用程序:?http://localhost:8888/manager/start?path=ContextPath , 而ContextPath是想要啟動web 應用程序的路徑; 2)在接收到該URL后,會調用 ManagerServlet.start() 方法; protected void start(PrintWriter writer, String path) { //org.apache.catalina.manager.ManagerServlet.start().if (debug >= 1)log("start: Starting web application at '" + path + "'");if ((path == null) || (!path.startsWith("/") && path.equals(""))) {writer.println(sm.getString("managerServlet.invalidPath", path));return;}String displayPath = path;if( path.equals("/") )path = "";try {Context context = deployer.findDeployedApp(path); // highlight line.if (context == null) {writer.println(sm.getString("managerServlet.noContext", displayPath));return;}deployer.start(path);// highlight line.if (context.getAvailable())writer.println(sm.getString("managerServlet.started", displayPath));elsewriter.println(sm.getString("managerServlet.startFailed", displayPath));} //......} public void start(String contextPath) throws IOException { //org.apahce.catalina.core.StandardHostDeployer.start().// Validate the format and state of our argumentsif (contextPath == null)throw new IllegalArgumentException(sm.getString("standardHost.pathRequired"));if (!contextPath.equals("") && !contextPath.startsWith("/"))throw new IllegalArgumentException(sm.getString("standardHost.pathFormat", contextPath));Context context = findDeployedApp(contextPath);if (context == null)throw new IllegalArgumentException(sm.getString("standardHost.pathMissing", contextPath));host.log("standardHost.start " + contextPath);try {((Lifecycle) context).start(); // highlight line.啟動Context容器.} //......} 對以上代碼的分析(Analysis):在執行一些檢查工作后,start()方法會在 try代碼塊中調用部署器的 findDeployedApp()方法,該方法返回參數path 指向的Context對象。如果context不是null,start()方法調用部署器的start()方法來啟動該 web 應用程序;
【6】關閉web 應用程序? 1)intro:使用如下URL 關閉某個web 應用程序:??http://localhost:8888/manager/stop?path=ContextPath; 2)在接收到該URL后,會調用 ManagerServlet.stop() 方法;
protected void stop(PrintWriter writer, String path) { //org.apache.catalina.manager.ManagerServlet.stop().if (debug >= 1)log("stop: Stopping web application at '" + path + "'");if ((path == null) || (!path.startsWith("/") && path.equals(""))) {writer.println(sm.getString("managerServlet.invalidPath", path));return;}String displayPath = path;if( path.equals("/") )path = "";try {Context context = deployer.findDeployedApp(path); //highlight line.if (context == null) {writer.println(sm.getString("managerServlet.noContext", displayPath));return;}// It isn't possible for the manager to stop itselfif (context.getPath().equals(this.context.getPath())) {writer.println(sm.getString("managerServlet.noSelf"));return;}deployer.stop(path); // highlight line.writer.println(sm.getString("managerServlet.stopped", displayPath));} //.....} public void stop(String contextPath) throws IOException { //org.apahce.catalina.core.StandardHostDeployer.start().// Validate the format and state of our argumentsif (contextPath == null)throw new IllegalArgumentException(sm.getString("standardHost.pathRequired"));if (!contextPath.equals("") && !contextPath.startsWith("/"))throw new IllegalArgumentException(sm.getString("standardHost.pathFormat", contextPath));Context context = findDeployedApp(contextPath);if (context == null)throw new IllegalArgumentException(sm.getString("standardHost.pathMissing", contextPath));host.log("standardHost.stop " + contextPath);try {((Lifecycle) context).stop(); //highlight line. 停止該容器.} catch (LifecycleException e) {host.log("standardHost.stop " + contextPath + ": ", e);throw new IllegalStateException("standardHost.stop " + contextPath + ": " + e);}} public synchronized void stop() throws LifecycleException { // org.apache.catalina.core.StandardContext.stop().// Validate and update our current component stateif (!started)throw new LifecycleException(sm.getString("containerBase.notStarted", logName()));if (debug >= 1)log("Stopping");// Notify our interested LifecycleListenerslifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);// Mark this application as unavailable while we shut downsetAvailable(false);// Binding threadClassLoader oldCCL = bindThread();// Stop our filtersfilterStop();// Stop our application listenerslistenerStop();// Finalize our character set mappersetCharsetMapper(null);if ((manager != null) && (manager instanceof Lifecycle)) {((Lifecycle) manager).stop();}// Normal container shutdown processingif (debug >= 1)log("Processing standard container shutdown");// Notify our interested LifecycleListenerslifecycle.fireLifecycleEvent(STOP_EVENT, null);started = false;try {// Stop the Valves in our pipeline (including the basic), if anyif (pipeline instanceof Lifecycle) {((Lifecycle) pipeline).stop();}// Stop our child containers, if anyContainer children[] = findChildren();for (int i = 0; i < children.length; i++) {if (children[i] instanceof Lifecycle)((Lifecycle) children[i]).stop();}// Stop our Mappers, if anyMapper mappers[] = findMappers();for (int i = 0; i < mappers.length; i++) {if (mappers[(mappers.length-1)-i] instanceof Lifecycle)((Lifecycle) mappers[(mappers.length-1)-i]).stop();}// Stop resourcesresourcesStop();if ((realm != null) && (realm instanceof Lifecycle)) {((Lifecycle) realm).stop();}if ((cluster != null) && (cluster instanceof Lifecycle)) {((Lifecycle) cluster).stop();}if ((logger != null) && (logger instanceof Lifecycle)) {((Lifecycle) logger).stop();}if ((loader != null) && (loader instanceof Lifecycle)) {((Lifecycle) loader).stop();}} finally {// Unbinding threadunbindThread(oldCCL);}// Reset application contextcontext = null;// Notify our interested LifecycleListenerslifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null); if (debug >= 1)log("Stopping complete");} Conclusion) C1)本文講解了如何使用一個專用的接口(ContainerServlet)來創建一個可以訪問 Catalina內部類的 servlet類; C2)可以用來管理已部署web 應用程序的 Manager應用程序展示了如何從 Wrapper對象中獲取其他 Catalina對象;

總結

以上是生活随笔為你收集整理的tomcat(19)Manager应用程序的servlet类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。