JFinal框架基于Maven的WEB项目创建

习惯于Struts2和SpringMVC的朋友,肯定特别头疼一件事情,就是配置文件,大量的配置文件对于开发者来说及其不友好,虽然相比于很早期的项目开发来说配置文件算是进步,但是今天来开,似乎仍有提升空间。
那么今天介绍一个零配置的Java WEB开发框架—JFinal。请注意重点:零配置。对,不需要写任何配置文件,这简直不要太爽。具体的介绍请朋友们自行搜索,官方手册描写的极其详细,看起来今天写的博客有点没什么卵用,不过我依旧相信哪怕是有人看过了手册,也不见得,就真的就能很快的通过手册创建一个JFinal项目。
首先创建一个Maven项目,选用war,毕竟jFinal是WEB框架。然后添加Maven的依赖Dependences如下:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>26Dec2008</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160212</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>

每个包干嘛用的请自行百度。接下来就是很有意思的东西了,如果你用过Spring整合Mybatis的话(其他配置类型的项目框架都行),那么你一定会做一件事情,就是把数据表和实体数据做一个映射,通过配置文件也好,其他方式也好,这样Dao层才好编写。
那么jFinal提供了一个生成工具,可以通过该工具直接完成上述工作,也是实现实体表映射零配置的一个途径,下面介绍几个关键类:
BaseModel 是用于被最终的 Model 继承的基类,所有的 getter、 setter 方法都将生成在此文件内,这样就保障了最终 Model 的清爽与干净, BaseModel 不需要人工维护,在数据库有任何变化时重新生成一次即可。
MappingKit 用于生成 table 到 Model 的映射关系,并且会生成主键/复合主键的配置,也即在 JFinal 2.1 中无需在 configPlugin(Plugins me)方法中书写任何样板式的映射代码。
DataDictionary 是指生成的数据字典,会生成数据表所有字段的名称、类型、长度、备注、是否主键等信息。
上面的描述来自官方手册,并且也提供了Generator生成工具,而我们需要做的就是修改该工具然后根据我们的项目配置生成上述类,上代码:

public class MyGenerator {
    private static Prop config = PropKit.use("mysql.txt");
    public static DataSource getDataSource() {
        DruidPlugin dp = new DruidPlugin(config.get("jdbcUrl"),   
        config.get("user"), config.get("password").trim());
        dp.start();
        return dp.getDataSource();
    }
    public static void main(String[] args) {
        // base model 所使用的包名
        String baseModelPackageName = "com.bubbling.model.base";
        // base model 文件保存路径
        String baseModelOutputDir = PathKit.getWebRootPath() + 
        "/src/main/java/com/bubbling/model/base";
        // model 所使用的包名 (MappingKit 默认使用的包名)
        String modelPackageName = "com.bubbling.model";
        // model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
        String modelOutputDir = baseModelOutputDir + "/..";
        // 创建生成器
        Generator gernerator = new 
        Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
        // 设置数据库方言
        gernerator.setDialect(new MysqlDialect());
        // 添加不需要生成的表名
        gernerator.addExcludedTable("adv");
        // 设置是否在 Model 中生成 dao 对象
        gernerator.setGenerateDaoInModel(true);
        // 设置是否生成字典文件
        gernerator.setGenerateDataDictionary(true);
        // 设置需要被移除的表名前缀用于生成modelName。例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非 OscUser
        gernerator.setRemovedTableNamePrefixes("t_");
        // 生成
        gernerator.generate();
    }
}

关键位置已经做了注释,一定要注意数据源的配置,不能出错,不然会找不到。一旦生成好了,刷新包位置,你会很惊讶的发现如下类:
这里写图片描述
太神奇了,其中_MapplingKit.java中的主要逻辑如下:
这里写图片描述
这里描述了整个所有表映射信息,包括主键复合键等,并且和实体类做了关联。
在随便看一下Base*.java,你会发现这是一个标准的bean:
这里写图片描述
如果有它的话,我们在写代码的时候就会有提示咯,在取字段操作的时候会非常方便,最后再看一下实体类:
这里写图片描述
嗯哼,已经帮我们做了一个静态的dao成员,通过它可以非常方便的调用数据库交互的一些方法,爽爆了有木有,连编写数据库操作的代码都可以不用写了,当然如果有特殊查询的话,你还是要写的,毕竟jFianl不能把所有的操作逻辑都帮我们搞定,但是这已经很强大了有木有。
最后最后的数据字典文件:
这里写图片描述
太强了,有了这些文件,我们在开发的时候不要太便利的说!!
到此为止,和数据源相关的设置已经ok,我真的没有写任何的配置文件,三分钟搞定所有的工作,剩下最后的一步就是如何配置jFianl了,因为这个项目是基于jFinal的,那么我们需要让容器知道如何启动它!
web.xml中添加如下代码:

<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.bubbling.common.config.MyConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

ok,搞定,请注意filter中有个标签<param-value>这里我填写一个MyConfig!!这是关键,因为我们的项目需要一个java文件,该类一定继承自JFinalConfig,这就是我们整个项目的总体配置!

/**
 * API引导式配置
 */
public class MyConfig extends JFinalConfig {
    public static Prop config;
    static {
        config = PropKit.use("mysql.txt");
    }
    /**
     * 配置常量
     */
    public void configConstant(Constants me) {
        me.setDevMode(PropKit.getBoolean("devMode", false));

    }
    /**
     * 配置路由
     */
    public void configRoute(Routes me) {
        //me.add("/", IndexController.class, "/WEB-INF/view");
    }

    public static DruidPlugin creatDruidPlugin() {
        config.get("user"),
        config.get("password").trim());
    }
    /**
     * 配置插件
     */
    public void configPlugin(Plugins me) {
        DruidPlugin druidPlugin = creatDruidPlugin();
        druidPlugin.addFilter(new StatFilter());
        WallFilter wall = new WallFilter();
        wall.setDbType(JdbcConstants.MYSQL);
        druidPlugin.addFilter(wall);
        me.add(druidPlugin);
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
        arp.setShowSql(true);
        me.add(arp);
        _MappingKit.mapping(arp);
    }
    /**
     * 配置全局拦截器
     */
    public void configInterceptor(Interceptors me) {
    }

    /**
     * 配置处理器
     */
    public void configHandler(Handlers me) {
    }
}

1、路由
2、插件
3、处理器
4、拦截器
5、常量
以上是整个项目的全局配置,如果需要模块细分,那么jFinal也提供了对应的配置方法,允许我们在不同的模块中配置。至此jFinal项目就搭建完成了,部署到服务器,就可以运行了!
整个项目的创建可以说非常的简单,几乎不需要操作任何东西,这也是jFinal的强大之处,它就是要让我们通过少量代码实现复杂的功能,并且实现零配置来化简项目。
这里还有一点需要说明,虽然通过Generator可以快速的实现数据和实体类的映射,但是我们也要为此付出代价:就是每次更新数据源的时候都需要重新生成,而且很多model在实际项目中并没有用处,再有就是如果需要添加个性化的model还是需要手动配置它,最关键的这样做对组件化分离设计操成了不小的影响。
那么合理的解决方案应该是添加一个自动扫描的功能,编写model的时候通过某种方式来实现自动注册,这个功能我后面会研究下。
GOOD LUCK!

相关内容推荐