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

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

首先model层

public class Student extends Model<Student> {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<Student> 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<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);}public List<Student> 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 {//在校验失败时才会调用
    @Overrideprotected void handleError(Controller controller) {controller.keepPara("student.name");//将提交的值再传回页面以便保持原先输入的值controller.render("/add.html");}@Overrideprotected void validate(Controller controller) {//验证表单域name,返回信息key,返回信息valuevalidateRequiredString("student.name", "name","请输入学生名称!");}}

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="/jquery-1.12.4.min.js"></script>
</head>
<body><a href="/student/add">添加</a><br><a href="/kemu">学生科目</a><br><a href="/kemu/list">总分查询</a><table id="listtable" border="1"><tbody><tr><th>id</th><th>学生姓名</th><th>操作</th></tr>#for(x : list)<tr><td style="text-align:left;">#(x.id)</td><td style="text-align:left;">#(x.name)</td><td style="text-align:left;">&nbsp;&nbsp;<a href="/student/delete1/#(x.id)">删除</a>&nbsp;&nbsp;<a href="/student/get1/#(x.id)">修改</a></td></tr>#end</tbody></table>
</body>
</html>

成绩管理:

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<KM> list = KM.dao.find("select * from kemu");setAttr("list", list);//注意下面路径的的前面如果带/则从根目录下开始找,也就是说 下代码 = render("/student/index.html");render("kemu.html");}public void list() {List<Student> list = Student.dao.find("select * from student");List<KM> l = KM.dao.find("select * from kemu k order by k.score asc");List<Map<String,Object>> 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<Map<String,Object>>() {//升序排序public int compare(Map<String, Object> o1,Map<String, Object> 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<Student> 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<KM> paginate(int pageNumber, int pageSize) {return dao.paginate(pageNumber, pageSize, "select *", "from kemu order by id asc");}public Page<Student> 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<Student> find1() {return dao1.find("select * from student order by id asc");}public List<KM> 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 {//在校验失败时才会调用
    @Overrideprotected void handleError(Controller controller) {controller.keepPara("stu");//将提交的值再传回页面以便保持原先输入的值controller.render("/add.html");}@Overrideprotected void validate(Controller controller) {//验证表单域name,返回信息key,返回信息valuevalidateRequiredString("stu", "stu","请输入学号!");}}

页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="/jquery-1.12.4.min.js"></script>
</head>
<body><a href="/kemu/add">添加</a><br><a href="/student">返回</a><br><table id="listtable" border="1"><tbody><tr><th>id</th><th>学生编号</th><th>科目</th><th>成绩</th><th>操作</th></tr>#for(x : list)<tr><td style="text-align:left;">#(x.id)</td><td style="text-align:left;">#(x.stu)</td><td style="text-align:left;">#(x.km)</td><td style="text-align:left;">#(x.score)</td><td style="text-align:left;">&nbsp;&nbsp;<a href="/kemu/delete1/#(x.id)">删除</a></td></tr>#end</tbody></table>
</body>
</html>

总分页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><a href="/student">返回</a><br><table id="listtable" border="1"><tbody><tr><th>学生编号</th><th>语文成绩</th><th>英语成绩</th><th>数学成绩</th><th>总成绩</th></tr>#for(x : l)<tr><td style="text-align:left;">#(x.stu)</td><td style="text-align:left;">#(x.yuwen)</td><td style="text-align:left;">#(x.yingyu)</td><td style="text-align:left;">#(x.shuxue)</td><td style="text-align:left;">#(x.score)</td></tr>#end</tbody></table>
</body>
</html>

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

jFinal基于maven简单的demo相关推荐

  1. spring mvc 基于maven的完整demo

    记录一下使用maven构建第一个spring mvc工程的经过. 环境: eclipse Kepler Service Release 2 jdk 1.7 tomcat7.0.52 这里假定eclip ...

  2. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...

  3. Dubbo入门----搭建一个最简单的Demo框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...

  4. 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建

    首页 Android Java 服务器 标签云 作品 关于 赞助列表  <a href="https://github.com/RayeWang" class="f ...

  5. vscode配置基于maven的Javaweb开发

    vscode配置基于maven的Javaweb开发 得益于vscode的便捷性,并且不是很吃电脑性能,所以得到越来越多的青睐,vscode在编写脚本语言比如python上非常好用,但是如果开发大型项目 ...

  6. Dubbo入门---搭建一个最简单的Demo框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...

  7. 基于maven使用IDEA创建多模块项目

    原文地址:http://blog.csdn.net/williamhappy/article/details/54376855 鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDE ...

  8. 云效(原RDC)如何构建一个基于Maven的Java项目

    最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...

  9. java接口自动化Excel占位符_基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架...

    接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...

最新文章

  1. Java虚拟机管理的内存运行时数据区域解释
  2. oracle ebs fah,EBS常用表
  3. 【算法分析与设计】找到最重的球
  4. 转换汇编到shellcode的过程
  5. 配对碱基链(信息学奥赛一本通-T1135)
  6. vivo NEX 3探索5G手机极致新形态:99.6%瀑布屏让左右无界 未来无限
  7. 小米商城抢购脚本_四季度注意了!茅台酒抢购发生了变化
  8. 弹出框之对话框和提示框,可共用代码
  9. Elasticsearch笔记三之版本控制和插件
  10. 8天入门wpf—— 第四天 模板
  11. 2014-07-22 如何成为一名合格的职业人士
  12. multiply 和 dot 的区别
  13. 计算机多余自动启动项,去掉多余的开机启动项
  14. Idea导出项目jar包
  15. 史上最全VPS+云服务器运维面板汇总(收藏)
  16. 【技巧记录】如何批量制作文件夹/文件夹名
  17. MAC 如何隐藏dock栏上你不想看见的图标
  18. 机械臂D-H参数法分析
  19. 关于手机app合并m3u8文件失效,pc端合成方法
  20. 英语老师自用省心天花板小程序

热门文章

  1. O'Relly图书大合集
  2. 如何搭建Git服务器?
  3. Python运行环境搭建
  4. 大数据时代,小数据中心
  5. DataPipeline实时数据融合平台V3.0里程碑版发布!澎湃新动能
  6. 视频格式转换器哪个好用?万兴优转-好用的视频格式转换器
  7. 第一载、初识操作系统
  8. echarts自定义图表颜色,柱状图/饼图自定义渐变色
  9. u8备份文件服务器发现相关的设置不匹配,u8提示文件服务器未配置
  10. 【视频分享】尚硅谷Java视频教程_Dubbo