java jfinal的入门案例
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。
JFinal有如下主要特点:
MVC架构,设计精巧,使用简单
遵循COC原则,零配置,无xml
独创Db + Record模式,灵活便利
ActiveRecord支持,使数据库开发极致快速
自动加载修改后的java文件,开发过程中无需重启web server
AOP支持,拦截器配置灵活,功能强大
Plugin体系结构,扩展性强
多视图支持,支持FreeMarker、JSP、Velocity
强大的Validator后端校验功能
功能齐全,拥有struts2的绝大部分功能
体积小仅339K,且无第三方依赖
1、项目目录:

2、web.xml的配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 3 4 <display-name>JFinalDemo</display-name> 5 <welcome-file-list> 6 <welcome-file>index.html</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 </welcome-file-list> 9 10 <filter> 11 <filter-name>jfinal</filter-name> 12 <filter-class>com.jfinal.core.JFinalFilter</filter-class> 13 <init-param> 14 <param-name>configClass</param-name> 15 <param-value>com.test.config.TestConfig</param-value> 16 </init-param> 17 </filter> 18 <filter-mapping> 19 <filter-name>jfinal</filter-name> 20 <url-pattern>/*</url-pattern> 21 </filter-mapping> 22 </web-app>
3、TestConfig可以看到这是一个配置文件
1 package com.test.config; 2 import com.jfinal.config.Constants; 3 import com.jfinal.config.Handlers; 4 import com.jfinal.config.Interceptors; 5 import com.jfinal.config.JFinalConfig; 6 import com.jfinal.config.Plugins; 7 import com.jfinal.config.Routes; 8 import com.jfinal.plugin.activerecord.ActiveRecordPlugin; 9 import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory; 10 import com.jfinal.plugin.activerecord.dialect.MysqlDialect; 11 import com.jfinal.plugin.c3p0.C3p0Plugin; 12 import com.test.controller.ClassesController; 13 import com.test.controller.StudentController; 14 import com.test.model.Classes; 15 import com.test.model.Student; 16 public class TestConfig extends JFinalConfig{ 17 18 @Override 19 public void configConstant(Constants me) { 20 me.setDevMode(true); 21 } 22 23 @Override 24 public void configInterceptor(Interceptors me) { 25 } 26 27 @Override 28 public void configHandler(Handlers me) { 29 } 30 31 @Override 32 public void configPlugin(Plugins me) { 33 C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://localhost:3306/test","root", "189389"); 34 cp.setDriverClass("com.mysql.jdbc.Driver"); 35 me.add(cp); 36 ActiveRecordPlugin arp = new ActiveRecordPlugin(cp); 37 me.add(arp); 38 arp.setDialect(new MysqlDialect()); 39 arp.setContainerFactory(new CaseInsensitiveContainerFactory()); 40 arp.addMapping("student", "studentid", Student.class); 41 arp.addMapping("classes", "classesid", Classes.class); 42 } 43 44 @Override 45 public void configRoute(Routes me) { 46 me.add("/", StudentController.class); 47 me.add("/student", StudentController.class); 48 me.add("/classes", ClassesController.class); 49 } 50 }
3、StudentValidator 验证器
1 package com.test.validator; 2 import com.jfinal.core.Controller; 3 import com.jfinal.validate.Validator; 4 public class StudentValidator extends Validator{ 5 6 7 @Override 8 protected void validate(Controller c) { 9 validateRequiredString("student.studentname", "studentnameMsg", "请输入学生名称!"); 10 } 11 12 //在校验失败时才会调用 13 @Override 14 protected void handleError(Controller c) { 15 c.keepPara("student.studentname");//将提交的值再传回页面以便保持原先输入的值 16 c.render("/add.html"); 17 } 18 19 }
4、StudentInterceptor 拦截器,这里实际只是简单的空实现
1 package com.test.interceptor; 2 3 import com.jfinal.aop.InterceptorStack; 4 5 6 public class StudentInterceptor extends InterceptorStack { 7 8 @Override 9 public void config() { 10 11 } 12 13 }
5、StudentController 控制器
1 package com.test.controller; 2 import java.util.List; 3 import com.jfinal.core.Controller; 4 import com.test.model.Student; 5 public class StudentController extends Controller { 6 // @Before(StudentInterceptor.class) 7 public void index() { 8 try { 9 List<Student> list = Student.dao.find("select * from student"); 10 setAttr("studentList", list); 11 } catch (Exception e) { 12 e.printStackTrace(); 13 } 14 render("/index.html"); 15 } 16 public void add() { 17 render("/add.html"); 18 } 19 public void delete() { 20 Student.dao.deleteById(getParaToInt()); 21 forwardAction("/student"); 22 } 23 public void update() { 24 try { 25 Student student = getModel(Student.class); 26 student.update(); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 forwardAction("/student"); 31 } 32 public void get() { 33 Student student = Student.dao.findById(getParaToInt()); 34 setAttr("student", student); 35 render("/index2.html"); 36 } 37 public void save() { 38 try { 39 Student student = getModel(Student.class); 40 student.save(); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 forwardAction("/student"); 45 } 46 }
6、Model的使用
1 package com.test.model; 2 3 import com.jfinal.plugin.activerecord.Model; 4 5 @SuppressWarnings("serial") 6 public class Classes extends Model<Classes>{ 7 8 public static final Classes dao = new Classes(); 9 }
1 package com.test.model; 2 3 import com.jfinal.plugin.activerecord.Model; 4 5 @SuppressWarnings("serial") 6 public class Student extends Model<Student>{ 7 8 public static final Student dao = new Student(); 9 10 public Classes getClasses(){ 11 12 return Classes.dao.findById(get("classesid")); 13 } 14 }
7、数据库的配置
1 CREATE TABLE `student` ( 2 `studentid` int(11) NOT NULL AUTO_INCREMENT, 3 `studentname` varchar(10) DEFAULT NULL, 4 `studentage` int(11) DEFAULT NULL, 5 `studentsex` varchar(2) DEFAULT NULL, 6 `classesid` int(11) DEFAULT NULL, 7 PRIMARY KEY (`studentid`), 8 KEY `clsid` (`classesid`), 9 CONSTRAINT `clsid` FOREIGN KEY (`classesid`) REFERENCES `classes` (`classesid`) 10 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; 11 12 13 14 CREATE TABLE `classes` ( 15 `classesid` int(11) NOT NULL AUTO_INCREMENT, 16 `classesname` varchar(20) DEFAULT NULL, 17 `classesaddress` varchar(50) DEFAULT NULL, 18 PRIMARY KEY (`classesid`) 19 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
8、下面的就是页面了
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>add.html</title> 5 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 6 <meta http-equiv="description" content="this is my page"> 7 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 8 <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> 9 </head> 10 <body> 11 <form action="/JFinalDemo/student/save" method="post"> 12 姓名: <input type="text" name="student.studentname" /> 13 ${studentnameMsg!}${studentnameLMsg!} <br /> 年龄: <input type="text" 14 name="student.studentage" /> <br /> 性别: <input type="text" 15 name="student.studentsex" /> <br /> 班级: <input type="text" 16 name="student.classesid" /> <br /> <input type="submit" value="保存" /> 17 </form> 18 </body> 19 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>index.html</title> 5 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 6 <meta http-equiv="description" content="this is my page"> 7 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 8 </head> 9 <body> 10 <a href="/JFinalDemo/student/add">添加</a> 11 <table border="1"> 12 <tr> 13 <td>姓名</td> 14 <td>年龄</td> 15 <td>性别</td> 16 <td>班级</td> 17 <td>操作</td> 18 </tr> 19 <#list studentList as student> 20 <tr> 21 <td>${student.studentname}</td> 22 <td>${student.studentage}</td> 23 <td>${student.studentsex}</td> 24 <td>${student.getClasses().classesname}</td> 25 <td><a href="/JFinalDemo/student/delete/${student.studentid}">删除</a><a href="/JFinalDemo/student/get/${student.studentid}">修改</a> 26 </td> 27 </tr> 28 </#list> 29 </table> 30 </body> 31 </html>
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>index2.html</title> 5 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 6 <meta http-equiv="description" content="this is my page"> 7 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 8 <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> 9 </head> 10 <body> 11 <form action="/JFinalDemo/student/update" method="post"> 12 <input type="text" name="student.studentid" 13 value="${student.studentid}" /> <br /> 姓名: <input type="text" 14 name="student.studentname" value="${student.studentname}" /> <br /> 15 年龄: <input type="text" name="student.studentage" 16 value="${student.studentage}" /> <br /> 性别: <input type="text" 17 name="student.studentsex" value="${student.studentsex}" /> <br /> 18 班级: <input type="text" name="student.classesid" 19 value="${student.classesid}" /> <br /> <input type="submit" 20 value="保存" /> 21 </form> 22 </body> 23 </html>
9、最后给出依赖的jar
1 <?xml version="1.0" encoding="UTF-8"?> 2 <classpath> 3 <classpathentry kind="src" path="src"/> 4 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 5 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/c3p0-0.9.1.2.jar"/> 6 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/freemarker-2.3.16.jar"/> 7 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/javaee.jar"/> 8 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jfinal-1.8-bin-with-src.jar"/> 9 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/log4j-1.2.16.jar"/> 10 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/mysql-connector-java-5.1.20-bin.jar"/> 11 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/velocity-1.2.jar"/> 12 <classpathentry kind="lib" path="WebRoot/WEB-INF/lib/velocity-dep-1.2.jar"/> 13 <classpathentry kind="output" path="WebRoot/WEB-INF/classes"/> 14 </classpath>
这是一个jfinal的入门小案例,这是官网地址(http://www.jfinal.com/)
浙公网安备 33010602011771号