springmvc+freemarker实现自定义标签

1.目标
如图是我们的目标页面的一部分,因为类目列表是每个 页面都需要展示的一部分,所以把这个属性列表提取出来,做成一个自定义标签,在不通的页面上直接引用标签,就可以直接展示了

2.编写数据提提供类,实现TemplateDirectiveModel接口

package com.dmall.mall.directive;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.dmall.item.entity.Category;
import com.dmall.item.service.CategoryService;
import com.google.common.base.Strings;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateDirectiveModel;
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.Configuration;
import freemarker.template.SimpleScalar;
/**
* 类目导航组件
*
* @author wangxuzheng@aliyun.com
*
*/
@Component
public class CategoryTreeDirective implements TemplateDirectiveModel{
@Autowired
private CategoryService categoryService;
private Long getPid(Map<?,?> params)throws TemplateException{
String id = getParam(params, "pid");
if(Strings.isNullOrEmpty(id)){
throw new TemplateModelException("没有指定要展示类目额pid属性");
}
return Long.valueOf(id);
}
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
Long pid = getPid(params);
List<Category> children = categoryService.findChildren(pid);
env.setVariable("categories", createBeansWrapper().wrap(children));
body.render(env.getOut());
}
protected String getParam(Map<?,?> params, String name) {
Object value = params.get(name);
if (value instanceof SimpleScalar) {
return ((SimpleScalar)value).getAsString();
}
return null;
}
public BeansWrapper createBeansWrapper() {
return new BeansWrapperBuilder(Configuration.VERSION_2_3_23).build();
}
}
3.将自定义标签的类,放到freemarker配置的变量中
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
<entry key="links" value-ref="links"/>
<entry key="shiro"><bean class="com.jagregory.shiro.freemarker.ShiroTags"/></entry>
<!-- 用户自定义标签 -->
<entry key="categoryTree" value-ref="categoryTreeDirective"></entry>
</map>
</property>
<property name="templateLoaderPath" value="/WEB-INF/views" />
<property name="freemarkerSettings" ref="freemarkerConfiguration" />
</bean>
3.在页面中使用自定义标签
这里,我们把每个自定义标签对应的ftl独立成 一个单独的文件,这样,就可以在多个页面中去include了,如图


category_tree.ftl文件的内容:
<!-- BEGIN SIDEBAR -->
<div class="sidebar col-md-3 col-sm-4">
<ul class="list-group margin-bottom-25 sidebar-menu">
<@categoryTree pid="1">
<#list categories as category>
<#if category.hasChild==1>
<li class="list-group-item clearfix dropdown">
<a href="javascript:void(0);">
<i class="fa fa-angle-right"></i>
${category.name}
<i class="fa fa-angle-down"></i>
</a>
<ul class="dropdown-menu">
<@categoryTree pid="${category.id}">
<#list categories as c>
<li><a href="product-list.html"><i class="fa fa-circle"></i> ${c.name}</a></li>
</#list>
</@categoryTree>
</ul>
</li>
<#else>
<li class="list-group-item clearfix"><a href="product-list.html"><i class="fa fa-angle-right"></i> ${category.name}</a></li>
</#if>
</#list>
</@categoryTree>
</div>
<!-- END SIDEBAR -->
其中@categoryTree是我们在上个步骤中 在freemarker 配置中 定义的key, 这样freemarker在解析的时候就会使用与key对应的组件处理类来执行,自定义组件也支持传递参数,在这个例子中,我们要展示的一个树形菜单,所以我们要把上级菜单ID传递进去(pid),组件处理类处理完后,通过 env.setVariable("categories", createBeansWrapper().wrap(children));把结果放到模版渲染上下文中,这样在@categoryTree标签内就可以使用组件提供的处理结果了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值