资讯专栏INFORMATION COLUMN

慕课网_《Java模板引擎之Freemarker》学习总结

xumenger / 2965人阅读

摘要:时间年月日星期日说明本文部分内容均来自慕课网。整体目录结构如下项目文件用于数据持久化配置项目配置配置视图解析器配置静态资源映射配置配置配置自定义指令配置解析器配置,类似于项目启动类新建,注册配置类,并将其和当前关联。

时间:2017年3月19日星期日
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...

第一章:快速入门 1-1 Java模版引擎freemarker简介

本节要点

什么是Freemarker
数据模型+模版=输出(HTML)
前端设计师和程序员的学习侧重点

什么是Freemarker

Freemarker是一款模版引擎
Freemarker不是web框架
官网:http:// freemarker.org

Freemarker原理

前端设计师和程序员的学习侧重点

MVC设计(Model、View、Controller)
前端设计师侧重于View(模版设计)
程序员全面掌握MVC

如何开始?
一点心得

先划一个范围
再定一个目标
创建可行计划
边玩边学
1-2 maven构建freemarker项目

本节要点

Maven构建Spring+Freemarker项目
配置文件介绍
运行小例:列表展示

Maven构建Spring+Freemarker项目

Eclipse+Maven使用简介
Maven依赖Spring和Freemarker的jar包
Spring配置文件和Freemarker Servlet配置文件

配置文件介绍

Spring配置文件applicationContext.xml
Spring Freemarker Servlet配置文件spring-servlet.xml
1-3 maven构建freemarker项目代码实战

我学习时,使用springboot来进行项目搭建,同时,项目基于javaconfig进行配置。
整体目录结构如下:

项目POM文件


  4.0.0
  com.zccoder
  myfreemarker
  0.0.1-SNAPSHOT
  
  
        org.springframework.boot
        spring-boot-starter-parent
        1.5.1.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-freemarker
        
        
        
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        
        
    com.alibaba
    fastjson
    1.2.28

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
  
  

配置Freemarker

package com.myimooc.myfreemarker.config;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.myimooc.myfreemarker.web.controller.RoleDirectiveModel;

/**
 * Web项目SpringMvc配置
 * @author ZhangCheng
 * @date 2017-03-19
 * @version V1.0
 */
@Configuration
@EnableWebMvc
@ComponentScan("com.myimooc.myfreemarker")
public class SpringMvcConfig extends WebMvcConfigurerAdapter{
    
    /**
     * 配置视图解析器
     * @return
     */
    @Bean
    public FreeMarkerViewResolver getFreeMarkerViewResolver(){
        FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
        
        freeMarkerViewResolver.setOrder(1);
        freeMarkerViewResolver.setSuffix(".html");
        freeMarkerViewResolver.setCache(false);
        freeMarkerViewResolver.setRequestContextAttribute("request");
        freeMarkerViewResolver.setContentType("text/html;charset=utf-8");
        freeMarkerViewResolver.setViewClass(FreeMarkerView.class);
        
        return freeMarkerViewResolver;
    }
    
    /**
     * 配置静态资源映射
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
    /**
     * 配置FASTJSON
     * @return
     */
    @Bean
    public FastJsonHttpMessageConverter  fastJsonHttpMessageConverters() {
       FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        
       FastJsonConfig fastJsonConfig = new FastJsonConfig();
       fastJsonConfig.setSerializerFeatures(SerializerFeature.QuoteFieldNames);
       fastJsonConfig.setCharset(Charset.forName("UTF-8"));
       fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
       
       List supportedMediaTypes = new ArrayList();
       supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
       
       fastConverter.setSupportedMediaTypes(supportedMediaTypes);
       fastConverter.setFastJsonConfig(fastJsonConfig);
       return fastConverter;
    }
    
    /**
     * 配置FreeMarker
     * @return
     */
    @Bean
    public FreeMarkerConfigurer getFreeMarkerConfigurer(){
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setDefaultEncoding("UTF-8");
        freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/");
        
        Properties settings = new Properties();
        settings.setProperty("template_update_delay", "5");
        settings.setProperty("url_escaping_charset", "UTF-8");
        settings.setProperty("defaultEncoding", "UTF-8");
        settings.setProperty("whitespace_stripping", "true");
        settings.setProperty("boolean_format", "true,false");
        settings.setProperty("number_format", "0.##########");
        settings.setProperty("locale", "zh_CN");
        settings.setProperty("datetime_format", "yyyy-MM-dd HH:mm:ss");
        settings.setProperty("date_format", "yyyy-MM-dd");
        settings.setProperty("time_format", "HH:mm:ss");
        settings.setProperty("tag_syntax", "square_bracket");
        settings.setProperty("classic_compatible", "true");
        settings.setProperty("template_exception_handler", "ignore");
        settings.setProperty("auto_import", "/spring.ftl as spring, /common/spring.ftl as spring");
        freeMarkerConfigurer.setFreemarkerSettings(settings);
        
        // 配置自定义指令
        Map variables = new HashMap();
        variables.put("role", new RoleDirectiveModel());
        freeMarkerConfigurer.setFreemarkerVariables(variables);
        
        return freeMarkerConfigurer;
    }
    
    /**
     * 配置JSON解析器
     */
    @Override
    public void configureMessageConverters(List> converters) {
        super.configureMessageConverters(converters);
        converters.add(this.fastJsonHttpMessageConverters());
    }
}

配置Web,类似于web.xml

package com.myimooc.myfreemarker.config;

import java.util.EnumSet;

import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;

/**
 * Web项目启动类
 * 
 * @author ZhangCheng
 * @date 2017-03-19
 * @version V1.0
 *
 */
@Configuration
public class WebConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

        context.register(SpringMvcConfig.class);

        // 新建WebApplication,注册配置类,并将其和当前servletContext关联。
        context.setServletContext(servletContext);

        // 注册SpringMVC的DispatcherServlet。
        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);

        // 注册SpringMVC的字符过滤器
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding", new CharacterEncodingFilter());
        EnumSet dispatcherTypes = EnumSet.allOf(DispatcherType.class);
        dispatcherTypes.add(DispatcherType.REQUEST);
        dispatcherTypes.add(DispatcherType.FORWARD);
        encodingFilter.addMappingForUrlPatterns(dispatcherTypes, true, "*");
        encodingFilter.setInitParameter("encoding", "UTF-8");

    }

}

新建模版页面

编写控制器

启动项目

1-4 小例子:列表demo展示

编写控制器

编写Freemarker





Insert title here


${username}

    [#list userList as item]
  • ${item.name}的生日是:${item.birthday?string("yyyy-MM-dd")}
  • [/#list]

效果如下:

1-5 补充:springboot集成freemarker

输入网址:start.spring.io

第二章:基础技能 2-1 freemarker取值章节简介

本节要点

Java中常用的数据模型
取值(插值)指令
逻辑指令:if、switch
2-2 Java数据模型、freemarker取值

Java中常用的数据模型

基本类型数据(比如Integer)
封装的对象类型(比如User对象)
集合类型:List、Map

取值指令

常用${var}语法进行取值
对null、不存在对象取值${var!}
取包装对象的值,通过“点”语法:${User.name}
取值的时候进行计算、赋值
Date类型格式${date?string(‘yyyy-MM-dd’)}
如何转义HTML内容:${var?html}
2-3 freemarker取java基本数据模型的值

控制器

页面层

效果图

2-4 boolean类型值的format

布尔值:${booleanVar?string("yes","no")}

2-5 date类型值的format

日期:${dateVar?string("yyyy-MM-dd")}

2-6 null或者不存在的变量取值

null:${nullVar!"我是默认值"}
missing:${ssssVar!"我是默认值"}

第三章:技能进阶 3-1 变量的定义、赋值、运算

编写代码:

2. 赋值运算

  • 赋值&运算
  • [#assign a = 100 /] a = ${a}
    a+100=${a+100}

效果如下:

3-2 自定义对象User变量的取值

3-3 集合List的遍历

语法:

[#list listName as item]
    ${item!}
[/#list]
3-4 集合Map的遍历

语法:

[#list map?keys as key]
    ${key}:${map[key]!}
[/#list]
3-5 if语法

语法:

    
  • if else
  • [#assign var = 100/] [#if var == 99] var = 99
    [#else] var != 99
    [/#if]

    判断某个对象或值是否存在

    [#if myList?exists]
    [/#if]
    或
    [#if myList??]
    [/#if]
    
    3-6 switch语法

    语法:

        
  • switch case break default
  • [#assign var3 = 10 /] [#switch var3] [#case 10] 10
    [#break] [#case 100] 100
    [#break] [#default] other [/#switch]
    第四章:高级技巧 4-1 自定义函数章节介绍

    本节要点

    字符串、集合操作
    自定义函数
    自定义指令
    

    补充表达式指令

    + :字符串连接,集合连接
    [index]:下标取值
    

    自定义函数

    自定义排序函数
    实现TemplateMethodModelEx接口
    

    自定义指令

    实现TemplateDirectiveModel接口
    
    4-2 string基本操作指令

    代码:

    6. 字符操作

    • 字符串常用内建函数-连接
    • [#assign stra = "hello" /] [#assign strb = "world" /] ${stra + strb}
    • 字符串常用内建函数-截取
    • ${(stra + strb)?substring(5,8)}
    • 字符串常用内建函数-长度
    • ${(stra + strb)?length}
    • 字符串常用内建函数-大写
    • ${(stra + strb)?upper_case}
    • 字符串常用内建函数-小写
    • ${(stra + strb)?lower_case}
    • 字符串常用内建函数-index_of
    • ${(stra + strb)?index_of("w")}
    • 字符串常用内建函数-last_index_of
    • ${(stra + strb)?last_index_of("o")}
    • 字符串常用内建函数-replace
    • ${(stra + strb)?replace("o","xx")}

    效果图:

    4-3 自定义函数

    步骤一:编写自定义函数类

    步骤二:再返回的控制器里面,添加自定义函数类,并指定方法名

    步骤三:在页面使用排序方法

    步骤四:验证输出

    4-4 list排序内建函数、常用指令

    使用内建函数进行排序,item_index为下标,默认为升序

        [#list mylistinfo?sort as item]
                ${item_index}:${item},
        [/#list]
    

    使用内建函数进行排序,降序

        [#list mylistinfo?sort?reverse as item]
            ${item_index}:${item},
        [/#list]
    

    其它常用内建函数

        
  • List长度
  • ${mylistinfo?size}
  • List下标取值
  • ${mylistinfo[3]}

    效果图:

    4-5 自定义指令

    步骤一:编写自定义指令类

    步骤二:注册自定义指令类

    步骤三:页面使用自定义指令

    步骤四:验证输出

    4-6 freemarker常用内建函数

    本节要点

    处理字符串内建函数
    处理数字的内建函数
    处理list的内建函数
    其他内建函数
    

    处理字符串内建函数

    substring、cap_first、ends_with、contains
    date、datetime、time
    starts_with、index_of、last_index_of、split、trim
    

    处理数字的内建函数

    string、x?string(“0.##”)
    round、floor、ceiling
    

    梳理List的内建函数

    first、last、seq_contains、seq_index_of
    size、reverse、sort、sort_by
    chunk
    

    其他内建函数

    is函数:is_string、is_number、is_method
    ()、has_content函数
    eval求值
    
    4-7 freemarker内建函数代码讲解

    代码示例

    效果图如下:

    4-8 macro、function指令

    本节要点

    宏macro、nested、return指令
    函数function、return指令
    课程总结
    

    macro、nested、return

    macro语法
    [@macro_name param /] 调用macro
    nested语法
    

    function、return

    function语法
    ${function_name(param)}调用
    

    macro、nested、return章节
    macro语法:

    [#macro macro_name param1 param2 param3 paramN]
    Trmplate_code ${param1}
        [#nested/]
    [/#macro]
    

    调用

    [@macro_name param1=”value1” param2=”value2”/]
    
    [@macro_name param1=”value1” param2=”value2”/]
        Nested_template
    [@macro_name/]
    

    Function语法:

    [#function function_name param1 param2]
        [#return param1 + param2]
    [/#function]
    

    调用

    ${doAdd(100,100)}
    

    代码示例


    效果如下

    第五章:课程总结 5-1 课程总结

    文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

    转载请注明本文地址:https://www.ucloud.cn/yun/66856.html

    相关文章

    • 课网_《SpringBoot开发常用技术整合》学习总结

      摘要:时间年月日星期四说明本文部分内容均来自慕课网。哈希表实现命令,将哈希表中的域的值设为实现命令,返回哈希表中给定域的值实现命令,删除哈希表中的一个或多个指定域,不存在的域将被忽略。实现命令,返回哈希表中,所有的域和值。 时间:2018年04月19日星期四说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com教学源码:https://github.com/zc...

      chengtao1633 评论0 收藏0
    • 课网_Java图片验证码》学习总结

      时间:2017年07月09日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 课程概述 主要内容 验证码历史 课程内容 不同方案对比 设计与实现 总结 1-2 验证码历史 验证码历史 无验证码:垃圾骚扰 Luis von Ahn:Captcha 不断...

      haitiancoder 评论0 收藏0
    • 课网_Java实现图片等比例缩略图》学习总结

      摘要:时间年月日星期六说明本文部分内容均来自慕课网。可以更加专注于业务逻辑开发,缩短项目开发周期,提高项目开发速度。 时间:2017年07月15日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程介绍 在用户进行信息概略浏览的时候,提供缩...

      raledong 评论0 收藏0
    • 课网_Java实现图片水印》学习总结

      摘要:时间年月日星期五说明本文部分内容均来自慕课网。慕课网教学源码无学习源码第一章课程简介引言通过一个项目案例的讲解,如何在应用中实现图片水印的添加。 时间:2017年07月21日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程简介 1-1 引言 通过一...

      levius 评论0 收藏0
    • 工具集核心教程 | 第六篇: Freemarker模板引擎入门到进阶

      摘要:到目前为止,使用越来越广泛,不光光只是它强大的生成技术,而且它能够与进行很好的集成。注意使用数字范围来定义集合时无需使用方括号数字范围也支持反递增的数字范围如对象对象使用花括号包括中的对之间以英文冒号分隔,多组对之间以英文逗号分隔。 Freemarker的介绍   Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为程序员提供的一个开发包,或者说是一个类...

      赵连江 评论0 收藏0

    发表评论

    0条评论

    最新活动
    阅读需要支付1元查看
    <