SoJpt Boot

    在Spring Boot框架下使用Jfinal特性极速开发,可以在Spring Boot中向使用Jfinal一样使用Enjoy、Aop、Controller等一系列方法(如: getFile()、renderFile....)以及ActiveRecord

介绍

SoJpt Boot

Spring Boot框架下使用Jfinal特性极速开发

    spring boot 为主, jfinal 为辅的混合双打模式, 既可以享受spring 的生态,又可以体验jfinal的极速开发.

    这次可以在Spring Boot中向使用Jfinal一样使用Enjoy, Aop, controller的一系列方法(如: getFile(), renderFile....),以及ActiveRecord, 只有Jfinal的路由被去掉,其他Jfinal特性可以原生使用

    2.0+版本,直接引入Jfinal的源代码,修改了其中几行,即实现了Spring Boot与Jfinal的混合双打,使Spring Boot环境下的开发者能够更好的体验Jfinal极速开发的特性,有更多的时间去配恋人或家人。 只要Jfinal有新版发布,SoJpt Boot会直接同步更新,因只修改几行代码,所以不用担心升级的复杂度。

软件架构

基于 JFinal 与 Spring Boot制作, 实现Spring Boot与Jfinal的混合双打,使Spring Boot下的开发者能够体验Jfinal的极速开发特性,有更多的时间去配恋人或家人。

安装教程

 1、在Spring Boot 2.0以上项目中 加入maven坐标

    <dependency>
      <groupId>com.gitee.sohnny</groupId>
      <artifactId>sojpt-boot-spring-boot-starter</artifactId>
      <version>2.5.8-4.8</version>
    </dependency>

 2、添加 SoJptBootConfig 配置类

package com.sojpt.boot;

import java.sql.Connection;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.Plugins;
import com.jfinal.core.JFinal;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.template.Engine;
import com.sojpt.boot.intercepter.DuplicateLoginInterceptor;
import com.sojpt.handler.JavaMelodyHandler;
import com.sojpt.kit.DruidKit;
import com.sojpt.model._MappingKit;

@Configuration(value = "soJptBootConfig")
public class SoJptBootConfig extends SoJptConfig {
	
	@Autowired
	private DataSource dataSource;

	/**
	 * 配置JFinal常量
	 */
	@Override
	public void configConstant(Constants me) {

		// 设置当前是否为开发模式
		me.setDevMode(true);
		me.setError404View("index.html");
	}

	/**
	 * 配置JFinal插件 数据库连接池 ORM 缓存等插件 自定义插件
	 */
	@Override
	public void configPlugin(Plugins me) {
		
		ActiveRecordPlugin arp = new ActiveRecordPlugin(()-> dataSource);
		arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
		arp.setShowSql(true);
		arp.setDialect(new MysqlDialect());

		// ******** 在此添加dao层sql文件 *********//*
		arp.addSqlTemplate("sql/all_sqls.sql");

		_MappingKit.mapping(arp);

		// 初始化任务调度插件,参数为配置文件名
		// me.add(new Cron4jPlugin(sysProp));

		me.add(arp);
	}

	/**
	 * 配置全局拦截器
	 */
	@Override
	public void configInterceptor(Interceptors me) {
		me.addGlobalActionInterceptor(new DuplicateLoginInterceptor());
	}

	/**
	 * 配置全局处理器
	 */
	@Override
	public void configHandler(Handlers me) {
		// druid 统计页面功能
		me.add(DruidKit.getDruidStatViewHandler());
		me.add(new JavaMelodyHandler("/monitoring.*", true));
	}

	@Override
	public void beforeJFinalStop() {
	}

	/**
	 * 
	 * 配置模板引擎
	 */
	@Override
	public void configEngine(Engine me) {
		// 这里只有选择JFinal TPL的时候才用
		me.addSharedObject("RESOURCE_HOST", JFinal.me().getContextPath());
		me.addSharedObject("WEB_HOST", JFinal.me().getContextPath());
		
		//me.setBaseTemplatePath(PathKit.getRootClassPath());
		// 配置共享函数模板
		// me.addSharedFunction("/view/common/layout.html")
	}

	@Override
	public void afterJFinalStart() {
		
		System.err.println("SoJpt Boot 启动成功!");
	}

}

3、在 application.properties 配置文件中添加如下

spring.datasource.url= jdbc:mysql://127.0.0.1/sojpt_vue_taobao?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username= root
spring.datasource.password= 123456
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver

4、在spring启动类中添加注解 @ComponentScan("com.sojpt"), 如下:

@ComponentScan("com.sojpt") //添加你定义的SoJptBootConfig类所在的包名称,如果该类可以被扫描到则无需配置
@SpringBootApplication
public class SoJptSpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SoJptSpringbootApplication.class, args);
    }
}

5、使用说明

1. 案例一 返回json

@RestController
public class HelloController extends Controller { //不继承Controller,就是原生的Spring Boot,Jfinal的Aop也就不能用

    @Before(Tx.class) //事务的用法
    @RequestMapping("/list/jfinal")
    public void index() {
		System.out.println(getPara("id")); //获取参数示例
        SqlPara sqlPara = Db.getSqlPara("admin_log.select");
        Page<Record> page = Db.paginate(1, 10, sqlPara);
        renderJson(page);
    }
    
}

2. 案例二 文件下载

@RestController
public class HelloPageController extends Controller {
    
    @Clear
    @RequestMapping("/file")
    public void index() {
		
		setAttr("msg", "123123");
		renderFile(new File("d://test.txt"));
    }
    
}

3. 案例三 返回页面

@Controller
public class HelloPageController extends Controller {

    @Before(LoginInterceptor.class)
    @RequestMapping("/page/jfinal")
    public void index() {
		
		setAttr("msg", "123123");

		render("/view/index.html") //放在webapp目录下
    }
    
}

www.sojpt.com