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 字符串。 |
上述方法請按需取用。