博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jFinal基于maven简单的demo
阅读量:4612 次
发布时间:2019-06-09

本文共 13402 字,大约阅读时间需要 44 分钟。

JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python等的开发效率。[1]

运用jfinal做一个学生成绩管理系统,总分在后台进行排序,jfinal的各种包的管理和运用和spring-mvc类似   分为controller,config,model,Interceptor,service,validator

首先model层

public class Student extends Model
{ public static final Student dao = new Student(); /** * ActiveRecord 是 jfinal 最核心的组成部分之一,通过 ActiveRecord 来操作数据库,将极大地减少代码量,极大地提升开发效率,配置在后面,我这里用的是Model,Model 是 ActiveRecord 中最重要的组件之一,它充当 MVC 模式中的 Model部分。以上代码中的 User 通过继承 Model,便立即拥有的众多方便的操作数据库的方法。在 User 中声明的 dao 静态对象是为了方便查询操作而定义的,该对象并不是必须的。 基于ActiveRecord 的 Model 无需定义属性, 无需定义 getter、 setter方法,无需 XML 配置,无需 Annotation 配置,极大降低了代码量。Model常见方法见官方API。JFinal还有 独创 Db + Record 模式,Db 类及其配套的 Record 类, 提供了在 Model 类之外更为丰富的数据库操作功能。使用 Db 与 Record 类时,无需对数据库表进行映射,Record 相当于一个通用的 Model。Db常见方法见官方API。 */}

controller

package controller;import java.util.List;import com.jfinal.aop.Before;import com.jfinal.core.Controller;import Validator.StudentValidator;import demo.model.Student;import service.StudentService;public class StudentController extends Controller {        /**     * 获取studentid那里有多种方法,这个要和前台传参写法一致,Controller 提供了 getPara 系列方法,官网api里很详细jfinal用的是原生态sql语句,简单,方便,setAttr("studentList", list);把结果集放到request范围里,jfinal也有直接获取表单里分装成对象的方法 getModel(Student.class);就是,和struts2一样,表单name对应上就可以了,非常方便添加那里对于oracle用序列维护studentid      student.set("studentid", "mysequence.nextval").save(); jfinal有多种返回方式,也可以返回json数据,render 系列方法,官网api里很详细     */        static StudentService service = new StudentService();    /*    @Before(StudentInterceptor.class)*/    public void index() {        List
list = Student.dao.find("select * from student"); setAttr("list", list); //注意下面路径的的前面如果带/则从根目录下开始找,也就是说 下代码 = render("/student/index.html"); render("student.html"); } public void add() { render("add.html"); } public void delete() { // 获取表单域名为studentid的值 Student.dao.deleteById(getPara("id")); forwardAction("/student"); } public void delete1(){ Student.dao.deleteById(getParaToInt()); forwardAction("/student"); } public void update() { Student student = getModel(Student.class); student.update(); forwardAction("/student"); } public void get() { Student student = Student.dao.findById(getPara("id")); setAttr("student", student); render("index2.html"); } public void get1() { Student student = Student.dao.findById(getParaToInt()); setAttr("student", student); render("index2.html"); } @Before(StudentValidator.class) public void save() { /** * getModel用来接收页面表单域传递过来的model对象,表单域名称以”modelName.attrName”http://www.jfinal.com方式命名,getModel 使用的 attrName 必须与数据表字段名完全一样。getBean 方法用于支持传统 Java Bean,包括支持使用 jfnal 生成器生成了 getter、setter 方法的 Model,页面表单传参时使用与 setter 方法相一致的 attrName,而非数据表字段名。getModel与getBean区别在于前者使用数表字段名而后者使用与setter方法一致的属性名进行数据注入。建议优先使用 getBean 方法。 */ getModel(Student.class).save(); redirect("/student"); }}

Interceptor

package Interceptor;import com.jfinal.aop.Interceptor;import com.jfinal.aop.Invocation;public class StudentInterceptor implements Interceptor {    public void intercept(Invocation ai) {        System.out.println("Before action invoking");        ai.invoke();        System.out.println("After action invoking");    }}

service

package service;import java.util.List;import com.jfinal.plugin.activerecord.Page;import demo.model.Student;public class StudentService {    /**     * 所有的 dao 对象也放在 Service 中     */    private static final Student dao = new Student().dao();        public Page
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); } public List
find() { return dao.find("select * from student order by id asc"); }}

validator:基本用于添加数据

package Validator;import com.jfinal.core.Controller;import com.jfinal.validate.Validator;public class StudentValidator extends Validator {    //在校验失败时才会调用    @Override    protected void handleError(Controller controller) {        controller.keepPara("student.name");//将提交的值再传回页面以便保持原先输入的值        controller.render("/add.html");    }    @Override    protected void validate(Controller controller) {        //验证表单域name,返回信息key,返回信息value        validateRequiredString("student.name", "name",                "请输入学生名称!");    }}
添加
学生科目
总分查询
#for(x : list)
#end
id 学生姓名 操作
#(x.id) #(x.name)   删除   修改

 

 

成绩管理:

package controller;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import com.jfinal.aop.Before;import com.jfinal.core.Controller;import Validator.KMValidator;import demo.model.KM;import demo.model.Student;import net.sf.json.JSONObject;import service.KMService;import service.StudentService;public class KMController extends Controller {        /**     * 获取studentid那里有多种方法,这个要和前台传参写法一致,Controller 提供了 getPara 系列方法,官网api里很详细jfinal用的是原生态sql语句,简单,方便,setAttr("studentList", list);把结果集放到request范围里,jfinal也有直接获取表单里分装成对象的方法 getModel(Student.class);就是,和struts2一样,表单name对应上就可以了,非常方便添加那里对于oracle用序列维护studentid      student.set("studentid", "mysequence.nextval").save(); jfinal有多种返回方式,也可以返回json数据,render 系列方法,官网api里很详细     */        static KMService service = new KMService();    static StudentService s = new StudentService();/*    @Before(StudentInterceptor.class)*/    public void index() {        List
list = KM.dao.find("select * from kemu"); setAttr("list", list); //注意下面路径的的前面如果带/则从根目录下开始找,也就是说 下代码 = render("/student/index.html"); render("kemu.html"); } public void list() { List
list = Student.dao.find("select * from student"); List
l = KM.dao.find("select * from kemu k order by k.score asc"); List
> list22 = new ArrayList(); List l2 = new ArrayList(); for(Student s : list){ Map m = new HashMap(); m.put("yuwen", 0); m.put("shuxue", 0); m.put("yingyu", 0); int a = 0; for(KM k : l){ if(s.get("id")==k.get("stu")){ if(k.get("km").equals("语文")){ a+=(Integer)k.get("score"); m.put("yuwen", k.get("score")); }else if(k.get("km").equals("数学")){ a+=(Integer)k.get("score"); m.put("shuxue", k.get("score")); }else if(k.get("km").equals("英语")){ a+=(Integer)k.get("score"); m.put("yingyu", k.get("score")); } } } m.put("score", a); m.put("stu", s.get("id")); list22.add(m); } Collections.sort(list22,new Comparator
>() { //升序排序 public int compare(Map
o1, Map
o2) { int map1value = (Integer)o1.get("score"); int map2value = (Integer)o2.get("score"); return map2value-map1value; } }); setAttr("l",list22); render("/kemu/ceshi.html"); } public void add() { List
list = Student.dao.find("select * from student"); setAttr("list",list); render("add.html"); } public void delete1(){ KM.dao.deleteById(getParaToInt()); forwardAction("/kemu"); } public void get() { KM kemu = KM.dao.findById(getPara("id")); setAttr("kemu", kemu); render("index2.html"); } public void get1() { KM kemu = KM.dao.findById(getParaToInt()); setAttr("kemu", kemu); render("index2.html"); } @Before(KMValidator.class) public void save() { /** * getModel用来接收页面表单域传递过来的model对象,表单域名称以”modelName.attrName”http://www.jfinal.com方式命名,getModel 使用的 attrName 必须与数据表字段名完全一样。getBean 方法用于支持传统 Java Bean,包括支持使用 jfnal 生成器生成了 getter、setter 方法的 Model,页面表单传参时使用与 setter 方法相一致的 attrName,而非数据表字段名。getModel与getBean区别在于前者使用数表字段名而后者使用与setter方法一致的属性名进行数据注入。建议优先使用 getBean 方法。 */ KM st=getModel(KM.class,""); st.save(); redirect("/kemu"); }}
package Interceptor;import com.jfinal.aop.Interceptor;import com.jfinal.aop.Invocation;public class KMInterceptor implements Interceptor {    public void intercept(Invocation ai) {        System.out.println("Before action invoking");        ai.invoke();        System.out.println("After action invoking");    }}
package service;import java.util.List;import com.jfinal.plugin.activerecord.Page;import demo.model.KM;import demo.model.Student;public class KMService {    /**     * 所有的 dao 对象也放在 Service 中     */    private static final KM dao = new KM().dao();    private static final Student dao1 = new Student().dao();        public Page
paginate(int pageNumber, int pageSize) { return dao.paginate(pageNumber, pageSize, "select *", "from kemu order by id asc"); } public Page
paginate1(int pageNumber, int pageSize) { return dao1.paginate(pageNumber, pageSize, "select *", "from student order by id asc"); } public KM findById(int id) { return dao.findById(id); } public void deleteById(int id) { dao.deleteById(id); } public List
find1() { return dao1.find("select * from student order by id asc"); } public List
find() { return dao.find("select * from kemu order by id asc"); }}
package Validator;import com.jfinal.core.Controller;import com.jfinal.validate.Validator;public class KMValidator extends Validator {    //在校验失败时才会调用    @Override    protected void handleError(Controller controller) {        controller.keepPara("stu");//将提交的值再传回页面以便保持原先输入的值        controller.render("/add.html");    }    @Override    protected void validate(Controller controller) {        //验证表单域name,返回信息key,返回信息value        validateRequiredString("stu", "stu",                "请输入学号!");    }}

页面

添加
返回
#for(x : list)
#end
id 学生编号 科目 成绩 操作
#(x.id) #(x.stu) #(x.km) #(x.score)   删除

 总分页面

Insert title here 返回
#for(x : l)
#end
学生编号 语文成绩 英语成绩 数学成绩 总成绩
#(x.stu) #(x.yuwen) #(x.yingyu) #(x.shuxue) #(x.score)
package demo;import com.jfinal.config.*;import com.jfinal.core.JFinal;import com.jfinal.plugin.activerecord.ActiveRecordPlugin;import com.jfinal.plugin.druid.DruidPlugin;import com.jfinal.template.Engine;import controller.KMController;import controller.StudentController;import demo.model.KM;import demo.model.Student;public class DemoConfig extends JFinalConfig {        public static void main(String[] args) {        JFinal.start("src/main/webapp", 80, "/", 5);    }        public void configConstant(Constants me) {        me.setDevMode(true);        //此方法用来配置 JFinal 常量值,如开发模式常量 devMode 的配置,如下代码配置了 JFinal        //运行在开发模式:在开发模式下,JFinal 会对每次请求输出报告,如输出本次请求的 URL、Controller、Method        //以及请求所携带的参数。    }    public void configRoute(Routes me) {        me.add("/student", StudentController.class);        me.add("/kemu", KMController.class);    }        public void configEngine(Engine me) {            }    public void configPlugin(Plugins me) {            loadPropertyFile("a_little_config.txt");        DruidPlugin dp = new DruidPlugin(getProperty("jdbcUrl"),        getProperty("user"), getProperty("password"));        me.add(dp);        ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);        me.add(arp);        arp.addMapping("student", "id", Student.class);        arp.addMapping("kemu", "id", KM.class);//写数据库表的名字        //        此方法用来配置JFinal的Plugin,如下代码配置了Druid数据库连接池插件与ActiveRecord//        数据库访问插件。通过以下的配置,可以在应用中使用 ActiveRecord 非常方便地操作数据库。    }    public void configInterceptor(Interceptors me) {        //me.add(new AuthInterceptor());        //        此方法用来配置 JFinal 的全局拦截器,全局拦截器将拦截所有 action 请求,除非使用//        @Clear 在 Controller 中清除,如下代码配置了名为 AuthInterceptor 的拦截器。    }    public void configHandler(Handlers me) {    }}

 

 

 

 

转载于:https://www.cnblogs.com/NCL--/p/8320586.html

你可能感兴趣的文章
【求神——唐伯虎点秋香】
查看>>
Javascript Array和String的互转换
查看>>
GTD:让大脑用来思考,而不是用来记事!
查看>>
Spark程序进行单元测试-使用scala
查看>>
Oozie简单配置与使用
查看>>
根目录空间沾满
查看>>
python基础知识13-迭代器与生成器,导入模块
查看>>
Spring 操作Weblogic JDNI数据源
查看>>
bower程序包管理器与npm的对比及handlebars包的使用实例
查看>>
ES6 数值的扩展
查看>>
模块操作
查看>>
数据链路层笔记
查看>>
HTML5开发:原理与实现
查看>>
pip安装问题
查看>>
Mysql 出现Table‘xxx’is read only问题
查看>>
欧几里得&扩展欧几里得算法
查看>>
Block使用的注意事项
查看>>
HDU1700:Points on Cycle
查看>>
8个实用的Linux下Bash命令提示行(转)
查看>>
Python常用模块-shutil高级文件处理模块
查看>>