2007年12月15日
摘要: 最近在項目中間遇到一個棘手的問題,希望有經驗的朋友能幫幫小弟,感激不盡。
具體問題是:在工程部署到tomcat,然后啟動tamcat,登錄工程,無任何問題,但是問題出在大概一個小時以后,重新訪問工程,登錄時拋出如下異常:
1Exception Type: org.springframework.transaction.TransactionSystemExc...
閱讀全文
2007年9月18日
在寫面向對象的WEB應用程序方面JavaSciprt是一種很好的選擇.它能支持OOP.因為它通過原型支持繼承的方式和通過屬性和方法的方式一樣好.很多開發者試圖拋棄JS,試著用C#或JAVA僅是因為JS不是他認為合適的面向對象的語言.許多人還沒有認識到javascript支持繼承.當你寫面向對象的代碼時.它能給你很強大的能量.你也可以使用它寫出可復用,可封裝的代碼.
對象為何如此偉大?
面向對象思想的成功是由于它仿照了現實中的事物和事物的聯系.事物有屬性和方法.如果我們描述一個臺燈.我們會說它的高度和寬度,比如12CM."開燈"這個動作是它的方法.當它是處于開著的狀態時.它可以被調亮一點或暗一點(也就是亮度這個屬性值變大或變小).
javascript 給予了為WEB應用程序創建對象的能力.對象在需要的時候相應的事件會被觸發,代碼封裝后,它能被實例化很多次.在javascript里有幾種創建對象的方法,在不同的場合可用不同的方法
1.1JS創建對象方式之一用 new Object() 來創建對象
.最簡單的就是用new 操作符,例如:
<script language="javascript" type="text/javascript">
person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"
person.run = function() {
this.state = "running"
this.speed = "4ms^-1"
}
</script>
我們在這個例子里定義了person這個對象,然后加入了它的屬性和方法.在這個例子里,自定義的方法里有兩個屬性.
1.2.用文字記號Literal Notation創建對象
用文字記號也可以創建對象,但要javascript 1.2以上版本.它的創建形式是多樣的.
<script language="javascript" type="text/javascript">
// Object Literals
timObject = {
property1 : "Hello",
property2 : "MmmMMm",
property3 : ["mmm", 2, 3, 6, "kkk"],
method1 : function(){
alert("Method had been called" + this.property1)
}
};
timObject.method1();
alert(timObject.property3[2]) // 結果為3
var circle = { x : 0, y : 0, radius: 2 } // another example
// 嵌套也是允許的哦.
var rectangle = {
upperLeft : { x : 2, y : 2 },
lowerRight : { x : 4, y : 4}
}
alert(rectangle.upperLeft.x) // 結果為2
</script>
文字記號可是是數組,也可以是任意的javascript表達式或值.
用 new 操作符或文字記號創建一個自定義對象都是簡單的,也是符合邏輯的.但它最大的缺點就是結果不可復用.也不能很容易的用不同的版本初始化創建對象.例如上面的第一個例子,如果 person 的 name 不是 "Tim Scarfe",那樣我們不得不重新定義整個對象,僅僅為了適應它的一點點改變.
1.3.對象的構造和原型
在OOP的世界里,用先前的方法定義對象在許多場合都有限制.我們需要一種創建對象的方法,類型可以被多次使用而不用重新定義.對象在實例化時每次都可以按需分配不同的值.實現這個目標的標準方法是用對象構造器函數.
一個對象構造器只不過是個有規則的javascript函數,它就象一個容器(定義參數,調用其他函數等等).它們兩者所不同的是構造器函數是由 new 操作符調用的.(你將在下面的例子中看到).基于函數語法形式的對象定義,我們可以使它工作得最好.
讓我們用現實世界中的貓來舉個例子.貓的 name 和 color 是貓的屬性.meeyow(貓叫)是它的一個方法.重要的是任何不同的貓都可能有不同的 name 和 meeyow 的叫聲.為了建立適應這些特征的對象類,我們將使用對象構造器.
<script language="javascript" type="text/javascript">
function cat(name) {
this.name = name;
this.talk = function() {
alert( this.name + " say meeow!" )
}
}
cat1 = new cat("felix")
cat1.talk() //alerts "felix says meeow!"
cat2 = new cat("ginger")
cat2.talk() //alerts "ginger says meeow!"
</script>
在這里,函數 cat() 是一個對象構造器,它的屬性和方法在函數體里用this來定義,用對象構造器定義的對象用 new 來實例化.主意我們如何非常容易的定義多個cat 的實例.每一個都有自己的名字,這就是對象構造器帶給我們的靈活性.
構造器建立了對象的藍圖.并不是對象本身.
在原型里增加方法.
在上面我們看到的例子里,對象的方法是在構造器里定義好的了.另外一種實現的途徑是通過原型(prototype).xxx
原型是javascript繼承的一種形式.我們可以為對象定義好后,再創造一個方法.原來所有對象的實例都將共享.
讓我們來擴展最初的 cat 對象.增加一個改名的方法.用 prototype 的方式.
<script language="javascript" type="text/javascript">
cat.prototype.changeName = function(name) {
this.name = name;
}
firstCat = new cat("pursur")
firstCat.changeName("Bill")
firstCat.talk() //alerts "Bill says meeow!"
</script>
就象你所看到的.我們僅只用了 關鍵字 prototype 實現了在對象定義后馬上增加了changeName方法.這個方法被所有的實例共享.
用原型(prototype) 重載 javascript 對象
原型 在自定義對象和有選擇性的重載對象上都可以工作.比如 Date() 或 String .這可能是無止境的.
1.4.子類和超類
下面一個例子演示了如何繼承
<script language="javascript" type="text/javascript">
function superClass() {
this.supertest = superTestMethod; //attach method superTest
}
function superTestMethod() {
return "superTest";
}
function subClass() {
this.inheritFrom = superClass;
this.inheritFrom();
this.subtest = subTestMethod; //attach method subTest
}
function subTestMethod() {
return "subTest";
}
var newClass = new subClass();
alert(newClass.subtest()); // 彈出"subTest"
alert(newClass.supertest()); // 彈出 "superTest"
</script>
1.5.訪問對象屬性
正如你所知, (.)操作符能夠用來操作對象屬性和方法,而([]) 操作符用來操作數組.
<script language="javascript" type="text/javascript">
// 這兩種用法是相同的
object.property
object["property"]
</script>
<script language="javascript">
function Circle (xPoint, yPoint, radius) {
this.x = xPoint;
this.y = yPoint;
this.r = radius;
}
var aCircle = new Circle(5, 11, 99);
alert(aCircle.x);
alert(aCircle["x"]);
</script>
我們可以通過for in循環來遍歷對象的屬性。
<script language="javascript" type="text/javascript">
var testObj = {
prop1 : "hello",
prop2 : "hello2",
prop3 : new Array("hello",1,2)
}
for(x in testObj) {
alert( x + "-" + testObj[ x ] )
}
</script>
<script language="javascript">
var Circle = { // another example
x : 0,
y : 1,
radius: 2
}
for(p in Circle) {
alert( p + "-" + Circle[ p ] )
}
</script>
2007年8月29日
在使用displaytag出現這個異常 很久都沒有解決!
Failed to load or instantiate TagExtraInfo class: org.displaytag.tags.TableTagExtraInfo
2007年6月5日
請問哪位大俠做過一個Web IM,如果有例子務必給小弟借鑒一下,謝謝!
2007年5月21日
為什么我在使用SSH(struts+spring+hibernate)構建一個J2EE時為什么會時常出現這種錯誤:

請哪位知道的高手務必指導一下小弟,謝謝!
2007年5月8日
實體對象的生命周期在Hibernate應用中是一個很關鍵的概念,正確的理解實體對象的生命周期將對我們應用Hibernate做持久層設計起到很大的作用.而所謂的實體對象的生命周期就是指實體對象由產生到被GC回收的一段過程.在這過程中我們需要理解的就是實體對象生命周期中的三種狀態.
1.自由狀態(Transient)
所謂的Transient狀態,即實體對象在內存中自由存在,與數據庫中的記錄無關,通常是我們的J2EE中VO,并沒有被納入Hibernate的實體管理容器.
1
Test test = new Test();
2
test.setName("energykk");
3
//此時的test對象處于Transient(自由狀態)并沒有被Hibernate框架所管理
4
2.持久狀態(Persistent)
何謂 Persistent? 即實體對象已經處于被Hibernate實體管理容器容器所管理的狀態.這種狀態下這個實體對象的引用將被納入Hibernate實體管理容器容器所管理.
處于Persistent狀態的實體對象,對它的變更也將被固化到數據庫中.
在J2EE中通常指的是一個PO.
Transaction tr = session.beginTransaction();
session.save(test);
//此時的test對象已經處于Persistent(持久狀態)它被Hibernate納入實體管理容器
tr.commit();
Transaction tr2 = session.beginTransaction();
test.setName("xukai");
//在這個事務中我們并沒有顯示的調用save()方法但是由于Persistent狀態的對象將會自動的固化到
//數據庫中,因此此時正處在Persistent狀態的test對象的變化也將自動被同步到數據庫中
tr2.commit();
處于Persistent狀態的實體可以簡單的理解為:如果一個實體對象與session發生了關聯,并且處于session的有效期內,那么這個實體對象就處于Persistent狀態.
3.游離狀態(Detached)
處于Persistent狀態的實體對象,其對應的session關閉以后,那么這個實體就處于Detached狀態.
我們可以認為session對象就是一個Persistent的宿主,一旦這個宿主失效,那么這個實體就處于Detached狀態.
session.close();
//與test對象關聯的session被關閉,因此此時的test對象進入Detached(游離狀態)
session2 = HibernateSessionFactory.getSession();
Transaction tr3 = session2.beginTransaction();
session2.update(test);
//此時正處于Detached狀態的test對象由于再次借助與session2被納入到Hibernate的實體管理容器所以此時的
//test對象恢復到Persistent狀態
test.setName("jjjj");
tr3.commit();
session2.close();
既然Transient狀態的實體與Detached狀態的實體都與Hibernate的實體管理容器沒有關系,那他們到底存在哪些差異?
差異就在于處于Transient狀態的只有一個Name的屬性.此時的test對象所包含的數據信息僅限于此,他與數據庫中的記錄沒有任何瓜葛.
但是處于Detached狀態的實體已經不止包含Name這個屬性,還被賦予了主鍵也就是通常POJO里的id屬性,由于id是主鍵,他可以確定數據庫表中的一條
唯一的記錄,那么自然的處于Detached狀態的實體就能與數據庫表中擁有相同id的記錄相關聯.
這就是他們之間所存在的差異,簡而言之,Transient狀態的實體缺乏與數據庫表記錄之間的聯系,而Detached狀態的試題恰恰相反.只不過是脫離了session這個數據庫操作平臺而已.
2007年2月8日
1.?JavaMail實現郵件收發
2.?Filter過濾器、Listener監聽器原理和代碼實現
3.?SCJP考題訓練(兩套)
4.?Tomcat配置包括Tomcat電腦開機自動啟動、連接池各項參數含義
5.?JDBC實現10萬,50萬,100萬數據查詢性能對比和調優方案
6.?編寫java程序調用mysql存儲過程
7.?用jsp+struts+dao實現用戶登陸
8.?用jsp+struts+dao實現數據庫crud操作,并在頁面展示效果
9.?Jdbc批量數據插入代碼實現(至少插入10萬條記錄)
10.?多線程實現生產者/消費者工作過程
11.?Socket實現點對點聊天對話
12.?Hibernate上c3p0,proxool,及服務器上連接池配置(可選)
13.?Hibernate實現數據的crud操作(可選)
14.?Struts+Hibernate+Sping實現crud操作并在頁面顯示效果(可選)
2006年11月9日
?在Orcale中使用視圖和存儲過程
一.視圖
1.為什么要引入視圖這個概念?
試想如果我們要使用計算列調整數據的結構,或者基于列值比較從多個表中抽取數據,我們就不得不采取相對很復雜的SQL語句.但是,如果我們要多次按照
這種方式獲取數據,那豈不是要一遍又一遍的重復寫這些復雜的SQL語句,那是一件多么令人頭痛的事啊,但是,有了視圖,我們就可以完全避免這些不必要
多做這些無用功了,SQL允許我們在數據庫中創建視圖.視圖提供了一種半持久性的改造方式,這樣我們就可以通過訪問視圖來代替直接訪問表,換句話說就是
視圖就相當于一個抽象層,這樣就能是我們以一種更一致的方式格式數據.同時這樣也大大提高了數據的安全性,用戶僅可以訪問到視圖,而不能訪問到下層的
數據.
2.視圖有那些優點?
?1.將用戶的注意力集中在特定的數據上,從而提高數據的安全性
?2.簡化了數據的查詢和處理操作,DBA可以把大量的相關的內容設計到一個視圖中,使用戶在查詢和處理數據時就像處理表那么簡單,而不用編寫復雜的
?select語句
?3.有利于數據的交換
?4.有利于簡化對用戶權限的管理
3.在SQL如何創建和使用視圖?
?創建視圖:
?->create view 視圖名稱 as Query(任意的select語句)
??Example:CREATE VIEW selectstudent
????AS select name from student;(該例子就提高了數據的按全性,在用戶調用這個視圖時,就只能看到學生名字)
?使用視圖:
?->select 字段名 from 視圖名 where 過濾條件
??Example(接上):select name from selectstudent where name = '張三';
4.怎樣更改視圖?
?->CREATE OR REPLACE VIEW 視圖名 AS Query
5.怎樣刪除視圖?
?->DROP VIEW 視圖名
二.存儲過程
1.什么是儲存過程?
我們在使用SQL進行編程時,可以使用兩種方法儲存和執行程序.可以在本地儲存程序,創建并向數據庫發送命令并處理結果的應用程序,最好的方法當然是將程序在數據庫儲存為
儲存過程,創建執行儲存過程并處理結果的應用程序.
2.存儲過程有什么作用?
?->接受輸入參數并以輸出參數的形式將多個值返回至調用過程或進行批處理
?->執行數據庫操作的編程語句
?->向調用過程或批處理返回狀態值表明成功或失敗以及失敗的原因
3.使用存儲過程有那些優勢?
?->允許模塊化程序設計.只需創建過程一次并將其保存在數據庫中,以后就能在程序中調用該過程任意次
?->允許更快的執行.如果某項操作需要大量的SQL代碼或需要重復執行,存儲過程將比SQL代碼執行的要快
?->減少網絡流量.一個需要數百行的SQL代碼操作由一條執行過程代碼的單獨語句就可以實現,而不需要在網絡中發送數百行代碼.
?->可作為安全機制使用
4.如何創建存儲過程?
?->CREATE [OR REPLACE] 存儲過程名 (參數列表)
??AS
??BEGIN
???存儲過程主體
??END;
?->Orcale中參數的模式:參數名 IN 或 OUT 數據類型
??Example:
???create or replace insertstudent(i_studentid in int,i_studentname in vachar);
???as
???begin
????insert student(studentid,name)values(i_studentid,i_studentname);
???end;
???使用該存儲過程
???call insertstudent(1,'張三');
?->使用輸出參數:
??Example:
???create or replace getstudentname(i_studentid in int,o_studentname out vachar);
???as
???begin
????select name into o_studentname from student where studentid = i_studentid;
???end;
??
???使用該存儲過程
???set severout on --單獨執行
???declare
????studentname vachar(50);--變量聲明
???begin
????getstudentname(1,studentname);
????dbms_output.put_line(studentname);
???end;
???著輸出結果為:張三
???
???
?????
?
2006年11月7日
對關系型數據庫管理系統Orcale9i體系結構的初步認識
首先我們在要了解Orcale9i之前必須要清楚以下幾點:
就Oracle9i本身而言主要可以區分為兩個部分:
1.cale Instance(Orcale實例).
2.cale9i Databases Files(Orcale數據庫文件).
Orcale Instance是指數據庫服務器的內存以及相關處理程序
Orcale Instance又包括SGA(系統全局區)以及Background Processes(后臺處理程序)
SGA又包括幾個重要的區域(在內存中劃分)
1.Database Buffer Cache(塊緩沖區高速緩存):用來存放讀取自數據文件的副本或者簡而理解為用戶曾經處理過的數據,這樣就能大大的提高數據存取的效率因為他有效的減少了數據在硬盤上的I\O操作.
2.Redo Log Buffer(重做日志緩沖區):記錄數據庫內所有的數據修改區簡而言之就是對數據庫的任何修改都會他記錄,這樣以便數據庫被損壞時可以進行必要的修復同時因為他是內存到內存的操作所以又加快
了數據庫的操作速度.
3.Shared Pool(共享池):為什么叫他共享池而不叫他共享區呢?我這樣認為:因為他其中還包括了兩個緩沖區:
?->Library Cache(SQL語句緩沖區):當用戶向Orcale提交一個SQL語句時,該緩沖區就將這條SQL語句進行分析,這個過程類似于編譯,這會消耗較多的時間,當Orcale完成對這條SQL語句分析過后,Orcale
?? 自動將其分析結果保存到Library Cache中,這樣當Orcale第二次執行該SQL時,Orcale將自動跳過這個分析過程,從而降低了系統運行的時間.
?->Data Dictionary(數據字典緩沖區):是Orcale特地為數據字典準備的一塊緩沖區,緊供Orcale內部使用儲存Orcale系統信息,我們用對他進行太多的細究.
注:Shared Pool是Orcale Instance最關鍵的內存片段.
4.其他的緩沖區.
Background Processes(后臺處理程序)其中主要的幾個進程:
1.DBWR(數據寫進程):將Database Buffer Cache內改動過的數據塊寫入到硬盤內的數據文件.
2.LGWR(日志寫進程):將重做日志緩沖區內的更改寫入到硬盤中的重做日志文件.
3.SMON(系統監控):在因為各種原因造成Orcale數據庫不正常的被關閉,下一次激活數據庫時SMON將盡行必要的修復.
4.PMON(進程監控):在一個Orcale進程失敗時PMON將對資源進行清理.
5.CKPT(檢查點進程):在每當Database Buffer Cache中的更改永久性的記錄在硬盤中時,更新控制文件和數據文件中的數據庫狀態信息.
6.ARCH(歸檔進程):在每次日志切換時把已滿的日志組進行備份或歸檔.
..................
Orcale9i Databases Files是指主要放在計算機硬盤上的各種Orcale9i數據庫文件其中包括:
1.數據文件
2.控制文件
3.日志文件
以上三個文件是由進程DBWR與LGWR對他們進行操作
4.歸檔日志文件
5.參數文件
6.口令文件,用戶的應用權限
Orcale 數據庫結構:
1.邏輯結構:
?構成的主要由以下幾個邏輯部件:
?->的儲存單位塊(data block).
?->區(extends).需要注意的是Oracle9i在配置儲存空間時是以區為單位的而不是最小的儲存單位塊!
?->段(segement),由許多區構成
?->表空間(Tablespace),Orcale9i數據庫最大的儲存空間,許多段構成.
?Orcale9i各邏輯部件存在一種階層關系:
?->數據存在每個數據塊內,數據讀寫以塊為單位
?->空間配置是以區為單位,一個區由一連串數據塊所構成
?->依實際數據量的多少,數據由多個區組成
?->數據表空間可以劃分為不同的區段,每個段又包括了許多區
?->在每個Orcale9i數據庫內可劃分不同的表空間,用以存放不同類型的數據
2.物理結構:
由各種Orcale9i數據庫文件構成.
注意:一個實例最多只能安裝和打開在一個數據庫上,而一個數據庫能對應多個實例,所以在建立數據庫之前,必須先指定Orcale實例的系統表示符(System Identifier),即Orcale SID 因為用來區分不同數據庫所以SID必須是唯一的.
實例主要負責數據庫的相應操作并與用戶交互.
?
?
?
?
?
?