8

在带有注解的 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 ?IE

WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)

我们将如何在这里获得 servletContext ?

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

4

5 回答 5

16

您可以将其注入您的控制器:

@Autowired private ServletContext servletContext;

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

@RequestMapping(...)
public ModelAndView myMethod(HttpServletRequest request ...){
    ServletContext servletContext = request.getServletContext()
}
于 2012-11-03T16:11:36.553 回答
2

以下是正确的做法:

@Autowired
ServletContext context;

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

于 2012-11-04T06:03:31.603 回答
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课堂上的任何地方。

于 2015-09-02T00:25:06.233 回答
2

你也可以内联:

@RequestMapping(value = "/demp", method = RequestMethod.PUT)
public String demo(@RequestBody String request) {
    HttpServletRequest re3 = ((ServletRequestAttributes) RequestContextHolder

            .getRequestAttributes()).getRequest();
    return "sfsdf";
 }
于 2015-07-20T12:01:26.507 回答
1

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

@Controller
public class MyController{

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

WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext())

}

}

您也可以从 HttpServletRequest 获取 HttpSession。

于 2012-11-03T13:56:43.873 回答