FreeMarker+BootStrap技术总结

已经不知道多长时间没有碰到让我做页面的问题了, 于是乎,灾难来了,让我做运营后台的页面,想了一想还是复习复习吧,正好整理一下很久之前用过的技术。。。FreeMarker的Debug参考这里这里

一、FreeMarker的使用

  1. FreeMarker中的模型:
    • hash(如Map或JavaBean对象, 可用对象的.的形式访问);
      1. 输出hash中的属性;
        ${(<property-bean>.<property-name>)!"<default-value>"}
        
        • 前面的()中任意一级的值不存在就会显示后面的<default-value>
      2. 输出hash中的方法;
        ${<property-bean>.<method-name>()!"<default-value>"}
        
    • sequence(数组或者列表等可遍历/迭代的对象);
    • scalars(插值:存储的简单值, 整型, 字符串等),不能直接调用这些对象上的方法,但是可以使用FreeMarker内置的一些方法;
      1. 常用方式:
        • 直接输出scalars,${<property-name>},如果找不到property-name, 就会报错;
        • 处理不存在的scalars值:${<property-name>!"<default-value>"}
      2. 内建函数的使用, 在这种方式上, 虽然这个值是一个对象, 但是不应该调用这个对象的方法,只能通过FreeMarker中的内建(内置)函数来解决, 如String, Date
        • 从某个字符串的指定索引num开始截取, 截取到最后: ${str?substring(<num>)};
        • 从某个字符串的指定索引num开始截取, 截取长度为length: ${str?substring(<num>, <length>)};
        • 日期的显示: ${(<date-obj>?string("<date-format>"))!"<default-value>"}
  2. FTL指令。常见的FTL指令:
    • 判断,也可以使用单等号或者双等号意义一样
      <#if <condition>??>
          ...
      <#elseif>
          ...
      <#else> 
          ...
      </#if>
      ```html
      
    • 判断FreeMarker上下文总是否有某个变量
      <#if <property-name>??>
      </if>
      
    • 遍历
      <#list <sequence> as <item>>
          ${<item>}
      </#list>
      
    • 注释:
      <#-- <notes-content> -->
      
    • 导入
      1. <#include "<resource-path>" />
        • 主要用于导入静态的公共资源;
      2. <#import "<resource-path>" />
        • 主要用于涉及到内部函数以及变量声明导入;
      3. 除了FreeMarker中的模型和FTL指令,其他都是静态文本,原样输出;
      4. select回显, 编写JS代码:
        <script type="text/javascript">
            $("<select-selector> option[value=${<selected-value>}]").attr("selected" , "selected");
        </script>
        
    • 定义变量
      1. <#assign <variable-name> = "<variable-value>">
        • <variable-name>:变量名
        • <variable-value>:变量的值
        • 获取使用${<variable-name>}
      2. <#assign <variable-name> = <json-string>?eval>
        • 把JSON字符串转换成JSON对象
  3. FreeMarker常用的内置函数
    • Sequence的内置函数
      1. sequence?first :返回sequence的第一个值。
      2. sequence?last:返回sequence的最后一个值。
      3. sequence?reverse:将sequence的现有顺序反转,即倒序排序
      4. sequence?size:返回sequence的大小
      5. sequence?sort :将sequence中的对象转化为字符串后顺序排序
      6. sequence?sort_by(value):按sequence中对象的属性value进行排序
      • 注意:sequence不能为null
    • Hash的内置函数
      1. hash?keys
        • 返回hash里的所有key,返回结果为sequence
      2. hash?values
        • 返回hash里的所有value,返回结果为sequence
    • string内置函数
      1. substring(start,length)从一个字符串中截取子串
        • start:截取子串开始的索引,start必须大于等于0,小于等于end
        • length: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。
      2. cap_first 将字符串中的第一个单词的首字母变为大写。
      3. uncap_first将字符串中的第一个单词的首字母变为小写。
      4. capitalize将字符串中的所有单词的首字母变为大写
      5. date,time,datetime将字符串转换为日期
        • 注意:如果指定的字符串格式不正确将引发错误
      6. ends_with 判断某个字符串是否由某个子串结尾,返回布尔值 注意:布尔值必须转换为字符串才能输出
      7. html 用于将字符串中的<、>、&和"替换为对应得<>&quot:&amp
      8. index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。
        • start参数用于指定从字符串的那个索引处开始搜索,start为数字值。
        • 如果start大于字符串长度,则start取值等于字符串长度,如果start小于0,则start取值为0。
      9. length返回字符串的长度
      10. lower_case将字符串转为小写
      11. upper_case将字符串转为大写
      12. contains 判断字符中是否包含某个子串。返回布尔值 注意:布尔值必须转换为字符串才能输出 13.number将字符串转换为数字
      13. replace用于将字符串中的一部分从左到右替换为另外的字符串。
      14. split使用指定的分隔符将一个字符串拆分为一组字符串
      15. trim 删除字符串首尾空格
    • 数字内置函数
      • Freemarker中预订义了三种数字格式:number,currency(货币)和percent(百分比)其中number为默认的数字格式转换
        1. c:用于将数字转换为字符串
        2. string:用于将数字转换为字符串
    • 布尔值内置函数
      • string 用于将布尔值转换为字符串输出 true转为"true",false转换为"false"
      • foo?string("yes","no")如果布尔值是true,那么返回"yes",否则返回no
  4. 常见用法
    • 判断是否为空:
      1. <#if xx?exists>
      2. <#if xx??>
      3. <#if xx?default('xxx')> :不然当xxList没有数据的时候 ,很大很大一个黄页就等着你了
    • 数据类型转换:
      1. ${xx?string} //字符串
      2. ${xx?number}//整数
      3. ${xx?currency}//小数
      4. ${xx?percent} //百分比
    • 截取字符串长度:有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度
      <#if news.title?length lt 13 >   
          ${news.title} 
      <#else>  
          ${news.title[0..12]} 
      </#if>
      
    • list操作: 拼接成字符串
      <#list seq as x>     
          ${x_index + 1}. ${x}
          <#if x_has_next>,</#if>
      </#list>
      
      • 在每个对象的后面添加_index,那么就代表当前的索引值;

二、Freemarker中相对比较全的配置

<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="false" />
    <property name="prefix" value="" />
    <property name="suffix" value=".html" />
    <property name="exposeSpringMacroHelpers" value="true" />
    <property name="exposeRequestAttributes" value="false" />
    <property name="exposeSessionAttributes" value="false" />
    <property name="contentType" value="text/html;charset=UTF-8" />
    <property name="requestContextAttribute" value="rc"></property>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="" />
    <property name="freemarkerVariables">
        <map>
            <entry key="myfreemarker" value-ref="myfreemarker" />
            <entry key="my_freemarker_" value-ref="my_freemarker" />
            <entry key="aa" value-ref="test2" />
        </map>
    </property>
    <property name="freemarkerSettings">
        <props>
            <prop key="tag_syntax">auto_detect</prop>
            <prop key="template_update_delay">5</prop>
            <prop key="defaultEncoding">UTF-8</prop>
            <prop key="url_escaping_charset">UTF-8</prop>
            <prop key="locale">zh_CN</prop>
            <prop key="boolean_format">true,false</prop>
            <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
            <prop key="date_format">yyyy-MM-dd</prop>
            <prop key="time_format">HH:mm:ss</prop>
            <prop key="number_format">#</prop>
            <prop key="whitespace_stripping">true</prop>

            <prop key="auto_import">/WEB-INF/ftl/in.ftl as s</prop>   
            <prop key="classic_compatible">true</prop>
        </props>
    </property>
</bean>

三、编码示例

Configuration configure = new Configuration(Configuration.getVersion());
configure.setDirectoryForTemplateLoading(new File("templates"));
configure.setDefaultEncoding("UTF-8");
Template template = configure.getTemplate("test.ftl");
Writer writer = new FileWriter("<file-name>");
Dog dog = new Dog();
template.process(dog, writer);
writer.close();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容