引言
enjoy是基于java封装的一套指令模板库,它同freemarker一样,是模板引擎,但相对来说,上手却比freemarker简单,同时它也是jfinal框架的核心组成部分。本次我们主要以springboot框架来进行探讨,如何更好的使用enjoy模板。
引入配置
代码坐标
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>5.0.3</version>
<scope>provided</scope>
</dependency>
说明:scope标签指打包时,enjoy相关的jar包是否需要被打入jar包中,这里我配置的是provided,代表该jar包在打包时,将不会被打入,它将作为lib包提供支持。
初始化
@Bean
public ViewResolver viewEqAdminResolver() {
JFinalViewResolver resolver = new JFinalViewResolver();
resolver.setSourceFactory(new ClassPathSourceFactory());
resolver.setDevMode(true);
resolver.setSuffix(".html");
resolver.setContentType("text/html;charset=UTF-8");
resolver.setToClassPathSourceFactory();
resolver.setBaseTemplatePath("/enjoy/");
resolver.setSessionInView(true);
return resolver;
}
@Bean注解,代表在springboot启动时,会注入bean对象;并返回一个JFinalViewResolver视图解析器。
以上代码配置仅作为基础配置,分别设置了访问后缀,访问基础路径,以及响应格式。
封装指令
enjoy比较强大的功能就是指令的封装,目前网上扔无相关资料进行对指令封装,接下来请看下述代码。
自定义注解
package cn.net.rjnetwork.directive.ano;
import java.lang.annotation.*;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface RjnetworkDircetive {
String value();
boolean override() default false;
}
基础指令封装
package cn.net.rjnetwork.directive;
import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.io.Writer;
import com.jfinal.template.stat.Scope;
import lombok.extern.slf4j.Slf4j;
/**
* @auther huzhenjie
* @email huzhenjie@rjnetwork.net.cn
* @date 2022/11/20 08:01
* @desc
*/
@Slf4j
public class RjnetworkDirectiveBase extends Directive {
public void exec(Env env, Scope scope, Writer writer) {
log.info("进入执行器{},{},{}",env,scope,writer);
scope = new Scope(scope);
scope.getCtrl().setLocalAssignment();
this.exprList.eval(scope);
this.stat.exec(env, scope, writer);
}
}
设置指令
/**
* @desc enjoy 添加自定义指令 基于springboot项目,如果需要引用,则需要项目为springboot项目
* @param jfr enjoy 模版对象
*/
public void addDircetives( JFinalViewResolver jfr ) throws Exception{
Engine engine = jfr.getEngine();
Map<String, Object> directives = applicationContext.getBeansWithAnnotation(RjnetworkDircetive.class);
log.info("获取的指令列表为{}",directives);
for (Map.Entry<String, Object> entry : directives.entrySet()) {
Object value = entry.getValue();
Class aClass = AopUtils.getTargetClass(value);
engine.addDirective(entry.getKey(),aClass);
}
}
将指令添加至解析器中
try {
directiveConstFunc.addDircetives(JFinalViewResolver);
} catch (Exception e) {
log.error("添加jfinal指令异常,{}",e.getLocalizedMessage(),e);
}
使用
package cn.net.rjnetwork.qixiaozhu.directive;
import cn.net.rjnetwork.directive.RjnetworkDirectiveBase;
import cn.net.rjnetwork.directive.ano.RjnetworkDircetive;
import cn.net.rjnetwork.qixiaozhu.entity.QixiaozhuDict;
import cn.net.rjnetwork.qixiaozhu.service.IQixiaozhuDictService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jfinal.template.Env;
import com.jfinal.template.io.Writer;
import com.jfinal.template.stat.Scope;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @auther huzhenjie
* @email huzhenjie@rjnetwork.net.cn
* @date 2022/11/20 08:20
* @desc
*/
@RjnetworkDircetive("eqTestDircetive")
@Slf4j
@Component
public class EqTestDircetive extends RjnetworkDirectiveBase {
private static IQixiaozhuDictService iQixiaozhuDictService;
@Resource
public void setiQixiaozhuDictService(IQixiaozhuDictService iQixiaozhuDictService){
EqTestDircetive.iQixiaozhuDictService = iQixiaozhuDictService;
}
@Override
public void exec(Env env, Scope scope, Writer writer) {
log.info("数据为{}",EqTestDircetive.iQixiaozhuDictService);
LambdaQueryWrapper<QixiaozhuDict> dictLambdaQueryWrapper = new LambdaQueryWrapper<>();
scope = new Scope(scope);
scope.set("list",iQixiaozhuDictService.list());
scope.getCtrl().setLocalAssignment();
this.exprList.eval(scope);
this.stat.exec(env, scope, writer);
}
@Override
public boolean hasEnd() {
return true;
}
}
1233
#eqTestDircetive()
#(list??)
#end
联系客服