zoukankan      html  css  js  c++  java
  • freemarker

    Java模板引擎之Freemarker篇
    介绍
    1,解析服务器端的数据,并展示在视图层
    2,FreeMarker不是一个框架
    3,Freemarker是一个web图层组件不是web框架,解析服务端数据到页面

    学习新领域的流程:
    1、先划分一个范围
    2、定好一个目标
    3、制定学习计划
    4、边玩边学

    maven构建spring+free marker
    maven管理可直接拖动架包
    pom(代表是maven项目)中添加 spring Freemarker包依赖 的配置
    spring 配置 applicationcontext.xml
    Freemarker Servlet (servlet 转发 request和respond) 配置spring- servlet.xml

    webapp下的WEB_INF下创建ftl目录放ftl文件
    web.xml 配置引入applicationcontext.xml 获得bean 或者隐式的<context:componnet-scan base-package="com.mooc.">加载对应目录下的注解过的类
    web.xml 配置引入springservlet DispatcherServlet

    start.spring.io 用 start.spring.io 构建spring boot项目


    Java中的常见数据模型
    基本数据模型 int long double boolean ..
    对象类型: 类对象(User对象)
    集合: list Map

    Freemarker

    Freemarker的取值
    ${var}(可进行计算)
    ${var!} 对null或不存在的变量不输出任何值
    ${var!默认值} 默认值只在null或变量不存在时输出
    ${var?html}如何转义html,字体大小都是文本形式显示,不会产生效果
    ${var!?string("yyyy")}当var有值的时候执行string格式化日期,为null或不存在则不输出

    boolen类型不能用true,false会报异常
    @ boolean的取值 ${var} yes
    <prop key="boolean_format">yes,no</prop>
    @布尔类型转换${booleanVar?string('yes','no')}

    date类型:freemarker不支持java.util.Date类型,支持java.sql.Date类型
    @ <prop key="date_format">yes,no</prop>
    @${item.birthday?string("yyyy-MM-dd")}
    @{new java.sql.Date(new Date().getTime())}


    Freemarker变量的赋值以及定义
    <#assign a=100/>
    ${a} ${a+100} ${a*100}

    调用user对象的属性
    {user.name}
    user不存在
    ${(user.name)! '默认值'}先判断user是否存在,后判断name手否存在,默认值

    遍历list对象 (userList)
    <ul>
    <#if userList??> 判断变量是否存在,存在就执行里面的东西,不存在就不执行
    <#if userList?exists> 判断变量是否存在,存在就执行里面的东西,不存在就不执行
    <#list userList as item>
    <li> ${item.name}</li>
    <li> ${item.birthday?string("yyyy-MM-dd")}</li> 日期格式化"
    ?string"表示调用方法格式化时间
    </#list>
    </#if>
    </ul>


    map的遍历

    <ul>
    <#list map?key as key>
    <li> ${key}</li>
    <li> ${map[key]}
    </#list>
    </ul>


    if语法
    <#assign var=100/>

    <#if var==99>
    <font color="red">var==99</font>
    <#elseif var==100>
    <font color="red">var==100</font>
    <#else>
    <font color="red">var!==99&&100</font>
    </#if>

    <#if (var=='python'&& var?length==4) || (var=='java')>

    switch语法
    <#assign var=100/>
    <#assign var="java"/>

    <#switch var>
    <#case 100>
    <#case 111>
    .....
    <#break>
    <#case 100>
    ..
    <#break>
    <#default>
    ...
    <#break>
    </#switch>


    字符串 集合的操作
    + 字符串拼接
    [index] 集合取值

    <#assign a="hello">
    <#assign b="world">
    ${a+b}
    ${(a+b)?substring(5,8)} 包前不包后
    ${(a+b)?length}
    ${(a+b)?upper_case}
    ${(a+b)?lower_case}
    ${(a+b)?index_of('w')}
    ${(a+b)?last_index_of('w')}
    ${(a+b)?replace('o',"xx")}


    *****自定义指令实现TemplateDirectiveModel 自定义函数实现TemplateMethodModelEx
    **自定义函数

    <#assign myList=[2,3,4,5,1,,8,9,8,7]>

    <#list sort_int(myList) as item>
    ${item}

    </#list>


    Java

    mv.addObject("sort_int",new SortMethod());

    》 class SortMethod implements TemplateModelEx{

    public Object exec(List arguments) throws TemplateModelException{
    //获取第一个参数
    SimpleSequence arg0=(SimpleSequence)arguments.get(0);
    List<BigDecimal> list=arg0.toList();
    Collections.sort(list,new Comparator<BigDecimal>(){
    public int compare(BigDecimal o1,BigDecimal o2){

    return o1.intvalue()-o2.intValue();//升序


    }

    })

    };


    }


    排序:<#list myList?sort as item> 调用sort方法进行排序(升序)
    <#list myList?sort?reverse as item> 降序
    ${item_index} //获取下标

    </#list>

    ${myList?size}
    ${myList[3]} //通过下表获取元素



    **自定义指令(自定义指令用@符号)

    eg:用户123456是否拥有admin角色,并且返回admin的权限

    <@role user='123456' role="admin"; result1,result2>
    role: user 用户id role:用户角色
    result1 用户是否有该角色 result2 用户所拥有的角色
    <#if result1>
    </#if>

    <#list result2 as item>
    ${item}
    </#list>
    </@role>

    role是在spring_freemarker.xml中配置

    <property name="freemarkerVariables">
    <map>
    <entry key="role" vaule-ref="roleDirectiveModel">
    </map>
    </property> key:自定义指令的名称 vaule-ref:freemarker加载的bean(注解@service)

    @service
    public class RoleDirectiveModel implements TemplateDirectiveModel{

    public void execute(Environment env,Map params(入参),TemplateModel[] loopvars(返回值),TemplateDirectiveBody body) throws TemplateException,IOException{

    TemplateScalarModel user=(TemplateScalarModel)params.get("user");
    TemplateScalarModel role=(TemplateScalarModel)params.get("role");
    if("123456".equals(user.getString())&& "admin".equals(role.getString())){
    loopvars[0]=TemplateBooleanModel.TRUE;

    }


    List<String> otherRights=new ArrayList<String>();
    otherRights.add("add");
    otherRights.add("delete");
    otherRights.add("update");
    loopvars[1]=new SimplateSequence(otherRights);
    body.render(env.getOut()); //输出

    }


    }

    *****%%%%%%%%***********


    macro语法:(macro封装模板片段)
    <#macro macro_name param1 param2 param3..../ >
    template_code ${param1}

    <#nested/> //调用的引用

    </#macro>

    调用:<@macro_name param1="value1" param2="value2"/>

    nested_template 嵌套的代码片段

    </@macro_name>

    eg:定义:@ 无参 <#macro test>
    <font color="red">大大</font>
    </#macro>

    调用:<@test/>


    @ 带参:<#macro test param1 param2="dd">

    <font color="red">大大 ${param1} ${param2}</font>
    </#macro>

    调用:<@test param1="java" param2="python"/>
    <@test param1="java"/> 此时${param2}值为默认值dd


    @多参数 <#macro test param1 param2="dd" paramExt...>
    ${paramExt['paramW']} //此时paramW就是调用时传的参数
    </#macro>
    调用:<@test param1="java" param2="python" paramW="23"/>

    nested:嵌套(灵活模板)
    <#macro test param1="java">
    ${param1}<br/>
    <#nested param1,"我的nested参数"><br/>
    </#macro>

    <@test param1="java";loopVar1,loopVar2>

    <font color="red">hello ${loopVar1} ${loopVar2}</font>
    <@test>

    <@test param1="python";loopVar1>

    hello ${loopVar1}
    <@test>


    function语法
    <#function function_name param1 param2>
    <#return>
    </#function>
    调用:
    ${function_name(param1,param2)}

    eg:定义 <#function addTest param1 param2>
    <#return param1+param2>
    </#function>

    调用:${addTest(10,10)}

    举例子

    <a <#if topic.isCollect?? && topic.isCollect=="y">
    class="topic-favo favo-cur" <#else> class="topic-favo" </#if>
    id="${topic.id}" href="javascript:void(0);"><i class="iconfont">&#xe672;</i></a>


    <ul>
    <#list  topThreeTopicList as  topic>
    <#if topic_index == 0>
    <li class="topic-list-item topic-list-item1" data-url="#">
    <a href="#"><img src="${topic.topicImage}"></a>
    <#else>
    <li class="topic-list-item " data-url="#">
    <a href="${basepath}/topic/detail/${topic.id}"><img src="${topic.topicImage}"></a>
    </#if>

    <div class="floatl">
    <p class="name text-ellipsis">${topic.topicName}</p>
    <p class="date"><i class="iconfont">&#xe606;</i>${topic.topicPeriod}</p>
    </div>
    <div class="flaotr">
    <p><i class="iconfont">&#xe610;</i><span>${topic.pageView}</span></p>
    <p>${topic.isCollect!""} <a <#if topic.isCollect?? && topic.isCollect=="y">
    class="topic-favo favo-cur" <#else> class="topic-favo" </#if>
    id="${topic.id}" href="javascript:void(0);"><i class="iconfont">&#xe672;</i></a><span>${topic.collect}</span></p>

    </div>
    </li>
    </#list>
    </ul>
    <p class="mb2">
    <span class="fright">${template.browseNum}浏览/${template.downloadNum}下载</span>
    <#if template.nowPrice!="0.00"&&template.score=0 >
    <span class="mb_price">
    <i class="iconfont">&#xe617;</i>${template.nowPrice}
    </span>
    <#elseif template.nowPrice=="0.00"&&template.score=0>
    <span class="mb_score">
    <i class="iconfont">&#xe616;</i>免费
    </span>
    <#else>
    <span class="mb_score">
    <i class="iconfont">&#xe618;</i>${template.score}
    </span>
    </#if>
    </p>
  • 相关阅读:
    Python基础练习
    理解信息管理系统
    datatime处理日期和时间
    中文词频统计
    文件方式实现完整的英文词频统计实例
    组合数据类型练习,英文词频统计实例上
    英文词频统计预备,组合数据类型练习
    凯撒密码、GDP格式化输出、99乘法表
    字符串基本操作
    条件、循环、函数定义 练习
  • 原文地址:https://www.cnblogs.com/huiminxu/p/8393218.html
Copyright © 2011-2022 走看看