文档章节

重写Spring MVC中FreeMarker封装的宏

Jnoee
 Jnoee
发布于 2015/02/25 14:02
字数 979
阅读 145
收藏 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
深圳
架构师
在Spring+FreeMarker框架中使用Shiro的Tag标签

目前Freemarker对Shrio的标签还不支持,不过已经有人贡献出来第三方面解决方案,如下: 1、下载shiro-freemarker-tags GitHub地址:https://github.com/jagregory/shiro-freemarker-tags 可以...

zkool
2014/01/19
0
0
[转]Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注...

第一章 Spring更新到3.0之后,其MVC框架加入了一个非常不错的东西——那就是REST。它的开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,使得现在很多公司将其作为新的系统开发框...

robinjiang
2012/10/18
0
1
SpringMVC-Freemarker异常配置

1、spring mvc的异常配置 spring mvc 提供了SimpleMappingExceptionResolver来处理异常,这里的只是由web 请求,经由controller引发的异常,无法处理freemarker的异常 2、freemarker自定义异...

xixicat
2014/02/17
0
16
Spring mvc整合FreeMarker

Spring mvc整合FreeMarker,使用的是Spring mvc 3.2 + FreeMarker 2.3.19,如下所示: 1、新建freemarker.properties,放到src目录下面: 2、在spring配置文件中,加入如下内容: 3、创建Ind...

小99
2014/03/25
0
0
SpringMvc整合Freemarker

1、 新建WebProject,工程名称是SpringFreemarker;然后手动添加jar包,需要的jar包如下: SpringFramework jar包下载地址: http://ebr.springsource.com/repository/app/library/version/d...

游宵
2014/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

移除或自定义 WordPress 仪表盘欢迎面板

第一次登录 WordPress 后台仪表盘页面,默认都会显示 WordPress 的欢迎面板: 如果我们要移除这个面板,在主题的 functions.php 中添加下面的代码即可: 12 //移除 WordPress 仪表盘欢迎面...

james_laughing
22分钟前
0
0
HashMap实现原理及源码分析

HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,...

DemonsI
25分钟前
0
0
eggjs学习笔记

快速初始化 生成项目(要求最低的node版本8.x) npm i egg-init -gegg-init egg-example --type=simplecd egg-examplenpm i 启动项目 npm run dev 配置 环境配置会覆盖默认配置 config...

别人说我名字很长
28分钟前
1
0
Winform Timer控件时间间隔

sender as System.Timers.Timer).Interval = 23 * 60 * 60 * 1000.0;//将时间间隔改为23小时,23小时后重新发生timer_Elapsed事件。 //60000:时间间隔1分钟,300000:时间间隔5分钟,600000:...

笑丶笑
29分钟前
0
0
在win10系统下怎样快速切换任务视图

切换窗口:Alt + Tab 任务视图:Win + Tab (松开键盘界面不会消失) 切换任务视图:Win + Ctrl +左/右 创建新的虚拟桌面:Win + Ctrl + D 关闭当前虚拟桌面:Win + Ctrl + F4...

SummerGao
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部