文档章节

重写Spring MVC中FreeMarker封装的宏

Jnoee
 Jnoee
发布于 2015/02/25 14:02
字数 979
阅读 133
收藏 0
点赞 0
评论 0

Spring MVC对FreeMarker提供了支持,包括页面宏的封装(spring.ftl)。但是官方默认的页面宏封装得相当不友好,使用起来很不方便。如果在Spring MVC中用FreeMarker作为页面模版技术,建议还是重写对FreeMarker的页面宏的封装。以下是一个重新封装过的FreeMarker宏文件,主要包含文本信息、链接、表单元素的宏,常规的应用已可满足,源文件可以参考这里 mvc.ftl

<#macro message code args>
    <@compress>
    <#if args?? && args?size != 0>
    ${springMacroRequestContext.getMessage(code, args)}
    <#else>
    ${springMacroRequestContext.getMessage(code)}
    </#if>
    </@compress>
</#macro>

<#macro url url params...>
    <@compress>
    <#if params?? && params?size!=0>
        ${springMacroRequestContext.getContextUrl(url, params)}
    <#else>
        ${springMacroRequestContext.getContextUrl(url)}
    </#if>
    </@compress>
</#macro>

<#macro a href attributes...>
	<@compress>
    <a href="<@url href />" ${getAttributes(attributes)}><#nested></a>
    </@compress>
</#macro>

<#macro bind path>
    <#if htmlEscape?exists>
        <#assign status = springMacroRequestContext.getBindStatus(path, htmlEscape)>
    <#else>
        <#assign status = springMacroRequestContext.getBindStatus(path)>
    </#if>
    <#if status.value?exists && status.value?is_boolean>
        <#assign stringStatusValue = status.value?string>
    <#else>
        <#assign stringStatusValue = status.value?default("")>
    </#if>
    <#assign id = status.expression?replace("[", "")?replace("]", "")>
    <#assign name = status.expression>
</#macro>

<#macro form action method="post" attributes...>
    <form method="${method}" action="<@url "${action}" />" ${getAttributes(attributes)}>
        <#nested>
    </form>
</#macro>

<#macro input path attributes...>
    <@bind path />
    <@replaceAttributes attributes />
    <@compress>
    <input type="text" id="${id}" name="${name}" value="${stringStatusValue}" ${getAttributes(attributes)} />
    </@compress>
</#macro>

<#macro password path attributes...>
    <@bind path />
    <@replaceAttributes attributes />
    <@compress>
    <input type="password" id="${id}" name="${name}" ${getAttributes(attributes)} />
    </@compress>
</#macro>

<#macro hidden path attributes...>
    <@bind path />
    <@replaceAttributes attributes />
    <input type="hidden" id="${id}" name="${name}" value="${stringStatusValue}" ${getAttributes(attributes)} />
</#macro>

<#macro textarea path attributes...>
    <@bind path />
    <@replaceAttributes attributes />
    <@compress>
    <textarea id="${id}" name="${name}" ${getAttributes(attributes)}>${stringStatusValue}</textarea>
    </@compress>
</#macro>

<#macro select path items itemLabel itemValue headerLabel headerValue="" attributes...>
    <@bind path />
    <@replaceAttributes attributes />
    <select id="${id}" name="${name}" ${getAttributes(attributes)}>
    	<#if headerLabel??>
    	<option value="${headerValue}">${headerLabel}</option>
    	</#if>
        <@options items itemValue itemLabel status.value />
    </select>
</#macro>

<#macro boolSelect path headerLabel headerValue="" trueLabel="是" trueValue="1" falseLabel="否" falseValue="0" attributes...>
	<@bind path />
    <@replaceAttributes attributes />
    <select id="${id}" name="${name}" ${getAttributes(attributes)}>
    	<#if headerLabel??>
    	<option value="${headerValue}">${headerLabel}</option>
    	</#if>
    	<#local isTrueSelected = status.value?? && status.value?string=="true">
    	<#local isFalseSelected = status.value?? && status.value?string=="false">
        <option value="${trueValue}" <#if isTrueSelected> selected="selected"</#if>>${trueLabel}</option>
        <option value="${falseValue}" <#if isFalseSelected> selected="selected"</#if>>${falseLabel}</option>
    </select>
</#macro>

<#macro options items itemValue itemLabel values>
    <@bindOptions items itemValue itemLabel values />
    <#list opts?keys as optKey>
        <#local optVal = opts[optKey]>
        <#local isSelected = contains(vals, optKey)>
        <option value="${optKey?html}"<#if isSelected> selected="selected"</#if>>${optVal?html}</option>
    </#list>
</#macro>

<#macro radios path items itemValue itemLabel prefix suffix attributes...>
    <@bind path />
    <@bindOptions items itemValue itemLabel status.value />
    <#list opts?keys as optKey>
    	<@replaceAttributes attributes />
        <#local optVal = opts[optKey]>
        <#local isChecked = contains(vals, optKey)>
        <@compress single_line=true>
        ${prefix}
        <input type="radio" id="${id}" name="${name}" value="${optKey?html}"<#if isChecked> checked="checked"</#if> ${getAttributes(attributes)} />
        ${optVal?html}
        ${suffix}
        </@compress>
    </#list>
</#macro>

<#macro radio path prefix suffix trueText="是" falseText="否" attributes...>
    <#if path??>
        <@bind path />
        <@replaceAttributes attributes />
        <#local isChecked = status.value?? && status.value?string=="true">
        ${prefix}<input type="radio" id="${id}" name="${name}" value="1"<#if isChecked> checked="checked"</#if> ${getAttributes(attributes)} />${trueText}${suffix}
        ${prefix}<input type="radio" id="${id}" name="${name}" value="0"<#if !isChecked> checked="checked"</#if> ${getAttributes(attributes)} />${falseText}${suffix}
    <#else>
        ${prefix}<input type="radio" ${getAttributes(attributes)} />${suffix}
    </#if>
</#macro>

<#macro checkboxs path items itemValue itemLabel prefix suffix attributes...>
    <@bind path />
    <#local values = status.value?split(",")>
    <@bindOptions items itemValue itemLabel values />
    <#list opts?keys as optKey>
    	<@replaceAttributes attributes />
        <#local optVal = opts[optKey]>
        <#local isChecked = contains(vals, optKey)>
        <@compress single_line=true>
        ${prefix}
        <input type="checkbox" id="${id}" name="${name}" value="${optKey?html}"<#if isChecked> checked="checked"</#if> ${getAttributes(attributes)} />
        ${optVal?html}
        ${suffix}
        </@compress>
    </#list>
    <input type="hidden" name="_${status.expression}" value="on"/>
</#macro>

<#macro checkbox path attributes...>
    <#if path??>
        <@bind path />
        <@replaceAttributes attributes />
        <#local isChecked = status.value?? && status.value?string=="true">
        <input type="hidden" name="_${status.expression}" value="on"/>
        <input type="checkbox" id="${id}" name="${name}"<#if isChecked> checked="checked"</#if> ${getAttributes(attributes)} />
    <#else>
        <input type="checkbox" ${getAttributes(attributes)} />
    </#if>
</#macro>

<#macro errors path separator attributes...>
    <#if path??>
        <@bind path />
    </#if>
    <#list status.errorMessages as error>
        <span ${getAttributes(attributes)}>${error}</span>
        <#if error_has_next>${separator}</#if>
    </#list>
</#macro>

<#macro replaceAttributes attributes>
    <#if attributes?? && attributes?size gt 0>
        <#if contains(attributes?keys, "id")>
            <#assign id = attributes["id"]>
        </#if>
        <#if contains(attributes?keys, "name")>
            <#assign name = attributes["name"]>
        </#if>
        <#if contains(attributes?keys, "value")>
            <#assign stringStatusValue = attributes["value"]>
        </#if>
    </#if>
</#macro>

<#macro bindOptions items itemValue itemLabel values>
    <#if itemValue?? && itemLabel??>
        <#assign opts = getOptions(items, itemValue, itemLabel)>
    <#else>
        <#assign opts = items>
    </#if>
    <#if values??>
        <#if !values?is_enumerable>
            <#assign vals = [values]>
        <#else>
            <#assign vals = values>
        </#if>
    <#else>
        <#assign vals = []>
    </#if>
</#macro>

<#function contains items target>
    <#list items as item>
        <#if item == target><#return true></#if>
    </#list>
    <#return false>
</#function>

<#function getAttributes attributes>
    <#local attrs>
        <@compress single_line=true>
        <#if attributes?? && attributes?size gt 0>
            <#list attributes?keys as attributeName>
                ${attributeName}="${attributes[attributeName]}"
            </#list>
        </#if>
        </@compress>
    </#local>
    <#return attrs>
</#function>

<#function getOptions items itemValue itemLabel>
    <#local opts>
        <@compress single_line=true>
        {
        <#if items?? && items?size gt 0>
            <#list items as item>
                "${("item." + itemValue)?eval}":"${("item." + itemLabel)?eval}"<#if item_has_next>,</#if>
            </#list>
        </#if>
        }
        </@compress>
    </#local>
    <#return opts?eval>
</#function>

© 著作权归作者所有

共有 人打赏支持
Jnoee
粉丝 4
博文 8
码字总数 5282
作品 0
深圳
架构师
FreeMarker | 取值篇

第一部分:Spring Boot 集成 FreeMarker 1、 需要这些依赖 2、yml 我喜欢 yml,所以删掉 ,新建 3、配置 在 中添加如下配置 4、Controller - View 5、运行效果 第二部分:取值 1、学过 free...

Wenyi_Feng ⋅ 06/14 ⋅ 0

SpringBoot笔记(五)模板引擎thymeleaf和freemarker

SpringBoot本来不应该关注这块,但是既然都学了,就看看吧 SpringBoot属于前后端分离的微服务框架,默认的模板引擎是thymeleaf,虽然也能支持JSP,但是比较麻烦,另外freemarker也是SpringB...

世外大帝 ⋅ 04/25 ⋅ 0

SpringBoot集成FreeMarker

给大家简单介绍一下springboot 集成FreeMarker 过程很简单,5分钟即可。 首先在项目中增添依赖spring-boot-starter-freemarker pom文件代码如下: 然后创建controller,代码如下: applicat...

dalaoyang ⋅ 03/14 ⋅ 0

SpringBoot集成Thymeleaf

上一篇给大家介绍了springboot整合freemarker,这一片来继续为大家介绍一种模板thymeleaf。 首先在项目中增添thymeleaf依赖spring-boot-starter-thymeleaf 同时为了解决html严格校验报错的问...

dalaoyang ⋅ 03/15 ⋅ 0

基于 Spring Boot 的个人博客 - FS-Blog

基于 Spring Boot 的个人博客 1. 涉及技术及工具 核心框架:SpringBoot ORM 框架:MyBatis MyBatis 工具:MyBatis Mapper MVC 框架:Spring MVC 模板引擎:Freemarker 编译辅助插件:Lombok ...

摆码王子 ⋅ 04/25 ⋅ 0

Freemarker介绍、使用并与Spring整合

一、什么是Freemarker 1.1 介绍 是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而...

yuanlaijike ⋅ 04/16 ⋅ 0

cjbi/wetech-admin

Wetech-Admin Wetech-Admin 是基于Maven+Spring+SpringMVC+Mybatis的轻量级后台管理系统,适用于中小型项目的管理后台,支持按钮级别的权限控制,系统具有最基本的用户管理、角色管理、资源管...

cjbi ⋅ 04/20 ⋅ 0

FreeMarker | 数据篇

变量及运算 1、变量定义和赋值 2、判空 防止为空 FreeMarker 不区分单双引号 逻辑判空 对象、集合 1、对象 2、集合 3、Map 可以根据key直接取值可以获取所有key然后遍历也可以直接遍历值 资料...

Wenyi_Feng ⋅ 06/15 ⋅ 0

MiniDao 1.6.4 版本发布,轻量级 Java 持久化框架

MiniDao1.6.4 版本发布,MiniDao是轻量级Java持久化框架,也是Hibernate项目辅助利器。 MiniDao 简介及特征 MiniDao 是一款超轻量的JAVA持久层框架,具备Mybatis一样的SQL能力: 支持SQL分离...

Jeecg ⋅ 06/04 ⋅ 0

SpringBoot 缓存&资源优化

页面缓存 1. freemarker 的页面静态化 application.properties 配置实现浏览器缓存 这段配置是用来启用资源缓存处理。 借鉴官方文档:https://docs.spring.io/spring-boot/docs/1.5.4.RELEA...

FantJ ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 47分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 55分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 56分钟前 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 今天 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 今天 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部