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