JFinal,从新定义新国货。php
JFinal 概述html
JFinal 特色java
第一个JFinal项目python
注意事项mysql
<手动折叠>web
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言全部优点的同时再拥有ruby、python、php等动态语言的开发效率。ajax
</手动折叠>sql
<手动折叠>数据库
MVC架构,设计精巧,使用简单json
遵循COC原则,零配置,无xml
首创Db + Record模式,灵活便利
ActiveRecord支持,使数据库开发极致快速
自动加载修改后的java文件,开发过程当中无需重启web server
AOP支持,拦截器配置灵活,功能强大
Plugin体系结构,扩展性强
多视图支持,支持FreeMarker、JSP、Velocity
强大的Validator后端校验功能
功能齐全,拥有struts2的绝大部分功能
体积小仅339K,且无第三方依赖
</手动折叠>
MySQL 5.7.12
JFinal 2.2
FastJSON 1.2.0
JUnit 4.11
Gradle 2.11
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
File -> Project Structure
Modules -> Web Gradle
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 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"> <filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <param-value>com.jfinal.demo.config.JFinalConfigure</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
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' //单元测试 }
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); }
public class IndexController extends Controller{ public void index(){ renderHtml("<div align='center'><h1>HELLO.</h1></div>"); } }
项目全部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继承com.jfinal.plugin.activerecord.Model
可以使用{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()。
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<String, Object> getRequestObject(HttpServletRequest request) { try{ return JSON.parseObject(HttpKit.readData(request), new TypeReference<Map<String,Object>>(){}); }catch (Exception ex){ ex.printStackTrace(); return null; } }
在Controller中调用上述方法获得Model
User user = new User()._setAttrs(getRequestObject(this.getRequest()));
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 方法只有最后一次有效。
方法调用 |
描述 |
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 字符串。 |
上述方法请按需取用。