论如何用JFinal搭建一个上手就能用的RESTful风格后台开发框架

2016-12-03 13:21:30来源:oschina作者:Leaomato人点击

第七城市

JFinal,重新定义新国货。


目录

JFinal 概述


JFinal 特点


第一个JFinal项目


注意事项


<手动折叠>


一、JFinal概述

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率。



<手动折叠>


二、JFinal特点

MVC架构,设计精巧,使用简单


遵循COC原则,零配置,无xml


独创Db + Record模式,灵活便利


ActiveRecord支持,使数据库开发极致快速


自动加载修改后的java文件,开发过程中无需重启web server


AOP支持,拦截器配置灵活,功能强大


Plugin体系结构,扩展性强


多视图支持,支持FreeMarker、JSP、Velocity


强大的Validator后端校验功能


功能齐全,拥有struts2的绝大部分功能


体积小仅339K,且无第三方依赖

三、第一个JFinal项目
(一) 本项目应用了以下软件或扩展

MySQL 5.7.12


JFinal 2.2


FastJSON 1.2.0


JUnit 4.11


Gradle 2.11


IntelliJ IDEA 2016.1.1 (二) 新建项目File -> CloseProject

Create New Project


Gradle -> Java & Web -> Next


GroupId, ArtifactId -> Next


select “Create directories for…” and “Use local gradle distribution”


select “Gradle home” -> Next


Finish.


(三) 搭建项目结构

New -> Package


(四) 添加Web.xml并配置

File -> Project Structure


Modules -> Web Gradle


点击Deployment Descriptors 右侧“+”添加Web.xml <?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

jfinal
com.jfinal.core.JFinalFilter

configClass
com.jfinal.demo.config.JFinalConfigure



jfinal
/*

(五) 配置build.gradle
dependencies {
compile 'com.jfinal:jfinal:2.2'//JFinal包
compile 'c3p0:c3p0:0.9.1.2'//数据库连接池包
compile 'mysql:mysql-connector-java:5.1.26'//MySQL连接包
compile "javax.servlet:servlet-api:2.5"//servlet包
compile 'com.alibaba:fastjson:1.2.0'//JSON序列化与反序列化包
testCompile group: 'junit', name: 'junit', version: '4.11'//单元测试
}
(七) 添加JFinal配置文件

config 包名右键 -> New -> Class : JFinalConfigure


继承 JFinalConfig

(八) 配置全局常量
public void configConstant(Constants me) {
me.setDevMode(true); //项目当前为开发者模式
me.setViewType(ViewType.JSP); //项目的View默认为JSP文件
} (九) 配置路由
public void configRoute(Routes me) {
me.add("/user", UserController.class); //截获 /user 并定位到UserController
} (十) 配置数据库连接池
public void configPlugin(Plugins me) {
C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://localhost/mydb",
"{username}", "{password}");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
arp.addMapping("user", User.class); //将数据库中的user表映射到User类
arp.addMapping("hospital", Hospital.class);
} (十一) 第一个Controller
public class IndexController extends Controller{
public void index(){
renderHtml("

HELLO.

");
}
} 四、注意事项
(一) Controller注意事项

项目所有Controller需继承com.jfinal.core.Controller


可以在方法名前用@Before(GET.class)或@Before(POST.class)等方式表明调用该方法所需的HTTP方法


JFinal项目接口调用规则为[host]:[port]/{controller_name}/{action_name}。若不声明action_name则默认GET请求Controller中的第一个方法(index)


(二) Model注意事项

所有Model继承com.jfinal.plugin.activerecord.Model


Model中不必手动编写属性及其get/set方法,只需写public static final {ModelName} dao = new {ModelName}();即可从数据库动态获取字段。
(三) DAO注意事项

可使用{ModelName}.dao.findById(id)来获取一个Model,或使用{ModelName}.dao.find(“[SQL]”)来获取一个Model List。


可使用{ModelName}.dao.paginate(page, count_per_page, "SELECT *", "FROM [table_name] WHERE start_time < ?", start_time).getList();来实现分页功能。


可使用object.save()在数据库中插入一条数据,并同时使用object.getInt(“id”)来获取刚插入的数据的id。


可使用object.update()来更新一条数据。


可使用object.delete(id)来删除一条数据,但本项目推荐使用new User().findById(id).set("deleted", 1).update(); 实现数据库软删除。


dao是全局的,只能查询,不能用来承载数据。因此查询可使用{ModelName}.dao.find()来查询,但是插入更新必须使用new {ModelName}().update()。


(四) Warning

JFinal是对Servlet的薄层封装,Servlet方便于接受form提交的数据,对ajax提交的json数据支持不完善,因而JFinal也存在该问题。也就导致JFinal无法通过类似于@RequestBody方式直接获取到Model。


关于该问题的解释参见http://blog.csdn.net/mhmyqn/article/details/25561535


有人说删掉Content-Type:application/json就可以了。都是骗子。


故欲获取post方法body中的数据只能从request流中得到。


public static Map getRequestObject(HttpServletRequest request) {
try{
return JSON.parseObject(HttpKit.readData(request), new TypeReference>(){});
}catch (Exception ex){
ex.printStackTrace();
return null;
}
}

在Controller中调用上述方法得到Model


User user = new User()._setAttrs(getRequestObject(this.getRequest()));


(五)render方法注意事项

render 系列方法将渲染不同类型的视图并返回给客户端。


JFinal 目前支持的视图类型有: FreeMarker、JSP、Velocity、JSON、File、Text、Html 等等。除了 JFinal 支持的视图型以外, 还可以通过继承 Render 抽象类来无限扩展视图类型。


通常情况下使用 Controller.render(String)方法来渲染视图, 使用 Controller.render(String)时的 视 图 类 型 由 JFinalConfig.configConstant(Constants constants) 配 置 中 的 constants.setViewType(ViewType)来决定,该设置方法支持的 ViewType 有:FreeMarker、JSP、Velocity,不进行配置时的缺省配置为 FreeMarker。


IE 不支持 contentType 为 application/json,在 ajax 上传文件完成后返回 json 时 IE 提示下载文件 , 解 决 办 法 是 使 用 : render(new JsonRender().forIE()) 或 者render(new JsonRender(params).forIE())。这种情况只出现在 IE 浏览器 ajax 文件上传,其它普通 ajax 请求不必理会。


除 renderError 方法以外,在调用 render 系列的方法后程序并不会立即返回,如果需要立即返回需要使用 return 语句。在一个 action 中多次调用 render 方法只有最后一次有效。


(六) render系列方法

方法调用


描述




renderFreeMarker(”test.html”)


渲 染 名 为 test.html 的 视 图 , 且 视 图 类 型 为

FreeMarker。




renderJsp(”test.html”)


渲染名为 test.html 的视图,且视图类型为 Jsp。




renderVelocity(“test.html”)


渲染名为 test.html 的视图,且视图类型为 Velocity。




renderJson()


将所有通过 Controller.setAttr(String, Object)设置

的变量转换成 json 数据并渲染。




renderJson(“users”, userList)


以”users”为根,仅将 userList 中的数据转换成 json

数据并渲染。




renderJson(user)


将 user 对象转换成 json 数据并渲染。




renderJson(“{/”age/”:18}” )


直接渲染 json 字符串。




renderFreeMarker(”test.html”)

渲 染 名 为 test.html 的 视 图 , 且 视 图 类 型 为

FreeMarker。




renderJsp(”test.html”)
渲染名为 test.html 的视图,且视图类型为 Jsp。


renderVelocity(“test.html”)
渲染名为 test.html 的视图,且视图类型为 Velocity。


renderJson()

将所有通过 Controller.setAttr(String, Object)设置

的变量转换成 json 数据并渲染。




renderJson(“users”, userList)

以”users”为根,仅将 userList 中的数据转换成 json

数据并渲染。




renderJson(user)
将 user 对象转换成 json 数据并渲染。


renderJson(“{/”age/”:18}” )
直接渲染 json 字符串。


上述方法请按需取用。

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台