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);
}