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 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...
随机推荐
- 为.net mvc core 启用 https
引用nuget包:Microsoft.AspNetCore.Server.Kestrel.Https这是一个服务器测试ssl密钥,密码如代码里面所示 using System; using Syste ...
- ES6 箭头函数this指向问题
var name = "window"; var person1 = { name: "person1", show1: function() { consol ...
- js 阻止冒泡事件和默认事件
阻止事件冒泡 window.enent ? window.enent.cancelBubble = true : e.stopPropagation() function stopBubble(eve ...
- 洛谷——P1757 通天之分组背包
P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...
- php观察折模式
<?php class Paper{ private $_observers = array(); public function register($sub){ $this->_obse ...
- MySQL多表连接操作
select * from userinfo ,dapartment where userinfo.part_id = dapartment.id; --左连接: 左边全部显示 select * fr ...
- Centos下安装mysql(二进制版)
1.下载安装包,选择相应的平台.版本,比如,选择64位Linux平台下的MySQL二进制包“Linux-Generic (glibc 2.5)(x86,64-bit),Compressed” 如:#w ...
- [BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)
传送门 算是个模板. 题目说循环,那就再复制一串拼接上. 然后求后缀数组,再搞就可以. 虽然是求后缀,会在后面多一些字符串,然而题目中说的是循环一圈,但是没有影响. ——代码 #include < ...
- static 语句块
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...
- CODEVS——T 2969 角谷猜想
http://codevs.cn/problem/2969/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descri ...