一个velocity和springmvc集成找不到模板文件的问题记录

搭建了一个velocity和springmvc的框架,其他问题都不大,就一直找不到对应的模板文件,网上看了很多教程,再三对比配置,都没有问题,很好奇网上的教程是怎么跑起来的。另外就是网上教程大多不爱贴文件目录结构,自己一点一点琢磨好久~

首先先贴一下我的项目的目录结构。

一个velocity和springmvc集成找不到模板文件的问题记录

该问题主要与webapp目录下的各种资源文件查找相关所以上面的目录可以忽略。

然后贴一下我springmvc的正确配置。

一个velocity和springmvc集成找不到模板文件的问题记录

然后贴一下我错误的配置,是的,一开始为了避免这种配置错误,我都用了绝对路径,然后我依然配错了。

一个velocity和springmvc集成找不到模板文件的问题记录

找不到模板文件,第一反应就是配置配错了,然后各种查教程,无果,本来想去官网看的,官网一大堆英文加上没有找到和springmvc的集成(可能是我自己看的不仔细,渣渣看英文还是有些本能的抵触)。

好吧,开使追踪源码查找springmvc如何查找该模板文件的。(该过程和最后错误没有半毛钱关系,仅仅记录我排查过程)

从dispatchServlet开始追踪

一个velocity和springmvc集成找不到模板文件的问题记录

springmvc可以配置ViewResolver链,找到velocity的ViewResolver,追踪到调用了resolveViewName方法。

一个velocity和springmvc集成找不到模板文件的问题记录

这个方法会将第一次查找的过程缓存起来,所以第二次访问时是进入不到标注的那一行代码的,所以我每次都是重启服务器追踪的。可以看到主要是在createView当中创建出我们要的视图的。

一个velocity和springmvc集成找不到模板文件的问题记录

进入调用的createView方法,好吧,springmvc分层做的非常好,调用链非常长,我就不一步步记录了,最后我找到了

一个velocity和springmvc集成找不到模板文件的问题记录

到调用applyLifecycleMethods也是没有问题滴,看里面各项参数也是与预期相符的,各种路径貌似也没有问题。但是到标注的那一行代码的时候,返回了空。当时以为自己问题就在眼前了。

一个velocity和springmvc集成找不到模板文件的问题记录

接着就跟着代码到了这一步。然后就报出来错误了~

我擦,我看了下返回的url和我配的是一模一样的。而且路径也没有问题。(因为有些路径会拼装,所以看变量好像都没有问题,实际加载的时候就是问题了)

在源码里面兜兜转转很久,然后就想了,是不是因为没有加载进去,然后看了ResourceManager那个接口和实现类,好吧,压根和这个类没有半毛钱关系,虽然错误是从那里出来的。我网上查了一下,是从FileResourceLoader那个类里面去加载对应的模板类的,然后进入该类,看到了两个相关的方法。

一个velocity和springmvc集成找不到模板文件的问题记录

一个velocity和springmvc集成找不到模板文件的问题记录

略微一跟踪,答案终于找到了,主要看getFile方法,里面有个new File(path,template)语句。

一个velocity和springmvc集成找不到模板文件的问题记录

该方法就是把parent路径下的child文件给加载为文件。这个构造函数我也是第一遇到,也是看了注释大概明白了这个意思。

然后跟踪了一下变量就知道了,springmvc加载velocity的时候会把config配置的resource路径作为一个相对路径,然后将配置的layout和模板文件路径给拼接起来,所以我之前调试的时候是看到的路径看起来是没有问题的,实际上加载的时候加了对应的路径才会导致问题的发生。

浪费我好多时间==好希望有个大牛做我旁边告诉我说这么配置有问题~权当锻炼看源码了。。。