在实际的项目开发中,为了方便前端人员调试页面,所以有必要将Beetl的模板文件放在独立的目录下,方便前端人员维护,而不是打包到项目的jar包中,如果打包到项目的jar包中还有另外的问题,就是一改动页面就要重新打包部署,这样对于运维而言比较麻烦,增加运维的工作量。
在Beetl官网有个BeetlConf的例子,我们复制过来稍加修改:
package org.openjweb.core.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.beetl.core.resource.ClasspathResourceLoader;
import org.beetl.core.resource.FileResourceLoader;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.beetl.ext.spring.BeetlSpringViewResolver;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class BeetlConf {
//@Value("${beetl.templatesPath}") String templatesPath;//模板根目录 ,比如 "templates"
String templatesPath = "templates";//这个给类定义使用的
@Value("${beetl.fileTemplatesPath:}") String fileTemplatesPath;//模板根目录 ,比如 "templates",,加:确保没配置此参数时启动不会报异常
String templateFilePath = "";
@Bean(name = "beetlConfig")
public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {
BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
//获取Spring Boot 的ClassLoader
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if(loader==null){
loader = BeetlConf.class.getClassLoader();
}
log.info("当前指定的Beetl模板文件路径:"+String.valueOf(fileTemplatesPath));
//beetlGroupUtilConfiguration.setConfigProperties(extProperties);//额外的配置,可以覆盖默认配置,一般不需要
if(StringUtils.isNotEmpty(fileTemplatesPath)){
log.info("使用文件模版路径...........");
FileResourceLoader floader = new FileResourceLoader(fileTemplatesPath);
beetlGroupUtilConfiguration.setResourceLoader(floader);
}
else{
log.info("使用类模版路径...........");
ClasspathResourceLoader cploder = new ClasspathResourceLoader(loader, templatesPath);
beetlGroupUtilConfiguration.setResourceLoader(cploder);
}
beetlGroupUtilConfiguration.init();
//如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoader
beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);
return beetlGroupUtilConfiguration;
}
@Bean(name = "beetlViewResolver")
public BeetlSpringViewResolver getBeetlSpringViewResolver(@Qualifier("beetlConfig") BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
beetlSpringViewResolver.setOrder(0);
beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration);
return beetlSpringViewResolver;
}
}
在官方示例的代码中,默认是建一个ClasspathResourceLoader,现在我们不使用ClasspathResourceLoader,改为使用FileResourceLoader。在上面的代码中,FileResourceLoader使用配置文件中的模板文件路径templatesPath,在application-dev.yml中设置本地主机中的路径:
beetl:
suffix: html
fileTemplatesPath: D:/tmp/beetl/templates
上面的fileTempaltesPath是自定义的变量。不是Beetl官方设置。
然后我们在上篇文章中的BeetlDemoController测试类中增加一个新的测试方法:
//http://localhost:8001/demo/beetl/demofile
@RequestMapping(value="/demofile")
public String demofile( Model model) {
CommUser user = new CommUser();
user.setRealName("张三");
user.setUserEmail("abc@163.com");
List<CommUser> list = new ArrayList<>();
list.add(user );
user = new CommUser();
user.setRealName("李四");
user.setUserEmail("lisi@163.com");
list.add(user );
model.addAttribute("users", list);
return "b2c/beetlDemo3.html";//返回页面名
}
在上面的代码中,指定的页面是b2c/beetlDemo3.html,在配置中因为我们指定了模板文件的根目录是d:\tmp\beetl,所以文件的实际位置是D:\tmp\beetl\templates\b2c,因为在实际项目开发中,我们需要按照不同子系统的页面存放在不同的目录,所以b2c是存放电商系统的页面,里面还可以根据需要再建更多的子目录,比如个人中心pcenter目录,登录login目录等。我们将上节介绍的beetlDemo3.html复制到D:\tmp\beetl\templates\b2c,然后修改下内容稍作区分,
启动springboot,访问http://localhost:8001/demo/beetl/demofile ,可以看到指定目录的页面可以正常访问,这时修改的beetlDemo3.html的内容可以看到实时修改的内容,不用重新打包SpringBoot。
注意,如果不需要指定单独的文件目录,可以不使用BeetlConf,将BeetlConf类注解的@Configuration注释掉即可。因为BeetlConf中根据fileTemplatesPath是否为空来判断是使用类路径加载还是文件路径加载,所以如果不使用文件路径加载,也可以注释掉application-dev.yml中的fileTemplatesPath。因为注解使用了${beetl.fileTemplatesPath:},注解末尾加冒号确保yml中如果没有配置此参数,启动时也不会报异常。
项目完整示例代码见github:
https://github.com/openjweb/cloud/tree/masterhttps://github.com/openjweb/cloud/tree/master