JFinal极速开发框架使用笔记(二) 两个问题,一个发现

最近给新人出了一个小测试,我也用JFinal框架做了一下,记录一下使用过程中遇到的坑和新学到的知识点

首先是遇到的两个小问题,

一个是用最新版的eclipse运行JFinal的maven项目报错,经过长时间的探索,才发现是JFinal框架项目在最新版本的eclipse中不能按照正常的运行方式,启动,要更改启动参数,也就是:

    public static void main(String[] args) {
        JFinal.start("src/main/webapp", 81, "/", 5);
        //JFinal.start("src/main/webapp", 82, "/");
    }

要改为:

    public static void main(String[] args) {
        //JFinal.start("src/main/webapp", 81, "/", 5);
        JFinal.start("src/main/webapp", 82, "/");
    }

没错,就是要用在IDEA中启动的方式,去掉最后一个参数。

运行时报错

java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory

这个问题在于,要把项目中的Tomcat服务器remove掉

测试要求:录入学生信息,录入三门课成绩,然后根据成绩总分排序,并且查询的时候不能用SQL语句直接查出来,要用Java逻辑判断

关键在于,查询的时候不能用SQL语句查出来,而且数据结构是学生表,学号姓名,成绩表,学号科目成绩,不同科目在同一个字段,这样就稍微复杂一些了

接受前台表单域传过来的数据并保存到数据库:

JFinal框架向接受前台表单传过来的参数并增加有两种方法,一种是getBean方式,一种是getModel方式。

getModel方式用来接收表单域传过来的Model对象,表单域名称以”modelName.attrName”方式命名, getModel 使用的 attrName 必须与数据表字段名完全一样。

getBean 方法用于支持传统 Java Bean, 包括支持使用 jfnal 生成器生成了 getter、 setter 方法的 Model, 页面表单传参时使用与 setter 方法相一致的 attrName,而非数据表字段名。getModel 与 getBean 区别在于前者使用数表字段名而后者使用与 setter 方法一致的属性名进行数据注入。

除了这个之外,还可以通过使用空字符串“”实现,表单域中使用正常方式提交,不用加前缀,在后台接受时,使用getModel方法,加一个“”,就可以正常接收数据了。

@Before(StudentTestValidator2.class)
    public void savebeanscore(){
        StudentTest st=getModel(StudentTest.class,"");
        st.save();
        redirect("/student/layui");
    }

同样的,这种方式也可以在表单域中设置专门的前缀,然后再后台用同样的方式用该前缀参数使用getModel方式接受。

然后是录入成绩:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>录入成绩</title>
<script type="text/javascript" src="/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="/layui-v2.2.45/layui/layui.js"></script>
<link rel="stylesheet" href="/layui-v2.2.45/layui/css/layui.css"
    media="all">
</head>
<body>
    <form class="layui-form" action="/test/savebeanscore" method="post"    style="width: 40%; margin-top: 100px">

        <div class="layui-form-item">
            <label class="layui-form-label">学生:</label>
            <div class="layui-input-block">
                <select name="studentid" lay-search id="studentid"></select>
            </div>
            <input type="hidden" id="yincang">
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">课程</label>
            <div class="layui-input-block">
                <select name="classes">
                    <option value="语文">语文</option>
                    <option value="数学">数学</option>
                    <option value="英语">英语</option>
                </select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">成绩</label>
            <div class="layui-input-block">
                <input type="text" name="scouress" placeholder="请输入"
                    autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="scoreform">立即提交</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
    </form>
    <script src="layui.js"></script>
    <script>
layui.use('form', function(){
  var form = layui.form;
  
  $.ajax({
        type : "post",
        url : '/student/getstudentlist',
            data:{page:1,
            limit:1000},
            dataType : "json",
            sync : "false",
            success : function(data) {
                for (var a = 0; a < data.data.length; a++) {
                    $("#studentid").append(
                            "<option class='studentid'  value="+data.data[a].studentid+" >"+ data.data[a].studentname + "</option>")
                }
                form.render('select'); //用ajax追加的需要这样渲染一下
                
            },
            error : function() {
            }
        })

        form.on('select(type)', function(data) {//给隐藏的input赋值)
                $("#yincang").val(data.value);
            });
});
</script>
    //@Before(StudentTestValidator.class)
    public void savescore(){
        StudentTest st=getModel(StudentTest.class);
        st.save();
        redirect("/student/layui");
    } 
    
    @Before(StudentTestValidator2.class)
    public void savebeanscore(){
        StudentTest st=getModel(StudentTest.class,"");
        st.save();
        redirect("/student/layui");
    } 

接下来就是最关键的逻辑部分:

关于这一部分,初衷应该是考察逻辑思维,所以要求查询出数据之后,用java代码把数据组合起来并排序发到前台

这里关键点有两个,一个在于使用Map将储存数据,然后返回Map的List集合

然后就是在给List<Map>集合根据Map中的总分进行排序

    /**
     * 返回综合成绩数据,并根据总分排序 
     */
    public void getlist() {
        
        List<Student> list = Student.dao.find("select * from student");
        List<StudentTest> testlist = StudentTest.dao.find("select * from studenttest");
        List<Map<String,Object>> list1=new ArrayList();

        for(Student s:list){
            Map<String,Object> map=new HashMap();
            map.put("studentid", s.get("studentid"));
            map.put("studentname", s.get("studentname"));
            int sum=0;
            for(StudentTest st:testlist){
                if((s.get("studentid"))== (st.get("studentid"))){
                    
                    if(st.get("classes").equals("语文")){
                        sum+=(Integer)st.get("scouress");
                        map.put("chinese", st.get("scouress"));
                    }else if(st.get("classes").equals("数学")){
                        sum+=(Integer)st.get("scouress");
                        map.put("math", st.get("scouress"));
                    }else if(st.get("classes").equals("英语")){
                        sum+=(Integer)st.get("scouress");
                        map.put("english", st.get("scouress"));
                    }
                    
                }
            }
            map.put("sum", sum);
            list1.add(map);
        }

        Collections.sort(list1, new Comparator<Map<String,Object>>() {
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                int map1value = (Integer) o1.get("sum");
                int map2value = (Integer) o2.get("sum");
                return  map2value-map1value;
            }
        });

        JSONObject jo = new JSONObject();
        jo.put("code", 0);
        jo.put("msg", true);
        jo.put("count",list1.size());
        jo.put("data", list1);
        renderJson(jo);
        
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jimoer

经历的面试题,先做下部分总结。

1643
来自专栏木东居士的专栏

漫谈并发编程:Actor模型

1834
来自专栏DOTNET

设计原则

一、面向对象应用程序开发原则(SOLID) 1单一职责原则(SRP) 定义: 一个类应该只有一个发生变化的原因。这条原则曾被称为内聚性,即一个模块的组成元素之间...

2957
来自专栏听雨堂

字符串处理总结(旧)

在各类应用软件的开发中,字符串操作是最常见的操作之一。在各种不同的数据类型中,字符串类型是和现实世界关联最紧密的。对字符串的读入、比较、拼接、搜索、匹配、替换、...

2488
来自专栏瓜大三哥

HLS Lesson8-基本操作

1.算术操作 ? 如果是定点数处理时候,需要遵循的原则是:大数据不溢出,小数据不损失 2.算数赋值 ? ? #include<iostream> #includ...

2477
来自专栏偏前端工程师的驿站

JS魔法堂:不完全国际化&本地化手册 之 实战篇

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"...

25210
来自专栏编程

C语言嵌入式系统编程修炼之内存操作

这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。 全文目录: C语言嵌入式系统编程修炼之道——背...

2875
来自专栏编程

PLC编程优化方法,让程序运行提速!

PLC、DCS、仪器仪表、电气技术资料,一网打尽 通过本方法优化可以极大的减少程序语句数,使PLC程序更简洁、可读性更好,由于不需要做耗时的类型转换,程序运行效...

2149
来自专栏码洞

老板们都应该学一学 Redis,它能管理上亿对象,你们呢?

我们知道一个大型的公司往往都具有复杂的组织结构,成百上千号员工,要做到大而不乱,就必须依靠合理的组织结构来优化内部的交流成本。Redis 内部也有组织结构,不同...

1615
来自专栏ACM算法日常

魔咒词典(hash表)- HDU 1880

公众号现在输入题号可以直接查看题目啦~比如输入1000,会显示HDU1000的题目内容

942

扫码关注云+社区

领取腾讯云代金券