SoJpt Boot
介紹
在Spring Boot框架下使用Jfinal特性極速開發
可以在Spring Boot中向使用Jfinal一樣使用Enjoy, Aop, controller的一系列方法(如: getFile(), renderFile....),以及ActiveRecord, 只有Jfinal的路由被去掉,其他Jfinal特性可以原生使用
SoJpt-Boot-2.0-3.8 changelog
-
配置方式,還原Jfinal原生配置,繼承SoJptBootConfig即可。
-
解決undertow併發環境下報異常的問題
-
加入Aop、configConstant配置、configPlugin配置、configInterceptor全域性攔截器配置、configHandler、configEngine、afterJFinalStart等一系列Jfinal原生配置模式。
-
取消Tx註解、使用原生@Before(Tx.class)即可
-
取消Jfinal原生包的引入,直接引入sojpt-boot依賴即可
-
取消SoJptController, 繼承Jfinal的Controller即可
總之,這次2.0版本,直接引入Jfinal3.8的原始碼,修改了其中幾行,即實現了Spring Boot與Jfinal的混合雙打,使Spring Boot環境下的開發者能夠更好的體驗Jfinal極速開發的特性,有更多的時間去配戀人或家人。 只要Jfinal有新版釋出,SoJpt Boot會直接同步更新,因只修改幾行程式碼,所以不用擔心升級的複雜度。
軟體架構
基於 JFinal 與 Spring Boot製作, 實現Spring Boot與Jfinal的混合雙打,使Spring Boot下的開發者能夠體驗Jfinal的極速開發特性,有更多的時間去配戀人或家人。
安裝教程
- 在Spring Boot 2.0以上專案中 加入maven座標
<dependency>
<groupId>com.gitee.sohnny</groupId>
<artifactId>sojpt-boot</artifactId>
<version>2.0-3.8</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
複製程式碼
- 新增 SoJptBootConfig 配置類
package com.sojpt.boot;
import java.sql.Connection;
import javax.servlet.ServletException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
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.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.sojpt.model._MappingKit;
@Configuration(value = "SoJptBootConfig")
@EnableConfigurationProperties(ActiveRecordPluginProperties.class)
public class SoJptBootConfig extends SoJptConfig {
@Autowired
private ActiveRecordPluginProperties arpProperties;
/**
* 配置JFinal常量
*/
@Override
public void configConstant(Constants me) {
// 設定當前是否為開發模式
me.setDevMode(arpProperties.getIsDevMode());
// me.setError404View("/index.html");
}
/**
* 配置JFinal外掛 資料庫連線池 ORM 快取等外掛 自定義外掛
*/
@Override
public void configPlugin(Plugins me) {
DruidPlugin dp = new DruidPlugin(arpProperties.getJdbcUrl(), arpProperties.getUsername(), arpProperties.getPassword());
dp.addFilter(new StatFilter());
dp.setDriverClass("com.mysql.cj.jdbc.Driver");
WallFilter wall = new WallFilter();
dp.addFilter(wall);
me.add(dp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
arp.setShowSql(arpProperties.getIsDevMode());
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.addSharedFunction("/view/common/layout.html")
}
@Override
public void afterJFinalStart() {
System.err.println("SoJpt Boot 啟動成功!");
}
/**
*
* 此內部類可選, (預設不建議開啟,註釋掉即可)
* 其作用就是在SpringBoot中可以直接 return"/view/index.html",
* 如果習慣render("/view/index.html")用法,可註釋此方法
*
* @return
* @throws ServletException
*/
@Bean(name = "jfinalViewResolver")
public JFinalViewResolver getJFinalViewResolver() throws ServletException {
JFinalViewResolver jfr = new JFinalViewResolver();
// setDevMode 配置放在最前面
jfr.setDevMode(true);
// 使用 ClassPathSourceFactory 從 class path 與 jar 包中載入模板檔案
jfr.setSourceFactory(new ClassPathSourceFactory());
jfr.setSuffix(".html");
jfr.setContentType("text/html;charset=UTF-8");
jfr.setOrder(0);
// jfr.addSharedFunction("/view/common/_layout.html");
// jfr.addSharedFunction("/view/common/_paginate.html");
// init("com.sojpt.boot.MainConfig");
return jfr;
}
}
複製程式碼
- 在 application.properties 配置檔案中新增如下
arp.jdbc-url = jdbc:mysql://127.0.0.1/sojpt?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
arp.username = root
arp.password = 123456
arp.is-dev-mode= true
複製程式碼
- 在spring啟動類中新增註解 @ComponentScan("com.sojpt"), 如下:
@ComponentScan("com.sojpt") //新增你定義的包名稱
@SpringBootApplication
public class SoJptSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SoJptSpringbootApplication.class, args);
}
}
複製程式碼
使用說明
- 案例一 返回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);
}
}
複製程式碼
- 案例二 檔案下載
@RestController
public class HelloPageController extends Controller {
@Clear
@RequestMapping("/file")
public void index() {
setAttr("msg", "123123");
renderFile(new File("d://test.txt"));
}
}
複製程式碼
- 案例三 返回頁面
@Controller
public class HelloPageController extends Controller {
@Before(LoginInterceptor.class)
@RequestMapping("/page/jfinal")
public void index() {
setAttr("msg", "123123");
render("/view/index.html") //放在resources目錄下
}
}
複製程式碼