`
wuhuizhong
  • 浏览: 684341 次
  • 性别: 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还有很多组件没有提到,各位请到官网查看详细文档。

分享到:
评论

相关推荐

    Final Effects汉化插件

    汉化版将插件的界面、菜单和帮助文档翻译成中文,使得中国用户能更加直观地理解各个功能,快速上手并精准操作。 在使用Final Effects汉化插件时,用户需要注意以下几点: 1. 安装:确保你的Premiere Pro版本与Final...

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

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

    final data 3.0 数据恢复

    在实际操作中,final data 3.0提供了直观的用户界面,使得非专业用户也能轻松上手。只需按照软件提示,选择需要扫描的磁盘,然后等待扫描完成,软件会列出所有可恢复的文件供用户选择。 综上所述,final data 3.0是...

    FinalData Enterprise 2.0 内附注册码

    其次,FinalData的用户界面设计友好,使得即便是非专业技术人员也能轻松上手。软件的操作流程简单明了,只需几步即可完成数据恢复。用户可以选择快速扫描或深度扫描,以适应不同的恢复需求。在扫描过程中,软件会...

    AE MetaCreations Final Effects Complete V1.0

    同时,它的预设库为初学者提供了快速上手的可能,而对专业用户的高级设置则确保了无限的创作空间。 在实际应用中,Final Effects Complete V1.0 可以应用于各种场景,如电影中的视觉特效、电视广告的过渡效果、甚至...

    Final_Data2

    5. **操作简便**:界面友好,操作流程清晰,即便是非专业用户也能快速上手。 使用Final Data2时,首先选择要扫描的驱动器或存储设备,然后软件会自动进行全盘扫描。扫描完成后,Final Data2将列出所有可恢复的文件...

    FINALDATA 3.0企业版

    同时,其界面友好,操作简单,无需专业IT知识,一般用户也能快速上手,降低了企业依赖专业技术支持的成本。 总的来说,FINALDATA 3.0企业版是一款集易用性、高效性和全面性于一体的优秀数据恢复软件。无论是个人...

    数据恢复软件finaldata3

    3. **简单易用的界面**:FinalData的设计理念是用户友好,其界面直观,操作流程清晰,即使是电脑新手也能快速上手。只需几步简单的操作,用户就能启动扫描和恢复过程。 4. **无需注册或激活**:FinalData提供的免费...

    FinalData

    4. 简单易用的界面:FinalData的用户界面直观,操作流程清晰,即使是对计算机不熟悉的人也能轻松上手。 5. 预览功能:在恢复文件前,用户可以通过预览功能检查文件内容,确保恢复的文件是正确的。 6. 安全恢复:...

    FinalData 注册版

    5. **快速与完全扫描模式**:快速扫描用于快速定位最近删除的文件,而完全扫描则更耗时但能找回更久远的删除记录。 6. **安全性高**:FinalData在恢复过程中不会写入任何数据到原始磁盘,避免进一步破坏已损坏的...

    快速上手Android数据库操作

    ### 快速上手Android数据库操作 #### 一、引言 在Android开发过程中,数据库操作是一项基础且重要的技能。Android内置的SQLite数据库为开发者提供了一个轻量级、高效的存储解决方案。本文旨在帮助读者快速掌握...

    FinalData数据恢复软件

    4. **简单易用的界面**:“简单好用”是FinalData的一大特点,它的用户界面直观,使得即使是电脑初学者也能快速上手,按照步骤操作就能进行数据恢复。 5. **OEM版本**:“旅之星移动硬盘OEM版”意味着FinalData是与...

    数据恢复工具FinalData Enterprise 2.0

    FinalData Enterprise 2.0的设计注重用户体验,其简洁明了的界面使得即便是非专业用户也能轻松上手。只需几个简单的步骤,用户就能启动扫描并恢复数据。 6. 高效的恢复速度 得益于其优化的算法,FinalData在恢复...

    FinalData OEM v2.0 简体中文版

    用户界面直观易懂,使得即便是不太熟悉电脑操作的人也能快速上手。软件提供了一系列向导式操作步骤,只需按照提示进行,就能轻松完成数据恢复。 值得注意的是,FinalData支持多种文件系统,包括FAT、FAT32、NTFS等...

    Final IK 2.0.zip

    8. **易用性**:该插件的用户界面友好,提供直观的设置和调试工具,使得非专业动画师也能快速上手。 9. **兼容性**:Final IK 2.0与Unity3D的动画系统无缝集成,支持动画层级、蒙皮权重和混合树,与现有的项目和...

    Unity Final IK 2.1 插件包,Unity3D插件

    10. **示例和文档**:丰富的示例场景和详细文档帮助开发者快速上手,理解并应用IK技术。 在实际开发中,Final IK 2.1 插件的使用通常包括设置骨骼结构、配置IK节点、调整权重以及调试动画效果等步骤。通过这个插件...

    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:...

    Final Data 2.0 OEM版

    无论是新手还是专业人士,都能够快速上手,通过几步简单的操作就能开始扫描并恢复丢失的文件。软件支持各种常见的文件系统,如FAT12/16/32和NTFS,涵盖了Windows操作系统的主要文件系统类型,确保了跨平台的兼容性。...

    slf4j+logback快速上手教程

    ### SLF4J + Logback 快速上手教程 #### 一、SLF4J 简介 **SLF4J**(Simple Logging Facade for Java)是一种简单且高效的日志门面库,旨在为Java平台上的各种日志框架提供统一的API,从而简化日志记录的过程。通过...

    final effects (FE)插件

    汉化版的Final Effects插件意味着所有菜单、选项和教程都已翻译成中文,用户可以更容易地理解每个功能的作用,快速上手。这对于中国用户来说是一大福音,因为英文界面可能会给非英语背景的用户带来困扰。汉化版使得...

Global site tag (gtag.js) - Google Analytics