在spring MVC的controller中获取ServletConfig

本文详细介绍了在使用SmartUpload进行文件上传时如何在Controller中获取servletConfig,通过继承ServletConfigAware和ServletContextAware接口实现。并提供了一个实际的示例代码帮助开发者快速上手。

在使用SmartUpload进行文件上传时,需要用到srevletConfig:


如果是在servlet中写当然是很容易实现的:

        private ServletConfig config;
	//初始化Servlet
	final public void init(ServletConfig config)
			throws ServletException{
		this.config=config;
	}

init方法会在servlet初始化时获取到servletConfig.

但是在Controller中怎么获得呢?经过小编多方请教,可以通过继承ServletConfigAware,ServletContextAware这两个接口来实现:

package module.system.controller;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import module.system.common.FileLoad;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.ServletConfigAware;
import org.springframework.web.context.ServletContextAware;
/**
 * 文件上传下载.
 * 
 */
@Controller
@RequestMapping("/fileLoad")
public class FileLoadController implements ServletConfigAware,ServletContextAware{
	
	private ServletContext servletContext;
	@Override
	public void setServletContext(ServletContext arg0) {
		this.servletContext = arg0;
	}
    private ServletConfig servletConfig;
	@Override
	public void setServletConfig(ServletConfig arg0) {
        this.servletConfig = arg0;
	}
	
	@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
	@ResponseBody  //此注解表明返回值跳过视图处理部分,直接写入 http response body中
	public String upload(HttpServletRequest request,HttpServletResponse response) {
		 
		FileLoad fileLoad = new FileLoad();
		try {
			fileLoad.upload(request, response,servletConfig);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	
}

里边这个upload方法是另外写的一个方法,将会在下一篇文章中介绍。通过这样就可以得到servletConfig了



<think>我们正在一个非Spring Boot的传统Spring WebMVC项目中配置Log4j2(版本2.23.1),并且使用web.xml进行配置。以下是配置步骤: ### 1. 添加Maven依赖 在项目的pom.xml文件中,添加Log4j2的核心依赖和与Web应用集成的依赖。由于我们使用的是Log4j2.23.1,因此需要指定版本。 ```xml <dependencies> <!-- Log4j2核心API --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <!-- Log4j2核心实现 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> <!-- 用于在Web应用中初始化Log4j2 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.23.1</version> <scope>runtime</scope> </dependency> </dependencies> ``` ### 2. 创建Log4j2配置文件 在项目的类路径(如`src/main/resources`)下创建Log4j2的配置文件,例如`log4j2.xml`。以下是一个简单的配置示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` ### 3. 在web.xml中配置Log4j2 在web.xml中,我们需要配置两个部分: - 一个监听器(Listener)用于在Web应用启动时初始化Log4j2,并在应用关闭时清理。 - 一个上下文参数(context-param)指定Log4j2的配置文件位置(可选,如果配置文件放在类路径根目录且命名为`log4j2.xml`,则不需要)。 在web.xml中添加如下配置: ```xml <!-- 指定Log4j2的配置文件位置(可选) --> <context-param> <param-name>log4jConfiguration</param-name> <param-value>classpath:log4j2.xml</param-value> </context-param> <!-- 配置Log4j2的监听器 --> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <!-- 配置Log4j2的过滤器(用于捕获Servlet上下文属性,如ServletContext, ServletConfig等) --> <filter> <filter-name>log4jServletFilter</filter-name> <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> </filter> <filter-mapping> <filter-name>log4jServletFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> ``` ### 4. 在代码中使用Log4j2 在Java类中,我们可以通过以下方式获取Logger: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyClass { private static final Logger logger = LogManager.getLogger(MyClass.class); public void doSomething() { logger.info("This is an info message."); } } ``` ### 注意事项 - Log4j2的`log4j-web`模块是专门为Web应用设计的,它负责处理在Web容器环境中的生命周期和类加载器问题。 - 在web.xml中配置的监听器(`Log4jServletContextListener`)和过滤器(`Log4jServletFilter`)是必须的,以确保Log4j2能够正确初始化和清理。 - 如果配置文件不在默认位置,可以通过`log4jConfiguration`上下文参数指定,也可以使用系统属性`log4j.configurationFile`来指定。 ### 引用说明 在配置过程中,我们参考了Log4j2官方文档中关于Web应用的配置部分[^1]。 §§相关问题§§ 1. Log4j2在Web应用中常见的配置问题有哪些? 2. 如何配置Log4j2以实现日志文件的滚动和归档? 3. 在Spring WebMVC项目中,如何将Log4j2与其他日志框架(如SLF4J)集成? [^1]: [Log4j2 Web Application Configuration](https://logging.apache.org/log4j/2.x/manual/webapp.html)</think>### 在传统 Spring WebMVC 中配置 Log4j2 2.23.1(使用 web.xml) #### 1. 添加 Maven 依赖 在 `pom.xml` 中添加以下依赖: ```xml <dependencies> <!-- Log4j2 核心 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> <!-- Web 集成支持 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.23.1</version> <scope>runtime</scope> </dependency> <!-- 可选:SLF4J 桥接(如需兼容 SLF4J API) --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.23.1</version> </dependency> </dependencies> ``` #### 2. 创建 Log4j2 配置文件 在 `src/main/resources` 下创建 `log4j2.xml`: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 控制台输出 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 文件输出(按需启用) --> <File name="File" fileName="logs/app.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <!-- Spring 框架日志级别 --> <Logger name="org.springframework" level="INFO" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 项目代码日志 --> <Root level="DEBUG"> <AppenderRef ref="Console"/> <AppenderRef ref="File"/> </Root> </Loggers> </Configuration> ``` #### 3. 配置 web.xml 添加监听器和上下文参数: ```xml <!-- 指定 Log4j2 配置文件位置 --> <context-param> <param-name>log4jConfiguration</param-name> <param-value>classpath:log4j2.xml</param-value> </context-param> <!-- 初始化 Log4j2 --> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <!-- 捕获 Servlet 上下文属性 --> <filter> <filter-name>log4jServletFilter</filter-name> <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> </filter> <filter-mapping> <filter-name>log4jServletFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` #### 4. 验证配置 在 Java 类中使用日志: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestController { private static final Logger logger = LogManager.getLogger(TestController.class); public void test() { logger.debug("Debug 消息"); logger.info("Info 消息"); logger.error("Error 消息"); } } ``` #### 关键注意事项 1. **依赖冲突**:检查是否包含其他日志框架(如 logback/log4j1.x),需排除冲突依赖 2. **类加载器**:`log4j-web` 模块解决 Web 应用的类加载隔离问题[^1] 3. **配置文件位置**:若需自定义路径,可使用: ```xml <context-param> <param-name>log4jConfiguration</param-name> <param-value>file:/etc/app/log4j2.xml</param-value> </context-param> ``` #### 常见问题排查 - 日志不输出:检查 `log4j-web` 依赖是否生效 - 配置文件加载失败:添加 JVM 参数 `-Dlog4j2.debug=true` - 与 SLF4J 集成:确保使用 `log4j-slf4j-impl` 而非其他绑定器 > 配置示例参考 Log4j2 官方文档的 Web 应用集成指南[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光光-Leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值