UltraEdit 固然是個優(yōu)秀的編輯器,但是安裝它后,在IE中選”查看源文件“碼的時候,默認不是Notepad了!
而我常常只是為了搜尋一下某些關(guān)鍵字... ...
一個簡短的“查看源文件“的動作就要開啟一個UltraEdit,感覺就是殺雞用牛刀!
找了一下,修正的方法如下,修改一下注冊表:
找到這里:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name
把默認的編輯器修改為:
C:\WINNT\NOTEPAD.EXE (for Windows 2000)
C:\WINDOWS\NOTEPAD.EXE (for Windows XP/2003)
這樣就可以了!
posted @
2007-09-08 19:30 jadmin 閱讀(50) |
評論 (0) |
編輯 收藏
針對在編程過程中,大量使用“System.out.println(); ”語句進行調(diào)試,監(jiān)測,給在后期部署及維護的過程中增加了一定難度,特編寫本文檔,規(guī)范JAVA控制臺輸出的函數(shù)的使用,增強代碼的可維護性。 一般在編碼過程中,為了檢測代碼邏輯或顯示計算結(jié)果等,我們需要在控制臺中打印一些信息來確定代碼的正確性,或查看程序運行狀態(tài)。通常情況下,在JAVA中會直接使用函數(shù)“System.out.println()”或“System.out.print()”來向控制臺輸出信息。這些函數(shù)可能會出現(xiàn)在代碼的任何位置,在代碼行數(shù)不斷增多及隨著時間的推移,這些函數(shù)也會造成許多冗余的輸出,且對其程序本身的功能無任何用處,當(dāng)然也不會影響到具體功能的實現(xiàn)。但是在實際部署或進行后期維護時,當(dāng)有些輸出到控制臺的信息影響到你,為你的部署及維護帶來許多不便時,你想刪除某個信息的輸出卻不是那么容易,就得在代碼中一個一個去查找他們的位置,手動刪除每一個不必要的“System.out.prin…”。 其實要改變手動查找“System.out.prin…” 的煩惱也很簡單,只要簡單的遵循如下規(guī)則即可。<!--[if !supportLists]-->1. <!--[endif]-->編寫一個JAVA類“XXXUtil ”,在里面設(shè)置一個布爾型的成員變量,再寫一個方法來替換掉所有的“System.out.prin…”就行了!<!--[if !supportLists]-->2. <!--[endif]-->將此JAVA類放入你的工程中。KooeUtil.java:public class KooeUtil {// 該變量值也可以通過文件獲取。public static Boolean isDebug = false;public static void echo (String str) {if (isDebug) {System.out.println(str);}}}<!--[if !vml]--> <!--[endif]-->具體實現(xiàn):public class XXXUtil {// 該變量值也可以通過文件獲取。public static Boolean isDebug = false;public static void echo (String str) {if (isDebug) { System.out.println(str); }}} 將以上代碼加入你的工程,然后將所有的“System.out.println”替換成“XXXUtil .echo”即可。 這樣我們就可以簡單的通過設(shè)置isDebug值來控制工程中所有的輸出函數(shù)是否輸出,使程序更具有可維護性。
posted @
2007-09-06 18:44 jadmin 閱讀(83) |
評論 (0) |
編輯 收藏
Jython 2.2 發(fā)布了,這次發(fā)布的2.2版本實現(xiàn)了 Python 2.2 以及 2.3。
Jython 是Python 的Java實現(xiàn)。無縫地結(jié)合了Java類與Python,使用戶能以Python語言的語法編寫在Java虛擬機上運行的程序。
這次版本的新特性包括:
new-style classes
Java Collections integration
PEP 302 implementation
iterators
generators
__future__ division
support for running on JDK1.5 and 1.6
new installer
a significant number of features to bring Jython in line with CPython
官方站點:
http://www.jython.org/
posted @
2007-09-02 14:40 jadmin 閱讀(66) |
評論 (0) |
編輯 收藏
???? 合作。不要隨便與人合作,與人合作要考慮好利與弊。如果有想法盡快去干,一個人努力地干,賣命地干。干到差不了,有資本了,可以與人短期性的合作。與人合作目標(biāo)要明確。
???? 努力。工作要努力,隨隨便便過日子過四五年也是過,稍微努力地過四五年也是過,努力地過四五年也是過,何不努力好好地干。如果努力地過好四五年,這對我們以后的人生很有幫助。
???? 吃苦耐勞。不要怕吃苦。在創(chuàng)業(yè)階段,我們要的是名氣,是經(jīng)驗,有時候在保本的情況下可以以低價策略來和別人競爭。我們出賣的是點腦力活,力氣活,年輕人,睡一覺起來什么都恢復(fù)了。
???? 目標(biāo)。生活要有目標(biāo),不僅僅是事業(yè)(賺錢)的目標(biāo),其他方面也要有目標(biāo),如愛情方面的目標(biāo)、健康方面的目標(biāo)、家庭方面的目標(biāo)。各個目標(biāo)都要重視。只賺了錢,不算人生的成功。
???? 虛心學(xué)習(xí)。多與比自己大的人(長輩)、成功人士交流學(xué)習(xí),要虛心聽取、認真分析他們的意見和建議,以免自己以后走彎路。
???? 了解社會。多了解社會、多實踐、多分析某些社會現(xiàn)象的因果厲害關(guān)系。認真分析身邊發(fā)生的某些事情。正視社會的陰暗面。分析社會上某些不良風(fēng)氣,不要清高自傲,也不要隨波逐流。某些時候辦事情,也需要這方面的幫助。
???? 自由。出來外面做事情,關(guān)鍵是自由、愉快,能學(xué)到知識。每走一步都要分析,不要因某一小點利益限制了自己的自由。
???? 計劃。給自己定一個五年計劃、十年規(guī)劃。每季度做什么事情、每個月做什么事情,甚至每天做什么事情,有個計劃,有個目標(biāo)比較好。不要每天昏昏惡惡。幾年后你會發(fā)現(xiàn),幾年來一直沒有目標(biāo),什么也沒有做成。
???? 膽量。你是工人的子弟,或是農(nóng)民的兒子,難免思想狹隘。不要盲目、盲從,也不要膽小怕事。多鍛煉,大膽去做事情,只要不違法。大膽去做,即使失敗了,也為下次積累了經(jīng)驗。“商場如戰(zhàn)場”,這句話一點不假。想想,在戰(zhàn)場上,不是你死就是我亡。
???? 謀略。人生活在社會上,就是要用自己的智慧謀略和別人斗智斗勇。即使有時你不想和別人斗,別人也要和你爭。既然不能退讓,何不爭一爭。古往今來,某些人的成功,不是電視小說里說的那么偶然,有其必然性。生活中不玩點小技巧(犯法的不做、害人的不做),哪能那么容易就成功.
???? 不要害怕貧窮。也許你家里沒有幾十萬上百萬元,大膽地去做事情,不要怕貧窮。即使我們的事情做失敗了,我們大不了回到起點,還是窮人。
???? 學(xué)習(xí)。不斷充實自己,學(xué)習(xí)新的知識,多學(xué)點技能,為以后作準(zhǔn)備,也可作為以后的娛樂消遣。如:駕駛技術(shù)、炒菜做飯、寫文章等。
???? 惜時。如果以*都做了,我估計你的時間過得很快。我常聽某某人說:“這一輩子,就象昨天今天一樣。”毛澤東說:“天地轉(zhuǎn),光陰迫。一萬年太久,只爭朝夕。”“三十八年過去彈指一揮間”。不要因碌碌無為而悔恨!
???? 請記住,以上忠告如果能夠做到了,你做什么都一定能夠成功!
posted @
2007-09-01 22:22 jadmin 閱讀(74) |
評論 (0) |
編輯 收藏
童心
——無論你有多老,你的心不能變老
音樂
——如果沒有音樂,你的人生將會乏味無比
浪漫
——偶爾浪漫一下,那種感覺就像一只小鳥在空中飛翔吧
優(yōu)雅
——何必要裝的粗魯呢,優(yōu)雅一點總是好的
沉思
——在你有一肚子火要發(fā)之前,先給自己10分鐘沉思一會兒
馳騁
——如果真的累了,就變成一只蝴蝶逃開一會吧,不要讓自己太累
純潔
——現(xiàn)在的社會已經(jīng)夠混濁了,純潔真是不容易做到呢
勇敢
——做個勇敢的精靈,不懼狂風(fēng)會撕碎你的翅膀
可愛
——我相信,你會因為可愛而美麗
posted @
2007-09-01 22:12 jadmin 閱讀(44) |
評論 (0) |
編輯 收藏
1、word的恢復(fù)
方法1、點開始--運行,輸入"winword /a"(不含引號)
?????? 回車后會啟動word,所有界面和設(shè)置都恢復(fù)了初始狀態(tài),簡單吧!
方法2、首先關(guān)閉Word程序,然后進入Word程序的默認模板所在的目錄Microsoft\Templates,將名為Normal. Dot的文件重命
名為其他的文件名,然后再啟動Word,其所有設(shè)置與界面已經(jīng)恢復(fù)到剛剛安裝完畢后的狀態(tài)。
(C:\Documents and Settings\登錄用戶名\Application Data\Microsoft\Templates,其中Application Data文件夾為隱含
文件夾)
2、excel的恢復(fù)
刪除 Excel11.xlb(Excel2003) 這個檔后重新執(zhí)行Excel,就會恢復(fù)Excel預(yù)設(shè)的菜單設(shè)定
Excel Xp 的位置:C:\Documents and Settings\登錄用戶名\Application Data\Microsoft\Excel
注:建議用搜尋檔案 *.xlb(Normal. Dot)的方式
posted @
2007-09-01 18:07 jadmin 閱讀(67) |
評論 (0) |
編輯 收藏
//ArrayList
{
ArrayList arraylist=new ArrayList();
arraylist.add(0,"end");//指定索引加入值
//需注意的是,如果現(xiàn)有2個值,我加入索引為5的那么就會出現(xiàn)異常
for(int i=0;i<2;i++){
arraylist.add(i,String.valueOf(i));
}
System.out.println("ArrayList:");
for(int i=0;i<arraylist.size();i++){
System.out.print(arraylist.get(i)+";");
}
arraylist.add("0");//直接加入值到ArrayList的最后
arraylist.add("0");
System.out.print("\nArrayList\'s lastIndexOf(\"0\") is "+arraylist.lastIndexOf("0"));
}
//Arrays
{
String []array=new String[]{"a","b","c"};
List list=Arrays.asList(array);
System.out.println("\nArrays:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+";");
}
System.out.print("\nArrays\'s length is "+array.length);//打印數(shù)組的長度
}
//Collections
{
String []array=new String[]{"a","b","c"};
List list=Arrays.asList(array);
Collections.fill(list,"Fill");//用Fill填充全部元素
System.out.println("\nCollections:");
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+";");
}
array=new String[]{"1","2","3"};
List list2=Arrays.asList(array);
Collections.copy(list,list2);//拷貝list2的數(shù)據(jù)進list
System.out.println("\n"+list);
Collections.swap(list,2,1);//調(diào)換索引為1和2的元素的位置
System.out.println(list);
}
//EventObject
{
String s="hello";
String s2=s;
EventObject eventobject=new EventObject(s);//一個準(zhǔn)容器類型,確切的歸類它不是容器
System.out.println("EventObject:");
System.out.println(eventobject.getSource());
System.out.println(eventobject.equals(s2));
}
//HashMap
{
HashMap hashmap=new HashMap();//一個速度最快的容器
hashmap.put("0","c");
hashmap.put("1","a");
hashmap.put("2","b");
hashmap.put("3","a");
System.out.println("HashMap:");
System.out.println(hashmap);//該容器有其內(nèi)部的排序方式
Set set=hashmap.keySet();//獲取全部鍵
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.print(hashmap.get(iterator.next())+";");
}
}
//HashSet
{
HashSet hashset=new HashSet();//一個絕對不能重復(fù)的類型
hashset.add("c");
hashset.add("b");
hashset.add("a");
hashset.add("a");
hashset.add("b");
System.out.println("\nHashSet:");
System.out.println(hashset);
Iterator iterator=hashset.iterator();//取出元素
while(iterator.hasNext()){
System.out.print(iterator.next()+";");
}
}
//Hashtable
{
Hashtable hashtable=new Hashtable();//一個完全可以由其他容器替換的老容器類型
hashtable.put("0","c");
hashtable.put("1","a");
hashtable.put("3","c");
hashtable.put("2","b");
System.out.println("\nHashtable:");
Enumeration enumeration=hashtable.elements();//獲取元素,Enumeration已經(jīng)不是主流,Iterator是它的下一代替代品
while(enumeration.hasMoreElements()){
System.out.print(enumeration.nextElement()+";");
}
}
//IdentityHashMap
{
IdentityHashMap identityhashmap=new IdentityHashMap();
identityhashmap.put("0","c");
identityhashmap.put("1","a");
identityhashmap.put("3","b");
identityhashmap.put("2","a");
System.out.println("\nIdentityHashMap:");
System.out.println(identityhashmap);
System.out.println(identityhashmap.containsKey("3"));//是否包含這個鍵
System.out.println(identityhashmap.containsValue("a"));//是否包含值
Set set=identityhashmap.entrySet();//傳為Set類型
System.out.println(set);
set=identityhashmap.keySet();//全部鍵
System.out.println(set);
}
//LinkedHashMap
{
LinkedHashMap linkedhashmap=new LinkedHashMap();
linkedhashmap.put("0","b");
linkedhashmap.put("2","a");
linkedhashmap.put("1","c");
linkedhashmap.put("3","b");
System.out.println("LinkedHashMap:");
System.out.println(linkedhashmap);
System.out.println(linkedhashmap.containsKey("2"));//是否包含這個鍵
System.out.println(linkedhashmap.containsValue("c"));//是否包含值
Set set=linkedhashmap.keySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.print(linkedhashmap.get(iterator.next())+";");
}
}
//LinkedHashSet
{
LinkedHashSet linkedhashset=new LinkedHashSet();//它包含了幾種Set的屬性但卻沒有自己的特色
linkedhashset.add("c");
linkedhashset.add("a");
linkedhashset.add("a");
linkedhashset.add("b");
System.out.println("\nLinkedHashSet:");
System.out.println(linkedhashset);
System.out.println(linkedhashset.contains("a"));//是否包含對象
Iterator iterator=linkedhashset.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+";");
}
}
//LinkedList
{
LinkedList linkedlist=new LinkedList();//自由使用是它的特色
linkedlist.add("a");
linkedlist.add(1,"c");
linkedlist.addLast("b");
linkedlist.addFirst("d");
System.out.println("\nLinkedList:");
System.out.println(linkedlist);
//linkedlist.clear();//該方法清空容器
//linkedlist.remove(0);//刪除索引為0的元素
//linkedlist.remove("d");//刪除值為d的元素
//linkedlist.removeFirst();//刪除第一個元素
//linkedlist.removeLast();//刪除最后一個元素
for(int i=0;i<linkedlist.size();i++){
System.out.print(linkedlist.get(i)+";");
}
}
//Stack
{
Stack stack=new Stack();//堆棧
stack.add("b");
stack.add(0,"c");
stack.push("d");
stack.add("e");
stack.push("a");
Enumeration enumeration=stack.elements();
System.out.println("\nStack:");
while(enumeration.hasMoreElements()){
System.out.print(enumeration.nextElement()+";");
}
//后進先出
System.out.println("\n"+stack.peek());
System.out.println(stack.pop());
System.out.println(stack.contains("d")+";"+stack.contains("a"));//是否包含該元素,有趣的事情發(fā)生了
System.out.println(stack.search("c"));//非常有用的屬性,檢索,但是由后向前的排列
}
//TreeMap
{
TreeMap treemap=new TreeMap();
treemap.put("0","d");
treemap.put("2","a");
treemap.put("1","b");
treemap.put("3","c");
System.out.println("\nTreeMap:");//可以對鍵排序
System.out.println(treemap);
System.out.println(treemap.firstKey());//返回第一個鍵
Set set=treemap.keySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.print(treemap.get(iterator.next())+";");
}
}
//TreeSet
{
TreeSet treeset=new TreeSet();//自動排序內(nèi)容
treeset.add("b");
treeset.add("a");
treeset.add("c");
treeset.add("d");
System.out.println("\nTreeSet:");
System.out.println(treeset);
System.out.println(treeset.first());//返回第一個元素
Iterator iterator=treeset.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+";");
}
}
//Vector
{
Vector vector=new Vector();
vector.add(0,"b");
vector.add("a");
vector.addElement("d");
vector.add("c");
System.out.println("\nVector:");
System.out.println(vector);
vector.set(2,"h");//替換掉指定索引的元素
System.out.println(vector);
Object []str=vector.toArray();
for(int i=0;i<str.length;i++){
System.out.print(str[i]+";");
}
vector.setSize(2);//重新設(shè)置大小為2
System.out.println("\n"+vector);
}
//WeakHashMap
{
WeakHashMap weakhashmap=new WeakHashMap();
weakhashmap.put("1","b");
weakhashmap.put("2","c");
weakhashmap.put("0","d");
weakhashmap.put("3","a");
System.out.println("\nWeakHashMap:");
System.out.println(weakhashmap);
System.out.println(weakhashmap.containsKey("3"));//是否包含鍵
System.out.println(weakhashmap.containsValue("d"));//是否包含值
Set set=weakhashmap.entrySet();
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+";");
}
//weakhashmap.remove("2");//刪除該鍵對應(yīng)的值
//weakhashmap.get("1");//獲取指定鍵的值
}
}
posted @
2007-09-01 16:27 jadmin 閱讀(56) |
評論 (0) |
編輯 收藏
1.??? 在業(yè)務(wù)層使用JDBC直接操作數(shù)據(jù)庫-最簡單,最直接的操作
1)數(shù)據(jù)庫url,username,password寫死在代碼中
???? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
???? String url="jdbc:oracle:thin:@localhost:1521:orcl";
???? String user="scott";
???? String password="tiger";
???? Connection conn= DriverManager.getConnection(url,user,password);??
???? Statement stmt=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
???? String sql="select * from test";
???? ResultSet rs=stmt.executeQuery(sql);
2)采用Facade和Command模式,使用DBUtil類封裝JDBC操作;
?????? 數(shù)據(jù)庫url,username,password可以放在配置文件中(如xml,properties,ini等)。
?????? 這種方法在小程序中應(yīng)用較多。
2.DAO(Data Accessor Object)模式-松耦合的開始
DAO = data + accessor + domain object
例如User類-domain object (javabean)
UserDAO類-accessor ,提供的方法getUser(int id),save(User user)內(nèi)包含了JDBC操作
在業(yè)務(wù)邏輯中使用這兩個類來完成數(shù)據(jù)操作。
使用Factory模式可以方便不同數(shù)據(jù)庫連接之間的移植。
3.數(shù)據(jù)庫資源管理模式
3.1 數(shù)據(jù)庫連接池技術(shù)
資源重用,避免頻繁創(chuàng)建,釋放連接引起大大量性能開銷;
更快的系統(tǒng)響應(yīng)速度;
通過實現(xiàn)JDBC的部分資源對象接口( Connection, Statement, ResultSet ),可以使用Decorator設(shè)計模式分別產(chǎn)生三種邏輯資源對象: PooledConnection, PooledStatement和 PooledResultSet。
一個最簡單地數(shù)據(jù)庫連接池實現(xiàn):
public class ConnectionPool {
??????? private static Vector pools;
??????? private final int POOL_MAXSIZE = 25;
??????? /**
???????? * 獲取數(shù)據(jù)庫連接
???????? * 如果當(dāng)前池中有可用連接,則將池中最后一個返回;若沒有,則創(chuàng)建一個新的返回
???????? */
??????? public synchronized Connection getConnection() {
?????????????? Connection conn = null;
?????????????? if (pools == null) {
????????????????????? pools = new Vector();
?????????????? }
?????????????? if (pools.isEmpty()) {
????????????????????? conn = createConnection();
?????????????? } else {
????????????????????? int last_idx = pools.size() - 1;
????????????????????? conn = (Connection) pools.get(last_idx);
????????????????????? pools.remove(last_idx);
?????????????? }
?????????????? return conn;
??????? }
??????? /**
???????? * 將使用完畢的數(shù)據(jù)庫連接放回池中
???????? * 若池中連接已經(jīng)超過閾值,則關(guān)閉該連接;否則放回池中下次再使用
???????? */
??????? public synchronized void releaseConnection(Connection conn) {
?????????????? if (pools.size() >= POOL_MAXSIZE)
????????????????????? try {
???????????????????????????? conn.close();
????????????????????? } catch (SQLException e) {
???????????????????????????? // TODO自動生成 catch 塊
???????????????????????????? e.printStackTrace();
????????????????????? } else
????????????????????? pools.add(conn);
??????? }
??????? public static Connection createConnection() {
?????????????? Connection conn = null;
?????????????? try {
????????????????????? Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
????????????????????? String url = "jdbc:oracle:thin:@localhost:1521:orcl";
????????????????????? String user = "scott";
????????????????????? String password = "tiger";
????????????????????? conn = DriverManager.getConnection(url, user, password);
?????????????? } catch (InstantiationException e) {
????????????????????? // TODO自動生成 catch 塊
????????????????????? e.printStackTrace();
?????????????? } catch (IllegalAccessException e) {
????????????????????? // TODO自動生成 catch 塊
????????????????????? e.printStackTrace();
?????????????? } catch (ClassNotFoundException e) {
????????????????????? // TODO自動生成 catch 塊
????????????????????? e.printStackTrace();
?????????????? } catch (SQLException e) {
????????????????????? // TODO自動生成 catch 塊
????????????????????? e.printStackTrace();
?????????????? }
?????????????? return conn;
??????? }
}
注意:利用getConnection()方法得到的Connection,程序員很習(xí)慣地調(diào)用conn.close()方法關(guān)閉了數(shù)據(jù)庫連接,那么上述的數(shù)據(jù)庫連接機制便形同虛設(shè)。在調(diào)用conn.close()方法方法時如何調(diào)用releaseConnection()方法?這是關(guān)鍵。這里,我們使用Proxy模式和java反射機制。
public synchronized Connection getConnection() {
?????????????? Connection conn = null;
?????????????? if (pools == null) {
????????????????????? pools = new Vector();
?????????????? }
?????????????? if (pools.isEmpty()) {
????????????????????? conn = createConnection();
?????????????? } else {
????????????????????? int last_idx = pools.size() - 1;
????????????????????? conn = (Connection) pools.get(last_idx);
????????????????????? pools.remove(last_idx);
?????????????? }
????????
???????? ConnectionHandler handler=new ConnectionHandler(this);
?????????????? return handler.bind(con);
??????? }
public class ConnectionHandler implements InvocationHandler {
????? private Connection conn;
????? private ConnectionPool pool;
?????
????? public ConnectionHandler(ConnectionPool pool){
???????????? this.pool=pool;
????? }
?????
????? /**
?????? * 將動態(tài)代理綁定到指定Connection
?????? * @param conn
?????? * @return
?????? */
????? public Connection bind(Connection conn){
???????????? this.conn=conn;
Connection proxyConn=(Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this);
?????????? return proxyConn;
????? }
?????
??????? /* (非 Javadoc)
???????? * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
???????? */
??????? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
?????????????? // TODO自動生成方法存根
?????????????? Object obj=null;
?????????????? if("close".equals(method.getName())){
????????????????????? this.pool.releaseConnection(this.conn);
?????????????? }
?????????????? else{
????????????????????? obj=method.invoke(this.conn, args);
?????????????? }
??????????????
?????????????? return obj;
??????? }
}
?????? 在實際項目中,并不需要你來從頭開始來設(shè)計數(shù)據(jù)庫連接池機制,現(xiàn)在成熟的開源項目,如C3P0,dbcp,Proxool等提供了良好的實現(xiàn)。一般推薦使用Apache dbcp,基本使用實例:
DataSource ds = null;
??? try{
????? Context initCtx = new InitialContext();
????? Context envCtx = (Context) initCtx.lookup("java:comp/env");
????? ds = (DataSource)envCtx.lookup("jdbc/myoracle");
???????? if(ds!=null){
???????????????? out.println("Connection is OK!");
???????????????? Connection cn=ds.getConnection();
???????????????? if(cn!=null){
???????????????????????? out.println("cn is Ok!");
???????????????? Statement stmt = cn.createStatement();
????????????????? ResultSet rst = stmt.executeQuery("select * from BOOK");
???????????????? out.println("<p>rst is Ok!" + rst.next());
???????????????? while(rst.next()){
???????????????????????? out.println("<P>BOOK_CODE:" + rst.getString(1));
?????????????????? }
???????????????????????? cn.close();
???????????????? }else{
???????????????????????? out.println("rst Fail!");
???????????????? }
???????? }
???????? else
???????????????? out.println("Fail!");
??????????? }catch(Exception ne){ out.println(ne);
????????? }
3.2 Statement Pool
普通預(yù)編譯代碼:
String strSQL=”select name from items where id=?”;
PreparedStatement ps=conn.prepareStatement(strSQL);
ps.setString(1, “2”);
ResultSet rs=ps.executeQuery();
但是PreparedStatement 是與特定的Connection關(guān)聯(lián)的,一旦Connection關(guān)閉,則相關(guān)的PreparedStatement 也會關(guān)閉。
為了創(chuàng)建PreparedStatement 緩沖池,可以在invoke方法中通過sql語句判斷池中還有沒有可用實例。
4. 持久層設(shè)計與O/R mapping 技術(shù)
1) Hernate:適合對新產(chǎn)品的開發(fā),進行封閉化的設(shè)計
Hibernate 2003年被Jboss接管,通過把java pojo對象映射到數(shù)據(jù)庫的table中,采用了xml/javareflection技術(shù)等。3.0提供了對存儲過程和手寫sql的支持,本身提供了hql語言。
開發(fā)所需要的文件:
hibernate配置文件: hibernate.cfg.xml 或 hibernate.properties
hibernate 映射文件: a.hbm.xml
pojo類源文件: a.java
導(dǎo)出表與表之間的關(guān)系:
a. 從java對象到hbm文件:xdoclet
b. 從hbm文件到j(luò)ava對象:hibernate extension
c. 從數(shù)據(jù)庫到hbm文件:middlegen
d. 從hbm文件到數(shù)據(jù)庫:SchemaExport
2)Iatis :適合對遺留系統(tǒng)的改造和對既有數(shù)據(jù)庫的復(fù)用,有很強的靈活性 3) Apache OJB:優(yōu)勢在于對標(biāo)準(zhǔn)的全面支持 4)EJB:適合集群服務(wù)器,其性能也不象某些人所詬病的那么差勁 5) JDO (java data object)
設(shè)置一個Properties對象,從而獲取一個JDO的PersistenceManagerFactory(相當(dāng)于JDBC連接池中的DataSource),進而獲得一個PersistenceManager對象(相當(dāng)于JDBC中的Connection對象),之后,你可以用這個PersistenceManager對象來增加、更新、刪除、查詢對象。
JDOQL是JDO的查詢語言;它有點象SQL,但卻是依照Java的語法的。
5. 基于開源框架的Struts+Spring+Hibernate實現(xiàn)方案
示例:這是一個3層架構(gòu)的web 程序,通過一個Action 來調(diào)用業(yè)務(wù)代理,再通過它來回調(diào) DAO類。下面的流程圖表示了MyUsers是如何工作的。數(shù)字表明了流程的先后順序,從web層(UserAction)到中間層(UserManager),再到數(shù)據(jù)層(UserDAO),然后返回。
Spring是AOP, UserManager和UserDAO都是接口.
1)??????? web層(UserAction) :調(diào)用中間層的接口方法,將UserManager作為屬性注入。
????????????? 采用流行的Struts框架,雖然有很多人不屑一顧,但是這項技術(shù)在業(yè)界用的比較普遍,能滿足基本的功能,可以減少培訓(xùn)學(xué)習(xí)成本。
2)??????? 中間層(UserManager):將UserDAO作為屬性注入,其實現(xiàn)主要是調(diào)用數(shù)據(jù)層接口的一些方法;它處于事務(wù)控制中。
???????????? 采用Spring框架實現(xiàn),IOC與AOP是它的代名詞,功能齊全,非常棒的一個架構(gòu)。
3)??????? 數(shù)據(jù)層(UserDAO):實現(xiàn)類繼承HibernateDaoSupport類,在該類中可以調(diào)用getHibernateTemplate()的一些方法執(zhí)行具體的數(shù)據(jù)操作。
???????????? 采用Hibernate做O/R mapping,從種種跡象可以看出,Hibernate就是EJB3.0的beta版。
posted @
2007-09-01 15:28 jadmin 閱讀(60) |
評論 (0) |
編輯 收藏
今天工作的任務(wù)要寫一些跟開源協(xié)議相關(guān)的約定說明,所以在網(wǎng)上搜索了一些資料以供參考,下面列出了幾個比較常見的開源協(xié)議,如果想要了解其他的協(xié)議和詳細了解這些協(xié)議,我個人推薦這個網(wǎng)址:http://www.opensource.org/licenses/
Mozilla Public License
MPL License,允許免費重發(fā)布、免費修改,但要求修改后的代碼版權(quán)歸軟件的發(fā)起者。這種授權(quán)維護了商業(yè)軟件的利益,,它要求基于這種軟件得修改無償貢獻版權(quán)給該軟件。這樣,圍繞該軟件得所有代碼得版權(quán)都集中在發(fā)起開發(fā)人得手中。但MPL是允許修改,無償使用得。MPL軟件對鏈接沒有要求。
BSD開源協(xié)議
BSD開源協(xié)議是一個給于使用者很大自由的協(xié)議。可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。 當(dāng)你發(fā)布使用了BSD協(xié)議的代碼,或則以BSD協(xié)議代碼為基礎(chǔ)做二次開發(fā)自己的產(chǎn)品時,需要滿足三個條件:
1. 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協(xié)議。
2. 如果再發(fā)布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權(quán)聲明中包含原來代碼中的BSD協(xié)議。
3. 不可以用開源代碼的作者/機構(gòu)名字和原來產(chǎn)品的名字做市場推廣。
BSD代碼鼓勵代碼共享,但需要尊重代碼作者的著作權(quán)。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時候都首選BSD協(xié)議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發(fā)。
Apache Licence 2.0
Apache Licence是著名的非盈利開源組織Apache采用的協(xié)議。該協(xié)議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權(quán),同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件:
1. 需要給代碼的用戶一份Apache Licence
2. 如果你修改了代碼,需要再被修改的文件中說明。
3. 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標(biāo),專利聲明和其他原來作者規(guī)定需要包含的說明。
4. 如果再發(fā)布的產(chǎn)品中包含一個Notice文件,則在Notice文件中需要帶有Apache Licence。你可以在Notice中增加自己的許可,但不可以表現(xiàn)為對Apache Licence構(gòu)成更改。
Apache Licence也是對商業(yè)應(yīng)用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/銷售。
GPL
GPL許可證是自由軟件的應(yīng)用最廣泛的軟件許可證,人們可以修改程式的一個或幾個副本或程式的任何部分,以此形成基於這些程式的衍生作品。必須在修改過的檔案中附有明顯的說明:您修改了此一檔案及任何修改的日期。 您必須讓您發(fā)布或出版的作品,包括本程式的全部或一部分,或內(nèi)含本程式的全部或部分所衍生的作品,允許第三方在此許可證條款下使用,并且不得因為此項授權(quán)行為而收費。
LGPL
Linux就是采用了GPL。GPL協(xié)議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發(fā)點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費的各種linux,包括商業(yè)公司的linux和linux上各種各樣的由個人,組織,以及商業(yè)軟件公司開發(fā)的免費軟件了。
GPL協(xié)議的主要內(nèi)容是只要在一個軟件中使用(“使用”指類庫引用,修改后的代碼或者衍生代碼)GPL協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL協(xié)議,既必須也是開源和免費。這就是所謂的”傳染性”。GPL協(xié)議的產(chǎn)品作為一個單獨的產(chǎn)品使用沒有任何問題,還可以享受免費的優(yōu)勢。
由于GPL嚴格要求使用了GPL類庫的軟件產(chǎn)品必須使用GPL協(xié)議,對于使用GPL協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發(fā)的基礎(chǔ)。
其它細節(jié)如再發(fā)布的時候需要伴隨GPL協(xié)議等和BSD/Apache等類似
Public Domain
公共域授權(quán)。將軟件授權(quán)為公共域,這些軟件包沒有授權(quán)協(xié)議,任何人都可以隨意使用它。
Artistic許可
使作者保持對進一步開發(fā)的控制。
posted @
2007-08-31 11:11 jadmin 閱讀(54) |
評論 (0) |
編輯 收藏
使用Java語言編寫應(yīng)用程序最大的優(yōu)點在于“一次編譯,處處運行”,然而這并不是說所有的Java程序都具有跨平臺的特性,事實上,相當(dāng)一部分的Java程序是不能在別的操作系統(tǒng)上正確運行的,那么如何才能編寫一個真正的跨平臺的Java程序呢?下面是在編寫跨平臺的Java程序是需要注意的一些事情:
1.編寫Java跨平臺應(yīng)用程序時,你可以選擇JDK1.0,1.1,1.2或支持它們的GUI開發(fā)工具如:Jbuilder,Visual Age for Java等等,但是必須注意你的Java程序只能使用Java核心API包,如果要使用第三方的類庫包,則該類庫包也要由Java核心包開發(fā)完成,否則在發(fā)布你的程序的時候還得將支持該Java類庫包的JVM發(fā)布出去。也就是說,你的程序需要是100%純Java的。舉一個例子,Visual J++就不是純Java的,由Visual J++編寫的程序也就不具有平臺無關(guān)性。
2.無論你使用的是JDK或其他開發(fā)工具,在編譯時都要打開所有的警告選項,這樣編譯器可以盡可能多的發(fā)現(xiàn)平臺相關(guān)的語句,并給出警告。雖然不能保證沒有編譯時警告錯誤的程序一定是跨平臺的,但含有警告錯誤的程序卻很有可能是非平臺無關(guān)的。
3.在程序中使用任何一個方法的時候,要詳細察看文檔,確保你使用的方法不是在文檔中已經(jīng)申明為過時的方法(Deprecated method),也不是文檔中未標(biāo)明的隱含方法(Undocumented method)。
4.退出Java程序時盡量不要使用java.lang.System的exit方法。Exit方法可以終止JVM,從而終止程序,但如果同時運行了另一個Java程序,使用exit方法就會讓該程序也關(guān)閉,這顯然不是我們希望看到的情況。事實上要退出Java程序,可以使用destory()退出一個獨立運行的過程。對于多線程程序,必須要關(guān)閉各個非守護線程。只有在程序非正常退出時,才使用exit方法退出程序。
5.避免使用本地方法和本地代碼,盡可能自己編寫具有相應(yīng)功能的Java類,改寫該方法。如果一定要使用該本地方法,可以編寫一個服務(wù)器程序調(diào)用該方法,然后將現(xiàn)在要編寫的程序作為該服務(wù)器程序的客戶程序,或者考慮CORBA(公共對象請求代理)程序結(jié)構(gòu)。
6.Java中有一個類似于Delphi中的winexec的方法,java.lang.runtime類的exec方法,作為該方法本身是具有平臺無關(guān)性的,但是給方法所調(diào)用的命令及命令參數(shù)卻是與平臺相關(guān)的,因此,在編寫程序時要避免使用,如果一定要調(diào)用其他的程序的話,必須要讓用戶自己來設(shè)置該命令及其參數(shù)。比如說,在windows中可以調(diào)用notepad.exe程序,在linux中就要調(diào)用vi程序了。
7.程序設(shè)計中的所有的信息都要使用ASCII碼字符集,因為并不是所有的操作系統(tǒng)都支持Unicode字符集,這對于跨平臺的Java中文軟件程序不能不說是一大噩耗。
8.在程序中不要硬性編碼與平臺相關(guān)的任何常量,比如行分隔符,文件分隔符,路徑分隔符等等,這些常量在不同的平臺上是不同的,比如文件分隔符,在UNIX和MAC中是“/”,在windows中是“”,如果要使用這些常量,需要使用jdava.util.Properties類的getProperty方法,如java.util.Properties.getProperty(“file.separator”)可以獲得文件分隔符,getProperty (“l(fā)ine.separator”)返回行分隔符,getProperty(“path.separator”)返回路徑分隔符。
9.在編寫跨平臺的網(wǎng)絡(luò)程序時,不要使用java.net.InetAddress類的getHostName方法得到主機名,因為不同的平臺的主機名格式是不同的,最好使用getAddress得到格式相同的IP地址,另外,程序中所有的主機名都要換成IP地址,比如www.263.net就要換成相應(yīng)的IP地址。
10.涉及文件操作的程序需要注意:不要在程序中硬性編碼文件路徑,理由和8中一樣,只是這一點特別重要,因此單獨提出。而且,不同平臺對于文件名使用的字符及最大文件名長度的要求不同,編寫你的程序的時候要使用一般的ASCII碼字符作為文件的名字,而且不能與平臺中已存在的程序同名,否則會造成沖突。
11.如果您寫的程序是GUI程序,在使用AWT組件時不能硬性設(shè)置組件的大小和位置而應(yīng)該使用Java的布局管理器(layout manager)來設(shè)置和管理可視組件的大小和位置,否則有可能造成布局混亂。
12.由于不同的操作系統(tǒng),不同的機器,系統(tǒng)支持的顏色和屏幕的大小和分辨率都不同,如何獲得這些屬性呢?使用java.awt.Systemcolor類可以獲得需要的顏色,如該類的inactiveCaption就是窗口邊框中活動標(biāo)題的背景顏色,menu則是菜單的背景顏色。使用java.awt.Toolkit的getScreenResolution可以以“象素每英寸”為單位顯示屏幕的分辨率。該類的getScreenSize可以得到屏幕大小(英寸),loadSystemColors可以列出所有的系統(tǒng)顏色。
這些注意事項有些是來自參考文獻,有些是自己長期編寫Java程序的經(jīng)驗所得,相信對你的程序設(shè)計會有所幫助。
posted @
2007-08-31 11:08 jadmin 閱讀(43) |
評論 (0) |
編輯 收藏