freemarker是一套前端模板引擎,在使用时,要先在web项目中添加freemarker.jar的依赖。

  我在这里主要演示spring-mvc整合freemarker模板引擎。项目案例的文件包结构示意图如下:

  首先,在工程的web.xml文件中进行配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置前端控制器-->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!--配置编码格式为utf-8-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

  然后配置springmvc-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.itszt.controller"></context:component-scan> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="templateLoaderPath" value="/WEB-INF/templates/"></property>
</bean>
<!--spring-mvc整合freemarker-->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="suffix" value=".ftl"></property>
</bean>
</beans>

  网站首页如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="/testController/test1.html">test1</a>
<hr>
<a href="/testController/test2.html">test2</a>
<hr>
<a href="/testController/test3.html">test3</a>
<hr>
<a href="/testController/test4.html">test4</a>
<hr>
<a href="/testController/test5.html">test5</a>
<hr>
<a href="/testController/test6.html">test6</a>
<hr>
<a href="/testController/test7.html">test7</a>
<hr>
<a href="/testController/test8.html">test8</a>
<hr>
<a href="/testController/test9.html">test9</a>
</body>
</html>

  后台Java代码如下:

package com.itszt.domain;

import java.util.List;

/**
* 实体类
*/
public class User {
private String username,usersex;
private int userage;
private String nation,hometown;
private List<String> userhbs; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getUsersex() {
return usersex;
} public void setUsersex(String usersex) {
this.usersex = usersex;
} public int getUserage() {
return userage;
} public void setUserage(int userage) {
this.userage = userage;
} public String getNation() {
return nation;
} public void setNation(String nation) {
this.nation = nation;
} public String getHometown() {
return hometown;
} public void setHometown(String hometown) {
this.hometown = hometown;
} public List<String> getUserhbs() {
return userhbs;
} public void setUserhbs(List<String> userhbs) {
this.userhbs = userhbs;
}
}
-----------------------------------------------
package com.itszt.controller; import com.itszt.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*; /**
* 控制器
*/
@RequestMapping("testController")
@Controller
public class TestController {
@RequestMapping("test1")
public String test1(HttpServletRequest request, HttpSession session){
request.setAttribute("data1","dd");
request.setAttribute("data2","ff");
session.setAttribute("data3","vv");
return "hello";
} @RequestMapping("test2")
public String test2(Model model){
User user=new User();
user.setUsername("张三");
user.setUsersex("男");
user.setUserage(18);
user.setNation("汉族");
user.setHometown("中国北京市通州"); List<String> userhbs=new ArrayList<>();
userhbs.add("爬山");
userhbs.add("游泳");
userhbs.add("滑冰"); user.setUserhbs(userhbs); Date date=new Date(); model.addAttribute("data1",user);
model.addAttribute("data2",date); return "test2";
} @RequestMapping("test3")
public String test3(Model model){
List<String> list=new ArrayList<>();
list.add("爬山");
list.add("游泳");
list.add("打篮球");
model.addAttribute("data1",list); Map<String,String> map=new HashMap();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
model.addAttribute("data2",map); return "test3";
} @RequestMapping("test4")
public String test4(Model model){
User user1=new User();
user1.setUsername("Jim");
user1.setUsersex("male");
user1.setUserage(18); User user2=new User();
user2.setUsername("Tom");
user2.setUsersex("female");
user2.setUserage(19); User user3=new User();
user3.setUsername("Stone");
user3.setUsersex("male");
user3.setUserage(20); List<User> users=new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3); model.addAttribute("users",users); return "test4";
} @RequestMapping("test5")
public String test5(Model model){
model.addAttribute("str1","ABCD");
model.addAttribute("str2","abcd");
model.addAttribute("intData1",159);
model.addAttribute("intData2",753);
return "test5";
} @RequestMapping("test6")
public String test6(Model model){
model.addAttribute("scoreMath",65);
model.addAttribute("scoreJava",90);
return "test6";
} @RequestMapping("test7")
public String test7(Model model){
model.addAttribute("htmlData","<h3 stype='color:red;font-weight:bold;'>你好,霍金先生,请一路走好!</h3>");
model.addAttribute("lowerData","ABCD");
model.addAttribute("upperData","abcd");
model.addAttribute("cfData","abcd");
model.addAttribute("intData",123.456);
return "test7";
} @RequestMapping("test8")
public String test8(Model model){
return "test8_1";
} @RequestMapping("test9")
public String test9(Model model){
model.addAttribute("data1","我是后台返回的一个数据");
return "test9";
} }

  WEB-INF/templates下的模板文件如下:

hello.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我是第一个FreeMarker
<hr>
动态数据展示1:${data1}
<hr>
动态数据展示2:${data2}
<hr>
动态数据展示2:${data3}
</body>
</html>
-----------------------------------------
test2.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示javabean和日期
<hr>
动态数据展示1:${data1.username}--${data1.usersex}--${data1.userage}--${data1.nation}--${data1.hometown}
<hr>
动态数据展示2:${data2?string("yyyy-MM-dd HH:mm:ss")} </body>
</html>
----------------------------------------------
test3.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示javabean和日期
<hr>
动态数据展示1:
该集合中元素的个数:${data1?size} 个
<#list data1 as hb>
<h3>
${hb_index}.${hb}
</h3>
</#list>
<hr>
动态数据展示2:
该集合中元素的个数:${data2?size} 个
<#list data2?keys as mapKey>
<h3>
${mapKey}--${data2[mapKey]}
</h3>
</#list>
</body>
</html>
---------------------------------------------
test4.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
动态数据展示:
该集合中共有 : ${users?size} 个
<#list users as user >
<h4>${user_index+1}. ${user.username} ${user.usersex} ${user.userage}</h4>
</#list>
</body>
</html>
---------------------------------------------------
test5.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
<h3>演示字符串拼接</h3>
${"前面的东西${str1}"}
<br>
${"${str2}后面的东西"}
<br>
${intData1}
</body>
</html>
-------------------------------------------------
test6.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
<#if scoreMath gt 90>
数学优秀
<#elseif scoreMath gte 60>
数学一般
<#else>
数学不及格
</#if>
<hr>
<#if (scoreMath+scoreJava) gt 160>
优秀学生
<#elseif (scoreMath+scoreJava) gte 120>
一般学生
<#else >
不及格学生
</#if>
</body>
</html>
------------------------------------------------
test7.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
${htmlData}
<hr>
${htmlData?html}
<hr>
${upperData?upper_case}
<hr>
${lowerData?lower_case}
<hr>
${cfData?cap_first}
<hr>
${intData?int}
</body>
</html>
----------------------------------------
test8_1.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
<hr>
我是8-1的东西。。。。嘻嘻哈哈
<#include "test8_2.ftl">
</body>
</html>
---------------------------------------
test8_2.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
<hr>
我是8-2的东西。。。。
</body>
</html>
------------------------------------------
test9.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
<hr>
演示macro自定义标签:
<#import "test10.ftl" as xgk />
1
<#--<@xgk.tag1 data="${data1}">xxxxxxxxx</@xgk.tag1>--> <@xgk.tag1 data="${data1}">xxxxxxxxx</@xgk.tag1> <hr><hr>
</body>
</html>
-----------------------------------------
test10.ftl
<html>
<head>
<title>$Title$</title>
</head>
<body>
<hr>
<#--<#macro tag1 data>
<hr>
<hr>
<h3 style="color: red">我是一个自定义的标签的效果,展示后台传来的数据:</h3>
<h5>${data} <#nested /></h5>
<hr>
<hr>
</#macro>--> <#macro tag1 data>
<hr>
<hr>
<h3 style="color: red;">
我是test10.ftl
</h3>
<h5>
${data} <#nested />
</h5>
<hr>
<hr>
</#macro>
</body>
</html>

  总的来说,在在.ftl的页面里,可以这样操作传递过来的数据:

	直接显示数据或数据的hashcode	${dataName}
显示自定义类型对象的属性 ${dataName.username}
显示日期型数据 ${dateData?String("yyyy-MM-dd HH:mm:ss")}
显示List型数据 ${listData?size}
<#list listData? as hb>
${hb_index} ${hb}
</#list>
显示Map型数据 ${mapData?size}
<#list mapData?keys as mapKey>
${mapKey} ${mapData[mapKey]}
</#list>
显示自定义类型对象的list集合:
<#list users as user>
${user_index} ${user.username}
</#list>
字符串拼接 ${"前面的东西${strData}"}
if判断 <#if scoreMath gt 90>
数学优秀
<#elseif scoreMath gte 60>
数学一般
<#else>
数学不及格
</#if>
其他函数 ${htmlData?html}
${upperData?upper_case}
${lowerData?lower_case}
${cfData?cap_first}
${intData?int}
引入其他.ftl页面 在test1.ftl中写入
<#include "test2.ftl">
macro自定义标签 test2.ftl页面中写:
<#macro tag1 data>
${data} <#nested />
</#macro>
test1.ftl页面中写:
<#import "test2.ftl" as xgk />
<@xgk.tag1 data="${dataParam}">haha</xgk.tag1>

freemarker模板引擎的使用的更多相关文章

  1. FreeMarker模板引擎

    现在开发的项目,也是基于SOA架构,每个功能接口都是用WebService实现,Web服务的通信协议就是用XML来传输. 以前写WebService都是自动生成XML,没想到这项目竟然要自己定义XML ...

  2. Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎

    前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...

  3. Spring Boot 2.0 整合 FreeMarker 模板引擎

    本篇博文将和大家一起使用Spring Boot 2.0 和FreeMarker 模板引擎整合实战. 1. 创建新的项目 2. 填写项目配置信息 3. 勾选web 模块 4. 勾选freemarker模 ...

  4. Spring Boot 揭秘与实战(七) 实用技术篇 - FreeMarker 模板引擎

    文章目录 1. FreeMaker 代替 JSP 作为页面渲染 2. 生成静态文件 3. 扩展阅读 4. 源代码 Spring Boot 提供了很多模板引擎的支持,例如 FreeMarker.Thym ...

  5. Spring Boot☞ 使用freemarker模板引擎渲染web视图

    效果图 代码 package com.wls.integrateplugs.hello.controller; /** * Created by wls on 2017/8/24. */ import ...

  6. Java之利用Freemarker模板引擎实现代码生成器,提高效率

    https://blog.csdn.net/huangwenyi1010/article/details/71249258  java模板引擎freemarker代码生成器 更多 个人分类: 一步一步 ...

  7. SpringBoot获取Freemarker模板引擎,生成HTML代码

    今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> < ...

  8. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  9. SpringBoot系统列 5 - 接口版本控制、SpringBoot FreeMarker模板引擎

    接着上篇博客的代码继续写 1.接口版本控制 一个系统上线后会不断迭代更新,需求也会不断变化,有可能接口的参数也会发生变化,如果在原有的参数上直接修改,可能会影响线上系统的正常运行,这时我们就需要设置不 ...

随机推荐

  1. oracle 远程登录sqlplus TNS:无监听

    1.将localhost 改成 计算机名 best-PC,或者ip地址 .  我修改成计算机名,因为经常在无线网络和有限网络之间切换 SID_LIST_LISTENER =  (SID_LIST =  ...

  2. (转)iOS开发——来改掉那些被禁用的方法吧(持续更新中)

    iOS平台在快速的发展,各种接口正在不断的更新.随着iOS9的发布,又有一批老方法不推荐使用了,你若调用这些方法,运行的结果是没有问题的,但是会出现警告“***is deprecated :first ...

  3. springboot读取自己定义的配置文件的方式以及使用joda_time来处理时间日期

    总的来说呢,有两种方式,一种是原始的方式,即使用PropertiesUtils来读取配置文件. 第二种就是使用springboot的注解的方式来读取配置文件. 1.原始方式处理属性和时间日期: 工具类 ...

  4. python使用pwd和grp操作unix用户及用户组

    1.pwd模块 pwd模块提供了一个unix密码数据库即/etc/passwd的操作接口,这个数据库包含本地机器用户帐户信息 常用操作如下: pwd.getpwuid(uid):返回对应uid的示例信 ...

  5. TestNG指南

    转载自:http://blog.csdn.net/bigapplestar/article/details/7300137 今天突然收到通知,统一改用TestNG写测试用例,开始查这方面的资料,学习一 ...

  6. UndertowServer+SpringMVC+Thymeleaf模板引擎构建轻量级的web项目

    这两周需要写一个页面来请求另一个服务中的接口,服务器采用了超轻量级的undertow,模板引擎采用的是Thymeleaf,在寻找页面资源位置这个地方难住了我.下面分享一下,这方面的代码. Spring ...

  7. codevs 2796 最小完全图

    2796 最小完全图 http://codevs.cn/problem/2796/  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description 若一个图的每一对不 ...

  8. HDU 1573 CRT

    CRT模板题 /** @Date : 2017-09-15 13:52:21 * @FileName: HDU 1573 CRT EXGCD.cpp * @Platform: Windows * @A ...

  9. Shell编程——vim常用命令

    [vim]工作模式切换:    在普通模式下输入 i(插入).c(修改).o(另起一行) 命令时进入编辑模式:按 esc 键退回到普通模式.    在普通模式下输入冒号(:)可以进入命令模式.输入完命 ...

  10. [php]require&require_once&include&include_once的用法与区别

    1.require和include是php引入php文件的两种方式,使用格式如下: require(include) 文件名; require(include) 变量(此变量存储的是文件名); 2.区 ...