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 {
//在校验失败时才会调用
@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",
"请输入学生名称!");
}
}
<!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="">
<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", );
m.put("shuxue", );
m.put("yingyu", );
int a = ;
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 {
//在校验失败时才会调用
@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",
"请输入学号!");
}
}
页面
<!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="">
<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="">
<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", , "/", );
} 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) {
} }


jFinal基于maven简单的demo的更多相关文章
- Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)
然后是项目下的文件:完整的项目请看 上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- Dubbo简介---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- 详解SpringMVC中Controller的方法中参数的工作原理——基于maven
转自:http://www.tuicool.com/articles/F7byQn 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- 工具idea 基于maven 创建springMVC项目
SpringMVC Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一般不 ...
- java selenium (三) 环境搭建 基于Maven
现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...
- 菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven)
菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven) 2012-02-04 13:11 by 虫师, 11419 阅读, 5 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...
随机推荐
- js的replace, 高亮
";console.log(str.replace(/\,/g, "")); //输出 123 ";console.log(str);//输出123 " ...
- Python 之selenium+phantomJS斗鱼抓取案例
from selenium import webdriver from bs4 import BeautifulSoup import time if __name__ == '__main__': ...
- PHP 之中文转为拼音
/** * Created by PhpStorm. * User: Administrator * Date: 2019/1/2 0002 * Time: 下午 1:01 */ class PinY ...
- GeckoWebBrowser设置cookie
var uri = new Uri("http://www.aa.com"); //often cookies are stored on domain level, so &qu ...
- grep,cut,wc,sort,diff,uniq,patch命令
文本处理工具: Linux上文本处理三剑客: grep,egrep,fgrep: 文本过滤工具(模式: pattern)工具; grep:基本正则表达式,-E,-F egrep:扩展正则表达式,-G, ...
- PHP中的几个随机数生成函数
PHP中的几个随机数生成函数 rand() 基于 libc 的随机种子发生器 mt_rand() 基于 Mersenne Twister 算法返回随机整数.它可以产生随机数值的平均速度比 libc 提 ...
- Django基础配置
安装djangopip install Django==1.11.4进入pythonimport django查看版本号django.get_version()创建项目,在合适位置创建一个目录进入你要 ...
- Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...
- 【codeforces 508C】Anya and Ghosts
[题目链接]:http://codeforces.com/contest/508/problem/C [题意] 每秒钟可以点一根蜡烛; 这根蜡烛会燃烧t秒; 然后会有m只鬼来拜访你; 要求在鬼来拜访你 ...
- Python之路【第一篇】:Python基础
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...