实验三:JFinal极速开发框架实验
一、实验要求
任务一:了解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、项目框架