公司项目由于之前编写方法的代码复用性低,可维护性不高,需要重构。项目的主要功能包装、传输xml,主要是采用SringBuilder拼接xml。
目前流行的表现层技术主要有:
然后在thymeleaf和freemarker中选择。
thymeleaf介绍:
Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎。
Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,JavaScript,CSS甚至纯文本。
Thymeleaf使用Spring框架的模块,与许多常见的工具集成在一起,并且可以插入自己的功能,是现代HTML5 JVM Web开发的理想选择,尽管Thymeleaf还有更多其它的功能。
Thymeleaf建立在自然模板的概念之上,以不影响模板作为设计原型的方式将其逻辑注入到模板文件中。 这改善了设计沟通,弥合了前端设计和开发人员之间的理解偏差。
freemarker介绍:
FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写,FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序,虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由FreeMarker 生成页面,通过模板显示准备的数据。符合MVC模式,采用哈希表存储,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
freemarker
freeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
目前企业中:主要用Freemarker做静态页面或是页面展示
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多
选择freemarker的原因:
1、宏定义比jsp tag方便
2、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
3、支持jsp标签
4、可以实现严格的mvc分离
thymeleaf
Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用。
Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。Thymeleaf的可扩展性也非常棒。你可以使用它定义自己的模板属性集合,这样就可以计算自定义表达式并使用自定义逻辑。这意味着Thymeleaf还可以作为模板引擎框架。
thymeleaf优点:静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调。springboot官方推荐方案。
thymeleaf缺点:模板必须符合xml规范,就这一点就可以判死刑!太不方便了!js脚本必须加入/
public final class Translation implements TemplateMethodModelEx {
private Translation() {
}
@Override
public Object exec(List list) throws TemplateModelException {
/*
*开始空值处理
*/
SimpleScalar codeType = (SimpleScalar) list.get(0);//获取第一个参数
Object o = list.get(1);//获取第二个参数
if (o == null) {
return null;
}
/*
*业务逻辑处理
*/
return result;//返回处理结果
}
}
继承TemplateMethodModelEx,并重写其exec方法,然后添加到需要渲染的数据中
dataMap.put("translation ", new Translation ());
模板的编写(demo.ftl)
<data>
<!--定义变量-->
<#assign myList=[2,5,56,78,1,2,5,6,3]/>
未转化:
<#list myList as item>
${item}
</#list></br>
已转化:
<!--调用方法-->
<#list translation(myList,2) as item>
${item}
</#list>
</data>
渲染数据
public String render(Map<String, Object> dataMap)
throws IOException, TemplateException {
StringWriter writer = new StringWriter();
configuration.getTemplate("demo.ftl").process(dataMap, writer);
return writer.toString();//返回渲染结果数据
}
这次选择了freemarker,看重了其宏的强大和自定义节点转换方法函数。