天天看点

Web工程中获取ServletContext和ApplicationContext的方法以及相关Aware的使用

1、在Web环境下获取ServletContext

  • 利用ContextLoader
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
           
  • 使用RequestContextUtils
ServletContext context=RequestContextUtils.getWebApplicationContext(request).getServletContext();
           
  • 利用HttpServletRequest
ServletContext context = req.getServletContext();
           

2、在Web环境下获取ApplicationContext,请参考资料地址

  • 利用WebApplicationConteaxtUtils
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); 
           
  • 实现接口ApplicationContextAware

    说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象; Spring初始化时,会通过该方法将ApplicationContext对象注入

3、ServletContext和Application的异同

  • 相同点

    其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量;在servlet中ServletContext就是application对象

  • 不同

    两者的区别就是application用在jsp中,servletContext用在servlet中。application和pagerequestsession 都是JSP中的内置对象,在后台用ServletContext存储的属性数据可以用application对象获得

4、Spring框架中的*Aware接口

  • ServletContextAware接口
private ServletContext application;
@Override
public void setServletContext(ServletContext servletContext) {  
    this.application = servletContext;  
}
           
  • ApplicationContextAware接口
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext=applicationContext;
}
           

5、Spring中Aware接口的使用,如:当某个Controller需要已登录用户的信息时,可以自己实现UserAware

/*
*1、自定义接口,如命名为UserAware
*/
public interface UserAware {
    public void setUser(User user);
}

/**
*2、在Struts2中操作拦截器时,如果用户已登录,并且判断某个Controller实现了*UserAware接口,则把已登录的用户注入
*/
public String intercept(ActionInvocation invocation) throws Exception {
    BaseAction action = (BaseAction) arg0.getAction();
    if(action instanceof LoginAction || action instanceof RegAction){
        return invocation.invoke();
    }
    else{
        User user = (User)invocation.getInvocationContext().getSession().get("user");
        if(user == null){
            //去登陆
            return "login" ;
        }
        else{
            //放行
            if(action instanceof UserAware){
                //注入user给action
                ((UserAware)action).setUser(user);
            }
            return invocation.invoke();
        }
    }
}
           

继续阅读