[置顶] JFinal 3分钟入门(续)

关于项目框架的搭建j及appConfig中的configRoute()、configHandler()的功能在上篇博客已经介绍过了,这里不再赘述。本篇博文将把侧重点放在插件configPlugin()和拦截器configInterceptor()的介绍上。

添加依赖jar包

创建数据库jfinal和user表。

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;

在根目录下新建dbc.properties并配置数据库连接信息。

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

initialPoolSize=5
maxIdleTime=60
maxPoolSize=15
minPoolSize=2

在MyAppConfig.java中加载jdbc.properties文件。

[置顶] JFinal 3分钟入门(续)_第1张图片

定义user实体

package cn.tgb.model;

import com.jfinal.plugin.activerecord.Model;

/** * 继承Model即可,无需getter、setter方法,无需Annotation,无需xml * @author WYQ * */
public class User extends Model<User> {

}

service层

package cn.tgb.service;

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


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;              
    }
}

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

[置顶] JFinal 3分钟入门(续)_第2张图片

controller层

package cn.tgb.controller;

import cn.tgb.interceptor.AuthInterceptor;
import cn.tgb.service.UserService;
import cn.tgb.validator.LoginValidator;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;

public class UserController extends Controller {

    private UserService userService=new UserService();

    /* * 用户登录 */
    @Before(LoginValidator.class) 
    public void login(){
        String username=getPara("username");
        String password=getPara("password");
        boolean loginCheck=userService.login(username, password);
        if(loginCheck){
            renderJson("10001");
            getSession().setAttribute("falg", 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 editPersonInfo(){
        renderJsp("user.jsp");
    }
}

我们可以看到,在login()上使用了校验拦截器LoginValidator,editPersonInfo()使用了权限拦截器AuthInterceptor。

Validator是JFinal提供的校验组件。其核心是Interceptor,所以用法和Interceptor类似,继承Validator类即可。下面是LoginValidator 的业务处理:

package cn.tgb.validator;

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

public class LoginValidator extends Validator {

    @Override
    protected void validate(Controller c) {
        validateRequiredString("username","nameError","username is null");//校验用户名是否为空
        validateRequiredString("password","passError","passError is null");//校验密码是否为空
    }
    @Override
    protected void handleError(Controller c) {
    }   
}

JFinal里的拦截器有三个作用域,全局,类和方法。定义非常简单,只需继承Interceptor接口重写intercept方法,在方法的前后添加代码。类和方法使用@Before(Class.class)即能使用,全局拦截器需要在AppConfig中配置。

很显然这里用到的是方法拦截器,只在editPersonInfo()方法时才执行。根据用户登录成功时在session里设置了一个变量flag,当值为true时才可以执行。

package cn.tgb.interceptor;

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

public class AuthInterceptor implements Interceptor {

    @Override
    public void intercept(Invocation invocation) {
        Boolean loginUser=true;

        Controller controller=invocation.getController();       
        //判断用户是否有修改信息的权限
        loginUser=controller.getSessionAttr("flag");
        if(loginUser)
            invocation.invoke();
        else 
            controller.redirect("/");       
    }
}

接下来看一下全局拦截器。

[置顶] JFinal 3分钟入门(续)_第3张图片

package cn.tgb.interceptor;

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

//interceptor可以对方法进行拦截,并在方法前后添加切面,实现AOP的核心目标

public class GlobalActionInterceptor implements Interceptor {

    @Override
    public void intercept(Invocation inv) {
        System.out.println("-----action日志处理1------Before method---------");
        inv.invoke();//对目标方法的调用
        System.out.println("-----action日志处理1------After method---------");

    }
}

传统AOP实现需要引入大量繁杂而多余的概念,例如aspect、advice、joinpoint、poincut、introduction等等,并且需要引入IOC容器并配合大量的XML或者annotation来进行组件装配。学习成本高、开发效率低,而且影响系统性能。

jfinal采用极速化的AOP设计,专注AOP最核心目标,将概念减少到极致。仅有三个概念:Intercepor、Before和clear,而且无需引入IOC和繁杂的XML。

到这里,一个完整的jfinal入门程序就完成了。jfinal一般适用于小型项目的快速开发。以上就是我对jfinal的理解,如有不正之处,欢迎来交流~~

你可能感兴趣的:(框架)