?? jsp.doc
字號:
????????? 在安裝MySQL的過程中,往往詢問是否需要將root帳戶設置為可遠程訪問,為了安全起見,最好設置成為不能遠程訪問。JSP項目中訪問數據庫就使用root帳戶(一般的JSP項目肯定是與MySQL在一臺服務器上),然后再新建一個帳戶,設置可以遠程訪問,從而方便備份數據庫。
????????? 在MySQL中,有關時間日期的數據類型有datetime和timestamp兩種,對于datetime,其是精確到毫秒的,不能自動插入當前日期與時間;對于timestamp,其格式為“YYYY-MM-DD HH:MM:SS”,可以自動插入當前日期與時間。當需要寫入這兩個類型的數據到MySQL時,先構造符合格式的字符串,寫在SQL語句中即可。當需要讀取這兩類數據類型時,getDate()方法只返回日期,getTime()方法只返回時間。
????????? 在寫SQL語句時,注意以下幾個問題:
????????? insert into users(username,password) values('test1','test2')???????? //'test2'后不能有逗號(,)
????????? update users set username='test1',password='test2' where id=3???????? //'test2'后不能有逗號(,),并且id=3不能寫成id='3'
????????? LIMIT x語句可以實現只返回前x條記錄,如:
????????? select * from users limit 3???????? //將只返回前3條記錄
????????? 在MySQL中,where子句可以有這樣的語法:where job!='' and !isNull(job)
???
7、[功能]日期的后退運算
????????? 有時我們需要進行這樣的運算:求出2008.8.8之后3天的日期。不要妄想通過截取字符串進行數學運算求得,那樣需要考慮很多,30天?31天?29天?還有很多很多...仍然另辟蹊徑,通過Calendar類實現。
java.util.Date today = new java.util.Date();?????????? //得到當前日期
java.util.Calendar theCa=java.util.Calendar.getInstance();?????????? //新建一個日歷對象
theCa.setTime(today);?????????? //將today賦給日歷對象theCa
theCa.add(theCa.DATE,7);?????????? //進行加運算,這里用的是Calendar的add()方法
java.util.Date result = (java.util.Date)theCa.getTime();?????????? //得到結果
8、[整體性]Servlet的映射配置、命名以及綜合與獨立的取舍
????????? 對于每個Servlet,都需要在web.xml中給出它的映射地址,那么,最好將所有的Servlet都映射到一個目錄下,如“servlets/”下,即登錄的Servlet為“servlets/Login”,登出的Servlet“servlets/Exit”,這樣做,對于移植到IIS整合Tomcat的環境下能夠避免的方便的避免Servlet不能被IIS過濾出來。
????????? 此外,對于Servlet的命名,也最還遵循一定的規則,如Users_Reg、Users_Modify、Admin_Add等,清晰明了其功能。
????????? Servlet綜合與獨立的取舍是指這樣的問題,比如對于用戶來說,可有注冊處理、資料修改處理、資料讀取處理、刪除處理,那么是對每個處理分別寫一個Servlet還是寫在一個Servlet里,用一個參數加以區分?這里應該考慮這些處理的執行者,比如注冊處理、資料修改處理、資料讀取處理都只能由同一角色(即用戶)完成,故而寫在一個Servlet里較為合適;而對于刪除,一般只能由系統管理員執行,故而應該獨立出來。
9、[JSP技巧]正確的獲取參數值的方法
????????? 獲取參數,看似再簡單不過了,String username = request.getParameter("username")。但這樣可靠嗎?第一,若沒有傳遞username這個參數,那么username=null,在后續對username的處理和判斷中,很有可能出現NullPointerException(空指針異常);第二,對于傳遞的中文參數,常常出現亂碼。為了解決上述問題,我們應該這樣獲取參數值:
????????? String username = request.getParameter("username")==null?"":elineSystem.codeToString(request.getParameter("username")).trim();
????????? 這實際上是一個三目表達式,若username為null,則賦值"",避免后卻出現NullPointerException。此外,還進行了中文編碼轉換,這里的elineSystem是一個系統Bean,在第3點中說到的,、String codeToString(String str)是一個中文編碼處理函數,定義在系統Bean里面,避免出現中文亂麻;最后,最好還跟上一個trim()去空格,防止用戶非法輸入。
????????? 由此觀之,為了保證系統的穩定性,我們確實還注意每一個細節。
10、從數據庫(記錄集ResultSet)中讀取數據
?????????? 和第9點,一樣,看似很簡單的東西,無非rs.getString()、rs.getDate()等。但是同樣的問題,經常會出現null問題,若數據庫中該字段值為null,你若對該字段值執行了一些判斷和處理,將會出現NullPointerException;此外,如果直接用于getString讀取顯示在頁面上,將會是"null",顯然這不是我們所希望的,應該顯示""才對。所以,做出一點點小改動:
?????????? 讀取主鍵id或int型數據類型:rs.getInt("id")???????? //一般的,int型不會有null值得產生,直接讀取
?????????? 讀取字符串:rs.getString("gs")==null?"":rs.getString("gs")???????? //也是一個簡單的三目運算符,防止null
?????????? 讀取日期:rs.getDate("idate")==null?"":rs.getDate("idate")???????? //只返回日期YYYY-MM-DD
?????????? 讀取時間:rs.getTime("idate")==null?"":rs.getTime("idate")???????? //只返回時間HH:MM:SS
?????????? 截取指定字數字符串:rs.getString("title")==null?"":((rs.getString("title").length()<=30)?rs.getString("title"):(rs.getString("title").substring(0,30))
11、[技巧]JSP/Servlet中構造insert和update等SQL語句
?????????? 在編程過程中,經常需要構造各種SQL語句,往往冗長復雜,而且容易出錯。以前我們經常會以一個String類型的字符串來通過很多加號連接運算來構造SQL語句,其實這樣在java中是非常辦占用內存的,對于這樣隨時改變的字符串,我們應該使用StringBuffer來處理,將會大大節省資源。
?????????? 構造insert語句:
StringBuffer sqlStr = new StringBuffer();???????? //創建一個新的StringBuffer對象
sqlStr.append("insert in to users");
sqlStr.append("(username,password,name,sex,email)");???????? //寫明要填寫值的字段
sqlStr.append(" values(");
sqlStr.append("'"+username+"',");???????? //注意單引號和逗號不要掉了
sqlStr.append("'"+password+"',");
sqlStr.append("'"+name+"',");
sqlStr.append("'"+sex+"',");
sqlStr.append("'"+email+"')");???????? //最后一句注意逗號改為括號
?????????? 構造update語句:
StringBuffer sqlStr = new StringBuffer();???????? //創建一個新的StringBuffer對象
sqlStr.append("update users set ");???????? //注意set后有一個空格
sqlStr.append("username='" + username + "',");???????? //注意單引號和逗號不要掉了
sqlStr.append("password='" + password + "',");
sqlStr.append("name='" + name + "',");
sqlStr.append("sex='" + sex + "',");
sqlStr.append("email='" + email + "'");???????? //最后一句注意沒有逗號
?????????????? sqlStr.append(" where id=" + id);???????? //加入where子句,注意where前有一個空格
?????????? 要使用時SQL語句時,sqlStr.toString()即將sqlStr由StringBuffer轉化為了String。
?????????? 以這樣的方法構造SQL語句,既清晰明了,又節約資源。
12、[功能]多條件搜索功能的實現
?????????? 其實搜索功能的實現,無外乎在于SQL語句的構造。用戶提交搜索條件后,程序獲取參數,并構造相應的SQL語句。下面舉例:
?????????? //首先獲取用戶填寫的搜索條件
String sex = request.getParameter("sex")==null?"":elineSystem.codeToString(request.getParameter("sex")).trim();???????? //性別
String username = request.getParameter("username")==null?"":elineSystem.codeToString(request.getParameter("username")).trim();????????? //用戶名
String sdate = request.getParameter("sdate")==null?"":elineSystem.codeToString(request.getParameter("sdate")).trim();???????? //起始日期
String edate = request.getParameter("edate")==null?"":elineSystem.codeToString(request.getParameter("edate")).trim();???????? //截至日期
if(edate.length()>0){edate = edate + " 23:59:59";}???????? //截至日期應該是到當天末,而默認情況下是當天頭
?????????? //再構造SQL語句
StringBuffer sqlStr = new StringBuffer();
sqlStr.append("select * from users where id>0");???????? //這里加上id>0是為了保證當用戶沒有填寫搜索條件時失效
if(sex.length()>0){sqlStr.append(" and sex='"+sex+"'");}???????? //注意單引號
if(username.length()>0){sqlStr.append(" and username like '%"+username+"%'");}???????? //支持模糊搜索
if(sdate.length()>0){sqlStr.append(" and idate>='"+sdate+"'");}???????? //大于起始日期
if(edate.length()>0){sqlStr.append(" and idate<='"+edate+"'");}???????? //小于截至日期
?????????? 要使用時SQL語句時,sqlStr.toString()即將sqlStr由StringBuffer轉化為了String。這樣就構造出來了搜索的SQL語句。
13、[功能]表單數據驗證
?????????? 這樣的JavaScript經常會用到,老師重復寫實在很麻煩,經過搜尋,發現了FormValid3,就是一個成型js的,確實用起來很方便。使用方法一看便知,下載地址:
????http://coderhome.net/demo/FormValid/FormValid.0.3.rar
14、[技巧]構造日期時間字符串
java.util.Date sendTime = new java.util.Date();
String timeStr = (sendTime.getYear()+1900)+"-"+(sendTime.getMonth()+1)+"-"+sendTime.getDate()+"_"+sendTime.getHours()+":"+sendTime.getMinutes()+":"+sendTime.getSeconds();???????? //注意年份要加1900,月份要加1
15、[功能]在線用戶數統計
package eline.system;
import javax.servlet.http.*;
public class OnlineCounterListener implements HttpSessionListener {
private static int activeSessions = 0;
public void sessionCreated(HttpSessionEvent se) {
???????? activeSessions++;
}
public void sessionDestroyed(HttpSessionEvent se) {
???????? if (activeSessions > 0) {
????????? activeSessions--;
???????? }
}
public static int getActiveSessions() {
???????? return activeSessions;
}
}
使用方法:
?????????? 在web.xml中加入
???????? <listener>
?????????? <listener-class>eline.system.OnlineCounterListener</listener-class>
???????? </listener>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -