这些天,应公司的需求,说有个新项目需要用到jfinal框架,让我去了解一下。一开始抱着尝试的心态去耍一耍,然后发现这个框架是真的好用,虽然这些天的摸索也入了不少坑,还有好些功能没用上,但是评价还是两个字真棒。
需求:搭建一个简单的jfinal项目
环境:jdk1.8 mvn3.5 mysql8.0
1. 首先需要准备好一个maven项目,项目的结构如下:
2. 在pom.xml中引入如下依赖:
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>4.3</version>
</dependency>
3. 添加配置项内容(可以参考jfinal官网最新的jfinal-maven项目),如下:
static Prop p;
/**
* 启动入口,运行此 main 方法可以启动项目,此 main 方法可以放置在任意的 Class 类定义中,不一定要放于此
*/
public static void main(String[] args) {
UndertowServer.start(TestConfig.class);
}
/**
* PropKit.useFirstFound(...) 使用参数中从左到右最先被找到的配置文件
* 从左到右依次去找配置,找到则立即加载并立即返回,后续配置将被忽略
*/
static void loadConfig() {
if (p == null) {
p = PropKit.useFirstFound("config-pro.txt", "config-dev.txt");
}
}
/**
* 配置常量
*/
@Override
public void configConstant(Constants me) {
loadConfig();
me.setDevMode(p.getBoolean("devMode", false));
/**
* 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层,并且自动实现 AOP
* 注入动作支持任意深度并自动处理循环注入
*/
me.setInjectDependency(true);
// 配置对超类中的属性进行注入
me.setInjectSuperClass(true);
}
/**
* 配置路由
*/
@Override
public void configRoute(Routes me) {
}
/**
* 配置插件
*/
@Override
public void configPlugin(Plugins me) {
}
/**
* 配置引擎模板
*
*/
@Override
public void configEngine(Engine me) {
}
/**
* 可以添加自定义的handler,handler对所有的web请求有着完全的控制权
*
*/
@Override
public void configHandler(Handlers me) {
}
/**
* 配置全局拦截器
*
*/
@Override
public void configInterceptor(Interceptors me) {
}
4. 添加一个测试接口,如下:
public void test() {
renderText("欢迎来到测试接口");
}
5. 在TestConfig的配置路由的方法内添加路由,如图所示:
6. 测试
6.1 启动TestConfig中的mian方法,控制台输出如下图:
6.2 在浏览器上输入url:http://localhost/test,结果如图:
7. 之后需要连接数据库,用生成器生成model,在配置文件config-dev.txt中添加连接信息,如下:
# config
jdbcUrl = jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
username = root
password = 123456
devMode = true
注意:我这边在mysql中的test库中建立了一张ujfinal表,内容如图:
8. 这边使用的数据库是mysql,连接池是druid,所以需要添加2个依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.18</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
9. 只需要导出test库中的一个ujfinal表,为此添加了一个MetaBuliderUtil 工具类,如下:
public class MetaBuliderUtil extends MetaBuilder {
private String tablePrefix;
public MetaBuliderUtil(DataSource dataSource) {
super(dataSource);
}
public void setTablePrefix(String tablePrefix){
this.tablePrefix = tablePrefix;
}
@Override
protected boolean isSkipTable(String tableName){
return !tableName.contains(tablePrefix);
}
}
10. 编写生成器,如下:
public class _JFinalGenerator {
public static DataSource getDataSource() {
Prop p = PropKit.use("config-dev.txt");
DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("username"), p.get("password"));
druidPlugin.start();
return druidPlugin.getDataSource();
}
public static void main(String[] args) throws URISyntaxException {
// base model 所使用的包名
String baseModelPackageName = "com.yzp.jfinaltest.model.base";
// base model 文件保存路径
String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/yzp/jfinaltest/model/base";
// model 所使用的包名 (MappingKit 默认使用的包名)
String modelPackageName = "com.yzp.jfinaltest.model";
// model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
String modelOutputDir = baseModelOutputDir + "/..";
// 创建生成器
Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir,
modelPackageName,modelOutputDir);
// 配置是否生成备注
generator.setGenerateRemarks(true);
// 设置数据库方言
generator.setDialect(new MysqlDialect());
// 添加需要生成的表名(添加了需要生成表名的工具,测试用)
MetaBuliderUtil metaBulider = new MetaBuliderUtil(getDataSource());
// 数据库表名包含字段(可以是数据库全名,否则所有包含字段的表都将生成)
metaBulider.setTablePrefix("ujfinal");
generator.setMetaBuilder(metaBulider);
// 设置是否生成链式 setter 方法
generator.setGenerateChainSetter(false);
// 添加不需要生成的表名
// generator.addExcludedTable("adv");
// 设置是否在 Model 中生成 dao 对象
generator.setGenerateDaoInModel(false);
// 设置是否生成字典文件
generator.setGenerateDataDictionary(false);
// 生成
generator.generate();
}
}
11. 在model下建一个base包,用于存放生成的model,当前项目结构如下:
12. 在_JFinalGenerator运行主方法后,控制台输出结果如下:
13. 最后的项目结构如图:
14. 之后就是前后台间的数据交互了,有时间再补充。