本文主要介绍一下在使用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、一键生成 666POM.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