---- 在Oracle數(shù)據(jù)庫(kù)系統(tǒng)中,用戶(hù)如果要以特權(quán)用戶(hù)身份(INTERNAL/SYSDBA/SYSOPER)登錄Oracle數(shù)據(jù)庫(kù)可以有兩種身份驗(yàn)證的方法:即使用與操作系統(tǒng)集成的身份驗(yàn)證或使用Oracle數(shù)據(jù)庫(kù)的密碼文件進(jìn)行身份驗(yàn)證。因此,管理好密碼文件,對(duì)于控制授權(quán)用戶(hù)從遠(yuǎn)端或本機(jī)登錄Oracle數(shù)據(jù)庫(kù)系統(tǒng),執(zhí)行數(shù)據(jù)庫(kù)管理工作,具有重要的意義。
---- Oracle數(shù)據(jù)庫(kù)的密碼文件存放有超級(jí)用戶(hù)INTERNAL/SYS的口令及其他特權(quán)用戶(hù)的用戶(hù)名/口令,它一般存放在ORACLE_HOME\DATABASE目錄下。
一、 密碼文件的創(chuàng)建:
---- 在使用Oracle Instance Manager創(chuàng)建一數(shù)據(jù)庫(kù)實(shí)例的時(shí)侯,在ORACLE_HOME\DATABASE目錄下還自動(dòng)創(chuàng)建了一個(gè)與之對(duì)應(yīng)的密碼文件,文件名為PWDSID.ORA,其中SID代表相應(yīng)的Oracle數(shù)據(jù)庫(kù)系統(tǒng)標(biāo)識(shí)符。此密碼文件是進(jìn)行初始數(shù)據(jù)庫(kù)管理工作的基礎(chǔ)。在此之后,管理員也可以根據(jù)需要,使用工具ORAPWD.EXE手工創(chuàng)建密碼文件,命令格式如下:
C:\ >ORAPWD FILE=< FILENAME > PASSWORD
=< PASSWORD > ENTRIES=< MAX_USERS >
---- 各命令參數(shù)的含義為:
---- FILENAME:密碼文件名;
---- PASSWORD:設(shè)置INTERNAL/SYS帳號(hào)的口令;
---- MAX_USERS:密碼文件中可以存放的最大用戶(hù)數(shù),對(duì)應(yīng)于允許以SYSDBA/SYSOPER權(quán)限登錄數(shù)據(jù)庫(kù)的最大用戶(hù)數(shù)。由于在以后的維護(hù)中,若用戶(hù)數(shù)超出了此限制,則需要重建密碼文件,所以此參數(shù)可以根據(jù)需要設(shè)置得大一些。
---- 有了密碼文件之后,需要設(shè)置初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE來(lái)控制密碼文件的使用狀態(tài)。
二、 設(shè)置初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE:
---- 在Oracle數(shù)據(jù)庫(kù)實(shí)例的初始化參數(shù)文件中,此參數(shù)控制著密碼文件的使用及其狀態(tài)。它可以有以下幾個(gè)選項(xiàng):
NONE:指示Oracle系統(tǒng)不使用密碼文件,特權(quán)用戶(hù)的登錄通過(guò)操作系統(tǒng)進(jìn)行身份驗(yàn)證;
EXCLUSIVE:指示只有一個(gè)數(shù)據(jù)庫(kù)實(shí)例可以使用此密碼文件。只有在此設(shè)置下的密碼文件可以包含有除INTERNAL/SYS以外的用戶(hù)信息,即允許將系統(tǒng)權(quán)限SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他用戶(hù)。
SHARED:指示可有多個(gè)數(shù)據(jù)庫(kù)實(shí)例可以使用此密碼文件。在此設(shè)置下只有INTERNAL/SYS帳號(hào)能被密碼文件識(shí)別,即使文件中存有其他用戶(hù)的信息,也不允許他們以SYSOPER/SYSDBA的權(quán)限登錄。此設(shè)置為缺省值。
---- 在REMOTE_LOGIN_PASSWORDFILE參數(shù)設(shè)置為EXCLUSIVE、SHARED情況下,Oracle系統(tǒng)搜索密碼文件的次序?yàn)椋涸谙到y(tǒng)注冊(cè)庫(kù)中查找ORA_SID_PWFILE參數(shù)值(它為密碼文件的全路徑名);若未找到,則查找ORA_PWFILE參數(shù)值;若仍未找到,則使用缺省值ORACLE_HOME\DATABASE\PWDSID.ORA;其中的SID代表相應(yīng)的Oracle數(shù)據(jù)庫(kù)系統(tǒng)標(biāo)識(shí)符。
三、 向密碼文件中增加、刪除用戶(hù):
---- 當(dāng)初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE設(shè)置為EXCLUSIVE時(shí),系統(tǒng)允許除INTERNAL/SYS以外的其他用戶(hù)以管理員身份從遠(yuǎn)端或本機(jī)登錄到Oracle數(shù)據(jù)庫(kù)系統(tǒng),執(zhí)行數(shù)據(jù)庫(kù)管理工作;這些用戶(hù)名必須存在于密碼文件中,系統(tǒng)才能識(shí)別他們。由于不管是在創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例時(shí)自動(dòng)創(chuàng)建的密碼文件,還是使用工具ORAPWD.EXE手工創(chuàng)建的密碼文件,都只包含INTERNAL/SYS用戶(hù)的信息;為此,在實(shí)際操作中,可能需要向密碼文件添加或刪除其他用戶(hù)帳號(hào)。
---- 由于僅被授予SYSOPER/SYSDBA系統(tǒng)權(quán)限的用戶(hù)才存在于密碼文件中,所以當(dāng)向某一用戶(hù)授予或收回SYSOPER/SYSDBA系統(tǒng)權(quán)限時(shí),他們的帳號(hào)也將相應(yīng)地被加入到密碼文件或從密碼文件中刪除。由此,向密碼文件中增加或刪除某一用戶(hù),實(shí)際上也就是對(duì)某一用戶(hù)授予或收回SYSOPER/SYSDBA系統(tǒng)權(quán)限。
---- 要進(jìn)行此項(xiàng)授權(quán)操作,需使用SYSDBA權(quán)限(或INTERNAL帳號(hào))連入數(shù)據(jù)庫(kù),且初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE的設(shè)置必須為EXCLUSIVE。具體操作步驟如下:
創(chuàng)建相應(yīng)的密碼文件;
設(shè)置初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE;
使用SYSDBA權(quán)限登錄:
CONNECT SYS/internal_user_passsword AS SYSDBA;
啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例并打開(kāi)數(shù)據(jù)庫(kù);
創(chuàng)建相應(yīng)用戶(hù)帳號(hào),對(duì)其授權(quán)(包括SYSOPER和SYSDBA):
授予權(quán)限:GRANT SYSDBA TO user_name;
收回權(quán)限:REVOKE SYSDBA FROM user_name;
現(xiàn)在這些用戶(hù)可以以管理員身份登錄數(shù)據(jù)庫(kù)系統(tǒng)了;
四、 使用密碼文件登錄:
---- 有了密碼文件后,用戶(hù)就可以使用密碼文件以SYSOPER/SYSDBA權(quán)限登錄Oracle數(shù)據(jù)庫(kù)實(shí)例了,注意初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE應(yīng)設(shè)置為EXCLUSIVE或SHARED。任何用戶(hù)以SYSOPER/SYSDBA的權(quán)限登錄后,將位于SYS用戶(hù)的Schema之下,以下為兩個(gè)登錄的例子:
---- 1. 以管理員身份登錄:
---- 假設(shè)用戶(hù)scott已被授予SYSDBA權(quán)限,則他可以使用以下命令登錄:
---- CONNECT scott/tiger AS SYSDBA
---- 2. 以INTERNAL身份登錄:
---- CONNECT INTERNAL/INTERNAL_PASSWORD
五、 密碼文件的維護(hù):
---- 1. 查看密碼文件中的成員:
---- 可以通過(guò)查詢(xún)視圖V$PWFILE_USERS來(lái)獲取擁有SYSOPER/SYSDBA系統(tǒng)權(quán)限的用戶(hù)的信息,表中SYSOPER/SYSDBA列的取值TRUE/FALSE表示此用戶(hù)是否擁有相應(yīng)的權(quán)限。這些用戶(hù)也就是相應(yīng)地存在于密碼文件中的成員。
---- 2. 擴(kuò)展密碼文件的用戶(hù)數(shù)量:
---- 當(dāng)向密碼文件添加的帳號(hào)數(shù)目超過(guò)創(chuàng)建密碼文件時(shí)所定的限制(即ORAPWD.EXE工具的MAX_USERS參數(shù))時(shí),為擴(kuò)展密碼文件的用戶(hù)數(shù)限制,需重建密碼文件,具體步驟如下:
---- a) 查詢(xún)視圖V$PWFILE_USERS,記錄下?lián)碛蠸YSOPER/SYSDBA系統(tǒng)權(quán)限的用戶(hù)信息;
---- b) 關(guān)閉數(shù)據(jù)庫(kù);
---- c) 刪除密碼文件;
---- d) 用ORAPWD.EXE新建一密碼文件;
---- e) 將步驟a中獲取的用戶(hù)添加到密碼文件中。
---- 3. 修改密碼文件的狀態(tài):
---- 密碼文件的狀態(tài)信息存放于此文件中,當(dāng)它被創(chuàng)建時(shí),它的缺省狀態(tài)為SHARED。可以通過(guò)改變初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE的設(shè)置改變密碼文件的狀態(tài)。當(dāng)啟動(dòng)數(shù)據(jù)庫(kù)事例時(shí),Oracle系統(tǒng)從初始化參數(shù)文件中讀取REMOTE_LOGIN_PASSWORDFILE參數(shù)的設(shè)置;當(dāng)加載數(shù)據(jù)庫(kù)時(shí),系統(tǒng)將此參數(shù)與口令文件的狀態(tài)進(jìn)行比較,如果不同,則更新密碼文件的狀態(tài)。若計(jì)劃允許從多臺(tái)客戶(hù)機(jī)上啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例,由于各客戶(hù)機(jī)上必須有初始化參數(shù)文件,所以應(yīng)確保各客戶(hù)機(jī)上的初始化參數(shù)文件的一致性,以避免意外地改變了密碼文件的狀態(tài),造成數(shù)據(jù)庫(kù)登陸的失敗。
---- 4. 修改密碼文件的存儲(chǔ)位置:
---- 密碼文件的存放位置可以根據(jù)需要進(jìn)行移動(dòng),但作此修改后,應(yīng)相應(yīng)修改系統(tǒng)注冊(cè)庫(kù)有關(guān)指向密碼文件存放位置的參數(shù)或環(huán)境變量的設(shè)置。
---- 5. 刪除密碼文件:
---- 在刪除密碼文件前,應(yīng)確保當(dāng)前運(yùn)行的各數(shù)據(jù)庫(kù)實(shí)例的初始化參數(shù)REMOTE_LOGIN_PASSWORDFILE皆設(shè)置為NONE。在刪除密碼文件后,若想要以管理員身份連入數(shù)據(jù)庫(kù)的話(huà),則必須使用操作系統(tǒng)驗(yàn)證的方法進(jìn)行登錄。
1、在計(jì)算機(jī) 開(kāi)始--->管理-->服務(wù)中沒(méi)有看到 OracleOraHome92TNSListener 服務(wù),但服務(wù)已經(jīng)啟動(dòng)
2、C:\>lsnrctl start 執(zhí)行完后報(bào)open service error。然后在計(jì)算機(jī) 開(kāi)始--->管理-->服務(wù)中看到 了 OracleOraHome92TNSListener 服務(wù)
3、運(yùn)行regedit.exe啟動(dòng)注冊(cè)表編輯器,在HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/下的Services和CurrentControlSet/Services下找到OracleOraHome92TNSListener項(xiàng),在右邊窗口按右鍵,新建/字符串,取名ImagePath。
雙擊新見(jiàn)的建,在“數(shù)值數(shù)據(jù)”項(xiàng)輸入D:\oracle\ora92\bin\TNSLSNR.EXE(根據(jù)你自己的實(shí)際情況進(jìn)行修改),確定完成。
再次在服務(wù)中雙擊打開(kāi)OracleOraHome92TNSListener的服務(wù)看到其“可執(zhí)行文件的路徑”一欄已經(jīng)顯示了其正確的值。這時(shí)你可以啟動(dòng)監(jiān)聽(tīng)了。
4、C:>tnsping 數(shù)據(jù)庫(kù)SID。看看tns服務(wù)沒(méi)有起來(lái)。如果沒(méi)有起來(lái),用下面的命令
c:\>lsnrctl
lsnrctl>start把這個(gè)服務(wù)起動(dòng)起來(lái)。
c:\>lsnrctl start 后open service error錯(cuò)誤消失,但例程中有一個(gè)狀態(tài)為UNKNOWN,另一個(gè)為READY.命令執(zhí)行成功。
PL/SQL Developer連接Oracle報(bào)錯(cuò):ORA-12514: TNS:監(jiān)聽(tīng)程序當(dāng)前無(wú)法識(shí)別連接描述符中請(qǐng)求的服務(wù)
解決辦法:
??首先重啟下對(duì)應(yīng)的數(shù)據(jù)庫(kù)監(jiān)聽(tīng)服務(wù)(OracleOraDb<?xml:namespace prefix = st1 />10g_home1TNSListener)和數(shù)據(jù)庫(kù)服務(wù)(OracleServiceORCL),如果還沒(méi)解決,就按下面的進(jìn)行操作:
?? 1.打開(kāi)%Oracle安裝目錄%/network/admin/listener.ora文件(C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora)
?? 2.添加:
(SID_DESC =
??? (GLOBAL_DBNAME = ORCL)
??? (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)??
??? (SID_NAME = ORCL)
??? )
?? 3.最后文件改成
SID_LIST_LISTENER =
(SID_LIST =
??? (SID_DESC =
????? (SID_NAME = PLSExtProc)
????? (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
????? (PROGRAM = extproc)
??? )
?? (SID_DESC =
??? (GLOBAL_DBNAME = ORCL)
??? (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)??
??? (SID_NAME = ORCL)
??? )
)
LISTENER =
(DESCRIPTION_LIST =
??? (DESCRIPTION =
????? (ADDRESS = (PROTOCOL = TCP)(HOST = zyk)(PORT = 1521))
??? )
)
以上粗體部件為增加的內(nèi)容,修改后重啟監(jiān)聽(tīng)服務(wù)后即可。
主要思路:
對(duì)于任意2個(gè)日期比如:date_start=2006-10-1、date_end=2006-10-14 ,首先計(jì)算這連個(gè)日期之間的時(shí)間間隔(天數(shù)),然后分別對(duì)date_start 和date_end 取得它們下一個(gè)星期一的日期,這樣就可以得到一個(gè)新的可以整除7的完整日期間隔(這個(gè)新的日期間隔已經(jīng)把星期幾的問(wèn)題剔出掉了),換一種說(shuō)法就是我們可以得到,這兩個(gè)新的日期之間的周數(shù),拿這個(gè)周數(shù)乘以5就是工作日期了(tmpWorkingDays)。但是這個(gè)日期并不是我們所要的日期,接下來(lái)我們要做的就是計(jì)算date_start,date_end這兩個(gè)日期對(duì)于根據(jù)它們所產(chǎn)生的新的日期之間的時(shí)間偏移量,date_start的偏移量(date_start_change)是需要加的,而date_end的這個(gè)偏移量(date_end_change)是需要減去的。 最后我們只要用tmpWorkingDays+date_start_change-date_end_change就是我們所要求的實(shí)際工作日了。以下是所有實(shí)現(xiàn)代碼(兩個(gè)日期跨年也沒(méi)有問(wèn)題)。
希望我的方法能對(duì)大家有用,應(yīng)為這個(gè)算法沒(méi)有考慮到節(jié)假日的問(wèn)題,我以后會(huì)像辦法處理,呵呵,今天就到這里了。
package com.date.utlit;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 計(jì)算任意2個(gè)日期內(nèi)的工作日(沒(méi)有考慮到國(guó)定假日)
* @author user
*
*/
public class DateCal {
/**
??? * @param args
??? */
public static void main(String[] args) {
??? try {
???? String strDateStart = "2006-10-1";
???? String strDateEnd = "2006-10-14";
???? SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
???? Date date_start = sdf.parse(strDateStart);
???? Date date_end = sdf.parse(strDateEnd);
???? DateCal app = new DateCal();
???? Calendar cal_start = Calendar.getInstance();
???? Calendar cal_end = Calendar.getInstance();
???? cal_start.setTime(date_start);
???? cal_end.setTime(date_end);
???? System.out.println("星期-->" + app.getChineseWeek(cal_start)
?????? + " 日期-->" + cal_start.get(Calendar.YEAR) + "-"
?????? + (cal_start.get(Calendar.MONTH) + 1) + "-"
?????? + cal_start.get(Calendar.DAY_OF_MONTH));
???? System.out.println("星期-->" + app.getChineseWeek(cal_end) + " 日期-->"
?????? + cal_end.get(Calendar.YEAR) + "-"
?????? + (cal_end.get(Calendar.MONTH) + 1) + "-"
?????? + cal_end.get(Calendar.DAY_OF_MONTH));
???? System.out.println("工作日為-->"
?????? + app.getWorkingDay(cal_start, cal_end));
???? System.out.println("休息日-->"+app.getHolidays(cal_start, cal_end));
??? } catch (Exception e) {
???? // TODO: handle exception
??? }
}
public int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
??? if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
???? java.util.Calendar swap = d1;
???? d1 = d2;
???? d2 = swap;
??? }
??? int days = d2.get(java.util.Calendar.DAY_OF_YEAR)
????? - d1.get(java.util.Calendar.DAY_OF_YEAR);
??? int y2 = d2.get(java.util.Calendar.YEAR);
??? if (d1.get(java.util.Calendar.YEAR) != y2) {
???? d1 = (java.util.Calendar) d1.clone();
???? do {
????? days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
????? d1.add(java.util.Calendar.YEAR, 1);
???? } while (d1.get(java.util.Calendar.YEAR) != y2);
??? }
??? return days;
}
/**
??? * 計(jì)算2個(gè)日期之間的相隔天數(shù)
??? * @param d1
??? * @param d2
??? * @return
??? */
public int getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {
??? int result = -1;
??? if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
???? java.util.Calendar swap = d1;
???? d1 = d2;
???? d2 = swap;
??? }
??? int betweendays = getDaysBetween(d1, d2);
??
??? int charge_date = 0;
??? int charge_start_date = 0;//開(kāi)始日期的日期偏移量
??? int charge_end_date = 0;//結(jié)束日期的日期偏移量
???? // 日期不在同一個(gè)日期內(nèi)
???? int stmp;
???? int etmp;
???? stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
???? etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
???? if (stmp != 0 && stmp != 6) {// 開(kāi)始日期為星期六和星期日時(shí)偏移量為0
????? charge_start_date = stmp - 1;
???? }
???? if (etmp != 0 && etmp != 6) {// 結(jié)束日期為星期六和星期日時(shí)偏移量為0
????? charge_end_date = etmp - 1;
???? }
//??? }
??? result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7)
????? * 5 + charge_start_date - charge_end_date;
??? //System.out.println("charge_start_date>" + charge_start_date);
??? //System.out.println("charge_end_date>" + charge_end_date);
??? //System.out.println("between day is-->" + betweendays);
??? return result;
}
public String getChineseWeek(Calendar date) {
??? final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
????? "星期六" };
??? int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
??? // System.out.println(dayNames[dayOfWeek - 1]);
??? return dayNames[dayOfWeek - 1];
}
/**
??? * 獲得日期的下一個(gè)星期一的日期
??? *
??? * @param date
??? * @return
??? */
public Calendar getNextMonday(Calendar date) {
??? Calendar result = null;
??? result = date;
??? do {
???? result = (Calendar) result.clone();
???? result.add(Calendar.DATE, 1);
??? } while (result.get(Calendar.DAY_OF_WEEK) != 2);
??? return result;
}
/**
??? *
??? * @param d1
??? * @param d2
??? * @return
??? */
public int getHolidays(Calendar d1,Calendar d2){
??? return this.getDaysBetween(d1, d2)-this.getWorkingDay(d1, d2);
??
}
}
數(shù)值函數(shù):abs(m) m的絕對(duì)值mod(m,n) m被n除后的余數(shù)power(m,n) m的n次方round(m[,n]) m四舍五入至小數(shù)點(diǎn)后n位的值(n缺省為0)trunc(m[,n]) m截?cái)鄋位小數(shù)位的值(n缺省為0)--------------------------------------------------------------------------------字符函數(shù):initcap(st) 返回st將每個(gè)單詞的首字母大寫(xiě),所有其他字母小寫(xiě)lower(st) 返回st將每個(gè)單詞的字母全部小寫(xiě)upper(st) 返回st將每個(gè)單詞的字母全部大寫(xiě)concat(st1,st2) 返回st為st2接st1的末尾(可用操作符"||")lpad(st1,n[,st2]) 返回右對(duì)齊的st,st為在st1的左邊用st2填充直至長(zhǎng)度為n,st2的缺省為空格rpad(st1,n[,st2]) 返回左對(duì)齊的st,st為在st1的右邊用st2填充直至長(zhǎng)度為n,st2的缺省為空格ltrim(st[,set]) 返回st,st為從左邊刪除set中字符直到第一個(gè)不是set中的字符。缺省時(shí),指的是空格rtrim(st[,set]) 返回st,st為從右邊刪除set中字符直到第一個(gè)不是set中的字符。缺省時(shí),指的是空格replace(st,search_st[,replace_st]) 將每次在st中出現(xiàn)的search_st用replace_st替換,返回一個(gè)st。缺省時(shí),刪除search_st substr(st,m[,n]) n=返回st串的子串,從m位置開(kāi)始,取n個(gè)字符長(zhǎng)。缺省時(shí),一直返回到st末端length(st) 數(shù)值,返回st中的字符數(shù)instr(st1,st2[,m[,n]]) 數(shù)值,返回st1從第m字符開(kāi)始,st2第n次出現(xiàn)的位置,m及n的缺省值為1 例:???? 1. select initcap('THOMAS'),initcap('thomas') from test; initca initca ------ ------ Thomas Thomas???? 2. select concat('abc','def') "first" from test; first ----- abcdef???? 3. select 'abc'||' '||'def' "first" from test; first ----- abc def???? 4. select lpad(name,10),rpad(name,5,'*') from test; lpad(name,10) rpad(name,5,'*') ------------ ---------------- mmx???? mmx** abcdef abcde???? 5. 去掉地址字段末端的點(diǎn)及單詞st和rd select rtrim(address,'. st rd') from test???? 6. select name,replace(name,'a','*') from test; name replace(name,'a','*') ---- --------------------- great gre*t???? 7. select substr('archibald bearisol',6,9) a,substr('archibald bearisol',11) b from test; a b ------- ------- bald bear bearisol???? 8. select name,instr(name,' ') a,instr(name,' ',1,2) b from test; name a b ------- -------- --------- li lei 3 0 l i l 2 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%轉(zhuǎn)換函數(shù):nvl(m,n) 如果m值為null,返回n,否則返回mto_char(m[,fmt]) m從一個(gè)數(shù)值轉(zhuǎn)換為指定格式的字符串fmt缺省時(shí),fmt值的寬度正好能容納所有的有效數(shù)字 to_number(st[,fmt]) st從字符型數(shù)據(jù)轉(zhuǎn)換成按指定格式的數(shù)值,缺省時(shí)數(shù)值格式串的大小正好為整個(gè)數(shù)附: to_char()函數(shù)的格式: --------------------------------- 符號(hào) 說(shuō)明 --------------------------------- 9 每個(gè)9代表結(jié)果中的一位數(shù)字 0 代表要顯示的先導(dǎo)0 $ 美元符號(hào)打印在數(shù)的左邊 L 任意的當(dāng)?shù)刎泿欧?hào) . 打印十進(jìn)制的小數(shù)點(diǎn) , 打印代表千分位的逗號(hào) --------------------------------- 例:1. select to_number('123.45')+to_number('234.56') form test; to_number('123.45')+to_number('234.56') ---------------------------------------- 358.01 2. select to_char(987654321) from test; to_char(987654321) ------------------ 987654321 3. select to_char(123,'$9,999,999') a,to_char(54321,'$9,999,999') b,to_char(9874321,'$9,999,999') c from test; a b c ------- ---------- ----------- $123 $54,321 $9,874,321 4. select to_char(1234.1234,'999,999.999') a,to_char(0.4567,'999,999.999') b,to_char(1.1,'999,999.999') from test; a b c --------- ---------- ------------ 1,234.123 .457 1.100 --------------------------------------------------------------------------------分組函數(shù):avg([distinct/all] n) 列n的平均值count([all] *) 返回查詢(xún)范圍內(nèi)的行數(shù)包括重復(fù)值和空值count([distinct/all] n) 非空值的行數(shù)max([distinct/all] n) 該列或表達(dá)式的最大值min([distinct/all] n) 該列或表達(dá)式的最小值stdev([distinct/all] n) 該列或表達(dá)式的標(biāo)準(zhǔn)偏差,忽略空值sum([distinct/all] n) 該列或表達(dá)式的總和variance([distinct/all] n) 該列或表達(dá)式的方差,忽略空值 --------------------------------------------------------------------------------日期函數(shù): >add_months(d,n) 日期d加n個(gè)月last_day(d) 包含d的月份的最后一天的日期month_between(d,e) 日期d與e之間的月份數(shù),e先于dnew_time(d,a,b) a時(shí)區(qū)的日期和時(shí)間d在b時(shí)區(qū)的日期和時(shí)間next_day(d,day) 比日期d晚,由day指定的周幾的日期sysdate 當(dāng)前的系統(tǒng)日期和時(shí)間greatest(d1,d2,...dn) 給出的日期列表中最后的日期least(d1,k2,...dn) 給出的日期列表中最早的日期to_char(d [,fmt]) 日期d按fmt指定的格式轉(zhuǎn)變成字符串to_date(st [,fmt]) 字符串st按fmt指定的格式轉(zhuǎn)成日期值,若fmt忽略,st要用缺省格式round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期trunc(d [,fmt]) 日期d按fmt指定格式截?cái)嗟阶罱娜掌诟剑?/span>
日期格式:--------------------------------
格式代碼
說(shuō)明
舉例或可取值的范圍--------------------------------
DD 該月某一天 1-3 DY
三個(gè)大寫(xiě)字母表示的周幾 SUN,...SAT DAY 完整的周幾,大寫(xiě)英文 SUNDAY,...SATURDAY MM 月份 1-12 MON 三
個(gè)大寫(xiě)字母表示的月份 JAN,...DEC MONTH 完整 JANUARY,...DECEMBER RM 月份的羅馬數(shù)字 I,...XII YY或YYYY 兩位,四位數(shù)字年 HH:MI:SS 時(shí):分:秒 HH12或HH24 以12小時(shí)或24小時(shí)顯示 MI 分 SS 秒 AM或PM 上下午指示符 SP 后綴SP要求拼寫(xiě)出任何數(shù)值字段 TH 后綴TH表示添加的數(shù)字是序數(shù) 4th,1st FM 前綴對(duì)月或日或年值,禁止填充---------------------------------例:
1. 下一個(gè)周五的日期 select next_day(sysdate,6) from test; 2. 兩個(gè)月前的今天的日期 select add_months(sysdate,-2) from test;
壹.呤紅篇(紅摟夢(mèng)十二支曲)---一.呤<紅摟夢(mèng)>"引子"
1.開(kāi)辟鴻蒙情種生,情濃風(fēng)月奈何天.愚衷誰(shuí)遣翻添劇,悼玉悲金塵世緣.
2.身心物否奈何天,懺悔情場(chǎng)曲解言.勢(shì)潰利崩今世恨,四家結(jié)局盡哀憐.
3.十二曲情絕可憐,紅摟夢(mèng)引淚漣漣.悲哀寂寞憤愁極,誤盡韶華多少年.
4.一部紅摟千古恨,支支曲調(diào)訴衷紜.人寰無(wú)極因何故,苦樂(lè)酸甜年復(fù)年.
5.興盡悲來(lái)過(guò)后哀,人生結(jié)局使人駭.紅顏艷艷天嬌慧,誤入情場(chǎng)悔不該.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---二.呤"終身誤"
1.青根山峰頑石珍,靈河仙草絳珠身.相逢總是天真對(duì),夢(mèng)里難忘心里人.
2.人說(shuō)寶釵金玉緣,難忘竟是絳珠仙.陰差陽(yáng)錯(cuò)終生苦,換棟偷梁終恨天.
3.正統(tǒng)規(guī)身愿勿違,背經(jīng)叛道自成其.婚姻自主難能貴,封建其時(shí)誤盡余.
4.移花接木王熙風(fēng),毀稿焚詩(shī)腸斷時(shí).鼓里良緣原是夢(mèng),醒來(lái)慟哭吊靈悲.
5.卿卿我我憶當(dāng)時(shí),淚落荷鋤花葬之.共讀西廂曾幾日,瑤琴不見(jiàn)實(shí)堪悲.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---三.呤"枉凝眉"
1.仙葩聞苑惜芳華,美玉無(wú)瑕證卞家.若說(shuō)奇緣真不假,為何偏遇此奇葩.
2.若說(shuō)奇緣偏遇她,相逢心事話(huà)虛差.空勞牽掛空嗟訝,水里月光鏡里花.
3.萬(wàn)千心事從何訴,雁去燕來(lái)幾度春.正值飛紅花逝水,瓊樓幾度憶親人.
4.凝眉卻是緣何事,屢屢詩(shī)成詠美人.一個(gè)空勞一個(gè)掛,天階徒自看星辰.
5.凝眉柢事欠情虧,我亦癡情大覺(jué)非.試問(wèn)眼中多少淚,春流到夏幾多回.
6.凝眉深處憶非非,愁去愁來(lái)總自癡.叛逆道同同建愛(ài),真心純潔自無(wú)虧.
7.婚姻政治互相謀,家世相同門(mén)戶(hù)投.兒女同行難遂愿,終生悔恨感其由.
8.王氏夫人熙風(fēng)詭,大權(quán)操在伊心懷.愛(ài)情從此成悲劇,落入空門(mén)寶玉乖.
9.絳珠仙草黃泉赴,頻吊靈魂淚不干.遺恨終生何所謂,鼓鐘經(jīng)卷透心寒.
10.枉自凝眉千百度,何心何意竟何之.何年何月花飛際,何地何天相去隨.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---四.呤"恨無(wú)常"
1.榮華正茂賦青春,燕舞鶯歌彩蝶頻.烈火烹油大有得,鮮花著錦德妃珍.
2.珍珠寶玉嵌玲瓏,憂(yōu)似黃鶯囚入籠.統(tǒng)治集團(tuán)為己利,嬌身姿艷薦皇宮.
3.賈府之門(mén)有靠山,仕途官場(chǎng)好售奸.回家之日榮華極,那個(gè)不惜天府攀.
4.德才賢孝德賢妃,風(fēng)藻尚書(shū)女史稀.榮府高堂貴顯極,大觀(guān)園耀樂(lè)何之.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---五.呤"分骨肉"
1.才自清明志自高,探春智慧勝諸曹.清風(fēng)明月常相詠,調(diào)理家常總自豪.
2.大廈將傾欲補(bǔ)天,祗緣塵世世情顛.身居瓊閣有鯤志,欲出人頭地涌先.
3.封建末時(shí)萬(wàn)事非,狂瀾欲挽費(fèi)心機(jī).閨中賢淑天真女,經(jīng)世奇才才德施.
4.一年容易又秋風(fēng),翠袖天寒易至冬.欲假他山誠(chéng)不易,皆因自古有窮通.
5.自古窮通何有定,悲歡離合豈無(wú)緣.命途多舛逢遭遇,天假前因作鏡懸.
6.蟲(chóng)魚(yú)門(mén)戶(hù)自良家,秋月春風(fēng)度度華.遠(yuǎn)適他方終是恨,東皇誤嫁悔何差.
7.東風(fēng)無(wú)力百花斜,蜂蝶有心逐麗華.雨雨風(fēng)風(fēng)誰(shuí)作主,生非薄命不為花.
8.各自紛飛奈若何,分奔離析感磋跎.心機(jī)費(fèi)盡空撈月,潦倒乾坤我泣歌.
9.一帆風(fēng)順路三千,骨肉分離痛故國(guó).但愿爺娘莫念女,平安各保莫牽連.
10.山水遙迢奴去也,身神消損誤殘年.人生離合竟如此,目斷山高各一天.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---六.呤"樂(lè)中悲"
1.史氏湘云命苦殃,生來(lái)從小令雙亡.家雖富貴誰(shuí)人養(yǎng),史鼎叔家愛(ài)不香.
2.春風(fēng)秋月等閑度,兒女情懷未系將.月貌花顏?zhàn)素藏?天真爛漫意情芳.
3.花宮月貌意情芳,詠月呤詩(shī)桃李香.最是撩人心緒處,欄桿獨(dú)倚費(fèi)思量.
4.霽月風(fēng)光照玉堂,性情豪爽度宏量.天真妖冶臨風(fēng)際,花欲言兮玉欲香.
5.天真窕窈自天香,如愿東床如意郎.你我卿卿天比翼,前程地久與天長(zhǎng).
6.老天為啥太荒唐,如意郎君早夭亡.天不由人何慘酷,年年月月淚雙行.
7.父母雙亡夫夭亡,飄零花落水隨將.賈家親戚雖名府,寄以斯身無(wú)別望.
8.身世坎坷命自傷,途窮湘水固湘江.多磨好事終難得,浮落高唐散霧茫.
9.磋跎身世感滄桑,變換無(wú)窮恨命殃.泡影浮云何足慮,地天日月自消長(zhǎng).
10.天地?zé)o仁殘且酷,日無(wú)光彩月偏陰.鮮花雖美紛紛墜,滿(mǎn)地殘英任雨淋.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---七.呤"世難容"
1.窈窕身材如女仙,月宮有意任回旋.身居府院繁華處,大廈紅樓夢(mèng)好天.
2.仕宦之家身世賢,才華出眾賽神仙.天生孤僻人言鮮,氣質(zhì)如蘭情意綿.
3.質(zhì)本為蘭氣潔馨,妙玉正是女?huà)尚?他生未卜今生愿,落人紅塵情惜惺.
4.過(guò)分凈潔俗凡嫌,高尚情操人妒賢.世時(shí)茫茫紛亂仄,當(dāng)歌當(dāng)泣訴琴弦.
5.紅塵總是老紅塵,辜負(fù)華年綽約身.世道斯時(shí)多混濁,仙妹轉(zhuǎn)眼變庸人.
6.瞬息之間繁轉(zhuǎn)湮,當(dāng)時(shí)社會(huì)太私夤.妙玉本是天真女,落入尼庵避世塵.
7.青燈一盞誦經(jīng)頻,人世無(wú)聞修后因.何必王孫公子嘆,再生夢(mèng)里化真人.
8.碌碌紅塵違爾愿,淖污畏陷早抽身.佛門(mén)靜地空空也,超脫凡塵凈度貧.
9.無(wú)作無(wú)為度此身,天真紅粉變尼人.榮華富貴如塵土,喜怒樂(lè)哀無(wú)別論.
10.仕宦之家小姐身,窮途潦倒有原因.逃禪雖屬歸真法,凈土難能凈潔氤.
11.昔時(shí)之事莫今量,消極何言沒(méi)有方.如若爾身值此世,爾能展法度身芳.
壹.呤紅篇(紅摟夢(mèng)十二支曲)---八.呤"喜冤家"
1. 何喜冤家冤恨長(zhǎng),中山狼本狠心狼.貪而無(wú)厭居心險(xiǎn),獸面蛇心黑肚腸.
2.趨炎附勢(shì)惡如魔,殘暴荒淫罪孽多.可恨惡狼孫紹祖,天仙嬌女吞泥窩.
3.繁華四族已傾禿,高筑債臺(tái)難活之.胝用迎春作抵押,鮮花墜入污泥溪.
4.如花似玉天嬌女,落入獸巢命陷淪.薄命如斯終古恨,侯門(mén)艷質(zhì)化灰塵.
5.迎春命苦歸山狼,越想越思哭斷腸.麗質(zhì)天生遭獸污,嗚呼一命付汪洋.
6.法外逍遙孫紹祖,害人罪惡賈包之.驕奢淫佚尋常事,公輔千金作賤妓.
7.負(fù)義忘恩孫紹祖,祖冤祖孽統(tǒng)乘之.尋歡作樂(lè)污多女,害命貪財(cái)勝虎豹.
8.芳魂艷魄劇悠悠,害人黃泉恨不休.昔日恩由全不問(wèn),恩人當(dāng)作是冤仇.
9.迎春誤入冤家孽,不了深仇眾恨之.天否無(wú)睛人不管,冤冤怨怨報(bào)何為.
10.人世偏多此惡官,胡為亂作喜歡歡.皇朝大廈將傾倒,罪孽深深后人寒.
Struts2 發(fā)布已經(jīng)有一段時(shí)間了。
(http://struts.apache.org/downloads.html)
最近正在做的項(xiàng)目已經(jīng)到了尾聲,利用這段空閑的時(shí)間,我試用了一下Struts2。
跟Struts1 相比,Struts2 做了不少改變,例如:Struts2提供一個(gè)ActionSupport基類(lèi)去實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對(duì)象都可以用作Struts2的Action對(duì)象,具體可以參考apache官方網(wǎng)站。
http://struts.apache.org/2.0.6/index.html
我的感覺(jué)是Struts2變的更加靈活了。
好,既然是學(xué)習(xí),Hello World 程序是必不可少的。
第一步,先看看系統(tǒng)要求:
Platform Requirements
Struts 2 requires
Servlet API 2.4
JSP API 2.0
Java 5
更具體系統(tǒng)要求可以在文檔說(shuō)明中找到。
第二步,了解如何部署Struts2程序。
我手上沒(méi)有支持Struts2的IDE所以只有自己多花點(diǎn)力氣了。
在以下鏈接中可以找到部署Struts2程序的三種方法:
http://struts.apache.org/2.0.6/docs/ready-set-go.html
1. Use the blank template (在struts-2.0.6-all.zip)
2. run the Maven archetype
3. just setup a web infrastructure from scratch
我用了第三種方法。
http://struts.apache.org/2.0.6/docs/simple-setup.html 這個(gè)鏈接上面說(shuō)的很明白。主意需要庫(kù),多了或者少了都會(huì)出問(wèn)題。
我就試過(guò)把struts-2.0.6-all.zip包里邊的lib全部拷貝過(guò)去,結(jié)果在tomcat啟動(dòng)的過(guò)程中出現(xiàn)一下錯(cuò)誤:
嚴(yán)重: Error filterStart
查看tomcat日志,消耗了不少時(shí)間終于排除了問(wèn)題。
可能是里邊的一些plugin包引起的,以后在慢慢研究怎么回事。
好了,按照simple-setup.html中的說(shuō)明把程序部署好。部署好之后的目錄結(jié)構(gòu)如下:
struts2
├─META-INF
│?????? MANIFEST.MF
│
├─WEB-INF
│?? │?? web.xml
│?? │
│?? ├─classes
│?? │?? │?? struts.xml
│?? │?? │
│?? │?? └─org
│?? │?????? └─sen
│?? │?????????? └─hello
│?? │?????????????????? HelloWorld.class
│?? │
│?? └─lib
│?????????? antlr-2.7.2.jar
│?????????? commons-beanutils-1.6.jar
│?????????? commons-chain-1.1.jar
│?????????? commons-logging-1.0.4.jar
│?????????? commons-validator-1.3.0.jar
│?????????? freemarker-2.3.8.jar
│?????????? ognl-2.6.11.jar
│?????????? oro-2.0.8.jar
│?????????? struts2-core-2.0.6.jar
│?????????? xwork-2.0.1.jar
│
└─hello
???????? HelloWorld.jsp
【注】我這個(gè)程序跟http://struts.apache.org/2.0.6/docs/hello-world.html上面的Hello world 是一樣的,只是改了包名。
啟動(dòng)tomcat,成功了^_^。
因?yàn)槲矣玫拈_(kāi)發(fā)工具試myEclipse 于是,我便試著把這個(gè)項(xiàng)目遷移到eclipse中去
在eclipse 中新建項(xiàng)目Struts2 然后把所有的文件復(fù)制過(guò)去。最后目錄結(jié)構(gòu)為:
struts2
│?? .project
│?? .mymetadata
│?? .classpath
│
├─src
│?? │?? struts.xml
│?? │
│?? └─org
│?????? └─sen
│?????????? └─hello
│?????????????????? HelloWorld.java
│
├─WebRoot
│?? ├─WEB-INF
│?? │?? │?? web.xml
│?? │?? │
│?? │?? ├─lib
│?? │?? │?????? struts2-core-2.0.6.jar
│?? │?? │?????? ...
│?? │?? └─classes
│?? │?????? │?? struts.xml
│?? │?????? │
│?? │?????? └─org
│?? │?????????? └─sen
│?? │?????????????? └─hello
│?? │?????????????????????? HelloWorld.class
│?? │
│?? ├─META-INF
│?? │?????? MANIFEST.MF
│?? │
│?? └─hello
│?????????? HelloWorld.jsp
│
├─.myeclipse
└─.settings
???????? ...
myEclipse 可以正確發(fā)布,但是啟動(dòng)的時(shí)候出現(xiàn)問(wèn)題。
java.lang.UnsupportedClassVersionError: org/apache/struts2/dispatcher/FilterDispatcher (Unsupported major.minor version 49.0)
經(jīng)過(guò)檢查發(fā)現(xiàn)原因所在:我elipse的編譯器雖然設(shè)成了jdk1.5,但是eclipse啟動(dòng)tomcat的時(shí)候還是用之前設(shè)的jdk1.4。把啟動(dòng)在myeclipse的application server下面找到tomcat并且把jdk設(shè)為jdk1.5便ok了。
上面是我在試用struts2的時(shí)候遇到的一點(diǎn)波折。
環(huán)境搭好了,剩下的就是抓時(shí)間應(yīng)該深入學(xué)習(xí)一下。
在這篇文章中,將為大家介紹一種基于JSP且靈活有趣的技術(shù),那就是JSTL.JSTL全稱(chēng)為Java Server Pages Standard Tag Library.雖然JSP已經(jīng)變的非常流行,但JSTL在基于SQL數(shù)據(jù)庫(kù)的簡(jiǎn)單、快速的前后臺(tái)開(kāi)發(fā)中還是沒(méi)有被廣泛的應(yīng)用。一旦你了解了JSTL,你就會(huì)了解到它的優(yōu)點(diǎn),并發(fā)現(xiàn)在你作為程序員的日常工作中,它已經(jīng)被應(yīng)用到了很多方面。我這里假設(shè)你已經(jīng)熟悉HTML,能理解基本的SQL語(yǔ)句,和Jsp的基礎(chǔ)知識(shí)。因?yàn)橄旅娴膬?nèi)容要涉及到這些知識(shí)。
JSTL是一個(gè)已經(jīng)被標(biāo)準(zhǔn)化的標(biāo)記庫(kù)集合,她支持迭代、條件、XML文檔的解析,國(guó)際化,和利用SQL與數(shù)據(jù)庫(kù)交互的功能。起初,JSTL規(guī)范一直由JCP(Java Community process program)組織下的JSR #52 發(fā)展完善,"JCP肩負(fù)著Java 技術(shù)發(fā)展的重任"--官方網(wǎng)站這樣評(píng)價(jià)。JCP作為一個(gè)開(kāi)放性的組織,他同時(shí)吸收正式的會(huì)員和非正式會(huì)員.JCP對(duì)于Java技術(shù)規(guī)范的形成與發(fā)展發(fā)揮了重要的主導(dǎo)作用。JSTL主要包括四個(gè)基本部分的標(biāo)記庫(kù):Core,XML,國(guó)際化,和對(duì)SQL的支持。由于這篇文章的主要是以其中的SQL部分的應(yīng)用來(lái)快速了解JSTL,所以我們這篇文章只介紹了 Core和SQl標(biāo)簽庫(kù)的一些基本功能。
這項(xiàng)技術(shù)簡(jiǎn)單而且功能強(qiáng)大,足以和PHP、ColdFusion一較高下.他在拓展Java的應(yīng)用領(lǐng)域方面有足夠的能力,這些領(lǐng)域不只包括大型的可再升級(jí)的Web應(yīng)用程序,對(duì)于僅擁有簡(jiǎn)單主頁(yè)的Web程序一樣沒(méi)問(wèn)題。這允許你在建立站點(diǎn)的時(shí)候可以避免那些經(jīng)常考慮的XML的集成和與數(shù)據(jù)庫(kù)的連接。正如我剛才提到的一樣,JSTL的關(guān)鍵點(diǎn)就是簡(jiǎn)單易用。還有,那就是JSTL是基于JSP構(gòu)建的, 他允許我們使用所有的Java技術(shù),這一點(diǎn)我們有必要記住。
開(kāi)始之前,我們需要弄清楚怎樣才能運(yùn)行JSTL.由于是基于JSP技術(shù)的,所以我們運(yùn)行它就需要一個(gè)能夠編譯JSP的容器,這里我們使用免費(fèi)的JSP容器:TOMCAT(http://jakarta.apache.org/tomcat/index.html).至于如何安裝這個(gè)產(chǎn)品已經(jīng)超出了本文所講述的范圍。毫無(wú)疑問(wèn),這個(gè)軟件產(chǎn)品現(xiàn)在已經(jīng)很普及了,而且關(guān)于如何安裝的文檔資料也是很多。這里假設(shè)您已經(jīng)安裝并成功配置了這個(gè)容器,你只需再安裝JSTL運(yùn)行所需文件即可,它可以從這里下載http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html你不需要真正的安裝它,只需要將其中的.JAR文件包含到你的應(yīng)用程序的WEB-INF/lib目錄下即可,稍后我會(huì)具體說(shuō)到該怎么做.
因?yàn)槲覀円谝粋€(gè)支持標(biāo)準(zhǔn)SQL的數(shù)據(jù)庫(kù)上運(yùn)行程序,你需要在你的電腦上安裝有一個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)的類(lèi)型有許多種,這里我選擇了MySql。我之所以選擇他的原因在于首先,我們需要展示JSTL對(duì)于構(gòu)造簡(jiǎn)單快速的應(yīng)用程序領(lǐng)域所起的作用,同時(shí)能和一直在這個(gè)領(lǐng)域處于主導(dǎo)地位的PHP+MySql有所比較;第二點(diǎn)那就是MySql是可以免費(fèi)下載并包含有一個(gè)針對(duì)JAVA的JDBC驅(qū)動(dòng).總之,為了使用下面的例子,你需要下載一個(gè)MYSQL服務(wù)器(http://www.mysql.com/products/mysql/index.html; MySql Connector/J JDBC驅(qū)動(dòng)程序http://www.mysql.com/products/connector-j/index.html;還有就是MySql control center http://www.mysql.com/products/connector-j/index.html),這個(gè)產(chǎn)品可以讓你非常容易的操作管理Mysql數(shù)據(jù)庫(kù)文件。全部下載完成后,你需要安裝mysql和mysql Control Center。另外還有就是mysql的JDBC驅(qū)動(dòng)需要放到你的web應(yīng)用程序中的/Web-INF/lib目錄中。
在創(chuàng)建程序代碼之前,你需要?jiǎng)?chuàng)建并填寫(xiě)數(shù)據(jù)庫(kù)表。關(guān)于這方面的主題文章也相當(dāng)廣泛,具體如何操作超出了本文的范圍。這里我推薦給你我們上面提及的一個(gè)可視化的管理工具 MySQL Control Center.你可以用他來(lái)創(chuàng)建一個(gè)用來(lái)運(yùn)行程序的測(cè)試用戶(hù),數(shù)據(jù)庫(kù)以及創(chuàng)建一個(gè)測(cè)試表,并填寫(xiě)若干記錄。關(guān)于登陸名及密碼 數(shù)據(jù)庫(kù)名稱(chēng)這些配置環(huán)境參數(shù),你應(yīng)該記住他們,稍后需要應(yīng)用到我們的代碼中。
現(xiàn)在,你就可以準(zhǔn)備創(chuàng)建自己的第一個(gè)JSTL應(yīng)用程序了它需要我們做下面一些事情:
整個(gè)實(shí)例程序代碼包括兩個(gè)文件Hello.jsp和 Continue.jsp
Hello.jsp文件允許你輸入數(shù)據(jù)庫(kù)名稱(chēng)、登陸名稱(chēng)、登陸密碼、數(shù)據(jù)庫(kù)表名。Continue.jsp:接受Hello.jsp中的數(shù)據(jù)信息并且連接數(shù)據(jù)庫(kù),并對(duì)數(shù)據(jù)庫(kù)中的表執(zhí)行一個(gè)Select請(qǐng)求.
下面是這個(gè)系統(tǒng)所有的代碼文件,我將逐一進(jìn)行解釋。這些代碼相當(dāng)簡(jiǎn)單,對(duì)于代碼的結(jié)構(gòu),我相信你即使沒(méi)有我的解釋你也能理解的.
1: <!-- Hello.jsp -->
2: <html>
3: <head>
4: <title>Hello</title>
5: </head>
6: <body bgcolor="#ffffff">
7: <h1>Please, enter all necessary information and click OK.</h1>
8: <form method="post" action="Continue.jsp">
9: <br>Your login to database:
<input type="text" name="login" size="15">
10: <br>Your password to database:
<input type="password" name="password" size="15">
11: <br>Your database name:
<input type="text" name="database" size="15">
12: <br>Your database table:
<input type="text" name="table" size="15">
13: <br><br><input type="submit" name="submit" value=" OK ">
14: </form>
15: </body>
16: </html>??
(請(qǐng)注意文本左側(cè)的數(shù)字只是為你提供一些標(biāo)記信息,你不需要將他們輸入到你的代碼文件中。)
上面就是所有Hello.jsp的源代碼,很驚奇吧,他僅僅是純粹的HTML代碼,就這么簡(jiǎn)單,我想應(yīng)該沒(méi)有注釋的必要了.我之所以將這些代碼片段包含進(jìn)文章中就是為了展示一下JSTL集成到那些需要快速擴(kuò)充額外功能的HTML站點(diǎn)中是多么的簡(jiǎn)單.讓我再為你展示一下Continue.jsp的全部代碼,看過(guò)之后,你就會(huì)對(duì) JSTL有些了解了。
1: <!-- Continue.jsp -->
2: <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
3: <@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
4: <c:set var="h" value="localhost"/>
5: <c:set var="l" value="${param.login}"/>
6: <c:set var="p" value="${param.password}"/>
7: <c:set var="d" value="${param.database}"/>
8: <c:set var="t" value="${param.table}"/>
9: <html>
10: <head>
11: <title>Continue</title>
12: </head>
13: <body bgcolor="#ffffff">
14: <sql:setDataSource driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://${l}/$wmqeeuq?user=${u}&password=${p}"/>
15: <sql:query var="result">
16: SELECT * FROM <c:out value="${t}"/>
17: </sql:query>
18: <c:forEach var="row" items="${result.rowsByIndex}">
19: <c:out value="${row[0]}"/> <br>
20: </c:forEach>
21: </body>
22: </html>??
(請(qǐng)注意文本左側(cè)的數(shù)字只是為你提供一些標(biāo)記信息,你不需要將他們輸入到你的代碼文件中。)
這是很頭痛的問(wèn)題,一直都是在困擾著我們。我有一個(gè)不算簡(jiǎn)單也不算難的方法,這是我一直在用的方式。
1、建立一個(gè)類(lèi),包括一個(gè)格式將中文轉(zhuǎn)換為ISO8859-1編碼的方法:
publicclass Format2Chinese {
public Format2Chinese() {
}
public String format2IS08859(String str) {
try {
if (str == null || str.trim().equals(""))
str = "";
else
str = new String(str.getBytes("ISO8859-1"));
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
}
2、你的bean里面這時(shí)就要加一些東西了,如下面這個(gè)簡(jiǎn)單的bean:
publicclass Leavemsg
{
public Leavemsg() {
}
//這個(gè)要加的,因?yàn)閷?xiě)入的時(shí)候我們不格式,寫(xiě)出的時(shí)候格式化
public Leavemsg(boolean format) {
this.format = format;
}
private String msg;
booleanformat = false; //用于確定是否將字符格式轉(zhuǎn)換
Format2Chinese function = new Format2Chinese();
publicvoid setMsg(String msg) {
if (format) {
this.msg = function.format2IS08859(msg);
} else
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
3、在用bean裝數(shù)據(jù)的時(shí)候,這樣聲明:
Leavemsg msg=new Leavemsg(true); 然后其它的操作都是一樣的,就OK了。
這時(shí)頁(yè)面顯示中文的時(shí)候就不會(huì)出問(wèn)題了,在JSP頁(yè)面里這可以這樣,用該類(lèi)做包裝得到的內(nèi)容。
以下假設(shè)jad.exe在c:\java目錄下
一、基本用法
Usage:???? jad [option(s)] <filename(s)>
直接輸入類(lèi)文件名,且支持通配符,如下所示。
c:\java\>jad example1.class
c:\java\>jad *.class
結(jié)果是將example1.class反編譯為example1.jad。將example1.jad改為example1.java即得源文件。
del/q/s?? work\*.*