一、實驗要求
任務一:瞭解Maven及其使用方法,總結其功能作用
任務二:學習JFinal框架,基於Maven建立JFinal工程,並對JFinal框架功能進行總結介紹
任務三:基於JFinal完成一個簡單的學生資訊管理系統(要求實現學生資訊的增刪改查)
二、實驗步驟
任務一:
Maven專案物件模型(POM),可以透過一小段描述資訊來管理專案的構建,報告和文件的專案管理工具軟體。Maven 除了以程式構建能力為特色之外,還提供高階專案管理工具。由於 Maven 的預設構建規則有較高的可重用性,所以常常用兩三行 Maven 構建指令碼就可以構建簡單的專案。由於 Maven 的面向專案的方法,許多 Apache Jakarta 專案發文時使用 Maven,而且公司專案採用Maven 的比例在持續增長。Maven這個單詞來自於意第緒語(猶太語),意為知識的積累,最初在Jakata Turbine專案中用來簡化構建過程。當時有一些專案(有各自Ant build檔案),僅有細微的差別,而JAR檔案都由CVS來維護。於是希望有一種標準化的方式構建專案,一個清晰的方式定義專案的組成,一個容易的方式釋出專案的資訊,以及一種簡單的方式在多個專案中共享JARs。
功能和作用:
1、專案構建:Maven能夠自動化地構建專案,包括編譯、測試、打包、部署等過程。
2、依賴管理:Maven可以自動下載專案所需的外部庫和框架,管理專案依賴,並確保依賴的一致性和版本控制。
3、專案物件模型(POM):Maven使用XML檔案(pom.xml)來描述專案資訊和構建配置,使得專案管理更加標準化。
4、生命週期管理:Maven定義了一套標準的構建生命週期,包括清理、編譯、測試、打包、部署等階段,方便專案管理和團隊協作。
5、外掛機制:Maven提供了豐富的外掛,可以擴充套件Maven的功能,實現更多的構建任務和流程。
6、多專案管理:Maven可以管理多模組專案,方便大型專案的組織和協調。
7、報告生成:Maven可以生成專案報告,如測試報告、文件等,幫助開發者和管理者瞭解專案狀態。
8、標準化構建:Maven提供了一套標準化的構建流程,使得不同專案之間的構建過程更加一致。
使用方法:
1、初始化專案:使用mvn archetype:generate命令建立新專案。
2、構建專案:使用mvn clean install命令進行清理、編譯、測試和打包。
3、管理依賴:在pom.xml中新增依賴,Maven會自動下載並管理。
4、執行測試:使用mvn test命令執行專案中的單元測試。
5、部署專案:使用mvn deploy命令將專案部署到遠端倉庫。
任務二:
1、首先進入官網,註冊賬號下載框架
1、將專案在idea中匯入
1、將SQL檔案匯入
1、根據啟動說明,修改配置檔案,將資料庫密碼修改為自己的
1、啟動專案,輸入localhost ,執行成功
6、JFinal 是基於 Java 語言的極速 WEB + ORM + AOP + Template Engine 框架,其核心設計目標是開發迅速、程式碼量少、學習簡單、功能強大、輕量級、易擴充套件、Restful。在擁有Java語言所有優勢的同時再擁有ruby、python、php等動態語言的開發效率!以下是JFinal框架的主要功能和特點:
1) MVC架構:JFinal採用了MVC設計模式,有助於將應用程式的業務邏輯、顯示和使用者互動分離開來,使得程式碼更加清晰、易於維護。
2) 路由配置:JFinal提供了靈活且強大的路由配置功能,透過簡單的路由配置,可以將URL對映到相應的Controller方法上,方便處理使用者請求。
3)簡潔的程式碼: JFinal倡導簡潔、優雅的程式碼風格,提供了簡潔的API,減少了開發人員的工作量,加快了開發速度。
4) Active Record支援:JFinal內建了Active Record模式,透過簡單的API運算元據庫表,使得資料庫互動更加方便和直觀,無需編寫繁瑣的SQL語句。
5) AOP支援:框架支援AOP,允許開發者在方法執行前後新增自定義邏輯,實現日誌記錄、事務管理等功能。
6)外掛擴充套件:JFinal提供了豐富的外掛系統,可以輕鬆整合各種外掛,如快取、驗證碼、定時任務等,以滿足不同專案的需求。
7)熱部署:JFinal支援開發時的熱部署,修改程式碼後無需重啟伺服器即可生效,加快了開發和除錯的效率。
8) Restful風格支援:框架對Restful API提供了良好的支援,方便建立符合Restful規範的介面。
總的來說,JFinal框架以其簡潔的設計、強大的功能和良好的擴充套件性,為Java Web應用開發者提供了一個高效、便捷的開發環境。
7、控制器(支援 Enjoy、FreeMarker、JSP、JSON等以及自定義檢視渲染)
@Path("/blog")
@Before(BlogInterceptor.class)
public class BlogController extends Controller {
@Inject
BlogService service;
public void index() {
setAttr("blogPage", service.paginate(getParaToInt(0, 1), 10));
render("blog.html");
}
public void add() {
}
/**
* save 與 update 的業務邏輯在實際應用中也應該放在 serivce 之中,
* 並要對資料進正確性進行驗證,在此僅為了偷懶
*/
@Before(BlogValidator.class)
public void save() {
getBean(Blog.class).save();
redirect("/blog");
}
public void edit() {
setAttr("blog", service.findById(getParaToInt()));
}
/**
* save 與 update 的業務邏輯在實際應用中也應該放在 serivce 之中,
* 並要對資料進正確性進行驗證,在此僅為了偷懶
*/
@Before(BlogValidator.class)
public void update() {
getBean(Blog.class).update();
redirect("/blog");
}
public void delete() {
service.deleteById(getParaToInt());
redirect("/blog");
}
}
8、Service(所有業務與sql放在Service層)
/* BlogService
* 所有 sql 與業務邏輯寫在 Service 中,不要放在 Model 中,更不
* 要放在 Controller 中,養成好習慣,有利於大型專案的開發與維護
*/
public class BlogService {
/**
* 所有的 dao 物件也放在 Service 中,並且宣告為 private,避免 sql 滿天飛
* sql 只放在業務層,或者放在外部 sql 模板,用模板引擎管理:
* https://jfinal.com/doc/5-13
*/
private Blog dao = new Blog().dao();
public Page<Blog> paginate(int pageNumber, int pageSize) {
return dao.paginate(pageNumber, pageSize, "select *", "from blog order by id asc");
}
public Blog findById(int id) {
return dao.findById(id);
}
public void deleteById(int id) {
dao.deleteById(id);
}
}
9、Model(無xml、無annotation、無attribute)
public class Blog extends Model<Blog> {
}
10、Validator(API引導式校驗,比xml校驗方便N倍,有程式碼檢查不易出錯)
public class BlogValidator extends Validator {
protected void validate(Controller controller) {
validateRequiredString("blog.title", "titleMsg", "請輸入Blog標題!");
validateRequiredString("blog.content", "contentMsg", "請輸入Blog內容!");
}
protected void handleError(Controller controller) {
controller.keepModel(Blog.class);
String actionKey = getActionKey();
if (actionKey.equals("/blog/save"))
controller.render("add.html");
else if (actionKey.equals("/blog/update"))
controller.render("edit.html");
}
}
11、攔截器(在此demo中僅為示例,本demo不需要此攔截器)
public class BlogInterceptor implements Interceptor {
public void intercept(Invocation inv) {
System.out.println("Before invoking " + inv.getActionKey());
inv.invoke();
System.out.println("After invoking " + inv.getActionKey());
}
}
任務三:
1、建立資料庫
admin.sql
DROP TABLE IF EXISTS `student`;
create table admin
(
account varchar(10) not null
primary key,
password varchar(10) null
);
INSERT INTO Student.admin (account, password) VALUES ('yxl', '123');
student.sql
DROP TABLE IF EXISTS `student`;
create table student
(
id int not null
primary key,
name varchar(10) null,
classes varchar(10) null,
age int null,
sex varchar(10) null,
tel varchar(11) null
);
INSERT INTO `student` VALUES (20223596, '李四', '信2205-2', 21, '男', '19665855645');
INSERT INTO `student` VALUES (20223794, '袁興蘭', '信2205-2', 20, '女', '18886962172');
INSERT INTO `student` VALUES (20223849, '王二', '信2205-2', 20, '男', '15622758964');
INSERT INTO `student` VALUES (20224561, '張三', '信2205-2', 21, '男', '17758942654');
INSERT INTO `student` VALUES (20225124, '麗麗', '信2205-2', 21, '女', '16894562568');
1、專案框架