JFinal 是基於Java 語言的極速 web 開發框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java語言全部優點的同時再擁有ruby、python等動態語言的開發效率。[1]javascript
運用jfinal作一個學生成績管理系統,總分在後臺進行排序,jfinal的各類包的管理和運用和spring-mvc相似 分爲controller,config,model,Interceptor,service,validatorhtml
首先model層java
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。 */ }
controllerpython
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"); } }
Interceptorjquery
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"); } }
serviceweb
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:基本用於添加數據spring
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="1"> <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>
成績管理:sql
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", 0); m.put("shuxue", 0); m.put("yingyu", 0); int a = 0; 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="1"> <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>
總分頁面json
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="/student">返回</a><br> <table id="listtable" border="1"> <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", 80, "/", 5); } 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) { } }