实验三: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");
    }
}
8Service(所有业务与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);
    }
}

9Model(无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、项目框架

 

 

 

posted @ 2024-11-22 21:23  不会JAVA的小袁  阅读(15)  评论(0编辑  收藏  举报