我有一个看似简单的问题。我有一个部署在Tomcat中的Spring Web应用程序。在服务类中,我希望能够在应用程序根目录下将新文件写入名为graphs的目录:
/
/WEB-INF
/graphs/
/css/
/javascript/
我的服务类是Spring bean,但是我无法通过HttpServlet机制直接访问ServletContext。我也尝试实现ResourceLoaderAware,但似乎仍无法抓住我需要的东西。
如何使用Spring获取应用程序中目录的句柄,以便可以向其中写入文件?谢谢。
最佳答案
如果您的bean是由webapp的spring上下文管理的,则可以实现ServletContextAware
,Spring会将ServletContext
注入到您的bean中。然后,您可以向ServletContext
询问给定资源的实际文件系统路径,例如
String filePathToGraphsDir = servletContext.getRealPath("/graphs");
如果您的bean不在webapp上下文中,那么它会变得很丑陋,可能会起作用:
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
String pathToGraphsDir = requestAttributes.getRequest().getRealPath("/graphs");
尽管使用了不推荐使用的
ServletRequest.getRealPath
方法,但它仍然可以工作,尽管RequestContextHolder
仅在由请求线程执行时才有效。