在Spring中,凡是实现ServletContextAware接口的类,都可以取得ServletContext.
实现如下:
private ServletContext application;
public void setServletContext(ServletContext servletContext) {
this.application = servletContext;
}
那么Spring是在什么时候把ServletContext放置进去的呢。
通过对Spring的学习,终于明白了。
在web项目中,Spring容器的加载是通过XmlWebApplicationContext进行的。
它的父类AbstractRefreshableWebApplicationContext,在postProcessBeanFactory方法中进行了如下操作(postProcessBeanFactory方法被AbstractApplicationContext的refresh方法调用)
beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
beanFactory.ignoreDependencyInterface(ServletConfigAware.class);
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
代码的第一句就是添加了一个ServletContextAwareProcessor。
该类的postProcessBeforeInitialization方法如下:
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (this.servletContext != null && bean instanceof ServletContextAware) {
((ServletContextAware) bean).setServletContext(this.servletContext);
}
if (this.servletConfig != null && bean instanceof ServletConfigAware) {
((ServletConfigAware) bean).setServletConfig(this.servletConfig);
}
return bean;
}
而所有的BeanPostProcessor都将在AbstractAutowireCapableBeanFactory类的initializeBean方法中,通过调用applyBeanPostProcessorsBeforeInitialization方法完成所有实现BeanPostProcessor接口的postProcessBeforeInitialization的调用。
XmlWebApplicationContext使用的BeanFactory是DefaultListableBeanFactory。
DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory,因此可以完成上述操作。
如此完成了只要实现了ServletContextAware接口的,都可以获取ServletContext
分享到:
相关推荐
实现 ServletRequestAware、ServletContextAware 接口。 Result 类型 Struts2 的 Result 类型有四种:Dispatcher、Redirect、Chain、RedirectAction。Dispatcher 跳转到 URL,通常是 JSP 服务器端;Redirect ...
2. **Filter**: 同样,可以在Filter的init()方法中获取ApplicationContext,或者通过ServletContextAware接口,将Spring上下文注册到ServletContext,然后在doFilter()方法中使用。 3. **Listener**: 在监听器的...
关于Struts 2的Action如何与Servlet API进行交互,业务逻辑Action可以通过实现ServletRequestAware、ServletResponseAware和ServletContextAware接口来实现。通过这些接口中的setter方法,可以将容器中的request、...
例如,在下面的代码中,ActionTest7 类实现了 ServletRequestAware、ServletResponseAware 和 ServletContextAware 接口,通过这些接口,可以访问 request、response 和 application 对象。 ```java public class ...
* ServletContextAware : 访问 Web 应用的 ServletContext 实例 * ServletRequestAware : 访问 HttpServletRequest 实例 * ServletResponseAware : 访问 HttpServletResponse 实例 将 Action 实现这些接口,可以...
`WebMvcAutoConfigurationAdapter`还实现了`ServletContextAware`接口,以便于访问Servlet上下文,这在处理静态资源时非常有用。 在`WebMvcAutoConfiguration`中,`WebMvcProperties`和`WebProperties`被`@...
例如,在Spring中配置DWR时,可以创建一个实现了`ServletContextAware`接口的类,并在该类中注入DWR相关的bean。这样,DWR就能够通过Spring管理其bean,并且在需要时能够访问到Spring上下文中的其他bean。 #### 五...
这个类继承自`ActionSupport`,并实现了`ServletContextAware`接口。`ActionSupport`提供了异常处理和结果返回的基本结构,而`ServletContextAware`允许访问Servlet上下文,以便获取文件存储路径。 3. **字段与方法...
后端Action类通常会定义为`ActionSupport`的子类,并实现`ServletContextAware`接口以便获取`ServletContext`对象,用于获取文件的存储路径。Action类的主要代码如下: ```java public class SingleUploadAction ...
implements ServletRequestAware, ServletContextAware, ServletResponseAware, ValidationWorkflowAware { private static final long serialVersionUID = -1040212988363452551L; protected final Logger ...
类似地,还可以实现`ServletRequestAware`、`ServletResponseAware`和`ServletContextAware`等接口来获取更多的请求信息。 #### 配置Action - **使用通配符配置Action:** 通过通配符可以更加灵活地配置Action的...
此外,Action还可以实现ServletContextAware、ServletRequestAware和ServletResponseAware接口来直接获得Servlet容器中的对象。 Action的高级特性包括动态方法调用,这是Struts2的一个强大功能,允许一个Action处理...
可以让Action类实现`ServletRequestAware`、`ServletResponseAware`和`ServletContextAware`接口,Struts框架会在运行时自动注入对应的对象: ```java public class HelloWorldAction implements ...
10. **Servlet 3.0及以上版本的新特性**:包括注解配置、异步处理、微容器(ServletContextAware)等,大大简化了Servlet的开发和部署。 通过这些知识点的学习,开发者可以有效地利用Servlet来构建功能丰富的、可...
2. **spring-web.jar**:此 jar 包提供了与 HTTP 请求处理相关的类,如 ServletContextAware、HttpSessionBindingListener 等。它还包含一些基础的 Web 功能,如上传文件的支持。 3. **spring-context.jar**:提供...
1. `ServletContextAware`: 实现此接口的Action可以在初始化时获取到ServletContext实例。 2. `ServletRequestAware`: 实现这个接口的Action可以获取到HttpServletRequest实例,以便直接操作请求数据。 3. `...