jFinal基于maven简单的demo
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;"> <a href="/student/delete1/#(x.id)">删除</a> <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;"> <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相关推荐
- spring mvc 基于maven的完整demo
记录一下使用maven构建第一个spring mvc工程的经过. 环境: eclipse Kepler Service Release 2 jdk 1.7 tomcat7.0.52 这里假定eclip ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...
- Dubbo入门----搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
首页 Android Java 服务器 标签云 作品 关于 赞助列表 <a href="https://github.com/RayeWang" class="f ...
- vscode配置基于maven的Javaweb开发
vscode配置基于maven的Javaweb开发 得益于vscode的便捷性,并且不是很吃电脑性能,所以得到越来越多的青睐,vscode在编写脚本语言比如python上非常好用,但是如果开发大型项目 ...
- Dubbo入门---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- 基于maven使用IDEA创建多模块项目
原文地址:http://blog.csdn.net/williamhappy/article/details/54376855 鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDE ...
- 云效(原RDC)如何构建一个基于Maven的Java项目
最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...
- java接口自动化Excel占位符_基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架...
接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...
最新文章
- Java虚拟机管理的内存运行时数据区域解释
- oracle ebs fah,EBS常用表
- 【算法分析与设计】找到最重的球
- 转换汇编到shellcode的过程
- 配对碱基链(信息学奥赛一本通-T1135)
- vivo NEX 3探索5G手机极致新形态:99.6%瀑布屏让左右无界 未来无限
- 小米商城抢购脚本_四季度注意了!茅台酒抢购发生了变化
- 弹出框之对话框和提示框,可共用代码
- Elasticsearch笔记三之版本控制和插件
- 8天入门wpf—— 第四天 模板
- 2014-07-22 如何成为一名合格的职业人士
- multiply 和 dot 的区别
- 计算机多余自动启动项,去掉多余的开机启动项
- Idea导出项目jar包
- 史上最全VPS+云服务器运维面板汇总(收藏)
- 【技巧记录】如何批量制作文件夹/文件夹名
- MAC 如何隐藏dock栏上你不想看见的图标
- 机械臂D-H参数法分析
- 关于手机app合并m3u8文件失效,pc端合成方法
- 英语老师自用省心天花板小程序