`
wuhuizhong
  • 浏览: 668681 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

快速上手JFinal

    博客分类:
  • Java
阅读更多

JFinal是国产的MVC框架,由 Handler、Interceptor、Controller、Render、Plugin 五大部分组成。本文通过一个例子上手JFinal,旨在熟悉JFinal中各组件的用法。

目标

  • 用户登录/注册
  • 用户上传图片
  • 登录权限验证

访问路径

用户登录:IP/user/login
用户注册:IP/user/register
用户上传图片:IP/user/image
登录后能访问: IP/user/show

依赖

  • druid-1.0.5.jar
  • cos-26Dec2008.jar
  • jfinal-2.0-bin.jar
  • log4j-1.2.16.jar

AppConfig

JFinal需要一个继承 JFinalConfig 的子类,我们这里取名叫AppConfig,这个类的名字是随便取的,我这里取AppConfig。

import com.jfinal.config.*;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import controller.IndexController;
import controller.UserController;
import model.User;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class AppConfig extends JFinalConfig{

@Override
public void configConstant(Constants constants) {
    constants.setEncoding("UTF-8");
    constants.setDevMode(true);
    constants.setViewType(ViewType.JSP);
}

@Override
public void configRoute(Routes routes) {
    routes.add("/", IndexController.class);
    routes.add("/user", UserController.class);
}

@Override
public void configPlugin(Plugins plugins) {
    //这里启用Jfinal插件

 PropKit.use("jdbc.properties");
    final String URL =PropKit.get("jdbcUrl");
    final String USERNAME = PropKit.get("user");
    final String PASSWORD =PropKit.get("password");
    final Integer INITIALSIZE = PropKit.getInt("initialSize");
    final Integer MIDIDLE = PropKit.getInt("minIdle");
    final Integer MAXACTIVEE = PropKit.getInt("maxActivee");

    DruidPlugin druidPlugin = new DruidPlugin(URL,USERNAME,PASSWORD);
    druidPlugin.set(INITIALSIZE,MIDIDLE,MAXACTIVEE);
    druidPlugin.setFilters("stat,wall");
    plugins.add(druidPlugin);

    ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
    activeRecordPlugin.addMapping("user","userid", User.class);
    plugins.add(activeRecordPlugin);

}

@Override
  public void configInterceptor(Interceptors interceptors) {
        //这里用于配置全局的拦截器,对所有请求进行拦截

}

@Override
    public void configHandler(Handlers handlers) {

}
}

配置文件

Jdbc.properties

在根目录下新建一个Jdbc.properties,用来保存数据库连接信息。我们在AppConfig中需要加载它,使用了JFinal的工具类PropKit。

driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/school
user=root
password=root

initialSize=1
minIdle=1
maxActivee=20

log4j.properties

这样就能使用log4j进行日志统计,在需要记录的地方获取logger对象即可

log4j.rootLogger=INFO, stdout, file
log4j.appender.stdout.Target=System.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n

# Output to the File
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=./web.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n

# Druid
log4j.logger.druid.sql=warn,stdout
log4j.logger.druid.sql.DataSource=warn,stdout
log4j.logger.druid.sql.Connection=warn,stdout
log4j.logger.druid.sql.Statement=debug,stdout
log4j.logger.druid.sql.ResultSet=warn,stdout

web.xml

然后在web.xml里配置JFinal的核心filter和我们写好的AppConfig

  <filter>
        <filter-name>jfinal</filter-name>
        <filter-class>com.jfinal.core.JFinalFilter</filter-class>
        <init-param>
            <param-name>configClass</param-name>
            <param-value>AppConfig</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Model

定义用户实体,代码非常简单

package model;

import com.jfinal.plugin.activerecord.Model;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class User extends Model<User>{
}

继承Model就行了,无需 getter、setter 方法,无需Annotation,无需xml

这里数据库中user设计也很简单,就三个字段,userid,username,password,贴下sql:

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

Service

service层,封装业务逻辑。这里用到了ActiveRecord插件,需要在AppConfig中注册。

   public void configPlugin(Plugins plugins) {
        //这里启用JFinal插件

        DruidPlugin druidPlugin = new DruidPlugin(URL,USERNAME,PASSWORD);
        druidPlugin.set(INITIALSIZE,MIDIDLE,MAXACTIVEE);
        druidPlugin.setFilters("stat,wall");
        plugins.add(druidPlugin);

        ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin);
        //添加Model类和数据库表的映射。user指的是表名,userid指的是主键
        activeRecordPlugin.addMapping("user","userid", User.class);
        plugins.add(activeRecordPlugin);

    }

数据库连接池使用的是Druid,JFinal还支持C3P0。
JFinal使用的是Db+Record 完成ORM。Db类提供了大量查询的方法,这种模式类似于ruby on rails。

package service;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class UserService {

    public boolean add(String username,String password){
        String SQL = "SELECT userid FROM user WHERE username =?";
        Integer result = Db.queryFirst(SQL, username);
        if(result==null){
            Record user = new Record().set("username", username).set("password", password);
            Db.save("user", user);
            return true;
        }
        return false;
    }

    public boolean login(String username,String password){
        String SQL = "SELECT userid FROM user WHERE username =? and password=?";
        Integer result = Db.queryFirst(SQL, username, password);
        if(result!=null)
            return true;
        else return false;
    }
}

Interceptor

JFinal里的拦截器有三个作用域,全局,类和方法。利用JFinal的AOP,使用起来也非常方便。拦截器定义也非常简单,只需继承Interceptor接口重写intercept方法。全局的拦截器是在AppConfig里配置:

 public void configInterceptor(Interceptors interceptors) {
        //这里用于配置全局的拦截器,对所有请求进行拦截

        // 添加控制层全局拦截器
        interceptors.addGlobalActionInterceptor(new GlobalActionInterceptor());
        // 添加业务层全局拦截器
        interceptors.addGlobalServiceInterceptor(new GlobalServiceInterceptor());
}

类和方法使用@Before(Class.class)即能使用,具体可以看下面Controller的例子。在JFinal2还提供了Inject拦截器,不过我们的例子里没这需求,所以没用到,具体各位还是看官网文档吧。

AuthInterceptor

简易的权限拦截器,这里的作用是只有登录的才能执行。在session里设置了一个变量flag,当是true时就执行。

package interceptor;


import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class AuthInterceptor implements Interceptor {

    @Override
    public void intercept(Invocation invocation) {
        Controller controller = invocation.getController();
        Boolean loginUser = controller.getSessionAttr("flag");
        if (loginUser ==true )
            invocation.invoke();
        else
            controller.redirect("/");
    }
}

LoginValidator

Validator是JFinal提供的校验组件。其核心是Interceptor,所以用法和Interceptor类似,继承Validator类即可。

  • validate
    提供了一系列的validateXXX方法

  • handleError
    处理错误,常见的用法是

    controller.keepPara();
    controller.render("register.html");
    

    意思是返回原页面,保持传入的参数。

 

package validator;

import com.jfinal.core.Controller;
import com.jfinal.validate.Validator;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class LoginValidator extends Validator {
    @Override
    protected void validate(Controller c) {
        validateRequiredString("username","nameError","username is null");
        validateRequiredString("password","passError","username is null");
    }

    @Override
    protected void handleError(Controller c) {

    }
}

Controller

JFinal的Controller需要继承Controller类,类的映射是在AppConfig中配置:

public void configRoute(Routes routes) {
    routes.add("/", IndexController.class);
    routes.add("/user", UserController.class);
}

我们这里配置意思是/访问到IndexController这个类,/user 访问到UserController。/user/login 默认访问UserController.login()方法,这点类似于struct2,如果之前有基础,上手会非常快。

UserController

映射 /user,在login()上使用了校验拦截器LoginValidator,show()使用了权限拦截器AuthInterceptor。

package controller;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import interceptor.AuthInterceptor;
import service.UserService;
import validator.LoginValidator;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class UserController extends Controller{

    private UserService userService = new UserService();

    public void index(){}

    @Before(LoginValidator.class)
    public void login(){
        String username = getPara("username");
        String password = getPara("password");
        boolean loginCheck = userService.login(username,password);
        if(loginCheck){
            renderJson("10000");
            getSession().setAttribute("flag",true);
        }

        else
            renderJson("10001");
    }

    public void register(){
        String username = getPara("username");
        String password = getPara("password");
        boolean result = userService.add(username,password);
        if(result)
            renderJson("10010");
        else
            renderJson("10011");
    }

    @Before(AuthInterceptor.class)
    public void show(){
        renderJsp("user.jsp");
    }

    public void image(){
        try{
            getFile(getPara("img"),"UTF-8");
            renderJson("20010");
        } catch (Exception e){
            renderJson("20012");
        }
    }
}
  • getPara() 从请求中获取参数
  • getFile() 支持文件上传
  • renderJson() 返回JSON,JFinal提供了一系列的render方法,目前支持的视图类型有:
    FreeMarker、JSP、Velocity、JSON、File、Text、Html 等等。

IndexController

package controller;

import com.jfinal.core.Controller;

/**
 * Created by reeco_000 on 2015/7/22.
 */
public class IndexController extends Controller{

    public void index(){
        renderJsp("index.jsp");
    }
}

index是Controller默认调用的方法

总结


最后整个工程的文件如上图所示,代码非常简单,我也就不上传献丑了。主要介绍了JFinal的Interceptor、Controller、Render、Plugin,Handler是对Controller和Interceptor的补充。ORM使用的是Db+ActiveRecord。JFinal还有很多组件没有提到,各位请到官网查看详细文档。

分享到:
评论

相关推荐

    Android代码-安卓低功耗蓝牙ble快速上手

    安卓低功耗蓝牙ble快速上手 最近项目中用到蓝牙ble的需求,于是把蓝牙代码整合起来,方便调用。 第一次传代码到github,不足之处,希望大家多支持支持 功能特点: 1.简洁明了,蓝牙业务与ui充分解耦 项目会一直维护...

    sql大全,Ajax中文手册(快速上手).chm,DHTML 手册.chm,java 1.6 api.chm,JAVA设计模式.chm,oracle_sql.chm,spring2.0-reference_final_zh_cn.chm,Spring+in+Action中文版.chm,全新java基础实践教程.chm

    sql大全,Ajax中文手册(快速上手).chm,DHTML 手册.chm,java 1.6 api.chm,JAVA设计模式.chm,oracle_sql.chm,spring2.0-reference_final_zh_cn.chm,Spring+in+Action中文版.chm,全新java基础实践教程.chm 本人QQ:...

    Miranda IM v0.10.67 Final 官方版.zip

    软件界面美观简洁、简单全面、实用方便,可快速上手,轻轻松松完成日常实时通讯功能,真正做到简单全面实用。是用户实现实时通讯功能的好帮手. Miranda IM v0.10.67 Final 官方版更新日志 1、修复最大化窗口打开的...

    EasySysprep_3.1Final

    我们认真对待每一个 Beta 或 RC版的态度,获得了广大用户的好评,每一个Beta或RC版步步为营的策略让 Easy Sysprep v3 在Final版本发布前就已经有了庞大的使用者。据调查,半数以上的 Windows XP 封装作品(系统映像...

    ASTRA32 v3.40 Final.zip

    今天小编给大家带来的这款ASTRA32是一款非常好用...软件界面美观简洁、简单全面、实用方便,可快速上手,轻轻松松完成日常硬件信息检测功能,真正做到简单全面实用。是用户实现硬件信息检测功能的好帮手。 ASTRA32截图

    Xplorer2Pro(资源管理器)v3.201Final官方免费安装版

    xplorer2是2xExplorer的后续版本,xplorer2拥有全新的界面,和系统的资源管理器一模一样的操作,让你不用学习即可快速上手。xplorer2体积小巧,仅仅功能却很丰富,可以让双窗口垂直分割和横行分割,强大的快捷键,...

    强大的资源管理器Xplorer2Litev3.2.0.2Final多国语言安装版

    xplorer2是一个功能丰富的文件管理工具,和系统的资源管理器一模一样的操作,让你不用学习即可快速上手 可以以双窗口垂直分割和横行分割,有强大的快捷键,一键新建文件夹,分割文件,合并文件,不用按照压缩软件...

    竞赛资料源码- 精品旅行服务成单预测 final rank 11.zip

    这些源码经过测试和验证,可以直接运行,方便学生快速上手并开始实践。 【应用场景】: 竞赛准备:适用于各种教育部认可的竞赛,如全国电子设计大赛、全国大学生智能汽车竞赛等,他们可以借助这些资料了解竞赛的...

    搜狗拼音输入法 3.0 Final┊支持三种主流输入法词库导入┊论坛预览绿色免费版

    输入法打字入门flash教程,特别为新手制作的动画教程,让您快速上手。 &lt;br&gt;功能改进: 1. 系统词库扩充,收录更多词条,词库质量更佳; 2. 智能组词核心算法改进,准确率再次提升,输入更加流畅; ...

    调整配置和安装驱动完美驱动黑苹果.pdf

    系统是包安装好的吧,发货的时候给我装个win10系统,其实特别好理解,大部分人将win10系统自然作为第一选择,因为市场占有率高用户人群庞大兼容性强游戏多的软硬件及office套件,快速上手的操作体验这些我们大家都...

    netty-example.rar(4.1.7)

    Netty是一个比较流行的框架,学习最好的资源就是官方提供的demo,由于Netty是开源项目,直接可以把代码check下来,但是编译比较复杂,想快速上手的话可以单独编译子模块example即可,但是pom.xml需要进行改造,本文档...

    微服务系列第七季-Java面向对象中的继承

    微服务系列课程是以Java语言为基础,以SpringCloud+SpringBoot为核心,结合Spring、SpringMVC及MyBatis,通过游戏案例、电商案例,以极简的方式,带领入门的朋友们快速上手微服务开发。全部案例源码分享给学习的朋友...

    基于Pytorch框架的多头选择方法实现中文命名实体识别python源码+使用说明+模型+数据集.zip

    该项目是个人毕设/课设/大作业项目,代码都经过本地调试测试,功能ok才上传,高分作品,可快速上手运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、...

    FrescoUtils-master

    &lt;h4&gt;Fresco 的封装,快速上手,图像后处理,超大图高清预览,缩小放大,双击放大等一一俱全。 ====================== [![](https://jitpack.io/v/CarGuo/FrescoUtils.svg)]...

    系统封装 EasySysprep4.rar

    我们认真对待每一个 Beta 或 RC版的态度,获得了广大用户的好评,每一个Beta或RC版步步为营的策略让 Easy Sysprep v3 在Final版本发布前就已经有了庞大的使用者。据调查,半数以上的 Windows XP 封装作品(系统映像...

    Hibernate3的帮助文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2...

    hibernate 教程

    在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory...

    hibernate

    在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory...

    hibernate 框架详解

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

Global site tag (gtag.js) - Google Analytics