JFinal项目开发效率提升工具-JBolt插件使用简介

本文主要介绍一下在使用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插件

Jbolt插件官网:http://jbolt.cn

三、JBolt插件下载与安装

1、Eclipse版本需要4.7以上的,所以推荐开发者直接Eclipse官网下载最新版的package zip版,下载到本地解压即可。 

2、jbolt官网下载插件jar包下载JBolt插件的jar最新版1.9.83、下载后解压放入eclipse解压目录下的plugins目录里放在plugins下两个jar4、重启Eclipse 看到顶部有JBolt的菜单,console里输出JBolt信息,表示安装加载成功重启后有菜单5、切换JBolt视图切换为JBolt视图6、下载所有依赖 在JBolt Homeview上点击提示的update libs按钮 下载所有依赖的三方类库和模板文件点击更新 libs等待完成完成了7、finish后就可以正常使用了

四、使用JBolt创建项目

JBolt目前可以创建两种类型的项目,基于JFinal的maven工程和基于JFinal的普通动态web工程,常用的肯定是maven工程了,更方便管理。 可以快速创建工程的地方有很多。创建工程new 菜单1、maven基础信息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。打开默认生成的Index页面

七、一键打包

我们在创建项目的时候默认选择的是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后缀,自动把光标移入到最前面。快速创建Controller

问题:如果系统里有公用的JBoltBaseController.java,规定所有的Controller必须继承这个,如何处理呢?

有办法:

找到settings找settings在这里配置自己需要继承的SuperClass或者要实现的Interfaces就好了。配置需要的superClass即可再次新建Controller的时候,已经可以了。自动继承是不是好方便的!

九、数据库转Java Model代码生成

JFinal里内置的代码生成器,但是需要自己编码实现定制,有些麻烦,在插件里提供了快速生成的功能。 1、项目上右键 找生成启动代码生成2、配置数据源 默认读取创建项目的配置选择数据库数据源3、选择要生成的表和相关配置表生成配置4、一键生成控制台有输出生成日志生成的代码目录:生成的代码生成的Model和映射关系,以及字典文件:具体代码字典文件

5、配置与启动

在MainConfig.java里已经生成了注释的配置映射的地方,解开注释,就可以正常启动并加载数据源了。mainconfig里的配置映射

6、测试读取数据:读取数据

十、模板引擎代码编辑器极速开发

html默认打开使用了JBolt插件里提供的EnjoyEditor编辑器打开。支持多种指令提示

同时支持html、css、js、Bootstrap代码块、Enjoy模板引擎指令、JBolt平台内置指令的代码提示。 相关使用有一个介绍视频可以点击看一下:

点击查看视频演示强大编辑器

模板编辑器

十一、总结

本文介绍了JFinal极速开发平台再Eclipse下的开发助手-JBolt插件的详细安装和使用,希望对JFinal开发者有所帮助。 关注我,为JFinal开发者提供更多好分享。



有问题加我微信

微信:mumengmeng

image.png


评论区

李小黑

2020-04-29 16:39

这边看到网盘分享 应该怎么下载

jay

2021-03-22 16:59

下载了1.9.8插件,放在eclipse安装目录下的plugins下,重启eclipse后没有看到jbolt菜单

eclipse版本

Eclipse IDE for Java Developers (includes Incubating components)

Version: 2021-03 (4.19.0)
Build id: 20210312-0638

山东小木

2021-03-22 17:11

@jay 1、必须是package版eclipse 解压即用版 2、必须是jee版eclipse

jay

2021-03-25 14:32

@山东小木 嗯,原先不是jee版,换成jee版就可以了,多谢

热门分享

扫码入社