SpringMVC 整合 Freemarker 详解

文章目录

  • 1. 简介
  • 2. SpringMVC 整合 Freemarker
    • 2.1 配置pom.xml
    • 2.2 配置web.xml
    • 2.3 配置springmvc_freemarker.xml
    • 2.4 创建实体类User
    • 2.4 创建UserController
    • 2.4 创建userinfo.ftl模版文件
    • 2.6 运行web程序
    • 2.7 源码和文档
  • 3. Freemarker语法简介
    • 3.1 标签
    • 3.2 常用标签
      • 3.2.1 list遍历
      • 3.2.1 if else
      • 3.2.1 插入页面
    • 3.3 空值处理策略
    • 3.4 数据
    • 3.5 宏(自定义标签)
      • 3.5.1 定义宏 - 两个参数
      • 3.5.2 定义宏 - 带默认值的参数
      • 3.5.3 定义宏 - 嵌套结构

1. 简介

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1] 。

2. SpringMVC 整合 Freemarker

2.1 配置pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>com.springmvcgroupId>
    <artifactId>springmvc-freemarkerartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>warpackaging>

    <properties>
      <spring.version>4.3.17.RELEASEspring.version>
      <servlet.version>3.1.0servlet.version>
      <freemarker.version>2.3.23freemarker.version>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-context-supportartifactId>
          <version>${spring.version}version>
        dependency>
        

        
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>${servlet.version}version>
        dependency>
        

        
        <dependency>
            <groupId>org.freemarkergroupId>
            <artifactId>freemarkerartifactId>
            <version>${freemarker.version}version>
        dependency>
        
    dependencies>
project>

2.2 配置web.xml

这里主要是springmvc的配置,不清楚的可以去看我的另两篇文章
《走向单体地狱(八):Spring MVC》
《Spring MVC 的 xml 配置详解》


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <servlet>
        <servlet-name>springDispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc_freemarker.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>

    <servlet-mapping>
        <servlet-name>springDispatcherServletservlet-name>
        <url-pattern>/*url-pattern>
    servlet-mapping>
web-app>

2.3 配置springmvc_freemarker.xml

SpringMVC中整合Freemarker的具体配置


<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"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
	
	<context:component-scan base-package="com.springmvc.freemarker"/>
	
	<mvc:annotation-driven/>

	
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="1" />
	bean>
	
	<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		
		<property name="templateLoaderPath" value="/WEB-INF/view/">property>
		
		<property name="defaultEncoding" value="utf-8" />
		<property name="freemarkerSettings">
			<props>
				
				<prop key="template_update_delay">0prop>
				
				<prop key="locale">zh_CNprop>
				<prop key="datetime_format">yyyy-MM-ddprop>
				<prop key="date_format">yyyy-MM-ddprop>
				
				<prop key="number_format">#.##prop>
			props>
		property>
	bean>
  
	<bean id="freeMarkerViewResolver"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		
		<property name="order" value="2" />
        
		<property name="cache" value="true" />
		
		<property name="prefix" value="" />
		
		<property name="suffix" value=".ftl" />
		<property name="contentType" value="text/html;charset=UTF-8" />
    
		<property name="allowSessionOverride" value="false" />
    
		<property name="allowRequestOverride" value="false" />
    
		<property name="exposeSpringMacroHelpers" value="true" />
    
		<property name="exposeRequestAttributes" value="true" />
    
		<property name="exposeSessionAttributes" value="true" />
	bean>
beans>

2.4 创建实体类User

创建com.springmvc.freemarker 包,新建entity包然后创建User实体类

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;

    public User() {
        super();
    }
    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

2.4 创建UserController

com.springmvc.freemarker包下新建Controller包创建UserController

@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "/info")
    public String testFreemarker(HttpServletRequest request, ModelMap modelMap) throws Exception {
        User user = new User("may", 21);
        
        List<String> list = new ArrayList<String>();
        list.add("Jack1");
        list.add("Jack2");
        list.add("Jack3");
        
        modelMap.addAttribute("list", list);
        modelMap.addAttribute("user", user);
        request.setAttribute("haha","哈哈");
        return "userinfo";
    }

}

2.4 创建userinfo.ftl模版文件

在上文配置好的路径/WEB-INF/view/下创建userinfo.ftl模版文件

List:<br/>
<#list list as item >
<font color="red">${item}br>font>
#list>

User:<br/>
${user.name}--->${user.age}<br/>

request:<br/>
${haha}

2.6 运行web程序

访问http://localhost:8080/user/info 显示如下结果既为成功
SpringMVC 整合 Freemarker 详解_第1张图片

2.7 源码和文档

源码 github 地址: https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-freemarker
freemarker 文档:项目doc目录下
BeanNameViewResolver demo地址:https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-beanresovler

3. Freemarker语法简介

Freemarker是区分大小写的 ,

3.1 标签

标签 说明
${} 插入标签,输出内部的变量,字符串,数字等值
${name} 变量
${"aa"} 字符串
<#...> ftl的tags标签
<#include "inc/sidebar.ftl"> 包含一段文本
<#assign seq = ["foo", "bar", "baz"]> 创建一个变量
<@...> 用户的自定义标签<@EventTabNav activeIndex=2 />
和html相同的标签

3.2 常用标签

3.2.1 list遍历

<#list forumInfos as f>
    

3.2.1 if else

<#if o.order.state == 20 && o.order.activityStyleClassPayType == 'O'>
	1
<#elseif o.order.state == 0>
	2
#if>

3.2.1 插入页面

<#include "inc/cfg.ftl">

3.3 空值处理策略

标签 说明
?? 判断左侧的变量是否丢失返回布尔值,相当于java中的null的判断,
?has_content ?has_content非常像??,但是它同时也会对空字符串或空list或空map进行判断
! 用来给变量一个默认值,例如color!”no color”
?if_exists 是??的老写法,现在不推荐使用。

例子:
?,如果不存在返回false,存在返回true

<#if detailList?has_content>
	3

!,如果为空,设置一个默认值

${otherPayNote!"" }

(a.b.c)! a,b,c任意一个不存在就为0

${(a.b.c)!0}

a.b.c c!0 仅当c不存在时为0,可能报错不建议这样用

${ a.b.c!0}

3.4 数据

数列[2,3,4,5],类似js数组

2..5						 类比[2,3,4,5]内存占用更少更快
5..2						 类比[5,4,3,2]
[1+1,[1,2,3],"three"]		 可以进行内嵌
  • 取值
    a = [2,3,4,5] b = a[0] b等于2
  • 切分
    a = [2,3,4,5] b = a[0…2] b等于[2,3,4]
  • 连接
    <#list [1,2]+[3,4] as i>

哈希表
拼接<#assign age = {“jack”:20}+{“jack”:30,“lucy”:27}>
拼接后重复的值取决于最右边的哈希表{“jack”:30,“lucy”:27}

3.5 宏(自定义标签)

3.5.1 定义宏 - 两个参数

<#macro greet person color>
	<font size="2" color="${color}">hello ${person}font>
#macro> 

使用宏

<@greet person="lilei" color="red"/>

3.5.2 定义宏 - 带默认值的参数

<#macro greet person color="yellow">
	<font size="2" color="${color}">hello ${person}font>
#macro>

使用宏
使用时必须给全部的参数赋值,要么在定义时设置初始值,否则会报错

<@greet person="lilei"/>

3.5.3 定义宏 - 嵌套结构

<#macro greet color>
	<font size="2" color="${color}">
	   <#nested>
       <#nested>
	font>
#macro> 

使用宏

<@greet color="red">
	hello world
@greet>

结果
<#nested>代表使用时标签内的嵌套的内容,可以像上面那样被多次调用,在内嵌元素不能使用宏的局部变量



PS:博文仅作为个人学习笔记,如有错误欢迎指正~
更多内容详见:笔记分类导航目录

你可能感兴趣的:(SpringMVC)