因此,在VelocityConfigurer中配置的屬性會(huì)覆蓋configLocation指定文件中的屬性
2、調(diào)用HttpServletResponse.flushBuffer()
3、調(diào)用HttpServletResponse.getOutputStream().flush()或者HttpServletResponse.getWriter().flush()
4、調(diào)用HttpServletResponse.sendError()或者HttpServletResponse.sendRedirect()
}
- 類(lèi)圖之間的關(guān)系 依賴(lài)和關(guān)聯(lián)關(guān)系:
- 用例圖之間的關(guān)系: 包含、泛化、擴(kuò)展
依賴(lài):是類(lèi)與類(lèi)之間的連接,表示一個(gè)類(lèi)依賴(lài)于另一個(gè)類(lèi)的定義。例如如果A依賴(lài)于B,則B體現(xiàn)為局部變量,方法的參數(shù)、或靜態(tài)方法的調(diào)用。
關(guān)聯(lián):類(lèi)與類(lèi)之間的聯(lián)接,它使一個(gè)類(lèi)知道另一個(gè)類(lèi)的屬性和方法, 具體表現(xiàn)為類(lèi)的成員變量中包含某個(gè)對(duì)象
組合和聚合:
在有整體和部分關(guān)系是才有組合和聚合的概念,屬于關(guān)聯(lián)關(guān)系
組合:部分離開(kāi)整體不能存在
聚合:部分可以離開(kāi)整體而存在
包含:當(dāng)兩個(gè)或多個(gè)用例中共用一組相同的動(dòng)作,這時(shí)可以將這組相同的動(dòng)作抽出來(lái)作為一個(gè)獨(dú)立的子用例,供多個(gè)基用例所共享。因?yàn)樽佑美怀槌觯美⒎且粋€(gè)完整的用例,所以include關(guān)系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執(zhí)行
泛化:繼承關(guān)系,子用例將繼承基用例的所有行為 ,也就是說(shuō)在任何使用基用例的地方都可以用子用例來(lái)代替。領(lǐng)導(dǎo)擁有審批的權(quán)限,而請(qǐng)假申請(qǐng)審批、加班申請(qǐng)審批都是審批的子類(lèi)
擴(kuò)展:對(duì)基用例的擴(kuò)展,基用例是一個(gè)完整的用例,即使沒(méi)有子用例的參與,也可以完成一個(gè)完整的功能。
http://my.so-net.net.tw/idealist/OSWorkflow/
wfentry表中的state字段來(lái)自于接口WorkflowEntry,有如下幾個(gè)值:
我們知道osworkflow提供的Workflow實(shí)現(xiàn)(如:BasicWorkflow)有時(shí)并不能滿(mǎn)足業(yè)務(wù)的需要,因此我們可以實(shí)現(xiàn)自己的Workflow,具體可以參照BasicWorkflow
繼承AbstractWorkflow,接著加入自己想要的方法。同理,我們可以通過(guò)繼承相應(yīng)的WorkflowStore(如:HibernateWorkflowStore)來(lái)編寫(xiě)自己的方法
DateFormat
SimplateDateFormat
2、數(shù)字格式化
NumberFormat
DecimalFormat
3、字符串格式化:
MessageFormat 以{0},{1}作為占位符,如果你的pattern中有兩個(gè)以上的{0},在format時(shí)都會(huì)用第一個(gè)參數(shù)替換
String.format 以%s作為占位符,按傳入的參數(shù)一一匹配
語(yǔ)音/視頻:FMS,red5
A (bin) templates/translate/screen/selectTransLang.vm
請(qǐng)看官方文檔的解釋?zhuān)?br />
當(dāng)你第一次添加或者導(dǎo)入文件到Subversion中時(shí),Subversion會(huì)檢測(cè)該文件是否是二進(jìn)制文件。目前,Subversion的策略是只檢測(cè)文件的前1024個(gè)字節(jié);如果所有字節(jié)都是0,或者超過(guò)15%都是非ASCII碼輸出字符的話(huà),那么Subversion就認(rèn)定該文件是二進(jìn)制文件。
如果Subversion認(rèn)定文件是二進(jìn)制文件,那么這個(gè)文件就會(huì)自動(dòng)添加svn:mime-type屬性,并設(shè)置為“application/octet-stream”。(你隨時(shí)可以使用auto-props特性來(lái)重寫(xiě)這樣的行為,或者使用svn propset手動(dòng)設(shè)置屬性。)
Subversion對(duì)以下的文件做普通文本處理:
1、沒(méi)有設(shè)置svn:mime-type屬性的文件
2、文件的svn:mime-type屬性值以“text/”開(kāi)頭
3、文件的svn:mime-type屬性值等于“image/x-xbitmap”
4、文件的svn:mime-type屬性值等于“image/x-xpixmap”
所有其他文件都將被視為二進(jìn)制文件處理,這意味著Subversion:
1、不會(huì)嘗試在svn update或者svn merge操作時(shí)將遠(yuǎn)程修改合并到本地中
2、在svn diff中不會(huì)顯示出不同
3、在svn blame不會(huì)每行顯示版本和作者信息
在其他方面,Subversion將二進(jìn)制文件和其他文本文件一樣對(duì)待
需要注意,不管是不是二進(jìn)制文件,都不會(huì)影響版本庫(kù)中用來(lái)存儲(chǔ)文件變更的空間大小,也不會(huì)影響客戶(hù)端和服務(wù)端之間的通訊量。出于存儲(chǔ)和傳輸考慮,Subversion使用的是對(duì)二進(jìn)制文件和普通文本文件一致處理的diffing方法;這和‘svn diff’使用的diffing方法完全不相關(guān)。
好了,我們來(lái)看看剛才加的文件是否為二進(jìn)制:
進(jìn)入.svn/props 發(fā)現(xiàn)生成文件:selectTransLang.vm.svn-work
內(nèi)容如下:
K 13
svn:mime-type
V 24
application/octet-stream
END
或者用如下方法
svn propget svn:mime-type selectTransLang.vm
輸出:application/octet-stream
解決方法,直接編輯去掉這個(gè)屬性
svn propedit svn:mime-type selectTransLang.vm
或者刪除.svn/props/selectTransLang.vm.svn-work
看看網(wǎng)上其他牛人的解決方法:
修改~/.subversion/config
找到最后一個(gè)section,在最后加上如下一行話(huà):
*.txt = svn:mime-type=text/plain;svn:eol-style=native
光這個(gè)還不夠,向上搜索到這么一行
# enable-auto-props = yes
把前面用來(lái)注釋這行的那個(gè)#和其后的空格去掉
如果用的是TortoiseSVN,開(kāi)始菜單 -> TortoiseSVN -> Settings -> General,此時(shí)右側(cè)有一個(gè)名為Edit的按鈕,點(diǎn)擊之后就可以編輯config了
xsteam:java對(duì)象和xml之間相互轉(zhuǎn)換
1、如果按字符截取會(huì)導(dǎo)致中英文顯示的長(zhǎng)度不一
2、如果按字節(jié)截取可能會(huì)導(dǎo)致最后一個(gè)中文截成兩部分
以下代碼是在網(wǎng)上獲取并經(jīng)過(guò)改造而成,能夠很好的解決上面兩個(gè)問(wèn)題
/**
* 根據(jù)指定字節(jié)數(shù)截取字符串,當(dāng)指定處為中文第一個(gè)字節(jié)時(shí)少截取一個(gè)字符,當(dāng)長(zhǎng)度大于指定截取長(zhǎng)度時(shí),截取后在字符串末尾追加指定字符串<br/>
* 這里添加了字符串的編碼,因?yàn)轫?yè)面的編碼不同,字符串所占字節(jié)也不同
*
* @param str 待截取字符串,如果為null或者"",則立即返回str
* @param length 需要截取的長(zhǎng)度
* @param endStr 截取后末尾追加的字符串
* @param charset 待截取字符串的編碼
* @return
*/
public String subStringByByte(String str, int length, String endStr, String charset) {
if (str == null || "".equals(str.trim()) || length <= 0) {
return str;
}
try {
int strlen = str.getBytes(charset).length;// 這里要和頁(yè)面的編碼相關(guān)
if (strlen < length) return str;
Pattern p = Pattern.compile("^[""u4e00-""u9fa5]$");
int i = 0, j = 0;
int sublength = length - ((endStr == null) ? 0 : endStr.getBytes(charset).length);
for (char c : str.toCharArray()) {
Matcher m = p.matcher(String.valueOf(c));
i += m.find() ? 2 : 1;
++j;
if (i == sublength) break;
if (i > sublength) {
--j;
break;
}
}
return str.substring(0, j) + endStr;
} catch (UnsupportedEncodingException e) {
return str;
}
}
英文不太好,經(jīng)常忘記,所以現(xiàn)在寫(xiě)下來(lái):
1,transient:在序列化一個(gè)類(lèi)時(shí),如果類(lèi)中某個(gè)字段不想被序列化,則使用此關(guān)鍵字
2、volatile:用于線(xiàn)程同步時(shí)
JVM生成的所有新對(duì)象放在新域中。一旦對(duì)象經(jīng)歷了一定數(shù)量的垃圾收集循環(huán)后,便進(jìn)入舊域。而在永久域中是用來(lái)存儲(chǔ)JVM自己的反射對(duì)象的,如class 和method對(duì)象,而且GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)永久域進(jìn)行清理。其中新域和舊域?qū)儆诙眩谰糜蚴且粋€(gè)獨(dú)立域并且不認(rèn)為是堆的一部分
一、java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱(chēng)是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,
這塊內(nèi)存主要是被
JVM存放Class和Method信息的,Class在被Loader時(shí)就會(huì)被放到PermGen space中,
它和存放類(lèi)實(shí)例
(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)
PermGen
space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS的話(huà),就很可能出現(xiàn)PermGen space錯(cuò)誤,
這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)
JSP進(jìn)行pre compile(預(yù)編譯)的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小
超過(guò)了jvm默認(rèn)的大小(4M)那么就會(huì)
產(chǎn)生此錯(cuò)誤信息了。
解決方法: 手動(dòng)設(shè)置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:
$CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M
-XX:MaxPermSize=128m
建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣可以達(dá)到減少
jar 文檔重復(fù)占用內(nèi)存的目的。
二、java.lang.OutOfMemoryError: Java heap space
Heap size 設(shè)置
JVM堆
的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,
其初始空間(即
-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可
進(jìn)行設(shè)
置。Heap size 的大小是Young Generation 和Tenured Generaion 之和(新域和舊域之和)。
提示:在JVM中如果98%
的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?br />
提示:Heap Size
最大不要超過(guò)可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
解決方法:手動(dòng)設(shè)置
Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using
CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m
-Xmx800m -XX:MaxNewSize=256m"
動(dòng)態(tài)應(yīng)用,是相對(duì)于網(wǎng)站靜態(tài)內(nèi)容而言, 是指以c/c++、php、Java、perl、.net等 服務(wù)器端語(yǔ)言開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用軟件,比如論壇、網(wǎng)絡(luò)相冊(cè)、交友、BLOG等常見(jiàn)應(yīng)用。動(dòng)態(tài)應(yīng)用系統(tǒng)通 常與數(shù)據(jù)庫(kù)系統(tǒng)、緩存系統(tǒng)、分布式存儲(chǔ)系統(tǒng)等密不可分。
大型動(dòng)態(tài)應(yīng)用系統(tǒng)平臺(tái)主要是針對(duì)于大流 量、高并發(fā)網(wǎng)站建立的底層系統(tǒng)架構(gòu)。大型網(wǎng)站的運(yùn)行需要一個(gè)可靠、安全、可擴(kuò)展、易維護(hù)的應(yīng)用系統(tǒng)平臺(tái)做為支撐,以保證網(wǎng)站應(yīng)用的平穩(wěn)運(yùn)行。
大型動(dòng)態(tài)應(yīng)用系統(tǒng)又可分為幾個(gè)子系統(tǒng):
l Web前端系統(tǒng)
l 負(fù)載均衡系統(tǒng)
l 數(shù)據(jù)庫(kù)集群系統(tǒng)
l 緩存系統(tǒng)
l 分布式存儲(chǔ)系統(tǒng)
l 分布式服務(wù)器管理系統(tǒng)
l 代碼分發(fā)系統(tǒng)
Web前端系統(tǒng)
結(jié)構(gòu)圖:

為了達(dá)到不同應(yīng)用的服務(wù)器共享、避免單點(diǎn)故障、集中管理、統(tǒng)一配置等目的,不以應(yīng)用劃分服 務(wù)器,而是將所有服務(wù)器做統(tǒng)一使用,每臺(tái)服務(wù)器都可以對(duì)多個(gè)應(yīng)用提供服務(wù),當(dāng)某些應(yīng)用訪(fǎng)問(wèn)量升高時(shí),通過(guò)增加服務(wù)器節(jié)點(diǎn)達(dá)到整個(gè)服務(wù)器集群的性能提高,同 時(shí)使他應(yīng)用也會(huì)受益。該Web前端系統(tǒng)基于A(yíng)pache/Lighttpd/Eginx等 的虛擬主機(jī)平臺(tái),提供PHP程序運(yùn)行環(huán)境。服務(wù)器對(duì)開(kāi)發(fā)人員是透明的,不需要開(kāi)發(fā)人員介入服務(wù)器管理
負(fù)載均衡系統(tǒng)

負(fù)載均衡系統(tǒng)分為硬件和軟件兩種。硬件負(fù)載均衡效率高,但是價(jià)格貴,比如F5等。軟件負(fù)載均衡系統(tǒng)價(jià)格較低或者免費(fèi),效率較硬件負(fù)載均衡系統(tǒng) 低,不過(guò)對(duì)于流量一般或稍大些網(wǎng)站來(lái)講也足夠使用,比如lvs,nginx。大多數(shù)網(wǎng)站都是硬件、軟件負(fù)載均衡系統(tǒng)并用。
數(shù)據(jù)庫(kù)集群系統(tǒng)
結(jié)構(gòu)圖:

由于Web前端采用了負(fù)載均衡集群結(jié)構(gòu)提高了服務(wù)的有效性和擴(kuò)展性,因此數(shù)據(jù)庫(kù)必須也是高可靠的才能保證整個(gè)服務(wù)體系的高可靠性,如何構(gòu)建一個(gè)高可靠的、可以提供大規(guī)模并發(fā)處理的數(shù)據(jù)庫(kù)體系?
我們可以采用如上圖所示的方案:
1) 使用 MySQL 數(shù)據(jù)庫(kù),考慮到Web應(yīng)用的數(shù)據(jù)庫(kù)讀多寫(xiě)少的特點(diǎn),我們主要對(duì)讀數(shù)據(jù)庫(kù)做了優(yōu)化,提供專(zhuān)用的讀數(shù)據(jù)庫(kù)和寫(xiě)數(shù)據(jù)庫(kù),在應(yīng)用程序中實(shí)現(xiàn)讀操作和寫(xiě)操作分別訪(fǎng)問(wèn)不同的數(shù)據(jù)庫(kù)。
2) 使用 MySQL Replication 機(jī)制實(shí)現(xiàn)快速將主庫(kù)(寫(xiě)庫(kù))的數(shù)據(jù)庫(kù)復(fù)制到從庫(kù)(讀庫(kù))。一個(gè)主庫(kù)對(duì)應(yīng)多個(gè)從庫(kù),主庫(kù)數(shù)據(jù)實(shí)時(shí)同步到從庫(kù)。
3) 寫(xiě)數(shù)據(jù)庫(kù)有多臺(tái),每臺(tái)都可以提供多個(gè)應(yīng)用共同使用,這樣可以解決寫(xiě)庫(kù)的性能瓶頸問(wèn)題和單點(diǎn)故障問(wèn)題。
4) 讀數(shù)據(jù)庫(kù)有多臺(tái),通過(guò)負(fù)載均衡設(shè)備實(shí)現(xiàn)負(fù)載均衡,從而達(dá)到讀數(shù)據(jù)庫(kù)的高性能、高可靠和高可擴(kuò)展性。
5) 數(shù)據(jù)庫(kù)服務(wù)器和應(yīng)用服務(wù)器分離。
6) 從數(shù)據(jù)庫(kù)使用BigIP做負(fù)載均衡。
緩存系統(tǒng)

緩存分為文件緩存、內(nèi)存緩存、數(shù)據(jù)庫(kù)緩存。在大型Web應(yīng)用中使用最多且效率最高的是內(nèi)存緩存。最常用的內(nèi)存緩存工具是Memcachd。使用正確的緩存系統(tǒng)可以達(dá)到實(shí)現(xiàn)以下目標(biāo):
1、 使用緩存系統(tǒng)可以提高訪(fǎng)問(wèn)效率,提高服務(wù)器吞吐能力,改善用戶(hù)體驗(yàn)。
2、 減輕對(duì)數(shù)據(jù)庫(kù)及存儲(chǔ)集服務(wù)器的訪(fǎng)問(wèn)壓力
3、Memcached服務(wù)器有多臺(tái),避免單點(diǎn)故障,提供高可靠性和可擴(kuò)展性,提高性能。
分布式存儲(chǔ)系統(tǒng)
結(jié)構(gòu)圖:

WEB系統(tǒng)平臺(tái)中的存儲(chǔ)需求有下面兩個(gè)特點(diǎn):
1) 存儲(chǔ)量很大,經(jīng)常會(huì)達(dá)到單臺(tái)服務(wù)器無(wú)法提供的規(guī)模,比如相冊(cè)、視頻等應(yīng)用。因此需要專(zhuān)業(yè)的大規(guī)模存儲(chǔ)系統(tǒng)。
2) 負(fù)載均衡cluster中的每個(gè)節(jié)點(diǎn)都有可能訪(fǎng)問(wèn)任何一個(gè)數(shù)據(jù)對(duì)象,每個(gè)節(jié)點(diǎn)對(duì)數(shù)據(jù)的處理也能被其他節(jié)點(diǎn)共享,因此這些節(jié)點(diǎn)要操作的數(shù)據(jù)從邏輯上看只能是一個(gè)整體,不是各自獨(dú)立的數(shù)據(jù)資源。
因此高性能的分布式存儲(chǔ)系統(tǒng)對(duì)于大型網(wǎng)站應(yīng)用來(lái)說(shuō)是非常重要的一環(huán)。(這個(gè)地方需要加入對(duì)某個(gè)分布式存儲(chǔ)系統(tǒng)的簡(jiǎn)單介紹。)
分布式服務(wù)器管理系統(tǒng)
結(jié)構(gòu)圖:

隨著網(wǎng)站訪(fǎng)問(wèn)流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對(duì)外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,原來(lái)基于單機(jī)的服務(wù)器管理模式已經(jīng)不能夠滿(mǎn)足我們的需求,新的需求必須能夠集中式的、分組的、批量的、自動(dòng)化的對(duì)服務(wù)器進(jìn)行管理,能夠批量化的執(zhí)行計(jì)劃任務(wù)。
在分布式服務(wù)器管理系統(tǒng)軟件中有一些比較優(yōu)秀的軟件,其中比較理想的一個(gè)是 Cfengine。它可以對(duì)服務(wù)器進(jìn)行分組,不同的分組可以分別定制系統(tǒng)配置文件、計(jì)劃任務(wù)等配置。它是基于C/S 結(jié)構(gòu)的,所有的服務(wù)器配置和管理腳本程序都保存在Cfengine Server上,而被管理的服務(wù)器運(yùn)行著 Cfengine Client 程序,Cfengine Client通過(guò)SSL加密的連接定期的向服務(wù)器端發(fā)送請(qǐng)求以獲取最新的配置文件和管理命令、腳本程序、補(bǔ)丁安裝等任務(wù)。
有了Cfengine 這種集中式的服務(wù)器管理工具,我們就可以高效的實(shí)現(xiàn)大規(guī)模的服務(wù)器集群管理,被管理服務(wù)器和 Cfengine Server 可以分布在任何位置,只要網(wǎng)絡(luò)可以連通就能實(shí)現(xiàn)快速自動(dòng)化的管理。
代碼發(fā)布系統(tǒng)
結(jié)構(gòu)圖:

隨著網(wǎng)站訪(fǎng)問(wèn)流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對(duì)外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,為了滿(mǎn)足集群環(huán)境下程序代碼的批量分發(fā)和更新,我們還需要一個(gè)程序代碼發(fā)布系統(tǒng)。
這個(gè)發(fā)布系統(tǒng)可以幫我們實(shí)現(xiàn)下面的目標(biāo):
1) 生產(chǎn)環(huán)境的服務(wù)器以虛擬主機(jī)方式提供服務(wù),不需要開(kāi)發(fā)人員介入維護(hù)和直接操作,提供發(fā)布系統(tǒng)可以實(shí)現(xiàn)不需要登陸服務(wù)器就能把程序分發(fā)到目標(biāo)服務(wù)器。
2) 我們要實(shí)現(xiàn)內(nèi)部開(kāi)發(fā)、內(nèi)部測(cè)試、生產(chǎn)環(huán)境測(cè)試、生產(chǎn)環(huán)境發(fā)布的4個(gè)開(kāi)發(fā)階段的管理,發(fā)布系統(tǒng)可以介入各個(gè)階段的代碼發(fā)布。
3) 我們需要實(shí)現(xiàn)源代碼管理和版本控制,SVN可以實(shí)現(xiàn)該需求。
這里面可以使用常用的工具Rsync,通過(guò)開(kāi)發(fā)相應(yīng)的腳本工具實(shí)現(xiàn)服務(wù)器集群間代碼同步分發(fā)。
將一個(gè)命令的輸出作為下一個(gè)命令的輸入
例:ls | grep text --這個(gè)命令將查找當(dāng)前目錄下名稱(chēng)中包含text的目錄或者文件
xargs:
將一個(gè)命令的輸入作為下一個(gè)命令的參數(shù)
例:ls | xargs grep -i text --這個(gè)命令將當(dāng)前目下的所有文件作為參數(shù)傳遞給grep來(lái)查找文件中是否包含"text"
find . | xargs grep "user" --查詢(xún)當(dāng)前目錄及其子目錄下所有內(nèi)容中包含"user"的文件
sql server:select top 10 * from 表名 order by newid();
oracle:select * from(select * from 表名 order by dbms_random.value) where rownum<=20;
access:select top 10 * from 表名 order by rnd(ID)
html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
需要最新網(wǎng)頁(yè)標(biāo)準(zhǔn)支持:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
Flash要在object標(biāo)簽中加入如下代碼:
<param value="false" name="menu"/>
<param value="opaque" name="wmode"/>
1、下載wamp5,安裝wamp5,如需更改端口請(qǐng)修改Apache配置文件,更改端口(如:8888)后還需要更改wamp根目錄wampmanager.ini文件中的以下地方
Type: item; Caption: "Localhost"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/"; Glyph: 5
Type: item; Caption: "phpMyAdmin"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/phpmyadmin/"; Glyph: 5
Type: item; Caption: "SQLiteManager"; Action: run; FileName: "C:\WINDOWS\explorer.exe"; Parameters: "http://localhost:8888/sqlitemanager/"; Glyph: 5
2、安裝后訪(fǎng)問(wèn)首頁(yè)http://localhost:8888,點(diǎn)擊phpinfo()查看php信息,如果只顯示如下信息:
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
查看php目錄下的php.ini文件,沒(méi)有[Zend]塊,表明ZendOptimizer沒(méi)有安裝
3、下載ZendOptimizer,安裝路徑選擇D:\Program Files\Zend,選擇apache2.x及php.ini的位置,安裝完成后php.ini最后會(huì)添加以下內(nèi)容:
[Zend]
zend_extension_manager.optimizer_ts="D:\Program Files\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0"
zend_extension_ts="D:\Program Files\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll"
4、訪(fǎng)問(wèn)http://loalhost:8888/ppframe進(jìn)行ppframe的安裝,安裝成功后登陸后臺(tái),如果沒(méi)有安裝ZendOptimizer,左側(cè)的exam是打不開(kāi)的,但是passport可以打開(kāi)。
1、如果頁(yè)面有<base/>標(biāo)簽的則要在js引入后再添加<base target="_self" />;
2、在<script/>中添加屬性defer="defer";
比如java向txt文件中寫(xiě)入新的一行時(shí),java獲得文本輸入框中的新行時(shí)等
Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“\r”;
Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車(chē)>”,即“\r\n”;
Mac系統(tǒng)里,每行結(jié)尾是“<回車(chē)>”,即“\n”。
一個(gè)直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開(kāi)的話(huà),所有文字會(huì)變成一行;
而Windows里的文件在Unix/Mac下打開(kāi)的話(huà),在每行的結(jié)尾可能會(huì)多出一個(gè)^M符號(hào)。
如果已經(jīng)配置mysql的環(huán)境變量,請(qǐng)直接執(zhí)行:mysql -u 輸入用戶(hù)名 -p 回車(chē) 之后輸入密碼
如果未配置環(huán)境變量請(qǐng)先進(jìn)入mysql的bin目錄下
執(zhí)行如下語(yǔ)句導(dǎo)入:source 輸入sql文件的位置
執(zhí)行如下語(yǔ)句導(dǎo)出:mysqldump -u輸入用戶(hù)名 -p輸入密碼 數(shù)據(jù)庫(kù)名 表名 >文件名.sql
1、安裝jdk --> D:\Program Files\Java\jdk1.5.0
2、配置JAVA_HOME --> D:\Program Files\Java\jdk1.5.0
3、解壓tomcat5.5 --> D:\Program Files\Apache Software Foundation\Tomcat 5.5
4、打開(kāi)cmd,進(jìn)入到tomcat5.5bin目錄 --> D:\Program Files\Apache Software Foundation\Tomcat 5.5\bin>
5、執(zhí)行命令:service install tomcat
執(zhí)行結(jié)果為:
Installing the service 'tomcat' ...
Using CATALINA_HOME: D:\Program Files\Apache Software Foundation\Tomcat 5.5
Using CATALINA_BASE: D:\Program Files\Apache Software Foundation\Tomcat 5.5
Using JAVA_HOME: D:\Program Files\Java\jdk1.5.0
Using JVM: D:\Program Files\Java\jdk1.5.0\jre\bin\server\jvm.dll
The service 'tomcat' has been installed.
此時(shí)產(chǎn)生名為:Apache Tomcat tomcat 的服務(wù)
6、卸載命令:service remove tomcat
執(zhí)行結(jié)果為:
The service 'tomcat' has been removed
@echo off
rem 這段代碼的作用是對(duì)mysql進(jìn)行查詢(xún)操作,并將查詢(xún)結(jié)果寫(xiě)入到result.txt文件中
echo %TIME%
set errorlevel=0
set path_bin_mysql="D:\Program Files\mysql_1\bin\mysql"
set host=localhost
set port=3308
set database_mysql=mysql
set user_mysql=root
set password_mysql=admin
%path_bin_mysql% -u%user_mysql% -p%password_mysql% -h%host% -P%port% %database_mysql%< test.sql >
result.txt
pause
1、程序
程序開(kāi)發(fā)是一方面,系統(tǒng)架構(gòu)設(shè)計(jì)(硬件+網(wǎng)絡(luò)+軟件)是另一方面。
軟件架構(gòu)方面,做網(wǎng)站首先需要很多web服務(wù)器存儲(chǔ)靜態(tài)資源,比如圖片、視頻、靜態(tài)頁(yè)等,千萬(wàn)不要把靜態(tài)資源和應(yīng)用服務(wù)器放在一起。
一個(gè)好的程序員寫(xiě)出來(lái)的程序會(huì)非常簡(jiǎn)潔、性能很好,一個(gè)初級(jí)程序員可能會(huì)犯很多低級(jí)錯(cuò)誤,這也是影響網(wǎng)站性能的原因之一。
網(wǎng)站要做到效率高,不光是程序員的事情,數(shù)據(jù)庫(kù)優(yōu)化、程序優(yōu)化這是必須的,在性能優(yōu)化上要數(shù)據(jù)庫(kù)和程序齊頭并進(jìn)!緩存也是兩方面同時(shí)入手。第一,數(shù)據(jù)庫(kù)緩存和數(shù)據(jù)庫(kù)優(yōu)化,這個(gè)由dba完成(而且這個(gè)有非常大的潛力可挖,只是由于我們都是程序員而忽略了他而已)。第二,程序上的優(yōu)化,這個(gè)非常的有講究,比如說(shuō)重要一點(diǎn)就是要規(guī)范SQL語(yǔ)句,少用in 多用or,多用preparestatement,另外避免程序冗余如查找數(shù)據(jù)少用雙重循環(huán)等。另外選用優(yōu)秀的開(kāi)源框架加以支持,我個(gè)人認(rèn)為中后臺(tái)的支持是最最重要的,可以選取spring+ibatis。因?yàn)閕batis直接操作SQL并有緩存機(jī)制。spring的好處就不用我多說(shuō)了,IOC的機(jī)制可以避免new對(duì)象,這樣也節(jié)省開(kāi)銷(xiāo)。據(jù)我分析,絕大部分的開(kāi)銷(xiāo)就是在NEW的時(shí)候和連接數(shù)據(jù)庫(kù)時(shí)候產(chǎn)生的,請(qǐng)盡量避免。另外可以用一些內(nèi)存測(cè)試工具來(lái)做一個(gè)demo說(shuō)明hibernate和ibatis誰(shuí)更快!前臺(tái)你想用什么就用什么,struts,webwork都成,如果覺(jué)得自己挺牛X可以試試tapestry。
用數(shù)據(jù)庫(kù)也未必不能解決訪(fǎng)問(wèn)量巨大所帶來(lái)的問(wèn)題,作成靜態(tài)文件硬盤(pán)的尋址時(shí)間也未必少于數(shù)據(jù)庫(kù)的搜索時(shí)間,當(dāng)然對(duì)資料的索引要下一翻工夫。我自己覺(jué)得門(mén)戶(hù)往往也就是當(dāng)天、熱門(mén)的資料點(diǎn)擊率較高,將其做緩存最多也不過(guò)1~2G的數(shù)據(jù)量吧,舉個(gè)例子:
拿網(wǎng)易新聞來(lái)http://news.163.com/07/0606/09/3GA0D10N00011229.html
格式化一下,方便理解:http://域名/年/月日/新聞所屬分類(lèi)/新聞ID.html
可以把當(dāng)天發(fā)布的、熱門(mén)的、流攬量大的作個(gè)緩寸,用hashtable(key:年-月-日-分類(lèi)-ID,value:新聞對(duì)象),靜態(tài)將其放到內(nèi)存(速度絕對(duì)快過(guò)硬盤(pán)尋址靜態(tài)頁(yè)面)。
通常是采用oracle存儲(chǔ)過(guò)程+2個(gè)weblogic,更新機(jī)制也幾乎一樣每簽發(fā)一條新聞,就會(huì)生成靜態(tài)頁(yè)面,然后發(fā)往前端的web服務(wù)器,前端的web都是做負(fù)載均衡的。另外還有定時(shí)的程序,每5-15分鐘自動(dòng)生成一次。在發(fā)布新聞的同時(shí)將數(shù)據(jù)緩存。當(dāng)然緩存也不會(huì)越來(lái)越大,在個(gè)特定的時(shí)間段(如凌晨)剔除過(guò)期的數(shù)據(jù)。做一個(gè)大的網(wǎng)站遠(yuǎn)沒(méi)有想象中那么簡(jiǎn)單,服務(wù)器基本就要百十個(gè)的。
這樣可以大大增加一臺(tái)計(jì)算機(jī)的處理速度,如果一臺(tái)機(jī)器處理不了,可以用httpserver集群來(lái)解決問(wèn)題了。
2、網(wǎng)絡(luò)
中國(guó)的網(wǎng)絡(luò)分南北電信和網(wǎng)通,訪(fǎng)問(wèn)的ip就要區(qū)分南北進(jìn)入不同的網(wǎng)絡(luò)。
3、集群
通常會(huì)使用CDN與GSBL與DNS負(fù)載均衡技術(shù),每個(gè)地區(qū)一組前臺(tái)服務(wù)器群,例如:網(wǎng)易,百度使用了DNS負(fù)載均衡技術(shù),每個(gè)頻道一組前臺(tái)服務(wù)器,一搜使用了DNS負(fù)載技術(shù),所有頻道共用一組前臺(tái)服務(wù)器集群。
網(wǎng)站使用基于Linux集群的負(fù)載均衡,失敗恢復(fù),包括應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,基于linux-ha的服務(wù)狀態(tài)檢測(cè)及高可用化。
應(yīng)用服務(wù)器集群可以采用apache+tomcat集群和weblogic集群等;web服務(wù)器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據(jù)情況選擇。
4、數(shù)據(jù)庫(kù)
因?yàn)槭乔f(wàn)人同時(shí)訪(fǎng)問(wèn)的網(wǎng)站,所以一般是有很多個(gè)數(shù)據(jù)庫(kù)同時(shí)工作的,說(shuō)明白一點(diǎn)就是數(shù)據(jù)庫(kù)集群和并發(fā)控制,數(shù)據(jù)分布到地理位置不同的數(shù)據(jù)中心,以免發(fā)生斷電事故。另外還有一點(diǎn)的是,那些網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite 這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn)。這樣的網(wǎng)站實(shí)時(shí)性也是相對(duì)的,因?yàn)樵跀?shù)據(jù)庫(kù)復(fù)制數(shù)據(jù)的時(shí)候有一個(gè)過(guò)程,一般在技術(shù)上可以用到hibernate和 ecache,但是如果要使網(wǎng)站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務(wù)器來(lái)支持,并且要用oracle這樣的大型數(shù)據(jù)庫(kù)。
大型門(mén)戶(hù)網(wǎng)站不建議使用Mysql數(shù)據(jù)庫(kù),除非你對(duì)Mysql數(shù)據(jù)的優(yōu)化非常熟悉。Mysql數(shù)據(jù)庫(kù)服務(wù)器的master-slave模式,利用數(shù)據(jù)庫(kù)服務(wù)器在主從服務(wù)器間進(jìn)行同步,應(yīng)用只把數(shù)據(jù)寫(xiě)到主服務(wù)器,而讀數(shù)據(jù)時(shí)則根據(jù)負(fù)載選擇一臺(tái)從服務(wù)器或者主服務(wù)器來(lái)讀取,將數(shù)據(jù)按不同策略劃分到不同的服務(wù)器(組)上,分散數(shù)據(jù)庫(kù)壓力。
大型網(wǎng)站要用oracle,數(shù)據(jù)方面操作盡量多用存儲(chǔ)過(guò)程,絕對(duì)提升性能;同時(shí)要讓DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,優(yōu)化后的數(shù)據(jù)庫(kù)與沒(méi)優(yōu)化的有天壤之別;同時(shí)還可以擴(kuò)展分布式數(shù)據(jù)庫(kù),以后這方面的研究會(huì)越來(lái)越多;
5、頁(yè)面
從開(kāi)始就考慮使用虛擬存儲(chǔ)/簇文件系統(tǒng)。它能讓你大量并行IO訪(fǎng)問(wèn),而且不需要任何重組就能夠增加所需要的磁盤(pán)。
頁(yè)面數(shù)據(jù)調(diào)用更要認(rèn)真設(shè)計(jì),一些數(shù)據(jù)查詢(xún)可以不通過(guò)數(shù)據(jù)庫(kù)的方式,實(shí)時(shí)性要求不高的可以使用lucene來(lái)實(shí)現(xiàn),即使有實(shí)時(shí)性的要求也可以用lucene,lucene+compass還是非常優(yōu)秀的。
新聞?lì)惖木W(wǎng)站可以用靜態(tài)頁(yè)存儲(chǔ),采用定時(shí)更新機(jī)制減輕服務(wù)器負(fù)擔(dān);首頁(yè)每個(gè)小模塊可以使用oscache緩存,這樣不用每次都拉數(shù)據(jù)。
前端的基于靜態(tài)頁(yè)面緩存的web加速器,主要應(yīng)用有squid等。squid 將大部分靜態(tài)資源(圖片,js,css等)緩存起來(lái),直接返回給訪(fǎng)問(wèn)者,減少應(yīng)用服務(wù)器的負(fù)載網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn),后綴名為htm或者h(yuǎn)tml并不能說(shuō)明程序生成了靜態(tài)頁(yè)面,可能是通過(guò) url重寫(xiě)來(lái)實(shí)現(xiàn)的,為的只不過(guò)是在搜索引擎中提升自己網(wǎng)站的覆蓋面積罷了。
生成靜態(tài)頁(yè)面的服務(wù)器和www服務(wù)器是兩組不同的服務(wù)器,頁(yè)面生成后才會(huì)到www服務(wù)器,一部分?jǐn)?shù)據(jù)庫(kù)并不是關(guān)系數(shù)據(jù)庫(kù),這樣更適合信息衍生,www、mail服務(wù)器、路由器多,主要用負(fù)載平衡解決訪(fǎng)問(wèn)瓶頸。
靜態(tài)頁(yè)面的缺點(diǎn):
1) 增加了程序的復(fù)雜度
2) 不利于管理資料
3) 速度不是最快
4) 傷硬盤(pán)
6、緩存
從一開(kāi)始就應(yīng)該使用緩存,高速緩存是一個(gè)更好的地方存儲(chǔ)臨時(shí)數(shù)據(jù),比如Web站點(diǎn)上跟蹤一個(gè)特定用戶(hù)的會(huì)話(huà)產(chǎn)生的臨時(shí)文件,就不再需要記錄到數(shù)據(jù)庫(kù)里。
不能用lucene實(shí)現(xiàn)的可以用緩存,分布式緩存可以用memcached,如果有錢(qián)的話(huà)用10來(lái)臺(tái)機(jī)器做緩存,> 10G的存儲(chǔ)量相信存什么都?jí)蛄耍蝗绻麤](méi)錢(qián)的話(huà)可以在頁(yè)面緩存和數(shù)據(jù)緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過(guò)據(jù)說(shuō)同步性不是很好;
可以使用Memcache進(jìn)行緩存,用大內(nèi)存把這些不變的數(shù)據(jù)全都緩存起來(lái),而當(dāng)修改時(shí)就通知cache過(guò)期,memcache是LJ開(kāi)發(fā)的一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用,我們可以把Cache Server與AppServer裝在一起。因?yàn)镃ache Server對(duì)CPU消耗不大,而有了Cache Server的支援,App Server對(duì)內(nèi)存要求也不是太高,所以可以和平共處,更有效的利用資源。
將response內(nèi)響應(yīng)給使用者的內(nèi)容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
這個(gè)方法在之前就有人提出過(guò),因?yàn)槭亲尵W(wǎng)頁(yè)在輸出時(shí)經(jīng)過(guò)壓縮,可以讓傳輸量變小很多,雖然現(xiàn)在的網(wǎng)絡(luò)頻寬對(duì)于用來(lái)看網(wǎng)頁(yè)已經(jīng)綽綽有余,但是檔案大小太大的網(wǎng)頁(yè)還是會(huì)造成一定的影響。
經(jīng)過(guò)Gzip壓縮過(guò)的網(wǎng)頁(yè),檔案大小可以到原本壓縮前的20%。
package com.jsptw.filter;
import java.io.*;
import java.util.zip.GZIPOutputStream;
import javax.servlet.*;
import javax.servlet.http.*;
public class GZIPEncodeFilter implements Filter {
public void init(FilterConfig filterConfig) {}
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
String transferEncoding = getGZIPEncoding((HttpServletRequest)request);
if (transferEncoding == null) {
chain.doFilter(request, response);
} else{
((HttpServletResponse)response).setHeader("Content-Encoding", transferEncoding);
GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
chain.doFilter(request, wrappedResponse);
wrappedResponse.flush();
}
}
public void destroy() {}
private static String getGZIPEncoding(HttpServletRequest request) {
String acceptEncoding = request.getHeader("Accept-Encoding");
if (acceptEncoding == null)
return null;
acceptEncoding = acceptEncoding.toLowerCase();
if (acceptEncoding.indexOf("x-gzip") >= 0) {
return "x-gzip";
}
if (acceptEncoding.indexOf("gzip") >= 0) {
return "gzip";
}
return null;
}
private class GZIPEncodableResponse extends HttpServletResponseWrapper {
private GZIPServletStream wrappedOut;
public GZIPEncodableResponse(HttpServletResponse response) throws IOException {
super(response);
wrappedOut = new GZIPServletStream(response.getOutputStream());
}
public ServletOutputStream getOutputStream() throws IOException {
return wrappedOut;
}
private PrintWriter wrappedWriter;
public PrintWriter getWriter() throws IOException {
if (wrappedWriter == null) {
wrappedWriter = new PrintWriter( new OutputStreamWriter( getOutputStream(), getCharacterEncoding())); }
return wrappedWriter;
}
public void flush() throws IOException {
if (wrappedWriter != null) {
wrappedWriter.flush();
}
wrappedOut.finish();
}
}
private class GZIPServletStream extends ServletOutputStream {
private GZIPOutputStream outputStream;
public GZIPServletStream(OutputStream source) throws IOException {
outputStream = new GZIPOutputStream(source);
}
public void finish() throws IOException {
OutputStream.finish();
}
public void write(byte[] buf) throws IOException {
outputStream.write(buf);
}
public void write(byte[] buf, int off, int len) throws IOException {
outputStream.write(buf, off, len);
}
public void write(int c) throws IOException {
outputStream.write(c);
}
public void flush() throws IOException {
outputStream.flush();
}
public void close() throws IOException {
outputStream.close();
}
}
}
web.xml中的設(shè)定為:
<filter>
<filter-name>GZIPEncoder</filter-name>
<filter-class>com.jsptw.filter.GZIPEncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name> GZIPEncoder</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/a_heng/archive/2009/09/22/4579979.aspx
一 簡(jiǎn)單加密(不可逆):
MD5(信息摘要算法,Message Digest),SHA(安全散列算法,Secure Hash,Algorithm)、HMAC(散列消息鑒別碼,Hash Message Authentication Code)
二 復(fù)雜算法:
1、對(duì)稱(chēng)加密:加密解密使用相同的密鑰:DES(Data Encryption Standard,數(shù)據(jù)加密算法) 、IDEA、RC2、RC4、SKIPJACK
2、非對(duì)稱(chēng)加密:分為公開(kāi)密鑰(publickey)和私有密鑰(privatekey),且公開(kāi)密鑰與私有密鑰是一對(duì)。非對(duì)稱(chēng)加密算法實(shí)現(xiàn)機(jī)密信息交換的基本過(guò)程是:甲方生成一對(duì)密鑰并將其中的一把作為公用密鑰向其它方公開(kāi);得到該公用密鑰的乙方使用該密鑰對(duì)機(jī)密信息進(jìn)行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專(zhuān)用密鑰對(duì)加密后的信息進(jìn)行解密。甲方只能用其專(zhuān)用密鑰解密由其公用密鑰加密后的任何信息。非對(duì)稱(chēng)加密算法的保密性比較好,它消除了最終用戶(hù)交換密鑰的需要,但加密和解密花費(fèi)時(shí)間長(zhǎng)、速度慢,它不適合于對(duì)文件加密而只適用于對(duì)少量數(shù)據(jù)進(jìn)行加密。經(jīng)典的非對(duì)稱(chēng)加密算法如RSA(三個(gè)人名:Ron Rivest, AdiShamir 和Leonard Adleman)算法等安全性都相當(dāng)高。
1.INSERT INTO SELECT語(yǔ)句
語(yǔ)句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
要求目標(biāo)表Table2必須存在,由于目標(biāo)表Table2已經(jīng)存在,所以我們除了插入源表Table1的字段外,還可以插入常量。示例如下:
INSERT INTO SELECT語(yǔ)句復(fù)制表數(shù)據(jù)
--1.創(chuàng)建測(cè)試表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.創(chuàng)建測(cè)試數(shù)據(jù)
Insert into Table1 values('趙','asds','90')
Insert into Table1 values('錢(qián)','asds','100')
Insert into Table1 values('孫','asds','80')
Insert into Table1 values('李','asds',null)
GO
select * from Table2
--3.INSERT INTO SELECT語(yǔ)句復(fù)制表數(shù)據(jù)
Insert into Table2(a, c, d) select a,c,5 from Table1
GO
--4.顯示更新后的結(jié)果
select * from Table2
GO
--5.刪除測(cè)試表
drop TABLE Table1
drop TABLE Table2
2.SELECT INTO FROM語(yǔ)句
語(yǔ)句形式為:SELECT vale1, value2 into Table2 from Table1
要求目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。示例如下:
SELECT INTO FROM創(chuàng)建表并復(fù)制表數(shù)據(jù)
--1.創(chuàng)建測(cè)試表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.創(chuàng)建測(cè)試數(shù)據(jù)
Insert into Table1 values('趙','asds','90')
Insert into Table1 values('錢(qián)','asds','100')
Insert into Table1 values('孫','asds','80')
Insert into Table1 values('李','asds',null)
GO
--3.SELECT INTO FROM語(yǔ)句創(chuàng)建表Table2并復(fù)制數(shù)據(jù)
select a,c INTO Table2 from Table1
GO
--4.顯示更新后的結(jié)果
select * from Table2
GO
--5.刪除測(cè)試表
drop TABLE Table1
drop TABLE Table2
MySQl詳細(xì)安裝過(guò)程
1.利用安裝包進(jìn)行安裝:
雙擊mysql-5.0.19-win32.zip打開(kāi),再雙擊里面的setup.exe就開(kāi)始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
a.彈出MySQL Server 5.0-Setup Wizard對(duì)話(huà)框,點(diǎn)next
b.就到了選擇安裝類(lèi)型的對(duì)話(huà)框了,有三種類(lèi)型:(1)典型
(2)完全(3)自定義。一般來(lái)說(shuō)選典型就可以了,典型和完全安裝都會(huì)裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL
Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
c.點(diǎn)擊next->install就開(kāi)始安裝了。如果選擇“自定義”的話(huà),改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
d.跟著就到了一個(gè)問(wèn)你是否要申請(qǐng)一個(gè)登錄MySQL.com的帳戶(hù),有興趣的話(huà)可以按步驟來(lái)申請(qǐng)一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒(méi)有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
e.點(diǎn)finish后會(huì)馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對(duì)話(huà)框,點(diǎn)next
f.又到了一個(gè)選擇配置類(lèi)型的對(duì)話(huà)框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話(huà)就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過(guò)我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
g.再選擇服務(wù)器類(lèi)型“開(kāi)發(fā)者”,“服務(wù)器”,“專(zhuān)門(mén)的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù)
據(jù)庫(kù)類(lèi)型:“多功能的”,“事務(wù)專(zhuān)用的”,“非事務(wù)專(zhuān)用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲(chǔ)存引擎,它們占用
MySQL可用資源各半;“事務(wù)專(zhuān)用的”InnoDB作為主儲(chǔ)存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專(zhuān)用的”InnoDB就不能再
用了,點(diǎn)next
h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會(huì)不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類(lèi)型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線(xiàn)事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動(dòng)的連接;“手動(dòng)設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
j.選擇端口,3306就可以了,點(diǎn)next
k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語(yǔ)言”使用的是UTF-8,支持中文;“手動(dòng)選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱(chēng),例如“MySQL”,“MySQL5”等。Launch the
MySQL Server automatically是否自動(dòng)啟動(dòng)服務(wù),Include Bin Directory in Windows
Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server
5.0\bin加入環(huán)境變量PATH中,建議加入的好,點(diǎn)next
m.設(shè)置root用戶(hù)的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root
access from remote machines是否允許root用戶(hù)進(jìn)行遠(yuǎn)程登錄,Create An Anonymous
Account是否創(chuàng)建匿名用戶(hù)
n.點(diǎn)next->Execute->Finish。
至此MySQL終于安裝完成
MySQl詳細(xì)安裝過(guò)程
1.利用安裝包進(jìn)行安裝:
雙擊mysql-5.0.19-win32.zip打開(kāi),再雙擊里面的setup.exe就開(kāi)始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
a.彈出MySQL Server 5.0-Setup Wizard對(duì)話(huà)框,點(diǎn)next
b.就到了選擇安裝類(lèi)型的對(duì)話(huà)框了,有三種類(lèi)型:(1)典型
(2)完全(3)自定義。一般來(lái)說(shuō)選典型就可以了,典型和完全安裝都會(huì)裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL
Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
c.點(diǎn)擊next->install就開(kāi)始安裝了。如果選擇“自定義”的話(huà),改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
d.跟著就到了一個(gè)問(wèn)你是否要申請(qǐng)一個(gè)登錄MySQL.com的帳戶(hù),有興趣的話(huà)可以按步驟來(lái)申請(qǐng)一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒(méi)有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
e.點(diǎn)finish后會(huì)馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對(duì)話(huà)框,點(diǎn)next
f.又到了一個(gè)選擇配置類(lèi)型的對(duì)話(huà)框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話(huà)就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過(guò)我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
g.再選擇服務(wù)器類(lèi)型“開(kāi)發(fā)者”,“服務(wù)器”,“專(zhuān)門(mén)的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù)
據(jù)庫(kù)類(lèi)型:“多功能的”,“事務(wù)專(zhuān)用的”,“非事務(wù)專(zhuān)用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲(chǔ)存引擎,它們占用
MySQL可用資源各半;“事務(wù)專(zhuān)用的”InnoDB作為主儲(chǔ)存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專(zhuān)用的”InnoDB就不能再
用了,點(diǎn)next
h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會(huì)不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類(lèi)型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線(xiàn)事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動(dòng)的連接;“手動(dòng)設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
j.選擇端口,3306就可以了,點(diǎn)next
k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語(yǔ)言”使用的是UTF-8,支持中文;“手動(dòng)選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱(chēng),例如“MySQL”,“MySQL5”等。Launch the
MySQL Server automatically是否自動(dòng)啟動(dòng)服務(wù),Include Bin Directory in Windows
Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server
5.0\bin加入環(huán)境變量PATH中,建議加入的好,點(diǎn)next
m.設(shè)置root用戶(hù)的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root
access from remote machines是否允許root用戶(hù)進(jìn)行遠(yuǎn)程登錄,Create An Anonymous
Account是否創(chuàng)建匿名用戶(hù)
n.點(diǎn)next->Execute->Finish。
至此MySQL終于安裝完成
測(cè)試
Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator\桌面>mysql -uroot -pEnter
password: ********Welcome to the MySQL monitor. Commands end with ; or
\g.Your MySQL connection id is 2 to server version: 5.0.19-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
看到上面這個(gè)就說(shuō)明安裝成功!一般的登錄為:mysql -h host -u user -p (password)
非安裝包的安裝
1.將mysql-noinstall-5.0.19-win32.zip到C:\(或者其他你想的安裝目錄),重命名mysql
2.進(jìn)入C:\mysql\可以找到如下的配置文件樣本,my-small.ini,my-medium.ini等。我選擇my-medium.ini,先將復(fù)制到另外的地方,例如:桌面,然后重命名為my.ini,再剪切回C:\mysql\目錄下。
3.打開(kāi)my.ini進(jìn)行編輯,要修改的地方如下:
[client]#password = your_passwordport = 3309#socket = /tmp/mysql.sock
將socket項(xiàng)用'#'注釋掉,因?yàn)閣indows下沒(méi)有,又因?yàn)槲疑厦嬗昧硕丝?306,所以這里要把端口也改了,改為3309,你可以改成其他沒(méi)有被占用的端口3307,3308等。
[mysqld]
basedir=C:/mysql/datadir=C:/mysql/data/port = 3309#socket = /tmp/mysql.sock
default-character-set=utf8
這里同樣把socket注釋掉,端口改成3309;basedir為安裝目錄,datadir為存放數(shù)據(jù)的目錄,記住要用“/”,而不是“\”,如果要用"\"就要這樣使用C:\\mysql\\data,另外這里我還設(shè)置了默認(rèn)的字符集為utf8。
還有
[mysql]
default-character-set=utf8
no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates在上面添加默認(rèn)的字符集就可以了。
4.編輯完my.ini文件后就要選擇一種MySQL服務(wù)器類(lèi)型,它們之間的區(qū)別如下:
Binary
Description
mysqld-debug
Compiled with full debugging and automatic memory allocation checking, as well as InnoDB and BDB tables.
mysqld
Optimized binary with InnoDB support.
mysqld-nt
Optimized binary for Windows NT, 2000, and XP with support for named pipes.
mysqld-max
Optimized binary with support for InnoDB and BDB tables.
mysqld-max-nt
Like mysqld-max, but compiled with support for named pipes.
上面每一種類(lèi)型都可以在C:\mysql\bin目錄下找到對(duì)應(yīng)的.exe程序,例如:mysqld-max.exe,mysqld-nt.exe等。
5.選擇好后就要安裝成windows服務(wù)了,過(guò)程如下:(我選的是mysqld-max)
Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator\桌面>cd c:\mysql\bin
C:\mysql\bin>mysqld-max --install mysql-max
--defaults-file=c:\mysql\my.iniService successfully
installed.C:\mysql\bin>net start mysql-maxmysql-max 服務(wù)正在啟動(dòng)
.mysql-max 服務(wù)已經(jīng)啟動(dòng)成功。
C:\mysql\bin>mysql -uroot --port=3309Welcome to the MySQL monitor.
Commands end with ; or \g.Your MySQL connection id is 1 to server
version: 5.0.19-max-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
安裝成windows服務(wù)的命令格式為:服務(wù)器類(lèi)型 --install(自動(dòng)) 名稱(chēng)(你想要用的名稱(chēng)) --defaults-file=my.ini文件的絕對(duì)路徑。--install-manual(手動(dòng))
注意:上面的登錄mysql -uroot --port=3309 非安裝默認(rèn)設(shè)定的用戶(hù)為root,密碼為空,同時(shí)因?yàn)槲腋牧硕丝冢砸由?-port選項(xiàng)。
一臺(tái)機(jī)器上安裝多個(gè)windows服務(wù)
1.創(chuàng)建要安裝的目錄,例如:F:\mysql,在F:\mysql目錄下再創(chuàng)建一個(gè)子目錄data.
2.再到已經(jīng)裝好的mysql的目錄下,例如:C:\mysql\,把里面data目錄下的mysql目錄copy到F:\mysql\data\目錄
下,再C:\mysql\目錄下share目錄和my.ini文件也copy到F:\mysql\目錄下,其實(shí)只需要C:\mysql\share
\english目錄下的errmsg.sys文件.
3.編輯F:\mysql\my.ini文件,修改里面的端口和basedir,datadir就可以了.
[client]#password = 123456port = 3308#socket = /tmp/mysql.sock
[mysqld]
# set basedir to your installation pathbasedir=F:/mysql/# set datadir
to the location of your data directorydatadir=F:/mysql/data/
port = 3308
4.安裝成windows服務(wù)同上面的非安裝版本的安裝過(guò)程是一樣的,過(guò)程如下:
Microsoft Windows XP [版本 5.1.2600](C) 版權(quán)所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator\桌面>cd c:\mysql\bin
C:\mysql\bin>mysqld-debug --install mysql-debug --defaults-file=F:\mysql\my.iniService successfully installed.
C:\mysql\bin>net start mysql-debugmysql-debug 服務(wù)正在啟動(dòng) .mysql-debug 服務(wù)已經(jīng)啟動(dòng)成功。
C:\mysql\bin>mysql -uroot --port=3308Welcome to the MySQL monitor.
Commands end with ; or \g.Your MySQL connection id is 1 to server
version: 5.0.19-community-debug-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>
頁(yè)面如果用到Ext最好不要在body有任何文字輸出,不然的話(huà)ext會(huì)報(bào)一個(gè)錯(cuò)誤!
對(duì)象不支持此屬性或方法ext-all.js 行:9
郁悶了兩天了,spring+hibernate查詢(xún)數(shù)據(jù),sql語(yǔ)句在數(shù)據(jù)庫(kù)里試過(guò)了是正確的,數(shù)據(jù)庫(kù)里有數(shù)據(jù),但是就是查不出數(shù)據(jù)。后來(lái)仔細(xì)看日志文件,恍然大悟,原來(lái)是整形字段賦值為null,
Null value was assigned to a property of primitive type setter of com.*.*.*.age
1、得到record中的某個(gè)字段:record.get("字段名稱(chēng)")
2、得到form中的某個(gè)字段值:this.form.findField("字段名稱(chēng)").getValue()
3、從reader中得到root指定的字段除外的字段:store.reader.jsonData.字段名稱(chēng)
4、關(guān)于combobx
valueField : 設(shè)置值
displayField :設(shè)置顯示的值
hiddenName :動(dòng)態(tài)產(chǎn)生一個(gè)隱藏字段,以便表單提交的時(shí)候一起提交,事實(shí)上valueField和displayField在表單提交中沒(méi)有啟任何作用,往往指定hiddenName就行,如果在combobox中找到hiddenName匹配的值,則將匹配的值顯示出來(lái),因此,細(xì)心的朋友可以發(fā)現(xiàn),在將選擇的記錄賦給combobox所在的form時(shí)(this.form.loadRecord(record)),在combobox里首先會(huì)顯示出hiddenName指定的值(一般是id),在combobox的store加載完后,如果找到匹配的值則會(huì)顯示匹配的值,中間有個(gè)值的變化過(guò)程!引申一下,如果我們combobox下拉框里用的是樹(shù),則hiddenName肯定是找不到匹配項(xiàng)的(Ext總是會(huì)在原始combobox下拉項(xiàng)中匹配,而現(xiàn)在下拉項(xiàng)換成了樹(shù)),因此combobox會(huì)一直顯示hiddenName的值(即一個(gè)id值)。在這種情況下我們就需要手動(dòng)指定combobox的顯示值,具體方法是在combobox的load事件中用setRawValue指定。注意這里不能用setValue指定,因?yàn)樵谑褂胔iddenName的情況下,setValue首先將值賦給隱藏字段,如果在combobox中找到匹配項(xiàng)則顯示匹配項(xiàng)的值,如果沒(méi)有匹配的值就顯示setValue的值。
apache common dbcp 數(shù)據(jù)庫(kù)連接池
common dbcp依賴(lài) common pool
一、Ignoring namespace handler [org.springframework.ejb.config.JeeNamespaceHandler]: handler class not found
需要添加spring-remoting.jar包,具體路徑為:MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.springframework_6.0.1.zmyeclipse601200710\data\2.0\dist\modules
二、org.springframework.scripting.config.LangNamespaceHandler
添加spring-support.jar包,具體路徑為:MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.springframework_6.0.1.zmyeclipse601200710\data\2.0\dist\modules
解決兩種情況下的用戶(hù)訪(fǎng)問(wèn)超時(shí)。
a)普通http請(qǐng)求的session超時(shí)。
b)異步http請(qǐng)求的session超時(shí),使用ext后大部分的界面刷新都是異步的ajax請(qǐng)求。
不管是那種類(lèi)型的http請(qǐng)求總是可以由一個(gè)過(guò)濾器來(lái)捕捉。
分類(lèi):普通http請(qǐng)求的header參數(shù)中沒(méi)有x-requested-with:XMLHttpRequest頭信息,而異步的有。
其實(shí)對(duì)于常見(jiàn)的ajax框架,header中還有標(biāo)示自己身份的header信息。
對(duì)于普通的http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后直接重定向到一個(gè)超時(shí)頁(yè)面,顯示訪(fǎng)問(wèn)超時(shí)。
對(duì)于異步http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后則向請(qǐng)求的response中寫(xiě)入特定的超時(shí)頭信息,客戶(hù)端ajax對(duì)象檢測(cè)
頭信息,發(fā)現(xiàn)有超時(shí)狀態(tài)標(biāo)志后調(diào)用顯示超時(shí)信息的javascript方法,提示用戶(hù)訪(fǎng)問(wèn)超時(shí)。
服務(wù)器端session超時(shí)后在過(guò)濾器中為response添加新的頭信息,標(biāo)記該請(qǐng)求超時(shí):
if(r.getHeader("x-requested-with")!=null && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ response.setHeader("sessionstatus","timeout"); }使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求的交互,Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例!)。
注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件。在該事件的回調(diào)函數(shù)里面判斷
訪(fǎng)問(wèn)請(qǐng)求是否超時(shí)。使用Ext.Ajax對(duì)象的好處是,只需要引入一個(gè)包含了幾行超時(shí)處理代碼的js文件,就可以
為當(dāng)前應(yīng)用增加超時(shí)處理功能,原有代碼不需要做任何修改。
使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求交互,假如checkUserSessionStatus是你的回調(diào)方法,每個(gè)頁(yè)面引用:
Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); function checkUserSessionStatus(conn,response,options){ //Ext重新封裝了response對(duì)象 if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ //發(fā)現(xiàn)請(qǐng)求超時(shí),退出處理代碼... } }
可以利用的幾個(gè)特性:
a)所有的ajax請(qǐng)求均帶有x-requested-with:XMLHttpRequest頭信息
b)Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例!)
c)注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件(概念類(lèi)似spring的aop攔截)。
jquery提供了幾個(gè)全局事件可以用來(lái)處理session過(guò)期請(qǐng)求,如當(dāng)ajax請(qǐng)求開(kāi)始時(shí)會(huì)觸發(fā)ajaxStart()方法的回調(diào)函數(shù);
當(dāng)ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無(wú)論創(chuàng)建它們的代碼位于何處,
只要有ajax請(qǐng)求發(fā)生時(shí),都會(huì)觸發(fā)它們。類(lèi)似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。
如果使某個(gè)ajax請(qǐng)求不受全局方法的影響,那么可以在使用$.ajax()方法時(shí),將參數(shù)中的global設(shè)置為false,jquery代碼如下:
$.ajax({
url:"test.html",
global:false//不觸發(fā)全局ajax事件
})
對(duì)于其他的ajax框架,解決用戶(hù)訪(fǎng)問(wèn)請(qǐng)求超時(shí)這個(gè)問(wèn)題的思路是類(lèi)似的。
在這里推薦一個(gè)很實(shí)用的Js方法:
function getRootWin(){ var win = window; while (win != win.parent){ win = win.parent; } return win; }
通過(guò)該方法,可以在一個(gè)任意深度的iframe中調(diào)用父iframe中的方法。具體到這里就是無(wú)論哪一個(gè)iframe中的用戶(hù)訪(fǎng)
問(wèn)請(qǐng)求超時(shí),都可以通過(guò)該方法調(diào)用最外層iframe中的退出方法,這樣便為用戶(hù)提供了一個(gè)統(tǒng)一的訪(fǎng)問(wèn)超時(shí)退出的UI
呈現(xiàn)。
if(action.failureType == 'server'){
//服務(wù)器端你自己返回success為false時(shí)
Ext.MessageBox.alert('友情提示', action.result.info);
}else if(action.failureType == 'connect'){
//服務(wù)器指定的路徑鏈接不上時(shí)
Ext.Msg.alert('連接錯(cuò)誤','指定路徑連接錯(cuò)誤!');
}else if(action.failureType == 'client'){
//客戶(hù)端數(shù)據(jù)驗(yàn)證失敗的情況下,例如客戶(hù)端驗(yàn)證郵件格式不正確的情況下提交表單
Ext.Msg.alert('提示','數(shù)據(jù)錯(cuò)誤,非法提交');
}else{
//其它類(lèi)型的錯(cuò)誤
Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
}
},
ExtJS中有一個(gè)名為Record的類(lèi),表格等控件中使用的數(shù)據(jù)是存放在Record對(duì)象中,一個(gè)Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱(chēng)為記錄。Record對(duì)象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個(gè)字段的數(shù)據(jù)類(lèi)型等),同時(shí)又包含了記錄具體的數(shù)據(jù)信息(也就是各個(gè)字段的值)。一個(gè)比較正規(guī)的創(chuàng)建store的代碼如下:
var MyRecord = Ext.data.Record.create([
{name: 'title'},
{name: 'username', mapping: 'author'},
{name: 'loginTimes', type: 'int'},
{name: 'lastLoginTime', mapping: 'loginTime', type: 'date'}
]);
var dataProxy=new Ext.data.HttpProxy({url:"login.do"});
var theReader=new Ext.data.JsonReader({
totalProperty: "results",
root: "rows",
id: "id"
},MyRecord
);
var store=new Ext.data.Store({
proxy:dataProxy,
reader:theReader
});
store.load();
store在創(chuàng)建的時(shí)候會(huì)自動(dòng)使用HttpProxy來(lái)加載參數(shù),并且使用post方式來(lái)提交請(qǐng)求,因此上面的代碼可簡(jiǎn)化為:
var MyRecord = Ext.data.Record.create([
{name: 'title'},
{name: 'username', mapping: 'author'},
{name: 'loginTimes', type: 'int'},
{name: 'lastLoginTime', mapping: 'loginTime', type: 'date'}
]);
var theReader=new Ext.data.JsonReader({
totalProperty: "results",
root: "rows",
id: "id"
},MyRecord
);
var store=new Ext.data.Store({
url:'login.do',
reader:theReader
});
store.load();
在Store類(lèi)的基礎(chǔ)上提供了SimpleStore、JSonStore、GroupingStore等,因此上面的JsonReader可以省略:
var store = new Ext.data.JsonStore({
url:'contact.do',
root:'data',
totalProperty:'totalCount',
fields:[{name: 'vid', mapping: 'id'},
{name: 'name', mapping: 'name'},
{name: 'vmethod', mapping: 'vmethod'}]
});
success:function(form,action){
window.location.href = 'index.jsp';
},
failure : function(form, action) {
if(action.failureType == 'server'){
Ext.Msg.alert('登錄錯(cuò)誤',action.result.errors);
}else if(action.failureType == 'connect'){
Ext.Msg.alert('連接錯(cuò)誤','指定路徑連接錯(cuò)誤!');
}else{
Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
}
}
java返回的數(shù)據(jù),成功為:String json="{success:true}",失敗為: String json="{success:false,errors:'用戶(hù)名或者密碼錯(cuò)誤!!!'}";
使用group by子句的注意事項(xiàng):
(1)在SELECT子句的字段列表中,除了聚集函數(shù)外,其他所出現(xiàn)的字段一定要在group by子句中有定義才行。例如“group by A,B”,那么“SELECT SUM(A),C”就有問(wèn)題,因?yàn)镃不在group by中,但是SUM(A)是可以的。
(2)SELECT子句的字段列表中不一定要有聚集函數(shù),但至少要用到group by子句列表中的一個(gè)項(xiàng)目。例如“group by A,B,C”,則“SELECT A”是可以的。
(3)在SQL Server中text、ntext和image數(shù)據(jù)類(lèi)型的字段不能作為group by子句的分組依據(jù)。
定義變量:
$identifier $(identifier) $(identifier:conversion) |
變量的字符串級(jí)別最高,如果遇到相同的字符串,首先被認(rèn)為是變量。顯示$,需要后面在跟一個(gè),$$。例如:
You account has $$1650.00 in it. |
變量名稱(chēng)規(guī)則:
1、變量名是由US-ASCII碼、下劃線(xiàn)和數(shù)字組成;
2、只能以US-ASCII碼開(kāi)頭;
3、變量名大小寫(xiě)敏感。
注意:
1、WML變量沒(méi)有類(lèi)型,均表示為字符串;
2、變量沒(méi)有被賦值的時(shí)候,內(nèi)容為空,即空字符串。
3、可以在運(yùn)行過(guò)程中改變它的值。
創(chuàng)建變量
最簡(jiǎn)單的方法是使用<setvar>元素,語(yǔ)法如下:
<setvar name="string" value="string" /> |
<setvar>只能在<go>、<prev>和<refresh>中使用。
下例定義了一個(gè)叫vNAME的變量并賦值為“Jeff”:
<setvar name="vNAME" value="Jeff" /> |
另外,還可以在<input>、<select>和<postfield>中定義變量。
替換文本
變量可以用作替換用途,但只能在文本類(lèi)型(如顯示字符、URL等)中使用。
任何元素和屬性都不能使用變量來(lái)替代。例如:
Hello, $vNAME. |
Hello, Jeff. |
ESCAPE轉(zhuǎn)換
前面說(shuō)過(guò)變量可以用作替換用途,但是在URL中使用時(shí),變量的內(nèi)容必須遵守[RFC2396]標(biāo)準(zhǔn)。
這個(gè)標(biāo)準(zhǔn)規(guī)定某些特殊字符在URL里使用的時(shí)候必須用特殊表示方法,即ESCAPE八進(jìn)制表示。
例如:
list.asp?id=3 |
在URL中要表示為:
list.asp%3fid=3 |
所以變量有可能需要標(biāo)志為是否對(duì)其內(nèi)容進(jìn)行ESCAPE轉(zhuǎn)換,變量定義就有如下幾種特殊方式:
效果 | 表達(dá)方式1 | 表達(dá)方式2 | 表達(dá)方式3 |
對(duì)變量中ESCAPE字符進(jìn)行轉(zhuǎn)換 | $(var:e) | $(var:E) | $(var:escape) |
不進(jìn)行ESCAPE轉(zhuǎn)換 | $(var:u) | $(var:U) | $(var:unesc) |
變量中沒(méi)有ESCAPE字符 | $(var:n) | $(var:N) |
$(noesc) |
給變量進(jìn)行ESCAPE轉(zhuǎn)換是WML的默認(rèn)方式。
概述:
Servlet監(jiān)聽(tīng)器用于監(jiān)聽(tīng)一些重要事件的發(fā)生,監(jiān)聽(tīng)器對(duì)象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。
接口:
目前Servlet2.4和JSP2.0總共有8個(gè)監(jiān)聽(tīng)器接口和6個(gè)Event類(lèi),其中HttpSessionAttributeListener與
HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener則都使用HttpSessionEvent;其余Listener對(duì)應(yīng)的Event如下所 示:
Listener接口 |
Event類(lèi) |
ServletContextListener |
ServletContextEvent |
ServletContextAttributeListener |
ServletContextAttributeEvent |
HttpSessionListener |
HttpSessionEvent |
HttpSessionActivationListener |
|
HttpSessionAttributeListener |
HttpSessionBindingEvent |
HttpSessionBindingListener |
|
ServletRequestListener |
ServletRequestEvent |
ServletRequestAttributeListener |
ServletRequestAttributeEvent |
分別介紹:
一 ServletContext相關(guān)監(jiān)聽(tīng)接口
補(bǔ)充知識(shí):
通過(guò)ServletContext 的實(shí)例可以存取應(yīng)用程序的全局對(duì)象以及初始化階段的變量。
在JSP文件中,application 是 ServletContext 的實(shí)例,由JSP容器默認(rèn)創(chuàng)建。Servlet 中調(diào)用 getServletContext()方法得到 ServletContext 的實(shí)例。
注意:
全局對(duì)象即Application范圍對(duì)象,初始化階段的變量指在web.xml中,經(jīng)由<context-param>元素所設(shè)定的變量,它的范圍也是Application范圍,例如:
<context-param>
<param-name>Name</param-name>
<param-value>browser</param-value>
</context-param>
當(dāng)容器啟動(dòng)時(shí),會(huì)建立一個(gè)Application范圍的對(duì)象,若要在JSP網(wǎng)頁(yè)中取得此變量時(shí):
String name = (String)application.getInitParameter("Name");
或者使用EL時(shí):
${initPara.name}
若是在Servlet中,取得Name的值方法:
String name = (String)ServletContext.getInitParameter("Name");
1.ServletContextListener:
用于監(jiān)聽(tīng)WEB 應(yīng)用啟動(dòng)和銷(xiāo)毀的事件,監(jiān)聽(tīng)器類(lèi)需要實(shí)現(xiàn)javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext 的監(jiān)聽(tīng)者,如果 ServletContext 發(fā)生變化,如服務(wù)器啟動(dòng)時(shí) ServletContext 被創(chuàng)建,服務(wù)器關(guān)閉時(shí) ServletContext 將要被銷(xiāo)毀。
ServletContextListener接口的方法:
void contextInitialized(ServletContextEvent sce)
通知正在接受的對(duì)象,應(yīng)用程序已經(jīng)被加載及初始化。
void contextDestroyed(ServletContextEvent sce)
通知正在接受的對(duì)象,應(yīng)用程序已經(jīng)被載出。
ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext對(duì)象
2.ServletContextAttributeListener:用于監(jiān)聽(tīng)WEB應(yīng)用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監(jiān)聽(tīng)器類(lèi)需要實(shí)現(xiàn)javax.servlet.ServletContextAttributeListener接口。
ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)
若有對(duì)象加入Application的范圍,通知正在收聽(tīng)的對(duì)象
void attributeRemoved(ServletContextAttributeEvent scab)
若有對(duì)象從Application的范圍移除,通知正在收聽(tīng)的對(duì)象
void attributeReplaced(ServletContextAttributeEvent scab)
若在A(yíng)pplication的范圍中,有對(duì)象取代另一個(gè)對(duì)象時(shí),通知正在收聽(tīng)的對(duì)象
ServletContextAttributeEvent中的方法:
java.lang.String getName()
回傳屬性的名稱(chēng)
java.lang.Object getValue()
回傳屬性的值
二、HttpSession相關(guān)監(jiān)聽(tīng)接口
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設(shè)定的Listener
當(dāng)我們的類(lèi)實(shí)現(xiàn)了HttpSessionBindingListener接口后,只要對(duì)象加入Session范圍 (即調(diào)用HttpSession對(duì)象的setAttribute方法的時(shí)候)或從Session范圍中移出(即調(diào)用HttpSession對(duì)象的 removeAttribute方法的時(shí)候或Session Time out的時(shí)候)時(shí),容器分別會(huì)自動(dòng)調(diào)用下列兩個(gè)方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)
思考:如何實(shí)現(xiàn)記錄網(wǎng)站的客戶(hù)登錄日志, 統(tǒng)計(jì)在線(xiàn)人數(shù)?
2.HttpSessionAttributeListener接口
HttpSessionAttributeListener監(jiān)聽(tīng)HttpSession中的屬性的操作。
當(dāng) 在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。這和ServletContextAttributeListener比較類(lèi)似。
3.HttpSessionListener接口
HttpSessionListener監(jiān)聽(tīng) HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷(xiāo)毀一個(gè)Session時(shí),激發(fā)sessionDestroyed (HttpSessionEvent se)方法。
4.HttpSessionActivationListener接口
主要用于同一個(gè)Session轉(zhuǎn)移至不同的JVM的情形。
請(qǐng)注意HttpSessionAttributeListener與HttpSessionBindingListen
2.前者是在任何session的屬生變化時(shí)都會(huì)觸發(fā)執(zhí)行其方法中的代碼,而后者只是在實(shí)現(xiàn)它的對(duì)象被綁定到會(huì)話(huà)屬性或被從會(huì)話(huà)屬生中解除綁定時(shí),才會(huì)觸發(fā)執(zhí)行那個(gè)對(duì)象的valueBound和valueUnboundy這兩個(gè)方法的代碼。比如說(shuō)有兩個(gè)對(duì)象A和B都實(shí)現(xiàn)了HttpSessionBindingListen
三、ServletRequest監(jiān)聽(tīng)接口
1.ServletRequestListener接口
和ServletContextListener接口類(lèi)似的,這里由ServletContext改為ServletRequest
2.ServletRequestAttributeListener接口
和ServletContextListener接口類(lèi)似的,這里由ServletContext改為ServletRequest
</listener>
有的listener可用于統(tǒng)計(jì)網(wǎng)站在線(xiàn)人數(shù)及訪(fǎng)問(wèn)量。 如下:
服務(wù)器啟動(dòng)時(shí)(實(shí)現(xiàn)ServletContextListener監(jiān)聽(tīng)器contextInitialized方法),讀取數(shù)據(jù)庫(kù),并將其用一個(gè)計(jì)數(shù)變量保存在application范圍內(nèi)
session創(chuàng)建時(shí)(實(shí)現(xiàn)HttpSessionListener監(jiān)聽(tīng)器sessionCreated方法),讀取計(jì)數(shù)變量加1并重新保存
服務(wù)器關(guān)閉時(shí)(實(shí)現(xiàn)ServletContextListener監(jiān)聽(tīng)器contextDestroyed方法),更新數(shù)據(jù)庫(kù)
簡(jiǎn)例一
監(jiān)聽(tīng)用戶(hù)上線(xiàn)與退出,顯示在線(xiàn)用戶(hù)
1、登陸頁(yè)面 Login.jsp
<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<%
session=request.getSession(false);
if(session!=null)session.invalidate();
%>
<html>
<head><title></title></head>
<body>
<form action="isOnline.jsp" method="post">
用戶(hù)名:<input type="text" name="uName"/>
<input type="submit" value="上線(xiàn)">
</form>
</body>
</html>
2、控制頁(yè)面(只是為了說(shuō)明監(jiān)聽(tīng)器問(wèn)題,所以簡(jiǎn)單了點(diǎn)...) isOnline.jsp
<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<html>
<head><title></title></head>
<body>
<%
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
%>
</body>
</html>
3、顯示頁(yè)面 showOnline.jsp
<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
<html>
<head><title></title></head>
<body>
<%
ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在線(xiàn)人數(shù) "+showList.size()+"<br>");
for(int i=0;i<showList.size();i++){
out.print(showList.get(i)+"在線(xiàn)"+"<br>");
}
%>
<br>
<a href="Login.jsp">退出</a>
</body>
</html>
4、配置頁(yè)面 web.xml
<?xml version="1.0" encoding="gb2312"?>
<!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>
<listener>
<listener-class>org.xiosu.listener.onlineListener</listener-class>
</listener>
</web-app>
5、監(jiān)聽(tīng)器 onlineListener.java
package org.xiosu.listener;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class onlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
// 參數(shù)
ServletContext sc;
ArrayList list = new ArrayList();
// 新建一個(gè)session時(shí)觸發(fā)此操作
public void sessionCreated(HttpSessionEvent se) {
sc=se.getSession().getServletContext();
System.out.println("新建一個(gè)session");
}
// 銷(xiāo)毀一個(gè)session時(shí)觸發(fā)此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("銷(xiāo)毀一個(gè)session");
if (!list.isEmpty()) {
list.remove((String) se.getSession().getAttribute("userName"));
sc.setAttribute("list", list);
}
}
// 在session中添加對(duì)象時(shí)觸發(fā)此操作,在list中添加一個(gè)對(duì)象
public void attributeAdded(HttpSessionBindingEvent sbe) {
list.add((String) sbe.getValue());
sc.setAttribute("list", list);
}
// 修改、刪除session中添加對(duì)象時(shí)觸發(fā)此操作
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
}
在Web開(kāi)發(fā)中關(guān)于監(jiān)聽(tīng)器的應(yīng)用
首先,也要在web.xml配置文件中進(jìn)行聲明:
在web.xml文件中的聲明如下:(聲明片斷) 要放在filter過(guò)濾器聲明和filter-mapping聲明后面
<listener>
<listener-class>markchen.web.listener.MySessionListener</listener-class>
</listener>
<listener>
<listener-class>markchen.web.listener.MyServletContextListener</listener-class>
</listener>
//這兩個(gè)java類(lèi)的內(nèi)容都和簡(jiǎn)單,僅僅是為了演示說(shuō)明而已
//MySessionListener.java文件的內(nèi)容如下
//Web應(yīng)用程序中會(huì)話(huà)的生命周期監(jiān)聽(tīng)器實(shí)現(xiàn)
package markchen.web.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
//在會(huì)話(huà)一創(chuàng)建時(shí)該方法被調(diào)用,可以在此處編寫(xiě)自己需要做特殊處理的程序代碼
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
String sessionId=session.getId();
System.out.println("Session::::::"+sessionId+"******Created******");
}
//在會(huì)話(huà)即將銷(xiāo)毀時(shí)該方法被調(diào)用,可以在此處編寫(xiě)自己需要做特殊處理的程序代碼
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
String sessionId=session.getId();
System.out.println("Session::::::"+sessionId+"******Destroyed******");
}
}
注意:在sessionDestroyed()方法中一定不要再調(diào)用session.invalidate()方法了
因?yàn)槊空{(diào)用一次session.invalidate()方法都會(huì)觸發(fā)sessionDestroyed()方法的調(diào)用
進(jìn)而形成死循環(huán),最終使Web應(yīng)用程序意外終止
//MyServletContextListener.java
//Web應(yīng)用程序的生命周期監(jiān)聽(tīng)器實(shí)現(xiàn)
package markchen.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
//在Web應(yīng)用程序初始化后該方法被調(diào)用
public void contextInitialized(ServletContextEvent event) {
System.out.println("******Application started******");
}
//在Web應(yīng)用程序銷(xiāo)毀時(shí)該方法被調(diào)用
public void contextDestroyed(ServletContextEvent event) {
System.out.println("******Application ended******");
}
}
一,查看linux的ssh服務(wù)是否已經(jīng)啟動(dòng):service sshd status;
如果沒(méi)有啟動(dòng)則執(zhí)行:service sshd start 或者 service sshd restart
二,使linux防火墻開(kāi)啟22端口,因?yàn)閟sh是通過(guò)22端口提供服務(wù)的
1.在/etc/sysconfig/iptables里添加
2.重啟iptables
3.看下?tīng)顟B(tài)
三,使用SSH Secure shell連接,選接連接方式為:password。
四,OK
redhat9下安裝VMware Tools
下面是安裝步驟:
1.啟動(dòng)Rad Hat 9.0(圖形界面方式登陸),并且以管理員的身份登陸。
2.在VMware虛擬機(jī)的菜單中點(diǎn)擊:虛擬機(jī)->安裝VMware 工具->install。
3.Red Hat 9.0自動(dòng)掛載VMware Tools的虛擬光驅(qū),并顯示在桌面。
4.進(jìn)去VMware Tools的虛擬光驅(qū)里,把VMwareTools-5.5.1-19175.tar.gz復(fù)制到/tmp目錄。
5.進(jìn)去/tmp目錄,把VMwareTools-5.5.1-19175.tar.gz解壓到當(dāng)前目錄下。
6.打開(kāi)一個(gè)終端(shell),并以root身份登陸。
7.輸入以下命令:cd /tmp/vmware-tools-distrib(進(jìn)入vmware-tools-distrib目錄)。
8.輸入:./vmware-install.pl(執(zhí)行vmware-install.pl文件)。
9.然后一路“回車(chē)”,就OK。
10. 輸入reboot命令(重新啟動(dòng))。
OK!!!
注:下面的其中幾個(gè)程序并非標(biāo)準(zhǔn)的Web即時(shí)聊天程序,只能算留言本而已.但其實(shí)他能當(dāng)聊天程序用,只是少了”即時(shí)”…
plugoo不需要額外的帳號(hào),只需要你經(jīng)常使用的IM帳號(hào)即可(目前plugoo支持的IM 有: MSN Messenger/ Yahoo! Messenger/ GoogleTalk/ Jabber ),注冊(cè)成功以后系統(tǒng)會(huì)自動(dòng)添加 plugoo@plugoo.com為你IM的好友,同時(shí)生成一段代碼,掛在自己的網(wǎng)站上便可以直接于你網(wǎng)站的訪(fǎng)客進(jìn)行Web網(wǎng)頁(yè)即時(shí)聊天。via
一款十分高效且簡(jiǎn)潔的網(wǎng)頁(yè)即時(shí)聊天程序序,一段簡(jiǎn)單的Javascript代碼可以幫助你完善個(gè)人站點(diǎn)的客服系統(tǒng)。Hab.la 目前仍然是一款測(cè)試中的產(chǎn)品,他們提供了一整套高效的網(wǎng)頁(yè)客服解決方案。缺少了MSN、AIM、Y! Messenger等多款I(lǐng)M通信協(xié)議的支持外,Hab.la 幾乎同Plugoo實(shí)現(xiàn)的功能如出一轍——只需要在自己的站點(diǎn)中添加上一小段輕量級(jí)的Javascript代碼,便可以很輕松的幫助站長(zhǎng)和管理員來(lái)連接自己用戶(hù)和讀者,并建立相對(duì)比較完善的客服系統(tǒng)。目前,Hab.la 已經(jīng)能夠全面支持Jabber與Google Talk!via
Chatback Badge是Google Talk團(tuán)隊(duì)發(fā)布的一款很有意思的網(wǎng)頁(yè)即時(shí)聊天小工具,它可以在頁(yè)面上實(shí)時(shí)顯示你的GT在線(xiàn)狀態(tài)以及個(gè)性化簽名等信息;不僅如 此,Chatback 還是一款可以即時(shí)引導(dǎo)用戶(hù)進(jìn)入Google Talk 網(wǎng)頁(yè)版 Badge進(jìn)行實(shí)時(shí)交流狀態(tài)的擴(kuò)展,這樣,你的訪(fǎng)客便可以借助網(wǎng)頁(yè)版GT和你的客戶(hù)端GTalk進(jìn)行即時(shí)聊天了,簡(jiǎn)單而快捷,你的讀者甚至不需要獨(dú)立的 GTalk帳戶(hù)也能夠輕松和你交流。via
TocPlus是讓您直接與網(wǎng)上商城、博客、網(wǎng)頁(yè)的訪(fǎng)客進(jìn)行實(shí)時(shí)對(duì)話(huà)的通訊系統(tǒng)。如果將TocPlus的服務(wù)適用于網(wǎng)上商城,就如地面商城可以向顧客直接推薦合適的商品或即時(shí)回答顧客所提出的咨詢(xún),因此可提高營(yíng)業(yè)效益。TocPlus的所有服務(wù)為免費(fèi)。
一個(gè)即時(shí)的視頻聊天服務(wù),通常我們需要使用同一種IM即時(shí)聊天工具,才能實(shí)現(xiàn)和別人視頻聊天,但是通過(guò)vawkr,只要雙方都有攝像頭,那么無(wú)需下載任何 IM工具,雙方都可進(jìn)行視頻聊天,你可以創(chuàng)建一個(gè)永久的聊天室,然后得到一個(gè)url地址,將這個(gè)地址發(fā)給你要邀請(qǐng)的人,當(dāng)他點(diǎn)擊進(jìn)入后,如果允許 vawkr使用其攝像頭和麥克風(fēng),那么你們就可以進(jìn)行視頻聊天了,vawkr還支持將聊天室放在MySpace 、Facebook、 blog 或者web上。via
-以下5個(gè)來(lái)自web20share
可 以在瀏覽器,網(wǎng)頁(yè)中嵌入聊天系統(tǒng),可以自定義用戶(hù)名,顯示在線(xiàn)訪(fǎng)問(wèn)人數(shù),訪(fǎng)客登陸/離開(kāi)網(wǎng)站提示(可以選擇關(guān)閉),訪(fǎng)客登陸提示音(可以選擇關(guān)閉),所有 聊天記錄都可以被RSS訂閱保存。Gabbly還有一個(gè)功能,任何一個(gè)網(wǎng)頁(yè),即便沒(méi)有裝Gabbly 在線(xiàn)聊天器,你只要在網(wǎng)址前加上’gabbly.com/’,如gabbly.com/hopesome.com,就可以和同在這個(gè)頁(yè)面的人即時(shí)聊天。
Blobber
功能和Gabbly類(lèi)似,需要注冊(cè)。
新浪推出的服務(wù),和新浪網(wǎng)頁(yè)上的差不多。需要郵件申請(qǐng),感覺(jué)用戶(hù)的可定制性不是很強(qiáng).
MeeboMe
作 為一個(gè)可以嵌入website/blog的flash widget,本身并不突出,但是當(dāng)它和Meebo結(jié)合起來(lái)之后,任何人都會(huì)覺(jué)得眼前一亮!換句簡(jiǎn)單點(diǎn)的話(huà)說(shuō),登錄Meebo之后,你不僅可以同時(shí)和 MSN、Y!M、Jabber/Gtalk以及AIM中的聯(lián)系人進(jìn)行交流,而且還能實(shí)時(shí)地和你的website/blog上的讀者進(jìn)行交流,而這一切都在 你的瀏覽器頁(yè)面中完成.
Cbox-blog
Cbox-更像是一個(gè)可以嵌入到blog中的留言本服務(wù),使用非常簡(jiǎn)單方便,通過(guò)調(diào)用一段代碼就可插入到blog中。并且還可以自定義大小和顏色樣式等,以便符合自已的blog風(fēng)絡(luò)。
通過(guò)twitter也可以做個(gè)簡(jiǎn)單的聊天室. 你必須有個(gè)twitter帳號(hào),然后在 twitterchat.com注冊(cè)一個(gè)帳號(hào),需要用twitter的用戶(hù)名及密碼,郵箱填自己的隨便一個(gè).注冊(cè)后會(huì)得到一段代碼,可以自己修改聊天窗口寬和高。然后掛在自己上的blog 即可。via
Chirrup是一個(gè)基于twitter的簡(jiǎn)單的評(píng)論/留言系統(tǒng),可以很方便地加入到自己blog/wiki/Web中。如果你的blog或者其他web沒(méi)有評(píng)論或者留言本系統(tǒng),除了以前介紹的js-kit外,chirrup也是一個(gè)不錯(cuò)的選擇,在twitter“大行其道”的網(wǎng)絡(luò)時(shí)代,所謂“鳥(niǎo)隨鸞鳳飛騰遠(yuǎn),人伴賢良品質(zhì)高”,安裝一個(gè)基于twitter的留言或評(píng)論系統(tǒng),對(duì)提高blog的流量、人氣等等也是很有幫助的。使用方法
是一個(gè)類(lèi)似于Plugoo的 即時(shí)通訊服務(wù),可通過(guò)代碼調(diào)用放置一個(gè)聊天窗口在你的Blog上,并與你的本地IM軟件連接,這樣當(dāng)你的讀者訪(fǎng)問(wèn)你的Blog時(shí),就可以與你及時(shí)聯(lián)絡(luò)了, 目前 Aimboo支持Jabber、Gtalk、MSN、AIM及ICQ等常用的IM協(xié)議。
client.connect("ip地址", 21);
client.login("用戶(hù)名", "密碼");
client.setSoTimeout(5000);//設(shè)置連接超時(shí)時(shí)間為5000毫秒
// 在嘗試連接以后,你應(yīng)該檢查返回碼驗(yàn)證是否連接成功!
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
System.err.println("FTP 服務(wù)器拒絕連接.");
System.exit(1);
}
System.out.println("連接正在建立中......");
if (client.isConnected()) {
System.out.println("連接已建立!");
client.setControlEncoding("gb2312");// 設(shè)置編碼方式,默認(rèn)編碼方式為:ISO8859-1
client.changeWorkingDirectory("archives");// 改變當(dāng)前ftp的工作目錄
// client.changeToParentDirectory();//回到上級(jí)目錄
FTPFile[] fs = client.listFiles(); // 得到當(dāng)前工作目錄下的所有文件
for (FTPFile ff : fs) {
if (ff.getName().equals("test.txt")) {
File file = new File("E:\\ftpdata" + File.separator
+ "test.txt");
RandomAccessFile rfile = new RandomAccessFile(file, "rw");// 隨機(jī)訪(fǎng)問(wèn)文件類(lèi)
long offset = rfile.length();
client.setRestartOffset(offset);
rfile.seek(offset);
InputStream input = client
.retrieveFileStream("test.txt");
byte[] data = new byte[1024];
System.out.println(new Date() + " 數(shù)據(jù)寫(xiě)入中...");
while (input.read(data) != -1) {
rfile.write(data);
}
System.out.println(new Date() + " 所有數(shù)據(jù)已接受完成!");
input.close();
rfile.close();
}
}
}
client.logout();
client.disconnect();
基本步驟:
1,創(chuàng)建連接
2,登錄
3,上傳或下載文件
4,退出
5,斷開(kāi)連接
常用方法:
void setControlEncoding(String encoding):設(shè)置FTP控制連接的編碼方式(默認(rèn)讀取中文文件名時(shí)為亂碼)
boolean changeWorkingDirectory(String pathname):設(shè)置當(dāng)前的工作目錄
boolean changeToParentDirectory():返回上級(jí)目錄
void setRestartOffset(long offset):設(shè)置重新啟動(dòng)的偏移量(用于斷點(diǎn)續(xù)傳)
下載文件:
boolean retrieveFile(String,remote,OutputStream local):從服務(wù)器返回指定名稱(chēng)的文件并且寫(xiě)入到OuputStream,以便寫(xiě)入到文件或其它地方。
InputStream retrieveFileStream(String remote):從服務(wù)器返回指定名稱(chēng)的文件的InputStream以便讀取。
上傳文件:
boolean storeFile(String remote,InputStream local):利用給定的名字(remote)和輸入流(InputStream)向服務(wù)器上傳一個(gè)文件。
OutputStream storeFileStream(String remote):根據(jù)給定的名字返回一個(gè)能夠向服務(wù)器上傳文件的OutputStream。
boolean storeUniqueFile(InputStream local):根據(jù)服務(wù)器自己指定的唯一的名字和輸入流InputStream向服務(wù)器上傳一個(gè)文件。
boolean storeUniqueFile(String remote,InputStream local):根據(jù)指定的名字和輸入流InputStream向服務(wù)器上傳一個(gè)文件。
OuputStream storeUniqueFileStream():返回一個(gè)輸出流OutputStream,以便向服務(wù)器寫(xiě)入一個(gè)文件,該文件由服務(wù)器自己命名。
OutputStream storeUniqueFileStream(String remote):返回一個(gè)輸出流OutputStream,以便向服務(wù)器寫(xiě)入一個(gè)文件,該文件由用戶(hù)自己指定。
OutputStreamWriter osr=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(osr);
InputStream is = new FileInputStream("");
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
最簡(jiǎn)單的一種:
登錄oracle enterprise manager console 選擇獨(dú)立登錄,選擇xml數(shù)據(jù)庫(kù),配置,直接修改http-port就ok了!
一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經(jīng)不再推薦使用,官方的解釋是這個(gè)連接池存在缺陷。如果你因?yàn)槟撤N原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
二、默認(rèn)情況下(即沒(méi)有配置連接池的情況下),Hibernate會(huì)采用內(nèi)建的連接池。但這個(gè)連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開(kāi)發(fā)環(huán)境下使用。
三、Hibernate2和Hibernate3的命名空間有所變化。例如,配置C3P0時(shí)的provider_class有Hibernate2環(huán)境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3環(huán)境下使用org.hibernate.connection.C3P0ConnectionProvider。
下面是Hibernate環(huán)境下幾種常見(jiàn)的連接池配置,都是以連接MySQl為例。
<!-- JDBC驅(qū)動(dòng)程序 -->
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true
& characterEncoding=GBK</property>
<!-- 數(shù)據(jù)庫(kù)用戶(hù)名 -->
<property name="connection.username">root</property>
<!-- 數(shù)據(jù)庫(kù)密碼 -->
<property name="connection.password">8888</property>
上面的一段配置,在c3p0和dbcp中,都是必需的,因?yàn)閔ibernate會(huì)根據(jù)上述的配置來(lái)生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來(lái)生成連接,這在下面再講。
從網(wǎng)上google了一下,發(fā)現(xiàn)大致有三種可以實(shí)施的解決方案:
1、使用hibernate自帶的連接池;
2、使用c3po包的連接池功能;
3、使用dbcp包的連接池功能;
4、使用Proxool包的連接池功能;
5、使用JNDI連接池
第一種方案,Hibernate默認(rèn)連接池,就是在myeclipse產(chǎn)生的hibernate.cfg.xml中添加一個(gè)屬性:
<property name="connection.pool_size">20</property>
第二種方案是:C3P0
只需在hibernate.cfg.xml中加入
<property name="c3p0.min_size">2</property>
<property name="c3p0.max_size">10</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.acquireRetryAttempts">4</property>
<property name="c3p0.acquireIncrement">1</property>
<property name="c3p0.idleConnectionTestPeriod">36000</property>
<property name="c3p0.initialPoolSize">2</property>
<property name="c3p0.maxPoolSize">10</property>
<property name="c3p0.maxIdleTime">1200</property>
<property name="c3p0.maxStatements">30</property>
<property name="c3p0.minPoolSize">2</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
還有在classespath中加入c3p0-0.8.4.5.jar
第三種方案是:dbcp
在hibernate.cfg.xml中加入
<property name="dbcp.maxActive">100</property>
<property name="dbcp.whenExhaustedAction">1</property>
<property name="dbcp.maxWait">60000</property>
<property name="dbcp.maxIdle">10</property>
<property name="dbcp.ps.maxActive">100</property>
<property name="dbcp.ps.whenExhaustedAction">1</property>
<property name="dbcp.ps.maxWait">60000</property>
<property name="dbcp.ps.maxIdle">10</property>
還有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.
第四種方案是:Proxool
建立一個(gè)Proxool.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- the proxool configuration can be embedded within your own application’s.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>
mysql
</alias>
<driver-url>
jdbc:mysql://localhost:3306/jackdemo
</driver-url>
<driver-class>
com.mysql.jdbc.Driver
</driver-class>
<driver-properties>
<property name="user" value="root" />
<property name="password" value="jack" />
</driver-properties>
<house-keeping-sleep-time>
60000
</house-keeping-sleep-time>
<proxool.simultaneous-build-throttle>
100
</proxool.simultaneous-build-throttle>
<prototype-count>
2
</prototype-count>
<maximum-connection-count>
100
</maximum-connection-count>
<minimum-connection-count>
10
</minimum-connection-count>
</proxool>
</something-else-entirely>
現(xiàn)在來(lái)看下配置的意思:
<alias>配置連接池的別名;
<driver-url>和寫(xiě)JDBC連接數(shù)據(jù)庫(kù)時(shí)的URL一樣。
<driver-class>和寫(xiě)JDBC連接數(shù)據(jù)庫(kù)時(shí)的Driver一樣。
<driver-properies>就是連接數(shù)據(jù)庫(kù)時(shí)的用戶(hù)名和密碼。
<house-keeping-sleep-time>proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷(xiāo)毀
<prototype-count>最少保持的空閑連接數(shù)
<maximum-connection-count>最大連接數(shù)。
<minimum-connection-count>最小連接數(shù)。
以下是在Hibernate配置文件中對(duì)連接池的配置:
<?xml version=’1.0’ encoding=’UTF-8’?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- proxool連接池加載的類(lèi)-->
<property name="hibernate.connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</property>
<!--連接池的別名,即配置連接池時(shí)起的別名-->
<property name="hibernate.proxool.pool_alias">
mysql
</property>
<!--連接池文件的地址-->
<property name="hibernate.proxool.xml">
config/proxool/proxool.xml
</property>
<!--是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試-->
<property name="show_sql">true</property>
<mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
<mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
</session-factory>
</hibernate-configuration>
第五種方案是:JNDI連接池。數(shù)據(jù)源已經(jīng)由應(yīng)用服務(wù)配置好(如Web服務(wù)器),Hibernate需要做的只是通過(guò)JNDI名查找到此數(shù)據(jù)源。應(yīng)用服務(wù)器將連接池對(duì)外顯示為JNDI綁定數(shù)據(jù)源,它是javax.jdbc.Datasource類(lèi)的一個(gè)實(shí)例。只要配置一個(gè)Hibernate文件,如:
hibernate.connection.datasource = java:/comp/env/jdbc/portal //JNDI名
hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_loopup_class = org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.MySQLDialect。