使用Idea 搭建Jfinal框架的maven项目,整合beetl模板渲染

本文详细介绍如何使用Idea和Maven搭建JFinal框架项目,包括整合beetl模板渲染和Redis缓存。涵盖数据库连接配置、自动生成Model文件、beetl模板配置及Redis插件使用等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       使用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进去的值

总结:好了,到这里呢,基本就结束了,博客写的很累,休息会,过程很详细,不会有问题,有的话,就百度在看看,很简单的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值