首先聲明:爲何搞這樣一個小玩意都用Java和Oracle,緣由只有一個:這些環境都是現成的,僅此而矣。html
前天接到新任務:由 於在計算機樓樓下放置了一臺大屏,要作個簡單的網頁用來顯示當前時間指定教學區的課表信息,就一個頁面能夠了,原來經過瀏覽器打開這個頁以表格形式顯示當 前時間對應的課表信息,過了這個時間段就自動刷新,讀取新的課表。方便師生了解具體上課信息,由於有好多老師學生老找不着上課地點,或者搞錯上課時間。sql
轉 到技術方面大概講講:課表數據由正方教務管理系統提供(oracle),經過視圖把所須要的數據抽取出來導到另一個單獨的表裏,主要字段包括:由多組信 息組合成的學期編號、教學區編號、星期幾、學期的周次,課室編號、課程名稱、任課老師名稱、上課時間(沒有具體時間,以節數表示,上午1-4節課,下午 5-8節),班級名稱。瀏覽器
具體數據格式:oracle
字段名稱函數 |
數據樣本學習 |
數據類型編碼 |
學期編號spa |
(2012-2013-2)-1295076-12059-2htm |
Varchar(30)排序 |
教學區編號 |
純數字 |
Varchar(10) |
星期幾 |
純數字 |
Varchar(10) |
學期的周次 |
純數字 |
Varchar(10) |
課室編號 |
5-1-300 信息-301 藝術樓102 |
Varchar(20) |
課程名稱 |
信息與檔案管理 |
Varchar(200) |
任課老師名稱 |
鍾XX |
Varchar(30) |
上課時間 |
1,2 3,4 1,2,3,4 5,6 |
Varchar(30) |
班級名稱 |
11酒店管理4 |
Varchar(30) |
頁面展現格式要求(以計算機樓這個教學區爲例:樓層號+順序號=課室編號,如:301表示三樓01號課室。注:沒有一樓,每層04,08室不作課室,因此排除)
|
01 |
02 |
03 |
05 |
06 |
07 |
2樓 |
《Mysql和PHP開發》 11軟件技術WEB開發 (3,4節)某老師 |
…… |
|
|
|
|
3樓 |
|
|
|
|
|
|
4樓 |
|
|
|
…… |
|
|
5樓 |
|
|
|
|
|
|
6樓 |
|
|
…… |
|
|
|
7樓 |
|
|
|
|
|
|
根據頁面要求、數據、格式來分析,用什麼方式把要的數據取出來,又方便調用成爲首要解決的問題。由結果倒退選擇實現方式,第一感受就想到了以表格的數據行及單元格爲突破口,這樣有個好處:方便使用循環~~由於這些數據循環是少不了的。
一開始有幾個棘手的問題要解決:
一、 數據篩選:分析實際數據發現幾個有規律的地方,學期字段同一學期的數據均以(2012-2013-1)這樣開頭,兩部分數字爲學年,第三部分是學期,所以 能夠用like ‘(2012-2013-1%’來篩選學年數據。課室編號也有個特色,以計算機數爲例,就以「信息」開頭加樓層編號和課室序號,所以能夠用like ‘信息%’對教學區篩選。學期周次、星期幾、當前時間對應的課表,這個還須要進一步處理,如何經過程序根據當前時間計算出當前周次和星期幾和對應課時呢? 下文會詳細說明。
二、數據排序:通過分析發現,先對課室編號字段排序,再對上課時間字段排序。這樣就得出一個有序數據集,方便輸出頁面時處理。
三、數據輸出:這裏處理輸出數據時就要巧妙處理,經過篩選結果錄集的循環再內嵌6個判斷,這6個判斷分別對應當前樓層的的6個課室,知足條件就輸出對應課室的課表信息。當整個結果集循環完畢就得出一份當前時間段對應的課表信息了。
實現難點、要點:
一、根據當前日期計算與本學期對應的周次。首先要定義一個常量指明本學期哪天開學,以此日期爲參照,經過自定義函數計算出當前是第幾周(由於學校的周次跟天然周是不同的)。附函數:
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; //此函數實際上是計算兩個日期之間間隔多少周,所以計算出來的週數還要加1纔是當前實際週數。
}
二、根據實際上課時間和當前時間,換算對應是第幾節課。我採用了笨辦法,若是有其餘朋友還有好辦法留言交流學習呢。
public String currentJC(Calendar cal){//此函數的參數是當前時間的Calendar實例
Calendar cal2=(Calendar)cal.clone();
int hour=cal.get(Calendar.HOUR_OF_DAY);
if(hour<=8 && checkCurrTime(8,45,cal,cal2)){//解釋下其中一個,其它意思相同。當前的鐘點數是否在8點或者8點之前,並且這個時間還 要小於8:45分,由於超過這個夠數就算是下一節課了。因此還用到checkCurrTime這個自定義函數。
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());
}
以上兩個函數結合,就能夠計算並返回當前時間點對應的是第幾節,就能夠把這個參數填入SQL對數據進行過慮,只取對應的課表。
三、根據當前時間,計算並組合對應的學期編碼前綴。返回結果:2012-2013-2,意思是2012至2013學年第2學期。
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";
}
以上函數其實不算太嚴謹,只是計算一個大概,由於這樣已經能夠知足個人要求了。
總體效果如圖:
第一個圖是當前時間沒有課的狀況(圖1)
第二個圖是有課的狀況(圖2)
困了,洗洗睡吧。若是正好有你也在作這樣的事,歡迎留言交流呢。