`
yangmingjiayou
  • 浏览: 112644 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Tomcat启动后加载两次servlet的问题

阅读更多

前提:

    1、存在某个应用:hello
   
    2、该应用存放路径:D:\apache-tomcat-5.5.17\webapps\hello
   
    3、Tomcat的server.xml部分配置信息如下:

    ... 
    <Context path="" reloadable="true" docBase="hello"/> 
    ... 

    (这么做的目的就是为了将hello应用设为根,访问IP时就直接访问该应用)
   

    4、hello下有一个 servlet(目的是为了系统在启动时执行某些初始化的操作),该servlet里存在init()方法,目前该方法里只打印“hello word”字符串;

    5、hello 应用的 web.xml 部分配置信息如下:

Java代码

    <servlet> 
         <servlet-name>HelloServlet</servlet-name> 
         <servlet-class>HelloServlet</servlet-class> 
         <load-on-startup>1</load-on-startup> 
    </servlet> 


问题:
    在启动 tomcat5 时,控制台窗口会打印出两行“hello word”字符串?

 

    spring定时任务 也会执行两次  同时间 相差几毫秒 两个线程 执行的。



问题原因:
    因为hello应用本来就放在Tomat的默认webapp目录下(tomcat在启动时肯定会加载1次),然后又在server.xml中做了配置,为了达到访问根就可以访问hello应用(这样tomcat就又加载1次);结果,Tomcat就会加载两次。

解决办法:
    办法1、不要将 hello 应用放在Tomat的默认webapp目录下,把它移出去,然后在server.xml中修改docBase的值为hello应用在新位置的绝对路径就可以了;
    办法2、删除掉server.xml中 Context 的手动配置,这样就不会加载两次,因为hello应用在webapp下,所以在访问时,就只能是:http://ip:port/hello 这样来访问了。


第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加:
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true">
</Context>
至于Context 节点属性,可详细见相关文档。

第二种方法:将web项目文件件拷贝到webapps 目录中。

第三种方法:很灵活,在conf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为:
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true">
</Context>

第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。

第2、3还有优点,可以定义一些个性配置,如数据源的配置等。

还有一篇 详细的


此处主要讲述Tomcat部署发布JSP应用程序的三种方法
    1、直接放到Webapps目录下
     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。也可以将JSP程序打包成一个 war包放在目录下,服务器会自动解开这个war包,并在这个目录下生成一个同名的文件夹。
     一个war包就是有特性格式的jar包,它是将一个Web程序的所有内容进行压缩得到。具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse、NetBeans、ant、JBuilder等。
     也可以用 cmd 命令:jar -cvf applicationname.war package.*;
    
甚至可以在程序执行中打包:
try{
string strjavahome = system.getproperty("java.home");
strjavahome = strjavahome.substring(0,strjavahome.lastindexof(\\))+"\\bin\\";
runtime.getruntime().exec("cmd /c start "+strjavahome+"jar cvf hello.war c:\\tomcat5.0\\webapps\\root\\*");
}
catch(exception e){system.out.println(e);}

     webapps这个默认的应用目录也是可以改变。打开Tomcat的conf目录下的server.xml文件,找到下面内容:
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeloy="true" xmlValidation="falase" xmlNamespaceAware="false">

   2、在server.xml中指定
     在Tomcat的配置文件中,一个Web应用就是一个特定的Context,可以通过在server.xml中新建Context里部署一个JSP应用程序。打开server.xml文件,在Host标签内建一个Context,内容如下。
<Context path="/myapp" reloadable="true" docBase="D:\myapp" workDir="D:\myapp\work"/>
     其中path是虚拟路径,docBase是JSP应用程序的物理路径,workDir是这个应用的工作目录,存放运行是生成的于这个应用相关的文件。

   3、创建一个Context文件
     以上两种方法,Web应用被服务器加载后都会在Tomcat的conf\catalina\localhost目录下生成一个XML文件,其内容如下:
<Context path="/admin" docBase="${catalina.home}/server/webapps/admin" debug="0" privileged="true"></Context>
可以看出,文件中描述一个应用程序的Context信息,其内容和server.xml中的Context信息格式是一致的,文件名便是虚拟目录名。您可以直接建立这样的一个xml文件,放在Tomcat的conf\catalina\localhost目录下。例子如下:
注意:删除一个Web应用同时也要删除webapps下相应的文件夹祸server.xml中相应的Context,还要将Tomcat的conf
\catalina\localhost目录下相应的xml文件删除。否则Tomcat仍会按配置去加载。。。

分享到:
评论

相关推荐

    Servlet JSP深入详解 基于Tomcat的Web开发

    - **初始化阶段**:当Servlet容器第一次加载Servlet时,会调用init()方法进行初始化。 - **服务阶段**:Servlet容器接收到客户端请求后,调用service()方法来处理请求。 - **销毁阶段**:当Servlet容器停止时,调用...

    How Tomcat Works 中文版

    《How Tomcat Works 中文版》是为Java开发者量身定做的技术书籍,它详细解剖了Tomcat这一流行的开源...本书的阅读对于任何一个希望提升自己在Tomcat和servlet容器方面知识的Java开发者来说,都是一次宝贵的学习机会。

    servlet源码 servlet-api-src javax.servlet.Servlet源码

    在Web应用启动时,Servlet容器(如Tomcat)会根据配置加载Servlet,并调用`init()`进行初始化。当收到请求时,容器会调用`service()`,根据请求类型分发到相应的do方法。当Web应用关闭或者Servlet不再需要时,容器会...

    开机自启tomcat.rar

    例如,如果数据库长时间未启动,脚本可能需要发送报警通知,或者在多次尝试失败后停止启动Tomcat,以避免应用进入不稳定状态。 压缩包中的"开机自启tomcat"可能包含了实现这一过程的具体脚本、配置文件示例和说明...

    servlet生命周期详解

    这个过程完全由Servlet容器(如Tomcat、Jetty等)管理。 **初始化阶段** 在初始化阶段,Servlet容器首先加载Servlet类并将其类数据加载到内存中。接着,容器创建一个ServletConfig对象,这个对象包含了Servlet的...

    tomcat自动定时重启

    4. **测试和调整**:设置好任务后,先手动触发几次任务,确保Tomcat能够正确地关闭和启动。如果一切正常,就可以将其设置为自动执行了。 自动定时重启Tomcat有助于在预定的时间点进行系统维护,避免在工作高峰期间...

    Servlet技术入门教学

    当服务器启动或首次接收到对Servlet的请求时,Servlet容器会加载并实例化Servlet。初始化阶段,Servlet执行`init()`方法,通常用于一次性配置。服务阶段,每次请求到达时,都会调用`service()`方法。最后,当服务器...

    Servlet解读

    - **加载类文件:** 当Servlet首次被请求时,Servlet容器(通常是Web服务器的一部分,如Tomcat)会加载Servlet类。这个过程涉及到将Servlet的`.class`文件读入内存。 - **创建`ServletConfig`对象:** 为了提供必要...

    Tomcat7.0.39官方安装包

    6. **配置与管理**:安装完成后,用户可以修改`conf/server.xml`配置文件来调整Tomcat的行为,如设置监听端口、添加虚拟主机等。同时,Tomcat提供了一个web管理界面(`manager/html`应用),通过浏览器可以管理应用...

    Servlet中的Filter

    - **init()**:在Filter实例化后,Web容器会调用一次init()方法,用于初始化Filter,可以在此方法中设置Filter的初始状态。 - **doFilter()**:这是Filter的核心方法,用于处理请求和响应。FilterChain对象作为...

    tomcat ppt

    在这个阶段,Servlet可以进行一次性的配置,例如加载配置文件、打开数据库连接等。 2. **服务(Service)**:每当有新的请求到达,Servlet容器会调用Servlet的`service()`方法来处理请求。这个方法会根据请求类型...

    jakarta-servletapi-4-src.zip servlet源码

    在Servlet的生命周期中,`init()`方法在Servlet实例化后首次被调用,用于初始化Servlet;`service()`方法处理客户端请求;而`destroy()`方法在Servlet销毁前执行,用于释放资源。源码中,我们可以看到这些方法的具体...

    用继承servlet接口的方式手动开发servlet

    - `init(ServletConfig config)`: 初始化方法,只在Servlet首次加载时调用一次。 - `service(ServletRequest req, ServletResponse res)`: 处理请求和服务响应的主要方法。 - `destroy()`: 销毁方法,用于释放...

    java的Servlet测试demo

    初始化阶段,Servlet容器(如Tomcat)加载Servlet类并调用`init()`方法,只执行一次。服务阶段,每当有客户端请求到达,Servlet容器会创建一个`ServletRequest`和`ServletResponse`对象,并调用Servlet的`service()`...

    com.oreilly.servlet

    当Web服务器启动或第一次接收到对Servlet的请求时,会加载并实例化Servlet。然后调用`init()`方法进行初始化,`service()`方法处理每个请求,最后在不再需要Servlet时调用`destroy()`方法。 2. **Servlet配置**:在...

    模拟Tomcat运行机制

    Catalina是Tomcat的核心组件,其架构分为连接器和容器两大部分。连接器负责接收HTTP请求,构建request和response对象,然后将它们传递给容器。容器则负责调用servlet的service方法,执行实际的业务逻辑。容器内部又...

    Servlet笔记

    此方法仅在Servlet被加载时调用一次。 - **服务请求**:处理来自客户端的请求。通常通过`service()`方法实现,其中`doGet()`和`doPost()`是最常用的两个方法。 - **销毁**:当Web应用关闭或重新启动时,服务器调用...

    servlet-ppt java web相关servlet课件

    - Web服务器通过Servlet容器(如Tomcat)来加载和运行Servlet。 2. **Servlet生命周期**: - Servlet经历初始化、服务、销毁三个阶段。 - 初始化:通过`init()`方法进行初始化,通常用于加载配置信息。 - 服务...

    servlet api 官方HTML文档

    Servlet API的运行离不开Servlet容器,如Tomcat、Jetty等。Servlet容器负责加载、管理Servlet,并处理与HTTP通信的细节,让开发者能专注于业务逻辑。 4. **HttpServlet类** 大多数Servlet都会继承HttpServlet类,...

    tomcat-8.5-linux

    【压缩包子文件的文件名称列表】"apache-tomcat-8.5.32"是Tomcat的特定版本号,代表8.5系列中的第32次小版本更新。这个版本可能包含了性能优化、安全修复、新功能添加等改进。解压后的文件夹通常包含以下几个核心...

Global site tag (gtag.js) - Google Analytics