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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.