jFinal基於maven簡單的demo

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;">
                    &nbsp;&nbsp;<a href="/student/delete1/#(x.id)">刪除</a>
                    &nbsp;&nbsp;<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;">
                    &nbsp;&nbsp;<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) {
    }

}

 

 

 

相關文章
相關標籤/搜索