• 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="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>

    成绩管理:

    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>

     总分页面

    <!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) {
        }
    
    }

     

  • 相关阅读:
    SQL Server的链接服务器技术小结
    关于ACCESS的日期类型字段比较的一点认识
    Oracle与SQL Server的互连
    有关自定义消息广播 SendMessage(HWND_BROADCAST,WM_MyMsg,0,0);
    呵呵,不错,在这安家啦
    jquery常用验证
    Sql事务
    Jquery解析XML文件
    ASP.NET页面之间传递值的几种方式
    Yahoo,Msn,Skype,QQ,阿里旺旺在线聊天链接接口调用
  • 原文地址:https://www.cnblogs.com/NCL--/p/8320586.html
Copyright © 2020-2023  润新知