保存成功
订阅成功
保存失败,请重试
提交成功

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

11年老兵,CSDN签约讲师、微信小程序俱乐部站长、JFinal学院负责人、JBolt作者、Html2Wxml4J作者、JFinal weixin开源项目贡献、公众号(JFinal学院:jfinalxueyuan)
查看本场Chat

一、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.8 3、下载后解压放入 eclipse 解压目录下的 plugins 目录里 放在 plugins 下两个 jar 4、重启 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 开发者提供更多好分享。

还没有评论
评论
查看更多