1. 程式人生 > 其它 >JFinal開發的學生資訊管理系統

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);
	}
}