如何在Freemarker 中调用Java静态方法

文章目录

最近做了一个通用开发框架,SpringBoot、Freemarker、Mybatis。我希望后台页面是通用的模板。我只需要定义map和list就能自动为我创建动态的后台管理页面,而不需要我添加一个entity,然后还要为他创建list、edit、add等页面,我们以“分类”功能为主。

说明

前台管理的页面是基于bootstrap4设计的页面,想着自动生成table内容。前期做法是 通用变量名称传到页面使用freemarker的遍历标签遍历,但是这样的作法就有一个问题,就是我每次新建立一个entity,再根据entity的属性内容填写表格需要的名称和遍历的变量名。

前期表格:

<thead>
  <tr>
      <th>ID</th>
      <th>创建时间</th>
      <th>更新时间</th>
      <th>管理</th>
  </tr>
</thead>
<tbody>
  <#list list as list>
    <tr>
      <td>${list.id!}</td>
      <td>
        ${list.createAt!}
      </td>
      <td>
        ${list.modifyAt!}
      </td>
      <td>
        <a href="./edit/${list.id!}">
          编辑
        </a>
        <a href="javascript:del('${list.id}')">
          删除
        </a>
      </td>
    </tr>
  </#list>
</tbody>

思考的解决方法

此页面有两个地方需要动态填充数据,一个是表thead中的数据,一个是表tbody中list的部分。

Thead的解决初期是想使用自定义注解,给每个entity加上一个表格“@theadName”,通过反射赋值给Freemarker 页面中,但是此方法不适用与tbody list,因为list需要在页面中完成遍历,freemarker 中的list遍历不能像Java8那样赋值给一个变量,因此想到用java的一个静态方法将我们定义的list转成html输出。

最终的方案:freemarker中定义一个list渲染thead项数据。调用Java静态方法将theads list数据解析后赋值一个变量给前台。

Thead 数据渲染解决

<!-- thead项目 -->
<#assign theads=[ "分类名称" , "添加时间" , "更新时间" , "管理" ] />
<#list theads as list>
  <th>
    ${list!}
  </th>
</#list>

Tbody 数据渲染解决

使用@Configuration,在Springboot启动的时候调用freemarker.template.Configuration.setSharedVariable(“工具”,new 工具类()) 方法,将静态类放入到全局变量中。

#tbody 是 service.findList(XX) 返回的List<entity>数据
<#assign tbodys = "${KfUtils.parameterToString(tbody)}" />
<tbody>
   ${tbodys !}
</tbody>
#JavaUtils 工具类 中的方法
#此方法将entity对象转成table中tbodys数据。我框架里还没写,但是实验成功了,这里我就手写,请忽略我的语法错误吧。
public static final String parameterToString(List<entity> lists);
return lists.stream().map((key)-> {
  return "<td>" + lists.getId() + "</td><td>" + lists.getXXX() + "</td>";
}).collect(Collectors.joining(","+System.lineSeparator()));

遍历方法是List<entity> 为了方便理解,真正通用的时候要使用List<KfEntity<E>> 作为参数。KfEntity是我的一个基础类,entity都要继承他。然后通过反射方式获取变量的内容,这样才能真正的通用。

原文链接:如何在Freemarker 中调用Java静态方法