最近給新人出了一個小測試,我也用JFinal框架作了一下,記錄一下使用過程當中遇到的坑和新學到的知識點javascript
首先是遇到的兩個小問題,css
一個是用最新版的eclipse運行JFinal的maven項目報錯,通過長時間的探索,才發現是JFinal框架項目在最新版本的eclipse中不能按照正常的運行方式,啓動,要更改啓動參數,也就是:html
public static void main(String[] args) { JFinal.start("src/main/webapp", 81, "/", 5); //JFinal.start("src/main/webapp", 82, "/"); }
要改成:java
public static void main(String[] args) { //JFinal.start("src/main/webapp", 81, "/", 5); JFinal.start("src/main/webapp", 82, "/"); }
沒錯,就是要用在IDEA中啓動的方式,去掉最後一個參數。jquery
運行時報錯web
這個問題在於,要把項目中的Tomcat服務器remove掉ajax
測試要求:錄入學生信息,錄入三門課成績,而後根據成績總分排序,而且查詢的時候不能用SQL語句直接查出來,要用Java邏輯判斷數據庫
關鍵在於,查詢的時候不能用SQL語句查出來,並且數據結構是學生表,學號姓名,成績表,學號科目成績,不一樣科目在同一個字段,這樣就稍微複雜一些了apache
接受前臺表單域傳過來的數據並保存到數據庫:json
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); }