SoJpt Boot 2.0-3.8 發佈,Spring Boot 使用 Jfinal 特性極速開發

SoJpt Boot

介紹

sojpt-logo

Spring Boot框架下使用Jfinal特性極速開發html

能夠在Spring Boot中向使用Jfinal同樣使用Enjoy, Aop, controller的一系列方法(如: getFile(), renderFile....),以及ActiveRecord, 只有Jfinal的路由被去掉,其餘Jfinal特性能夠原生使用java

SoJpt-Boot-2.0-3.8 changelogmysql

  1. 配置方式,還原Jfinal原生配置,繼承SoJptBootConfig便可。git

  2. 解決undertow併發環境下報異常的問題spring

  3. 加入Aop、configConstant配置、configPlugin配置、configInterceptor全局攔截器配置、configHandler、configEngine、afterJFinalStart等一系列Jfinal原生配置模式。sql

  4. 取消Tx註解、使用原生@Before(Tx.class)便可數據庫

  5. 取消Jfinal原生包的引入,直接引入sojpt-boot依賴便可json

  6. 取消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的極速開發特性,有更多的時間去配戀人或家人。

安裝教程

  1. 在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>
複製代碼
  1. 添加 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;
	}

}

複製代碼
  1. 在 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
複製代碼
  1. 在spring啓動類中添加註解 @ComponentScan("com.sojpt"), 以下:
@ComponentScan("com.sojpt") //添加你定義的包名稱
@SpringBootApplication
public class SoJptSpringbootApplication {

	public static void main(String[] args) {
		SpringApplication.run(SoJptSpringbootApplication.class, args);
	}

}
複製代碼

使用說明

  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);
    }
    
}
複製代碼
  1. 案例二 文件下載
@RestController
public class HelloPageController extends Controller {
    
    @Clear
    @RequestMapping("/file")
    public void index() {
		
		setAttr("msg", "123123");
		renderFile(new File("d://test.txt"));
    }
    
}
複製代碼
  1. 案例三 返回頁面
@Controller
public class HelloPageController extends Controller {

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

		render("/view/index.html") //放在resources目錄下
    }
    
}
複製代碼

參與貢獻

www.sojpt.com

相關文章
相關標籤/搜索