jfinal下超爽的freemarker自定义标签,web开发的利器

2023-12-07 08:48

本文主要是介绍jfinal下超爽的freemarker自定义标签,web开发的利器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jfinal下超爽的freemarker自定义标签,web开发的利器

为什么采用freemarker?

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

2、页面相应速度快

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

为什么要自定义标签?

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

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

第一步:实现标签类


01 /**
02  * 分类标签<br>
03  * 参数:{parent_id:上级主键}
04  * 返回值:{list:分类列表}
05  *
06  * @author yongtree
07  */
08 public class CategoryListDirective implements TemplateDirectiveModel {
09  
10      
11     public void execute(Environment env, Map params, TemplateModel[] loopVars,
12             TemplateDirectiveBody body) throws TemplateException, IOException {
13  
14         List<Category> list = new ArrayList<Category>();
15         if (params.containsKey("parent_id") && params.get("parent_id") != null) {
16             list = Category.getCategoryList(params.get("parent_id").toString(),
17                     Category.STATUS_ENABLED);
18         else {
19             list = Category.getFirstCategoryList(Category.STATUS_ENABLED);
20         }
21  
22         env.setVariable("list", DEFAULT_WRAPPER.wrap(list));
23         body.render(env.getOut());
24     }
25  
26 }

第二步:action中引入

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

第三步:页面是使用

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

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

01 /**
02  * 自定义标签拦截器
03  * @author yongtree
04  */
05 public class DirectiveInterceptor implements Interceptor {
06  
07     public static CategoryListDirective cld = new CategoryListDirective();
08  
09     public void intercept(ActionInvocation ai) {
10         Controller c = ai.getController();
11         c.setAttr(LABEL_CATEGORY_LIST, cld);
12                 ai.invoke();
13 }
14  
15     public static final String LABEL_CATEGORY_LIST = "_category_list";
16  
17 }

配置到Config中

1 /**
2      * 配置全局拦截器
3      */
4     public void configInterceptor(Interceptors me) {
5         me.add(new AuthInterceptor());
6         me.add(new DirectiveInterceptor());
7     }
超爽吧,简单几步,就搞定了自定义标签,这样你就可以把主要的查询和业务封装到标签里。在不改变业务逻辑和结构的基础上,前端逻辑和展示需要调整,以后就只是前端开发人员或者网站美工的工作了,再辅以freemarker的macro宏定义,再前段封装出更加方便使用的界面,那就更加的灵活和高校。所以在以内容为主的网站上,极力推荐采用这种方式来设计你的前端。为啥?波波说了:  为您节约更多时间,去陪恋人、家人和朋友 ;)

洗洗睡了,陪老婆去了,


补充:

拦截器可以省略掉,直接在config里配置自定义的标签
FreeMarkerRender.getConfiguration().setSharedVariable("_category_list", new CategoryListDirective());

这篇关于jfinal下超爽的freemarker自定义标签,web开发的利器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465242

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2