本文主要介绍一下在使用Eclipse和国产JFinal极速开发框架进行项目开发时,如何提升项目开发效率。
主要用到的就是Eclipse上的一个JFinal极速开发助手-JBolt插件。
你将会了解到:
1、如何安装JBolt插件
2、如何使用JBolt插件一键创建标准的JFinal开发环境
3、如何使用JBolt插件一键运行项目、一键浏览、一键打包部署
4、如何使用JBolt插件快速开发Enjoy模板
5、如何使用JBolt插件在HTML中快速编写Bootstrap框架代码做UI
一、JFinal框架简介
JFinal极速开发框架是一款国产基于Java的MVC+ORM+模板引擎的开源开发框架,可以应用在web开发和非web开发领域,多年稳居开源中国软件排名榜首。github star超过3.1K,码云Gitee star超7.6K,社区开发者10W+,相关社区生态活跃,国产软件里非常不错的一个。
jfinal官网:www.jfinal.com
二、JBolt插件简介
如果使用Eclipse去开发基于JFinal框架的项目,那么JBolt插件是必须要安装的,安装后可以帮开发者在Eclipse中快速创建基于JFinal的Maven项目开发环境,一键打包发布,一键生成代码等。
Jbolt插件官网:http://jbolt.cn
三、JBolt插件下载与安装
1、Eclipse版本需要4.7以上的,所以推荐开发者直接Eclipse官网下载最新版的package zip版,下载到本地解压即可。
2、jbolt官网下载插件jar包3、下载后解压放入eclipse解压目录下的plugins目录里
4、重启Eclipse
看到顶部有JBolt的菜单,console里输出JBolt信息,表示安装加载成功
5、切换JBolt视图
6、下载所有依赖
在JBolt Homeview上点击提示的update libs按钮 下载所有依赖的三方类库和模板文件
7、finish后就可以正常使用了
四、使用JBolt创建项目
JBolt目前可以创建两种类型的项目,基于JFinal的maven工程和基于JFinal的普通动态web工程,常用的肯定是maven工程了,更方便管理。 可以快速创建工程的地方有很多。1、maven基础信息
2、项目基础配置
3、服务器选择与配置
4、数据库的选择与配置
5、其它三方依赖
6、一键生成
666
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.jbolt</groupId>
<artifactId>jbolt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jbolt demo</name>
<description>jbolt demo</description>
<url>http://jbolt.cn</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<jdk.version>1.8</jdk.version>
<junit.version>3.8.1</junit.version>
<jfinal.version>4.8</jfinal.version>
<cos.version>2019.8</cos.version>
<apachelog4j.version>2.11.1</apachelog4j.version>
<log4j.version>1.2.17</log4j.version>
<hutool.version>5.1.1</hutool.version>
<jfinalundertow.version>2.0</jfinalundertow.version>
<druid.version>1.1.20</druid.version>
<mysql.version>5.1.47</mysql.version>
<ehcache.version>2.6.11</ehcache.version>
<javamail.version>1.6.2</javamail.version>
<fst.version>2.57</fst.version>
<jedis.version>3.0.1</jedis.version>
<jfinalweixin.version>2.4</jfinalweixin.version>
<jsoup.version>1.12.1</jsoup.version>
<pinyin4j.version>2.5.0</pinyin4j.version>
<poi.version>4.1.0</poi.version>
<quartz.version>2.3.1</quartz.version>
</properties>
<!-- 使用阿里 maven 库 -->
<repositories>
<repository>
<id>ali-maven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${cos.version}</version>
</dependency>
<!-- <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId>
<version>${apachelog4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <version>${apachelog4j.version}</version>
</dependency> -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- undertow -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinalundertow.version}</version>
</dependency>
<!-- WebSocket 支持 -->
<!-- <dependency> <groupId>io.undertow</groupId> <artifactId>undertow-websockets-jsr</artifactId>
<version>2.0.16.Final</version> </dependency> -->
<!-- 避免控制台输出如下提示信息: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
项目中实际上用不到这个 jar 包 注意:eclipse 下可以将 scope 设置为 provided -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<!-- 打包前改成 provided,此处使用 compile 仅为支持 IDEA -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--自选库 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>${javamail.version}</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${javamail.version}</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>${fst.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-weixin</artifactId>
<version>${jfinalweixin.version}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
<dependency>
<groupId>org.clojars.cbilson</groupId>
<artifactId>pinyin4j</artifactId>
<version>${pinyin4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
</dependencies>
<build>
<finalName>jbolt</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- java8 保留参数名编译参数 -->
<compilerArgument>-parameters</compilerArgument>
<compilerArguments>
<verbose />
</compilerArguments>
</configuration>
</plugin>
<!-- jar 包中的配置文件优先级高于 config 目录下的 "同名文件" 因此,打包时需要排除掉 jar 包中来自 src/main/resources
目录的 配置文件,否则部署时 config 目录中的同名配置文件不会生效 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<!-- 使用 mvn clean package 打包 更多配置可参考官司方文档:http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- 打包生成的文件名 -->
<finalName>${project.artifactId}</finalName>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
<recompressZippedFiles>false</recompressZippedFiles>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
<appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>主配置类:
package cn.jbolt.common.config;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.alibaba.druid.util.JdbcConstants;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.template.Engine;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.plugin.druid.DruidPlugin;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.render.ViewType;
import cn.jbolt.index.IndexController;
public class MainConfig extends JFinalConfig {
//将全局配置提出来 方便其它地方重用
private static Prop prop;
//Druid防火墙
private WallFilter wallFilter;
//当前application的项目运行环境是开发(dev) or 生产(pro)
public static String PDEV = "dev";
//终端ID
public static long WORKER_ID = 0;
//数据中心ID
public static long DATACENTER_ID = 0;
//默认数据库类型
public static String DB_TYPE=JdbcConstants.MYSQL;
//id生成模式
public static String ID_GEN_MODE = "auto";
//项目否是开发模式 只要用于配置sql输出和模板热加载等
public static boolean DEV_MODE=false;
/**
* 配置JFinal常量
*/
@Override
public void configConstant(Constants me) {
//读取数据库配置文件
loadConfig();
//设置当前是否为开发模式
me.setDevMode(prop.getBoolean("dev_mode"));
//设置默认上传文件保存路径 getFile等使用
me.setBaseUploadPath(prop.get("base_upload_path"));
//设置上传最大限制尺寸
//me.setMaxPostSize(1024*1024*10);
//设置默认下载文件路径 renderFile使用
me.setBaseDownloadPath(prop.get("base_download_path"));
//设置默认视图类型
me.setViewType(ViewType.JFINAL_TEMPLATE);
//设置404渲染视图
//me.setError404View("404.html");
//设置启用依赖注入
me.setInjectDependency(true);
//设置是否对超类进行注入
me.setInjectSuperClass(true);
//可以直接访问JSP
//me.setDenyAccessJsp(false);
//开启使用SLF4j
//me.setToSlf4jLogFactory();
}
/**
* 配置项目路由
* 路由拆分到 FrontRutes 与 AdminRoutes 之中配置的好处:
* 1:可分别配置不同的 baseViewPath 与 Interceptor
* 2:避免多人协同开发时,频繁修改此文件带来的版本冲突
* 3:避免本文件中内容过多,拆分后可读性增强
* 4:便于分模块管理路由
*/
@Override
public void configRoute(Routes me) {
//推荐拆分方式 如果需要就解开注释 创建对应的 Routes
//me.add(new AdminRoutes());//配置后台管理系统路由
//me.add(new WechatRoutes());//配置微信端访问路由
//普通不拆分的方式配置 如下
//设置默认访问首页路由 可使用http://localhost:port 直接访问 如果80端口 port可以省略
me.add("/",IndexController.class);
}
/**
* 是否是生产环境
* @return
*/
public static boolean pdevIsPro() {
return "pro".equalsIgnoreCase(PDEV);
}
/**
* 加载配置文件
*/
public static void loadConfig() {
if (prop == null) {
prop=PropKit.use("application.properties");
if(prop==null){
throw new RuntimeException("application.properties not exist!");
}
//读取当前配置的部署环境类型 dev是开发环境 pro是生产环境
PDEV=prop.get("pdev", "dev").trim();
if(pdevIsPro()) {
prop = PropKit.append("config-pro.properties");
}else {
prop = PropKit.append("config.properties");
}
//设置当前数据库类型
DB_TYPE=prop.get("db_type", JdbcConstants.MYSQL).trim();
//设置当前是否为开发模式
DEV_MODE=prop.getBoolean("dev_mode",false);
//设置ID主键生成模式 默认是auto
ID_GEN_MODE=prop.get("id_gen_mode","auto").trim();
//设置当前节点所在数据中心ID
DATACENTER_ID=prop.getLong("datacenter_id",0L).longValue();
//设置当前节点所在数据中心中的终端ID
WORKER_ID=prop.getLong("woker_id",0L).longValue();
}
}
/**
* 获取数据库插件
* 抽取成独立的方法,便于重用该方法,减少代码冗余
*/
public static DruidPlugin getDruidPlugin() {
loadConfig();
return new DruidPlugin(prop.get("jdbc_url"), prop.get("user"), prop.get("password"));
}
/**
* 配置JFinal插件
* 数据库连接池
* ActiveRecordPlugin
* 缓存
* 定时任务
* 自定义插件
*/
@Override
public void configPlugin(Plugins me) {
loadConfig();
//配置数据库连接池插件
DruidPlugin dbPlugin=getDruidPlugin();
wallFilter = new WallFilter(); // 加强数据库安全
wallFilter.setDbType("mysql");
dbPlugin.addFilter(wallFilter);
dbPlugin.addFilter(new StatFilter()); // 添加 StatFilter 才会有统计数据
//数据映射 配置ActiveRecord插件
ActiveRecordPlugin arp=new ActiveRecordPlugin(dbPlugin);
arp.setShowSql(prop.getBoolean("dev_mode"));
arp.setDialect(new MysqlDialect());
dbPlugin.setDriverClass("com.mysql.jdbc.Driver");
/********在此添加数据库 表-Model 映射*********/
//如果使用了JFinal Model 生成器 生成了BaseModel 把下面注释解开即可
//_MappingKit.mapping(arp);
//添加到插件列表中
me.add(dbPlugin);
me.add(arp);
//配置ehcache插件 配置文件是ehcache.xml
me.add(new EhCachePlugin());
}
/**
* 配置全局拦截器
*/
@Override
public void configInterceptor(Interceptors me) {
me.addGlobalActionInterceptor(new SessionInViewInterceptor());
}
/**
* 配置全局处理器
*/
@Override
public void configHandler(Handlers me) {
//说明:druid的统计页面涉及安全性 需要自行处理根据登录权限判断是否能访问统计页面
//me.add(DruidKit.getDruidStatViewHandler()); // druid 统计页面功能
}
/**
* 项目启动后调用
*/
@Override
public void onStart() {
// 让 druid 允许在 sql 中使用 union
// https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter
wallFilter.getConfig().setSelectUnionCheck(false);
}
/**
* 配置模板引擎
*/
@Override
public void configEngine(Engine me) {
//配置模板支持热加载
me.setDevMode(prop.getBoolean("engine_dev_mode", false));
//这里只有选择JFinal TPL的时候才用
//配置共享函数模板
//me.addSharedFunction("/view/common/layout.html")
}
public static void main(String[] args) {
UndertowServer.create(MainConfig.class,"undertow.properties").start();
}
}不同环境的配置文件:服务器配置文件:
好了,这就是JBolt一键生成的主要内容,经过不同的配置,可以生成各种路由配置类和不同数据库的配置文件的。
五、一键运行JFinal maven工程项目
右键-》run as(debug as)->JFinal java Application控制台有成功消息输出:
这样,成功启动了!
六、一键打开浏览器访问
右键-》Jbolt-》Browse It插件会打开浏览器访问IndexController中的首页action。
七、一键打包
我们在创建项目的时候默认选择的是jfinal-undertow服务器,这也是jfinal框架现在推荐使用的服务器,性能要比Tomcat好的多。 直接右键-》run as-》Maven clean and Package (to war)这里有两个选项,第一个是默认就将整个项目打包成Undertow专用格式项目,带着启动脚本,打包后内置undertow服务器,上传到服务器上,直接使用启动脚本运行,非常方便。
第二个是,如果你开发用undertow但是部署需要用到Tomcat的话,就导出war包,非常灵活。
打包过程就不用说了,maven打包而已,都在package.xml里配置。
八、快速创建
项目上右键菜单,可以找到快速创建JFinal的一些东西,比如Controller,Service,Model,Validator,Handler,Interceptor等快速创建Controller举例: 自动继承JFinal的Controller,自动在Name输入Controller后缀,自动把光标移入到最前面。
问题:如果系统里有公用的JBoltBaseController.java,规定所有的Controller必须继承这个,如何处理呢?
有办法:
找到settings在这里配置自己需要继承的SuperClass或者要实现的Interfaces就好了。
再次新建Controller的时候,已经可以了。
是不是好方便的!
九、数据库转Java Model代码生成
JFinal里内置的代码生成器,但是需要自己编码实现定制,有些麻烦,在插件里提供了快速生成的功能。 1、项目上右键 找生成2、配置数据源
默认读取创建项目的配置
3、选择要生成的表和相关配置
4、一键生成
生成的代码目录:
生成的Model和映射关系,以及字典文件:
5、配置与启动
在MainConfig.java里已经生成了注释的配置映射的地方,解开注释,就可以正常启动并加载数据源了。
6、测试读取数据:
十、模板引擎代码编辑器极速开发
html默认打开使用了JBolt插件里提供的EnjoyEditor编辑器打开。
同时支持html、css、js、Bootstrap代码块、Enjoy模板引擎指令、JBolt平台内置指令的代码提示。 相关使用有一个介绍视频可以点击看一下:
点击查看视频演示强大编辑器
十一、总结
本文介绍了JFinal极速开发平台再Eclipse下的开发助手-JBolt插件的详细安装和使用,希望对JFinal开发者有所帮助。 关注我,为JFinal开发者提供更多好分享。
有问题加我微信
微信:mumengmeng
