JFinal開發的學生資訊管理系統
1、概覽
2、部分相關程式碼
2.1 DemoConfig.java
DemoConfig.java:全域性配置類 (6個方法)
void configConstant(Constants me){} |
此方法用來配置JFinal的一些常量值,例如開發模式常量 devMode 的配置,預設檢視型別 ViewType的配置,預設編碼格式為UTF-8等。
me.setDevMode(p.getBoolean("devMode", false)); |
這裡將開發模式配置為 false , true值為開發模式
me.setInjectDependency(true); |
配置依賴注入
me.setInjectSuperClass(true); |
配置依賴注入時,是否對被注入類的超類進行注入
還有很多專案的通用配置資訊
void configRoute(Routes me){} |
這個方法是用來配置路由資訊的,每建立一個controller就在這裡配置一遍路由資訊
me.add("/", IndexController.class, "/index"); // 第三個引數為該Controller的檢視存放路徑 me.add("/student", StudentController.class); // 第三個引數省略時預設與第一個引數值相同,在此即為 "/student" |
對應專案中的兩個Controller
void configEngine(Engine me){} |
這裡用來配置頁面模板
me.addSharedFunction("/common/_layout.html"); me.addSharedFunction("/common/_paginate.html"); |
上面的方法向模板引擎中添加了2個定義了共享函式的模板檔案。
void configPlugin(Plugin me){} |
這裡用來配置JFinal的一些外掛資訊
DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password")); me.add(druidPlugin); |
配置Druid的資料庫連線池外掛
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); |
配置ActiverRecord資料庫訪問外掛
正常來說應該增加資料庫訪問的對映關係,例如:
arp.addMapping("user", User.class); |
本demo中利用MappingKit自動化完成,即將程式碼寫在_MappingKit中
_MappingKit.mapping(arp); public class _MappingKit { public static void mapping(ActiveRecordPlugin arp) { arp.addMapping("student", "id", Student.class); } } |
public static DruidPlugin createDruidPlugin() { loadConfig(); return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password")); } |
這部分程式碼是用於建立Druid外掛
一般第一次呼叫的話,用該方法,然後再次呼叫的話,會呼叫configPlugin中的方法。
void configInterceptor(Interceptors interceptor) |
此方法來配置JFinal的全域性攔截器,全域性攔截器將攔截所有的action請求,除非使用@Clear註解在Controller中清除,如下程式碼配置了名為AuthInterceptor的攔截器。
public void configInterceptor(Interceptors interceptor) { interceptor.add(new AuthInterceptor()); } |
此demo中沒有配置
void configHandler(Handlershandler) |
此方法用來配置JFinal的Handler。Handler可以接管所有的web請求,並對應用擁有完全的控制權,可以很方便地實現更高層的功能性擴充套件。此demo中沒有配置
相關程式碼:
點選檢視程式碼
package com.demo.common;
import com.demo.student.StudentController;
import com.demo.common.model._MappingKit;
import com.demo.index.IndexController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
/**
* 本 demo 僅表達最為粗淺的 jfinal 用法,更為有價值的實用的企業級用法
* 詳見 JFinal 俱樂部: http://jfinal.com/club
*
* API 引導式配置
*/
public class DemoConfig extends JFinalConfig {
static Prop p;
/**
* 啟動入口,執行此 main 方法可以啟動專案,此 main 方法可以放置在任意的 Class 類定義中,不一定要放於此
*/
public static void main(String[] args) {
UndertowServer.start(DemoConfig.class);
}
/**
* PropKit.useFirstFound(...) 使用引數中從左到右最先被找到的配置檔案
* 從左到右依次去找配置,找到則立即載入並立即返回,後續配置將被忽略
*/
static void loadConfig() {
if (p == null) {
p = PropKit.useFirstFound("demo-config-pro.txt", "demo-config-dev.txt");
}
}
/**
* 配置常量
*/
public void configConstant(Constants me) {
loadConfig();
me.setDevMode(p.getBoolean("devMode", false));
/**
* 支援 Controller、Interceptor、Validator 之中使用 @Inject 注入業務層,並且自動實現 AOP
* 注入動作支援任意深度並自動處理迴圈注入
*/
me.setInjectDependency(true);
// 配置對超類中的屬性進行注入
me.setInjectSuperClass(true);
}
/**
* 配置路由
*/
public void configRoute(Routes me) {
me.add("/", IndexController.class, "/index"); // 第三個引數為該Controller的檢視存放路徑
me.add("/student", StudentController.class); // 第三個引數省略時預設與第一個引數值相同,在此即為 "/blog"
}
public void configEngine(Engine me) {
me.addSharedFunction("/common/_layout.html");
me.addSharedFunction("/common/_paginate.html");
}
/**
* 配置外掛
*/
public void configPlugin(Plugins me) {
// 配置 druid 資料庫連線池外掛
DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"));
me.add(druidPlugin);
// 配置ActiveRecord外掛
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
// 所有對映在 MappingKit 中自動化搞定
_MappingKit.mapping(arp);
me.add(arp);
}
public static DruidPlugin createDruidPlugin() {
loadConfig();
return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"));
}
/**
* 配置全域性攔截器
*/
public void configInterceptor(Interceptors me) {
}
/**
* 配置處理器
*/
public void configHandler(Handlers me) {
}
}
2.2 StudentController.java
@Inject StudentService service; |
Service 使用 @Inject 進行注入
這個類裡面所有的實際方法返回型別都是void空型別,返回的內容靠render()進行控制,可以返回json也可以返回頁面檢視。具體功能通過呼叫Service中的介面實現。
@Before(StudentInterceptor.class) |
這個語句是用來新增事務回滾
方法體不能撲捉異常,所有的異常都丟擲,當出現異常時事物將回滾
相關程式碼:
點選檢視程式碼
package com.demo.student;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.demo.common.model.Student;
/**
* 本 demo 僅表達最為粗淺的 jfinal 用法,更為有價值的實用的企業級用法
* 詳見 JFinal 俱樂部: http://jfinal.com/club
*
* 所有 sql 與業務邏輯寫在 Service 中,不要放在 Model 中,更不
* 要放在 Controller 中,養成好習慣,有利於大型專案的開發與維護
*/
@Before(StudentInterceptor.class)
public class StudentController extends Controller {
@Inject
StudentService service;
public void index() {
setAttr("studentPage", service.paginate(getParaToInt(0, 1), 10));
render("student.html");
}
public void add() {
}
/**
* save 與 update 的業務邏輯在實際應用中也應該放在 serivce 之中,
* 並要對資料進正確性進行驗證,在此僅為了偷懶
*/
@Before(StudentValidator.class)
public void save() {
getBean(Student.class).save();
redirect("/student");
}
public void edit() {
setAttr("student", service.findById(getParaToInt()));
}
/**
* save 與 update 的業務邏輯在實際應用中也應該放在 serivce 之中,
* 並要對資料進正確性進行驗證,在此僅為了偷懶
*/
@Before(StudentValidator.class)
public void findById() {
service.findById(getParaToInt());
redirect("/student");
}
public void update() {
getBean(Student.class).update();
redirect("/student");
}
public void delete() {
service.deleteById(getParaToInt());
redirect("/student");
}
}
2.3 StudentService.java
點選檢視程式碼
package com.demo.student;
import com.demo.common.model.Student;
import com.jfinal.plugin.activerecord.Page;
/**
* 本 demo 僅表達最為粗淺的 jfinal 用法,更為有價值的實用的企業級用法
* 詳見 JFinal 俱樂部: http://jfinal.com/club
*
* BlogService
* 所有 sql 與業務邏輯寫在 Service 中,不要放在 Model 中,更不
* 要放在 Controller 中,養成好習慣,有利於大型專案的開發與維護
*/
public class StudentService {
/**
* 所有的 dao 物件也放在 Service 中,並且宣告為 private,避免 sql 滿天飛
* sql 只放在業務層,或者放在外部 sql 模板,用模板引擎管理:
* http://www.jfinal.com/doc/5-13
*/
private Student dao = new Student().dao();
public Page<Student> paginate(int pageNumber, int pageSize) {
return dao.paginate(pageNumber, pageSize, "select *", "from student order by id asc");
}
public Student findById(int id) {
return dao.findById(id);
}
public void deleteById(int id) {
dao.deleteById(id);
}
}