为什么采用freemarker?

1、模板技术,不依附于语言和框架,前端和后端解耦,便于分工协作,更好的协同。

2、页面相应速度快

3、前端非常的灵活,采用自定义标签可以在不更改后端的基础上很容易的构造前端逻辑,可适应多变的网站。

为什么要自定义标签?

答案在第一个问题的第三点,我们需要一个前端灵活的架构,在不更改后端逻辑的基础上,很容易的改造前端逻辑。

在SSH的架构中,自定义标签已经可以方便的实现(struts2的标签也是基于freemarker的自定义标签),但是用起来还是不够爽,需要大量的配置,繁琐的依赖注入等。用了jfinal以后,发现自定义freemarker标签在该框架中用起来极爽,寥寥几个类,几行代码就能将自定义标签应用起来。废话不多说了,上代码吧。

第一步:实现标签类

 /**
* 分类标签<br>
* 参数:{parent_id:上级主键}
* 返回值:{list:分类列表}
*
* @author yongtree
*/
public class CategoryListDirective implements TemplateDirectiveModel { public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException { List<Category> list = new ArrayList<Category>();
if (params.containsKey("parent_id") && params.get("parent_id") != null) {
list = Category.getCategoryList(params.get("parent_id").toString(),
Category.STATUS_ENABLED);
} else {
list = Category.getFirstCategoryList(Category.STATUS_ENABLED);
} env.setVariable("list", DEFAULT_WRAPPER.wrap(list));
body.render(env.getOut());
} }

第二步:action中引入

 setAttr("_category_list", new CategoryListDirective());

第三步:页面是使用

 <@_category_list parent_id="2">
<#list list as c>
<a href="/category/${c.id}">${c.name}</a>
</#list>
</@_category_list>

我们使用自定义标签的目的是灵活,就是要将action中要做到事情,能直接通过标签在页面上使用。而上面的第二步,需要在action中set,使其action的逻辑不灵活。自定义标签应该能脱离开具体的action,能在更多的模块中用到,不受action的限制。所以第二步需要稍加改造,这是我们可以采用jfinal的全局拦截器,将这些标签初始化内存中,在所有的action中都很容易的注入,当然你可以根据拦截器的相关配置和逻辑,将自定义标签指定到相应的action中。上代码吧

 /**
* 自定义标签拦截器
* @author yongtree
*/
public class DirectiveInterceptor implements Interceptor { public static CategoryListDirective cld = new CategoryListDirective(); public void intercept(ActionInvocation ai) {
Controller c = ai.getController();
c.setAttr(LABEL_CATEGORY_LIST, cld);
ai.invoke();
} public static final String LABEL_CATEGORY_LIST = "_category_list"; }

配置到Config中

 /**
* 配置全局拦截器
*/
public void configInterceptor(Interceptors me) {
me.add(new AuthInterceptor());
me.add(new DirectiveInterceptor());
}

超爽吧,简单几步,就搞定了自定义标签,这样你就可以把主要的查询和业务封装到标签里。在不改变业务逻辑和结构的基础上,前端逻辑和展示需要调整,以后就只是前端开发人员或者网站美工的工作了,再辅以freemarker的macro宏定义,再前段封装出更加方便使用的界面,那就更加的灵活和高校。所以在以内容为主的网站上,极力推荐采用这种方式来设计你的前端。

最新文章

  1. $.load()的用法
  2. [No000075]有没有安全的工作?
  3. sql server 得到数据库字典
  4. netstat miscellaneousness
  5. Shannon entropy
  6. 关于php中正则匹配包括换行符在内的任意字符的问题总结
  7. 为什么anylase和scenaio中的平均响应时间差别会这么大?
  8. linux bash: sqlplus: command not found 错误处理
  9. Android Paint的使用以及方法介绍(附源码下载)
  10. 转载------------------关于android的一些技巧
  11. hggroup和adress
  12. Asp.Net--下载文件
  13. Can you find it?(二分 二分+STL set map)
  14. GC算法精解(五分钟让你彻底明白标记/清除算法)
  15. iOS开发之判断横竖屏切换
  16. 历年NOIP中的搜索题
  17. ARM Mcp2515添加驱动
  18. LeetCode算法题-Single Number(Java实现)
  19. python正则下载图片
  20. ASP.NET常见异常处理示例

热门文章

  1. HDU4631(标程代码)
  2. 【Head First Servlets and JSP】笔记22:直接从请求到JSP &amp; 获取Person的嵌套属性
  3. 修改AdminLTE左侧菜单展开延迟
  4. MySQL-5.7 创建及查看触发器
  5. 阿里云服务器: centos7 ftp安装
  6. 20145201 实验三 敏捷开发与XP实践
  7. Eclipse 添加JSP模板
  8. python 获取探针页面,自动查询公司出口
  9. git branch 常用语句详解
  10. 拖拽窗口的实现-JQuery实现;