文档章节

重写Spring MVC中FreeMarker封装的宏

Jnoee
 Jnoee
发布于 2015/02/25 14:02
字数 979
阅读 158
收藏 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整合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
[转]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
重写了JFinal的demo,加入了实际项目应用的封装

刚刚结束一个网站的开发(http://www.cnkuke.com)把项目中常用的freemarker宏和一些封装类分享给大家,希望能帮助初次使用JFinal做项目的同学少走弯路。 封装如下: 一、freemarker封装 分页...

axhack
2013/08/01
2.7K
15
SpringMVC-Freemarker异常配置

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

xixicat
2014/02/17
0
16

没有更多内容

加载失败,请刷新页面

加载更多

slot分发内容

slot元素作为组件模板之中的内容分发插槽。这个元素自身将被替换。 有 name 特性的 slot 称为具名 slot。 有 slot 特性的内容将分发到名字相匹配的具名 slot。 内容分发就是指混合父组件的内...

Carbenson
4分钟前
0
0
python开发入门

1.执行python文件 # python ./demo.py 2.Python ImportError: No module named 'requests'异常 解决方法: # pip install requests;...

硅谷课堂
5分钟前
0
0
官宣,PyTorch 1.0 稳定版本现已推出

简评:快来一起快乐地学习吧。 随着 PyTorch 生态系统和社区继续为开发人员提供有趣的新项目和教育资源,今天(12 月 7日)在 NeurIPS 会议上发布了 PyTorch 1.0 稳定版。研究人员和工程师现...

极光推送
19分钟前
0
0
对比理解adr,ldr指令

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 参照韦老师的代码和Makefile写了test_adr.S: .text .globl _start _start...

天王盖地虎626
30分钟前
2
0
将spring boot 项目注册为Linux的服务

springboot 注册为Linux系统服务 springboot 注册为Linux系统服务

miaojiangmin
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部