如何在类注释@controller中获取Spring WebContext

时间:2012-11-03 06:17:55

标签: spring servlets spring-mvc autowired applicationcontext

在带有注释的Spring MVC中,我们使用@Controller标记任何POJO。 在这个控制器中,我们可以使用autowired属性获取WebApplicationContext。

@Controller
public class HomePageController {

@Autowired
ApplicationContext act;

    @RequestMapping("/*.html")
    public String handleBasic(){
        SimpleDomain sd = (SimpleDomain)act.getBean("sd1");
        System.out.println(sd.getFirstProp());
        return "hello";
}

但是在这种方法中,我们没有方便的servletContext。那么我们是否仍然可以使用较旧的方式获取WebApplicationContext?即。

WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)

我们如何在这里获得servletContext?

我没有任何强迫使用旧方法;所以这个问题只是出于好奇心来检查弹簧的灵活性。 它也可以是一个面试问题。

5 个答案:

答案 0 :(得分:16)

您可以将其注入控制器:

@Autowired private ServletContext servletContext;

或者将HttpServletRequest作为参数并从那里获取:

@RequestMapping(...)
public ModelAndView myMethod(HttpServletRequest request ...){
    ServletContext servletContext = request.getServletContext()
}

答案 1 :(得分:2)

以下是正确的方法:

@Autowired
ServletContext context;

否则不是自动连接ServletContext,而是可以实现ServletContextAware。当在Web应用程序上下文中运行并注入ServletContext时,Spring会注意到这一点。阅读this

答案 2 :(得分:2)

您也可以内联:

FileReader

答案 3 :(得分:2)

您可以从Spring实现名为org.springframework.web.context.ServletContextAware

的接口
public class MyController implements ServletContextAware {
    private ServletContext servletContext; 

    @Override
    public void setServletContext(ServletContext servletContext) {
       this.servletContext=servletContext;
    }
}

然后你可以在课堂上的任何地方使用servletContext

答案 4 :(得分:1)

通过访问会话,您可以获取servlet上下文,示例代码:

@Controller
public class MyController{

....
@RequestMapping(...)
public ModelAndView myMethod(HttpSession session ...){

WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext())

}

}

您也可以从HttpServletRequest获取HttpSession。