<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    1、彼得原理
       每個組織都是由各種不同的職位、等級或階層的排列所組成,每個人都隸屬于其中的某個等級。彼得原理是美國學者勞倫斯·彼得在對組織中人員晉升的相關(guān)現(xiàn)象研究后,得出一個結(jié)論:在各種組織中,雇員總是趨向于晉升到其不稱職的地位。彼得原理有時也被稱為向上爬的原理。 這種現(xiàn)象在現(xiàn)實生活中無處不在:一名稱職的教授被提升為大學校長后,卻無法勝任;一個優(yōu)秀的運動員被提升為主管體育的官員,而無所作為。對一個組織而言,一旦相當部分人員被推到其不稱職的級別,就會造成組織的人浮于事,效率低下,導(dǎo)致平庸者出人頭地,發(fā)展停滯。
    2、酒與污水定律
       酒與污水定律是指把一匙酒倒進一桶污水,得到的是一桶污水;如果把一匙污水倒進一桶酒,得到的還是一桶污水。在任何組織里,幾乎都存在幾個難弄的人物,他們存在的目的似乎就是為了把事情搞糟。最糟糕的是,他們像果箱里的爛蘋果,如果不及時處理,它會迅速傳染,把果箱里其他蘋果也弄爛。 爛蘋果的可怕之處,在于它那驚人的破壞力。一個正直能干的人進入一個混亂的部門可能會被吞沒,而一個無德無才者能很快將一個高效的部門變成一盤散沙。組織系統(tǒng)往往是脆弱的,是建立在相互理解、妥協(xié)和容忍的基礎(chǔ)上的,很容易被侵害、被毒化。破壞者能力非凡的另一個重要原因在于,破壞總比建設(shè)容易。一個能工巧匠花費時日精心制作的陶瓷器,一頭驢子一秒鐘就能毀壞掉。如果一個組織里有這樣的一頭驢子,即使擁有再多的能工巧匠,也不會有多少像樣的工作成果。如果你的組織里有這樣的一頭驢子,你應(yīng)該馬上把它清除掉,如果你無力這樣做,就應(yīng)該把它拴起來。
    3、木桶定律
       水桶定律是講一只水桶能裝多少水,這完全取決于它最短的那塊木板。這就是說任何一個組織,可能面臨的一個共同問題,即構(gòu)成組織的各個部分往往是優(yōu)劣不齊的,而劣勢部分往往決定整個組織的水平。水桶定律與酒與污水定律不同,后者討論的是組織中的破壞力量,最短的木板卻是組織中有用的一個部分,只不過比其他部分差一些,你不能把它們當成爛蘋果扔掉。強弱只是相對而言的,無法消除,問題在于你容忍這種弱點到什么程度,如果嚴重到成為阻礙工作的瓶頸,你就不得不有所動作。
    4、馬太效應(yīng)
       《新約·馬太福音》中有這樣一個故事:一個國王遠行前,交給3個仆人每人一錠銀子,吩咐道:你們?nèi)プ錾猓任一貋頃r,再來見我。國王回來時,第一個仆人說:主人,你交給我的一錠銀子,我已賺了10錠。于是,國王獎勵他10座城邑。第二個仆人報告:主人,你給我的一錠銀子,我已賺了5錠。于是,國王獎勵他5座城邑。第三仆人報告說:主人,你給我的1錠銀子,我一直包在手帕里,怕丟失,一直沒有拿出來。于是,國王命令將第三個仆人的1錠銀子賞給第一個仆人,說:凡是少的,就連他所有的,也要奪過來。凡是多的,還要給他,叫他多多益善,這就是馬太效應(yīng),反應(yīng)當今社會中存在的一個普遍現(xiàn)象,即贏家通吃。對企業(yè)經(jīng)營發(fā)展而言,馬太效應(yīng)告訴我們,要想在某一個領(lǐng)域保持優(yōu)勢,就必須在此領(lǐng)域迅速做大。當你成為某個領(lǐng)域的領(lǐng)頭羊時,即便投資回報率相同,你也能更輕易地獲得比弱小的同行更大的收益。而若沒有實力迅速在某個領(lǐng)域做大,就要不停地尋找新的發(fā)展領(lǐng)域,才能保證獲得較好的回報。
    5、零和游戲原理
       零和游戲是指一項游戲中,游戲者有輸有贏,一方所贏正是另一方所輸,游戲的總成績永遠為零,零和游戲原理之所以廣受關(guān)注,主要是因為人們在社會的方方面面都能發(fā)現(xiàn)與零和游戲類似的局面,勝利者的光榮后面往往隱藏著失敗者的辛酸和苦澀。 20世紀,人類經(jīng)歷兩次世界大戰(zhàn)、經(jīng)濟高速增長,科技進步、全球一體化以及日益嚴重的環(huán)境污染,零和游戲觀念正逐漸被雙贏觀念所取代。人們開始認識到利已不一定要建立在損人的基礎(chǔ)上。通過有效合作皆大歡喜的結(jié)局是可能出現(xiàn)的。但從零和游戲走向雙贏,要求各方面要有真誠合作的精神和勇氣,在合作中不要小聰明,不要總想占別人的小便宜,要遵守游戲規(guī)則,否則雙贏的局面就不可能出現(xiàn),最終吃虧的還是合作者自己。
    6、華盛頓合作規(guī)律
       華盛頓合作規(guī)律說的是一個人敷衍了事,兩個人互相推諉,三個人則永無成事之日。多少有點類似于我們?nèi)齻€和尚的故事。人與人的合作,不是人力的簡單相加,而是要復(fù)雜和微妙得多。在這種合作中,假定每個人的能力都為1,那么,10個人的合作結(jié)果有時比10大得多,有時,甚至比1還要小。因為人不是靜止物,而更像方向各異的能量,相互推動時,自然事半功倍,相互抵觸時,則一事無成。 我們傳統(tǒng)的管理理論中,對合作研究得并不多,最直觀的反映就是,目前的大多數(shù)管理制度和行為都是致力于減少人力的無謂消耗,而非利用組織提高人的效能。換言之,不妨說管理的主要目的不是讓每個人做得更好,而是避免內(nèi)耗過多。
    7、手表定理 
        手表定理是指一個人有一只表時,可以知道現(xiàn)在是幾點鐘,當他同時擁有兩只表時,卻無法確定。兩只手表并不能告訴一個人更準確的時間,反而會讓看表的人失去對準確時間的信心。手表定理在企業(yè)經(jīng)營管理方面,給我們一種非常直觀的啟發(fā),就是對同一個人或同一個組織的管理,不能同時采用兩種不同的方法,不能同時設(shè)置兩個不同的目標,甚至每一個人不能由兩個人同時指揮,否則將使這個企業(yè)或這個人無所適從。手表定理所指的另一層含義在于,每個人都不能同時選擇兩種不同的價值觀,否則,你的行為將陷于混亂。
    8、不值得定律
        不值得定律最直觀的表述是:不值得做的的事情,就不值得做好。這個定律再簡單不過了,重要性卻時時被人們忽視遺忘。不值得定律反映人們的一種心理,一個人如果從事的是一份自認為不值得做的事情,往往會保持冷嘲熱諷,敷衍了事的態(tài)度,不僅成功率低,而且即使成功,也不覺得有多大的成就感。 因此,對個人來說,應(yīng)在多種可供選擇的奮斗目標及價值觀中挑選一種,然后為之奮斗。選擇你所愛的,愛你所選擇的,才可能激發(fā)我們的斗志,也可以心安理得。而對一個企業(yè)或組織來說,則要很好地分析員工的性格特性,合理分配工作,如讓成就欲較強的職工單獨或牽頭完成具有一定風險和難度的工作,并在其完成時,給予及時的肯定和贊揚;讓依附欲較強的職工,更多地參加到某個團體共同工作;讓權(quán)力欲較強的職工,擔任一個與之能力相適應(yīng)的主管。同時要加強員工對企業(yè)目標的認同感,讓員工感覺到自己所做的工作是值得的,這樣才能激發(fā)職工的熱情。
    9 、蘑菇管理
        蘑菇管理是許多組織對待初出茅廬者的一種管理方法,初學者被置于陰暗的角落(不受重視的部門,或打雜跑腿的工作),澆上一頭大糞(無端的批評、指責、代人受過),任其自生自滅(得不到必要的指導(dǎo)和提攜)。相信很多人都有過這樣一段蘑菇的經(jīng)歷,這不一定是什么壞事,尤其是當一切剛剛開始的時候,當幾天蘑菇,能夠消除我們很多不切實際的幻想,讓我們更加接近現(xiàn)實,看問題也更加實際。一個組織,一般對新進的人員都是一視同仁,從起薪到工作都不會有大的差別。無論你是多么優(yōu)秀的人才,在剛開始的時候,都只能從最簡單的事情做起,蘑菇的經(jīng)歷,對于成長中的年輕人來說,就象蠶繭,是羽化前必須經(jīng)歷的一步。所以,如何高效率地走過生命的這一段,從中盡可能汲取經(jīng)驗,成熟起來,并樹立良好的值得信賴的個人形象,是每個剛?cè)肷鐣哪贻p人必須面對的課題。
    10、奧卡姆剃刀定律
         12世紀,英國奧卡姆的威廉主張唯名論,只承認確實存在的東西,認為那些空洞無物的普遍性概念都是無用的累贅,應(yīng)當被無情地剃除。他主張如無必要,勿增實體。這就是常說的奧卡姆剃刀。這把剃刀曾使很多人感到威脅,被認為是異端邪說,威廉本人也因此受到迫害。然而,并未損害這把刀的鋒利,相反,經(jīng)過數(shù)百年的歲月,奧卡姆剃刀已被歷史磨得越來越快,并早已超載原來狹窄的領(lǐng)域,而具有廣泛、豐富、深刻的意義。 奧卡姆剃刀定律在企業(yè)管理中可進一步演化為簡單與復(fù)雜定律:把事情變復(fù)雜很簡單,把事情變簡單很復(fù)雜。這個定律要求,我們在處理事情時,要把握事情的主要實質(zhì),把握主流,解決最根本的問題,尤其要順應(yīng)自然,不要把事情人為地復(fù)雜化,這樣才能把事情處理好
    posted @ 2007-11-05 10:40 重歸本壘(Bing) 閱讀(1783) | 評論 (0)編輯 收藏
     

    1. 服務(wù)器負載均衡市場需求
      隨著Internet的普及以及電子商務(wù)、電子政務(wù)的發(fā)展,越來越多的應(yīng)用系統(tǒng)需要面對更高的訪問量和數(shù)據(jù)量。同時,企業(yè)對在線系統(tǒng)的依賴也越來越高,大量的關(guān)鍵應(yīng)用需要系統(tǒng)有足夠的在線率及高效率。這些要求使得單一的網(wǎng)絡(luò)服務(wù)設(shè)備已經(jīng)不能滿足這些需要,由此需要引入服務(wù)器的負載均衡,實現(xiàn)客戶端同時訪問多臺同時工作的服務(wù)器,一則避免服務(wù)器的單點故障,再則提高在線系統(tǒng)的服務(wù)處理能力。從業(yè)界環(huán)境來說,如下的應(yīng)用需求更是負載均衡發(fā)展的推動力:

    •   業(yè)務(wù)系統(tǒng)從Client-Server轉(zhuǎn)向采用Browser-Server 系統(tǒng)結(jié)構(gòu),關(guān)鍵系統(tǒng)需要高可用性
    •   電子商務(wù)系統(tǒng)的高可用性和高可靠性需要
    •   IT應(yīng)用系統(tǒng)大集中的需要 (稅務(wù)大集中,證券大集中,銀行大集中)
    •   數(shù)據(jù)中心降低成本,提高效率

      負載均衡技術(shù)在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上提供了一種廉價、有效、透明的方法,來擴展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。它有兩方面的含義:首先,大量的并發(fā)訪問或數(shù)據(jù)流量分擔到多臺節(jié)點設(shè)備上分別處理,減少用戶等待響應(yīng)的時間;其次,單個重負載的運算分擔到多臺節(jié)點設(shè)備上做并行處理,每個節(jié)點設(shè)備處理結(jié)束后,將結(jié)果匯總,返回給用戶,系統(tǒng)處理能力得到大幅度提高。

      BIG/IP利用定義在其上面的虛擬IP地址來為用戶的一個或多個應(yīng)用服務(wù)器提供服務(wù)。因此,它能夠為大量的基于TCP/IP的網(wǎng)絡(luò)應(yīng)用提供服務(wù)器負載均衡服務(wù)。BIG/IP連續(xù)地對目標服務(wù)器進行L4到L7合理性檢查,當用戶通過VIP請求目標服務(wù)器服務(wù)時,BIG/IP根椐目標服務(wù)器之間性能和網(wǎng)絡(luò)健康情況,選擇性能最佳的服務(wù)器響應(yīng)用戶的請求。

    下圖描述了一個負載均衡發(fā)生的流程:
     


        
      1. 客戶發(fā)出服務(wù)請求到VIP
      2. BIGIP接收到請求,將數(shù)據(jù)包中目的IP地址改為選中的后臺服務(wù)器IP地址,然后將數(shù)據(jù)包發(fā)出到后臺選定的服務(wù)器
      3. 后臺服務(wù)器收到后,將應(yīng)答包按照其路由發(fā)回到BIGIP
      4. BIGIP收到應(yīng)答包后將其中的源地址改回成VIP的地址,發(fā)回客戶端,由此就完成了一個標準的服務(wù)器負載均衡的流程。

    2.負載均衡典型流程

    •   通過VIP來截獲合適的需要負載均衡的流量
    •   服務(wù)器監(jiān)控和健康檢查,隨時了解服務(wù)器群的可用性狀態(tài)
    •   負載均衡和應(yīng)用交換功能,通過各種策略導(dǎo)向到合適的服務(wù)器
        

    2.1 通過VIP來截獲合適的需要負載均衡的流量
       在BIGIP上通過設(shè)置VIP來截獲需要進行負載均衡的流量,這個VIP地址可以是一個獨立的主機地址和端口的組合(例如:202.101.112.115:80)也可以是一個網(wǎng)絡(luò)地址和端口的組合(例如:202.101.112.0:80),當流量經(jīng)過BIGIP的時候,凡是命中VIP的流量都將被截獲并按照規(guī)則進行負載均衡。

    2.2 服務(wù)器的健康監(jiān)控和檢查

       服務(wù)器 (Node) - Ping (ICMP)

          BIGIP可以定期的通過ICMP包對后臺服務(wù)器的IP地址進行檢測,如果在設(shè)定的時間內(nèi)能收到該地址的ICMP的回應(yīng),則認為該服務(wù)器能提供服務(wù)

       服務(wù) (Port) – Connect
          BIGIP可以定期的通過TCP包對后臺服務(wù)器的服務(wù)端口進行檢測,如果在設(shè)定的時間內(nèi)能收到該服務(wù)器端口的回應(yīng),則認為該服務(wù)器能提供服務(wù)


       擴展內(nèi)容查證(ECV: Extended Content Verification)—ECV

         ECV是一種非常復(fù)雜的服務(wù)檢查,主要用于確認應(yīng)用程序能否對請求返回對應(yīng)的數(shù)據(jù)。如果一個應(yīng)用對該服務(wù)檢查作出響應(yīng)并返回對應(yīng)的數(shù)據(jù),則BIG/IP控制器將該服務(wù)器標識為工作良好。如果服務(wù)器不能返回相應(yīng)的數(shù)據(jù),則將該服務(wù)器標識為宕機。宕機一旦修復(fù),BIG/IP就會自動查證應(yīng)用已能對客戶請求作出正確響應(yīng)并恢復(fù)向該服務(wù)器傳送。該功能使BIG/IP可以將保護延伸到后端應(yīng)用如Web內(nèi)容及數(shù)據(jù)庫。BIG/ip的ECV功能允許您向Web服務(wù)器、防火墻、緩存服務(wù)器、代理服務(wù)器和其它透明設(shè)備發(fā)送查詢,然后檢查返回的響應(yīng)。這將有助于確認您為客戶提供的內(nèi)容正是其所需要的。

       擴展應(yīng)用查證(EAV: Extended Application Verification)

         EAV是另一種服務(wù)檢查,用于確認運行在某個服務(wù)器上的應(yīng)用能否對客戶請求作出響應(yīng)。為完成這種檢查,BIG/IP控制器使用一個被稱作外部服務(wù)檢查者的客戶程序,該程序為BIG/IP提供完全客戶化的服務(wù)檢查功能,但它位于BIG/IP控制器的外部。例如,該外部服務(wù)檢查者可以查證一個Internet或Intranet上的從后臺數(shù)據(jù)庫中取出數(shù)據(jù)并在HTML網(wǎng)頁上顯示的應(yīng)用能否正常工作。EAV是BIG/IP提供的非常獨特的功能,它提供管理者將BIG/IP客戶化后訪問各種各樣應(yīng)用的能力,該功能使BIG/IP在提供標準的可用性查證之外能獲得服務(wù)器、應(yīng)用及內(nèi)容可用性等最重要的反饋。
         該功能對于電子商務(wù)和其它應(yīng)用至關(guān)重要,它用于從客戶的角度測試您的站點。例如,您可以模擬客戶完成交易所需的所有步驟-連接到站點、從目錄中選擇項目以及驗證交易使用的信用卡。一旦BIG/ip掌握了該“可用性”信息,即可利用負載均衡使資源達到最高的可用性。

      BIG/ip已經(jīng)為測試Internet服務(wù)的健康情況和狀態(tài),預(yù)定義的擴展應(yīng)用驗證(EAV),它有二種用戶界面:瀏覽器和CLI配置。BIG/IP預(yù)定義的應(yīng)用檢查:FTP、NNTP、SMTP、POP3和MSSQL。


    2.3 負載均衡和應(yīng)用交換功能,通過各種策略導(dǎo)向到合適的服務(wù)器

      BIGIP是一臺對流量和內(nèi)容進行管理分配的設(shè)備。它提供12種靈活的算法將數(shù)據(jù)流有效地轉(zhuǎn)發(fā)到它所連接的服務(wù)器群。而面對用戶,只是一臺虛擬服務(wù)器。用戶此時只須記住一臺服務(wù)器,即虛擬服務(wù)器。但他們的數(shù)據(jù)流卻被BIGIP靈活地均衡到所有的服務(wù)器。這12種算法包括:

    ?輪詢(Round Robin):順序循環(huán)將請求一次順序循環(huán)地連接每個服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7層的故障,BIG/IP就把其從順序循環(huán)隊列中拿出,不參加下一次的輪詢,直到其恢復(fù)正常。
    ?比率(Ratio):給每個服務(wù)器分配一個加權(quán)值為比例,根椐這個比例,把用戶的請求分配到每個服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7層的故障,BIG/IP就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
    ?優(yōu)先權(quán)(Priority):給所有服務(wù)器分組,給每個組定義優(yōu)先權(quán),BIG/IP用戶的請求,分配給優(yōu)先級最高的服務(wù)器組(在同一組內(nèi),采用輪詢或比率算法,分配用戶的請求);當最高優(yōu)先級中所有服務(wù)器出現(xiàn)故障,BIG/IP才將請求送給次優(yōu)先級的服務(wù)器組。這種方式,實際為用戶提供一種熱備份的方式。
    ?最少的連接方式(Least Connection):傳遞新的連接給那些進行最少連接處理的服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7層的故障,BIG/IP就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
    ?最快模式(Fastest):傳遞連接給那些響應(yīng)最快的服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7層的故障,BIG/IP就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
    ?觀察模式(Observed):連接數(shù)目和響應(yīng)時間以這兩項的最佳均衡為依據(jù)為新的請求選擇服務(wù)器。當其中某個服務(wù)器發(fā)生第二到第7層的故障,BIG/IP就把其從服務(wù)器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復(fù)正常。
    ?預(yù)測模式(Predictive):BIG/IP利用收集到的服務(wù)器當前的性能指標,進行預(yù)測分析,選擇一臺服務(wù)器在下一個時間片內(nèi),其性能將達到最佳的服務(wù)器相應(yīng)用戶的請求。(被bigip進行檢測)
    ?動態(tài)性能分配(Dynamic Ratio-APM):BIG/IP收集到的應(yīng)用程序和應(yīng)用服務(wù)器的各項性能參數(shù),動態(tài)調(diào)整流量分配。
    ?動態(tài)服務(wù)器補充(Dynamic Server Act.):當主服務(wù)器群中因故障導(dǎo)致數(shù)量減少時,動態(tài)地將備份服務(wù)器補充至主服務(wù)器群。
    ?服務(wù)質(zhì)量(QoS):按不同的優(yōu)先級對數(shù)據(jù)流進行分配。
    ?服務(wù)類型(ToS):按不同的服務(wù)類型(在Type of Field中標識)對數(shù)據(jù)流進行分配。
    ?規(guī)則模式:針對不同的數(shù)據(jù)流設(shè)置導(dǎo)向規(guī)則,用戶可自行編輯流量分配規(guī)則,BIG/IP利用這些規(guī)則對通過的數(shù)據(jù)流實施導(dǎo)向控制。

    posted @ 2007-11-05 09:37 重歸本壘(Bing) 閱讀(1424) | 評論 (0)編輯 收藏
     
    WML
         摘要:   ·                               ...  閱讀全文
    posted @ 2007-10-10 17:17 重歸本壘(Bing) 閱讀(1621) | 評論 (0)編輯 收藏
     
    XML
         摘要:   什么是XML     XML即可擴展標記語言(eXtensible Markup Language)。標記是指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。     1.XML并不是標記語言。它只是用來創(chuàng)造標記語言(比如HTML)的元語言。     2...  閱讀全文
    posted @ 2007-10-10 17:08 重歸本壘(Bing) 閱讀(750) | 評論 (1)編輯 收藏
     
    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
    很顯然這是一個沒有找到對應(yīng)的類文件的異常。
    還有兩個包commons-pool.jar和commons-dbcp-1.2.1.jar需要引入到工程中。
    posted @ 2007-09-12 15:16 重歸本壘(Bing) 閱讀(3893) | 評論 (1)編輯 收藏
     
            本文將介紹在JSP頁面中包含一些JavaScript這樣一個簡單而有效的方法來結(jié)合AJAX和Struts。在此我們介紹如何重新使用已經(jīng)存在的Struts actions,但此技術(shù)同樣可用于你選擇的其他Java-Web 框架。本方法同樣可平移到Struts或者JSF的下一個版本。

            AJAX是“異步的JavaScript和XML”的縮寫。這是一項技術(shù),而不是一個如Struts一樣的框架。為什么在AJAX周圍會有這么多的關(guān)注呢?這是因為AJAX使web頁面看起來并不像一個平面的文檔,而更像用戶所期望的如桌面應(yīng)用的動態(tài)GUI應(yīng)用程序。AJAX技術(shù)能在很多的瀏覽器上使用(包括IE和Netscape/Mozilla)。它已經(jīng)為Microsoft(用于Outlook的web客戶端)和Google(用戶Google Maps和Gmail)所使用。

      未使用AJAX之前

      目前大多數(shù)的Struts應(yīng)用都是標準的“如同一個平面文檔的web頁面”的結(jié)構(gòu)。如果你想模仿一些桌面應(yīng)用程序(比如那些使用Java Swing,Visual Basic,或者Delphi建立的應(yīng)用程序),那么你有兩個選擇:你可以發(fā)送所有的可能作為頁面的一部分被請求的信息,使用大量的JavaScript來操作其動態(tài)的顯示(一個很慢并且非企業(yè)級Java的方法);或者你可以不改變形式地提交到后臺服務(wù)器(一種有效的方法) 。AJAX提高給你了融合前面的最佳解決方案:動態(tài)的頁面,但是大多數(shù)的應(yīng)用是在你的web服務(wù)器的Java程序來處理的。

      AJAX 101

      AJAX和現(xiàn)有的動態(tài)HTML技術(shù)非常相似,并在其上增加了一個發(fā)送到“后臺”服務(wù)器的請求來獲取需要的新的或者更新的信息。AJAX的機制在其他地方已經(jīng)有詳細的說明――請查看本文后的Resources來獲取更多。但是你至少需要知道:

    •   1. XMLHttpRequest (如果你使用的是IE瀏覽器的話,則是Microsoft.XMLHTTP的ActiveX的對象)。這些對象,你可以在web頁面中使用JavaScript調(diào)用。他們允許你作為后臺的調(diào)用方式來請求web服務(wù)器的內(nèi)容(例如,在表單提交后,屏幕并不像平時一樣顯示“空白”)。
    •   2. XMLHttpRequest 和Microsoft.XMLHTTP 返回的內(nèi)容可以作為XML或者文本來處理。JavaScript(在你頁面上的)可以使用請求的新內(nèi)容來更新頁面。
    •   3. 整個處理過程可以由普通的JavaScript事件來觸發(fā):onclick,onchange,onblur,等。

      在你的Struts應(yīng)用中使用AJAX

      你閱讀了本文,然后你會對使用AJAX來創(chuàng)建動態(tài)的web頁面感興趣,并且想知道如何將它加入到你的Struts應(yīng)用中。這只是選擇之一。那么你會如何選擇呢?

    •   · 等待,知道Struts的下一個版本融合了AJAX技術(shù)。如果Struts開發(fā)者準備開發(fā)一個新的應(yīng)用,這或許會是一個好的選擇。再后面,可能會是要求JSF也這樣做――對其本身并不一件壞事,但是對于已經(jīng)存在的系統(tǒng)這將會帶來最根本的改變。
    •   · 你也可以直接采用新的方法,比如Direct Web Remoting (DWR) 和Ruby on Rails,這些都是專為建立AJAX應(yīng)用的。如果你考慮不使用Struts來開發(fā)web的話,那么這些都是很又用的框架,并且值得一試。但是,這也同時意味著你必須要重寫你的應(yīng)用。
    •   · 在你已經(jīng)存在的Struts應(yīng)用中增加AJAX。既然AJAX只是一項技術(shù)而并非框架,那么它就很容易融入到Struts中。作為現(xiàn)有的系統(tǒng),其穩(wěn)定性(如,保持現(xiàn)有的庫文件)是相當重要的。所以這個方法被推薦,并且我們將在后面詳細介紹。

      我們選擇在Struts應(yīng)用中增加AJAX的優(yōu)勢是:

    •   1. 它并不需要任何新的庫文件或者服務(wù)器代碼;只需要使用現(xiàn)有的Struts庫文件和action。
    •   2. 解決方案中所有部分――JavaScript,XML,Java和Struts――早已為廣泛所知。
    •   3. 此應(yīng)用可以一塊一塊地移植到AJAX;我們可以確定哪些部分對用戶有益,并首先將它們更新到動態(tài)AJAX顯示。

      實現(xiàn)方案

      我們?nèi)绾握嬲呢瀼匚覀兊倪x擇呢?我們首先應(yīng)該注意一個“標準的”(沒有AJAX)Struts應(yīng)用是如何工作的。在此應(yīng)用中,一個一般的事件流程如下:

    •   1. 使用點擊超鏈接或者表單的提交按鈕,用戶發(fā)送請求。
    •   2. web服務(wù)器運行處理請求的Struts Action來生成一個web頁面。
    •   3. 瀏覽器顯示web頁面。
    •   4. 當用戶點擊保存的時候,信息由Struts框架中一個ActionForm類來轉(zhuǎn)換并發(fā)送到服務(wù)器。
    •   5. 然后,Struts框架調(diào)用Struts Action來出來請求(如,保存數(shù)據(jù)到數(shù)據(jù)庫中)。
    •   6. 頁面再一次回傳,處理流程繼續(xù)。

      現(xiàn)有的Struts應(yīng)用

      一個演示事件流程的簡單Struts應(yīng)用可以在以下地址下載: struts-non-ajax.zip。此基于Struts的應(yīng)用,是基于用戶的輸入顯示或者隱藏藍色和綠色的表格。圖1顯示了載入初始頁面的畫面。圖2顯示了用戶輸入值并點擊了提交后的畫面。雖然簡單,但它已經(jīng)足以表示一個Struts的工作流程。

      圖 1. 沒有AJAX的例子:初始屏幕

      圖 2. 沒有AJAX的例子:輸入值并點擊了提交

    服務(wù)器端的代碼是:一個Struts Action使用struts-config.xml 中定義的值轉(zhuǎn)發(fā)到(相同的)JSP。這個例子代碼中一些需要注意的地方是:
    •   ·struts-config.xml文件將所有的請求重定向到http://localhost:8080/struts-non-ajax/(或者和你自己的服務(wù)器相同)的index.jsp。
    •   · index.jsp 包含了一個兩個文本框的Struts form(showBlue和showGreen)。該頁面同樣包含了標簽,但是如同兩個文本框被初始化為空,標簽之間的內(nèi)容并不顯示。
    •   · 用戶輸入值(true或者false)并點擊提交按鈕,處理控制(經(jīng)過Struts框架,讀取struts-config.xml)提交到SampleAction類中。
    •   ·SampleAction記錄下值,然后轉(zhuǎn)發(fā)到index.jsp。一個成熟的Struts應(yīng)用可能會處理更多的事情,不如保存或者查詢數(shù)據(jù)庫等。
    •   · index.jsp 現(xiàn)在重新處理請求;如果ShowBlue或者ShowGreen的值是true,這些表格就顯示出來。

      該應(yīng)用并沒有任何“錯誤”。類似的Struts項目好多年都是這樣做的。但是,我們?nèi)绾卧诓惶砑訌?fù)雜的JavaScript或者頻繁的表單提交的前提下,為此應(yīng)用增加動態(tài)的元素呢?

      我們的第一個Struts AJAX應(yīng)用

      觀察下下面的圖3和圖4。第一眼看上去,它們和前面的例子沒有說明區(qū)別。它們的不同之處在于,頁面載入后(圖3)然后文本框中的值改變了,窗體自動提交而不顯示空白的,然后在圖4中顯示結(jié)果。普通的提交按鈕仍然在,你也可以選擇使用它。

      圖 3. 頁面載入后的AJAX例子

      圖 4. AJAX調(diào)用后的AJAX例子

      添加AJAX是出奇的容易。服務(wù)器端的代碼和前面的例子是一樣的: 一個Struts的ActionForm來后去數(shù)據(jù),一個Struts的Action來執(zhí)行需要的任務(wù)(例如,存儲數(shù)據(jù)庫)然后轉(zhuǎn)發(fā)到適當?shù)腏SP頁面來顯示結(jié)果。

      繼續(xù)

      如果你希望就此停止閱讀(跳過這個例子的工作說明),但是這里的是和你需要轉(zhuǎn)換你的Struts應(yīng)用到一個Struts-AJAX應(yīng)用同樣的風格:

    •   1. 在你的web頁面中引入一個Ajax.js (該文件是struts-ajax.zip 例文件中的一部分)。Ajax.js 包含了所有需要發(fā)送和接收AJAX調(diào)用的JavaScript方法。
    •   2. 確保你希望在AJAX調(diào)用中更新的web頁面的部分包含在標簽中,并且給每個標簽一個id。
    •   3. 當一些事件觸發(fā)的時候就更新頁面(例如,文本框的the onchange()方法),調(diào)用retrieveURL()方法,通過URL傳遞到需要執(zhí)行服務(wù)器端處理的Struts Action。
    •   4. 為了頁面的顯示/更新,最簡單的方法是Struts Action轉(zhuǎn)發(fā)回同樣的頁面。在本例中,showGreen/showBlue 文本框中的onchange()方法來觸發(fā)AJAX調(diào)用。

      JavaScript方法retrieveURL()調(diào)用服務(wù)器的Struts(通過URL),獲取JSP響應(yīng),然后更新顯示頁面中的 標簽中的部分。就是這么簡單!

      AJAX解決方案的細節(jié)

      我們將例子變?yōu)锳JAX-Struts應(yīng)用的時候,需要三個變化:

    •   1. 增加一個JavaScript方法來完成到服務(wù)器的“背后的”AJAX調(diào)用。
    •   2. 增加JavaScript代碼來接收服務(wù)器的響應(yīng)并更新頁面。
    •   3. 在JSP頁面增加標簽標簽,這個標簽中內(nèi)容將在AJAX調(diào)用中更新。

      我們將詳細的說明上面的每一步。

    發(fā)送AJAX請求到服務(wù)器

      有兩個方法(在下面列出)用于發(fā)送請求到服務(wù)器。

      · retrieveURL()方法獲得服務(wù)器的URL和Struts form。URL用于使用AJAX,form的值用于傳遞到服務(wù)器。

      · getFormAsString()方法用于將retrieveURL()中form命名的值組裝成查詢字符串,并發(fā)送到服務(wù)器。

      使用方法很簡單,使用onclick()/onChange()事件來觸發(fā)retrieveURL()更新顯示。

      在這兩個方法中有一些有趣的東西。

      在retrieveURL()方法中,req.onreadystatechange = processStateChange (注意,沒有括號)這一行來告訴瀏覽器在服務(wù)器響應(yīng)到達的時候調(diào)用processStateChange()方法(該方法將在后面介紹)。retrieveURL()方法中(現(xiàn)在已經(jīng)是AJAX的標準了)同樣決定是使用IE瀏覽器(ActiveX)還是使用Netscape/Mozilla (XmlHttpRequest) 來實現(xiàn)跨瀏覽器兼容。

      getFormAsString()方法將HTML form轉(zhuǎn)換成字符串連接在URL后面(這樣就允許我們發(fā)送HTTP GET請求)。這個字符串是經(jīng)過轉(zhuǎn)換的(比如,空格轉(zhuǎn)換成%20等),并且是一個Struts能將其組裝成ActionForm的格式(并不需要Struts清楚的明白這個是來之AJAX的請求)。注意,在本例中我們使用HTTP GET,使用HTTP POST的方法也是類似的。

    function retrieveURL(url,nameOfFormToPost) {

    //將url轉(zhuǎn)換成字符串
    url=url+getFormAsString(nameOfFormToPost);

    //調(diào)用AJAX
    if (window.XMLHttpRequest) {

    // 非IE瀏覽器
    req = new XMLHttpRequest();
    req.onreadystatechange = processStateChange;
    try {
    req.open("GET", url, true);
    } catch (e) {
    alert("Server Communication Problem\n"+e);
    }
    req.send(null);
    } else if (window.ActiveXObject) {
    // IE

    req = new ActiveXObject("Microsoft.XMLHTTP");
    if (req) {
    req.onreadystatechange=processStateChange;
    req.open("GET", url, true);
    req.send();
    }
    }
    }

    getFormAsString() 是一個“私有” 方法,在retrieveURL()中使用。

    function getFormAsString(formName){

    //設(shè)置返回字符串
    returnString ="";

    //取得表單的值
    formElements=document.forms[formName].elements;

    //循環(huán)數(shù)組,組裝url
    //像'/strutsaction.do&name=value'這樣的格式

    for(var i=formElements.length-1;i>=0; --i ){
    //轉(zhuǎn)化每一個值
    returnString+="&"
    +escape(formElements[i].name)+"="
    +escape(formElements[i].value);
    }

    //返回字符串
    return returnString;
    }

    根據(jù)AJAX的響應(yīng)更新web頁面

      到現(xiàn)在為止,我們學習過了使用JavaScript來完成AJAX調(diào)用(前面列出),Struts Action,ActionForm以及JSP(基本沒有變化,只是增加了標簽)。為了完善我們對Struts-AJAX項目的了解,我們需要了解三個用于根據(jù)服務(wù)器返回的結(jié)果而更新頁面的JavaScript方法。

    •   · processStateChange(): 該方法在AJAX調(diào)用前設(shè)定。它在服務(wù)器響應(yīng)到達后由XMLHttpRequest/Microsoft.XMLHTTP 對象調(diào)用。
    •   ·splitTextIntoSpan(): 根據(jù)響應(yīng),循環(huán)取出數(shù)組中的元素組裝成NewContent。
    •   ·replaceExistingWithNewHtml(): 根據(jù)span元素數(shù)組,循環(huán)搜索,將里面的元素調(diào)換掉頁面中和它的'someName'相同的中的內(nèi)容。注意,我們使用的是req.responseText 方法來獲得返回的內(nèi)容(它允許我們操作任何文本的響應(yīng))。與此相對于的是req.responseXml (它的作用更大,但是要求服務(wù)器返回是XHTML或者XML)。

    function processStateChange() {

    if (req.readyState == 4) { // 完成
    if (req.status == 200) { // 響應(yīng)正常

    //將響應(yīng)的文本分割成Span元素
    spanElements =
    splitTextIntoSpan(req.responseText);

    //使用這些Span元素更新頁面
    replaceExistingWithNewHtml(spanElements);

    } else {
    alert("Problem with server response:\n "
    + req.statusText);
    }
    }
    }
    replaceExistingWithNewHtml() 是為processStateChange()使用的“私有”方法。

    function replaceExistingWithNewHtml
    (newTextElements){

    //循環(huán)newTextElements
    for(var i=newTextElements.length-1;i>=0;--i){

    //判斷是否以 if(newTextElements[i].
    indexOf("-1){

    //獲得span的名字- 設(shè)置在第一和第二個引號之間
    //確認span元素是以下的格式
    //NewContent
    startNamePos=newTextElements[i].
    indexOf('"')+1;
    endNamePos=newTextElements[i].
    indexOf('"',startNamePos);
    name=newTextElements[i].
    substring(startNamePos,endNamePos);

    //獲得內(nèi)容-在第一個>標記后的所有內(nèi)容
    startContentPos=newTextElements[i].
    indexOf('>')+1;
    content=newTextElements[i].
    substring(startContentPos);

    //現(xiàn)在更新現(xiàn)有的Document中的元素,
    // 確保文檔存在該元素
    if(document.getElementById(name)){
    document.getElementById(name).
    innerHTML = content;
    }
    }
    }
    splitTextIntoSpan() 是為processStateChange() 使用的“私有”方法。
    function splitTextIntoSpan(textToSplit){

    //分割文檔
    returnElements=textToSplit.
    split("")

    //處理每個元素
    for(var i=returnElements.length-1;i>=0;--i){

    //刪除掉第一個span后面的元素
    spanPos = returnElements[i].
    indexOf("

    //如果找到匹配的,獲得span前的內(nèi)容
    if(spanPos>0){
    subString=returnElements[i].
    substring(spanPos);
    returnElements[i]=subString;
    }
    }
    return returnElements;
    }

      新的控制流

      添加以下的JavaScript代碼到我們的應(yīng)用中,以下的步驟將在服務(wù)器和瀏覽器中執(zhí)行。

    •   1. 如同一個普通Struts應(yīng)用裝載頁面。
    •   2. 用戶改變文本框的值,觸發(fā)一個onChange() 事件,調(diào)用retrieveURL() 方法。
    •   3. 該JavaScript方法通過發(fā)送Struts明白的表單變量(后臺)請求到服務(wù)器的Struts Action。
    •   4. 該JavaScript方法同樣設(shè)定了第二個JavaScript方法的名字,此方法將到服務(wù)器響應(yīng)完畢后調(diào)用。本例子中,設(shè)定為processStateChange() 方法。
    •   5. 如我們所預(yù)期的,服務(wù)器響應(yīng)完畢,調(diào)用processStateChange() 方法。
    •   6. JavaScript在(新的)服務(wù)器響應(yīng)中循環(huán)取出所有元素。將頁面上存在與獲得元素名字相同的 中的元素替換掉。

      在你的應(yīng)用中設(shè)計AJAX

      以上描述的JavaScript方法能在大多數(shù)的應(yīng)用中使用,包括比我們的例子復(fù)雜得多的。但是,在使用之前,你需要注意以下幾點:

      · 避免復(fù)制代碼,最好在初始化請求(如,顯示完整的頁面)和AJAX(更新部分頁面)請求中使用相同的Struts Action和JSP。

      ·在公共的Action(控制器)中,決定JSP頁面(所有的JSP頁面或者其中的一部分)中的一個區(qū)域需要傳送到瀏覽器。通過在web服務(wù)器的session或者ActionForm中設(shè)定標記來讓JSP頁面知道哪些部分需要提交。

      · 在JSP中,使用Struts 或者JSTL標簽來決定提交的HTML區(qū)域。

      使用AJAX的本例子,可以在以下下載: struts-Ajax.zip

      結(jié)語

      AJAX技術(shù)允許我們在創(chuàng)建和使用web應(yīng)用的時候完全的改變。本文介紹了一個簡單的技術(shù),在現(xiàn)有的Struts應(yīng)用中增加Struts的處理。它允許我們利用我們已有的東西,不僅僅是代碼,還包括了開發(fā)的技能。作為一個好的產(chǎn)品,它同樣允許我們寫出更清晰,更具移植性的Java Struts應(yīng)用。

    版權(quán)聲明:Techtarget獲Matrix授權(quán)發(fā)布,如需轉(zhuǎn)載請聯(lián)系Matrix
    作者:作者:Paul Browne;pawenwen(作者的blog:http://blog.matrix.org.cn/page/pawenwen)
    譯文:點擊

    posted @ 2007-07-31 16:33 重歸本壘(Bing) 閱讀(680) | 評論 (1)編輯 收藏
     

    隨著企業(yè)intranet和國際internet的迅速發(fā)展,越來越多的工作流程,商務(wù)交易,教育、培訓(xùn)、會議和講座,以及個人消費娛樂都被轉(zhuǎn)移到所謂的萬維網(wǎng)(World Wide Web,以下簡稱WEB)上來了。與此相對應(yīng)的是交互操作的復(fù)雜性越來越高。

    隨著Browser/Server模式的日漸流行,很多操作都是在瀏覽器環(huán)境下的網(wǎng)頁上完成的,并不是只有失效的鏈接和意外的出錯才會使操作者感到煩惱,即便是一次完整的成功操作過程,也可能因為操作的繁復(fù)性過高或者使用上的不方便而給操作者帶來不愉快的體驗。

    本文試圖闡述WEB交互頁面設(shè)計的一些指導(dǎo)性原則,這些原則有利于避免發(fā)生不愉快的操作體驗。這些原則是用戶友好性的,是在完成同一種操作要求下,使用戶最感到輕松、簡單、舒適的WEB交互界面設(shè)計原則。我們假定我們討論的WEB頁面都是功能正常的,符合美學觀點的。需要說明我們討論的原則可能會和設(shè)計上的美學觀點以及既有的功能設(shè)計有所沖突。如果發(fā)生這種情況,基于“實用的就是美的”觀點,我們會建議您酌情放棄原先的美學觀點與功能設(shè)計。

     

     

    1. 輸入控件的自動聚焦和可用鍵盤切換輸入焦點

     

     

    使用JavaScript實現(xiàn)頁面加載完成后立即自動聚焦(focus)到第一個輸入控件。可用TAB鍵(IE缺省實現(xiàn))或方向鍵切換聚焦到下一個輸入控件。

     

     

    輸入控件指WEB頁面表單(<form>)中顯式的,需要用戶進行修改、編輯操作的表單元素。對于這些控件,如果沒有自動聚焦操作,不可避免的出現(xiàn)一次用戶鼠標定位操作(如果用戶此前處于鍵盤輸入操作狀態(tài)或鼠標定位后需要進行鍵盤輸入操作,實際上是鍵盤鼠標切換操作)。如果鼠標定位后需要進行鍵盤輸入操作,如果不能鍵盤切換輸入焦點,那么不可避免的在切換輸入焦點時需要反復(fù)的鍵盤鼠標切換操作,這是很繁瑣的。

    如果實現(xiàn)了頁面加載完成即自動聚焦到第一個輸入控件,并且可以鍵盤切換輸入焦點標定位操作,那么對于用戶來說整個頁面的輸入操作可能都不需要鼠標操作,或次數(shù)較少,這是一種便利。畢竟頻繁的鍵盤鼠標切換操作是比較累人的。

    對于有輸入欄的對話框或網(wǎng)頁,在不干預(yù)的情況下就應(yīng)將當前控制焦點定位在待輸入的輸入欄上;如果輸入欄在一般情況下不需要更改其中的內(nèi)容,則應(yīng)直接將焦點定在“確定”按鈕上;在幾個輸入欄之間應(yīng)支持tabshift+tab切換操作,“確定”和“取消”應(yīng)該是切換操作的終點,與具體所在位置無關(guān)。

     

     

    2.   可用Enter(或CtrlEnter)鍵提交,確保和點擊提交按鈕的效果是相同的

     

     

    不要在提交按鈕上加入onClick=”…”這樣的JavaScript代碼。

     

     

    Enter鍵提交頁面是原則1的自然延伸,而且這也是瀏覽器所缺省支持的。只所以單獨列出來是因為實際上有些設(shè)計者設(shè)計的頁面不能達到這種效果,結(jié)果導(dǎo)致使用Enter鍵提交和點擊“確定”按鈕提交帶來的效果不一樣。大部分情況下是設(shè)計者在“確定”按鈕上加入了onClik=”…”這樣的代碼,通過點擊“確定”按鈕后,會執(zhí)行一段JavaScript代碼,比如對某些hidden類型的input元素設(shè)值。而使用Enter鍵提交時就不會執(zhí)行這段代碼。

    正確的做法是把這段代碼移到表單標簽<form>中,以onSubmit=”…”屬性引入。

    對于<textarea>表單元素,它會消耗Enter鍵,因此會使得Enter鍵提交失效。可以引入JavaScript代碼捕捉Ctrl+Enter復(fù)合鍵,一旦捕捉到即執(zhí)行表單的submit()方法。對于需要頻繁提交的場合,比如BBS上,這種代碼是很有必要的。

          

    3. 鼠標動作提示和回應(yīng)

     

     

    對用戶的鼠標定位操作,當移動到可響應(yīng)的位置上時,應(yīng)給予視覺或聽覺的提示。

     

     

    動作回應(yīng)的最簡單形式就是鼠標ICON變成手狀。瀏覽器只對具有href屬性的HTML標簽會自動進行這種變換ICON的行為。對于沒有href屬性(或沒有設(shè)置href屬性)的標簽,可以通過JavaScript設(shè)置style屬性的cursorhand

    目標區(qū)域發(fā)生變化是更為主動的響應(yīng)形式。當鼠標指針移到目標區(qū)域,此時指針圖形改變或文字顏色發(fā)生改變均能較大的減輕用戶搜索定位目標區(qū)域的注意力負擔。在按鈕上增添直觀的圖形,盡可能的增大按鈕面積;按鈕間保持適當?shù)木嚯x,太近增加了用戶區(qū)別它們之間界限以防誤操作的負擔,太遠增加了用戶搜索定位按鈕的負擔。

     

     

    4.盡可能早的在客戶端完成輸入數(shù)據(jù)合法性驗證

     

     

    輸入數(shù)據(jù)的合法性檢驗應(yīng)該在客戶端使用JavaScript進行驗證。除非驗證只能在服務(wù)器端完成,否則驗證工作應(yīng)在最早能完成的情況下進行。

     

     

    在客戶端完成數(shù)據(jù)合法性驗證,可以避免一次服務(wù)器請求和回復(fù)通訊,這種通訊是需要用戶等待的,如果用戶等待很長時間后從服務(wù)器返回的結(jié)果提示出現(xiàn)的錯誤是在輸入時即可發(fā)現(xiàn)的,那么這種設(shè)計就是不友好的。諸如密碼長度限制,用戶名允許字符限制等等,顯然應(yīng)該在客戶端提交前就應(yīng)該進行驗證。

     

     

    5. 根據(jù)應(yīng)用場景決定在表單頁面和提交后返回頁面間是否使用中間過渡頁面

     

     

    根據(jù)應(yīng)用場景,決定是否顯示接收表單頁面(表單頁面和提交后返回頁面間的中間過渡頁面),以及使用何種方式顯示接收表單頁面。

     

     

    表單頁面和接收表單頁面是大部分WEB交互操作賴以實現(xiàn)的配合模式。關(guān)于表單頁面和接收表單頁面的相互關(guān)系的設(shè)計,要做如下幾個方面的考慮。

    一,對于需要頻繁操作的場合,從操作便利和快捷性出發(fā),盡可能的減少服務(wù)器和客戶端交互次數(shù),應(yīng)該避免使用中間過渡頁面。提交完畢直接返回原來的表單頁面或默認頁面。在這種情況下要考慮到數(shù)據(jù)安全和可恢復(fù)性。

    如果因為用戶輸入的數(shù)據(jù)不合格,需要重新輸入,那么,去除中間頁面,把錯誤信息直接顯示在原表單頁面上的設(shè)計方式,將是最簡潔的處理方式。用戶只需要根據(jù)錯誤提示進行更正即可。當然這樣做稍微增加了編程負擔。在表單接收頁面上需要包含原表單頁面的內(nèi)容,而且輸入數(shù)據(jù)項都必須用服務(wù)器端代碼或客戶端JavaScript設(shè)置成用戶輸入的值。為了開發(fā)快捷,可以這樣做:表單頁面和接收表單頁面用同一個服務(wù)器端腳本頁面實現(xiàn)。這個頁面按如下流程完成原來兩個頁面的工作:

    頁面腳本初始化

    檢查“提交”變量是否設(shè)置

    已設(shè)置,做數(shù)據(jù)驗證

       ┠驗證通過->業(yè)務(wù)邏輯處理->使用包含頁面方式或重定向方式返回到特定頁面

     

     

       驗證不通過->保存用戶輸入的數(shù)據(jù)->退出表單提交處理到表單頁面流程中

    ┗未設(shè)置,做表單頁面流程,如有來自提交流程中產(chǎn)生的用戶輸入數(shù)據(jù),則顯示出來

     

     

    其中,使用包含頁面方式返回到特定頁面可以避免一次客戶端重定向過程,比客戶端重定向過程還要快捷和穩(wěn)定一些。但是有些情況下因為代碼變量沖突或其他原因,使用包含頁面方式可能并不方便,這時候可以使用服務(wù)器端重定向技術(shù),在ASP里是Server.Transfer方法,在Java Servlet里是RequestDispatcher.forward()方法。不要使用Response.Redirect或者HttpServletResponse.sendRedirect()這種客戶端HTTP重定向方法。不使用中間過渡頁面也就意味著用戶不能后退瀏覽原先已經(jīng)填好的表單頁面,因為使用的是同一個URL。所以在驗證不通過情況下保存用戶輸入的數(shù)據(jù)就是必不可少的。

     

     

    不使用中間過渡頁面帶來的另一個問題就是使用包含頁面方式或服務(wù)器端重定向方式返回會使得URL和頁面內(nèi)容不能一一對應(yīng)。對于用戶可能會直接用這個URL(會收藏這個URL)訪問返回頁面的情況,他會發(fā)現(xiàn)實際上到達的是表單頁面,不是他想要的那個返回結(jié)果頁面。所以,去除中間過渡頁面,確實會帶來URL和內(nèi)容含混不清的情況,因而不適合需要URL和頁面內(nèi)容一一對應(yīng)的場合。

     

     

    二,從技術(shù)角度考慮,使用中間過渡頁面能保證URL和頁面內(nèi)容一一對應(yīng),簡化頁面開發(fā)工作。

     

     

    為了保證頁面內(nèi)容總是和固定的URL聯(lián)系起來,必須使用客戶端重定向:

     

     

               提交                   業(yè)務(wù)邏輯處理  (中間過渡頁面)

     

     

    表單頁面――――->接收表單頁面―――――――――>顯示處理結(jié)果―――>客戶端重定向到特定頁面

     

     

    客戶端重定向分幾種情況:1,使用HTTP Header重定向,Location:http://www.netall.com.cn,這種定向是最快的,在窗口一片空白的情況下就迅速訪問(GET)另一個頁面。這種方式實際上不能顯示處理結(jié)果,只能說是向第一種快速重定向方式的一種折衷處理;2,HTML標簽刷新,<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.netall.com.cn">,這種定向比較友好,在這個頁面加載完畢后訪問另一個頁面。很多設(shè)計者把這個作為一個技巧使用,在載入一個大頁面前放置一個緩沖頁面以避免用戶乏味的等待;3JavaScript重定向。由于是用代碼控制重定向,可以做的更靈活。比如根據(jù)用戶習慣,控制操作完畢后的轉(zhuǎn)向流程。4,被動式的重定向。在頁面上放置按鈕或鏈接,由用戶手動決定返回到特定頁面。這種情況適合于處理結(jié)果的顯示頁面包含相當多的信息,需要用戶仔細瀏覽,而決定下一步的操作。

     

     

    在使用中間過渡頁面的情況下,不能再使用頁面過期失效了。否則一旦出現(xiàn)錯誤,需要用戶重新輸入表單數(shù)據(jù),用戶就不能用后退按鈕恢復(fù)此前填寫的表單數(shù)據(jù)了。除非設(shè)計者有意禁止這種恢復(fù)。

     

     

     

     

    6. 防止表單重復(fù)提交處理

     

     

    對提交按鈕點擊后做變灰處理避免在網(wǎng)絡(luò)響應(yīng)較慢情況下用戶重復(fù)提交同一個表單。使用頁面過期失效避免用戶后退瀏覽重復(fù)提交表單。

     

     

    有些復(fù)雜的應(yīng)用會導(dǎo)致需要較長時間的等待才會返回處理結(jié)果。而在較慢的網(wǎng)絡(luò)環(huán)境中,這種情況更是頻繁發(fā)生。焦急等待的用戶往往會重復(fù)點擊提交按鈕。這種情況是設(shè)計者所不希望看到的。

    使用JavaScript在點擊提交按鈕后使按鈕失效變灰是一個最直接的辦法(根據(jù)原則2這段代碼應(yīng)該放在<form>標簽里onSubmit=”…”做)。此外,在表單頁面上,用服務(wù)器端腳本設(shè)置HTTP HeaderExpires為立即過期可以保證用戶沒辦法使用后退瀏覽恢復(fù)表單頁面。注意這樣做的代價可能是用戶辛辛苦苦填寫很長的內(nèi)容,結(jié)果一旦操作失誤就沒法恢復(fù)。所以應(yīng)該避免在包含<textarea>表單元素的頁面上使用頁面過期失效。

    應(yīng)該說,更嚴格的方法是,服務(wù)器端腳本就應(yīng)該具備抵抗重復(fù)提交的能力。例如,為這個表單分配一個唯一ID或一個使用一次即失效的驗證碼。此外,這個表單處理還應(yīng)具有事務(wù)性質(zhì),如果表單不被接受,所做的改變還是能恢復(fù)的。在金融應(yīng)用場合,重復(fù)提交同一筆交易是肯定不被允許的。能在重復(fù)提交中獲利的一方總是會想辦法繞過瀏覽器的限制,所以不能依賴于客戶端的技術(shù)。

          

    7. 頁面鏈接是打開新窗口、使用原窗口還是彈出窗口的原則

     

     

    一般而言,首頁上鏈接可以使用target=”_blank”屬性打開新窗口,而其他頁面上的鏈接都應(yīng)使用原窗口或彈出窗口。如果鏈接頁面內(nèi)容相對原頁面來說不重要,是附屬性質(zhì)的,可以使用彈出窗口方式。

     

     

    一般情況下應(yīng)該使用原窗口,把是否保留原窗口內(nèi)容的權(quán)利留給用戶。除非設(shè)計者相信原頁面是如此重要,在用戶發(fā)出點擊指令后還有使用上的價值,以至于不能被隨便更新或覆蓋。一般來說,只有首頁才會處于這樣一個地位,用戶在首頁上打開一個鏈接后,一般還會在這個首頁上去打開另一個鏈接。比如首頁包含極多鏈接的門戶網(wǎng)站,或者搜索引擎的搜索結(jié)果頁面。Google.com以前的搜索結(jié)果頁面上的鏈接是使用原窗口的,后來他們意識到用戶會反復(fù)使用這個頁面,而改成打開新窗口了。一般的網(wǎng)站如果首頁鏈接不多,就不必使用新窗口,這是用戶友好的設(shè)計原則。

    上述情形的一個極端情況就是新頁面內(nèi)容比起原頁面內(nèi)容的重要性差很多,以至于都未必需要打開一個新頁面。這時候使用彈出窗口比較合適。用JavaScript彈出窗口有好幾種:一個是window.open()函數(shù)。這里有個技巧。應(yīng)該使用window.open()先打開一個空白窗口,再使用location.replace()用目標頁面替換。這樣做可以避免在打開新頁面的過程中導(dǎo)致原頁面失去響應(yīng)。Window.open()將打開一個新的瀏覽器窗口進程,因此資源消耗比較大。另一個是由微軟DynamicHTML規(guī)范中擴充的方法createPopup()createPopup()可以創(chuàng)建無邊框的彈出窗口,消耗系統(tǒng)資源較小。還有一個就是用頁面中隱藏的層<div>來模擬一個彈出頁面。后兩種可以使用JavaScript代碼填充彈出窗口內(nèi)容。如果需要下載網(wǎng)頁作為其內(nèi)容的話,需要微軟DynamicHTML規(guī)范中的<download>標簽。

     

     

    8. 盡可能少的排列可選項,盡可能少的安排操作步驟

     

     

    根據(jù)用戶操作習慣安排盡可能少的操作菜單選項,同時要保證盡可能少的操作步驟。

     

     

    在不降低功能多樣性的前提下減少菜單項和操作步驟是用戶友好的設(shè)計。要做到這一點很不容易。要從用戶出發(fā)考慮他們最頻繁的操作是什么。正常情況下一個用戶需要的操作總可以歸類為5個以下的種類,如果出現(xiàn)更多的種類,那一定是沒有針對用戶興趣去區(qū)分主次。一個用戶同時有5個以上的強烈興趣中心是難以想像的,走馬觀花似的隨意點擊瀏覽的用戶,是不大可能在某個種類上進行深入的交互操作的。在這5個種類中,每個種類都可能有若干個可操作的二級種類。如果這些二級操作項是不可見的,那么意味著要做兩次選擇才能進入可操作頁面。這就違背了“盡可能少的安排操作步驟”這一原則。如果使用JavaScript制作二級菜單,避免請求服務(wù)器,會好一些。如果二級菜單項總共不超過20個左右,不妨將二級菜單直接顯示出來,比如放在左列一字向下排開,這樣只需要一次選擇到可操作項,更加明了方便。

     

     

    9. 操作邏輯無漏洞,保證數(shù)據(jù)是操作安全的

     

     

    多個頁面間的操作和同個頁面上的多個操作間的邏輯關(guān)系在設(shè)計上是安全和嚴謹?shù)摹1WC不會出現(xiàn)不被允許的用戶操作組合,至少不會因為用戶的不適當?shù)牟僮鲗?dǎo)致出錯。

     

     

    這最典型的表現(xiàn)則是在頁面上廣泛采用的所謂聯(lián)動下拉框設(shè)計。一個下拉框中允許的選項受另一個下拉框中的選擇而變。另外一個例子是根據(jù)選擇使表單元素有效或者失效。如果在多個頁面間也要維持某種合法性邏輯,那么就需要服務(wù)器端腳本的參與。這樣會使表單設(shè)計跟操作有關(guān),應(yīng)該說這不是一個好的設(shè)計。可以通過變更操作步驟順序、組合方式來盡可能避免這種情況出現(xiàn)。

    操作邏輯的設(shè)計既要保證用戶任意的輸入不會導(dǎo)致錯誤,也要保證是用戶輸入的數(shù)據(jù)能購被安全處理。在Session控制下的表單中輸入大幅文字可能會導(dǎo)致超時出錯,這時候往往還伴隨重定向過程,導(dǎo)致用戶的長篇輸入蕩然無存。用JavaScript提醒用戶已超時,請保存輸入后重新提交,是一個好辦法。某些表單元素如<input type=”text”>接受ESC鍵清除數(shù)據(jù),并且無法撤銷,這也是很危險的。在中文輸入法中常常使用ESC鍵清楚輸入的碼位,一旦不小心多按一下ESC就會使得輸入數(shù)據(jù)消失。因此有必要用JavaScript禁用<input><textarea>ESC鍵處理過程。



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=413028

    posted @ 2007-07-31 14:12 重歸本壘(Bing) 閱讀(379) | 評論 (0)編輯 收藏
     

     

    System.out.println("根目錄所對應(yīng)的絕對路徑:" + request.getServletPath() + ""); 
    String strPathFile 
    = request.getSession().getServletContext().getRealPath(request.getRequestURI()); 
    System.out.println(
    "文件的絕對路徑:" + strPathFile + ""); 
    String strDirPath 
    = new File(request.getSession().getServletContext().getRealPath(request.getRequestURI())).getParent(); 
    System.out.println(
    "目錄的絕對路徑:" + strDirPath + ""); 
        this.getServlet().getServletContext().getRealPath("/");//在struts的action中取得當前系統(tǒng)的根目錄

     舉例:http://localhost:7001/myservlet/somepath/test?someparam=somevalue
    request.getPathInfo():返回
    /somepath/test
    request.getRequestURL():返回http:
    //localhost:7001/myservlet/somepath/test
    request.getRequestURI():返回/myservlet/somepath/test
    request.getServletPath():返回
    /myservlet
    request.getQueryString():返回someparam
    =somevalue
        request.getContextPath();  返回項目名/myservlet
    posted @ 2007-07-27 12:23 重歸本壘(Bing) 閱讀(1005) | 評論 (0)編輯 收藏
     
    因為<bean:write 默認的filter是true。表示把html敏感標簽轉(zhuǎn)換成轉(zhuǎn)換成它們實體的等價物。如<轉(zhuǎn)換成&lt。設(shè)為false則不轉(zhuǎn)換。
             <FCK:editor id="classContent" basePath="/ECR_WWW/FCKeditor/"
             width
    ="500"
             height
    ="500"
             skinPath
    ="/ECR_WWW/FCKeditor/editor/skins/silver/"
             
    >
             
             
    <bean:write name="articleAdminForm" property="classContent" filter="false"/>
            
    </FCK:editor>
    posted @ 2007-07-25 10:06 重歸本壘(Bing) 閱讀(1436) | 評論 (0)編輯 收藏
     

    1.下載
    FCKeditor2.3 (FCKeditot for java)
    FCKeditor2.4 (FCKeditor基本文件)
    以下是下載地址:
    http://www.fckeditor.net/download/default.html

    2.建立項目:
    建立項目tomcat/webapps/TestFCKeditor.

    3.將FCKeditor2.4解壓縮
    將FCKeditor2.4解壓縮,將整個目錄FCKeditor復(fù)制到項目的根目錄下,并將解壓縮出來的文件夾fckeditor重命名為FCKeditor
    目錄結(jié)構(gòu)為:tomcat/webapps/TestFCKeditor/FCKeditor
    然后將FCKeditor-2.3.zip(java)壓縮包中\(zhòng)web\WEB-INF\lib\目錄下的兩個jar文件拷到項目的\WEB-INF\ lib\目錄下。把其中的src目錄下的FCKeditor.tld文件copy到TestFCKedit/WEB-INF/下

    4.合并web.xml:
    將FCKeditor-2.3.zip壓縮包中\(zhòng)web\WEB-INF\目錄下的web.xml文件合并到項目的\WEB-INF\目錄下的web.xml文件中。


    5. 修改合并后的web.xml文件
    修改合并后的web.xml文件,將名為SimpleUploader的Servlet的enabled參數(shù)值改為true,
    以允許上傳功能,Connector Servlet的baseDir參數(shù)值用于設(shè)置上傳文件存放的位置。
    在web.xml最后添加標簽定義:

    <taglib>
        <taglib-uri>/TestFCKeditor</taglib-uri>
        <taglib-location>/WEB-INF/FCKeditor.tld</taglib-location>
     </taglib>

    現(xiàn)在的web.xml文件沒有<taglib>標簽了,應(yīng)該直接在jsp文件中使用:<%@ taglib uri="

     

    6. 映射:
    上面文件中兩個servlet的映射分別為:/editor/filemanager/browser/default/connectors/jsp/connector
    和/editor/filemanager/upload/simpleuploader,需要在兩個映射前面加上/FCKeditor,
    即改為/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector和
    /FCKeditor/editor/filemanager/upload/simpleuploader。
    這兩個名字根據(jù)你放在工程中的FCKeditor文件夾名稱而定。。


    7.修改skin文件夾
    進入skin文件夾,如果你想使用fckeditor默認的這種奶黃色,
    那就把除了default文件夾外的另兩個文件夾直接刪除.(建議不刪除,以后要用到其中的一個文件夾)

    8.刪除無用文件
    刪除/FCKeditor/目錄下除fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四個文件以外的所有文件,保留文件夾editor
    刪除目錄/editor/_source,
    刪除/editor/filemanager/browser/default/connectors/下的所有文件
    刪除/editor/filemanager/upload/下的所有文件
    刪除/editor/lang/下的除了fcklanguagemanager.js(我下載的沒有這個文件), en.js, zh.js, zh-cn.js四個文件的所有文件

    9.修改配置:
    打開/FCKeditor/fckconfig.js
    修改 FCKConfig.DefaultLanguage = 'zh-cn' ;
    把FCKConfig.LinkBrowserURL等的值替換成以下內(nèi)容:
    FCKConfig.LinkBrowserURL
    = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;

    FCKConfig.ImageBrowserURL
    = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector" ;

    FCKConfig.FlashBrowserURL
    = FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector" ;

    FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=File' ;
    FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Flash' ;
    FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Image' ;

    10.其它
    fckconfig.js總配置文件,可用記錄本打開,修改后將文件存為utf-8 編碼格式。找到:

    FCKConfig.TabSpaces = 0 ; 改為FCKConfig.TabSpaces = 1 ; 即在編輯器域內(nèi)可以使用Tab鍵。

    如果你的編輯器還用在網(wǎng)站前臺的話,比如說用于留言本或是日記回復(fù)時,那就不得不考慮安全了,
    在前臺千萬不要使用Default的toolbar,要么自定義一下功能,要么就用系統(tǒng)已經(jīng)定義好的Basic,
    也就是基本的toolbar,找到:
    FCKConfig.ToolbarSets["Basic"] = [
    ['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-',
    'Smiley','SpecialChar','Replace','Preview'] ] ;
    這是改過的Basic,把圖像功能去掉,把添加鏈接功能去掉,因為圖像和鏈接和flash和圖像按鈕添加功能都能讓前臺
    頁直接訪問和上傳文件, fckeditor還支持編輯域內(nèi)的鼠標右鍵功能。

    FCKConfig.ContextMenu = ['Generic',/*'Link',*/'Anchor',/*'Image',*/'Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField',
    /*'ImageButton',*/'Button','BulletedList','NumberedList','TableCell','Table','Form'] ;

    這也是改過的把鼠標右鍵的“鏈接、圖像,F(xiàn)LASH,圖像按鈕”功能都去掉。

      找到: FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
    加上幾種我們常用的字體
    FCKConfig.FontNames
    = '宋體;黑體;隸書;楷體_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;


    11.添加文件
    添加文件 /TestFCKeditor/test.jsp:
    <%@ page language="java" import="com.fredck.FCKeditor.*" %>
    <%@ taglib uri="/TestFCKeditor" prefix="FCK" %>
    <script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"></script>

    <%--
    三種方法調(diào)用FCKeditor
    1.FCKeditor自定義標簽 (必須加頭文件 <%@ taglib uri="/TestFCKeditor" prefix="FCK" %> )
    2.script腳本語言調(diào)用 (必須引用 腳本文件 <script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"></script> )
    3.FCKeditor API 調(diào)用 (必須加頭文件 <%@ page language="java" import="com.fredck.FCKeditor.*" %> )
    --%>


    //標簽調(diào)用方式
    <%--
    <form action="show.jsp" method="post" target="_blank">
    <FCK:editor id="content" basePath="/TestFCKeditor/FCKeditor/"
    width="700"
    height="500"
    skinPath="/TestFCKeditor/FCKeditor/editor/skins/silver/"
    toolbarSet = "Default"
    >
    input
    </FCK:editor>
    <input type="submit" value="Submit">
    </form>
    --%>


    //JS調(diào)用方式
    <form action="show.jsp" method="post" target="_blank">
    <table border="0" width="700"><tr><td>
    <textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px">input</textarea>
    <script type="text/javascript">
    var oFCKeditor = new FCKeditor('content') ;
    oFCKeditor.BasePath = "/TestFCKeditor/FCKeditor/" ;
    oFCKeditor.Height = 400;
    oFCKeditor.ToolbarSet = "Default" ;
    oFCKeditor.ReplaceTextarea();
    </script>
    <input type="submit" value="Submit">
    </td></tr></table>
    </form>


    //FCKeditor API 調(diào)用
    <%--
    <form action="show.jsp" method="post" target="_blank">
    <%
    FCKeditor oFCKeditor ;
    oFCKeditor = new FCKeditor( request, "content" ) ;
    oFCKeditor.setBasePath( "/TestFCKeditor/FCKeditor/" ) ;
    oFCKeditor.setValue( "input" );
    out.println( oFCKeditor.create() ) ;
    %>
    <br>
    <input type="submit" value="Submit">
    </form>
    --%>

    添加文件/TestFCKeditor/show.jsp:
    <%
    String content = request.getParameter("content");
    out.print(content);
    %>

     


    12.測試
    瀏覽
    http://localhost:8080/TestFCKeditor/test.jsp


    最后注意。。不同的版本 變量名稱可能不一樣。請參考你使用的API文檔

    配置選項:

    AutoDetectLanguage=true/false 自動檢測語言
    BaseHref="" 相對鏈接的基地址
    ContentLangDirection="ltr/rtl" 默認文字方向
    ContextMenu=字符串數(shù)組,右鍵菜單的內(nèi)容
    CustomConfigurationsPath="" 自定義配置文件路徑和名稱
    Debug=true/false 是否開啟調(diào)試功能,這樣,當調(diào)用FCKDebug.Output()時,會在調(diào)試窗中輸出內(nèi)容
    DefaultLanguage="" 缺省語言
    EditorAreaCss="" 編輯區(qū)的樣式表文件
    EnableSourceXHTML=true/false 為TRUE時,當由可視化界面切換到代碼頁時,把HTML處理成XHTML
    EnableXHTML=true/false 是否允許使用XHTML取代HTML
    FillEmptyBlocks=true/false 使用這個功能,可以將空的塊級元素用空格來替代
    FontColors="" 設(shè)置顯示顏色拾取器時文字顏色列表
    FontFormats="" 設(shè)置顯示在文字格式列表中的命名
    FontNames="" 字體列表中的字體名
    FontSizes="" 字體大小中的字號列表
    ForcePasteAsPlainText=true/false 強制粘貼為純文本
    ForceSimpleAmpersand=true/false 是否不把&符號轉(zhuǎn)換為XML實體
    FormatIndentator="" 當在源碼格式下縮進代碼使用的字符
    FormatOutput=true/false 當輸出內(nèi)容時是否自動格式化代碼
    FormatSource=true/false 在切換到代碼視圖時是否自動格式化代碼
    FullPage=true/false 是否允許編輯整個HTML文件,還是僅允許編輯BODY間的內(nèi)容
    GeckoUseSPAN=true/false 是否允許SPAN標記代替B,I,U標記
    IeSpellDownloadUrl=""下載拼寫檢查器的網(wǎng)址
    ImageBrowser=true/false 是否允許瀏覽服務(wù)器功能
    ImageBrowserURL="" 瀏覽服務(wù)器時運行的URL
    ImageBrowserWindowHeight="" 圖像瀏覽器窗口高度
    ImageBrowserWindowWidth="" 圖像瀏覽器窗口寬度
    LinkBrowser=true/false 是否允許在插入鏈接時瀏覽服務(wù)器
    LinkBrowserURL="" 插入鏈接時瀏覽服務(wù)器的URL
    LinkBrowserWindowHeight=""鏈接目標瀏覽器窗口高度
    LinkBrowserWindowWidth=""鏈接目標瀏覽器窗口寬度
    Plugins=object 注冊插件
    PluginsPath="" 插件文件夾
    ShowBorders=true/false 合并邊框
    SkinPath="" 皮膚文件夾位置
    SmileyColumns=12 圖符窗列數(shù)
    SmileyImages=字符數(shù)組 圖符窗中圖片文件名數(shù)組
    SmileyPath="" 圖符文件夾路徑
    SmileyWindowHeight 圖符窗口高度
    SmileyWindowWidth 圖符窗口寬度
    SpellChecker="ieSpell/Spellerpages" 設(shè)置拼寫檢查器
    StartupFocus=true/false 開啟時FOCUS到編輯器
    StylesXmlPath="" 設(shè)置定義CSS樣式列表的XML文件的位置
    TabSpaces=4 TAB鍵產(chǎn)生的空格字符數(shù)
    ToolBarCanCollapse=true/false 是否允許展開/折疊工具欄
    ToolbarSets=object 允許使用TOOLBAR集合
    ToolbarStartExpanded=true/false 開啟是TOOLBAR是否展開
    UseBROnCarriageReturn=true/false 當回車時是產(chǎn)生BR標記還是P或者DIV標記

    解決上傳亂碼:
    在SimpleUploaderServlet.java和ConnectorServlet.java兩個文件里找到
    DiskFileUpload upload = new DiskFileUpload();
    分別在其后加入 upload.setHeaderEncoding("utf-8");
    這樣解決了文件上傳的中文亂碼問題.
    但是在控制臺顯示的中文內(nèi)容還是亂碼,但是沒關(guān)系,我們沒必要去看控制臺下的中文

    ----------------------------------------------------------------another
    FCKeditor2.4.2 Java版使用說明
    下載地址以及基本配置請參考:http://hi.baidu.com/wain19/blog/item/c33fb0fab74f24dfb48f312d.html

    我的開發(fā)環(huán)境是ubuntu7.04, 系統(tǒng)默認編碼是utf-8,
    期間,本人遇到了下面這些問題:

    問題一:XML request error: Internel Server Error(500)

    出現(xiàn)錯誤的地方是在:點插入圖片,點Browse按鈕的時候:
    XML request error: Internel Server Error(500)

    找資料:http://lamono.javaeye.com/blog/49135
    拷貝xalan.jar和serialize.jar到/WEB-INF/lib,問題解決。

    FCKeditor-java沒有很好的解決中文問題。需要我們修改它的源代碼后重新編譯打包。打包過程如下:
    1。 新建一個web工程名字為FCKeditor-java-2.3,然后把FCKeditor-2.3-java.zip解壓縮后的代碼拷貝到工程目錄下。
    2。如果是用的Eclipse,使用快捷鍵Ctrl+Shift+R
    在SimpleUploaderServlet.java和ConnectorServlet.java兩個文件里找到
    DiskFileUpload upload = new DiskFileUpload();
    分別在其后加入 upload.setHeaderEncoding("utf-8");
    現(xiàn)在如果直接運行ant任務(wù),會報下面的錯誤:
    taskdef class org.apache.catalina.ant.DeployTask cannot be found

    3。 把tomcat安裝目錄下/server/lib中的catalina-ant.jar拷貝到/WEB-INF/lib目錄 下。
    4。 打開build.xml
    找到
    <property name="catalina.home"
    修改成你自己的tomcat安裝目錄
    <property name="catalina.home"         value="/home/uniquejava/tool/tomcat5028/"/>
    找到
    <taskdef name="deploy"
    修改成如下內(nèi)容
         <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
            <classpath refid="compile.classpath">
            </classpath>
        </taskdef>
        <taskdef name="list" classname="org.apache.catalina.ant.ListTask">
            <classpath refid="compile.classpath">
            </classpath>
        </taskdef>
        <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
            <classpath refid="compile.classpath">
            </classpath>
        </taskdef>
        <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask">
            <classpath refid="compile.classpath">
            </classpath>
        </taskdef>

    運行ant任務(wù)dist, 就可以生成新的FCKeditor-2.3.jar包

    問題三: 上傳時新建的中文目錄全部亂碼。 雖然上傳到服務(wù)器上的文件名正常,但在JSP頁面點下載鏈接時文件名亂碼導(dǎo)致不能正常下載。

    查找資料:TOMCAT 鏈接參數(shù)有中文時,亂碼解決方法
        <Connector port="8080"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" redirectPort="8443" acceptCount="100"
                   debug="0" connectionTimeout="20000"
                   disableUploadTimeout="true" URIEncoding="utf-8" />
                  
        <Connector port="8009"
                   enableLookups="false" redirectPort="8443" debug="0"
                   protocol="AJP/1.3" URIEncoding="utf-8" />
                  
    方法二:
    使用useBodyEncodingForURI="true". 這個方法適合你的TOMCAT實例下需要跑多個不同Encoding的程序時。(有點懷疑?!)
    <... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
          connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" />

         enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" /

    我只試了方法一,問題解決!

    這樣, FCKeditor終于可以正常使用了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    =================================================================
    以下為個人原創(chuàng)
    http://blog.csdn.net/nickshen3/
    怎么將FCKeditor2.4使用在自己的web中。
    1. 在webapps創(chuàng)建test文件夾。webapps\test
    2. 將下載的FCKeditor2.3的Java包FCKeditor-2.3.zip解壓縮,并將web文件夾下的兩個文件夾_samples,WEB-INF拷貝到剛才建立的webapps\test下。再將src文件夾下的FCKeditor.tld拷貝到WEB-INF下。
    3. 在webapps\test\下建立文件夾FCKeditor 。
    4. 將剛才下載的 FCKeditor_2.4.3.zip 解壓縮,然后將fckeditor文件夾下的 editor(文件夾),fckconfig.js,fckeditor.js,fckstyles.xml,fcktemplates.xml。四個文件拷貝到剛才建立的文件夾FCKeditor下。
    5.修改test\_samples\jsp\sample02.jsp文件,將原來的
           <FCK:editor id="EditorDefault" basePath="/FCKeditor/"
    改為<FCK:editor id="EditorDefault" basePath="/test/FCKeditor/"。以后使用的時候只需將test換成項目的名稱即可。
    6.打開tomcat。測試Http://localhost:8080/test/_samples/jsp/sample02.jsp
    ok。

    另外 :  http://www.tkk7.com/youxia/archive/2007/03/15/104077.html 

    posted @ 2007-07-24 17:58 重歸本壘(Bing) 閱讀(1743) | 評論 (1)編輯 收藏
    僅列出標題
    共12頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
     
    Web Page Rank Icon
    主站蜘蛛池模板: 最新国产成人亚洲精品影院| 亚洲中文字幕无码爆乳av中文| 亚洲国产精品成人精品无码区| 精品国产日韩亚洲一区91| 中文字幕无码视频手机免费看 | 黄网站色视频免费看无下截| 麻豆精品国产免费观看| 一本色道久久88亚洲精品综合| 女人18一级毛片免费观看| 亚洲国产无线乱码在线观看| 免费人妻无码不卡中文字幕18禁| 麻豆一区二区三区蜜桃免费| 国产亚洲精品自在线观看| 免费人成毛片动漫在线播放| 久久亚洲国产成人精品性色| 18观看免费永久视频| 一本天堂ⅴ无码亚洲道久久| 亚洲?V乱码久久精品蜜桃| 91精品全国免费观看青青| 亚洲首页在线观看| 免费观看理论片毛片| 一级一黄在线观看视频免费| 亚洲av女电影网| 最近的中文字幕大全免费版| 免费人人潮人人爽一区二区| 亚洲精品白浆高清久久久久久| 最近免费中文字幕mv在线电影 | 亚洲AV永久纯肉无码精品动漫| 亚洲综合免费视频| 国产精品亚洲一区二区在线观看| 亚洲一区二区三区乱码A| 最近2019中文字幕免费大全5| 在线观看亚洲AV日韩A∨| 亚洲一区视频在线播放| 国产精品免费精品自在线观看| 青青青亚洲精品国产| 精品亚洲A∨无码一区二区三区| 四虎免费大片aⅴ入口| 黄色免费在线网站| 国产精品手机在线亚洲| 亚洲一区二区三区日本久久九|