文档章节

重写Spring MVC中FreeMarker封装的宏

Jnoee
 Jnoee
发布于 2015/02/25 14:02
字数 979
阅读 150
收藏 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
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、spring mvc的异常配置 spring mvc 提供了SimpleMappingExceptionResolver来处理异常,这里的只是由web 请求,经由controller引发的异常,无法处理freemarker的异常 2、freemarker自定义异...

xixicat
2014/02/17
0
16
SpringMvc整合Freemarker

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

游宵
2014/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链入门教程以太源码分析accounts包简介

兄弟连区块链教程以太源码分析accounts包简介 accounts包实现了eth客户端的钱包和账户管理。 账号的数据结构: typeAccount struct {Address common.Address `json:"address"` // Ether...

兄弟连区块链入门教程
19分钟前
0
0
sed命令详解及运用

10月17日任务 9.4/9.5 sed 9.3、正则介绍 - sed命令(上) sed是流编辑器,默认不编辑源文件,是以行为单位从源文件抽取数据,进而处理再输出于屏幕上;可能有的人说那我直接vi不就好了嘛,但...

zgxlinux
21分钟前
0
0
iOS App “去评分” 功能的几种实现总结

通常 App 都会在它的设置页面或者关于页面添加一个“去评分”选项,或者在用户使用 App 过程中适当时机弹窗,引导用户跳转到 App Store 对当前 App 进行评分或者撰写评论。 绝大部分 App 实现...

秦无炎
26分钟前
0
0
Chrome 图片解码与 Image Decoding Hint

我在之前的一篇文章Chrome 图片解码与 Image.decode API,说明了为什么图片解码可能会导致非合成器动画的阻塞和如何使用 Image.decode API 来避免动画的阻塞。不过虽然 Image.decode API 给页...

全部原谅
27分钟前
0
0
java获取ip和地区

String s = HttpUtil.sendPost("http://pv.sohu.com/cityjson");JSONObject jsonObject = JSONObject.parseObject(s.substring(s.indexOf("{"), s.indexOf("}") + 1));jsonObject.get("c......

吴伟祥
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部