亚洲αv在线精品糸列,国产成人va亚洲电影,久久亚洲AV午夜福利精品一区http://m.tkk7.com/web/category/12526.html主要是WEB應用方向zh-cnWed, 28 Feb 2007 04:11:19 GMTWed, 28 Feb 2007 04:11:19 GMT60為什么要使用EJBhttp://m.tkk7.com/web/archive/2006/09/07/why_use_EJB.htmlHillyHillyThu, 07 Sep 2006 12:04:00 GMThttp://m.tkk7.com/web/archive/2006/09/07/why_use_EJB.htmlhttp://m.tkk7.com/web/comments/68364.htmlhttp://m.tkk7.com/web/archive/2006/09/07/why_use_EJB.html#Feedback0http://m.tkk7.com/web/comments/commentRss/68364.htmlhttp://m.tkk7.com/web/services/trackbacks/68364.html為什么要使用EJB?

來源:http://www.jdon.com/artichect/whyEJB.htm

  首先,我們必須明確,為什么要使用J2EE?J2EE優(yōu)點是什么?使用J2EE的主要原因是多層結構,傳統的兩層C/S結構難于維護,穩(wěn)定性極差,界面代碼和數據庫代碼混淆在一起,牽一動百,多層結構使得界面和數據庫完全分離,并且誕生了中間件這樣的技術,如下圖:

Web+EJB能組成真正的多層結構

  為什么使用EJB我原先認為這不是一個討論的話題,因為EJB是J2EE重要的組成部分,可以說沒有EJB的J2EE只是一種Web系統,這樣的系統非常容易喪失了多層結構的大部分優(yōu)點(仔細想想那些混合多種層次功能JavaBeans和傳統兩層結構有什么區(qū)別?)。

  當然,可以人為地在Javabeans之間進行層次劃分,例如Hibernate算數據持久層,某些JavaBeans是業(yè)務核心層,但是因為都是普通JavaBeans,這種劃分沒有一種強制性和明顯標志性,這樣的系統更換了主創(chuàng)人員或設計師,可能就會被新的程序員修改得非常混亂。

  我們先看看一個包含EJB的J2EE系統是如何清晰地表達層次。如下圖:

  Web完全只是一個MVC模式的實現,關鍵業(yè)務核心是在EJB的服務層實現,這樣做的優(yōu)點是,Web只負責界面相關部分,因為,如果是一個智能客戶端,如Swing或J2ME,在不需要修改任何業(yè)務核心的情況下能夠方便地更換。同樣,提供Web Services功能,也只是在 Web層修改,不會涉及EJB方面的修改,同樣保證了系統的穩(wěn)定性,保證了系統升級和未來的擴展性。

  如果不使用EJB,在EJB服務層實現的業(yè)務核心將由普通JavaBeans實現,使用何種架構或設計能夠保證負責MVC的JavaBeans和負責業(yè)務核心的JavaBeans清晰地分開,又如何保證在新的程序員不會破壞和打亂你精心布局的JavaBeans架構?

EJB提供性能優(yōu)化支持

  最主要的是性能問題,由于以前國內中文Java網站有些人彎曲EJB,認為EJB性能低,其實這是一種非常膚淺錯誤的認識,我們首先看看在一般Java環(huán)境中是如何提高性能。

  假定一個JavaBeans為A,那么一般使用這個JavaBeans命令如下:

  A a = new A();

  但是,在高訪問量的環(huán)境中,new A()其實是很費時消耗系統性能的,因此,能不能在軟件系統啟動時候就預先建立一些對象,這樣,系統運行時,從這些已經生成的對象池中借用一個,這樣,就無需在使用時進行New,節(jié)約了開銷,提高了性能,因此,真正成熟性能解決方案都是需要對象池等支持。

  在一個純Web結構的系統(也就是只能運行在Tomat環(huán)境中),例如Struts + Hibernate等這樣的系統,除非自己動手做,一般是沒有對象池技術支持的,因此他們的性能只能算是Demo演示版本的性能,根本無法承受大容量并發(fā)訪問,也無法稱為一個成熟的系統,所以,我們研究成熟的開源Web系統,如Jive、OFBize,LifeRay等,他們都在Web層擁有自己的對象池和緩存池。

  對象池和緩存機制是J2EE必須的嗎?當然,是所有成熟系統必須的,Windows系統如果去掉緩存將會變得怎樣?

  自己動手開發(fā)對象池和緩存機制并不是一件簡單的事情,需要對多線程以及同步鎖等底層原理有深層次的把握,這其實也是一門非常深入的Java研究分支,所以,你可以拋開你的客戶焦急的催促,精心研究開發(fā)自己的對象池和緩存池。

  但是,EJB容器(如JBoss)已經提供了對象池和緩存機制,所以,沒有事務機制的無狀態(tài)Session Bean的性能肯定要強于普通JavaBeans。EJB容器不但在單機中提供了對象池和緩存,而且可以跨服務器實現動態(tài)負載平衡,這些都無需開發(fā)者自己開發(fā)任何軟件代碼,結構如下:

EJB組件能提供真正的可重用框架

  每一個jar包代表一個EJB組件,一個系統可以由多個可重用的EJB組件構成,例如:樹形結構EJB組件;自增序號EJB組件;用戶資料EJB組件等,這樣的EJB組件可以象積木一樣搭配在大部分應用系統中,提高了系統的開發(fā)效率,保證了開發(fā)質量。

  下圖是某個新的具體系統時應用到的EJB組件圖,在這個新的應用中,由于使用了以前大量可重用的EJB組件,新的開發(fā)工作基本集中在界面設計和流程安排上:

EJB提供了事務機制

  事務機制對于一些關鍵事務是很重要的,例如ATM機提款,提款有多個動作:修改數據庫以及數錢等,如果這其中有任何一個環(huán)節(jié)出錯,那么其它已經實現的操作必須還原,否則,就會出現,提款人沒有拿到錢,但是卡上已經扣款等不可思議的事情發(fā)生。

  EJB提供的事務機制非常周全,但事務機制帶來的缺點是性能的降低,因此,有些人認為EJB很重,因為在實際應用中,有的用戶系統可能不需要事務機制,只是需要EJB提供的性能優(yōu)化機制,這樣,如果使用EJB,就象叫一個人來背東西,他除了背著我要的東西外,還背著我不要的東西。

  除非你是一個完美主義,在一般企業(yè)應用或數據庫系統應用中,EJB不會對你構成很重的包袱。

CMP獨特的優(yōu)點

  開源以及一些數據庫持久層技術崇拜者,一直抨擊CMP,認為CMP慢無用,實際最大的問題是他們的設計和使用問題。

  由于EJB容器(如JBoss)對CMP實現有事務機制的緩存優(yōu)化,因此,CMP特別適合多個用戶同時更新同一個數據源的情況,CMP這種嚴格的事務完整性保證多個用戶同時操作一個數據記錄時,能夠保證性能優(yōu)化和數據的完整性,如果這個數據記錄是是軟件系統的狀態(tài)標志,它的狀態(tài)會影響系統中很多的環(huán)節(jié),那么狀態(tài)更改的重要性不言而喻。

  如果沒有事務完整性支持,你的軟件系統在用戶訪問量變大,就會變得發(fā)生各種不可能發(fā)生的邏輯錯誤,查看程序邏輯是正確的,那么問題出在哪里?出在數據完整性上。

  由于每個CMP在內存中都有一個緩存,在實際應用中,如果使用CMP批量讀數據庫數據,幾萬條查詢完畢,內存中充滿了幾萬條CMP緩存,如果這時你的EJB容器設置不當(如使用JBoss缺省配置),那么JVM的垃圾回收機制就會頻繁啟動,導致你的系統變慢甚至死機,這也是一些人抨擊CMP慢的原因所在,其實他們使用方法不當,或者沒有正確配置EJB容器CMP緩存。

  對于這種情況,根據J2EE核心模式,推薦使用DAO+JDBC方式。

小結

  除非你對設計模式非常精深,能夠將自己系統中的JavaBeans使用模式或某種框架進行固定分層,同時,你孜孜不倦研發(fā)出對象池,又熟練于JTA等事務機制,你可以選擇沒有EJB的純Web結構,就象Jive、OFBiz那樣。當然還有一個前提,老板不懂或者非常有挑戰(zhàn)性(做與IBM SUN 微軟齊名的公司和技術)。

  不要再被TSS那些狂熱的開源先生誤導,他們有時間有保障可以做他們喜歡的事情,作為專業(yè)的J2EE程序員,按照J2EE標準去學習去行動,也不要認為,只要使用了J2EE其中某個技術如Jsp或JavaBeans就心安理得認為自己的系統是J2EE了。

  當然,我并不是說純Web系統不能實現多層結構,但是至少在很多方面沒有Web+EJB結構完善和清晰,所以,EJB不是J2EE可以忽視的部分,而是主要的重要的部分,重要業(yè)務功能核心都封裝在EJB中,相反Web層是一種次要的、和界面相關的層次。

  補充:什么情況下不需要EJB,在SUN的SECA架構師試卷中回答:小型系統和不需要事務。另外過去那種認為“EJB有性能問題”根本是一種繆誤,具體可參考下面有關問題。

相關文章:

J2EE集群原理

為什么需要有態(tài)Session Bean

When to not use EJB

關于SPING與EJB的胡言亂語--重和輕永恒的話題




Hilly 2006-09-07 20:04 發(fā)表評論
]]>
java 中的內存泄漏http://m.tkk7.com/web/archive/2006/09/07/Leakage_of_Memory.htmlHillyHillyThu, 07 Sep 2006 11:49:00 GMThttp://m.tkk7.com/web/archive/2006/09/07/Leakage_of_Memory.htmlhttp://m.tkk7.com/web/comments/68362.htmlhttp://m.tkk7.com/web/archive/2006/09/07/Leakage_of_Memory.html#Feedback0http://m.tkk7.com/web/comments/commentRss/68362.htmlhttp://m.tkk7.com/web/services/trackbacks/68362.html一 問題的提出

Java的一個重要優(yōu)點就是通過垃圾收集器(Garbage Collection,GC)自動管理內存的回收,程序員不需要通過調用函數來釋放內存。因此,很多程序員認為Java不存在內存泄漏問題,或者認為即使有內存泄漏也不是程序的責任,而是GC或JVM的問題。其實,這種想法是不正確的,因為Java也存在內存泄露,但它的表現與C 不同。

隨著越來越多的服務器程序采用Java技術,例如JSP,Servlet, EJB等,服務器程序往往長期運行。另外,在很多嵌入式系統中,內存的總量非常有限。內存泄露問題也就變得十分關鍵,即使每次運行少量泄漏,長期運行之后,系統也是面臨崩潰的危險。

二 Java是如何管理內存

為了判斷Java中是否有內存泄露,我們首先必須了解Java是如何管理內存的。Java的內存管理就是對象的分配和釋放問題。在Java中,程序員需要通過關鍵字new為每個對象申請內存空間 (基本類型除外),所有的對象都在堆 (Heap)中分配空間。另外,對象的釋放是由GC決定和執(zhí)行的。在Java中,內存的分配是由程序完成的,而內存的釋放是有GC完成的,這種收支兩條線的方法確實簡化了程序員的工作。但同時,它也加重了JVM的工作。這也是Java程序運行速度較慢的原因之一。因為,GC為了能夠正確釋放對象,GC必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等,GC都需要進行監(jiān)控。

監(jiān)視對象狀態(tài)是為了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象不再被引用。

為了更好理解GC的工作原理,我們可以將對象考慮為有向圖的頂點,將引用關系考慮為圖的有向邊,有向邊從引用者指向被引對象。另外,每個線程對象可以作為一個圖的起始頂點,例如大多程序從main進程開始執(zhí)行,那么該圖就是以main進程頂點開始的一棵根樹。在這個有向圖中,根頂點可達的對象都是有效對象,GC將不回收這些對象。如果某個對象 (連通子圖)與這個根頂點不可達(注意,該圖為有向圖),那么我們認為這個(這些)對象不再被引用,可以被GC回收。

以下,我們舉一個例子說明如何用有向圖表示內存管理。對于程序的每一個時刻,我們都有一個有向圖表示JVM的內存分配情況。以下右圖,就是左邊程序運行到第6行的示意圖。


Java使用有向圖的方式進行內存管理,可以消除引用循環(huán)的問題,例如有三個對象,相互引用,只要它們和根進程不可達的,那么GC也是可以回收它們的。這種方式的優(yōu)點是管理內存的精度很高,但是效率較低。另外一種常用的內存管理技術是使用計數器,例如COM模型采用計數器方式管理構件,它與有向圖相比,精度行低(很難處理循環(huán)引用的問題),但執(zhí)行效率很高。

三 什么是Java中的內存泄露

下面,我們就可以描述什么是內存泄漏。在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連;其次,這些對象是無用的,即程序以后不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定為Java中的內存泄漏,這些對象不會被GC所回收,然而它卻占用內存。

在C 中,內存泄漏的范圍更大一些。有些對象被分配了內存空間,然后卻不可達,由于C 中沒有GC,這些內存將永遠收不回來。在Java中,這些不可達的對象都由GC負責回收,因此程序員不需要考慮這部分的內存泄露。

通過分析,我們得知,對于C ,程序員需要自己管理邊和頂點,而對于Java程序員只需要管理邊就可以了(不需要管理頂點的釋放)。通過這種方式,Java提高了編程的效率。

因此,通過以上分析,我們知道在Java中也有內存泄漏,但范圍比C 要小一些。因為Java從語言上保證,任何對象都是可達的,所有的不可達對象都由GC管理。

對于程序員來說,GC基本是透明的,不可見的。雖然,我們只有幾個函數可以訪問GC,例如運行GC的函數System.gc(),但是根據Java語言規(guī)范定義, 該函數不保證JVM的垃圾收集器一定會執(zhí)行。因為,不同的JVM實現者可能使用不同的算法管理GC。通常,GC的線程的優(yōu)先級別較低。JVM調用GC的策略也有很多種,有的是內存使用到達一定程度時,GC才開始工作,也有定時執(zhí)行的,有的是平緩執(zhí)行GC,有的是中斷式執(zhí)行GC。但通常來說,我們不需要關心這些。除非在一些特定的場合,GC的執(zhí)行影響應用程序的性能,例如對于基于Web的實時系統,如網絡游戲等,用戶不希望GC突然中斷應用程序執(zhí)行而進行垃圾回收,那么我們需要調整GC的參數,讓GC能夠通過平緩的方式釋放內存,例如將垃圾回收分解為一系列的小步驟執(zhí)行,Sun提供的HotSpot JVM就支持這一特性。

下面給出了一個簡單的內存泄露的例子。在這個例子中,我們循環(huán)申請Object對象,并將所申請的對象放入一個Vector中,如果我們僅僅釋放引用本身,那么Vector仍然引用該對象,所以這個對象對GC來說是不可回收的。因此,如果對象加入到Vector后,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置為null。

Vector v=new Vector(10);
for (int i=1;i<100; i )
{
Object o=new Object();
v.add(o);
o=null;
}
//此時,所有的Object對象都沒有被釋放,因為變量v引用這些對象。

四 如何檢測內存泄漏

最后一個重要的問題,就是如何檢測Java的內存泄漏。目前,我們通常使用一些工具來檢查Java程序的內存泄漏問題。市場上已有幾種專業(yè)檢查Java內存泄漏的工具,它們的基本工作原理大同小異,都是通過監(jiān)測Java程序運行時,所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發(fā)人員將根據這些信息判斷程序是否有內存泄漏問題。這些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。

下面,我們將簡單介紹Optimizeit的基本功能和工作原理。

Optimizeit Profiler版本4.11支持Application,Applet,Servlet和Romote Application四類應用,并且可以支持大多數類型的JVM,包括SUN JDK系列,IBM的JDK系列,和Jbuilder的JVM等。并且,該軟件是由Java編寫,因此它支持多種操作系統。Optimizeit系列還包括Thread Debugger和Code Coverage兩個工具,分別用于監(jiān)測運行時的線程狀態(tài)和代碼覆蓋面。

當設置好所有的參數了,我們就可以在OptimizeIt環(huán)境下運行被測程序,在程序運行過程中,Optimizeit可以監(jiān)視內存的使用曲線(如下圖),包括JVM申請的堆(heap)的大小,和實際使用的內存大小。另外,在運行過程中,我們可以隨時暫停程序的運行,甚至強行調用GC,讓GC進行內存回收。通過內存使用曲線,我們可以整體了解程序使用內存的情況。這種監(jiān)測對于長期運行的應用程序非常有必要,也很容易發(fā)現內存泄露。


在運行過程中,我們還可以從不同視角觀查內存的使用情況,Optimizeit提供了四種方式:

堆視角。 這是一個全面的視角,我們可以了解堆中的所有的對象信息(數量和種類),并進行統計、排序,過濾。了解相關對象的變化情況。
方法視角。通過方法視角,我們可以得知每一種類的對象,都分配在哪些方法中,以及它們的數量。
對象視角。給定一個對象,通過對象視角,我們可以顯示它的所有出引用和入引用對象,我們可以了解這個對象的所有引用關系。
引用圖。 給定一個根,通過引用圖,我們可以顯示從該頂點出發(fā)的所有出引用。

在運行過程中,我們可以隨時觀察內存的使用情況,通過這種方式,我們可以很快找到那些長期不被釋放,并且不再使用的對象。我們通過檢查這些對象的生存周期,確認其是否為內存泄露。在實踐當中,尋找內存泄露是一件非常麻煩的事情,它需要程序員對整個程序的代碼比較清楚,并且需要豐富的調試經驗,但是這個過程對于很多關鍵的Java程序都是十分重要的。

綜上所述,Java也存在內存泄露問題,其原因主要是一些對象雖然不再被使用,但它們仍然被引用。為了解決這些問題,我們可以通過軟件工具來檢查內存泄露,檢查的主要原理就是暴露出所有堆中的對象,讓程序員尋找那些無用但仍被引用的對象。

相關資源:

文章:
Jim Patrick, Handling memory leaks in Java programs,
http://www-106.ibm.com/developerWorks/library/j-leaks/index.html
Ed Lycklama, Does Java Technology Have Memory Leaks?
http://www.klgroup.com/javaone
Sun, The Java HotSpot Virtual Machine, Technical White Paper

軟件:
Sitraka Software's Jprobe http://www.sitraka.com
Boland Software's Optimizeit http://optimizeit
IBM alphaWorks' Jinsight http://www.alphaworks.ibm.com/tech/jinsight

關于作者
歐陽辰,北京大學計算機碩士畢業(yè),98年起開始研究基于java的軟件開發(fā)、測試,參與開發(fā)、測試過多個基于Java的應用程序和Web服務項目。聯系方式yeekee@sina.com
周欣,北京大學計算機系在讀博士生,主要研究方向:程序理解、逆向工程及軟件度量,聯系方式 zhouxin@sei.pku.edu.cn



Hilly 2006-09-07 19:49 發(fā)表評論
]]>
J2EE建議的學習路線http://m.tkk7.com/web/archive/2006/08/16/J2EE_Learning_Router.htmlHillyHillyWed, 16 Aug 2006 09:44:00 GMThttp://m.tkk7.com/web/archive/2006/08/16/J2EE_Learning_Router.htmlhttp://m.tkk7.com/web/comments/63969.htmlhttp://m.tkk7.com/web/archive/2006/08/16/J2EE_Learning_Router.html#Feedback0http://m.tkk7.com/web/comments/commentRss/63969.htmlhttp://m.tkk7.com/web/services/trackbacks/63969.htmlJ2EE建議的學習路線
來源: 賽迪博 

網絡上、書店都提供了很多資料,很多方式都可以得到J2EE方面的資料。如何系統的、高效的學習J2EE這個問題擺在我們面前。比如,有些人在看完一大堆書后,動起手來時還是不知道怎么開始。等等這些問題是我們最難處理的。如何尋找到一條很好的方式方法呢?

?

其實,換一個角度來看,比如,學英語,一共有三個層面的東西,首先是詞匯,然后是語法,再者是習慣用法(希望讀者能夠從程序設計的角度考慮問題,看看這兩者有什么相似之處,其實他們的邏輯是一樣的)。還比如,上數學課,老師在黑板上解題,大家都很輕松得聽懂,自己動手時就會有很多問題。這些看來很簡單的問題,其實都包含一個道理:理論聯系實際,理論指導實踐。

我們的理論在于,我們要有很好的方法。有些人看了很多書,寫了不少程序,水平還是提高得很慢,很難跨越這道難關。還是方法問題。當然,我所談論的方法,是自己的心得,體會,大家都有自己很獨特的方法。沒有絕對好、絕對壞的方法,看作用對象是誰。所以這里我們重點看看我這文章中所會提出來的方法。大家來評論評論。

上一篇文中《走向J2EE,漫長的道路》,我談到學習J2EE是一個漫長的過程,對,就是如此。因為她里面包含了很多全新的東西。而且,J2EE是現在進行時。我們知道J2EE由很多技術構成,比如,EJB、XML、JDBC、RMI、JSP、Servlet等等這些,又包含很多內容。無論這些具體的技術會怎么發(fā)展,怎么變化,我們要抓住主線,那就是掌握J2EE構架的精髓。用什么來分析呢,作用對象自然是J2EE Specification(最新版是1.4,http://java.sun.com/j2ee )!!!當然學習J2EE的前提是你對J2SE有了足夠的熟悉了,還有一點,你有很好的態(tài)度和興趣。只看J2EE規(guī)范是不夠的,最好結合產品和例子去思考,我建議大家用JBuilder 7 +BEA WebLogc Platform 7.0,這種開發(fā)模式。為什么這么說呢?首先,JBuilder 7本身的功能就是不錯,應該屬于主流Java IDE了。其次,BEA WebLogic Platform 7.0對J2EE Specification最新版支持程度很好,同時也較容易獲取,用的人也多。第三,開發(fā)效率不錯。(Borland網站有一份講述JBuilder 7 + BEA WebLogic 7.0集成開發(fā)的文檔,PDF格式。)

JBuilder 7本身提供了很多幫助文檔,有PDF格式,也有HTML格式(采用JavaHelp技術制作的),另外書店有一些JBuilder的參考用書,個人認為沒有必要,第一,提供的版本都比較陳舊;第二,沒有什么內容;第三,一般都是抄襲JBuilder 本身提供的幫助文檔。(個人觀點,沒有任何商業(yè)目的)。當然,你的外語差不多要有四級水平,這個可不能沒有,至少閱讀能力不錯(其實也不是這樣的,我最開始時也是害怕,但開始投入后,英語資料也很簡單,而且很地道!同時提高了您的外語)。WebLogic同樣也不錯,也提供了很多文檔,http://www.bestdown.com 上有一本WebLogic Bible(針對6.1版),國內的BEA公司好像也出了一本,有興趣地可以去china pub看看。

有了這兩者,我們需要找出合適的對象來學習。在這里給出幾方面的素材給大家提供參考。

第一,在JBuilder 7的安裝目錄的這個地方,~~:\JBuilder7\samples\Ejb\Ejb20\ESiteWL,有一個很好的例子,ESite。其中用到了Session Fa?ade設計模式,用到了JSP、Servlet、Session Beans、Entity Beans(cmp)等技術,學習過程中不懂得地方可以參考第二。

第二, Sun公司提供的J2EE Tutorial資料,很不錯。

第三,Java Pet Store,剛開始學習J2EE技術分析該例子有點困難,再者這個例子中的J2EE構架不是很實用,但她給我們展示了J2EE幾乎所有的核心技術,同時還提供了一本書,Design Enterprise Applications with J2EE Platform,很不錯。

第四,對J2EE構架比較了解,對EJB,XML,JSP,Servlet等技術有了較好的理解和程序經驗后,建議看看這幾本書:《J2EE In Practice》、《Core J2EE Patterns》、《Sun Certified ENT Architect for J2EE - Tech Study Guide》、《Java Tools for Extreme Programming - wiley》、《EJB Design Patterns》、《MasteringEJB 2》、《Enterprise JavaBeans,3rd》,夠你看得了:)。

有了上述基礎,結合大家做項目中的一些經驗,我想水平應該會有不少提高。在初步掌握上述基礎后,我們每個人都可以有自己在J2EE中的定位,比如有些開發(fā)人員可以考慮把時間花在商務邏輯層、另外一些喜歡花功夫在表示層,更有貪婪的家伙花在J2EE中所有的層。還有Web Services(J2EE 1.4 Specification的重點,估計2003年初推出,今后的重要發(fā)展方向)。

同時,大家要注意從軟件工程的角度考慮系統設計,實施,建議用用Together!!!要求大家對UML有足夠的了解。



Hilly 2006-08-16 17:44 發(fā)表評論
]]>
Struts入門(轉)http://m.tkk7.com/web/archive/2006/08/16/StrutsNewComer.htmlHillyHillyWed, 16 Aug 2006 09:39:00 GMThttp://m.tkk7.com/web/archive/2006/08/16/StrutsNewComer.htmlhttp://m.tkk7.com/web/comments/63965.htmlhttp://m.tkk7.com/web/archive/2006/08/16/StrutsNewComer.html#Feedback0http://m.tkk7.com/web/comments/commentRss/63965.htmlhttp://m.tkk7.com/web/services/trackbacks/63965.htmlStruts安裝:
?首先請到http://jakarta.apache.org/Struts下載Struts,建議使用release版,現在最高版本為1.1,下載后得到的是一個ZIP文件。將ZIP包解開,可以看到這個目錄:lib和webapps,webapps下有一些WAR文件。假設你的Tomcat裝在c:\Tomcat下,則將那些WAR文件拷貝到C:\Tomcat\webapps,重新啟動Tomcat即可。打開瀏覽器,在地址欄中輸入:http://localhost:8080/Struts-example/index.jsp,若能見到“powered by Struts”的深藍色圖標,即說明成功了。這是Struts自帶的一個例子,附有詳細的說明文檔,可以做為初學者的入門教程。
另外,Struts還提供了一系統實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息等 一個實例: 一個用戶注冊系統,用戶通過網頁輸入相關信息:注冊ID號,密碼,EMAIL,若注冊成功,則返回成功提示信息,反之出現注冊失敗提示信息。以下是相關文件的部分核心代碼。 項目建立: 正式開發(fā)前,需要在Tocmat(我的tomcat裝在c:\tomcat)中建立此項目。比較快的一種建立方式為:在C:\tomcat\webapps下新建目錄test,再將C:\tomcat\webapps\struts-example下的 WEB-INF目錄拷貝到test目錄下,然后將test\WEB-INF下的src和classes目錄清空,以及struts-config.xml文件中內容清空即可。這樣,我們需要的Struts類包及相關的配置文件就都齊了。 開發(fā)時,將JSP文件放在test目錄下,Java原文件放在test\WEB-INF\src下,編譯后的類文件放在test\WEB-INF\classes下。 注冊頁面:reguser.jsp
<%@?page?contentType="text/html;charset=UTF-8"?language="java"?%>
<%
@?taglib?uri="/WEB-INF/Struts-bean.tld"?prefix="bean"?%>
<%
@?taglib?uri="/WEB-INF/Struts-html.tld"?prefix="html"?%>
<?
XML:NAMESPACE?PREFIX?=?HTML?/>
<
HTML:HTML?locale="true">
<
HTML:BASE></HTML:BASE>
<
HTML:ERRORS></HTML:ERRORS>

<
HTML:FORM?action="/regUserAction"?focus="logname">
<TABLE?width="100%"?border=0>
<TBODY>
??????? <TR>
??????????????? <TH?align=right>Logname:?</TH>
??????????????? <TD?align=left?><HTML:TEXT?property="logname"?size="20"?maxlength="20"></HTML:TEXT></TD>
??????? </
TR>
??????? <TR>
??????????????? <TH?align=right>Password:?</TH>
??????????????? <TD?align=left><HTML:PASSWORD?property="password"?size="20"?maxlength="20"></HTML:PASSWORD></TD>
??????? </
TR>
??????? <TR>
??????????????? <TH?align=right>E-mail:?</TH>
??????????????? <TD?align=left><HTML:PASSWORD?property="email"?size="30"?maxlength="50"></HTML:PASSWORD></TD>
??????? </
TR>
??????? <TR>
??????????????? <TD?align=middle><HTML:SUBMIT?property="submit"?value="Submit"></HTML:SUBMIT></TD>
??????????????? <TD?align=left><HTML:RESET></HTML:RESET></TD>
??????? </
TR>
</
TBODY>
</
TABLE>
</
HTML:FORM>
</
HTML:HTML>





此JSP頁面不同于普通的JSP頁,因為它大量運用了taglib,這些taglib對初學者而言,可能難于掌握,可這卻是Struts的精華之一。靈活運用,將大大提高開發(fā)效率。
Struts-config.xml: Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有頁面的導航定義。對于大型的WEB項目,通過此配置文件即可迅速把握其脈絡,這不管是對于前期的開發(fā),還是后期的維護或升級都是大有裨益的。掌握Struts-config.xml是掌握Struts的關鍵所在。
FormBean:RegUserForm?

package?org.cjea.Struts.example;
import?javax.Servlet.http.HttpServletRequest;
import?org.apache.Struts.action.ActionForm;?
import?org.apache.Struts.action.ActionMapping;?
public?final?class?RegUserForm?extends?ActionForm{
???????
private?String?logname;
???????
private?String?password;
???????
private?String?email;
???????
public?RegUserForm(){
???????????????logname?
=?null;
???????????????password?
=?null;
???????????????email?
=?null;
???????}
????????
public?String?getLogName()?{
???????????????
return?this.logname;
????????}
????????
public?void?setLogName(String?logname)?{
???????????????
this.logname?=?logname;
????????}
????????
public?void?setPassWord(String?password)?{
???????????????
this.password?=?password;
????????}
????????
public?String?getPassWord()?{
???????????????
return?this.password;
????????}
????????
public?void?setEmail(String?email)?{
???????????????
this.email?=?email;
????????}
????????
public?String?getEmail()?{
???????????????
return?this.email;?
???????}
????????
public?void?reset(ActionMapping?mapping,?HttpServletRequest?request)?{
???????????????logname?
=?null;
???????????????password?
=?null;
???????????????email?
=?null;
????????}
?}


每一個FormBean 都必須繼承ActionForm類,FormBean是對頁面請求的封裝。即把HTTP request 封裝在一個對象中,需要說明的一點就是多個HTTP request可以共用一個FormBean,便于維護和重用。 ActionBean:RegUserAction

?package?org.cjea.Struts.example;
?
import?javax.Servlet.http.*;
?
import?org.apache.Struts.action.*;
?
public?final?class?RegUserAction?extends?Action?{
????????
public?ActionForward?perform(ActionMapping?mapping,?ActionForm?form,?
?????????????????????????????????????????????????????????????? HttpServletRequest?req,?HttpServletResponse?res)?{
???????????????????String?title?
=?req.getParameter("title");
?????????????????? String?password?
=?req.getParameter("password");
?????????????????? String?email?
=?req.getParameter("email");
??????????????????
/*?取得用戶請求,做相應數據庫操作,略?*/
????????? }
?}?

FormBean的產生是為了提供數據給ActionBean,在ActionBean中可以取得FormBean中封裝的數據,經相應的邏輯處理后,調用業(yè)務方法完成相應業(yè)務要求。 Servlet的演變:在常規(guī)的 JSP,Servlet,JavaBean三層結構中,JSP實現View的功能,Servlet實現Controller的功能,JavaBean實現Model的實現。 在Struts中,將常規(guī)情況下的Servlet拆分與ActionServlet、FormBean、ActionBean三個部分。ActionServlet配合Struts-config.xml,專職完成頁面導航,而不再負責具體的數據獲取與相應邏輯,這兩部分功能由FormBean和ActionBean來完成。

?Struts優(yōu)缺點
優(yōu)點: Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優(yōu)點。使開發(fā)者能更深入的了解其內部實現機制。
?除此之外,Struts的優(yōu)點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發(fā)效率。另外,就目前國內的JSP開發(fā)者而言,除了使用JSP自帶的常用標記外,很少開發(fā)自己的標記,或許Struts是一個很好的起點。 關于頁面導航,我認為那將是今后的一個發(fā)展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發(fā)者接手這個項目時,這種優(yōu)勢體現得更加明顯。

缺點: Taglib是Struts的一大優(yōu)勢,但對于初學者而言,卻需要一個持續(xù)學習的過程,甚至還會打亂你網頁編寫的習慣,但是,當你習慣了它時,你會覺得它真的很棒。 Struts將MVC的Controller一分為三,在獲得結構更加清晰的同時,也增加了系統的復雜度。 Struts從產生到現在還不到半年,但已逐步越來越多運用于商業(yè)軟件。雖然它現在還有不少缺點,但它是一種非常優(yōu)秀的J2EE MVC實現方式,如果你的系統準備采用J2EE MVC架構,那么,不妨考慮一下Struts。
?
Struts實施經驗:
?1、基于Struts架構的項目開發(fā),首先需要有一個很好的整體規(guī)劃,整個系統中包括哪幾個模塊,每個模塊各需要多少FormBean和ActionBean等,而且最好有專人負責Struts-config.xml的管理。開發(fā)基于Struts的項目的難點在于配置管理,尤其是對Struts-config.xml的管理
?2、如果你的項目非常緊,并且項目組中又沒有富有經驗的Struts開發(fā)人員,建議不要冒然采用Struts。Struts的掌握需要一個過程,對于一個熟練的JSP程序員,自學大概需要半個月左右的時間。如果結合titls,則需要更長的時間
?3、如果你在網頁中大量運用taglib,那么你的美工將做出部分犧牲。當你結合Tiles,功能增強的同時,這種犧牲尤為明顯。當然,你對功能和美觀的取舍由你自己決定
?4、Taglib是一個好東西,但靈活運用它卻需要一個過程,如果你不想在Taglib上花太多的時間,那么只需理解與FORM有關的幾個標記,其它的標記就放著吧,以后再看,先去研究ActionServlet和Struts-config.xml,你會覺得很有成就感
?5、Struts是否只適合于大型項目呢?No!Struts適合于各種大小的項目,當然,對于大型項目,它所體現出來的優(yōu)勢更加明顯。

Hilly 2006-08-16 17:39 發(fā)表評論
]]>
Struts安裝配置(轉)http://m.tkk7.com/web/archive/2006/08/16/StrutsSetup.htmlHillyHillyWed, 16 Aug 2006 09:11:00 GMThttp://m.tkk7.com/web/archive/2006/08/16/StrutsSetup.htmlhttp://m.tkk7.com/web/comments/63953.htmlhttp://m.tkk7.com/web/archive/2006/08/16/StrutsSetup.html#Feedback0http://m.tkk7.com/web/comments/commentRss/63953.htmlhttp://m.tkk7.com/web/services/trackbacks/63953.html

Struts安裝配置

1、Struts的安裝比較簡單,下面的以Tomcat 4.1.24為例,講述安裝過程。 首先請到http://jakarta.apache.org/Struts下載Struts,建議使用release版,現在最高版本為1.1,下載后得到的是一個ZIP文件。 將ZIP包解開,可以看到這個目錄:lib和webapps,webapps下有一些WAR文件。 假設你的Tomcat裝在c:\Tomcat下,則將那些WAR文件拷貝到C:\Tomcat\webapps,重新啟動Tomcat即可。 打開瀏覽器,在地址欄中輸入:http://localhost:8080/Struts-example/index.jsp,若能見到“powered by Struts”的深藍色圖標,即說明成功了。這是Struts自帶的一個例子,附有詳細的說明文檔,可以做為初學者的入門教程。 另外,Struts還提供了一系統實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息等

2、關于Struts配置,由于我是采用Jbuilder9為開發(fā)工具,這里主要說一下Struts在Jbuilder中配置:Jbuilder本身自帶已經集成了Struts1.0,但目前的開發(fā)大部分都是在Struts1.1下,所以下面就介紹Struts1.1在Jbuilder中的配置:

1、下載 jakarta-struts-1.1.zip 包;jakarta-struts-1.1-src.zip包

2、將jakarta-struts-1.1.zip包解壓到C:\JBuilder9\thirdparty目錄下 jakarta-struts-1.1-src.zip包解壓到C:\JBuilder9\extras目錄下

3、啟動jbuilder9

4、配置Library (1)選擇菜單 tools\Configure Libraries (2)新建一個Library (3)在New Library Wizard對話框中, Name 輸入:struts1.1, location可選:User Home, Library paths:add加入C:\JBuilder9\thirdparty\jakarta-struts-1.1\lib\struts.jar (4)確定創(chuàng)建Library (5)選中struts1.1,修改Library Settings Class:C:\JBuilder9\thirdparty\jakarta-struts-1.1\lib\struts.jar Source:C:\JBuilder9\extras\jakarta-struts-1.1-src\src\share DocumentationC:\JBuilder9\thirdparty\jakarta-struts-1.1\webapps\struts-documentation.war\api Required Library:空 Framework:在Framework下拉框中,選擇struts,會自動出現6個taglib。 struts-bean struts-html struts-logic struts-template struts-tiles struts-nested (6)點擊OK,創(chuàng)建Library成功。

關于在其他工具上的配置,如Eclipse 網上有很多資料。



Hilly 2006-08-16 17:11 發(fā)表評論
]]>
文件或文件夾拷貝(源代碼)http://m.tkk7.com/web/archive/2006/08/10/IOFileCopyCode.htmlHillyHillyThu, 10 Aug 2006 15:41:00 GMThttp://m.tkk7.com/web/archive/2006/08/10/IOFileCopyCode.htmlhttp://m.tkk7.com/web/comments/62884.htmlhttp://m.tkk7.com/web/archive/2006/08/10/IOFileCopyCode.html#Feedback1http://m.tkk7.com/web/comments/commentRss/62884.htmlhttp://m.tkk7.com/web/services/trackbacks/62884.html 本人原創(chuàng),轉載請注明出處http://m.tkk7.com/web/

// 任務:
// 寫一個文件拷貝函數:?fileCopy(String?a?,String?b)???
// a--表示原文件名???b--表示目標文件名擴展:
// 如果a是文件,則copy?a到b?;
// 如果a是目錄,則copy?a下的所有文件和文件夾(包括子文件夾)到b目錄下。
//

import ?java.io. * ;


public ? class ?IODemo?{
????
????
public ? void ?fileCopy(String?a,?String?b){
????????File?file?
= ? new ?File(a);

????????
if ( ! file.exists()){
????????????System.out.println(a?
+ ? " ?Not?Exists. " );
????????????
return ;
????????}
????????File?fileb?
= ? new ?File(b);

????????
if (file.isFile()){
????????????FileInputStream?fis?
= ? null ;
????????????FileOutputStream?fos?
= null ;
????????????
try ?{
????????????????fis?
= ? new ?FileInputStream(file);
????????????????fos?
= ?? new ?FileOutputStream(fileb);
????????????????
????????????????
byte []?bb? = new ? byte [?( int )file.length()];
????????????????fis.read(bb);
????????????????fos.write(bb);

????????????}
catch ?(IOException?e){
????????????????e.printStackTrace();
????????????}
finally {
????????????????
try ?{
????????????????????fis.close();
????????????????????fos.close();
????????????????}?
catch ?(IOException?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
else ? if (file.isDirectory()){
????????????
if ( ! fileb.exists()){
????????????????fileb.mkdir();
????????????}
????????????String[]?fileList;
????????????fileList?
= ?file.list();
????????????
for ( int ?i? = ? 0 ;?i? < ?fileList.length;?i ++ ){
????????????????fileCopy(a?
+ ? " \\ " ? + ?fileList[i],b? + ? " \\ " ? + ?fileList[i]);
????????????}
????????}

????}
????
}


Hilly 2006-08-10 23:41 發(fā)表評論
]]>
jsp生成隨機驗證碼圖片(轉)http://m.tkk7.com/web/archive/2006/08/06/jspCreateRandPic.htmlHillyHillySun, 06 Aug 2006 13:45:00 GMThttp://m.tkk7.com/web/archive/2006/08/06/jspCreateRandPic.htmlhttp://m.tkk7.com/web/comments/62081.htmlhttp://m.tkk7.com/web/archive/2006/08/06/jspCreateRandPic.html#Feedback3http://m.tkk7.com/web/comments/commentRss/62081.htmlhttp://m.tkk7.com/web/services/trackbacks/62081.htmlhttp://www.matrix.org.cn/resource/article/0/910.html


生成有4個隨機數字和雜亂背景的圖片,數字和背景顏色會改變,服務器端刷新(用history.go(-1)也會變)
原型參考ALIBABA??http://china.alibaba.com/member/showimage

------------產生驗證碼圖片的文件-----image.jsp-------------------------------------------


<%@?page?contentType="image/jpeg"?import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"?%>
<%!
Color?getRandColor(
int?fc,int?bc){//給定范圍獲得隨機顏色
????????Random?random?=?new?Random();
????????
if(fc>255)?fc=255;
????????
if(bc>255)?bc=255;
????????
int?r=fc+random.nextInt(bc-fc);
????????
int?g=fc+random.nextInt(bc-fc);
????????
int?b=fc+random.nextInt(bc-fc);
????????
return?new?Color(r,g,b);
????????}
%>
<%
//設置頁面不緩存
response.setHeader("Pragma","No-cache");
response.setHeader(
"Cache-Control","no-cache");
response.setDateHeader(
"Expires",?0);

//?在內存中創(chuàng)建圖象
int?width=60,?height=20;
BufferedImage?image?
=?new?BufferedImage(width,?height,?BufferedImage.TYPE_INT_RGB);

//?獲取圖形上下文
Graphics?g?=?image.getGraphics();

//生成隨機類
Random?random?=?new?Random();

//?設定背景色
g.setColor(getRandColor(200,250));
g.fillRect(
0,?0,?width,?height);

//設定字體
g.setFont(new?Font("Times?New?Roman",Font.PLAIN,18));

//畫邊框
//
g.setColor(new?Color());
//
g.drawRect(0,0,width-1,height-1);


//?隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
g.setColor(getRandColor(160,200));
for?(int?i=0;i<155;i++)
{
????????
int?x?=?random.nextInt(width);
????????
int?y?=?random.nextInt(height);
????????
int?xl?=?random.nextInt(12);
????????
int?yl?=?random.nextInt(12);
????????g.drawLine(x,y,x
+xl,y+yl);
}

//?取隨機產生的認證碼(4位數字)
String?sRand="";
for?(int?i=0;i<4;i++){
????String?rand
=String.valueOf(random.nextInt(10));
????sRand
+=rand;
????
//?將認證碼顯示到圖象中
????g.setColor(new?Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
????g.drawString(rand,13*i+6,16);
}

//?將認證碼存入SESSION
session.setAttribute("rand",sRand);


//?圖象生效
g.dispose();

//?輸出圖象到頁面
ImageIO.write(image,?"JPEG",?response.getOutputStream());


%>?

---------------使用驗證碼圖片的文件---------a.jsp------------------------------------


<%@?page?contentType="text/html;charset=gb2312"?%>
<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">
<html>
<head>
<title>認證碼輸入頁面</title>
<meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312">
<META?HTTP-EQUIV="Pragma"?CONTENT="no-cache">?
<META?HTTP-EQUIV="Cache-Control"?CONTENT="no-cache">?
<META?HTTP-EQUIV="Expires"?CONTENT="0">?
</head>
<body>
<form?method=post?action="check.jsp">
<table>
??? <tr>
???????
<td?align=left>系統產生的認證碼:</td>
???????
<td><img?border=0?src="image.jsp"></td>
???
</tr>
???
<tr>
???????
<td?align=left>輸入上面的認證碼:</td>
???????
<td><input?type=text?name=rand?maxlength=4?value=""></td>
???
</tr>
???
<tr>
???????
<td?colspan=2?align=center><input?type=submit?value="提交檢測"></td>
????
</tr>
</table>
</form>
</body>
</html>


-----------------驗證的頁面----------check.jsp

<%@?page?contentType="text/html;?charset=gb2312"?language="java"?import="java.sql.*"?errorPage=""?%>
<html>
<head>
<title>認證碼驗證頁面</title>
<meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312">
<META?HTTP-EQUIV="Pragma"?CONTENT="no-cache">?
<META?HTTP-EQUIV="Cache-Control"?CONTENT="no-cache">?
<META?HTTP-EQUIV="Expires"?CONTENT="0">?
</head>

<body>
<%?
String?rand?
=?(String)session.getAttribute("rand");
String?input?
=?request.getParameter("rand");
%>
系統產生的認證碼為:?
<%=?rand?%><br>
您輸入的認證碼為:?
<%=?input?%><br>
<br>
<%
??
if?(rand.equals(input))?{
%>
<font?color=green>輸入相同,認證成功!</font>
<%
??}?
else?{
%>
<font?color=red>輸入不同,認證失敗!</font>
<%
??}
%>
</body>
</html>



Hilly 2006-08-06 21:45 發(fā)表評論
]]>
什么是3G?詳解(轉)http://m.tkk7.com/web/archive/2006/07/29/WhatIs3G.htmlHillyHillySat, 29 Jul 2006 00:57:00 GMThttp://m.tkk7.com/web/archive/2006/07/29/WhatIs3G.htmlhttp://m.tkk7.com/web/comments/60686.htmlhttp://m.tkk7.com/web/archive/2006/07/29/WhatIs3G.html#Feedback0http://m.tkk7.com/web/comments/commentRss/60686.htmlhttp://m.tkk7.com/web/services/trackbacks/60686.html3G是英文3rdGeneration 的縮寫,指第三代移動通信技術。相對第一代模擬
制式手機(1G)和第二代GSM 、TDMA等數字手機(2G),第三代手機一般地講,
是指將無線通信與國際互聯網等多媒體通信結合的新一代移動通信系統。它能夠
處理圖像、音樂、視頻流等多種媒體形式,提供包括網頁瀏覽、電話會議、電子
商務等多種信息服務。為了提供這種服務,無線網絡必須能夠支持不同的數據傳
輸速度,也就是說在室內、室外和行車的環(huán)境中能夠分別支持至少2Mbps (兆字
節(jié)/每秒?84kbps(千字節(jié)/每秒)以及144kbps 的傳輸速度。

??? 3G的技術標準

??? 國際電信聯盟(ITU )在2000年5 月確定W —CDMA、CDMA2000和TDS —CDMA
三大主流無線接口標準,寫入3G技術指導性文件《2000年國際移動通訊計劃》
(簡稱IMT —2000)。

??? W —CDMA

??? 即WidebandCDMA,也稱為CDMADirectSpread,意為寬頻分碼多重存取,其支
持者主要是以GSM 系統為主的歐洲廠商,日本公司也或多或少參與其中,包括歐
美的愛立信、阿爾卡特、*** 、朗訊、北電,以及日本的NTT 、富士通、夏普等
廠商。這套系統能夠架設在現有的GSM 網絡上,對于系統提供商而言可以較輕易
地過渡,而GSM 系統相當普及的亞洲對這套新技術的接受度預料會相當高。因此
W —CDMA具有先天的市場優(yōu)勢。

??? CDMA2000

??? CDMA2000也稱為CDMAMulti —Carrier ,由美國高通北美公司為主導提出,
摩托羅拉、Lucent和后來加入的韓國*** 都有參與,韓國現在成為該標準的主導
者。這套系統是從窄頻CDMAOne 數字標準衍生出來的,可以從原有的CDMAOne 結
構直接升級到3G,建設成本低廉。但目前使用CDMA的地區(qū)只有日、韓和北美,所
以CDMA2000的支持者不如W —CDMA多。不過CDMA2000的研發(fā)技術卻是目前各標準
中進度最快的,許多3G手機已經率先面世。

??? TD—SCDMA

??? 該標準是由中國大陸獨自制定的3G標準,1999年6 月29日,中國原郵電部電
信科學技術研究院(大唐電信)向ITU 提出。該標準將智能無線、同步CDMA和軟
件無線電等當今國際領先技術融于其中,在頻譜利用率、對業(yè)務支持具有靈活性、
頻率靈活性及成本等方面的獨特優(yōu)勢。另外,由于中國內的龐大的市場,該標準
受到各大主要電信設備廠商的重視,全球一半以上的設備廠商都宣布可以支持TD
—SCDMA 標準。

??? 什么是2.5G

??? 目前已經進行商業(yè)應用的2.5G移動通信技術是從2G邁向3G的銜接性技術,由
于3G是個相當浩大的工程,所牽扯的層面多且復雜,要從目前的2G邁向3G不可能
一下就銜接得上,因此出現了介于2G和3G之間的2.5G.HSCSD、WAP 、EDGE、藍牙
(Bluetooth )、EPOC等技術都是2.5G技術。

??? HSCSD (高速電路交換數據服務)

??? 這是GSM 網絡的升級版本,HSCSD (HighSpeedCircuitSwitchedData)能夠
透過多重時分同時進行傳輸,而不是只有單一時分而已,因此能夠將傳輸速度大
幅提升到平常的二至三倍。目前新加坡M1與新加坡電訊的移動電話都采用HSCSD
系統,其傳輸速度能夠達到57.6kbps.

??? WAP (無線應用通訊協議)

??? WAP (WirelessApplicationProtocol )是移動通信與互聯網結合的第一階
段性產物。這項技術讓使用者可以用手機之類的無線裝置上網,透過小型屏幕遨
游在各個網站之間。而這些網站也必須以WML (無線標記語言)編寫,相當于國
際互聯網上的HTML(超文件標記語言)。

??? Bluetooth (藍牙)

??? 藍牙是一種短距的無線通訊技術,電子裝置彼此可以透過藍牙而連接起來,
傳統的電線在這里就毫無用武之地了。透過芯片上的無線接收器,配有藍牙技術
的電子產品能夠在十公尺的距離內彼此相通,傳輸速度可以達到每秒鐘1 兆字節(jié)。
以往紅外線接口的傳輸技術需要電子裝置在視線之內的距離,而現在有了藍牙技
術,這樣的麻煩也可以免除了。

??? 3G何時到來

??? 日本移動通訊巨人NTTDoCoMo 已于10月1 日開通全球第一個3G服務,該服務
基于WCDMA 標準。

??? 目前,亞洲成為3G發(fā)展最快的地區(qū),歐洲緊隨其次,美國由于不太熱心而在
技術準備上遠遠落后。除了動作最快的日本和韓國,泰國、香港也已經發(fā)出3G牌
照。臺灣即將發(fā)放3G牌照,預計內地在年底前發(fā)出3G牌照,市場預期將發(fā)行兩到
三個牌照



Hilly 2006-07-29 08:57 發(fā)表評論
]]>
什么是數據倉庫(轉)http://m.tkk7.com/web/archive/2006/07/24/database_warehouse.htmlHillyHillyMon, 24 Jul 2006 06:01:00 GMThttp://m.tkk7.com/web/archive/2006/07/24/database_warehouse.htmlhttp://m.tkk7.com/web/comments/59792.htmlhttp://m.tkk7.com/web/archive/2006/07/24/database_warehouse.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59792.htmlhttp://m.tkk7.com/web/services/trackbacks/59792.html

什么是數據倉庫


(轉載自北大高科網站,http://www.pku-ht.com/)

????目前,數據倉庫一詞尚沒有一個統一的定義,著名的數據倉庫專家W.H.Inmon在其著作《Building the Data Warehouse》一書中給予如下描述:數據倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、集成的(Integrate)、相對穩(wěn)定的(Non-Volatile)、反映歷史變化(Time Variant)的數據集合,用于支持管理決策。對于數據倉庫的概念我們可以從兩個層次予以理解,首先,數據倉庫用于支持決策,面向分析型數據處理,它不同于企業(yè)現有的操作型數據庫;其次,數據倉庫是對多個異構的數據源有效集成,集成后按照主題進行了重組,并包含歷史數據,而且存放在數據倉庫中的數據一般不再修改。

????根據數據倉庫概念的含義,數據倉庫擁有以下四個特點:
?????1、面向主題。操作型數據庫的數據組織面向事務處理任務,各個業(yè)務系統之間各自分離,而數據倉庫中的數據是按照一定的主題域進行組織。主題是一個抽象的概念,是指用戶使用數據倉庫進行決策時所關心的重點方面,一個主題通常與多個操作型信息系統相關。

?????2、集成的。面向事務處理的操作型數據庫通常與某些特定的應用相關,數據庫之間相互獨立,并且往往是異構的。而數據倉庫中的數據是在對原有分散的數據庫數據抽取、清理的基礎上經過系統加工、匯總和整理得到的,必須消除源數據中的不一致性,以保證數據倉庫內的信息是關于整個企業(yè)的一致的全局信息。

?????3、相對穩(wěn)定的。操作型數據庫中的數據通常實時更新,數據根據需要及時發(fā)生變化。數據倉庫的數據主要供企業(yè)決策分析之用,所涉及的數據操作主要是數據查詢,一旦某個數據進入數據倉庫以后,一般情況下將被長期保留,也就是數據倉庫中一般有大量的查詢操作,但修改和刪除操作很少,通常只需要定期的加載、刷新。

?????4、反映歷史變化。操作型數據庫主要關心當前某一個時間段內的數據,而數據倉庫中的數據通常包含歷史信息,系統記錄了企業(yè)從過去某一時點(如開始應用數據倉庫的時點)到目前的各個階段的信息,通過這些信息,可以對企業(yè)的發(fā)展歷程和未來趨勢做出定量分析和預測。
企業(yè)數據倉庫的建設,是以現有企業(yè)業(yè)務系統和大量業(yè)務數據的積累為基礎。數據倉庫不是靜態(tài)的概念,只有把信息及時交給需要這些信息的使用者,供他們做出改善其業(yè)務經營的決策,信息才能發(fā)揮作用,信息才有意義。而把信息加以整理歸納和重組,并及時提供給相應的管理決策人員,是數據倉庫的根本任務。因此,從產業(yè)界的角度看,數據倉庫建設是一個工程,是一個過程。
整個數據倉庫系統是一個包含四個層次的體系結構,具體由下圖表示。


數據倉庫系統體系結構

·數據源:是數據倉庫系統的基礎,是整個系統的數據源泉。通常包括企業(yè)內部信息和外部信息。內部信息包括存放于RDBMS中的各種業(yè)務處理數據和各類文檔數據。外部信息包括各類法律法規(guī)、市場信息和競爭對手的信息等等;

·數據的存儲與管理:是整個數據倉庫系統的核心。數據倉庫的真正關鍵是數據的存儲和管理。數據倉庫的組織管理方式決定了它有別于傳統數據庫,同時也決定了其對外部數據的表現形式。要決定采用什么產品和技術來建立數據倉庫的核心,則需要從數據倉庫的技術特點著手分析。針對現有各業(yè)務系統的數據,進行抽取、清理,并有效集成,按照主題進行組織。數據倉庫按照數據的覆蓋范圍可以分為企業(yè)級數據倉庫和部門級數據倉庫(通常稱為數據集市)。

·OLAP服務器:對分析需要的數據進行有效集成,按多維模型予以組織,以便進行多角度、多層次的分析,并發(fā)現趨勢。其具體實現可以分為:ROLAP、MOLAP和HOLAP。ROLAP基本數據和聚合數據均存放在RDBMS之中;MOLAP基本數據和聚合數據均存放于多維數據庫中;HOLAP基本數據存放于RDBMS之中,聚合數據存放于多維數據庫中。

·前端工具:主要包括各種報表工具、查詢工具、數據分析工具、數據挖掘工具以及各種基于數據倉庫或數據集市的應用開發(fā)工具。其中數據分析工具主要針對OLAP服務器,報表工具、數據挖掘工具主要針對數據倉庫。


Hilly 2006-07-24 14:01 發(fā)表評論
]]>
官方Class LookupDispatchAction說明文檔(轉)http://m.tkk7.com/web/archive/2006/07/20/Class_LookupDispatchAction_HTMLHelp.htmlHillyHillyThu, 20 Jul 2006 10:18:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/Class_LookupDispatchAction_HTMLHelp.htmlhttp://m.tkk7.com/web/comments/59275.htmlhttp://m.tkk7.com/web/archive/2006/07/20/Class_LookupDispatchAction_HTMLHelp.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59275.htmlhttp://m.tkk7.com/web/services/trackbacks/59275.html
?PREV CLASS? ?NEXT CLASS FRAMES ? ?NO FRAMES ? ? All ClassesAll Classes SUMMARY:?NESTED?|?FIELD?|?CONSTR?|?METHOD DETAIL:?FIELD?|?CONSTR?|?METHOD

org.apache.struts.actions

Class LookupDispatchAction



java.lang.Object extended byorg.apache.struts.action.Actionextended byorg.apache.struts.actions.DispatchActionextended byorg.apache.struts.actions.LookupDispatchAction

public abstract class LookupDispatchAction
extends DispatchAction


An abstract Action that dispatches to the subclass mapped execute method. This is useful in cases where an HTML form has multiple submit buttons with the same name. The button name is specified by the parameter property of the corresponding ActionMapping. To configure the use of this action in your struts-config.xml file, create an entry like this:

   <action path="/test"
??????type="org.example.MyAction"
??????name="MyForm"
??????scope="request"
??????input="/test.jsp"
??????parameter="method"/>

which will use the value of the request parameter named "method" to locate the corresponding key in ApplicationResources. For example, you might have the following ApplicationResources.properties:

    button.add=Add Record    button.delete=Delete Record  

And your JSP would have the following format for submit buttons:

   <html:form action="/test">
???<html:submit property="method">
??? <bean:message key="button.add"/>
</html:submit>
<html:submit property="method">
???<bean:message key="button.delete"/>
</html:submit> </html:form>

Your subclass must implement both getKeyMethodMap and the methods defined in the map. An example of such implementations are:

  protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.add", "add");
map.put("button.delete", "delete");
return map;
}
public ActionForward add(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
// do add
return mapping.findForward("success");
}
public ActionForward delete(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
// do delete
return mapping.findForward("success");
}

Notes - If duplicate values exist for the keys returned by getKeys,
only the first one found will be returned. If no corresponding key is found
then an exception will be thrown. You can override the method unspecified to
provide a custom handler. If the submit was cancelled (a html:cancel button
was pressed), the custom handler cancelled will be used instead.


Field Summary
protected ?java.util.MapkeyMethodMap
??????????Resource key to method name lookup.
protected ?java.util.MaplocaleMap
??????????Reverse lookup map from resource value to resource key.
?
Fields inherited from class org.apache.struts.actions.DispatchAction
clazz, log, messages, methods, types
?
Fields inherited from class org.apache.struts.action.Action
defaultLocale, servlet
?
Constructor Summary
LookupDispatchAction()
???????????
?
Method Summary
?ActionForwardexecute(ActionMapping?mapping, ActionForm?form, javax.servlet.http.HttpServletRequest?request, javax.servlet.http.HttpServletResponse?response)
??????????Process the specified HTTP request, and create the corresponding HTTP response (or forward to another web component that will create it).
protected abstract ?java.util.MapgetKeyMethodMap()
??????????Provides the mapping from resource key to method name.
protected ?java.lang.StringgetLookupMapName(javax.servlet.http.HttpServletRequest?request, java.lang.String?keyName, ActionMapping?mapping)
??????????Lookup the method name corresponding to the client request's locale.
protected ?java.lang.StringgetMethodName(ActionMapping?mapping, ActionForm?form, javax.servlet.http.HttpServletRequest?request, javax.servlet.http.HttpServletResponse?response, java.lang.String?parameter)
??????????Returns the method name, given a parameter's value.
private ?java.util.MapinitLookupMap(javax.servlet.http.HttpServletRequest?request, java.util.Locale?userLocale)
??????????This is the first time this Locale is used so build the reverse lookup Map.
?
Methods inherited from class org.apache.struts.actions.DispatchAction
cancelled, dispatchMethod, getMethod, unspecified
?
Methods inherited from class org.apache.struts.action.Action
addErrors, addMessages, execute, generateToken, getDataSource, getDataSource, getErrors, getLocale, getMessages, getResources, getResources, getServlet, isCancelled, isTokenValid, isTokenValid, resetToken, saveErrors, saveErrors, saveMessages, saveMessages, saveToken, setLocale, setServlet
?
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
?

Field Detail

localeMap

protected java.util.Map localeMap
Reverse lookup map from resource value to resource key.


keyMethodMap

protected java.util.Map keyMethodMap
Resource key to method name lookup.

Constructor Detail

LookupDispatchAction

public LookupDispatchAction()
Method Detail

execute

public ActionForwardexecute(ActionMapping?mapping,
ActionForm?form,
javax.servlet.http.HttpServletRequest?request,
javax.servlet.http.HttpServletResponse?response)
throws java.lang.Exception
Process the specified HTTP request, and create the corresponding HTTP
response (or forward to another web component that will create it).
Return an ActionForward instance describing where and how control should
be forwarded, or null if the response has already been completed.

Overrides:
execute in class DispatchAction
Parameters:
mapping - The ActionMapping used to select this instance
request - The HTTP request we are processing
response - The HTTP response we are creating
form - The optional ActionForm bean for this request (if any)
Returns:
Describes where and how control should be forwarded.
Throws:
java.lang.Exception - if an error occurs

initLookupMap

private java.util.Map initLookupMap(
?????????????????????????????????javax.servlet.http.HttpServletRequest?request,
java.util.Locale?userLocale)
This is the first time this Locale is used so build the reverse lookup Map.
Search for message keys in all configured MessageResources for the current
module.


getKeyMethodMap

protected abstract java.util.Map getKeyMethodMap()
Provides the mapping from resource key to method name.

Returns:
Resource key / method name map.

getLookupMapName

protected java.lang.String getLookupMapName(
????????????????????????javax.servlet.http.HttpServletRequest?request,
java.lang.String?keyName,
ActionMapping?mapping)
throws javax.servlet.ServletException
Lookup the method name corresponding to the client request's locale.

Parameters:
request - The HTTP request we are processing
keyName - The parameter name to use as the properties key
mapping - The ActionMapping used to select this instance
Returns:
The method's localized name.
Throws:
javax.servlet.ServletException - if keyName cannot be resolved
Since:
Struts 1.2.0

getMethodName

protected java.lang.String getMethodName(ActionMapping?mapping,
ActionForm?form,
javax.servlet.http.HttpServletRequest?request,
javax.servlet.http.HttpServletResponse?response,
java.lang.String?parameter)
throws java.lang.Exception
Returns the method name, given a parameter's value.

Overrides:
getMethodName in class DispatchAction
Parameters:
mapping - The ActionMapping used to select this instance
form - The optional ActionForm bean for this request (if any)
request - The HTTP request we are processing
response - The HTTP response we are creating
parameter - The ActionMapping parameter's name
Returns:
The method's name.
Throws:
java.lang.Exception
Since:
Struts 1.2.0


Copyright ? 2000-2004 - The Apache Software Foundation




Hilly 2006-07-20 18:18 發(fā)表評論
]]>
LookupDispatchAction使用示例(中文)(轉)http://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction_zh.htmlHillyHillyThu, 20 Jul 2006 10:04:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction_zh.htmlhttp://m.tkk7.com/web/comments/59264.htmlhttp://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction_zh.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59264.htmlhttp://m.tkk7.com/web/services/trackbacks/59264.html
直接以實例來說明,在繼承LookupDispatchAction之後,您要重新定義getKeyMethodMap()方法,并定義好自己的相關處理方法,例如:
  • EditAction.java
package onlyfun.caterpillar;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;

public class EditAction extends LookupDispatchAction {
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("button.save", "save");
map.put("button.preview", "preview");
map.put("button.reset", "reset");
return map;
}

public ActionForward save(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}

public ActionForward preview(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}

public ActionForward reset(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ......
}
}

假設訊息資源檔中包括以下的訊息:
  • messages.properties
button.save=Save
button.preview=Preview
button.reset=Reset

為了要使用LookupDispatchAction,在struts-config.xml中定義請求參數中該有的名稱:
  • struts-config.xml
...
<action path="/edit"
type="onlyfun.caterpillar.EditAction"
parameter="method"
name="editForm"/>
...

現在假設您的表單頁面包括以下的內容:
...
?<form name="editForm" method="post"
?????? action="/strutsapp/edit.do">
??? .....
??? <input type="submit" name="method" value="Save"/>
??? <input type="submit" name="method" value="Preview"/>
??? <input type="submit" name="method" value="Reset"/>
?</form>
...

當您按下任一個按鈕時,請求參數中會包括method=Save或是method=Preview或是method= Reset,假設是method=Save好了,LookupDispatchAction會根據它作為value,在訊息資訊檔找到對應的key,然後 根據key與getKeyMethodMap()得知要執(zhí)行的方法為save()方法。

那么關於國際化訊息管理的部份呢?例如想要在表單按鈕上使用中文?
?...
?<form name="editForm" method="post"
?????? action="/strutsapp/edit.do">
??? .....
??? <input type="submit" name="method" value="存檔"/>
??? <input type="submit" name="method" value="預覽"/>
??? <input type="submit" name="method" value="重設"/>
?</form>
...

一樣的,您的訊息檔案中必須包括下面的內容:
  • messages.properties
button.save=存檔
button.preview=預覽
button.reset=重設

然後,您要使用native2ascii將訊息檔案轉換為Unicode編碼,例如:
native2ascii messages_zh_TW.txt messages_zh_TW.properties

接下來的問題是,瀏覽器發(fā)送過來的中文參數,為了要能正確的解析,要使用request的 setCharacterEncoding("Big5"),這樣才能得到正確的中文參數,但是在什么地方作這個動作?您可以在Servlet Filter中作這件事,另一個可能的地方則是 ActionForm 的reset()方法中,例如:
package onlyfun.caterpillar;

public class UserForm extends ActionForm {
???? ......

??? public void reset(ActionMapping mapping,
???????????????????? HttpServletRequest request) {
??????? try {
??????????? request.setCharacterEncoding("Big5");
??????????? .......
??????? }
??????? catch(Exception e) {
??????????? ....
??????? }
?? }
}
?

這樣您的按鈕就可以使用中文訊息了。

如果您愿意的話,可以搭配使用 <bean:message> 來使用上述的功能,直接由標簽來管理訊息檔案中的訊息。



Hilly 2006-07-20 18:04 發(fā)表評論
]]>
LookupDispatchAction使用示例http://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction.htmlHillyHillyThu, 20 Jul 2006 10:01:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction.htmlhttp://m.tkk7.com/web/comments/59263.htmlhttp://m.tkk7.com/web/archive/2006/07/20/LookupDispatchAction.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59263.htmlhttp://m.tkk7.com/web/services/trackbacks/59263.htmlLookupDispatchAction

public abstract class LookupDispatchAction
extends DispatchAction

An abstract Action that dispatches to the subclass mapped execute method. This is useful in cases where an HTML form has multiple submit buttons with the same name. The button name is specified by the parameter property of the corresponding ActionMapping. To configure the use of this action in your struts-config.xml file, create an entry like this:

   <action path="/test"
           type="org.example.MyAction"
           name="MyForm"
          scope="request"
          input="/test.jsp"
      parameter="method"/>
 

which will use the value of the request parameter named "method" to locate the corresponding key in ApplicationResources. For example, you might have the following ApplicationResources.properties:

    button.add=Add Record
    button.delete=Delete Record
  

And your JSP would have the following format for submit buttons:

   <html:form action="/test">
    <html:submit property="method">
      <bean:message key="button.add"/>
    </html:submit>
    <html:submit property="method">
      <bean:message key="button.delete"/>
    </html:submit>
  </html:form>
  

Your subclass must implement both getKeyMethodMap and the methods defined in the map. An example of such implementations are:

  protected Map getKeyMethodMap() {
      Map map = new HashMap();
      map.put("button.add", "add");
      map.put("button.delete", "delete");
      return map;
  }

  public ActionForward add(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response)
          throws IOException, ServletException {
      // do add
      return mapping.findForward("success");
  }

  public ActionForward delete(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response)
          throws IOException, ServletException {
      // do delete
      return mapping.findForward("success");
  }
  

Notes - If duplicate values exist for the keys returned by getKeys, only the first one found will be returned. If no corresponding key is found then an exception will be thrown. You can override the method unspecified to provide a custom handler. If the submit was cancelled (a html:cancel button was pressed), the custom handler cancelled will be used instead.

?



Hilly 2006-07-20 18:01 發(fā)表評論
]]>
struts七點經驗-2(轉)http://m.tkk7.com/web/archive/2006/07/20/experience7_2_struts.htmlHillyHillyThu, 20 Jul 2006 09:25:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/experience7_2_struts.htmlhttp://m.tkk7.com/web/comments/59247.htmlhttp://m.tkk7.com/web/archive/2006/07/20/experience7_2_struts.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59247.htmlhttp://m.tkk7.com/web/services/trackbacks/59247.html 3. 使用應用模塊(Application Modules)

  Struts 1.1的一個新特性是應用模塊的概念。應用模塊允許將單個Struts應用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)允許多個配置文件而不是單個配置文件。

  注:在早期的beta版本中,該特性被稱為子應用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

  顯然,當很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很容易引起資源沖突。應用模塊允許Struts按照功能要求進行劃分,許多情況已經證明這樣更貼近實際。例如,假設我們要開發(fā)一個典型的商店應用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很容易定位,有助于開發(fā)和部署。圖1 顯示了該應用的目錄結構。


圖 1. 一個典型的商店應用程序的目錄結構

  注:如果你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應用模塊。這就使得應用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應用程序會自動作為缺省的應用模塊。

  為了使用多應用模塊功能,必須執(zhí)行以下幾個準備步驟:

  · 為每個應用模塊創(chuàng)建獨立的Struts配置文件。

  · 配置Web 部署描述符 Web.xml文件。

  · 使用org.apache.struts.actions.SwitchAction 來實現程序在模塊之間的跳轉.

  創(chuàng)建獨立的Struts配置文件

  每個Struts應用模塊必須擁有自己的配置文件。允許創(chuàng)建自己的獨立于其他模塊的Action,ActionForm,異常處理甚至更多。

  繼續(xù)以上面的商店應用程序為例,我們可以創(chuàng)建以下的配置文件:一個文件名為struts-config-catalog.xml,包含catalog(商品目錄)、items(商品清單)、和其它與庫存相關的功能的配置信息;另一個文件名為struts- config-order.xml, 包含對order(訂單)和order tracking(訂單跟蹤)的設置。第三個配置文件是struts-config.xml,其中含有屬于缺省的應用模塊中的一般性的功能。

  配置Web部署描述符

  在Struts的早期版本中,我們在Web.xml中指定Struts配置文件的路徑。好在這點沒變,有助于向后兼容。但對于多個應用模塊,我們需要在Web部署描述符中增加新的配置文件的設定。

  對于缺省的應用(包括Struts的早期版本),Struts framework 在Web.xml文件中查找?guī)в衏onfig的元素,用于載入Action mapping 和其它的應用程序設定。作為例子,以下的XML片斷展現一個典型的元素:


  注:如果在現有的元素中找不到"config"關鍵字,Struts framework將缺省地使用/WEB/struts-config.xml

  為了支持多個應用模塊(Struts 1.1的新特性),必須增加附加的元素。與缺省的元素不同的是,附加的元素與每個應用模塊對應,必須以config/xxx的形式命名,其中字符串xxx代表該模塊唯一的名字。例如,在商店應用程序的例子中,元素可定義如下(注意粗體字部分):



  第一個 元素對應缺省的應用模塊。第二和第三個元素分別代表非缺省應用模塊catalog 和 order。

  當Struts載入應用程序時,它首先載入缺省應用模塊的配置文件。然后查找?guī)в凶址甤onfig/xxx 形式的附加的初始化參數。對每個附加的配置文件也進行解析并載入內存。這一步完成后,用戶就可以很隨意地用config/后面的字符串也就是名字來調用相應的應用模塊。

  多個應用模塊之間調用Action類

  在為每個應用模塊創(chuàng)建獨立的配置文件之后,我們就有可能需要調用不同的模塊中Action。為此必須使用Struts框架提供的SwitchAction類。Struts 會自動將應用模塊的名字添加到URL,就如Struts 自動添加應用程序的名字加到URL一樣。應用模塊是對框架的一個新的擴充,有助于進行并行的團隊開發(fā)。如果你的團隊很小那就沒必要用到這個特性,不必進行模塊化。當然,就算是只有一個模塊,系統還是一樣的運作。

  4. 把JSP放到WEB-INF后以保護JSP源代碼

  為了更好地保護你的JSP避免未經授權的訪問和窺視, 一個好辦法是將頁面文件存放在Web應用的WEB-INF目錄下。

  通常JSP開發(fā)人員會把他們的頁面文件存放在Web應用相應的子目錄下。一個典型的商店應用程序的目錄結構如圖2所示。跟catalog (商品目錄)相關的JSP被保存在catalog子目錄下。跟customer相關的JSP,跟訂單相關的JSP等都按照這種方法存放。


圖 2.基于不同的功能 JSP 被放置在不同的目錄下

  這種方法的問題是這些頁面文件容易被偷看到源代碼,或被直接調用。某些場合下這可能不是個大問題,可是在特定情形中卻可能構成安全隱患。用戶可以繞過Struts的controller直接調用JSP同樣也是個問題。
為了減少風險,可以把這些頁面文件移到WEB-INF 目錄下。基于Servlet的聲明,WEB-INF不作為Web應用的公共文檔樹的一部分。因此,WEB-INF 目錄下的資源不是為客戶直接服務的。我們仍然可以使用WEB-INF目錄下的JSP頁面來提供視圖給客戶,客戶卻不能直接請求訪問JSP。

  采用前面的例子,圖3顯示將JSP頁面移到WEB-INF 目錄下后的目錄結構


圖 3. JSP存放在 WEB-INF 目錄下更為安全

  如果把這些JSP頁面文件移到WEB-INF 目錄下,在調用頁面的時候就必須把"WEB-INF"添加到URL中。例如,在一個Struts配置文件中為一個logoff action寫一個Action mapping。其中JSP的路徑必須以"WEB-INF"開頭。如下所示:請注意粗體部分.

  這個方法在任何情況下都不失為Struts實踐中的一個好方法。是唯一要注意的技巧是你必須把JSP和一個Struts action聯系起來。即使該Action只是一個很基本的很簡單JSP,也總是要調用一個Action,再由它調用JSP。

  最后要說明的是,并不是所有的容器都能支持這個特性。WebLogic早期的版本不能解釋Servlet聲明,因此無法提供支持,據報道在新版本中已經改進了。總之使用之前先檢查一下你的Servlet容器。



Hilly 2006-07-20 17:25 發(fā)表評論
]]>
struts的七點經驗-1(轉)http://m.tkk7.com/web/archive/2006/07/20/experience7_1_struts.htmlHillyHillyThu, 20 Jul 2006 09:20:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/experience7_1_struts.htmlhttp://m.tkk7.com/web/comments/59240.htmlhttp://m.tkk7.com/web/archive/2006/07/20/experience7_1_struts.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59240.htmlhttp://m.tkk7.com/web/services/trackbacks/59240.html 1. 只在必要的時候才考慮擴展Struts框架

  一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預見的需求。為此 Struts為Web 應用提供了一個通用的架構,這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務問題上。其次,一個好的framework還必須能夠在適當的地方提供擴展接口,以便應用程序能擴展該框架來更好的適應使用者的實際需要。

  如果Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應用需求是框架的開發(fā)者們無法預見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調整struts來更好的符合他們的特殊要求。

  在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

  其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設計的。例如,在異常處理機制中就允許用戶定制異常處理的句柄,以便更好的對應用系統發(fā)生的錯誤做出響應。

  作為框架的這種可調整特性在它更適合你的應用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應用是基于一個現有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現的錯誤數量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎框架的代碼了。

  然而, 實現更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構成的,它們已經提供了很多已經實現的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現有的功能來實現。 在決定編寫擴展代碼前務必要確認Struts的確沒有實現你要的功能。否則重復的功能會導致混亂將來還得花費額外的精力清除它。

  2. 使用異常處理聲明

  要定義應用程序的邏輯流程,成熟的經驗是推薦在代碼之外,用配置的方法來實現,而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現EJB的安全性和事務性行為到描述JMS消息和目的地之間的關系,很多運行時的處理流程都是可以在程序之外定義的。

  Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應用系統運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內置的一個稱為 ExceptionHandler 的類, 用于系統缺省處理action類運行中產生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。

  Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當的范圍(scope)對象中。這樣就允許JSP頁面使用錯誤類來提醒用戶出現什么問題。如果你認為這不能滿足你的需求,那么可以很方便的實現你自己的ExcepionHandler類。

  具體定制異常處理的方法和機制

  要定制自己的異常處理機制,第一步是繼承org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:


  正如你看到的,該方法有好幾個參數,其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結束后將controller類帶到請求必須轉發(fā)的地方去。

  當然您可以實現任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

  一旦你創(chuàng)建了自己的ExceptionHandler 類,就應該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.

  可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。如果是用于Action Mapping特定的部分就在元素中配置。如果想讓這個類可用于所有的Action對象,可以在 元素中指定。例如,假設我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, 元素定義如下所示:


  在元素中可以對很多屬性進行設置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼承了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當然,其他的屬性也很重要,但如果想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

  最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的XML片斷解釋了如何配置以實現這一點。


  在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,如果沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現匹配的為止。因此,我們可以定義一個層次型的異常處理關系結構,在配置文件中已經體現了這一點。


Hilly 2006-07-20 17:20 發(fā)表評論
]]>
[Struts]應用Map作為ActionForm的屬性,動態(tài)增加ActionForm的“屬性” (轉)http://m.tkk7.com/web/archive/2006/07/20/struts_actionform.htmlHillyHillyThu, 20 Jul 2006 09:17:00 GMThttp://m.tkk7.com/web/archive/2006/07/20/struts_actionform.htmlhttp://m.tkk7.com/web/comments/59239.htmlhttp://m.tkk7.com/web/archive/2006/07/20/struts_actionform.html#Feedback0http://m.tkk7.com/web/comments/commentRss/59239.htmlhttp://m.tkk7.com/web/services/trackbacks/59239.html [Struts]應用Map作為ActionForm的屬性,動態(tài)增加ActionForm的“屬性” 通常情況下,我們要在ActionForm中為相應表單定義對應的私有屬性,再通過Getter和Setter設置和獲得表單的數據。

但如果表單數據域比較多,那么就需要在ActionForm中為每個表單域定義一個私有屬性并定義相應的Getter、Setter方法。

解決方法有兩種,一種是在ActionForm中定義一個Map私有屬性,動態(tài)產生表單提交的數據域;另一種是使用DynaActionForm。

這里,我想以一個例子介紹一下第一種方法。

首先創(chuàng)建ActionForm類:TestForm
?1package?form;
?2
?3import?org.apache.struts.action.ActionForm;
?4import?java.util.HashMap;
?5
?6public?class?TestForm?extends?ActionForm?{
?7??private?HashMap<String,Object>?map?=?new?HashMap<String,Object>();
?8
?9??public?Object?getValue(String?key)?{
10????return?map.get(key);
11??}

12
13??public?void?setValue(String?key,Object?value)?{
14????map.put(key,value);
15??}

16
17}

請注意第7行,這里定義了一個私有變量,該變量是一個Map類。
第9、13行分別定義了Getter和Setter方法,這里,Getter方法需要一個參數,用于傳遞表單域(即動態(tài)屬性)的名稱,Setter方法需要兩個參數,分別是表單域名稱和對應的值,這和傳統的ActionForm的Getter和Setter有很大分別。

然后創(chuàng)建Action類:TestAction

?1package?action;
?2
?3import?org.apache.struts.action.Action;
?4import?org.apache.struts.action.ActionMapping;
?5import?org.apache.struts.action.ActionForm;
?6import?org.apache.struts.action.ActionForward;
?7import?java.util.HashMap;
?8import?javax.servlet.http.*;
?9
10public?class?TestAction?extends?Action?{
11??public?ActionForward?execute(ActionMapping?mapping,ActionForm?form,HttpServletRequest?request,HttpServletResponse?response)?throws?Exception?{
12????return?mapping.findForward("success");
13??}

14}

第8行,鑒于這是一個例子為了簡便起見使用了“*”代替了具體的類,編寫程序時還是需要培養(yǎng)良好的習慣引入相應的類,避免出現沖突。
這個類很簡單,只是把請求傳遞到一個在Struts中命名為“success”的forward對應的頁面,具體請看下面列出的struts-config.xml當中的配置。

然后是輸入表單的JSP頁面:input.jsp

1<%@?taglib?uri="/tags/struts-html"?prefix="html"?%>
2
3<html:form?action="/Test.do"?method="post">
4???<html:text?property="value(a)"/>
5???<html:text?property="value(b)"/>
6???<html:submit>Submit</html:submit>
7</html:form>


第1行引入了Struts的html標簽庫
請注意第4、5行,如果使用傳統的ActionForm,property的值應該與ActionForm里面的一個私有屬性的名稱對應,但在這里,請回憶上述ActionForm中的Getter和Setter方法,分別帶有一個參數和兩個參數,這里的property會通過反射機制自動調用Setter方法,“value(a)”中的“value”就是ActionForm中Map的名稱,而括號當中的“a”,就是我們動態(tài)產生的表單域的名稱,它對應Getter方法中的第一個參數“key”,而用戶在表單輸入的值就對應Setter方法中的第二個參數“value”。

這里,我們分別動態(tài)創(chuàng)建了兩個名為“a”和“b”的表單域,存放到Map中。

然后,我們看看success.jsp即Action轉發(fā)到的頁面

1<%@?taglib?uri="/tags/struts-bean"?prefix="bean"?%>
2
3<bean:write?name="test"?property="value(a)"/>
4<bean:write?name="test"?property="value(b)"/>


第1行引入了Struts的bean標簽庫。
請注意第2行,引用了名為“test”的ActionForm(詳細設置請看struts-config.xml)。這標簽的作用是顯示輸出ActionForm的指定屬性值。請注意property,“value”就是ActionForm中Map的名稱,它通過反射機制自動調用ActionForm的Getter方法,請回憶上述ActionForm中的Getter方法,帶有一個參數“key”,這里的“a”,“b”實際上是對應剛才輸入頁面動態(tài)產生的兩個表單域屬性名。這里實際是要顯示名為“test”的ActionForm的名為“value”的Map類屬性中的“key”分別為“a”和“b”的對應的“value”。

通過這樣的設計,我們就完成了動態(tài)產生表單域屬性的功能,這個設計的好處是你并不需要修改ActionForm,就能隨意設計你的表單域屬性,也大大減少了ActionForm的編碼量。

最后,讓我們來看看struts-config.xml中的相應配置(只列出相關配置片斷):

?

?1<struts-config>
?2??
?3??<form-beans>
?4????<form-bean?name="test"?type="form.TestForm"/>
?5??</form-beans>
?6??
?7??<action-mappings>
?8?????<action?name="test"?path="/Test"?type="action.TestAction">
?9????????<forward?name="success"?path="/pages/success.jsp"/>
10??????</action>
11???</action-mappings>
12???
13</struts-config>

?



Hilly 2006-07-20 17:17 發(fā)表評論
]]>
標簽示例http://m.tkk7.com/web/archive/2006/07/18/taglib_example.htmlHillyHillyTue, 18 Jul 2006 05:18:00 GMThttp://m.tkk7.com/web/archive/2006/07/18/taglib_example.htmlhttp://m.tkk7.com/web/comments/58728.htmlhttp://m.tkk7.com/web/archive/2006/07/18/taglib_example.html#Feedback0http://m.tkk7.com/web/comments/commentRss/58728.htmlhttp://m.tkk7.com/web/services/trackbacks/58728.html //web.xml
<?xml?version= "1.0"? encoding= "UTF-8" ?>
<!DOCTYPE?web-app?PUBLIC? "-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.3//EN"
?? "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
?? <resource-ref>
???? <res-ref-name>jdbc/address</res-ref-name>
???? <res-type>javax.sql.DataSource</res-type>
???? <res-auth>Container</res-auth>
?? </resource-ref>
</web-app>




<%@?taglib?prefix= "sql"? uri= "http://java.sun.com/jstl/sql"? %>
<%@?taglib?prefix= "c"? uri= "http://java.sun.com/jstl/core"? %>
< html >
<head>
<title>Presenting?database?content? using? tags</title>
<sql:setDataSource
?? dataSource= "jdbc/address"
?? var= "conn"
/>
</head>
< body >

<h1>Address?List</h1>
<sql:query?dataSource= "${conn}"? var= "addresses" >
???? SELECT?*?FROM?AddressList
</sql:query>
<table?width= "90%"? border= "1" >
<tr>
<!--?add?the?table?column?headings?-->
<c:forEach?var= "columnName"? items= "${addresses.columnNames}" >
?? <th>?<c:out?value= "${columnName}" />?</th>
</c:forEach>
</tr>
<!--?add?the?table?rows?from?the?result?set?-->
<c:forEach?var= "row"? items= "${addresses.rowsByIndex}" >
?? <tr>
???? <c:forEach?var= "column"? items= "${row}" >
?????? <td><c:out?value= "${column}" /></td>
???? </c:forEach>
?? </tr>
</c:forEach>
</table>
</ body >
</ html >

Hilly 2006-07-18 13:18 發(fā)表評論
]]>
struts標簽之淺入深出(轉)http://m.tkk7.com/web/archive/2006/07/18/struts_tag_lib.htmlHillyHillyTue, 18 Jul 2006 04:50:00 GMThttp://m.tkk7.com/web/archive/2006/07/18/struts_tag_lib.htmlhttp://m.tkk7.com/web/comments/58726.htmlhttp://m.tkk7.com/web/archive/2006/07/18/struts_tag_lib.html#Feedback0http://m.tkk7.com/web/comments/commentRss/58726.htmlhttp://m.tkk7.com/web/services/trackbacks/58726.html①畫面上有一text框,顯現內容為某一數據表中的某一字段.那我們該如何設置和得到此數據呢?
SampleJsp:
??<html:text?name?=?"sampleForm"?property="name"?/>
SampleForm.java:?//?form文件名必須和jsp中標簽的name對應
??String?name;?//?必須和jsp中該項目的property一樣
??public?String?getName()?{?return?name;?}
??public?void?setName(String?name)?{?this.name?=?name;}
變量和方法名,不可以順意.變量abcd,那方法名就是setAbcd和getAbcd.注意大小寫.
jsp中的項目必然全部在form里面有所表示,當然反過來,form里的項目在jsp中不一定全部表示(可能有輔助動作的對象或驗證)
SampleAction.java?
??public?ActionForward?start(ActionMapping?mapping,
??ActionForm?argForm,?HttpServletRequest?req,?HttpServletResponse?res)
??throws?Exception?{
????????SampleForm?form?=?(SampleForm)?argForm;
????????String?name?=?………………other?codes?for?get?name?from?db
????????//?set?name
????????form.setName(name);
????????//?now?text?will?show?the?name
??}
public?ActionForward?save(ActionMapping?mapping,
??ActionForm?argForm,?HttpServletRequest?req,?HttpServletResponse?res)
????????throws?Exception?{
????????SampleForm?form?=?(SampleForm)?argForm;
????????//?get?name
????????String?name?=?form.getName();
????????………………other?codes?for?save?name
??}
jsp和form對應,action操作form,form其實起了傳輸數據的作用.這就是struts標簽的核心原理.得到數據和設置數據沒問題了,剩下的工作也就得心應手了.

②再看一個處理標簽的方法.畫面上是一個明細一覽表示(表).表示的是數據表user的相關數據(id,name).
SampleJsp:?
??<logic:present?name="sampleForm"?property="userList"?>
????<logic:iterate?id="user"?name="?sampleForm?"?property="userList">
??????<tr>
????????<td><bean:write?name="user"?property="id"?/></td>
????????<td><bean:write?name="user"?property="name"?/></td>
??????</tr>
????</logic:iterate>?
??</logic:present>

logic:present是邏輯判斷,sampleForm中userList為空(無數據或null),下面的東東不顯示.
logic:iterate是邏輯循環(huán),userList有幾條數據,就循環(huán)幾次.

<bean:write?name="user"?property="id"?/>是lable標簽,顯示user這個對象(entity)的id屬性.或者說顯示數據表user中的一條記錄中的id這個列.
User.java(就是entity,因為和業(yè)務密切,高達不開發(fā),切記切記不可順意修改.遇到設計有問題,QA日本)
????String?id;
????public?String?getId()?{?return?id;?}
????public?void?setId(String?id)?{?this.id?=?id;?}
????String?name;
????public?String?getName?()?{?return?name;?}
????public?void?setName?(String?name)?{?this.name?=?name;?}
看到這,是否覺得面熟啊,好象和FORM一樣,但有點不一樣,不一樣在哪里,看下去后,自己感悟吧.
SampleForm.java:?
????List?userList;
????public?List?getUserList?()?{?return?userList;?}
????public?void?setUserList?(List?userList)?{?this.userList?=?userList;?}
form只要這些,那你會問,id和name,struts如何能得到呢?你不是說過jsp必須和form一樣對應嗎?不錯,一一對應是肯定的.?UserList信息已經包含了一切,還需要定義id和name嗎?至于struts如何得到數據,那就看下面的action是如何處理的吧.
SampleAction.java?
public?ActionForward?start(ActionMapping?mapping,
??ActionForm?argForm,?HttpServletRequest?req,?HttpServletResponse?res)
????????throws?Exception?{
????????SampleForm?form?=?(SampleForm)?argForm;
????????ArrayList?userList?=?new?ArrayList();
????????User?user?=?new?User();
????????user.setId(1);
????????user.setName(“name1”);
????????userList.add(user);

????????User?user?=?new?User();
????????user.setId(2);
????????user.setName(“name2”);?
????????userList.add(user);
????????
????????//?set?userList
????????form.setUserList(userList);
????????//?now?table?will?show
??}
一切搞定.是不是很簡單,但估計你還是有點暈.你還是想問我,id和name到底是如何設置的?
Action設置了userList就夠了,它包含夠多的信息了.?struts看見了你設置了userList.它就知道了這個list里面都user(entity),useruser(entity)里面不是有很多get,set方法嗎?

再看下下面的東東.
<logic:iterate?id="user"?name="?sampleForm?"?property="userList">
<bean:write?name="user"?property="id"?/>
id=”user”,和name="user"?對應了,明白啥意思嗎?.就象循環(huán)指明索引一樣.?property="id"就是要顯示的這個索引對應的內容.Struts就是這樣來認id和name的.

③接下來,看一個加強版的table例子,在顯示的明細一覽,每一行前面加一個radio框,讓用戶選擇哪個user.進行刪除操作.
SampleJsp:?
??<logic:present?name="sampleForm"?property="userList"?>
??<logic:iterate?id="user"?name="?sampleForm?"?property="userList">
??<tr>
????<td>
??<html:radio?name="sampleForm"?property="selectedUserId"?value="<%=((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user?")).getId().toString()?%>"?/>
???</td>
???<td><bean:write?name="user"?property="id"?/></td>
???<td><bean:write?name="user"?property="name"?/></td>
??</tr>
</logic:iterate>?
</logic:present>

sampleForm.java:
????String?selectedUserId;?
????public?String?getSelectedUserId?()?{?return?selectedUserId;?}
????public?void?setSelectedUserId(String?selectedUserId)?{
????????this.selectedUserId?=?selectedUserId;
????}
SampleAction.java?
public?ActionForward?delete(ActionMapping?mapping,
??ActionForm?argForm,?HttpServletRequest?req,?HttpServletResponse?res)
????????throws?Exception?{
????????SampleForm?form?=?(SampleForm)?argForm;
????????String?selectedUserId?=?form.getSelectedUserId();
????????//?get?user?by?selected?id
????????User?user?=?getUser(selectedUserId);
????????//?delete?user
????????}
radio框.?propertys值對應form里的對象.value值是該行radio對應的user中的id(數據表中user的id是主鍵),那么當用戶選中任何一個radio,struts通過form得到propertys值,就可以得到選中哪個user了,然后進行相應操作.
設置哪個user被選中,一是通過用戶選擇,沒的說.二,通過程序控制,如果進入初期畫面,我要讓user.id?=?‘3’的radio被選中,只要在初期Action中form.selectedUserId(“3”);一切搞定,就一句話,進入初期畫面時,?user.id?=?‘3’的radio被選中了.

注意以下標簽
<html:radio?name="sampleForm"?property="selectedUserId"?value="<%=?((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user?")).getId().toString()?%>"?/>
下面發(fā)揮想象一下以下標簽啥意思?
<html:radio?name="sampleForm"?property="selectedUserId"?value="<%=?((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user?")).getObject1().getObject1().getObject2()…………getObjectN().getId().toString()?%>"?/>
能看出來什么?
User包含object1,object2包含object3,….objectN-1包含objectN,objectN有id屬性.
看出來了嗎?靈活運用,想象一下,各個entity和form,action該如何寫?

④接著介紹一下,checkbox是使用.畫面有一排checkbox,如何設置和得到數據呢?先看一個簡單點的.?
?<html:checkbox?name="?sampleForm"?property="chechbox1"?value="true"?/>
?<html:checkbox?name="?sampleForm"?property="chechbox2"?value="false"?/>
?<html:checkbox?name="?sampleForm"?property="chechbox3"?value="true"?/>
第二個框未選中,其他選中.form里面對應三個String?chechbox1,chechbox2,?chechbox3;下面來個復雜點的,多選擇對話框multibox
SampleJsp中:
<logic:iterate?name?=?"sampleForm"?id="user"?property="userList">
??<html:multibox?property="selectedUsers">
????<bean:write?name="user"?property="id"/>?
??</html:multibox>
??<bean:write?name="user"?property="name"/>?
</logic:iterate>

SampleForm中:
????private?String?userList[]?=?new?String[0];?
????public?String[]?getUserList?()?{?return?userList;}
????public?void?setUserList(String[]userList)?{this.userList?=?userList;}

????private?String?selectedUsers[]?=?new?String[0];
????public?String[]?getSelectedUsers?()?{return?selectedUsers;}
????public?void?setSelectedUsers?(String[]selectedUsers)?{this.selectedUsers?=?selectedUsers;}

如果我們在初期時在action里對bean賦值:
userList?=?{?User(”1”,”name1”),?User(”2”,?”name2”),?User(”3”,”name3”)?}
selectedUsers?=?{“1”,”3”}
那畫面選中第一第三個選擇框.

用戶修改選擇框,選擇了第二,第三個,那么在action里取bean的值
String?selectedItems[]?=?new?String[list.getSize()];
selectedItems?=?form.getSelectedItems();
for?(?int?i?=?0?;?i?<?selectedItems.length?;?++i?){
??LOGGER.debug(?"selected?"?+?i?+?":?"?+?selectedItems[i]);
}
Selected?0?:?2?
Selected?1?:?3
selectedUsers?=?{“2”,”3”}

⑤畫面上有一user表,每條數據前面有個button,對應一條記錄,如何確定選中那條數據呢??
SampleJsp:
<logic:iterate?id="user"?indexId="buttonIndex"?name="sampleForm"?property="userList">
<tr>
<td>
<html:submit?property="button"?indexed='false'?>
<bean:message?key="label.button.selectUser"/>
</td>
<td><bean:write?name="user"?property="id"?/></td>
<td><bean:write?name="user"?property="name"?/></td>
</tr>
<html:hidden?name="sampleForm"?property="selectUserIndex"?value='<%=?""?+?buttonIndex?%>'/>
</logic:iterate>

SampleAction.java
???int?index?=?Integer.parseInt(form.getSelectUserIndex());
???通過一個隱藏變量,得到選中第幾條數據,然后就能做相應處理.

⑥上面都是通過form和jsp傳輸數據的.還有session也能讓jsp顯示數據.但如果我做為設計者,是不提倡這樣做的.為什么就不說了.但日本以前的設計很可能會用到session和jsp傳數據.那我就有必要講一下如何用了?做為高達的設計者還是盡量不要用session和jsp溝通.
有個下拉列表框,里面顯示所有用戶名稱.用session傳數據.
SampleJsp:
<%pageContext.setAttribute("userList",(List)?(FwThreadContext
????????????????.getAttribute("AllUser")));
%>
<html:select?property="selectedUser">?
??<html:options?collection="userList"?property="id"?labelProperty="name"?/>
</html:select>

SampleForm.java:
????String?selectedUser;
Form里只要一個selectedUser,表示選擇的user.?下拉列表框用session表示.
在action等地方設置了session的內容,那下拉列表框就能顯示內容了.這里session名為AllUser,?labelProperty="name"是下拉列表框顯示的東東,?property="id"是下拉列表框每條數據隱藏的東東.通過property="selectedUser"里得到選中那條數據

<html:text?name="sampleForm"?property="name"?
value="<%=?(FwThreadContext.getAttribute("UserName")).toString()?%>"?/>
這里很簡單就是把session名為UserName設置到Text框中.得的時候還是通過form中的name得到.


標簽寶典:
1,lable
<bean:write?name="sampleForm"?property="name"?/>
2,text
<html:text?name="sampleForm?"?property="name"?/>
3,button
<html:submit?property="button">
<bean:message?key="label.button.save"?/>
</html:submit>
<html:button?property="button"?onclick="javascript:openCalendar(date);">
<bean:message?key="label.button.date"?/>
</html:button>
4,select?
<html:select?property="selectedUser">?
??<html:options?name="sampleForm"?collection="userList"?property="id"?labelProperty="name"?/>
</html:select>
5,checkbox,multibox
??<html:checkbox?name="sampleForm"?property="chechbox1"?value="true"?/>
??
??<logic:iterate?name?=?"sampleForm"?id="user"?property="userList">
????<html:multibox?property="selectedUsers">
?????<bean:write?name="user"?property="id"/>?
????</html:multibox>
????<bean:write?name="user"?property="name"/>?
??</logic:iterate>

6,?循環(huán)邏輯
<logic:present?name="sampleForm"?property="userList"?>
<logic:iterate?id="user"?name="?sampleForm?"?property="userList">
<tr>
??<td>
??<html:radio?name="sampleForm"?property="selectedUserId"?value="<%=?((jp.co.mhcb.obs.persis.entity.User)pageContext.getAttribute("user?")).getId().toString()?%>"?/>
??</td>
??<td><bean:write?name="user"?property="id"?/></td>
??<td><bean:write?name="user"?property="name"?/></td>
</tr>
</logic:iterate>?
</logic:present>

7,if邏輯
<logic:equal?name="?sampleForm?"?property="showAllFlg"?value="true"?>
??<html:submit?property="button">
????<bean:message?key="label.button.all"/>
??</html:submit>
</logic:equal>
<logic:equal?name="?sampleForm?"?property="?showAllFlg?"?value="false"?>
??<html:submit?property="button">
????<bean:message?key="label.button.noall"/>
??</html:submit>
</logic:equal>

Hilly 2006-07-18 12:50 發(fā)表評論
]]>
JSTL語法及參數http://m.tkk7.com/web/archive/2006/07/13/JSTL_GrammarAndParameter.htmlHillyHillyThu, 13 Jul 2006 15:46:00 GMThttp://m.tkk7.com/web/archive/2006/07/13/JSTL_GrammarAndParameter.htmlhttp://m.tkk7.com/web/comments/58075.htmlhttp://m.tkk7.com/web/archive/2006/07/13/JSTL_GrammarAndParameter.html#Feedback0http://m.tkk7.com/web/comments/commentRss/58075.htmlhttp://m.tkk7.com/web/services/trackbacks/58075.html JSTL語法及參數

JSTL語法及參數
作者 胡祥春

JSTL語法及參數
JSTL包含以下的標簽:
常用的標簽:如<c:out>、<c:remove>、<c:catch>、<c:set>等
條件標簽:如<c:if><c:when>、<c:choose>、<c:otherwise>等
URL標簽:如<c:import>、<c:redirect>和<c:url>等
XML標簽:如<xml:out>等
國際化輸出標簽:如<fmt:timeZone>等
SQL標簽:如<sql:query>、<sql:update>、<sql:transaction>等


一般用途的標簽:
1.<c:out>
沒有Body時的語法
<c:out value=”value” [escapeXml=”{true|false}”] [default=”defaultValue”]/>
有Body時的語法
<c:out value=”value” [escapeXml=”{true|false}”]>
這里是Body部分
</c:out>



名字 類型 描述
value Object 將要輸出的表達式
escapeXml boolean 確定以下字符:<,>,


From:http://www.xin7dian.com/read.php?tid=1973

Hilly 2006-07-13 23:46 發(fā)表評論
]]>
Struts常見錯誤匯總(轉)http://m.tkk7.com/web/archive/2006/07/06/struts_errors.htmlHillyHillyThu, 06 Jul 2006 07:49:00 GMThttp://m.tkk7.com/web/archive/2006/07/06/struts_errors.htmlhttp://m.tkk7.com/web/comments/56963.htmlhttp://m.tkk7.com/web/archive/2006/07/06/struts_errors.html#Feedback0http://m.tkk7.com/web/comments/commentRss/56963.htmlhttp://m.tkk7.com/web/services/trackbacks/56963.html  1、“No bean found under attribute key XXX”
  在struts-config.xml里定義了一個ActionForm,但type屬性指定的類不存在,type屬性的值應該是Form類的全名。或者是,在Action的定義中,name或attribute屬性指定的ActionForm不存在。

  2、“Cannot find bean XXX in any scope”
  在Action里一般會request.setAttribute()一些對象,然后在轉向的jsp文件里(用tag或request.getAttribute()方法)得到這些對象并顯示出來。這個異常是說jsp要得到一個對象,但前面的Action里并沒有將對象設置到request(也可以是session、servletContext)里。
可能是名字錯了,請檢查jsp里的tag的一般是name屬性,或getAttribute()方法的參數值;或者是Action邏輯有問題沒有執(zhí)行setAttribute()方法就先轉向了。
還有另外一個可能,純粹是jsp文件的問題,例如<logic:iterate>會指定一個id值,然后在循環(huán)里<bean:write>使用這個值作為name的值,如果這兩個值不同,也會出現此異常。(都是一個道理,request里沒有對應的對象。)

  3、“Missing message for key "XXX"”
  缺少所需的資源,檢查ApplicationResources.properties文件里是否有jsp文件里需要的資源,例如:
  <bean:message key="msg.name.prompt"/>
  這行代碼會找msg.name.prompt資源,如果AppliationResources.properties里沒有這個資源就會出現本異常。在使用多模塊時,要注意在模塊的struts-config-xxx.xml里指定要使用的資源文件名稱,否則當然什么資源也找不到,這也是一個很容易犯的錯誤。

  4、“No getter method for property XXX of bean teacher”
  這條異常信息說得很明白,jsp里要取一個bean的屬性出來,但這個bean并沒有這個屬性。你應該檢查jsp中某個標簽的property屬性的值。例如下面代碼中的cade應該改為code才對:
  <bean:write name="teacher" property="cade" filter="true"/>

  5、“Cannot find ActionMappings or ActionFormBeans collection”
  待解決。

  6、“Cannot retrieve mapping for action XXX”
  在.jsp的<form>標簽里指定action='/XXX',但這個Action并未在struts-config.xml里設置過。

  7、HTTP Status 404 - /xxx/xxx.jsp
  Forward的path屬性指向的jsp頁面不存在,請檢查路徑和模塊,對于同一模塊中的Action轉向,path中不應包含模塊名;模塊間轉向,記住使用contextRelative="true"。

  8、沒有任何異常信息,顯示空白頁面
  可能是Action里使用的forward與struts-config.xml里定義的forward名稱不匹配。

  9、“The element type "XXX" must be terminated by the matching end-tag "XXX".”
  這個是struts-config.xml文件的格式錯誤,仔細檢查它是否是良構的xml文件,關于xml文件的格式這里就不贅述了。

  10、“Servlet.init() for servlet action threw exception”
  一般出現這種異常在后面會顯示一個關于ActionServlet的異常堆棧信息,其中指出了異常具體出現在代碼的哪一行。我曾經遇到的一次提示如下:

  java.lang.NullPointerException
   at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)
   at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)

  為解決問題,先下載struts的源碼包,然后在ActionServlet.java的第1003行插入斷點,并對各變量進行監(jiān)視。很丟人,我竟然把struts-config.xml文件弄丟了,因此出現了上面的異常,應該是和CVS同步時不小心刪除的。

  11、“Resources not defined for Validator”
  這個是利用Validator插件做驗證時可能出現的異常,這時你要檢查validation.xml文件,看里面使用的資源是否確實有定義,form的名稱是否正確,等等。


來源:http://blog.csdn.net/jht2002/



Hilly 2006-07-06 15:49 發(fā)表評論
]]>
什么是ERP軟件http://m.tkk7.com/web/archive/2006/07/04/WhatIsERP.htmlHillyHillyMon, 03 Jul 2006 23:16:00 GMThttp://m.tkk7.com/web/archive/2006/07/04/WhatIsERP.htmlhttp://m.tkk7.com/web/comments/56440.htmlhttp://m.tkk7.com/web/archive/2006/07/04/WhatIsERP.html#Feedback3http://m.tkk7.com/web/comments/commentRss/56440.htmlhttp://m.tkk7.com/web/services/trackbacks/56440.html什么是ERP軟件?

ERP是英文Enterprise Resourse Planning的縮寫,中文意思是企業(yè)資源規(guī)劃。它是一個以管理會計為核心的信息系統,識別和規(guī)劃企業(yè)資源,從而獲取客戶訂單,完成加工和交付,最后得到客戶付款。換言之,ERP將企業(yè)內部所有資源整合在一起,對采購、生產、成本、庫存、分銷、運輸、財務、人力資源進行規(guī)劃,從而達到最佳資源組合,取得最佳效益。

企業(yè)資源規(guī)劃 ERP, Enterprise Resource Planning)的合理運用已經改變了企業(yè)運作的面貌。ERP通過運用最佳業(yè)務制度規(guī)范business practice以及集成企業(yè)關鍵業(yè)務流程business processes來發(fā)問和提高企業(yè)利潤,市場需求反應速度和企業(yè)。

同時,企業(yè)處在日新月異的市場機遇、價格和服務水平等的挑戰(zhàn)環(huán)境中,必須不斷改變、改善企業(yè)經營模式,提高企業(yè)競爭力。以往僅僅關注于企業(yè)內部的流程改善,產品開發(fā)和制造水平的提高已經不足以面對現時的市場環(huán)境。事實說明,處在現代競爭環(huán)境的企業(yè)要保持生存和持續(xù)發(fā)展必須與商業(yè)合作伙伴充分協調一以建立一個具有競爭優(yōu)勢的價值鏈。



Hilly 2006-07-04 07:16 發(fā)表評論
]]>
畢業(yè)課程設計(新):網上圖書銷售系統http://m.tkk7.com/web/archive/2006/07/03/BookStoreOnWeb.htmlHillyHillyMon, 03 Jul 2006 13:05:00 GMThttp://m.tkk7.com/web/archive/2006/07/03/BookStoreOnWeb.htmlhttp://m.tkk7.com/web/comments/56411.htmlhttp://m.tkk7.com/web/archive/2006/07/03/BookStoreOnWeb.html#Feedback1http://m.tkk7.com/web/comments/commentRss/56411.htmlhttp://m.tkk7.com/web/services/trackbacks/56411.html畢業(yè)設計:網上圖書銷售系統
使用struts按需求完成資產管理系統
時間:20060703--20060731
開發(fā)人員:5人
總體需求描述

1)客戶可以通過多種方式查詢,并且挑選網上圖書公司的所有出售書籍。通過在網上填寫并確認購書訂單的方式來購買圖書。

2)客戶可以管理自己的訂單信息,查詢匯款單信息,并且可以在網上留言反饋意見等。

3)企業(yè)可以對圖書信息進行管理。

4)企業(yè)可以對圖書的庫存、訂單和匯款單進行管理。

5)企業(yè)可以對客戶的訂單信息,匯款單信息進行審核,以確定是否發(fā)貨。

6)企業(yè)可以針對客戶意見錄入處理結果。

??????7)用戶通過個性化服務可以自助注冊和管理自己的個人信息
歡迎源代碼交流


Hilly 2006-07-03 21:05 發(fā)表評論
]]>
集成新版本Tomcat到JBuilderhttp://m.tkk7.com/web/archive/2006/06/29/TomcatInJbuilder.htmlHillyHillyThu, 29 Jun 2006 12:14:00 GMThttp://m.tkk7.com/web/archive/2006/06/29/TomcatInJbuilder.htmlhttp://m.tkk7.com/web/comments/55814.htmlhttp://m.tkk7.com/web/archive/2006/06/29/TomcatInJbuilder.html#Feedback0http://m.tkk7.com/web/comments/commentRss/55814.htmlhttp://m.tkk7.com/web/services/trackbacks/55814.htmlOverview

Step-by-step procedure for integrating Tomcat 5 with JBuilder X

Details

Note:

This is not a supported or tested configuration. This is just a workaround to get the server running in JBuilder X. JSP debugging will not work with this solution.

Steps:

1. Tools | Configure Servers, select the Tomcat 4.1 server and click the Copy button. Change the name to Tomcat 5.0. Next, set the home directory to the root of the Tomcat 5.0 installation, and remove the entry in the Class list and add <TOMCAT_5.0_HOME>/bin/bootstrap.jar.

?

2. File | New Project. Set server to Tomcat 5.0 and create a web module. This will trigger generation of the Tomcat 5.0 Servlet library.

?

3. Tools | Configure Libraries. Edit the Tomcat 5.0 Servlet library and add the following jars :

<TOMCAT_5.0_HOME>/common/lib/jsp-api.jar
<TOMCAT_5.0_HOME>/common/lib/servlet-api.jar
<TOMCAT_5.0_HOME>/bin/commons-logging-api.jar
<TOMCAT_5.0_HOME>/common/lib/commons-el.jar

Make a backup of this library (in your user home directory) as it gets regenerated when you create a new web module/JSP/servlet. Please make sure that you replace the library when you use any of the web gallery wizards.

?

4. Set server for the project to Tomcat 5.0.

?

5. If a "Tomcat" folder is not present under the project's root directory, create one (e.g. ../jbproject/untitled1/Tomcat). Next, create a directory named "conf" under this directory (e.g. ../jbproject/untitled1/Tomcat/conf). and create an XML file named server8080.xml. Sample server8080.xml is below. Please modify the appBase, docBase, and workDir, etc. according to your web module properties:

?

<?xml version="1.0" encoding="UTF-8"?>
<!--This comment marks this file as generated, so it may be deleted and regenerated at any time. To preserve manual changes to this file, delete this comment.-->
<Server debug="0" port="8081" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector acceptCount="10" connectionTimeout="60000" debug="0" maxThreads="75" minSpareThreads="5" port="8080"/>
<Engine debug="0" defaultHost="localhost" name="Catalina">
<Host appBase="C:Documents and Settings<user name>jbprojectuntitled1Tomcatwebapps" debug="0" name="localhost" unpackWARs="true">
<Context debug="0" docBase="C:Documents and Settings<user name>jbprojectuntitled1WebModule1" path="/WebModule1" reloadable="true" workDir="C:Documents and Settings<user name>jbprojectuntitled1TomcatworkWebModule1"/>
</Host>
</Engine>
</Service>
</Server>

?

6. Start the server in JBuilder. This should use the modified server8080.xml

?

You should be able to compile JSPs using this workaround but not debug. You should be able to debug any java code. You will see a number of exceptions for the admin, manager, balancer services which do not get started when you normally run the server in JBuilder. Please ignore these exceptions. The server should function normally without these services.



Hilly 2006-06-29 20:14 發(fā)表評論
]]>
畢業(yè)課程設計:資產管理系統http://m.tkk7.com/web/archive/2006/06/29/Struts.htmlHillyHillyThu, 29 Jun 2006 12:05:00 GMThttp://m.tkk7.com/web/archive/2006/06/29/Struts.htmlhttp://m.tkk7.com/web/comments/55812.htmlhttp://m.tkk7.com/web/archive/2006/06/29/Struts.html#Feedback3http://m.tkk7.com/web/comments/commentRss/55812.htmlhttp://m.tkk7.com/web/services/trackbacks/55812.html使用struts按需求完成資產管理系統
時間:20060701--20060731
開發(fā)人員:5人

Hilly 2006-06-29 20:05 發(fā)表評論
]]>
主站蜘蛛池模板: 亚洲heyzo专区无码综合| 亚洲国产品综合人成综合网站| 久久亚洲国产精品一区二区| 可以免费观看的国产视频| 精品亚洲成a人在线观看| 色妞www精品视频免费看| 亚洲狠狠成人综合网| 色www免费视频| 免费无码又爽又刺激一高潮| 亚洲视频在线免费看| 性色av免费观看| 亚洲日本一区二区三区在线不卡| 亚洲成av人片天堂网| 亚洲一级毛片在线播放| 亚洲日本va午夜中文字幕一区| 亚洲一区在线视频观看| 亚洲gay片在线gv网站| 中文字幕免费在线视频| 亚洲一区二区三区免费观看| 1000部夫妻午夜免费| 日本黄页网站免费| 国产av天堂亚洲国产av天堂| 国产午夜亚洲精品| 久久一区二区三区免费| 一区二区三区在线免费观看视频| AV激情亚洲男人的天堂国语| a级毛片毛片免费观看永久| 国产va免费精品观看精品| 亚洲国产精品人人做人人爽| 亚洲午夜精品久久久久久浪潮| 亚洲一区二区影院| 国产精品亚洲综合网站| 99久久精品免费视频| 久久精品一本到99热免费| 99精品视频免费在线观看| 在线看片无码永久免费aⅴ | 久视频精品免费观看99| 免费中文字幕在线观看| 91亚洲国产成人久久精品网址| www.av在线免费观看| 免费看一级高潮毛片|