thymeleaf模板引擎的优势何在?

        如今spring boot 的火爆程度到了想避开,想不闻都不容易。几大主流IT资讯网,随便浏览下都能看到相关的资讯。还有一个特点就是某一技术、应用火爆了就铺天盖地的报道来了,各种花式赞誉。好像你不学,你不用,你就low爆了,错过了风口,错过了1个亿似的。spring  boot 这么火,那就学学,练练手,做个快速开发平台(也就是个可以在线设计数据库,再通过模板生成controller,service,dao 等各层的代码)。

        spring  boot 推荐使用thymeleaf,支持最好。jsp配置麻烦,现在不流行用jsp做视图层了。那好我也学学thymeleaf,跟一跟时代的脚步。各种不适应、采坑也就随之而来。当然有部分原因是初次使用,了解不深。

       网上对thymeleaf的优点,主要集中在:模板即原型,前后端分离。缺点:效率不是最好的,甚至算差的。采用标签属性来进行模板的定义,没有破坏基本的html文档结构,这样就可以直接在浏览器中打开查看布局效果。也为前后端的分离开发奠定基础。前端只需要掌握thymeleaf,就可以单独开发,测试。

       这样的优势对我们来说没有意义,我们是前后端个人负责。都是信息化管理系统,大部分页面布局,操作相似,也不会有太复杂的需要自造轮子的页面,后端人员熟悉后,可以前后端贯通开发。

      1.方面现在的页面很多是组件构成,异步从后台获取数据。在没有数据填充的情况下,就只是一个基本的框架结构,一个容器元素如:div。这样的页面即使能直接打开观看,又能看到什么效果。和实际运行的效果还是有很多差别,特别是有数据无数据情况下的交互、反馈并不能完整的体现出来。最后还是要前后端联调测试。

      2.还有些是运行时的上下文数据需要用到,包括相对路径等等。直接当静态文件打开和以web服务器运行效果也不一样。这些细小的差别出现问题,很难进行排查。因为习以为常,理所当然的惯性思维,很难让我们注意到是这些细节造成的问题。

      3.实际的开发体验也并不好,标签里的属性如 src,href可能要写两边,一种是普通的静态文件路径写法,一种是thymeleaf的语法。说是既可以直接打开保证了能引用到外部文件,服务器运行时会使用thymeleaf的语发写的路径,保证实际运行时也能准确引用文件。对我们意义不大,都是看实际运行结果,调整程序。不会静态的看一次,运行看一次,没必要。

     4.编写模板时,要引用静态资源时,涉及到路径,一般是相对web服务器的相对路径写法:/projectName/js/xxx  等。在jsp中会在头部或者一个被包含的文件中写:

      String contextPath=request.getContextPath();

在需要的地方使用el表达式输出即可。thymeleaf中如果是标签属性要引用资源,就用 th:src  ,th:href等语法。问题是js中要使用后台传过来的变量,写法又不一样。包含获取contextPath还有特定的语法。开始使用时就是懵的,要一点点找语法。不适应。2.0版本,所有的html标签还必须有关闭标签,否则解析出错。3.0到是解决了这个问题,不再强制要求。

     5. 还有问题就是如果js脚本里使用了<,>,& [[ ]] 等符号麻烦又来了,解析出错。把脚本里的一些符号都当成thymeleaf里的符号进行解析。这肯定出问题啊。光加上<![CDATA[   ]]>还不行,还得加注释/*<![CDATA[*/      /*]]>*/ 结果还不行 还得改

<script th:inline="none">  总算出来了。一路采坑而来,还能对这东西有好感?有人说那是你语法不熟,官方文档没研究明白。也许是,反正我对这东西的好感还没建立起来,甚至有点硬着头皮,想着这是学习。真要到了生产环境,早弃之不用了。

      6.由于是和spring boot结合的,thymeleaf的模板定义文件是要放到指定目录的,当然可以改配置进行更换。一旦改了,模板中引用的静态资源可能因为路径出问题。

      7.在jsp页面间传参,一般是在请求url中带参数,另一个页面${param.name}就可以使用,简单直接。到了thymeleaf,只看见一种方式,请求后台,参数放入MODEL中,返回视图名称。页面用 th:text="${name}"获取,js获取方式还不一样。现在基本都采用json输出格式。不会请求个页面就得在后台写个方法,只为传参跳转下页面。jsp是直接传直接用,不用后台单独写方法(当然实际原理还是走后台解析jsp的)。这也不是什么很大的问题,写个controller,专门做页面间传参跳转的。

   @RequestMapping("/th/**")
    public String forwardPage(HttpServletRequest request,Model model){
        String path=request.getServletPath();
       Enumeration<?> enum_term = request.getParameterNames();
         String paramName=null;
         while (enum_term.hasMoreElements()) {
           paramName = (String) enum_term.nextElement();
           model.addAttribute(paramName, request.getParameter(paramName));
         }
        return path.substring(3, path.length()-5);
    }

   总体感受就是:优势没用上,胖脚的不少。会时不时和路径问题纠缠上。语法和原始的html语法隔离的不好,需要各种特殊符号来隔离,本来是两个不同的运行时解析,隔离没做好,写起来麻烦,容易出错。当然这是个人看法,先用用看。

猜你喜欢

转载自blog.csdn.net/lanfeng330/article/details/85001562