资讯专栏INFORMATION COLUMN

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

xumenger / 3396人阅读

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

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

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

本节要点

</>复制代码

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

什么是Freemarker

</>复制代码

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

Freemarker原理

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

</>复制代码

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

如何开始?
一点心得

</>复制代码

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

本节要点

</>复制代码

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

Maven构建Spring+Freemarker项目

</>复制代码

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

配置文件介绍

</>复制代码

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

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

项目POM文件

</>复制代码

  1. 4.0.0
  2. com.zccoder
  3. myfreemarker
  4. 0.0.1-SNAPSHOT
  5. org.springframework.boot
  6. spring-boot-starter-parent
  7. 1.5.1.RELEASE
  8. UTF-8
  9. UTF-8
  10. 1.8
  11. org.springframework.boot
  12. spring-boot-starter-web
  13. org.springframework.boot
  14. spring-boot-starter-test
  15. test
  16. org.springframework.boot
  17. spring-boot-starter-freemarker
  18. org.springframework.boot
  19. spring-boot-configuration-processor
  20. true
  21. com.alibaba
  22. fastjson
  23. 1.2.28
  24. org.springframework.boot
  25. spring-boot-maven-plugin

配置Freemarker

</>复制代码

  1. package com.myimooc.myfreemarker.config;
  2. import java.nio.charset.Charset;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Properties;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.ComponentScan;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.http.MediaType;
  12. import org.springframework.http.converter.HttpMessageConverter;
  13. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  14. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  15. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  16. import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
  17. import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
  18. import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
  19. import com.alibaba.fastjson.serializer.SerializerFeature;
  20. import com.alibaba.fastjson.support.config.FastJsonConfig;
  21. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  22. import com.myimooc.myfreemarker.web.controller.RoleDirectiveModel;
  23. /**
  24. * Web项目SpringMvc配置
  25. * @author ZhangCheng
  26. * @date 2017-03-19
  27. * @version V1.0
  28. */
  29. @Configuration
  30. @EnableWebMvc
  31. @ComponentScan("com.myimooc.myfreemarker")
  32. public class SpringMvcConfig extends WebMvcConfigurerAdapter{
  33. /**
  34. * 配置视图解析器
  35. * @return
  36. */
  37. @Bean
  38. public FreeMarkerViewResolver getFreeMarkerViewResolver(){
  39. FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
  40. freeMarkerViewResolver.setOrder(1);
  41. freeMarkerViewResolver.setSuffix(".html");
  42. freeMarkerViewResolver.setCache(false);
  43. freeMarkerViewResolver.setRequestContextAttribute("request");
  44. freeMarkerViewResolver.setContentType("text/html;charset=utf-8");
  45. freeMarkerViewResolver.setViewClass(FreeMarkerView.class);
  46. return freeMarkerViewResolver;
  47. }
  48. /**
  49. * 配置静态资源映射
  50. */
  51. @Override
  52. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  53. registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  54. }
  55. /**
  56. * 配置FASTJSON
  57. * @return
  58. */
  59. @Bean
  60. public FastJsonHttpMessageConverter fastJsonHttpMessageConverters() {
  61. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
  62. FastJsonConfig fastJsonConfig = new FastJsonConfig();
  63. fastJsonConfig.setSerializerFeatures(SerializerFeature.QuoteFieldNames);
  64. fastJsonConfig.setCharset(Charset.forName("UTF-8"));
  65. fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
  66. List supportedMediaTypes = new ArrayList();
  67. supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
  68. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
  69. fastConverter.setFastJsonConfig(fastJsonConfig);
  70. return fastConverter;
  71. }
  72. /**
  73. * 配置FreeMarker
  74. * @return
  75. */
  76. @Bean
  77. public FreeMarkerConfigurer getFreeMarkerConfigurer(){
  78. FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
  79. freeMarkerConfigurer.setDefaultEncoding("UTF-8");
  80. freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/");
  81. Properties settings = new Properties();
  82. settings.setProperty("template_update_delay", "5");
  83. settings.setProperty("url_escaping_charset", "UTF-8");
  84. settings.setProperty("defaultEncoding", "UTF-8");
  85. settings.setProperty("whitespace_stripping", "true");
  86. settings.setProperty("boolean_format", "true,false");
  87. settings.setProperty("number_format", "0.##########");
  88. settings.setProperty("locale", "zh_CN");
  89. settings.setProperty("datetime_format", "yyyy-MM-dd HH:mm:ss");
  90. settings.setProperty("date_format", "yyyy-MM-dd");
  91. settings.setProperty("time_format", "HH:mm:ss");
  92. settings.setProperty("tag_syntax", "square_bracket");
  93. settings.setProperty("classic_compatible", "true");
  94. settings.setProperty("template_exception_handler", "ignore");
  95. settings.setProperty("auto_import", "/spring.ftl as spring, /common/spring.ftl as spring");
  96. freeMarkerConfigurer.setFreemarkerSettings(settings);
  97. // 配置自定义指令
  98. Map variables = new HashMap();
  99. variables.put("role", new RoleDirectiveModel());
  100. freeMarkerConfigurer.setFreemarkerVariables(variables);
  101. return freeMarkerConfigurer;
  102. }
  103. /**
  104. * 配置JSON解析器
  105. */
  106. @Override
  107. public void configureMessageConverters(List> converters) {
  108. super.configureMessageConverters(converters);
  109. converters.add(this.fastJsonHttpMessageConverters());
  110. }
  111. }

配置Web,类似于web.xml

</>复制代码

  1. package com.myimooc.myfreemarker.config;
  2. import java.util.EnumSet;
  3. import javax.servlet.DispatcherType;
  4. import javax.servlet.FilterRegistration;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRegistration;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.WebApplicationInitializer;
  10. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  11. import org.springframework.web.filter.CharacterEncodingFilter;
  12. import org.springframework.web.servlet.DispatcherServlet;
  13. /**
  14. * Web项目启动类
  15. *
  16. * @author ZhangCheng
  17. * @date 2017-03-19
  18. * @version V1.0
  19. *
  20. */
  21. @Configuration
  22. public class WebConfig implements WebApplicationInitializer {
  23. @Override
  24. public void onStartup(ServletContext servletContext) throws ServletException {
  25. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
  26. context.register(SpringMvcConfig.class);
  27. // 新建WebApplication,注册配置类,并将其和当前servletContext关联。
  28. context.setServletContext(servletContext);
  29. // 注册SpringMVC的DispatcherServlet。
  30. ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
  31. servlet.addMapping("/");
  32. servlet.setLoadOnStartup(1);
  33. // 注册SpringMVC的字符过滤器
  34. FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding", new CharacterEncodingFilter());
  35. EnumSet dispatcherTypes = EnumSet.allOf(DispatcherType.class);
  36. dispatcherTypes.add(DispatcherType.REQUEST);
  37. dispatcherTypes.add(DispatcherType.FORWARD);
  38. encodingFilter.addMappingForUrlPatterns(dispatcherTypes, true, "*");
  39. encodingFilter.setInitParameter("encoding", "UTF-8");
  40. }
  41. }

新建模版页面

编写控制器

启动项目

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

编写控制器

编写Freemarker

</>复制代码

  1. Insert title here
  2. ${username}

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

效果如下:

1-5 补充:springboot集成freemarker

输入网址:start.spring.io

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

本节要点

</>复制代码

  1. Java中常用的数据模型
  2. 取值(插值)指令
  3. 逻辑指令:ifswitch
2-2 Java数据模型、freemarker取值

Java中常用的数据模型

</>复制代码

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

取值指令

</>复制代码

  1. 常用${var}语法进行取值
  2. null、不存在对象取值${var!}
  3. 取包装对象的值,通过“点”语法:${User.name}
  4. 取值的时候进行计算、赋值
  5. Date类型格式${date?string(‘yyyy-MM-dd’)}
  6. 如何转义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 变量的定义、赋值、运算

编写代码:

</>复制代码

  1. 2. 赋值运算

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

    • a+100=${a+100}

效果如下:

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

3-3 集合List的遍历

语法:

</>复制代码

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

语法:

</>复制代码

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

语法:

</>复制代码

  1. if else
  2. [#assign var = 100/]
  3. [#if var == 99]
  4. var = 99
  5. [#else]
  6. var != 99
  7. [/#if]

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

</>复制代码

  1. [#if myList?exists]
  2. [/#if]
  3. [#if myList??]
  4. [/#if]
3-6 switch语法

语法:

</>复制代码

  1. switch case break default
  2. [#assign var3 = 10 /]
  3. [#switch var3]
  4. [#case 10] 10
  5. [#break]
  6. [#case 100] 100
  7. [#break]
  8. [#default] other
  9. [/#switch]
第四章:高级技巧 4-1 自定义函数章节介绍

本节要点

</>复制代码

  1. 字符串、集合操作
  2. 自定义函数
  3. 自定义指令

补充表达式指令

</>复制代码

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

自定义函数

</>复制代码

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

自定义指令

</>复制代码

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

代码:

</>复制代码

  1. 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为下标,默认为升序

</>复制代码

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

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

</>复制代码

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

其它常用内建函数

</>复制代码

  1. List长度
  2. ${mylistinfo?size}
  3. List下标取值
  4. ${mylistinfo[3]}

效果图:

4-5 自定义指令

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

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

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

步骤四:验证输出

4-6 freemarker常用内建函数

本节要点

</>复制代码

  1. 处理字符串内建函数
  2. 处理数字的内建函数
  3. 处理list的内建函数
  4. 其他内建函数

处理字符串内建函数

</>复制代码

  1. substring、cap_first、ends_with、contains
  2. date、datetime、time
  3. starts_with、index_of、last_index_of、split、trim

处理数字的内建函数

</>复制代码

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

梳理List的内建函数

</>复制代码

  1. first、last、seq_contains、seq_index_of
  2. size、reversesort、sort_by
  3. chunk

其他内建函数

</>复制代码

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

代码示例

效果图如下:

4-8 macro、function指令

本节要点

</>复制代码

  1. 宏macro、nested、return指令
  2. 函数functionreturn指令
  3. 课程总结

macro、nested、return

</>复制代码

  1. macro语法
  2. [@macro_name param /] 调用macro
  3. nested语法

function、return

</>复制代码

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

macro、nested、return章节
macro语法:

</>复制代码

  1. [#macro macro_name param1 param2 param3 paramN]
  2. Trmplate_code ${param1}
  3. [#nested/]
  4. [/#macro]

调用

</>复制代码

  1. [@macro_name param1=”value1” param2=”value2”/]
  2. [@macro_name param1=”value1” param2=”value2”/]
  3. Nested_template
  4. [@macro_name/]

Function语法:

</>复制代码

  1. [#function function_name param1 param2]
  2. [#return param1 + param2]
  3. [/#function]

调用

</>复制代码

  1. ${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元查看
<