jfinal学习笔记.docx
- 文档编号:30645235
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:16
- 大小:79.22KB
jfinal学习笔记.docx
《jfinal学习笔记.docx》由会员分享,可在线阅读,更多相关《jfinal学习笔记.docx(16页珍藏版)》请在冰豆网上搜索。
jfinal学习笔记
jfinal框架教程-学习笔记
上一节介绍了jfinal框架的简单搭建,这节通过一个小例子了解jfinal的结构和特点
先上图
1、建数据库(我用的是oracle数据库,其他的相对也差不多)
--Createtable
createtableCLASSES
(
classesidNUMBERnotnull,
classesnameVARCHAR2(20),
classesaddressVARCHAR2(50)
);
--Createtable
createtableSTUDENT
(
studentidNUMBERnotnull,
studentnameVARCHAR2(10),
studentageNUMBER,
studentsexVARCHAR2
(2),
classesidNUMBER
);
altertableSTUDENT
addconstraintFK_CLASSESIDforeignkey(CLASSESID)
referencesCLASSES(CLASSESID);
新建项目,我用的myeclipse,先把jar包导入
2、实体类
Classes.java
packagecom.demo.model;
importcom.jfinal.plugin.activerecord.Model;
publicclassClassesextendsModel
publicstaticfinalClassesdao=newClasses();
}
Student.java
packagecom.demo.model;
importcom.jfinal.plugin.activerecord.Model;
publicclassStudentextendsModel
publicstaticfinalStudentdao=newStudent();
publicClassesgetClasses(){
returnClasses.dao.findById(get("classesid"));//表的属性
}
}
什么这是实体类?
没错!
!
~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。
3、DemoConfig.java
packagecom.demo.config;
importcom.demo.controller.ClassesController;
importcom.demo.controller.StudentController;
importcom.demo.model.Classes;
importcom.demo.model.Student;
importcom.jfinal.config.Constants;
importcom.jfinal.config.Handlers;
importcom.jfinal.config.Interceptors;
importcom.jfinal.config.JFinalConfig;
importcom.jfinal.config.Plugins;
importcom.jfinal.config.Routes;
importcom.jfinal.plugin.activerecord.ActiveRecordPlugin;
importcom.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
importcom.jfinal.plugin.activerecord.dialect.OracleDialect;
importcom.jfinal.plugin.c3p0.C3p0Plugin;
publicclassDemoConfigextendsJFinalConfig{
@Override
publicvoidconfigConstant(Constantsme){
}
@Override
publicvoidconfigHandler(Handlersme){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidconfigInterceptor(Interceptorsme){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidconfigPlugin(Pluginsme){
C3p0Plugincp=newC3p0Plugin("jdbc:
oracle:
thin:
@localhost:
1521:
orcl",
"test","test");
//配置Oracle驱动
cp.setDriverClass("oracle.jdbc.driver.OracleDriver");
me.add(cp);
ActiveRecordPluginarp=newActiveRecordPlugin(cp);
me.add(arp);
//配置Oracle方言
arp.setDialect(newOracleDialect());
//配置属性名(字段名)大小写不敏感容器工厂
arp.setContainerFactory(newCaseInsensitiveContainerFactory());
arp.addMapping("student","studentid",Student.class);
arp.addMapping("classes","classesid",Classes.class);
//参数表:
表名,主键,类
}
@Override//路由,输入工程名加路径进入的文件,。
class文件是。
java文件编辑后生产的文件。
publicvoidconfigRoute(Routesme){
me.add("/",StudentController.class);
me.add("/student",StudentController.class);
me.add("/classes",ClassesController.class);
}
}
我这里是oracle数据库的配置,oracle有些特别的地方,如表列名会自动转成大写,配置个免大小写的工厂,方便开发等。
这里要注意url,驱动,方言,在给个mysql数据库的配置对比下
publicclassDemoConfigextendsJFinalConfig{
publicvoidconfigPlugin(Pluginsme){
C3p0Plugincp=newC3p0Plugin("jdbc:
mysql:
//localhost/db_name",
"userName","password");
me.add(cp);
ActiveRecordPluginarp=newActiveRecordPlugin(cp);
me.add(arp);
arp.addMapping("user",User.class);
arp.addMapping("article","article_id",Article.class);
}
}
4、StudentController.java
packagecom.demo.controller;
importjava.util.List;
importcom.demo.interceptor.StudentInterceptor;
importcom.demo.model.Student;
importcom.demo.validator.StudentValidator;
importcom.jfinal.aop.Before;
importcom.jfinal.core.Controller;
publicclassStudentControllerextendsController{
@Before(StudentInterceptor.class)
publicvoidindex(){
//把查询结果集放入student中
List
//把list的结果集放入studentList,传入下一个界面
setAttr("studentList",list);
render("/index.html");//跳转界面
}
publicvoidadd(){
render("/add.html");
}
publicvoiddelete(){
//获取表单域名为studentID的值
//Student.dao.deleteById(getPara("studentID"));
//获取url请求中第一个值
Student.dao.deleteById(getParaToInt());
forwardAction("/student");
}
publicvoidupdate(){//Student.class。
java文件生产的
Studentstudent=getModel(Student.class);
student.update();
forwardAction("/student");
}
publicvoidget(){
Studentstudent=Student.dao.findById(getParaToInt());
setAttr("student",student);
render("/index2.html");
}
@Before(StudentValidator.class)
publicvoidsave(){
Studentstudent=getModel(Student.class);
student.set("studentid","mysequence.nextval").save();
forwardAction("/student");
}
}
获取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里很详细
5、interceptor和validator(可以不加)
StudentInterceptor.java
packagecom.demo.interceptor;
importcom.jfinal.aop.Interceptor;
importcom.jfinal.core.ActionInvocation;
publicclassStudentInterceptorimplementsInterceptor{
publicvoidintercept(ActionInvocationai){
System.out.println("Beforeactioninvoking");
ai.invoke();//请求,调用
System.out.println("Afteractioninvoking");
}
}
StudentValidator.java
packagecom.demo.validator;
importcom.jfinal.core.Controller;
importcom.jfinal.validate.Validator;
publicclassStudentValidatorextendsValidator{
//在校验失败时才会调用
@Override
protectedvoidhandleError(Controllercontroller){
controller.keepPara("student.studentname");
//将提交的值再传回页面以便保持原先输入的值
controller.render("/add.html");
}
@Override
protectedvoidvalidate(Controllercontroller){
//验证表单域name,返回信息key,返回信息value
validateRequiredString("student.studentname","studentnameMsg",
"请输入学生名称!
");
}
}
6、页面
我这里用的是FreeMarker模板引擎
index.html(主界面)
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
--
姓名
年龄
性别
班级
操作
<#liststudentListasstudent>
${student.studentname}
${student.studentage}
${student.studentsex}
${student.getClasses().classesname}
#list>
index2.html
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
--
value="${student.studentid}"/> 姓名: value="${student.studentname}"/> 年龄: value="${student.studentage}"/> 性别: value="${student.studentsex}"/> 班级: value="${student.classesid}"/> add.html DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> -- 姓名: ${studentnameMsg! }${studentnameLMsg! } 年龄: 性别: 班级: 完成! 浏览器输入http: //localhost/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- jfinal 学习 笔记