freemarker自定义方法(六)

如果还没有基础的可以去我的博客找之前的教程学习先,我这里的所有代码都是基于freemarker+springmvc开发的。

1.前言

由于freemarder是Java代码实现的,所有我们自定义方法的时候只需要实现freemarker.template.TemplateMethodModel接口即可。这个接口中使用有个exec(java.util.List arguemnts)方法,我们调用方法传入的参数会封装在List集合中。但是freemarker.template.TemplateMethodModel官方已经不推荐使用,而是推荐使用freemarker.template.TemplateMethodModelEx接口,这个接口继承了freemarker.template.TemplateMethodModel接口。

2.实现方法

由于freemarker提供的方法已经很全面,在介绍完自定义方法后我后面的文章会为大家展示所有freemarker提供的方法,所有请耐心点等待本人继续更新。

         我这里自定义一个将String转为全部大写的方法,这个方法freemarker已经公共了,但是我会再转为大写后再后面拼接"_Rabbit"。

         只要你学会了自定义方法,以后你就可以根据自己的需求去定义,这样你的技术一定会上升一个台阶。

package com.rabbit.freemarder.method;

import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;

import java.util.List;

/**
 * Created by vip on 2017/12/22.
 */
public class ToUpperCaseMethod implements TemplateMethodModelEx {

    public ToUpperCaseMethod() {
        System.out.println("ToUpperCaseMethod构造函数被调用啦");
    }

    @Override
    public Object exec(List args) throws TemplateModelException {
        System.out.println("------------------自定义方法-------------------");
        if (args.isEmpty()) {
            throw new NullPointerException("参数为空");
        }
        SimpleScalar str = (SimpleScalar)args.get(0);
        return str.getAsString().toUpperCase() + "_Rabbit";
    }
}

3.调用过程

         这里调用过程分为两个部分,第一个就是我们自定义的方法freemarker不知道,所有我们第一步就是需要让freemarder识别我们自定义的方法,第二步就是调用方法了。

      方式一(不推荐):

         方式一的保存方法就是使用跳转到页面的时候保存,使用ModelMap类保存,就和我们普通的参数保存一样。为什么不推荐这样做呢,因为你要调用的话哪个页面要用到,就要在哪里的方法中保存,这样代码太散乱了。难以维护。

         页面如何调用呢?我们保存的时候put方法的key就是调用的函数名称,我这里的名称是toupper调用时候就是用toupperstr这样写就可以了。如果你的是AAA,调用就用AAA(str).

 

下面是展示代码:

package com.rabbit;

import com.rabbit.freemarder.method.ToUpperCaseMethod;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by vip on 2017/12/18.
 */
@Controller
public class FreemarkerController {

    @RequestMapping(value = "/index.action")
    public String index(ModelMap modelMap) {
        System.out.print("-----------------------------");
        List<Map<String, Object>> users = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Map<String, Object> user= new HashMap<>();
            user.put("firstname", "firstname" + i);
            user.put("lastname", "lastname" + i);
            users.add(user);
        }
        modelMap.put("users",  users);
        //将自定义的方法保存在页面则可以使用,这里是方法一,不推荐使用
        //使用的时候通过toupper调用方法,传入参数
        modelMap.put("toupper", new ToUpperCaseMethod());
        return "index";
    }

    public FreemarkerController() {
        System.out.println("FreemarkerController构造函数被调用");
    }

}

页面调用代码:

<html>
<head>
    <title>FreeMarker Hello World</title>
</head>
<body>
<table class="datatable">
    <#if users??>
        <#list users as user>
            <tr>
                <td>${toupper(user.firstname)}</td> <td>${toupper(user.lastname)}</td>
            </tr>
        </#list>
    </#if>
</table>
</body>
</html>

      方式二:(推荐)

         方法二的做法是在页面中保存自己定义的方法,这些工作交给freemarker来做就比在后台页面做好,工作量就给了freemarder了,那么我们自定义了很多方法的时候,可以统一把这些方法都保存在一个.ftl文件中,哪里需要用就使用freemarker的include指令包含这个.ftl文件就可以了。

 

下面展示代码:

 

注意这里面的保存到ModelMap的代码已经被注释了。

package com.rabbit;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by vip on 2017/12/18.
 */
@Controller
public class FreemarkerController {

    @RequestMapping(value = "/index.action")
    public String index(ModelMap modelMap) {
        System.out.println("-----------------------------");
        List<Map<String, Object>> users = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Map<String, Object> user= new HashMap<>();
            user.put("firstname", "firstname" + i);
            user.put("lastname", "lastname" + i);
            users.add(user);
        }
        modelMap.put("users",  users);
        //将自定义的方法保存在页面则可以使用,这里是方法一,不推荐使用
        //使用的时候通过toupper调用方法,传入参数
//        modelMap.put("toupper", new ToUpperCaseMethod());
        return "index";
    }

    public FreemarkerController() {
        System.out.println("FreemarkerController构造函数被调用");
    }

}


页面代码:

 

注意这里的页面我使用assign指令创建了ToUpperCaseMethod对象并赋值给toupper,调用的时候使用toupper就可以了。

<html>
<head>
    <title>FreeMarker Hello World</title>
</head>
<body>
<!--创建这个对象保存好-->
<#assign toupper = "com.rabbit.freemarder.method.ToUpperCaseMethod"?new() />
<table class="datatable">
    <#if users??>
        <#list users as user>
            <tr>
                <td>${toupper(user.firstname)}</td> <td>${toupper(user.lastname)}</td>
            </tr>
        </#list>
    </#if>
</table>
</body>
</html>

后面我将继续讲解freemarker的其他知识,期望可以帮助大家提升技术,因为只会用技术是远远不够的,必须还需要学会别人是如何实现的,这样才可以往高出走去。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie
应支付0元
点击重新获取
扫码支付

支付成功即可阅读