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 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...
随机推荐
- JDK升级
保存jboss运行时环境的配置 删除jboss下面的缓存文件 删除deployments里面的war包 重新build项目
- 配置Android的NDK开发环境(eclipse)
ndk下载地址: http://blog.csdn.net/zhanghuoding/article/details/51345256 在eclipse设置ndk位置 右键你的工程,android t ...
- OI数学知识清单
OI常用的数学知识总结 本文持续更新…… 总结一下OI中的玄学知识 先列个单子,(from秦神 数论 模意义下的基本运算和欧拉定理 筛素数和判定素数欧几里得算法及其扩展[finish] 数论函数和莫比 ...
- Python编程时.py与.pyc文件的介绍
Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候.将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快 ...
- 一个电商项目的Web服务化改造2:现有项目的5个问题
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步, 1.现有项目的问题 1.1代码风格不统一 不同的 ...
- Python与常见加密方式
前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错. 将 ...
- [TS-A1489][2013中国国家集训队第二次作业]抽奖[概率dp]
概率dp第一题,开始根本没搞懂,后来看了09年汤可因论文才基本搞懂,关键就是递推的时候做差比较一下,考虑新加入的情况对期望值的贡献,然后推推公式(好像还是不太会推qaq...) #include &l ...
- LSB、MSB是什么单位
最低有效位 (LSB: Least Significant Bit) 最低有效位(LSB)是给这些单元值的一个二进制整数位位置,就是,决定是否这个数字是偶数或奇数.LSB有时候是指最右边的位,因为 ...
- 络谷 P2865 [USACO06NOV]路障Roadblocks
P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...
- MVC.Net:读取Web.config/App.config配置
需要读取Web.config/App.config的配置很简单,首先我们需要将配置写入到<appSettings>中,例如: <appSettings> <add key ...