【servlet细节】实例化过程、浏览器向服务器发送请求都是在请求servlet、<load-on-startup>元素

本文详细解析了Servlet的工作原理,包括项目的目录结构、Servlet的映射方式、实例化过程、以及如何通过web.xml配置实现Servlet的自动加载等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、web项目目录结构图:

Servlet修改后需要重新发布项目

web.xml修改之后不用重新发布


2、servlet映射


可以将servlet设置成伪静态,表面是访问一个html静态网页,实际上是访问一个servlet



3、servlet的实例化过程:


服务器只会创建一个servlet实例对象,也就是说,servlet实例对象一旦创建,它就会驻留在内存中。

直到web容器退出,servlet实例对象才会销毁。

因此:

servlet的init方法只会调用一次。

客户端的每一次请求,都会创建一个新的response和一个新的request,来调用service方法。

service方法再去调用doget()或者dopost()

web容器退出的时候,调用destroy()


4、<load-on-startup>元素可以设置WEB应用程序在启动时,就会装载并创建Servlet的实例对象

中间的数字是优先级。

<servlet>
		<servlet-name>invoker</servlet-name>
		<servlet-class>
			org.apache.catalina.servlets.InvokerServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>

5、缺省servlet:Servlet的映射路径仅仅为一个正斜杠(/)

灌输一个思想:其实浏览器向服务器发送请求都是在请求servlet,只不过访问静态资源访问的是缺省servlet

conf目录下的web.xml中缺省servlet的配置

  <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

6、SingleThreadModel

当servlet被第一个请求占用时,第二个请求会重新创建一个新的servlet


/KuCun2/src/main/webapp/WEB-INF/web.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <context-param> <param-name>metadata-complete</param-name> <param-value>true</param-value> </context-param> <servlet> <servlet-name>exampleServlet</servlet-name> <servlet-class>com.example.ExampleServlet</servlet-class> </servlet> <servlet> <description>generated-servlet</description> <servlet-name>KuCun2 Servlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:KuCun2-web-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <description>generated-resources-servlet</description> <servlet-name>Resource Servlet</servlet-name> <servlet-class> org.springframework.js.resource.ResourceServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>exampleServlet</servlet-name> <url-pattern>/example</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Resource Servlet</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> </web-app> 2025-06-20 14:01:51.793 INFO 17004 --- [ main] com.kucun.DemoApplication : Started DemoApplication in 6.862 seconds (JVM running for 16.997) 2025-06-20 14:01:51.803 ERROR 17004 --- [ main] o.a.c.c.C.[.[localhost].[/KuCun2] : 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.context.ContextLoaderListener] java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml! at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:263) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4678) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5139) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1133) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1866) [catalina.jar:9.0.37] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_331] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) [na:1.8.0_331] at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1045) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:429) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576) [catalina.jar:9.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [catalina.jar:9.0.37] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [catalina.jar:9.0.37] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_331] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.37] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_331] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) [catalina.jar:9.0.37] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:738) [catalina.jar:9.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_331] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_331] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_331] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_331] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342) [bootstrap.jar:9.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473) [bootstrap.jar:9.0.37] 2025-06-20 14:01:51.803 ERROR 17004 --- [ main] o.apache.catalina.core.StandardContext : 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件 2025-06-20 14:01:51.804 ERROR 17004 --- [ main] o.apache.catalina.core.StandardContext : 由于之前的错误,Context[/KuCun
06-21
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="MySqlConnString" connectionString="Database=falink300;Data Source=localhost;User ID=root;Password=8888" /> <add name="MyDBType" connectionString="mysql" /> <add name="MyXmlPathString" connectionString="D:\config\File\" /> </connectionStrings> <appSettings> <add key="version" value="4.4.2"></add> <add key="IsLaunchComServer" value="False" /> <add key="FAServiceName" value="FAServer" /> <add key="IsWindowsService" value="False" /> <add key="IsLaunchRemotingServer" value="True" /> <add key="FAConfigurationURL" value="" /> <add key="ConsoleRemotingURL" value="" /> <add key="RecipeApproveLevel" value="1" /> <add key="ctcserver" value="A"></add> <add key="faserver" value="A"></add> <add key="bridgeport" value="9002"></add> <add key="bridgeserver" value="bridgeserver"></add> <add key="RecipeApproveLevel" value="2"></add> <add key="bindTo" value="127.0.0.1"></add> <add key="pjobType" value="default"></add> <add key="Fix2971" value="False"></add> <add key="SubstrateProcessStateOffset" value="1"></add> <add key="commandtype" value="1"></add> <add key="CheckDeviceID" value="False"></add> <add key="ConnectWithoutS1F13" value="False"></add> <add key="EventFireToCTC" value="False"></add> <add key="SpoolMsg" value="6:1,11;"></add> <add key="MaxSpooledCount" value="50"></add> <add key="Heartbeat" value="LinkTest"></add> <add key="EstablishByHeartbeat" value="False"></add> <add key="DownloadRecipeFormat" value="string"></add> <!--<add key="seteventidoffset" value="400000000"></add>--> <!--Chinese: utf-8; English: us-ascii--> <add key="ChineseEncoding" value="us-ascii"></add> <add key="ThreadPoolMinCount" value="30"></add> <add key="S1F3DelayTime" value="1000"></add> <add key="nicid" value="1"></add> <add key="00000000-0000-0000-0000-000000000001" value="3"></add> <add key="00000000-0000-0000-0000-000000000002" value="3"></add> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" /> </startup> </configuration>解释这个配置文件,每一行的作用
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值