Spring整合JSP,Freemarker(ftl)基本使用

FTL自己用得比较少,这里做个备份记录,以免忘记。

Freemarker这里先扯淡两句,在单纯的页面使用上来说和JSP个人感觉没有太大的区别,都有比较多的类库支持,不过相对的如果FTL没有做静态化相对的还是JSP的速度要快一些。但是为什么还是有很多项目用freemarker,网上也有很多文章,这里偷个懒,传送门:http://blog.csdn.net/qq897958555/article/details/53560655

我这里比较传统用的IDE工具是Myeclipse2014,所有如果想要有ftl格式的东东高亮支持的话需要配置下插件,同样的网上一大把,这里也偷懒了,传送门:http://blog.csdn.net/ylyanglei/article/details/50464515

在项目中,Spring是支持多个前段引擎的,只是需要在Spring的配置文件中去配置一下,就可以同时支持JSP和FLT了。除了Spring需要的jar外还需要Freemarker的jar支持,这里我用的freemarker.jar
完整的XML




    
    
    
    

    
    
        
        
        
        
    

    
    
    
        
            
                
            
        
    


    
    
        
            
                
            

        
    
    
    
    

    
    
        
        
        
        
    
    
    
    
        
        
        
        
        
          
        
        
        
        
        
    
    
    
        
        
            
                
            
        
        
          
        
            
                3600
                 
                auto_detect 
                UTF-8  
                UTF-8  
                zh_CN
                
                yyyy-MM-dd HH:mm:ss
                yyyy-MM-dd
                  
                #.##
                
                 true
            
        
    
    

    
    
    

需要注意一下的是如果只需要FTL作为模板不作为前段引擎,可以不配置视图解析器,如果配置了多个视图解析器,其他视图解析器的优先级一定要高于JSP才行。

 

配置完了后写个简单的controller,用法和传统的后台封装参数,前台写JSP写EL表达式一样

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/ftl")
public class ftlController {
    
    @RequestMapping(value="/firstFtl.do",method=RequestMethod.GET)
    public String  index(HttpServletRequest requset,HttpServletResponse response,Model mode) {
       
        mode.addAttribute("msg", "hi freemarker");
        
        return "MyFtl";
    }

}



  
    MyHtml.html
    
    
    
    
    
    

  
  
  
    ${msg}
  

image.png

首先科普下
FreeMarker模板文件主要有4个部分组成
1、文本,直接输出的部分
2、注释,即<#--...-->格式不会输出
3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

Freemarker支持各种后台的常用类型,页面也支持条件判断,逻辑运算,首先,我们测试下最常用的后台封装list,前台循环出来,在通过条件去判断

 @RequestMapping(value="/expression.do")
    public String expressionTest(HttpServletRequest requset,HttpServletResponse response,Model mode)
    {
        //页面测试用集合,简单数据类型
        
        List testList = new ArrayList();
        
        testList.add("1");
        testList.add("2");
        testList.add("3");
        mode.addAttribute("list",testList);
        return "expressionTest";
        
    }`这里写代码片`
 
 


  
    MyHtml.html
    
    
    
    
    
    

  
  
  
    
<#--在jsp中${}表达式会直接忽略不显示,而freemarker会报异常,还是一大堆,freemarker就需要您手动去处理--> <#-- ?? 用于判断是否为空 ?number将字符串转换为数字--> <#if list??> 集合长度:${list?size}
<#list list as a > 集合的下标:${a_index} 当前集合值:${a}  <#if a?number%2==0>偶数 <#else>奇数
<#else> 集合为空
image.png

这里可以发现在用JSP的过程中我们一般不会对null值进行特殊的处理判断,JSP默认会处理,当为null时显示为空。但是在FLT模板中并不会这样,如果未进行非空判断,而直接进行取值,会抛出异常。通常有两种方式进行处理。

例如现在有个user对象,里面有角色属性
方式1:配置classic_compatible=true,此种方式只能判断一层,如user.role为null,显示为空,若user为空,则仍会发生异常。
方式2:使用!或者??

${list!'集合为空'}

如果集合为空会显示空

?? 用于判断是否为空

<#if user.role??>
 当前用户没有权限角色
 <#else>
 当前用户有权限角色


${user.role???string}<#--这里将结果以字符串的形式输出:true 或者false-->
${user.role???string("YES","NO")} <#--这判定用户权限角色为空 -->
${user.role!"当前用户没有角色"}
<#--获取当前用户的角色:${user.role.rolename!}  而role任然没值的时候依然会报错,而正确的方式
获取当前用户的角色:${(user.role.rolename)!}-->

来完整的处理个null,首先建立一个简单的user对象

package com.lovo.beans;

import java.io.Serializable;

public class UserBean implements Serializable{

    /**
     * 省略get set方法
     */
    private static final long serialVersionUID = -2959897964759682757L;
    
    private Long id;
    private String name;
    private String sex;
    private Long age;
    
}

控制器

@RequestMapping(value="/expressionUser.do")
    public String expressionUset(HttpServletRequest requset,HttpServletResponse response,Model mode)
    {
        
        UserBean bean = new UserBean();
        bean.setName("小明");
        bean.setAge(20L);
        bean.setSex(null);
        //不对classBean做null处理
        bean.setClassBean(null);
        mode.addAttribute("user", bean);
        
        return "expressionUser";
    }

FTL模板



  
    MyHtml.html
    
    
    
    
    
    

  
  
  
    
姓名:
性别:
年龄:
班级:

会发现报错

image.png
image.png

这个时候用!和??处理下!是直接做null判断,后面可以跟值,如果不写,显示为空字符串,??是做是否为空判断,多用作if else中,也可以输出默认值???需用???string("yes","no")



  
    MyHtml.html
    
    
    
    
    
    

  
  
  
    
姓名:
性别:
年龄:
班级: 班级: 班级:
image.png

在页面使用FTL时,不可避免的会操作变量,在Freemarker中变大大致可以分为4种。

  1. 数据模型变量,后台封装的变量参数传递到模板中
  2. 模板中的变量使用,用<#assign>定义
  3. 局部变量,在指令中的变量
  4. 循环变量,在循环中的变量

数据模型变量,可以在后台封装成对象,list,map等,这里举例字符串

@RequestMapping(value="/expressionAssagin.do")
    public String expressionAssagin(HttpServletRequest requset,HttpServletResponse response,Model mode)
    {
        mode.addAttribute("root", "后台封装的变量");
        return "expressionAssagin";
    }
${root}

页面显示


image.png

<#assign>定义的变量


        后台封装的变量:${root}
页面定义的变量: <#assign username="李四"> ${username}
image.png

当页面定义的assign变量名与数据模型变量名相同时,优先展示页面定义的assign变量,不是覆盖数据模型变量,可以使用.globals进行展示


    <#assign root="页面变量优先于数据模型变量展示">
        优先展示:${root}
指定展示:${.globals.root}
页面定义的变量: <#assign username="李四"> ${username}
image.png

局部变量


    <#assign root="页面变量优先于数据模型变量展示">
        优先展示:${root}
指定展示:${.globals.root}
页面定义的变量: <#assign username="李四"> ${username}
<#--使用local可以声明局部变量,所以在marco宏中局部变量--> <#macro test> <#--此时当调用该指令之后,会将模板中的变量覆盖,不能使用globals,一般不使用这种方式在指令中定义变量--> <#local username="我的名字变了"/> <#local sex="性别是保密的"/> 姓名:${username!} 性别${sex!}
<#--调用宏--> <@test/> ${sex!"局部变量外部是调用不到的"}
image.png

循环变量,就是在循环体重使用的变量

<#--循环变量-->
     <#list 1..3 as num>
     <#--只能在循环体中使用-->
        ${num}
     
     ${num!"循环变量出了循环体就消失了"}
image.png

你可能感兴趣的:(Spring整合JSP,Freemarker(ftl)基本使用)