使用Idea 搭建Jfinal框架的maven项目,整合beetl模板渲染,我之所以一直要执着于这个工程的完成,是因为,我上一家公司采用的就是以上的模式,但是早年晦涩,不是很明白框架的搭建和基本的技术原理,所以在有空的时候有再次看了一下框架的组合,不得不感叹,jfinal已经升级到3的版本了,真是快,而目前的项目依然是采用mvc的ssm,总的来说这个很复杂,因为有很多的mxl文件需要配置,必须要小心谨慎,不然,项目怎么都不会跑起来。
使用Jfinal的好处自然不用多说了,无论是官方还是各位技术大拿都分享了很多经验,有很多经验和博客可以参考名主要就把使用beetl和自动生成model文件还有redis的简单使用终点说明一下
一,maven搭建jfinal可以参照以下博客,这里不再多说,因为比较详细
1,https://blog.youkuaiyun.com/bad00temper/article/details/79483524
2,https://blog.youkuaiyun.com/zalan01408980/article/details/79371958
二,在WebConfig里添加自动生成model及数据字典
1,在基础类配置里,添加连接数据库方法
/**
* 数据库连接
*/
public static DruidPlugin createDruidPlugin() {
PropKit.use("a_little_config.txt");
return new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
}
2 a_little_config.txt是在Recouse文件里的资源配置文件,用来连接数据库
jdbcUrl = “” //数据库地址
user = “” //用户名
password =“” //密码
devMode = true
redisIpAddress = 127.0.0.1 //redis 服务器地址
3 然后开始配置生成文件的插件,这里做了连接数据库的插件和Redis的插件配置
/**
* 设置Jfinal插件依赖
*/
@Override
public void configPlugin(Plugins plugins) {
//配置C3p0数据库连接池插件
DruidPlugin dp = createDruidPlugin();
plugins.add(dp);
/**
* 配置ActiveRecord插件
*
* ActiveRecord是什么:
* 1. 每一个数据库表对应创建一个类.类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;
* 2. ActiveRecord同时负责把自己持久化. 在ActiveRecord中封装了对数据库的访问, 即CRUD;
* 3. ActiveRecord是一种领域模型(Domain Model), 封装了部分业务逻辑;
*
* @see http://houzhe11.iteye.com/blog/494296
*
*/
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
// 所有映射在 MappingKit 中自动化搞定
MappingKit.mapping(arp);
arp.setDialect(new MysqlDialect());
plugins.add(arp);
/**
* redis配置
*
* 按需求配置
*/
RedisPlugin rpTicket = new RedisPlugin(Consts.REDIS_TICKET, PropKit.get("redisIpAddress"));
plugins.add(rpTicket);
RedisPlugin rp = new RedisPlugin(Consts.REDIS_ACCESSTOKEN, PropKit.get("redisIpAddress"));
plugins.add(rp);
//Redis测试
RedisPlugin test = new RedisPlugin("testCache", PropKit.get("redisIpAddress"));
plugins.add(test);
}
4,注意:这一个类很重要,就是用它来生成model及各类基础文件
package com.win.commom;
import com.jfinal.kit.PathKit;
import com.jfinal.plugin.activerecord.generator.Generator;
import com.jfinal.plugin.druid.DruidPlugin;
import javax.sql.DataSource;
/**
* @author Quan on 18.8.14
* <p>
* jfinal框架使用jar自动创建model等基础文件
*/
public class JFinalGenerator {
/**
* 启动数据源
*/
public static DataSource getDataSource() {
DruidPlugin druidPlugin = WebConfig.createDruidPlugin();
druidPlugin.start();
return druidPlugin.getDataSource();
}
/**
* 使用方法:
* 点击此类运行mian(),
* 会在项目里自动生成model(即 dao mapper),
* 在model下的base文件里生成BaseModel(即 model)
*/
public static void main(String[] args) {
// BaseModel 所使用的包名 在com.winkind.model下
String baseModelPackageName = "com.win.model.base";
// BaseModel 文件保存路径
String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/wink/model/base";
// 自动生成的MappingKit 所使用的包名 (MappingKit 默认使用的包名)
String modelPackageName = "com.wink.commom";
// com.winkind.model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
String modelOutputDir = baseModelOutputDir + "\\..";
// 创建生成器
Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
/**
* 添加不需要生成的表名(看实际使用)
*/
//generator.addExcludedTable("adv");
// 设置是否在 Model 中生成 dao 对象
generator.setGenerateDaoInModel(true);
// 设置是否生成字典文件
generator.setGenerateDataDictionary(true);
// 设置需要被移除的表名前缀用于生成modelName。
// 例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非 OscUser
generator.setRemovedTableNamePrefixes("t_");
// 生成
generator.generate();
}
}
这里注释很清楚,我们通过他来配置要生成的文件,以及要保存文件的所在位置,建议文件包要建立的清楚一些,比如先建立com.wink包,然后在它的包里在建立Contriller或者model的文件夹,这样生成的文件就会按你的设置出现在包下。这里他会生成你连接数据库下的所有表的model,并且生成baseModel文件和传统不一样的是,model里就只有一条语句,和mapper.java文件的左右类似,而baseModel才是model里的get和set,并且会生成一个特殊的文件,就是MappingKit.java 这个文件是你生成的model里的关联表
我们来看一看
package com.wink.model;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
/**
* @author Jfinal
* Generated by JFinal, do not modify this file.
* <pre>
* Example:
* public void configPlugin(Plugins me) {
* ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
* MappingKit.mapping(arp);
* me.add(arp);
* }
* </pre>
*/
public class MappingKit {
public static void mapping(ActiveRecordPlugin arp) {
arp.addMapping("t_easy_code", "id", EasyCode.class);
arp.addMapping("t_excel", "id", Excel.class);
arp.addMapping("t_manager", "id", Manager.class);
arp.addMapping("t_managerinfo", "id", Managerinfo.class);
arp.addMapping("t_news", "id", News.class);
arp.addMapping("t_student", "id", Student.class);
arp.addMapping("t_student_teacher", "id", StudentTeacher.class);
arp.addMapping("t_teacher", "id", Teacher.class);
arp.addMapping("t_teacherinfo", "id", Teacherinfo.class);
arp.addMapping("t_test", "id", Test.class);
arp.addMapping("t_test_map", "id", TestMap.class);
arp.addMapping("t_user", "id", User.class);
arp.addMapping("t_user_facem", "id", UserFacem.class);
arp.addMapping("t_user_facet", "id", UserFacet.class);
arp.addMapping("t_weixin_user", "id", WeixinUser.class);
}
}
好了,到这里我,我们就配置了第一个插件,运行一下就可以生成所需的文件,现在,我们看一下项目目录

model文件夹下生成了所以我们需要的文件,那么我们就可以来做下边的渲染
二,beetl模板文件渲染
1,同样的我们现在WebConfig类里配置插件
/**
* Jfinal 配置常量
*/
@Override
public void configConstant(Constants me) {
//设置编码格式
me.setEncoding("UTF-8");
//设置为开发模式(如果为fals,jfinal会缓存页面,导致开发时修改页面后不能立即呈现)
me.setDevMode(true);
// 加载少量必要配置,随后可用getProperty(...)获取值
loadPropertyFile("a_little_config.txt");
//Jfina3(2.7.10)以后版本的beetl模板加载
JFinal3BeetlRenderFactory rf = new JFinal3BeetlRenderFactory();
rf.config();
me.setRenderFactory(rf);
GroupTemplate gt = rf.groupTemplate;
//根据gt可以添加扩展函数,格式化函数,共享变量等,
}
jfinal使用beetl是非常方便的,只需要一段代码,但是需要看你的jfinal的版本,官方文档已说明,3不兼容2,需要注意,这里我也走了弯路,目前的博客都是之前的版本,所以需要参考,并结合beetl的官方文档
有个文件很重要 beetl.properties,这里先加载默认的配置文件,然后才是他,这里就相当于定义html的指定路径
#默认加载此文件,相当于定义html末班路径
RESOURCE.root=/WEB-INF/html
2,为什么我这里说的很详细呢,因为在此之前我走了弯路,所以希望有人不要再走弯路,很显然你的html文件放在WEB-INF文件夹下,在WebConfig里的路由配置里需要说明
/**
* 统一设置映射访问路径
* 类似于spring mvc的@RequestMapping
*/
@Override
public void configRoute(Routes routes) {
//第三个参数为该Controller的视图存放路径
routes.add("/", UserController.class, "/index");
routes.add("/news", NewsController.class,"/index");
}
就是说你的html文件如果是以包的形式在html包里的形如html/index,那么你的controller里的页面指向就应该在这里写文件名,这里的是2个controller里指向的都在html下的index下的.html文件
3,接下来就是一整套方法到页面,这里登陆为例
controller
public class UserController extends Controller {
UserService userService = new UserService();
public void index() {
render("login.html");
}
public void login() {
String userName = getPara("userName");
String password = getPara("password");
if (userName.isEmpty() || password.isEmpty()) {
renderText("用户名或密码不能为空");
} else {
if (userName.equals(userName) && password.equals(password)) {
User user = userService.login(userName, password);
if (user != null) {
render("index.html");
} else {
render("login.html");
}
} else {
renderText("用户名或密码错误!");
}
}
}
}
service
/**
* @author Quan on 18.8.15
* Jfinal 框架 数据操作
*
* UserService 相当于mapper
* 但是没有 实现类和,mapper.xml
*
* 直接写sql
*/
public class UserService {
/**
* 登录
*
* @param userName
* @param password
* @return
*/
public User login(String userName, String password) {
return User.dao.findFirst("select * from t_user where status>0 and username=? and pasword=?", userName, password);
}
}
这里并没有serviceImpl,和mapper.xml文件,这确实很简洁
到这里,就很明了了,login方法点击一下就可以走了,好了,到目前为止我们的目的已经完成2个,还有就是redis的使用
三,Redis的使用,这里只做简单的应用,首先,你需要装redis,并运行起来,最好还有可视化的管理工具,这2个,我是不想再说了,可以自己百度解决一下
1,同样的我们现在WebConfig类里配置插件
/**
* 设置Jfinal插件依赖
*/
@Override
public void configPlugin(Plugins plugins) {
/**
* redis配置
*
* 按需求配置
*/
RedisPlugin rpTicket = new RedisPlugin(Consts.REDIS_TICKET, PropKit.get("redisIpAddress"));
plugins.add(rpTicket);
RedisPlugin rp = new RedisPlugin(Consts.REDIS_ACCESSTOKEN, PropKit.get("redisIpAddress"));
plugins.add(rp);
//Redis测试
RedisPlugin test = new RedisPlugin("testCache", PropKit.get("redisIpAddress"));
plugins.add(test);
}
这里的redisIpAddress,是需要自己配置的,是一个和a_little_config.txt文件内容一样的文件不过叫jdbc.properties的文件。可以参考a_little_config.txt文件
2,使用
public void testCache() {
Cache cache = Redis.use("testCache");
cache.set("userName", "陈独秀");
cache.set("phone", "18790926381");
}
public void getCache() {
Cache cache = Redis.use("testCache");
Object object = cache.get("userName");
System.out.println(object);
}
显然。这里就是一个get和一个set的操作
在这个可视化的工具里就可以查看数据了,同时输出就可以拿到你set进去的值
总结:好了,到这里呢,基本就结束了,博客写的很累,休息会,过程很详细,不会有问题,有的话,就百度在看看,很简单的,