Spring中有个监听器
public class WebAppRootListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { WebUtils.setWebAppRootSystemProperty(event.getServletContext()); } public void contextDestroyed(ServletContextEvent event) { WebUtils.removeWebAppRootSystemProperty(event.getServletContext()); } }
初始化方法内容如下(将日志代码去掉):
public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException { Assert.notNull(servletContext, "ServletContext must not be null"); String root = servletContext.getRealPath("/"); if (root == null) { throw new IllegalStateException(); } String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);//webAppRootKey String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);//webapp.root String oldValue = System.getProperty(key); if (oldValue != null && !StringUtils.pathEquals(oldValue, root)) { throw new IllegalStateException() } System.setProperty(key, root); }
可以看到这个监听器的作用就是将项目根路径作为value放到系统参数中去,而这个key值默认是“webapp.root”,如果想要修改可以在ServletContext中通过设置“webAppRootKey”这个参数来修改这个key值(比如在web.xml文件中修改)。
这个参数可以用于一些工具包在项目运行时动态以${webapp.root}这样的方式动态获取项目路径,比如log4j.properties配置文件中 log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log就可以在运行时动态的找出项目的路径。
包括Tomcat的一些容器,没有为各个应用维护自己的系统参数,所以必须用“webAppRootKey”为每个web应用设置单独的根目录系统参数key,否则会引起冲突,报错。看上面代码就是如果两个同一个key值被设置过一次且值与当前不同则报错。
当然想要用这个系统参数要在web.xml中配置WebAppRootListener这个监听器,但是如果配置了Log4jConfigListener或者LogbackConfigListener则不需要再陪上面的监听器了,因为这两个监听器的初始化方法第一步就是运行上面的setWebAppRootSystemProperty,但是运不运行又要看另一个参数 "xxxExposeWebAppRoot"。那又是另一回事了
两个部署在同一个tomcat下的spring项目如果webAppRootKey值相同有可能会发生只能访问第一个启动的项目,后面启动项目报404错误的问题
相关推荐
2、多个项目一起部署仅部分系统可以使用。 解决办法:检查每个系统的web.xml配置文件,文件位置: Tomcat服务器下../webapps/项目名称/WEB-INF/web.xml。 【webAppRootKey】与其他项目下的配置值决不可相同!。 ...
在 Tomcat 中部署多个项目时,可能会遇到一些问题,例如多个项目间的配置冲突、日志记录问题等。以下是解决这些问题的方法和相关知识点。 问题 1:java.lang.IllegalStateException 在多个项目中,可能会遇到 `...
2. **Tomcat 服务器**:Apache Tomcat 是一个开源的、基于 Java Servlet 和 JavaServer Pages (JSP) 技术的 Web 应用服务器,广泛应用于小型到中型的 Java Web 应用部署。它是 Apache 软件基金会的一个项目,执行 ...
为了防止在同一容器中部署多个应用时的日志配置冲突,我们需要通过设置唯一的`webAppRootKey`来指定日志的存储路径。如下面的代码所示: ```xml <param-name>webAppRootKey <param-value>itservice.root ``...
在IT行业中,尤其是在Web服务器管理领域,经常遇到需要在一个服务器上部署多个应用的情况。Tomcat作为流行的Java Servlet容器,能够支持这种多项目部署的需求。本文将详细介绍如何在Tomcat 7上通过设置不同的端口来...
1.3.4. 当所有配置完成并正确无误时,可以运行Spring的Hello World应用,验证环境配置是否成功。通过浏览器访问指定的URL,如果能看到预期的“Hello World”消息,那么说明配置已成功。 1.4. 小结中提到,本章重点...
Spring Boot支持内嵌的Web服务器,如Tomcat或Jetty,这使得我们无需单独部署Web服务器,可以直接运行`.jar`文件启动应用。 **6. YAML或Properties配置** Spring Boot应用可以通过`application.yml`或`application....
为了避免因多个项目使用相同的默认键值而引发冲突,可以通过设置`webAppRootKey`来为当前项目指定一个唯一的键值。 ```xml <param-name>webAppRootKey <param-value>webappby.root ``` 这里的`webappby.root`...
在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`<context-param>`和`...
从给定的文件内容可以看到,这是一个 Spring 框架的 Web 应用程序配置文件,使用 XML 格式定义了应用程序的各种配置项。 首先,让我们来看一下 XML 文件的头部声明 `<xml version="1.0" encoding="UTF-8"?>`,这里...
在Spring框架中,配置Log4j是一个常见的任务,它允许我们对应用的日志输出进行精细控制,便于调试、监控和问题排查。以下是关于Spring配置Log4j的关键知识点: 1. **webAppRootKey参数**:这个参数用于指定Web应用...
通过上述步骤,可以成功地将Spring、Struts和iBatis这三个框架集成到一起,搭建出一个完整的Java Web应用程序架构。这样的架构不仅提供了灵活的应用程序开发方式,还能够很好地支持MVC模式的设计思想,使得应用程序...
`<context-param>`用于设置全局参数,例如`webAppRootKey`用于定义应用的根目录,`log4jConfigLocation`和`log4jRefreshInterval`分别指定Log4J配置文件的位置和刷新间隔,而`contextConfigLocation`则指定了Spring...
`ContextLoaderListener`是Spring框架提供的一个监听器,其主要功能是在Web应用启动时自动加载`ApplicationContext`的配置信息。通过在`web.xml`中配置如下: ```xml <listener-class>org.springframework....
- **说明**:此配置指定了Log4J配置文件的路径,以便Spring可以在启动时加载并应用这些配置。 3. **`log4jRefreshInterval`**: - **作用**:指定Log4J配置文件的刷新间隔时间(毫秒)。 - **示例**: ```xml ...