首先聲明:為什么搞這樣一個小玩意都用Java和Oracle,原因只有一個:這些環(huán)境都是現(xiàn)成的,僅此而矣。 前天接到新任務(wù):由 于在計算機(jī)樓樓下放置了一臺大屏,要做個簡單的網(wǎng)頁用來顯示當(dāng)前時間指定教學(xué)區(qū)的課表信息,就一個頁面可以了,原來通過瀏覽器打開這個頁以表格形式顯示當(dāng) 前時間對應(yīng)的課表信息,過了這個時間段就自動刷新,讀取新的課表。方便師生了解具體上課信息,因為有好多老師學(xué)生老找不著上課地點,或者搞錯上課時間。 轉(zhuǎn) 到技術(shù)方面大概講講:課表數(shù)據(jù)由正方教務(wù)管理系統(tǒng)提供(oracle),通過視圖把所需要的數(shù)據(jù)抽取出來導(dǎo)到另外一個單獨的表里,主要字段包括:由多組信 息組合成的學(xué)期編號、教學(xué)區(qū)編號、星期幾、學(xué)期的周次,課室編號、課程名稱、任課老師名稱、上課時間(沒有具體時間,以節(jié)數(shù)表示,上午1-4節(jié)課,下午 5-8節(jié)),班級名稱。 具體數(shù)據(jù)格式:
頁面展示格式要求(以計算機(jī)樓這個教學(xué)區(qū)為例:樓層號+順序號=課室編號,如:301表示三樓01號課室。注:沒有一樓,每層04,08室不做課室,所以排除)
根據(jù)頁面要求、數(shù)據(jù)、格式來分析,用什么方式把要的數(shù)據(jù)取出來,又方便調(diào)用成為首要解決的問題。由結(jié)果倒退選擇實現(xiàn)方式,第一感覺就想到了以表格的數(shù)據(jù)行及單元格為突破口,這樣有個好處:方便使用循環(huán)~~因為這些數(shù)據(jù)循環(huán)是少不了的。 一開始有幾個棘手的問題要解決: 1、 數(shù)據(jù)篩選:分析實際數(shù)據(jù)發(fā)現(xiàn)幾個有規(guī)律的地方,學(xué)期字段同一學(xué)期的數(shù)據(jù)均以(2012-2013-1)這樣開頭,兩部分?jǐn)?shù)字為學(xué)年,第三部分是學(xué)期,因此 可以用like ‘(2012-2013-1%’來篩選學(xué)年數(shù)據(jù)。課室編號也有個特點,以計算機(jī)數(shù)為例,就以“信息”開頭加樓層編號和課室序號,因此可以用like ‘信息%’對教學(xué)區(qū)篩選。學(xué)期周次、星期幾、當(dāng)前時間對應(yīng)的課表,這個還需要進(jìn)一步處理,如何通過程序根據(jù)當(dāng)前時間計算出當(dāng)前周次和星期幾和對應(yīng)課時呢? 下文會詳細(xì)說明。 2、數(shù)據(jù)排序:經(jīng)過分析發(fā)現(xiàn),先對課室編號字段排序,再對上課時間字段排序。這樣就得出一個有序數(shù)據(jù)集,方便輸出頁面時處理。 3、數(shù)據(jù)輸出:這里處理輸出數(shù)據(jù)時就要巧妙處理,通過篩選結(jié)果錄集的循環(huán)再內(nèi)嵌6個判斷,這6個判斷分別對應(yīng)當(dāng)前樓層的的6個課室,滿足條件就輸出對應(yīng)課室的課表信息。當(dāng)整個結(jié)果集循環(huán)完畢就得出一份當(dāng)前時間段對應(yīng)的課表信息了。 實現(xiàn)難點、要點: 1、根據(jù)當(dāng)前日期計算與本學(xué)期對應(yīng)的周次。首先要定義一個常量指明本學(xué)期哪天開學(xué),以此日期為參照,通過自定義函數(shù)計算出當(dāng)前是第幾周(因為學(xué)校的周次跟自然周是不一樣的)。附函數(shù): public int computeWeek(Date sdate, Date edate) { int wks = 0; Calendar sCalendar = Calendar.getInstance(); sCalendar.setTime(sdate); Calendar eCalendar = Calendar.getInstance(); eCalendar.setTime(edate); while (sCalendar.before(eCalendar)) { if (sCalendar.get(Calendar.YEAR) == eCalendar .get(Calendar.YEAR) && sCalendar.get(Calendar.MONTH) == eCalendar.get(Calendar.MONTH) && sCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH) == eCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)) { break; } else { sCalendar.add(Calendar.DAY_OF_YEAR, 7); wks += 1; } } return wks+1; //此函數(shù)其實是計算兩個日期之間間隔多少周,因此計算出來的周數(shù)還要加1才是當(dāng)前實際周數(shù)。 } 2、根據(jù)實際上課時間和當(dāng)前時間,換算對應(yīng)是第幾節(jié)課。我采用了笨辦法,如果有其他朋友還有好辦法留言交流學(xué)習(xí)呢。 public String currentJC(Calendar cal){//此函數(shù)的參數(shù)是當(dāng)前時間的Calendar實例 Calendar cal2=(Calendar)cal.clone(); int hour=cal.get(Calendar.HOUR_OF_DAY); if(hour<=8 && checkCurrTime(8,45,cal,cal2)){//解釋下其中一個,其它意思相同。當(dāng)前的鐘點數(shù)是否在8點或者8點以前,而且這個時間還 要小于8:45分,因為超過這個夠數(shù)就算是下一節(jié)課了。所以還用到checkCurrTime這個自定義函數(shù)。 return "1"; }else if(hour<=9 && checkCurrTime(9,40,cal,cal2)){ return "2"; }else if(hour<=10 && checkCurrTime(10,45,cal,cal2)){ return "3"; }else if(hour<=11 && checkCurrTime(11,40,cal,cal2)){ return "4"; }else if(hour<=14 && checkCurrTime(14,45,cal,cal2)){ return "5"; }else if(hour<=15 && checkCurrTime(15,40,cal,cal2)){ return "6"; }else if(hour<=16 && checkCurrTime(16,45,cal,cal2)){ return "7"; }else if(hour<=17 && checkCurrTime(17,40,cal,cal2)){ return "8"; }else return "------"; } public boolean checkCurrTime(int hour,int min,Calendar cal,Calendar cal2){ cal2.set(Calendar.HOUR_OF_DAY,hour); cal2.set(Calendar.MINUTE,min); return cal.getTime().before(cal2.getTime()); } 以上兩個函數(shù)結(jié)合,就可以計算并返回當(dāng)前時間點對應(yīng)的是第幾節(jié),就可以把這個參數(shù)填入SQL對數(shù)據(jù)進(jìn)行過慮,只取對應(yīng)的課表。 3、根據(jù)當(dāng)前時間,計算并組合對應(yīng)的學(xué)期編碼前綴。返回結(jié)果:2012-2013-2,意思是2012至2013學(xué)年第2學(xué)期。 public String getXQ(Calendar cal){ int month=cal.get(Calendar.MONTH)+1; if(month>=2 && month<8) return (cal.get(Calendar.YEAR)-1)+"-"+cal.get(Calendar.YEAR)+"-2"; else return cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.YEAR)+1)+"-1"; } 以上函數(shù)其實不算太嚴(yán)謹(jǐn),只是計算一個大概,因為這樣已經(jīng)可以滿足我的要求了。 整體效果如圖: 第一個圖是當(dāng)前時間沒有課的情況(圖1)
第二個圖是有課的情況(圖2)
困了,洗洗睡吧。如果正好有你也在做這樣的事,歡迎留言交流呢。 本文地址:http://www./tech/program/368850.shtml |
|