小言_互联网的博客

Java后端模板引擎对比

514人阅读  评论(0)

一、什么是模板引擎

模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:

二、java常用的模板引擎有哪些

jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。

Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。

Velocity:不仅可以用于界面展示(HTML.xml等)还可以生成输入java代码,SQL语句等文本格式。

FreeMarker:功能与Velocity差不多,但是语法更加强大,使用方便。

三、常用模板引擎对比

由于jsp与thymeleaf主要偏向于网页展示,而我们的需求是生成java代码与mybatis配置文件xml。顾这里只对Velocity与FreeMarker进行对比。

示例:1万次调用动态生成大小为25kb左右的mybatisxml文件

1、Velocity 模板文件


    
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace= "${mapperName}">
  4. #foreach($ map in $methodList)
  5. # if(${ map.sqlType} == "select")
  6. < select id= "${map.methodName}" resultType= "${map.type}">
  7. ${ map.desc}
  8. </ select>
  9. #elseif(${ map.sqlType} == "insert")
  10. <insert id= "${map.methodName}" resultType= "${map.type}">
  11. ${ map.desc}
  12. </insert>
  13. # else
  14. #end
  15. #end
  16. </mapper>

2、Velocity java执行代码


    
  1. public class VelocityTest {
  2. public static void main(String[] args) {
  3. //得到VelocityEngine
  4. VelocityEngine ve = new VelocityEngine();
  5. //得到模板文件
  6. ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources");
  7. ve.init();
  8. Template template = ve.getTemplate( "velocity.vm", "UTF-8");
  9. VelocityContext data = new VelocityContext();
  10. // Map<String,Object> data = new HashMap<>();
  11. data.put( "mapperName", "com.xxx.mapperName");
  12. List<Map> methodList = DataUtils.createData( 200);
  13. data.put( "methodList", methodList);
  14. //
  15. try {
  16. //生成xml
  17. //调用merge方法传入context
  18. int num = 1;
  19. int total= 10000;
  20. for ( int i= 0;i<num;i++){
  21. StringWriter stringWriter = new StringWriter();
  22. long curr = System.currentTimeMillis();
  23. template.merge(data, stringWriter);
  24. long end = System.currentTimeMillis();
  25. // stringWriter.flush();
  26. total+=(end-curr);
  27. }
  28. System.out. println( "total="+total+ ",vag="+(total* 1f/num));
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

3、FreeMarker 模板文件


    
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace= "${mapperName}">
  4. <#list methodList as method>
  5. <# if "${method.sqlType}" == "select">
  6. < select id= "${method.methodName}" resultType= "${method.type}">
  7. ${method.desc}
  8. </ select>
  9. <#elseif "${method.sqlType}" == "insert">
  10. <insert id= "${method.methodName}" resultType= "${method.type}">
  11. ${method.desc}
  12. </insert>
  13. </# if>
  14. </#list>
  15. </mapper>

4、FreeMarker 执行代码


    
  1. public class FreeMTest {
  2. public static Template getDefinedTemplate(String templateName) throws Exception{
  3. //配置类
  4. Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
  5. cfg.setDirectoryForTemplateLoading( new File( "/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources/"));
  6. cfg.setDefaultEncoding( "UTF-8");
  7. cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
  8. return cfg.getTemplate(templateName);
  9. }
  10. public static void main(String[] args){
  11. Map<String,Object> data = new HashMap<>();
  12. data.put( "mapperName", "com.xxx.mapperName");
  13. List<Map> methodList =DataUtils.createData( 200);
  14. data.put( "methodList", methodList);
  15. try {
  16. Template template = getDefinedTemplate( "freemarker.ftl");
  17. long total = 0;
  18. int num = 10000;
  19. for ( int i= 0;i<num;i++){
  20. StringWriter stringWriter = new StringWriter();
  21. long curr = System.currentTimeMillis();
  22. template.process(data,stringWriter);
  23. long end = System.currentTimeMillis();
  24. total+=(end-curr);
  25. // stringWriter.flush();
  26. // System.out.println(stringWriter.toString());
  27. }
  28. System.out. println( "total="+total+ ",vag="+(total/num));
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

四、特性对比

项目名称版本10000次执行耗时社区支持文件语法功能Velocity2.112833ms较差较少简单,接近java一般FreeMarker2.3.284599ms较好较多简单强大,在日期、数字,国际化方面有健全的处理机制。

结果:虽然网上对比结果一致为Velocity的性能高于FreeMarker,但是我的测试结果却完全相反,可能跟版本有关。语法方面,Velocity更接近java语法,学习成本低,FreeMarker本身提供的语法也相对简单。FreeMarker在社区支持,功能方面要比Velocity强大的多。

热门阅读

美团 GIT Commit Log规范

突发!阿里巴巴大调整

后端,你再不懂vue就out了

一个CEO的忠告:你那么牛逼,怎么还是打工人

关于年薪百万,聊聊年薪380万的研发人是什么样子的

超详细280页Docker实战文档!开放下载

程序员,为什么不建议你写框架


转载:https://blog.csdn.net/weixin_45727359/article/details/111306467
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场