論如何用JFinal搭建一個上手就能用的RESTful風格後臺開發框架

JFinal,從新定義新國貨。php

 

目錄

  • JFinal 概述html

  • JFinal 特色java

  • 第一個JFinal項目python

  • 注意事項mysql

 

<手動摺疊>web

1、JFinal概述

JFinal 是基於 Java 語言的極速 WEB + ORM 框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java語言全部優點的同時再擁有ruby、python、php等動態語言的開發效率。ajax

</手動摺疊>sql

<手動摺疊>數據庫

2、JFinal特色

  • MVC架構,設計精巧,使用簡單json

  • 遵循COC原則,零配置,無xml

  • 首創Db + Record模式,靈活便利

  • ActiveRecord支持,使數據庫開發極致快速

  • 自動加載修改後的java文件,開發過程當中無需重啓web server

  • AOP支持,攔截器配置靈活,功能強大

  • Plugin體系結構,擴展性強

  • 多視圖支持,支持FreeMarker、JSP、Velocity

  • 強大的Validator後端校驗功能

  • 功能齊全,擁有struts2的絕大部分功能

  • 體積小僅339K,且無第三方依賴

</手動摺疊>

 

3、第一個JFinal項目

(一) 本項目應用瞭如下軟件或擴展

  • MySQL 5.7.12

  • JFinal 2.2

  • FastJSON 1.2.0

  • JUnit 4.11

  • Gradle 2.11

  • IntelliJ IDEA 2016.1.1

(二) 新建項目

  1. File -> CloseProject
  2. Create New Project

  3. Gradle -> Java & Web -> Next

  4. GroupId, ArtifactId -> Next

  5. select 「Create directories for…」 and 「Use local gradle distribution」

  6. select 「Gradle home」 -> Next

  7. Finish.

 

(三) 搭建項目結構

New -> Package

 

(四) 添加Web.xml並配置

  1. File -> Project Structure

  2. Modules -> Web Gradle

  3. 點擊Deployment Descriptors 右側「+」添加Web.xml
<?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>

 

(五) 配置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("<div align='center'><h1>HELLO.</h1></div>");
  }
}

 

4、注意事項

(一) Controller注意事項

  1. 項目全部Controller需繼承com.jfinal.core.Controller

  2. 能夠在方法名前用@Before(GET.class)或@Before(POST.class)等方式代表調用該方法所需的HTTP方法

  3. JFinal項目接口調用規則爲[host]:[port]/{controller_name}/{action_name}。若不聲明action_name則默認GET請求Controller中的第一個方法(index)

 

(二) Model注意事項

  1. 全部Model繼承com.jfinal.plugin.activerecord.Model

  2. Model中沒必要手動編寫屬性及其get/set方法,只需寫public static final {ModelName} dao = new {ModelName}();便可從數據庫動態獲取字段。

 

(三) DAO注意事項

  1. 可以使用{ModelName}.dao.findById(id)來獲取一個Model,或使用{ModelName}.dao.find(「[SQL]」)來獲取一個Model List。

  2. 可以使用{ModelName}.dao.paginate(page, count_per_page, "SELECT *", "FROM [table_name] WHERE start_time < ?", start_time).getList();來實現分頁功能。

  3. 可以使用object.save()在數據庫中插入一條數據,並同時使用object.getInt(「id」)來獲取剛插入的數據的id。

  4. 可以使用object.update()來更新一條數據。

  5. 可以使用object.delete(id)來刪除一條數據,但本項目推薦使用new User().findById(id).set("deleted", 1).update(); 實現數據庫軟刪除。

  6. 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<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方法注意事項

  1. render 系列方法將渲染不一樣類型的視圖並返回給客戶端。

  2. JFinal 目前支持的視圖類型有: FreeMarker、JSP、Velocity、JSON、File、Text、Html 等等。除了 JFinal 支持的視圖型之外, 還能夠經過繼承 Render 抽象類來無限擴展視圖類型。

  3. 一般狀況下使用 Controller.render(String)方法來渲染視圖, 使用 Controller.render(String)時的 視 圖 類 型 由 JFinalConfig.configConstant(Constants constants) 配 置 中 的 constants.setViewType(ViewType)來決定,該設置方法支持的 ViewType 有:FreeMarker、JSP、Velocity,不進行配置時的缺省配置爲 FreeMarker。

  4. IE 不支持 contentType 爲 application/json,在 ajax 上傳文件完成後返回 json 時 IE 提示下載文件 , 解 決 辦 法 是 使 用 : render(new JsonRender().forIE()) 或 者render(new JsonRender(params).forIE())。這種狀況只出如今 IE 瀏覽器 ajax 文件上傳,其它普通 ajax 請求沒必要理會。

  5. 除 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 字符串。

 

上述方法請按需取用。

相關文章
相關標籤/搜索