ServletContextResourceLoader继承自DefaultReourceLoader,并重写了getResourceByPath(String path)方法,该类的扩展功能是可以从Servlet上下文的根目录加载资源。
构造该加载器的时候需要ServletContext,示例如下:
@Controller
public class LoginController {@RequestMapping(value="/index.html")public String loginPage(HttpServletRequest request) throws IOException {ResourceLoader resourceLoader=new ServletContextResourceLoader (request.getSession().getServletContext());Resource resource=resourceLoader.getResource("/WEB-INF/test.xml");System.out.println(resource.getInputStream()); return "index"; }
}
这段示例程序的意思是在/WEB-INF下存在test.xml文件,咱们用ServletContextResourceLoader加载它,
启动服务器,访问index.html,观察输出:
[INFO] Restart completed at Fri Jul 06 11:44:19 CST 2018
sun.nio.ch.ChannelInputStream@6a3bc065
成功。
接下来,咱们皮一下,传个相对路径进去,像这样:
Resource resource=resourceLoader.getResource("WEB-INF/test.xml");
观察输出:
[INFO] Restart completed at Fri Jul 06 11:46:51 CST 2018
sun.nio.ch.ChannelInputStream@67203436
也是可以的,因为ServletContextResourceLoader是从上下文的根路径加载资源,上下文的根路径是webapp(在开发工具中比如eclipse中,指的就是webapp,当打成war包以后就是你项目打包的名字了...),拼上WEB-INF/test.xml,没毛病,没毛病。
但是使用该加载器要注意一个问题,就是maven工程打包以后src/main/resources下的资源文件会被打到WEB-INF/classes下,所以WEB-INF/test.xml这种写法spring是加载不到的,因此路径要这么写才可以:
Resource resource=resourceLoader.getResource("WEB-INF/classes/test.xml");
但是这不就是classpath?为何不用 classpath:test.xml呢,简单方便!以上纯属个人理解,如有错误,还望指正,谢谢!