当前位置: 代码迷 >> 综合 >> Spring5:就这一次,搞定资源加载器之ServletContextResourceLoader
  详细解决方案

Spring5:就这一次,搞定资源加载器之ServletContextResourceLoader

热度:24   发布时间:2024-01-16 14:13:55.0

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呢,简单方便!以上纯属个人理解,如有错误,还望指正,谢谢!