SpringMVC实现velocity多Resourceloader通过文件、数据库等方式加载模版

Spring针对velocity实现了默认的file的resourceLoader,每次读取的文件都是固定位置的,如果我们想实现随时改变文件随时页面生效这种效果就很难实现了。

但是现实的应用场景中这样的例子还不少,1营销页面,2产品化的配置管理等

实现方案,可以通过纯前端的方式实现

比如:

1.把页面模版写在数据库里,然后写死一个页面,通过ajax从后台取不同的模版,然后根据不同的数据做渲染展示

2.纯后端模式实现,改造springmvc的view的render这层,保证每次渲染的时候,原有从文件系统读模版改为从db中读模版。

本文主要采用第二种方案和大家做交流。

分析这个问题,首先要了解springMvc的DispatcherServlet处理链路

1. DispatcherServlet中获取到controller返回的ModelAndView之后会通过render方法来获取对应的view代码如下:

2. resolveViewName()方法中,通过所有配置的viewResolver来进行resolveViewName。这个链路一直看下去,会到具体的viewResolver然后build出来view,这里就不过多赘述,详情看代码。

3. 获取到view之后,view会通过render()方法来做渲染,在渲染的过程中会通过VelocityView.doRender()来做渲染,然后通过getTemplate()获取渲染需要的模版。

VelocityView.doRender()  ---->  getTemplate() ---->  VelocityEngine.getTemplate()  --->   RuntimeInstance.getTemplate()   --->   ResourceManager.getResource()

重点看ResourceManager.getResource

该方法就是模版的具体获取过程,如果第一次访问,那么走else分支,有了缓存走if分支,走else分支的会,会通过loader去获取模版资源

可以看到最终判断文件是否需要更新是通过loader来实现的,VelocityResourceLoader来加载具体的模版

看到这里,我们可以明白了,控制velocity的模版获取是通过loader来实现的。那么如果我们想实现自己来从db里面读取模版,只需实现自己的loader即可(1.获取模版,2控制何时更新模版)

但是问题来了!!!这个loader是何时spring给注入进去做的初始化呢?

继续往下看

众所周知spring配置velocity做展现层是通过VelocityConfigurer来实现的,VelocityConfigurer继承自VelocityEngineFactory,通过各种参数实现了针对velocity的相关参数配置,主要的方法有:VelocityEngineFactory.initVelocityResourceLoader()

spring写死了默认的loader名称为file

看到这里大家应该比较清楚了,实现从db里面读取vm文件,我们只需要重写两个类即可

1.ResourceLoader(在loader中实现原有的从文件系统中读取改为从db中或者分布式文件系统中读取,并控制velocity的缓存管理,实现自己来管理这部分模版的缓存)

2.VelocityConfigurer(在初始化velocity的时候设置不同的classloader名称,并且将自己新写的ResourceLoader设置进去即可)

思路基本上就是上面的思路,由于公司代码不能漏出,所以暂时不贴出重写后的类了。

后续会在上几篇博客嵌入了jetty的springMvc空框架上进行实现。敬请期待。

这篇文章也是断断续续靠晚上挤出来的一点点时间完成的。感觉工作忙了越来越没写技术博客的动力了,无奈记性太差,怕下次忘掉,又要翻源码,所以就记录一下思路吧。

时间: 2024-11-05 02:42:25

SpringMVC实现velocity多Resourceloader通过文件、数据库等方式加载模版的相关文章

J2EE加载资源文件以及Spring加载XML文件

J2EE加载XML文件 Resource接口,是用来加载文件的接口. FileSystemResource和ClassPathResource都是实现了Resource接口,他们都可以用来加载XML文件. 具体代码如下: 1 Resource resource1 = new ClassPathResource("文件.xml"); 2 3 Resource resource2 = new FileSystemResource("盘符:/项目路径/src/文件.xml"

C# IO操作(五)文件的递归加载

本篇是一个案例,其核心通过代码展示代码中的递归这个用法,程序的界面如下: 当点击“加载”按钮时,根据路径中的地址,加载该文件夹下所有的子文件夹和子文件,代码如下: 1 private void BtnLoad_Click(object sender, EventArgs e) 2 { 3 string sPath = txtPath.Text.Trim(); 4 LoadDirAndFile(sPath, tvList.Nodes); 5 } 6 7 private void LoadDirAn

Microsoft Excel 文件未完全加载

今天(具体说是昨天)处理一个90多M的csv文件,一打开,报错"文件未完全加载", 这什么情况啊,我还想另存为xlsx的,这样就可以导入SQL Server了!(Easy,我知道csv等平面文件也可以导入SQL Server) 我以为文件坏了呢,毕竟这么大,这么多年,第一次打开90多M的csv(excel)文件.重新打开还是一样的问题. 只好点击"显示帮助",才知道原因,原来excel的行列数不能超过1,048,576行和16,384列的限制.才想起是这个问题,ex

关于air文件拖入加载解析的两个问题

因需用到拖入加载问价解析,于是第一感觉就是想到了air,经网上查到代码如下: public class Darg extends Sprite     {         public function Darg ()         {             if (stage) {                 creat();             }else{                 addEventListener(Event.ADDED_TO_STAGE,creat);

封装实现JavaScript 文件的动态加载功能

function loadScript(url, callback){ var script = document.createElement ("script") script.type = "text/javascript"; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" || scr

winform如何实现将数据库数据加载到树上

一.简介 对于winform中如何加载xml生成目录树,在前边一篇文章"c#如何实现从xml中加载树目录,并且显示完整的Text"中我已经写了详细的过程.但是有些时候我们不可能将大量的数据存储到xml中,原因是,xml一般用于小数据量的传递.而大数据的存储与传递我们一般用专门的数据库管理工具作为传递的介质.在此,声明一点是,对于大数据量的传递,我们在这里不考虑速率传递快慢问题,我们举例只是实现最基本的功能,这样也方便和我一样的初学者理解. 好了,说了这么多废话,开始正式进入我们这篇文章

如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。

一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代码,相信很多人都见过. 1 <script src="1.js"></script> 2 <script src="2.js"></script> 3 <script src="3.js">

js文件代码未加载或者没有js效果

问题:在页面中js文件中的代码未加载或者没有任何效果. 原因: 成功引用了js文件,但无效果或者提示未加载该文档中的代码. 可能页面引用js文件的路径存在问题 解决: 重新检查你引用的js文件的路径是否正确: 一般是js代码存在语法问题,仔细检查标点符号.单双引号(本人源于这个问题),以及页面中是否有未结束的<!--的符号. js文件代码未加载或者没有js效果

profile文件的错误加载与基本命令间的映射

一.绪论 [因为这篇心得是原创的,所以如果有哪处总结或者意见不足的地方,欢迎各位大神的批评和意见,共同学习,谢谢了!] 早些时候,需要在centos6.4系统中配置单机版和集群版单节点的hadoop HDFS,由于那时候一边跟老师学hadoop一边自学Linux.初学的自己懂得也不多,别人都用普通用户登录,在需要root权限时才sudo或者切换root用户进行配置,而我呢? 从一开始就使用了root登录,在给java和hadoop配置了profile文件环境变量,等到重启之后,出现了下图的现象: