vickzhu

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks

          2009年1月22日 #

          ##通用查詢?nèi)罩荆河涗浗⒌目蛻舳诉B接和執(zhí)行的語句
          ##慢查詢?nèi)罩荆河涗浰袌?zhí)行時間超過long_query_time值的所有查詢或者不使用索引的查詢
          ##查看數(shù)據(jù)庫版本
          SHOW VARIABLES LIKE '%version%';
          ##查看通用查詢?nèi)罩?/div>
          SHOW VARIABLES LIKE '%general%';
          ##設(shè)置通用查詢?nèi)罩緸殚_啟
          SET GLOBAL general_log=ON;
          ##設(shè)置通用查詢?nèi)罩緸殛P(guān)閉
          SET GLOBAL general_log=OFF;
          ##查看當(dāng)前慢查詢?nèi)罩据敵龅母袷剑梢允荈ILE(存儲在數(shù)數(shù)據(jù)庫的數(shù)據(jù)文件中的hostname.log),也可以是TABLE(存儲在數(shù)據(jù)庫中的mysql.general_log)
          SHOW VARIABLES LIKE '%log_output%';
          ##設(shè)置查詢?nèi)罩据敵龅轿募?/div>
          SET GLOBAL log_output='file';
          ##設(shè)置慢查詢?nèi)罩颈4娴奈募?/div>
          SET GLOBAL slow_query_log_file="/var/lib/mysql/localhost-slow.log";
          ##查看慢查詢相關(guān)設(shè)置
          SHOW VARIABLES LIKE '%slow_query%';
          ##設(shè)置慢查詢閾值為1,默認(rèn)為10
          SET GLOBAL long_query_time=1;
          ##設(shè)置慢查詢閾值為10,默認(rèn)為10
          SET GLOBAL long_query_time=10;
          ##查看慢查詢的閾值
          SHOW GLOBAL VARIABLES LIKE '%long_query_time%';
          ##查看有多少慢查詢
          SHOW GLOBAL STATUS LIKE '%Slow_queries%';
          ##睡眠11秒,測試慢查詢
          ##select SLEEP(11);
          posted @ 2018-10-09 16:59 筱 筱 閱讀(184) | 評論 (0)編輯 收藏

          velocity properties加載時是放在HashMap中的,首先會加載configLocation中指定文件的內(nèi)容,然后加載VelocityConfigurer中通過velocityProperties配置的屬性,
          因此,在VelocityConfigurer中配置的屬性會覆蓋configLocation指定文件中的屬性
          posted @ 2014-08-22 11:03 筱 筱 閱讀(5898) | 評論 (0)編輯 收藏

          1、達(dá)到默認(rèn)最大buffer size
          2、調(diào)用HttpServletResponse.flushBuffer()
          3、調(diào)用HttpServletResponse.getOutputStream().flush()或者HttpServletResponse.getWriter().flush()
          4、調(diào)用HttpServletResponse.sendError()或者HttpServletResponse.sendRedirect()
          posted @ 2014-07-23 13:11 筱 筱 閱讀(5907) | 評論 (0)編輯 收藏

          <plugins>
                <plugin>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                      <extdirs>WebContent/WEB-INF/lib</extdirs>
                    </compilerArguments>
                    </configuration>
                  </plugin>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-war-plugin</artifactId>
                  <configuration>
                    <webXml>WebContent/WEB-INF/web.xml</webXml>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                  </configuration>
                </plugin>
              </plugins>
          posted @ 2013-11-01 17:03 筱 筱 閱讀(6459) | 評論 (1)編輯 收藏

          在onPrepareDialog()中添加如下代碼:
          AlertDialog syncDialog = (AlertDialog) dialog;
          Button button = syncDialog.getButton(AlertDialog.BUTTON_POSITIVE);
          button.setText("確定");
          button.setVisibility(View.VISIBLE);
          button.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {

              }
          });
          posted @ 2013-03-01 12:51 筱 筱 閱讀(7037) | 評論 (0)編輯 收藏

          uml
          1. 類圖之間的關(guān)系
          2. 依賴和關(guān)聯(lián)關(guān)系:
            依賴:是類與類之間的連接,表示一個類依賴于另一個類的定義。例如如果A依賴于B,則B體現(xiàn)為局部變量,方法的參數(shù)、或靜態(tài)方法的調(diào)用。 
            關(guān)聯(lián):類與類之間的聯(lián)接,它使一個類知道另一個類的屬性和方法, 具體表現(xiàn)為類的成員變量中包含某個對象 

            組合和聚合:
            在有整體和部分關(guān)系是才有組合和聚合的概念,屬于關(guān)聯(lián)關(guān)系
            組合:部分離開整體不能存在
            聚合:部分可以離開整體而存在

          3. 用例圖之間的關(guān)系:
          4. 包含、泛化、擴(kuò)展
            包含:當(dāng)兩個或多個用例中共用一組相同的動作,這時可以將這組相同的動作抽出來作為一個獨立的子用例,供多個基用例所共享。因為子用例被抽出,基用例并非一個完整的用例,所以include關(guān)系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執(zhí)行 
            泛化:繼承關(guān)系,子用例將繼承基用例的所有行為 ,也就是說在任何使用基用例的地方都可以用子用例來代替。領(lǐng)導(dǎo)擁有審批的權(quán)限,而請假申請審批、加班申請審批都是審批的子類
            擴(kuò)展:對基用例的擴(kuò)展,基用例是一個完整的用例,即使沒有子用例的參與,也可以完成一個完整的功能。 

          posted @ 2012-06-29 11:42 筱 筱 閱讀(5770) | 評論 (0)編輯 收藏

          學(xué)習(xí)osworkflow
          http://my.so-net.net.tw/idealist/OSWorkflow/
           

          wfentry表中的state字段來自于接口WorkflowEntry,有如下幾個值:
              public static final int CREATED = 0;
              public static final int ACTIVATED = 1;
              public static final int SUSPENDED = 2;
              public static final int KILLED = 3;
              public static final int COMPLETED = 4;
              public static final int UNKNOWN = -1;


          Workflow接口相當(dāng)于我們service層的接口,而WorkflowStore接口相當(dāng)于我們DAO層的接口,
          我們知道osworkflow提供的Workflow實現(xiàn)(如:BasicWorkflow)有時并不能滿足業(yè)務(wù)的需要,因此我們可以實現(xiàn)自己的Workflow,具體可以參照BasicWorkflow 
          繼承AbstractWorkflow,接著加入自己想要的方法。同理,我們可以通過繼承相應(yīng)的WorkflowStore(如:HibernateWorkflowStore)來編寫自己的方法
          posted @ 2012-06-26 14:49 筱 筱 閱讀(5732) | 評論 (0)編輯 收藏

          1、日期格式化:
              DateFormat
              SimplateDateFormat

          2、數(shù)字格式化
              NumberFormat
              DecimalFormat

          3、字符串格式化:
              MessageFormat 以{0},{1}作為占位符,如果你的pattern中有兩個以上的{0},在format時都會用第一個參數(shù)替換
              String.format 以%s作為占位符,按傳入的參數(shù)一一匹配
              
          posted @ 2011-09-01 17:39 筱 筱 閱讀(3143) | 評論 (0)編輯 收藏

          文字:openfire
          語音/視頻:FMS,red5
          posted @ 2011-08-29 13:58 筱 筱 閱讀(2761) | 評論 (1)編輯 收藏

          在使用svn add 時提示:
          A  (bin)  templates/translate/screen/selectTransLang.vm
          請看官方文檔的解釋:

          當(dāng)你第一次添加或者導(dǎo)入文件到Subversion中時,Subversion會檢測該文件是否是二進(jìn)制文件。目前,Subversion的策略是只檢測文件的前1024個字節(jié);如果所有字節(jié)都是0,或者超過15%都是非ASCII碼輸出字符的話,那么Subversion就認(rèn)定該文件是二進(jìn)制文件。
          如果Subversion認(rèn)定文件是二進(jìn)制文件,那么這個文件就會自動添加svn:mime-type屬性,并設(shè)置為“application/octet-stream”。(你隨時可以使用auto-props特性來重寫這樣的行為,或者使用svn propset手動設(shè)置屬性。)
          Subversion對以下的文件做普通文本處理:
          1、沒有設(shè)置svn:mime-type屬性的文件
          2、文件的svn:mime-type屬性值以“text/”開頭
          3、文件的svn:mime-type屬性值等于“image/x-xbitmap”
          4、文件的svn:mime-type屬性值等于“image/x-xpixmap”

          所有其他文件都將被視為二進(jìn)制文件處理,這意味著Subversion:
          1、不會嘗試在svn update或者svn merge操作時將遠(yuǎn)程修改合并到本地中
          2、在svn diff中不會顯示出不同
          3、在svn blame不會每行顯示版本和作者信息

          在其他方面,Subversion將二進(jìn)制文件和其他文本文件一樣對待
          需要注意,不管是不是二進(jìn)制文件,都不會影響版本庫中用來存儲文件變更的空間大小,也不會影響客戶端和服務(wù)端之間的通訊量。出于存儲和傳輸考慮,Subversion使用的是對二進(jìn)制文件和普通文本文件一致處理的diffing方法;這和‘svn diff’使用的diffing方法完全不相關(guān)。

          好了,我們來看看剛才加的文件是否為二進(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

          解決方法,直接編輯去掉這個屬性
          svn propedit svn:mime-type selectTransLang.vm
          或者刪除.svn/props/selectTransLang.vm.svn-work

          看看網(wǎng)上其他牛人的解決方法:
          修改~/.subversion/config
          找到最后一個section,在最后加上如下一行話:
          *.txt = svn:mime-type=text/plain;svn:eol-style=native
          光這個還不夠,向上搜索到這么一行
          # enable-auto-props = yes
          把前面用來注釋這行的那個#和其后的空格去掉

          如果用的是TortoiseSVN,開始菜單 -> TortoiseSVN -> Settings -> General,此時右側(cè)有一個名為Edit的按鈕,點擊之后就可以編輯config了

          posted @ 2011-08-04 21:51 筱 筱 閱讀(4036) | 評論 (0)編輯 收藏

          gson:java對象和json之間相互轉(zhuǎn)換
          xsteam:java對象和xml之間相互轉(zhuǎn)換
          posted @ 2011-07-15 16:55 筱 筱 閱讀(2330) | 評論 (0)編輯 收藏

          在頁面中顯示某字段時,字段值過長會導(dǎo)致頁面樣式錯亂,這時候我們需要對值進(jìn)行截取,當(dāng)截取值時會碰到以下問題:
          1、如果按字符截取會導(dǎo)致中英文顯示的長度不一
          2、如果按字節(jié)截取可能會導(dǎo)致最后一個中文截成兩部分
          以下代碼是在網(wǎng)上獲取并經(jīng)過改造而成,能夠很好的解決上面兩個問題
              /**
               * 根據(jù)指定字節(jié)數(shù)截取字符串,當(dāng)指定處為中文第一個字節(jié)時少截取一個字符,當(dāng)長度大于指定截取長度時,截取后在字符串末尾追加指定字符串<br/>
               * 這里添加了字符串的編碼,因為頁面的編碼不同,字符串所占字節(jié)也不同
               *
               * @param str 待截取字符串,如果為null或者"",則立即返回str
               * @param length 需要截取的長度
               * @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;// 這里要和頁面的編碼相關(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;
                  }
              }
          posted @ 2010-12-14 10:49 筱 筱 閱讀(352) | 評論 (0)編輯 收藏

          英文不太好,經(jīng)常忘記,所以現(xiàn)在寫下來:
          1,transient:在序列化一個類時,如果類中某個字段不想被序列化,則使用此關(guān)鍵字
          2、volatile:用于線程同步時

          posted @ 2010-12-13 20:49 筱 筱 閱讀(243) | 評論 (0)編輯 收藏

          根據(jù)分代收集器原理(可以參考垃圾回收機制分類),JVM的內(nèi)存可分為三個域: 新域、舊域以及永久域
          JVM生成的所有新對象放在新域中。一旦對象經(jīng)歷了一定數(shù)量的垃圾收集循環(huán)后,便進(jìn)入舊域。而在永久域中是用來存儲JVM自己的反射對象的,如class 和method對象,而且GC(Garbage Collection)不會在主程序運行期對永久域進(jìn)行清理。其中新域和舊域?qū)儆诙眩谰糜蚴且粋€獨立域并且不認(rèn)為是堆的一部分
          一、java.lang.OutOfMemoryError: PermGen space

          PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,
          這塊內(nèi)存主要是被 JVM存放Class和Method信息的,Class在被Loader時就會被放到PermGen space中,
          它和存放類實例 (Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對
          PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS的話,就很可能出現(xiàn)PermGen space錯誤,
          這種錯誤常見在web服務(wù)器對 JSP進(jìn)行pre compile(預(yù)編譯)的時候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小
          超過了jvm默認(rèn)的大小(4M)那么就會 產(chǎn)生此錯誤信息了。
          解決方法: 手動設(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程序運行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動的時候會自動設(shè)置Heap size的值,
          其初始空間(即 -Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可
          進(jìn)行設(shè) 置。Heap size 的大小是Young Generation 和Tenured Generaion 之和(新域和舊域之和)。
          提示:在JVM中如果98% 的時間是用于GC且可用的Heap size 不足2%的時候?qū)伋龃水惓P畔ⅰ?br /> 提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項設(shè)置為相同,而-Xmn為1/4的-Xmx值。
          解決方法:手動設(shè)置 Heap size
          修改TOMCAT_HOME/bin/catalina.sh
          在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
          JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"


          posted @ 2010-08-19 20:39 筱 筱 閱讀(243) | 評論 (0)編輯 收藏

          動態(tài)應(yīng)用,是相對于網(wǎng)站靜態(tài)內(nèi)容而言, 是指以c/c++、php、Java、perl、.net等 服務(wù)器端語言開發(fā)的網(wǎng)絡(luò)應(yīng)用軟件,比如論壇、網(wǎng)絡(luò)相冊、交友、BLOG等常見應(yīng)用。動態(tài)應(yīng)用系統(tǒng)通 常與數(shù)據(jù)庫系統(tǒng)、緩存系統(tǒng)、分布式存儲系統(tǒng)等密不可分。

          大型動態(tài)應(yīng)用系統(tǒng)平臺主要是針對于大流 量、高并發(fā)網(wǎng)站建立的底層系統(tǒng)架構(gòu)。大型網(wǎng)站的運行需要一個可靠、安全、可擴(kuò)展、易維護(hù)的應(yīng)用系統(tǒng)平臺做為支撐,以保證網(wǎng)站應(yīng)用的平穩(wěn)運行。

          大型動態(tài)應(yīng)用系統(tǒng)又可分為幾個子系統(tǒng):

          l         Web前端系統(tǒng)

          l         負(fù)載均衡系統(tǒng)

          l         數(shù)據(jù)庫集群系統(tǒng)

          l         緩存系統(tǒng)

          l         分布式存儲系統(tǒng)

          l         分布式服務(wù)器管理系統(tǒng)

          l         代碼分發(fā)系統(tǒng)

          Web前端系統(tǒng)

          結(jié)構(gòu)圖:

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

          負(fù)載均衡系統(tǒng)


          負(fù)載均衡系統(tǒng)分為硬件和軟件兩種。硬件負(fù)載均衡效率高,但是價格貴,比如F5等。軟件負(fù)載均衡系統(tǒng)價格較低或者免費,效率較硬件負(fù)載均衡系統(tǒng) 低,不過對于流量一般或稍大些網(wǎng)站來講也足夠使用,比如lvs,nginx。大多數(shù)網(wǎng)站都是硬件、軟件負(fù)載均衡系統(tǒng)并用。

          數(shù)據(jù)庫集群系統(tǒng)

          結(jié)構(gòu)圖:


          由于Web前端采用了負(fù)載均衡集群結(jié)構(gòu)提高了服務(wù)的有效性和擴(kuò)展性,因此數(shù)據(jù)庫必須也是高可靠的才能保證整個服務(wù)體系的高可靠性,如何構(gòu)建一個高可靠的、可以提供大規(guī)模并發(fā)處理的數(shù)據(jù)庫體系?

          我們可以采用如上圖所示的方案:

          1)        使用 MySQL 數(shù)據(jù)庫,考慮到Web應(yīng)用的數(shù)據(jù)庫讀多寫少的特點,我們主要對讀數(shù)據(jù)庫做了優(yōu)化,提供專用的讀數(shù)據(jù)庫和寫數(shù)據(jù)庫,在應(yīng)用程序中實現(xiàn)讀操作和寫操作分別訪問不同的數(shù)據(jù)庫。

          2)        使用 MySQL Replication 機制實現(xiàn)快速將主庫(寫庫)的數(shù)據(jù)庫復(fù)制到從庫(讀庫)。一個主庫對應(yīng)多個從庫,主庫數(shù)據(jù)實時同步到從庫。

          3)        寫數(shù)據(jù)庫有多臺,每臺都可以提供多個應(yīng)用共同使用,這樣可以解決寫庫的性能瓶頸問題和單點故障問題。

          4)        讀數(shù)據(jù)庫有多臺,通過負(fù)載均衡設(shè)備實現(xiàn)負(fù)載均衡,從而達(dá)到讀數(shù)據(jù)庫的高性能、高可靠和高可擴(kuò)展性。

          5)        數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器分離。

          6)        從數(shù)據(jù)庫使用BigIP做負(fù)載均衡。

          緩存系統(tǒng)


          緩存分為文件緩存、內(nèi)存緩存、數(shù)據(jù)庫緩存。在大型Web應(yīng)用中使用最多且效率最高的是內(nèi)存緩存。最常用的內(nèi)存緩存工具是Memcachd。使用正確的緩存系統(tǒng)可以達(dá)到實現(xiàn)以下目標(biāo):

          1、   使用緩存系統(tǒng)可以提高訪問效率,提高服務(wù)器吞吐能力,改善用戶體驗。

          2、   減輕對數(shù)據(jù)庫及存儲集服務(wù)器的訪問壓力

          3、Memcached服務(wù)器有多臺,避免單點故障,提供高可靠性和可擴(kuò)展性,提高性能。

          分布式存儲系統(tǒng)

          結(jié)構(gòu)圖:


          WEB系統(tǒng)平臺中的存儲需求有下面兩個特點:

          1) 存儲量很大,經(jīng)常會達(dá)到單臺服務(wù)器無法提供的規(guī)模,比如相冊、視頻等應(yīng)用。因此需要專業(yè)的大規(guī)模存儲系統(tǒng)。

          2) 負(fù)載均衡cluster中的每個節(jié)點都有可能訪問任何一個數(shù)據(jù)對象,每個節(jié)點對數(shù)據(jù)的處理也能被其他節(jié)點共享,因此這些節(jié)點要操作的數(shù)據(jù)從邏輯上看只能是一個整體,不是各自獨立的數(shù)據(jù)資源。

          因此高性能的分布式存儲系統(tǒng)對于大型網(wǎng)站應(yīng)用來說是非常重要的一環(huán)。(這個地方需要加入對某個分布式存儲系統(tǒng)的簡單介紹。)

          分布式服務(wù)器管理系統(tǒng)

          結(jié)構(gòu)圖:


          隨著網(wǎng)站訪問流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,原來基于單機的服務(wù)器管理模式已經(jīng)不能夠滿足我們的需求,新的需求必須能夠集中式的、分組的、批量的、自動化的對服務(wù)器進(jìn)行管理,能夠批量化的執(zhí)行計劃任務(wù)。

          在分布式服務(wù)器管理系統(tǒng)軟件中有一些比較優(yōu)秀的軟件,其中比較理想的一個是 Cfengine。它可以對服務(wù)器進(jìn)行分組,不同的分組可以分別定制系統(tǒng)配置文件、計劃任務(wù)等配置。它是基于C/S 結(jié)構(gòu)的,所有的服務(wù)器配置和管理腳本程序都保存在Cfengine Server上,而被管理的服務(wù)器運行著 Cfengine Client 程序,Cfengine Client通過SSL加密的連接定期的向服務(wù)器端發(fā)送請求以獲取最新的配置文件和管理命令、腳本程序、補丁安裝等任務(wù)。

          有了Cfengine 這種集中式的服務(wù)器管理工具,我們就可以高效的實現(xiàn)大規(guī)模的服務(wù)器集群管理,被管理服務(wù)器和 Cfengine Server 可以分布在任何位置,只要網(wǎng)絡(luò)可以連通就能實現(xiàn)快速自動化的管理。

          代碼發(fā)布系統(tǒng)

          結(jié)構(gòu)圖:

          隨著網(wǎng)站訪問流量的不斷增加,大多的網(wǎng)絡(luò)服務(wù)都是以負(fù)載均衡集群的方式對外提供服務(wù),隨之集群規(guī)模的擴(kuò)大,為了滿足集群環(huán)境下程序代碼的批量分發(fā)和更新,我們還需要一個程序代碼發(fā)布系統(tǒng)。

          這個發(fā)布系統(tǒng)可以幫我們實現(xiàn)下面的目標(biāo):

          1) 生產(chǎn)環(huán)境的服務(wù)器以虛擬主機方式提供服務(wù),不需要開發(fā)人員介入維護(hù)和直接操作,提供發(fā)布系統(tǒng)可以實現(xiàn)不需要登陸服務(wù)器就能把程序分發(fā)到目標(biāo)服務(wù)器。

          2) 我們要實現(xiàn)內(nèi)部開發(fā)、內(nèi)部測試、生產(chǎn)環(huán)境測試、生產(chǎn)環(huán)境發(fā)布的4個開發(fā)階段的管理,發(fā)布系統(tǒng)可以介入各個階段的代碼發(fā)布。

          3) 我們需要實現(xiàn)源代碼管理和版本控制,SVN可以實現(xiàn)該需求。

          這里面可以使用常用的工具Rsync,通過開發(fā)相應(yīng)的腳本工具實現(xiàn)服務(wù)器集群間代碼同步分發(fā)。

          posted @ 2010-08-04 20:24 筱 筱 閱讀(203) | 評論 (0)編輯 收藏

          管道:"|"
              將一個命令的輸出作為下一個命令的輸入
              例:ls | grep text            --這個命令將查找當(dāng)前目錄下名稱中包含text的目錄或者文件
          xargs:
              將一個命令的輸入作為下一個命令的參數(shù)
              例:ls | xargs grep -i text        --這個命令將當(dāng)前目下的所有文件作為參數(shù)傳遞給grep來查找文件中是否包含"text" 
                   find . | xargs grep "user"    --查詢當(dāng)前目錄及其子目錄下所有內(nèi)容中包含"user"的文件
          posted @ 2010-07-19 00:19 筱 筱 閱讀(379) | 評論 (0)編輯 收藏

          mysql:select * from 表名 order by rand() limit 10;
          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)
          posted @ 2010-05-09 22:35 筱 筱 閱讀(702) | 評論 (0)編輯 收藏

          樣式代碼如下:
          html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
          需要最新網(wǎng)頁標(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"/>
          posted @ 2010-04-21 12:19 筱 筱 閱讀(237) | 評論 (0)編輯 收藏

          1、下載wamp5,安裝wamp5,如需更改端口請修改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、安裝后訪問首頁http://localhost:8888,點擊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文件,沒有[Zend]塊,表明ZendOptimizer沒有安裝
          3、下載ZendOptimizer,安裝路徑選擇D:\Program Files\Zend,選擇apache2.x及php.ini的位置,安裝完成后php.ini最后會添加以下內(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、訪問http://loalhost:8888/ppframe進(jìn)行ppframe的安裝,安裝成功后登陸后臺,如果沒有安裝ZendOptimizer,左側(cè)的exam是打不開的,但是passport可以打開。

          posted @ 2010-04-19 15:00 筱 筱 閱讀(486) | 評論 (0)編輯 收藏

          1、如果頁面有<base/>標(biāo)簽的則要在js引入后再添加<base target="_self" />;

          2、在<script/>中添加屬性defer="defer";

          posted @ 2010-03-31 17:28 筱 筱 閱讀(419) | 評論 (0)編輯 收藏

          比如java向txt文件中寫入新的一行時,java獲得文本輸入框中的新行時等
          Unix系統(tǒng)里,每行結(jié)尾只有“<換行>”,即“\r”;
          Windows系統(tǒng)里面,每行結(jié)尾是“<換行><回車>”,即“\r\n”;
          Mac系統(tǒng)里,每行結(jié)尾是“<回車>”,即“\n”。
          一個直接后果是,Unix/Mac系統(tǒng)下的文件在Windows里打開的話,所有文字會變成一行;
          而Windows里的文件在Unix/Mac下打開的話,在每行的結(jié)尾可能會多出一個^M符號。

          posted @ 2010-03-31 13:37 筱 筱 閱讀(2376) | 評論 (2)編輯 收藏

          如果已經(jīng)配置mysql的環(huán)境變量,請直接執(zhí)行:mysql -u 輸入用戶名 -p 回車 之后輸入密碼
          如果未配置環(huán)境變量請先進(jìn)入mysql的bin目錄下
          執(zhí)行如下語句導(dǎo)入:source 輸入sql文件的位置
          執(zhí)行如下語句導(dǎo)出:mysqldump -u輸入用戶名 -p輸入密碼 數(shù)據(jù)庫名 表名 >文件名.sql

          posted @ 2010-01-19 11:26 筱 筱 閱讀(286) | 評論 (0)編輯 收藏

          服務(wù)端:http://labs.northscale.com/memcached-packages/
          客戶端:http://code.google.com/p/memcached/wiki/Clients/
          posted @ 2009-12-31 10:57 筱 筱 閱讀(431) | 評論 (1)編輯 收藏

          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、打開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.
                  此時產(chǎn)生名為:Apache Tomcat tomcat 的服務(wù)
          6、卸載命令:service remove tomcat
                  執(zhí)行結(jié)果為:
                      The service 'tomcat' has been removed

          posted @ 2009-12-25 15:12 筱 筱 閱讀(673) | 評論 (0)編輯 收藏

          @echo off
          rem 這段代碼的作用是對mysql進(jìn)行查詢操作,并將查詢結(jié)果寫入到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

          posted @ 2009-11-30 17:17 筱 筱 閱讀(361) | 評論 (0)編輯 收藏

          千萬人同時訪問的網(wǎng)站,一般是有很多個數(shù)據(jù)庫同時工作,說明白一點就是數(shù)據(jù)庫集群和并發(fā)控制,這樣的網(wǎng)站實時性也是相對的。這些網(wǎng)站都有一些共同的特點:數(shù)據(jù)量大,在線人數(shù)多,并發(fā)請求多,pageview高,響應(yīng)速度快。總結(jié)了一下各個大網(wǎng)站的架構(gòu),主要提高效率及穩(wěn)定性的幾個地方包括:

            1、程序

            程序開發(fā)是一方面,系統(tǒng)架構(gòu)設(shè)計(硬件+網(wǎng)絡(luò)+軟件)是另一方面。

            軟件架構(gòu)方面,做網(wǎng)站首先需要很多web服務(wù)器存儲靜態(tài)資源,比如圖片、視頻、靜態(tài)頁等,千萬不要把靜態(tài)資源和應(yīng)用服務(wù)器放在一起。

            一個好的程序員寫出來的程序會非常簡潔、性能很好,一個初級程序員可能會犯很多低級錯誤,這也是影響網(wǎng)站性能的原因之一。

            網(wǎng)站要做到效率高,不光是程序員的事情,數(shù)據(jù)庫優(yōu)化、程序優(yōu)化這是必須的,在性能優(yōu)化上要數(shù)據(jù)庫和程序齊頭并進(jìn)!緩存也是兩方面同時入手。第一,數(shù)據(jù)庫緩存和數(shù)據(jù)庫優(yōu)化,這個由dba完成(而且這個有非常大的潛力可挖,只是由于我們都是程序員而忽略了他而已)。第二,程序上的優(yōu)化,這個非常的有講究,比如說重要一點就是要規(guī)范SQL語句,少用in 多用or,多用preparestatement,另外避免程序冗余如查找數(shù)據(jù)少用雙重循環(huán)等。另外選用優(yōu)秀的開源框架加以支持,我個人認(rèn)為中后臺的支持是最最重要的,可以選取spring+ibatis。因為ibatis直接操作SQL并有緩存機制。spring的好處就不用我多說了,IOC的機制可以避免new對象,這樣也節(jié)省開銷。據(jù)我分析,絕大部分的開銷就是在NEW的時候和連接數(shù)據(jù)庫時候產(chǎn)生的,請盡量避免。另外可以用一些內(nèi)存測試工具來做一個demo說明hibernate和ibatis誰更快!前臺你想用什么就用什么,struts,webwork都成,如果覺得自己挺牛X可以試試tapestry。

            用數(shù)據(jù)庫也未必不能解決訪問量巨大所帶來的問題,作成靜態(tài)文件硬盤的尋址時間也未必少于數(shù)據(jù)庫的搜索時間,當(dāng)然對資料的索引要下一翻工夫。我自己覺得門戶往往也就是當(dāng)天、熱門的資料點擊率較高,將其做緩存最多也不過1~2G的數(shù)據(jù)量吧,舉個例子:

          拿網(wǎng)易新聞來http://news.163.com/07/0606/09/3GA0D10N00011229.html

            格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html

            可以把當(dāng)天發(fā)布的、熱門的、流攬量大的作個緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對象),靜態(tài)將其放到內(nèi)存(速度絕對快過硬盤尋址靜態(tài)頁面)。

          通常是采用oracle存儲過程+2個weblogic,更新機制也幾乎一樣每簽發(fā)一條新聞,就會生成靜態(tài)頁面,然后發(fā)往前端的web服務(wù)器,前端的web都是做負(fù)載均衡的。另外還有定時的程序,每5-15分鐘自動生成一次。在發(fā)布新聞的同時將數(shù)據(jù)緩存。當(dāng)然緩存也不會越來越大,在個特定的時間段(如凌晨)剔除過期的數(shù)據(jù)。做一個大的網(wǎng)站遠(yuǎn)沒有想象中那么簡單,服務(wù)器基本就要百十個的。

            這樣可以大大增加一臺計算機的處理速度,如果一臺機器處理不了,可以用httpserver集群來解決問題了。


            2、網(wǎng)絡(luò)
            中國的網(wǎng)絡(luò)分南北電信和網(wǎng)通,訪問的ip就要區(qū)分南北進(jìn)入不同的網(wǎng)絡(luò)。


            3、集群
            通常會使用CDN與GSBL與DNS負(fù)載均衡技術(shù),每個地區(qū)一組前臺服務(wù)器群,例如:網(wǎng)易,百度使用了DNS負(fù)載均衡技術(shù),每個頻道一組前臺服務(wù)器,一搜使用了DNS負(fù)載技術(shù),所有頻道共用一組前臺服務(wù)器集群。

            網(wǎng)站使用基于Linux集群的負(fù)載均衡,失敗恢復(fù),包括應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器,基于linux-ha的服務(wù)狀態(tài)檢測及高可用化。

            應(yīng)用服務(wù)器集群可以采用apache+tomcat集群和weblogic集群等;web服務(wù)器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據(jù)情況選擇。

           4、數(shù)據(jù)庫

            因為是千萬人同時訪問的網(wǎng)站,所以一般是有很多個數(shù)據(jù)庫同時工作的,說明白一點就是數(shù)據(jù)庫集群和并發(fā)控制,數(shù)據(jù)分布到地理位置不同的數(shù)據(jù)中心,以免發(fā)生斷電事故。另外還有一點的是,那些網(wǎng)站的靜態(tài)化網(wǎng)頁并不是真的,而是通過動態(tài)網(wǎng)頁與靜態(tài)網(wǎng)頁網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite 這樣的開源網(wǎng)址映射器實現(xiàn)。這樣的網(wǎng)站實時性也是相對的,因為在數(shù)據(jù)庫復(fù)制數(shù)據(jù)的時候有一個過程,一般在技術(shù)上可以用到hibernate和 ecache,但是如果要使網(wǎng)站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務(wù)器來支持,并且要用oracle這樣的大型數(shù)據(jù)庫。

            大型門戶網(wǎng)站不建議使用Mysql數(shù)據(jù)庫,除非你對Mysql數(shù)據(jù)的優(yōu)化非常熟悉。Mysql數(shù)據(jù)庫服務(wù)器的master-slave模式,利用數(shù)據(jù)庫服務(wù)器在主從服務(wù)器間進(jìn)行同步,應(yīng)用只把數(shù)據(jù)寫到主服務(wù)器,而讀數(shù)據(jù)時則根據(jù)負(fù)載選擇一臺從服務(wù)器或者主服務(wù)器來讀取,將數(shù)據(jù)按不同策略劃分到不同的服務(wù)器(組)上,分散數(shù)據(jù)庫壓力。

            大型網(wǎng)站要用oracle,數(shù)據(jù)方面操作盡量多用存儲過程,絕對提升性能;同時要讓DBA對數(shù)據(jù)庫進(jìn)行優(yōu)化,優(yōu)化后的數(shù)據(jù)庫與沒優(yōu)化的有天壤之別;同時還可以擴(kuò)展分布式數(shù)據(jù)庫,以后這方面的研究會越來越多;


            5、頁面

            從開始就考慮使用虛擬存儲/簇文件系統(tǒng)。它能讓你大量并行IO訪問,而且不需要任何重組就能夠增加所需要的磁盤。

            頁面數(shù)據(jù)調(diào)用更要認(rèn)真設(shè)計,一些數(shù)據(jù)查詢可以不通過數(shù)據(jù)庫的方式,實時性要求不高的可以使用lucene來實現(xiàn),即使有實時性的要求也可以用lucene,lucene+compass還是非常優(yōu)秀的。

            新聞類的網(wǎng)站可以用靜態(tài)頁存儲,采用定時更新機制減輕服務(wù)器負(fù)擔(dān);首頁每個小模塊可以使用oscache緩存,這樣不用每次都拉數(shù)據(jù)。

            前端的基于靜態(tài)頁面緩存的web加速器,主要應(yīng)用有squid等。squid 將大部分靜態(tài)資源(圖片,js,css等)緩存起來,直接返回給訪問者,減少應(yīng)用服務(wù)器的負(fù)載網(wǎng)站的靜態(tài)化網(wǎng)頁并不是真的,而是通過動態(tài)網(wǎng)頁與靜態(tài)網(wǎng)頁網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite這樣的開源網(wǎng)址映射器實現(xiàn),后綴名為htm或者h(yuǎn)tml并不能說明程序生成了靜態(tài)頁面,可能是通過 url重寫來實現(xiàn)的,為的只不過是在搜索引擎中提升自己網(wǎng)站的覆蓋面積罷了。

            生成靜態(tài)頁面的服務(wù)器和www服務(wù)器是兩組不同的服務(wù)器,頁面生成后才會到www服務(wù)器,一部分?jǐn)?shù)據(jù)庫并不是關(guān)系數(shù)據(jù)庫,這樣更適合信息衍生,www、mail服務(wù)器、路由器多,主要用負(fù)載平衡解決訪問瓶頸。

            靜態(tài)頁面的缺點:

            1) 增加了程序的復(fù)雜度

            2) 不利于管理資料

            3) 速度不是最快

            4) 傷硬盤

            6、緩存

            從一開始就應(yīng)該使用緩存,高速緩存是一個更好的地方存儲臨時數(shù)據(jù),比如Web站點上跟蹤一個特定用戶的會話產(chǎn)生的臨時文件,就不再需要記錄到數(shù)據(jù)庫里。

            不能用lucene實現(xiàn)的可以用緩存,分布式緩存可以用memcached,如果有錢的話用10來臺機器做緩存,> 10G的存儲量相信存什么都夠了;如果沒錢的話可以在頁面緩存和數(shù)據(jù)緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過據(jù)說同步性不是很好;

            可以使用Memcache進(jìn)行緩存,用大內(nèi)存把這些不變的數(shù)據(jù)全都緩存起來,而當(dāng)修改時就通知cache過期,memcache是LJ開發(fā)的一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用,我們可以把Cache Server與AppServer裝在一起。因為Cache Server對CPU消耗不大,而有了Cache Server的支援,App Server對內(nèi)存要求也不是太高,所以可以和平共處,更有效的利用資源。
          posted @ 2009-11-30 16:50 筱 筱 閱讀(277) | 評論 (0)編輯 收藏


          將response內(nèi)響應(yīng)給使用者的內(nèi)容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
          這個方法在之前就有人提出過,因為是讓網(wǎng)頁在輸出時經(jīng)過壓縮,可以讓傳輸量變小很多,雖然現(xiàn)在的網(wǎng)絡(luò)頻寬對于用來看網(wǎng)頁已經(jīng)綽綽有余,但是檔案大小太大的網(wǎng)頁還是會造成一定的影響。
          經(jīng)過Gzip壓縮過的網(wǎng)頁,檔案大小可以到原本壓縮前的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> 

           

          本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/a_heng/archive/2009/09/22/4579979.aspx

          posted @ 2009-11-30 16:26 筱 筱 閱讀(291) | 評論 (0)編輯 收藏

          一 簡單加密(不可逆):
                  MD5(信息摘要算法,Message Digest),SHA(安全散列算法,Secure Hash,Algorithm)、HMAC(散列消息鑒別碼,Hash Message Authentication Code)

          二 復(fù)雜算法:
                  1、對稱加密:加密解密使用相同的密鑰:DES(Data Encryption Standard,數(shù)據(jù)加密算法) 、IDEA、RC2、RC4、SKIPJACK
                  2、非對稱加密:分為公開密鑰(publickey)和私有密鑰(privatekey),且公開密鑰與私有密鑰是一對。非對稱加密算法實現(xiàn)機密信息交換的基本過程是:甲方生成一對密鑰并將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進(jìn)行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專用密鑰對加密后的信息進(jìn)行解密。甲方只能用其專用密鑰解密由其公用密鑰加密后的任何信息。非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要,但加密和解密花費時間長、速度慢,它不適合于對文件加密而只適用于對少量數(shù)據(jù)進(jìn)行加密。經(jīng)典的非對稱加密算法如RSA(三個人名:Ron Rivest, AdiShamir 和Leonard Adleman)算法等安全性都相當(dāng)高。

          posted @ 2009-11-05 11:30 筱 筱 閱讀(194) | 評論 (0)編輯 收藏

          Insert是T-sql中常用語句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應(yīng)用程序開發(fā)中必不可少。但我們在開發(fā)、測試過程中,經(jīng)常會遇到需要表復(fù)制的情況,如將一個table1的數(shù)據(jù)的部分字段復(fù)制到table2中,或者將整個table1復(fù)制到table2中,這時候我們就要使用SELECT INTO 和 INSERT INTO SELECT 表復(fù)制語句了。

                1.INSERT INTO SELECT語句

                語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

                要求目標(biāo)表Table2必須存在,由于目標(biāo)表Table2已經(jīng)存在,所以我們除了插入源表Table1的字段外,還可以插入常量。示例如下:

          select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客INSERT INTO SELECT語句復(fù)制表數(shù)據(jù)

             --1.創(chuàng)建測試表

              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)建測試數(shù)據(jù)

              Insert into Table1 values('趙','asds','90')

              Insert into Table1 values('錢','asds','100')

              Insert into Table1 values('孫','asds','80')

              Insert into Table1 values('李','asds',null)

              GO

              select * from Table2

              --3.INSERT INTO SELECT語句復(fù)制表數(shù)據(jù)

              Insert into Table2(a, c, d) select a,c,5 from Table1

              GO

              --4.顯示更新后的結(jié)果

              select * from Table2

              GO

              --5.刪除測試表

              drop TABLE Table1

              drop TABLE Table2

                2.SELECT INTO FROM語句

                語句形式為:SELECT vale1, value2 into Table2 from Table1

                要求目標(biāo)表Table2不存在,因為在插入時會自動創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。示例如下:

          select into與insert into select - xiaolei_funny - 一葉知秋 的博客select into與insert into select - xiaolei_funny - 一葉知秋 的博客SELECT INTO FROM創(chuàng)建表并復(fù)制表數(shù)據(jù)

             --1.創(chuàng)建測試表

              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)建測試數(shù)據(jù)

              Insert into Table1 values('趙','asds','90')

              Insert into Table1 values('錢','asds','100')

              Insert into Table1 values('孫','asds','80')

              Insert into Table1 values('李','asds',null)

              GO

              --3.SELECT INTO FROM語句創(chuàng)建表Table2并復(fù)制數(shù)據(jù)

              select a,c INTO Table2 from Table1

              GO

              --4.顯示更新后的結(jié)果

              select * from Table2

              GO

              --5.刪除測試表

              drop TABLE Table1

              drop TABLE Table2

          posted @ 2009-11-04 13:21 筱 筱 閱讀(477) | 評論 (0)編輯 收藏

          MySQl詳細(xì)安裝過程
          1.利用安裝包進(jìn)行安裝:
          雙擊mysql-5.0.19-win32.zip打開,再雙擊里面的setup.exe就開始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
          a.彈出MySQL Server 5.0-Setup Wizard對話框,點next
          b.就到了選擇安裝類型的對話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來說選典型就可以了,典型和完全安裝都會裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
          c.點擊next->install就開始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點擊next->install是一樣的。
          d.跟著就到了一個問你是否要申請一個登錄MySQL.com的帳戶,有興趣的話可以按步驟來申請一個,呵呵。我選擇的是Skip Sign-Up->finish。注意這時并沒有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
          e.點finish后會馬上彈出一個MySQL Server Instance Configuration Wizard的對話框,點next
          f.又到了一個選擇配置類型的對話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點next就可以了。不過我強烈推薦選“詳細(xì)”的單選按鈕,點next
          g.再選擇服務(wù)器類型“開發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點next,選擇數(shù) 據(jù)庫類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時使用MyISAM和InnoDB儲存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點next
          h.(因為我選的是“多功能的”,不同的選項這里可能會不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點next
          i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時候達(dá)到500個活動的連接;“手動設(shè)定”自己想要的連接數(shù),選了這個后,從右邊的下拉框選一個合適的數(shù)值,點next后
          j.選擇端口,3306就可以了,點next
          k.設(shè)置字符集,這里又是有三個選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語言”使用的是UTF-8,支持中文;“手動選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點next
          l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個名稱,例如“MySQL”,“MySQL5”等。Launch the MySQL Server automatically是否自動啟動服務(wù),Include Bin Directory in Windows Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server 5.0\bin加入環(huán)境變量PATH中,建議加入的好,點next
          m.設(shè)置root用戶的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root access from remote machines是否允許root用戶進(jìn)行遠(yuǎn)程登錄,Create An Anonymous Account是否創(chuàng)建匿名用戶
          n.點next->Execute->Finish。
          至此MySQL終于安裝完成
          MySQl詳細(xì)安裝過程
          1.利用安裝包進(jìn)行安裝:
          雙擊mysql-5.0.19-win32.zip打開,再雙擊里面的setup.exe就開始進(jìn)行安裝了,當(dāng)然你也可以先解壓再雙擊安裝。
          a.彈出MySQL Server 5.0-Setup Wizard對話框,點next
          b.就到了選擇安裝類型的對話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來說選典型就可以了,典型和完全安裝都會裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
          c.點擊next->install就開始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點擊next->install是一樣的。
          d.跟著就到了一個問你是否要申請一個登錄MySQL.com的帳戶,有興趣的話可以按步驟來申請一個,呵呵。我選擇的是Skip Sign-Up->finish。注意這時并沒有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
          e.點finish后會馬上彈出一個MySQL Server Instance Configuration Wizard的對話框,點next
          f.又到了一個選擇配置類型的對話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點next就可以了。不過我強烈推薦選“詳細(xì)”的單選按鈕,點next
          g.再選擇服務(wù)器類型“開發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點next,選擇數(shù) 據(jù)庫類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時使用MyISAM和InnoDB儲存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點next
          h.(因為我選的是“多功能的”,不同的選項這里可能會不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點next
          i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時候達(dá)到500個活動的連接;“手動設(shè)定”自己想要的連接數(shù),選了這個后,從右邊的下拉框選一個合適的數(shù)值,點next后
          j.選擇端口,3306就可以了,點next
          k.設(shè)置字符集,這里又是有三個選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語言”使用的是UTF-8,支持中文;“手動選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點next
          l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個名稱,例如“MySQL”,“MySQL5”等。Launch the MySQL Server automatically是否自動啟動服務(wù),Include Bin Directory in Windows Path是否要將安裝目錄C:\Program Files\MySQL\MySQL Server 5.0\bin加入環(huán)境變量PATH中,建議加入的好,點next
          m.設(shè)置root用戶的密碼,當(dāng)然也可以不把Modify Security Setting 勾掉不設(shè)密碼,建議還是設(shè)的好。Enable root access from remote machines是否允許root用戶進(jìn)行遠(yuǎn)程登錄,Create An Anonymous Account是否創(chuàng)建匿名用戶
          n.點next->Execute->Finish。
          至此MySQL終于安裝完成

          測試
          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>
          看到上面這個就說明安裝成功!一般的登錄為: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.打開my.ini進(jìn)行編輯,要修改的地方如下:
          [client]#password = your_passwordport = 3309#socket = /tmp/mysql.sock
          將socket項用'#'注釋掉,因為windows下沒有,又因為我上面用了端口3306,所以這里要把端口也改了,改為3309,你可以改成其他沒有被占用的端口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ù)器類型,它們之間的區(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.
          上面每一種類型都可以在C:\mysql\bin目錄下找到對應(yīng)的.exe程序,例如:mysqld-max.exe,mysqld-nt.exe等。
          5.選擇好后就要安裝成windows服務(wù)了,過程如下:(我選的是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ù)正在啟動 .mysql-max 服務(wù)已經(jī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ù)器類型 --install(自動) 名稱(你想要用的名稱) --defaults-file=my.ini文件的絕對路徑。--install-manual(手動)
          注意:上面的登錄mysql -uroot --port=3309 非安裝默認(rèn)設(shè)定的用戶為root,密碼為空,同時因為我改了端口,所以要加上--port選項。

          一臺機器上安裝多個windows服務(wù)
          1.創(chuàng)建要安裝的目錄,例如:F:\mysql,在F:\mysql目錄下再創(chuàng)建一個子目錄data.
          2.再到已經(jīng)裝好的mysql的目錄下,例如:C:\mysql\,把里面data目錄下的mysql目錄copy到F:\mysql\data\目錄 下,再C:\mysql\目錄下share目錄和my.ini文件也copy到F:\mysql\目錄下,其實只需要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ù)同上面的非安裝版本的安裝過程是一樣的,過程如下:
          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ù)正在啟動 .mysql-debug 服務(wù)已經(jī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>

          posted @ 2009-10-10 14:03 筱 筱 閱讀(278) | 評論 (0)編輯 收藏

          用于指定服務(wù)器上可以使用該COOKIE的文件所在的路徑,它只對該網(wǎng)址下的該路徑下的應(yīng)用起作用."/"表示服務(wù)器上所有目錄都可以使用該COOKIE.
          posted @ 2009-09-18 11:38 筱 筱 閱讀(1171) | 評論 (0)編輯 收藏

          頁面如果用到Ext最好不要在body有任何文字輸出,不然的話ext會報一個錯誤!

          對象不支持此屬性或方法
          ext-all.js                                        行:9
          posted @ 2009-07-31 23:26 筱 筱 閱讀(154) | 評論 (0)編輯 收藏

          郁悶了兩天了,spring+hibernate查詢數(shù)據(jù),sql語句在數(shù)據(jù)庫里試過了是正確的,數(shù)據(jù)庫里有數(shù)據(jù),但是就是查不出數(shù)據(jù)。后來仔細(xì)看日志文件,恍然大悟,原來是整形字段賦值為null,
          Null value was assigned to a property of primitive type setter of com.*.*.*.age

          posted @ 2009-07-31 11:40 筱 筱 閱讀(1199) | 評論 (0)編輯 收藏

          1、得到record中的某個字段:record.get("字段名稱")
          2、得到form中的某個字段值:this.form.findField("字段名稱").getValue()
          3、從reader中得到root指定的字段除外的字段:store.reader.jsonData.字段名稱
          4、關(guān)于combobx
              valueField  :  設(shè)置值
              displayField  :設(shè)置顯示的值
              hiddenName :動態(tài)產(chǎn)生一個隱藏字段,以便表單提交的時候一起提交,事實上valueField和displayField在表單提交中沒有啟任何作用,往往指定hiddenName就行,如果在combobox中找到hiddenName匹配的值,則將匹配的值顯示出來,因此,細(xì)心的朋友可以發(fā)現(xiàn),在將選擇的記錄賦給combobox所在的form時(this.form.loadRecord(record)),在combobox里首先會顯示出hiddenName指定的值(一般是id),在combobox的store加載完后,如果找到匹配的值則會顯示匹配的值,中間有個值的變化過程!引申一下,如果我們combobox下拉框里用的是樹,則hiddenName肯定是找不到匹配項的(Ext總是會在原始combobox下拉項中匹配,而現(xiàn)在下拉項換成了樹),因此combobox會一直顯示hiddenName的值(即一個id值)。在這種情況下我們就需要手動指定combobox的顯示值,具體方法是在combobox的load事件中用setRawValue指定。注意這里不能用setValue指定,因為在使用hiddenName的情況下,setValue首先將值賦給隱藏字段,如果在combobox中找到匹配項則顯示匹配項的值,如果沒有匹配的值就顯示setValue的值。

          posted @ 2009-07-29 13:29 筱 筱 閱讀(272) | 評論 (0)編輯 收藏

          apache common Pool 對象池
          apache common dbcp 數(shù)據(jù)庫連接池
          common dbcp依賴 common pool
          posted @ 2009-07-09 09:53 筱 筱 閱讀(177) | 評論 (0)編輯 收藏

          一、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

          posted @ 2009-06-24 18:13 筱 筱 閱讀(326) | 評論 (1)編輯 收藏

          解決兩種情況下的用戶訪問超時。
          a)普通http請求的session超時。
          b)異步http請求的session超時,使用ext后大部分的界面刷新都是異步的ajax請求。

          不管是那種類型的http請求總是可以由一個過濾器來捕捉。
          分類:普通http請求的header參數(shù)中沒有x-requested-with:XMLHttpRequest頭信息,而異步的有。
          其實對于常見的ajax框架,header中還有標(biāo)示自己身份的header信息。

          對于普通的http請求,發(fā)現(xiàn)session超時后直接重定向到一個超時頁面,顯示訪問超時。
          對于異步http請求,發(fā)現(xiàn)session超時后則向請求的response中寫入特定的超時頭信息,客戶端ajax對象檢測
          頭信息,發(fā)現(xiàn)有超時狀態(tài)標(biāo)志后調(diào)用顯示超時信息的javascript方法,提示用戶訪問超時。

          服務(wù)器端session超時后在過濾器中為response添加新的頭信息,標(biāo)記該請求超時:

          if(r.getHeader("x-requested-with")!=null
          && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
          response.setHeader("sessionstatus","timeout");
          }
          使用Ext.Ajaxt對象完成異步請求的交互,Ext.Ajax是單實例對象(非常重要,全局單一Ext.Ajax實例!)。
          注冊Ext.Ajax的requestcomplete事件,每個ajax請求成功后首先響應(yīng)該事件。在該事件的回調(diào)函數(shù)里面判斷
          訪問請求是否超時。使用Ext.Ajax對象的好處是,只需要引入一個包含了幾行超時處理代碼的js文件,就可以
          為當(dāng)前應(yīng)用增加超時處理功能,原有代碼不需要做任何修改。

          使用Ext.Ajaxt對象完成異步請求交互,假如checkUserSessionStatus是你的回調(diào)方法,每個頁面引用:

          Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
          function checkUserSessionStatus(conn,response,options){
          //Ext重新封裝了response對象
          if(typeof response.getResponseHeader.sessionstatus != 'undefined'){
          //發(fā)現(xiàn)請求超時,退出處理代碼...
          }
          }
          可以利用的幾個特性:
          a)所有的ajax請求均帶有x-requested-with:XMLHttpRequest頭信息
          b)Ext.Ajax是單實例對象(非常重要,全局單一Ext.Ajax實例!)
          c)注冊Ext.Ajax的requestcomplete事件,每個ajax請求成功后首先響應(yīng)該事件(概念類似spring的aop攔截)。
          jquery提供了幾個全局事件可以用來處理session過期請求,如當(dāng)ajax請求開始時會觸發(fā)ajaxStart()方法的回調(diào)函數(shù);
          當(dāng)ajax請求結(jié)束時,會觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無論創(chuàng)建它們的代碼位于何處,
          只要有ajax請求發(fā)生時,都會觸發(fā)它們。類似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。
          如果使某個ajax請求不受全局方法的影響,那么可以在使用$.ajax()方法時,將參數(shù)中的global設(shè)置為false,jquery代碼如下:
          $.ajax({
              url:"test.html",
              global:false//不觸發(fā)全局ajax事件


          })

           對于其他的ajax框架,解決用戶訪問請求超時這個問題的思路是類似的。

          在這里推薦一個很實用的Js方法:

          function getRootWin(){
          var win = window;
          while (win != win.parent){
          win = win.parent;
          }
          return win;
          }
          

           

          通過該方法,可以在一個任意深度的iframe中調(diào)用父iframe中的方法。具體到這里就是無論哪一個iframe中的用戶訪

          問請求超時,都可以通過該方法調(diào)用最外層iframe中的退出方法,這樣便為用戶提供了一個統(tǒng)一的訪問超時退出的UI

          呈現(xiàn)。

          posted @ 2009-06-05 15:54 筱 筱 閱讀(3483) | 評論 (0)編輯 收藏

          failure:function(form, action){
              if(action.failureType == 'server'){
                  //服務(wù)器端你自己返回success為false時
               Ext.MessageBox.alert('友情提示', action.result.info);
              }else if(action.failureType == 'connect'){
                  //服務(wù)器指定的路徑鏈接不上時
               Ext.Msg.alert('連接錯誤','指定路徑連接錯誤!');
              }else if(action.failureType == 'client'){
                  //客戶端數(shù)據(jù)驗證失敗的情況下,例如客戶端驗證郵件格式不正確的情況下提交表單
               Ext.Msg.alert('提示','數(shù)據(jù)錯誤,非法提交');
              }else{
                  //其它類型的錯誤
               Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
              }
          },
          posted @ 2009-05-22 13:50 筱 筱 閱讀(578) | 評論 (0)編輯 收藏

          Ext的數(shù)據(jù)存儲器為:Ext.data.Store
          ExtJS中有一個名為Record的類,表格等控件中使用的數(shù)據(jù)是存放在Record對象中,一個Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱為記錄。Record對象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個字段的數(shù)據(jù)類型等),同時又包含了記錄具體的數(shù)據(jù)信息(也就是各個字段的值)。一個比較正規(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)建的時候會自動使用HttpProxy來加載參數(shù),并且使用post方式來提交請求,因此上面的代碼可簡化為:
          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類的基礎(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'}]
                  });
          posted @ 2009-05-22 11:15 筱 筱 閱讀(754) | 評論 (0)編輯 收藏

                 success:function(form,action){
                        window.location.href = 'index.jsp'; 
                  },
                  failure : function(form, action) {
                   if(action.failureType == 'server'){
                    Ext.Msg.alert('登錄錯誤',action.result.errors);
                      }else if(action.failureType == 'connect'){
                       Ext.Msg.alert('連接錯誤','指定路徑連接錯誤!');
                      }else{
                       Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
                      }
                  }

                  
                  java返回的數(shù)據(jù),成功為:String json="{success:true}",失敗為: String json="{success:false,errors:'用戶名或者密碼錯誤!!!'}";
          posted @ 2009-05-08 11:11 筱 筱 閱讀(1388) | 評論 (0)編輯 收藏

          使用group by子句的注意事項:

          (1)在SELECT子句的字段列表中,除了聚集函數(shù)外,其他所出現(xiàn)的字段一定要在group by子句中有定義才行。例如“group by A,B”,那么“SELECT SUM(A),C”就有問題,因為C不在group by中,但是SUM(A)是可以的。

          (2)SELECT子句的字段列表中不一定要有聚集函數(shù),但至少要用到group by子句列表中的一個項目。例如“group by A,B,C”,則“SELECT A”是可以的。

          (3)在SQL Server中text、ntext和image數(shù)據(jù)類型的字段不能作為group by子句的分組依據(jù)。

          posted @ 2009-04-21 18:26 筱 筱 閱讀(164) | 評論 (0)編輯 收藏

          格式 
          定義變量:
          $identifier
          $(identifier)
          $(identifier:conversion)

          變量的字符串級別最高,如果遇到相同的字符串,首先被認(rèn)為是變量。顯示$,需要后面在跟一個,$$。例如:
          You account has $$1650.00 in it.

          變量名稱規(guī)則:
          1、變量名是由US-ASCII碼、下劃線和數(shù)字組成;
          2、只能以US-ASCII碼開頭;
          3、變量名大小寫敏感。
          注意:
          1、WML變量沒有類型,均表示為字符串;
          2、變量沒有被賦值的時候,內(nèi)容為空,即空字符串。
          3、可以在運行過程中改變它的值。

          創(chuàng)建變量
          最簡單的方法是使用<setvar>元素,語法如下:
          <setvar name="string" value="string" />

          <setvar>只能在<go>、<prev>和<refresh>中使用。
          下例定義了一個叫vNAME的變量并賦值為“Jeff”:
          <setvar name="vNAME" value="Jeff" />

          另外,還可以在<input>、<select>和<postfield>中定義變量。

          替換文本 
          變量可以用作替換用途,但只能在文本類型(如顯示字符、URL等)中使用。
          任何元素和屬性都不能使用變量來替代。例如:
          Hello, $vNAME.
          將顯示:
          Hello, Jeff.

          ESCAPE
          轉(zhuǎn)換

          前面說過變量可以用作替換用途,但是在URL中使用時,變量的內(nèi)容必須遵守[RFC2396]標(biāo)準(zhǔn)。
          這個標(biāo)準(zhǔn)規(guī)定某些特殊字符在URL里使用的時候必須用特殊表示方法,即ESCAPE八進(jìn)制表示。
          例如:
          list.asp?id=3

          在URL中要表示為:

          list.asp%3fid=3

          所以變量有可能需要標(biāo)志為是否對其內(nèi)容進(jìn)行ESCAPE轉(zhuǎn)換,變量定義就有如下幾種特殊方式:

          效果 表達(dá)方式1 表達(dá)方式2 表達(dá)方式3
          對變量中ESCAPE字符進(jìn)行轉(zhuǎn)換 $(var:e) $(var:E) $(var:escape)
          不進(jìn)行ESCAPE轉(zhuǎn)換 $(var:u) $(var:U) $(var:unesc)
          變量中沒有ESCAPE字符 $(var:n) $(var:N)

          $(noesc)


          給變量進(jìn)行ESCAPE轉(zhuǎn)換是WML的默認(rèn)方式。
          posted @ 2009-04-13 14:11 筱 筱 閱讀(152) | 評論 (0)編輯 收藏

          概述:
          Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生,監(jiān)聽器對象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。
          接口:
          目前Servlet2.4和JSP2.0總共有8個監(jiān)聽器接口和6個Event類,其中HttpSessionAttributeListener與
          HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener則都使用HttpSessionEvent;其余Listener對應(yīng)的Event如下所 示:

          Listener接口

          Event

          ServletContextListener

          ServletContextEvent

          ServletContextAttributeListener

          ServletContextAttributeEvent

          HttpSessionListener

          HttpSessionEvent

          HttpSessionActivationListener

          HttpSessionAttributeListener

          HttpSessionBindingEvent

          HttpSessionBindingListener

          ServletRequestListener

          ServletRequestEvent

          ServletRequestAttributeListener

          ServletRequestAttributeEvent

          分別介紹:
          一 ServletContext相關(guān)監(jiān)聽接口
          補充知識:
          通過ServletContext 的實例可以存取應(yīng)用程序的全局對象以及初始化階段的變量。
          在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認(rèn)創(chuàng)建。Servlet 中調(diào)用 getServletContext()方法得到 ServletContext 的實例。
          注意:
          全局對象即Application范圍對象,初始化階段的變量指在web.xml中,經(jīng)由<context-param>元素所設(shè)定的變量,它的范圍也是Application范圍,例如:

          <context-param>
          <param-name>Name</param-name>
          <param-value>browser</param-value>
          </context-param>
          當(dāng)容器啟動時,會建立一個Application范圍的對象,若要在JSP網(wǎng)頁中取得此變量時:
          String name = (String)application.getInitParameter("Name");
          或者使用EL時:
          ${initPara.name}
          若是在Servlet中,取得Name的值方法:
          String name = (String)ServletContext.getInitParameter("Name");


          1.ServletContextListener:
          用于監(jiān)聽WEB 應(yīng)用啟動和銷毀的事件,監(jiān)聽器類需要實現(xiàn)javax.servlet.ServletContextListener 接口。
          ServletContextListener 是 ServletContext 的監(jiān)聽者,如果 ServletContext 發(fā)生變化,如服務(wù)器啟動時 ServletContext 被創(chuàng)建,服務(wù)器關(guān)閉時 ServletContext 將要被銷毀。

          ServletContextListener接口的方法:
          void contextInitialized(ServletContextEvent sce)
          通知正在接受的對象,應(yīng)用程序已經(jīng)被加載及初始化。
          void contextDestroyed(ServletContextEvent sce)
          通知正在接受的對象,應(yīng)用程序已經(jīng)被載出。

          ServletContextEvent中的方法:
          ServletContext getServletContext()
          取得ServletContext對象


          2.ServletContextAttributeListener:用于監(jiān)聽WEB應(yīng)用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性,監(jiān)聽器類需要實現(xiàn)javax.servlet.ServletContextAttributeListener接口。

          ServletContextAttributeListener接口方法:
          void attributeAdded(ServletContextAttributeEvent scab)
          若有對象加入Application的范圍,通知正在收聽的對象
          void attributeRemoved(ServletContextAttributeEvent scab)
          若有對象從Application的范圍移除,通知正在收聽的對象
          void attributeReplaced(ServletContextAttributeEvent scab)
          若在Application的范圍中,有對象取代另一個對象時,通知正在收聽的對象


          ServletContextAttributeEvent中的方法:
          java.lang.String getName()
          回傳屬性的名稱
          java.lang.Object getValue()
          回傳屬性的值

          二、HttpSession相關(guān)監(jiān)聽接口
          1.HttpSessionBindingListener接口
          注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設(shè)定的Listener

          當(dāng)我們的類實現(xiàn)了HttpSessionBindingListener接口后,只要對象加入Session范圍 (即調(diào)用HttpSession對象的setAttribute方法的時候)或從Session范圍中移出(即調(diào)用HttpSession對象的 removeAttribute方法的時候或Session Time out的時候)時,容器分別會自動調(diào)用下列兩個方法:
          void valueBound(HttpSessionBindingEvent event)
          void valueUnbound(HttpSessionBindingEvent event)

          思考:如何實現(xiàn)記錄網(wǎng)站的客戶登錄日志, 統(tǒng)計在線人數(shù)?

          2.HttpSessionAttributeListener接口
          HttpSessionAttributeListener監(jiān)聽HttpSession中的屬性的操作。
          當(dāng) 在Session增加一個屬性時,激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個屬性時,激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時,激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。這和ServletContextAttributeListener比較類似。

          3.HttpSessionListener接口
          HttpSessionListener監(jiān)聽 HttpSession的操作。當(dāng)創(chuàng)建一個Session時,激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷毀一個Session時,激發(fā)sessionDestroyed (HttpSessionEvent se)方法。

          4.HttpSessionActivationListener接口
          主要用于同一個Session轉(zhuǎn)移至不同的JVM的情形。

          請注意HttpSessionAttributeListener與HttpSessionBindingListener的區(qū)別:
          1.前者是需要在web.xml中進(jìn)行描述的,后者不需要。
          2.前者是在任何session的屬生變化時都會觸發(fā)執(zhí)行其方法中的代碼,而后者只是在實現(xiàn)它的對象被綁定到會話屬性或被從會話屬生中解除綁定時,才會觸發(fā)執(zhí)行那個對象的valueBound和valueUnboundy這兩個方法的代碼。比如說有兩個對象A和B都實現(xiàn)了HttpSessionBindingListener接口,當(dāng)A被綁定到會話屬性中時,只是A的valueBound()方法被觸發(fā)執(zhí)行。


          三、ServletRequest監(jiān)聽接口
          1.ServletRequestListener接口
          和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest
          2.ServletRequestAttributeListener接口
          和ServletContextListener接口類似的,這里由ServletContext改為ServletRequest

            下面說明如何在web.xml中布署事件監(jiān)聽器以實現(xiàn)對事件的處理,格式如下:
          <listener>
            <listener-class> 
              fey.servlet.listener.CustomServletContextListener 
            </listener-class >  
          </listener>
            其中fey.servlet.listener.CustomServletContextListener是實現(xiàn)上述各事件監(jiān)聽器接口的類名。當(dāng)然,你需要將這些類放入Web容器的Web應(yīng)用的classes或lib目錄下以讓W(xué)eb容器可以找到。
            另外說明一點,一個類可以一個或多個監(jiān)聽器接口。

          有的listener可用于統(tǒng)計網(wǎng)站在線人數(shù)及訪問量。 如下:

          服務(wù)器啟動時(實現(xiàn)ServletContextListener監(jiān)聽器contextInitialized方法),讀取數(shù)據(jù)庫,并將其用一個計數(shù)變量保存在application范圍內(nèi)

          session創(chuàng)建時(實現(xiàn)HttpSessionListener監(jiān)聽器sessionCreated方法),讀取計數(shù)變量加1并重新保存

          服務(wù)器關(guān)閉時(實現(xiàn)ServletContextListener監(jiān)聽器contextDestroyed方法),更新數(shù)據(jù)庫

          簡例一

          監(jiān)聽用戶上線與退出,顯示在線用戶

          1、登陸頁面 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">
          用戶名:<input type="text" name="uName"/>
          <input type="submit" value="上線">
          </form>
          </body>
          </html>

          2、控制頁面(只是為了說明監(jiā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、顯示頁面 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("在線人數(shù) "+showList.size()+"<br>");
          for(int i=0;i<showList.size();i++){
          out.print(showList.get(i)+"在線"+"<br>");
          }
          %>
          <br>
          <a href="Login.jsp">退出</a>
          </body>
          </html>

          4、配置頁面 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)聽器 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();
          // 新建一個session時觸發(fā)此操作
          public void sessionCreated(HttpSessionEvent se) {
          sc=se.getSession().getServletContext();
          System.out.println("新建一個session");
          }
          // 銷毀一個session時觸發(fā)此操作
          public void sessionDestroyed(HttpSessionEvent se) {
          System.out.println("銷毀一個session");
          if (!list.isEmpty()) {
             list.remove((String) se.getSession().getAttribute("userName"));
             sc.setAttribute("list", list);
          }
          }
          // 在session中添加對象時觸發(fā)此操作,在list中添加一個對象
          public void attributeAdded(HttpSessionBindingEvent sbe) {
          list.add((String) sbe.getValue());
          sc.setAttribute("list", list);
          }
          // 修改、刪除session中添加對象時觸發(fā)此操作
          public void attributeRemoved(HttpSessionBindingEvent arg0) {
          }
          public void attributeReplaced(HttpSessionBindingEvent arg0) {
          }
          }

          在Web開發(fā)中關(guān)于監(jiān)聽器的應(yīng)用
          首先,也要在web.xml配置文件中進(jìn)行聲明:
                  在web.xml文件中的聲明如下:(聲明片斷)    要放在filter過濾器聲明和filter-mapping聲明后面
             
             <listener>
                  <listener-class>markchen.web.listener.MySessionListener</listener-class>
              </listener>
              <listener>
                   <listener-class>markchen.web.listener.MyServletContextListener</listener-class>
              </listener>


          //這兩個java類的內(nèi)容都和簡單,僅僅是為了演示說明而已

          //MySessionListener.java文件的內(nèi)容如下
               //Web應(yīng)用程序中會話的生命周期監(jiān)聽器實現(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 {
             
              //在會話一創(chuàng)建時該方法被調(diào)用,可以在此處編寫自己需要做特殊處理的程序代碼
               public void sessionCreated(HttpSessionEvent event) {
                         
                            HttpSession session = event.getSession();       
                            String sessionId=session.getId();
                            System.out.println("Session::::::"+sessionId+"******Created******");
                  }
                 
               //在會話即將銷毀時該方法被調(diào)用,可以在此處編寫自己需要做特殊處理的程序代碼
               public void sessionDestroyed(HttpSessionEvent event) {
                         
                           HttpSession session = event.getSession();       
                           String sessionId=session.getId();
                           System.out.println("Session::::::"+sessionId+"******Destroyed******");
                 
                          }       
          }
              
                注意:在sessionDestroyed()方法中一定不要再調(diào)用session.invalidate()方法了
                      因為每調(diào)用一次session.invalidate()方法都會觸發(fā)sessionDestroyed()方法的調(diào)用
                       進(jìn)而形成死循環(huán),最終使Web應(yīng)用程序意外終止

                //MyServletContextListener.java
                      //Web應(yīng)用程序的生命周期監(jiān)聽器實現(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)用程序銷毀時該方法被調(diào)用
                 public void contextDestroyed(ServletContextEvent event) {

                           System.out.println("******Application ended******");               
                  }
          }

          posted @ 2009-04-08 10:07 筱 筱 閱讀(1567) | 評論 (0)編輯 收藏

          一,查看linux的ssh服務(wù)是否已經(jīng)啟動:service sshd status;
              如果沒有啟動則執(zhí)行:service sshd start 或者 service sshd restart
          二,使linux防火墻開啟22端口,因為ssh是通過22端口提供服務(wù)的
              1.在/etc/sysconfig/iptables里添加

          -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT


              2.重啟iptables

          [root@localhost ~]# /etc/init.d/iptables restart


              3.看下狀態(tài)

          [root@localhost ~]# /etc/init.d/iptables status

          三,使用SSH Secure shell連接,選接連接方式為:password。

          四,OK

          posted @ 2009-03-28 21:56 筱 筱 閱讀(578) | 評論 (0)編輯 收藏

          redhat9下安裝VMware Tools

          下面是安裝步驟:
          1.啟動Rad Hat 9.0(圖形界面方式登陸),并且以管理員的身份登陸。
          2.在VMware虛擬機的菜單中點擊:虛擬機->安裝VMware 工具->install。
          3.Red Hat 9.0自動掛載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.打開一個終端(shell),并以root身份登陸。
          7.輸入以下命令:cd /tmp/vmware-tools-distrib(進(jìn)入vmware-tools-distrib目錄)。
          8.輸入:./vmware-install.pl(執(zhí)行vmware-install.pl文件)。
          9.然后一路“回車”,就OK。
          10. 輸入reboot命令(重新啟動)。
          OK!!!

          posted @ 2009-03-26 17:03 筱 筱 閱讀(128) | 評論 (0)編輯 收藏

            Web2.0時代,大家都一再強調(diào)互動! 互動! 互動! 企業(yè)級網(wǎng)站需要與客戶溝通互動,所以我們之前介紹了10款免費的網(wǎng)站在線客服系統(tǒng),個人站長們也越來越追求互動,博客從一開始就為互動而生,好像不互動就不像個博客似兒的.雖然本博早已厭倦互動,但還是為大家介紹10多款基于Web的網(wǎng)頁即時聊天程序.使用網(wǎng)頁即時聊天程序的好處就是,讓訪客能即時的和站長或博客主溝通交流,形成良好的氛圍,甚至成為朋友.尤其對博客來說,能很好的增加穩(wěn)定的讀者群.

          注:下面的其中幾個程序并非標(biāo)準(zhǔn)的Web即時聊天程序,只能算留言本而已.但其實他能當(dāng)聊天程序用,只是少了”即時”…

          Plugoo

          plugoo不需要額外的帳號,只需要你經(jīng)常使用的IM帳號即可(目前plugoo支持的IM 有: MSN Messenger/ Yahoo! Messenger/ GoogleTalk/ Jabber ),注冊成功以后系統(tǒng)會自動添加 plugoo@plugoo.com為你IM的好友,同時生成一段代碼,掛在自己的網(wǎng)站上便可以直接于你網(wǎng)站的訪客進(jìn)行Web網(wǎng)頁即時聊天。via

          Hab.la

          一款十分高效且簡潔的網(wǎng)頁即時聊天程序序,一段簡單的Javascript代碼可以幫助你完善個人站點的客服系統(tǒng)。Hab.la 目前仍然是一款測試中的產(chǎn)品,他們提供了一整套高效的網(wǎng)頁客服解決方案。缺少了MSN、AIM、Y! Messenger等多款I(lǐng)M通信協(xié)議的支持外,Hab.la 幾乎同Plugoo實現(xiàn)的功能如出一轍——只需要在自己的站點中添加上一小段輕量級的Javascript代碼,便可以很輕松的幫助站長和管理員來連接自己用戶和讀者,并建立相對比較完善的客服系統(tǒng)。目前,Hab.la 已經(jīng)能夠全面支持Jabber與Google Talk!via

          Chatback Badge

          Chatback Badge是Google Talk團(tuán)隊發(fā)布的一款很有意思的網(wǎng)頁即時聊天小工具,它可以在頁面上實時顯示你的GT在線狀態(tài)以及個性化簽名等信息;不僅如 此,Chatback 還是一款可以即時引導(dǎo)用戶進(jìn)入Google Talk 網(wǎng)頁版 Badge進(jìn)行實時交流狀態(tài)的擴(kuò)展,這樣,你的訪客便可以借助網(wǎng)頁版GT和你的客戶端GTalk進(jìn)行即時聊天了,簡單而快捷,你的讀者甚至不需要獨立的 GTalk帳戶也能夠輕松和你交流。via

          TocPlus

          TocPlus是讓您直接與網(wǎng)上商城、博客、網(wǎng)頁的訪客進(jìn)行實時對話的通訊系統(tǒng)。如果將TocPlus的服務(wù)適用于網(wǎng)上商城,就如地面商城可以向顧客直接推薦合適的商品或即時回答顧客所提出的咨詢,因此可提高營業(yè)效益。TocPlus的所有服務(wù)為免費。

          vawkr

          一個即時的視頻聊天服務(wù),通常我們需要使用同一種IM即時聊天工具,才能實現(xiàn)和別人視頻聊天,但是通過vawkr,只要雙方都有攝像頭,那么無需下載任何 IM工具,雙方都可進(jìn)行視頻聊天,你可以創(chuàng)建一個永久的聊天室,然后得到一個url地址,將這個地址發(fā)給你要邀請的人,當(dāng)他點擊進(jìn)入后,如果允許 vawkr使用其攝像頭和麥克風(fēng),那么你們就可以進(jìn)行視頻聊天了,vawkr還支持將聊天室放在MySpace 、Facebook、 blog 或者web上。via

          -以下5個來自web20share

          Gabbly

          可 以在瀏覽器,網(wǎng)頁中嵌入聊天系統(tǒng),可以自定義用戶名,顯示在線訪問人數(shù),訪客登陸/離開網(wǎng)站提示(可以選擇關(guān)閉),訪客登陸提示音(可以選擇關(guān)閉),所有 聊天記錄都可以被RSS訂閱保存。Gabbly還有一個功能,任何一個網(wǎng)頁,即便沒有裝Gabbly 在線聊天器,你只要在網(wǎng)址前加上’gabbly.com/’,如gabbly.com/hopesome.com,就可以和同在這個頁面的人即時聊天。

          Blobber

          功能和Gabbly類似,需要注冊。

          Woocall

          新浪推出的服務(wù),和新浪網(wǎng)頁上的差不多。需要郵件申請,感覺用戶的可定制性不是很強.

          MeeboMe
          作 為一個可以嵌入website/blog的flash widget,本身并不突出,但是當(dāng)它和Meebo結(jié)合起來之后,任何人都會覺得眼前一亮!換句簡單點的話說,登錄Meebo之后,你不僅可以同時和 MSN、Y!M、Jabber/Gtalk以及AIM中的聯(lián)系人進(jìn)行交流,而且還能實時地和你的website/blog上的讀者進(jìn)行交流,而這一切都在 你的瀏覽器頁面中完成.

          Cbox-blog
          Cbox-更像是一個可以嵌入到blog中的留言本服務(wù),使用非常簡單方便,通過調(diào)用一段代碼就可插入到blog中。并且還可以自定義大小和顏色樣式等,以便符合自已的blog風(fēng)絡(luò)。

          Twitterchat

          通過twitter也可以做個簡單的聊天室. 你必須有個twitter帳號,然后在 twitterchat.com注冊一個帳號,需要用twitter的用戶名及密碼,郵箱填自己的隨便一個.注冊后會得到一段代碼,可以自己修改聊天窗口寬和高。然后掛在自己上的blog 即可。via

          chirrup

          Chirrup是一個基于twitter的簡單的評論/留言系統(tǒng),可以很方便地加入到自己blog/wiki/Web中。如果你的blog或者其他web沒有評論或者留言本系統(tǒng),除了以前介紹的js-kit外,chirrup也是一個不錯的選擇,在twitter“大行其道”的網(wǎng)絡(luò)時代,所謂“鳥隨鸞鳳飛騰遠(yuǎn),人伴賢良品質(zhì)高”,安裝一個基于twitter的留言或評論系統(tǒng),對提高blog的流量、人氣等等也是很有幫助的。使用方法

          Aimboo

          是一個類似于Plugoo的 即時通訊服務(wù),可通過代碼調(diào)用放置一個聊天窗口在你的Blog上,并與你的本地IM軟件連接,這樣當(dāng)你的讀者訪問你的Blog時,就可以與你及時聯(lián)絡(luò)了, 目前 Aimboo支持Jabber、Gtalk、MSN、AIM及ICQ等常用的IM協(xié)議。

          posted @ 2009-03-24 11:33 筱 筱 閱讀(2874) | 評論 (0)編輯 收藏

          FTPClient client = new FTPClient();
            client.connect("ip地址", 21);
            client.login("用戶名", "密碼");
            client.setSoTimeout(5000);//設(shè)置連接超時時間為5000毫秒
            // 在嘗試連接以后,你應(yīng)該檢查返回碼驗證是否連接成功!
            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();//回到上級目錄
             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");// 隨機訪問文件類
               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ù)寫入中...");
               while (input.read(data) != -1) {
                rfile.write(data);
               }
               System.out.println(new Date() + " 所有數(shù)據(jù)已接受完成!");
               input.close();
               rfile.close();
              }
             }
            }
            client.logout();
            client.disconnect();
          posted @ 2009-03-20 11:20 筱 筱 閱讀(1917) | 評論 (0)編輯 收藏

          基本步驟:
              1,創(chuàng)建連接
              2,登錄
              3,上傳或下載文件
              4,退出
              5,斷開連接
          常用方法:
              void setControlEncoding(String encoding):設(shè)置FTP控制連接的編碼方式(默認(rèn)讀取中文文件名時為亂碼)
              boolean changeWorkingDirectory(String pathname):設(shè)置當(dāng)前的工作目錄
              boolean changeToParentDirectory():返回上級目錄
              void setRestartOffset(long offset):設(shè)置重新啟動的偏移量(用于斷點續(xù)傳)
          下載文件:
              boolean retrieveFile(String,remote,OutputStream local):從服務(wù)器返回指定名稱的文件并且寫入到OuputStream,以便寫入到文件或其它地方。
              InputStream retrieveFileStream(String remote):從服務(wù)器返回指定名稱的文件的InputStream以便讀取。
          上傳文件:
              boolean storeFile(String remote,InputStream local):利用給定的名字(remote)和輸入流(InputStream)向服務(wù)器上傳一個文件。
              OutputStream storeFileStream(String remote):根據(jù)給定的名字返回一個能夠向服務(wù)器上傳文件的OutputStream。
              boolean storeUniqueFile(InputStream local):根據(jù)服務(wù)器自己指定的唯一的名字和輸入流InputStream向服務(wù)器上傳一個文件。
              boolean storeUniqueFile(String remote,InputStream local):根據(jù)指定的名字和輸入流InputStream向服務(wù)器上傳一個文件。
              OuputStream storeUniqueFileStream():返回一個輸出流OutputStream,以便向服務(wù)器寫入一個文件,該文件由服務(wù)器自己命名。
              OutputStream storeUniqueFileStream(String remote):返回一個輸出流OutputStream,以便向服務(wù)器寫入一個文件,該文件由用戶自己指定。

          posted @ 2009-03-20 10:57 筱 筱 閱讀(500) | 評論 (0)編輯 收藏

              OutputStream os=new FileOutputStream("");
            OutputStreamWriter osr=new OutputStreamWriter(os);
            BufferedWriter bw=new BufferedWriter(osr);
              
              InputStream is = new FileInputStream("");
            InputStreamReader isr=new InputStreamReader(is);
            BufferedReader br=new BufferedReader(isr);

              
          posted @ 2009-03-19 09:47 筱 筱 閱讀(569) | 評論 (0)編輯 收藏

          oracle占領(lǐng)http8080端口的問題最近得以解決
          最簡單的一種:
          登錄oracle enterprise manager console 選擇獨立登錄,選擇xml數(shù)據(jù)庫,配置,直接修改http-port就ok了!
          posted @ 2009-03-13 14:59 筱 筱 閱讀(296) | 評論 (0)編輯 收藏

          posted @ 2009-03-12 10:37 筱 筱 閱讀(196) | 評論 (0)編輯 收藏

          Hibernate支持第三方的連接池,官方推薦的連接池是C3P0,Proxool,以及DBCP。在配置連接池時需要注意的有三點:
            一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經(jīng)不再推薦使用,官方的解釋是這個連接池存在缺陷。如果你因為某種原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
            二、默認(rèn)情況下(即沒有配置連接池的情況下),Hibernate會采用內(nèi)建的連接池。但這個連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開發(fā)環(huán)境下使用。
            三、Hibernate2和Hibernate3的命名空間有所變化。例如,配置C3P0時的provider_class有Hibernate2環(huán)境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3環(huán)境下使用org.hibernate.connection.C3P0ConnectionProvider。
            下面是Hibernate環(huán)境下幾種常見的連接池配置,都是以連接MySQl為例。
            <!-- JDBC驅(qū)動程序 -->
            <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ù)庫用戶名 -->
            <property name="connection.username">root</property>
            <!-- 數(shù)據(jù)庫密碼 -->
            <property name="connection.password">8888</property>
            上面的一段配置,在c3p0和dbcp中,都是必需的,因為hibernate會根據(jù)上述的配置來生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來生成連接,這在下面再講。
            從網(wǎng)上google了一下,發(fā)現(xiàn)大致有三種可以實施的解決方案:
            1、使用hibernate自帶的連接池;
            2、使用c3po包的連接池功能;
            3、使用dbcp包的連接池功能;
            4、使用Proxool包的連接池功能;
                  5、使用JNDI連接池
            第一種方案,Hibernate默認(rèn)連接池,就是在myeclipse產(chǎn)生的hibernate.cfg.xml中添加一個屬性:
            <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
            建立一個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)在來看下配置的意思:
            <alias>配置連接池的別名;
            <driver-url>和寫JDBC連接數(shù)據(jù)庫時的URL一樣。
            <driver-class>和寫JDBC連接數(shù)據(jù)庫時的Driver一樣。
            <driver-properies>就是連接數(shù)據(jù)庫時的用戶名和密碼。
            <house-keeping-sleep-time>proxool自動偵察各個連接狀態(tài)的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀
            <prototype-count>最少保持的空閑連接數(shù)
            <maximum-connection-count>最大連接數(shù)。
            <minimum-connection-count>最小連接數(shù)。
            以下是在Hibernate配置文件中對連接池的配置:
            <?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連接池加載的類-->
            <property name="hibernate.connection.provider_class">
            org.hibernate.connection.ProxoolConnectionProvider
            </property>
            <!--連接池的別名,即配置連接池時起的別名-->
            <property name="hibernate.proxool.pool_alias">
            mysql
            </property>
            <!--連接池文件的地址-->
            <property name="hibernate.proxool.xml">
            config/proxool/proxool.xml
            </property>
            <!--是否將運行期生成的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需要做的只是通過JNDI名查找到此數(shù)據(jù)源。應(yīng)用服務(wù)器將連接池對外顯示為JNDI綁定數(shù)據(jù)源,它是javax.jdbc.Datasource類的一個實例。只要配置一個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。
          posted @ 2009-03-10 09:23 筱 筱 閱讀(485) | 評論 (0)編輯 收藏

          Name Lession Mark
          Amy Chinese 89
          Amy Math 59
          Amy History 87
          Amy Japanese 77
          Alan Math 54
          Alan Chinese 83
          Alan History 86
          Alan Japanese 76
          Bruce History 83
          Bruce Math 58
          Bruce Japanese 82
          Alisa Math 59


          1. 請查詢出學(xué)生出姓名mark<60
          2. 請查詢每門學(xué)科中存在有一門不及格的學(xué)生姓名
          3. 請查詢出各科總分排行前三名的學(xué)生姓名和成績(包含并列)
          4. 請查詢出每門科目中前三名的學(xué)生姓名和科目(包含并列的)




          posted @ 2009-02-25 20:32 筱 筱 閱讀(243) | 評論 (0)編輯 收藏

          <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id=scriptmain name=scriptmain codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="560" height="176">
                 <param name="movie" value="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" />
                 <param name="quality" value="high" />
                 <param name=scale value=noscale />
                 <param name="LOOP" value="false" />
                 <param name="menu" value="false" />
                 <param name="wmode" value="transparent" />
                 <embed src="/images/bcastr.swf?bcastr_xml_url=/pages/web/xml/bcastr.xml" width="560" height="176" loop="false" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" salign="T" name="scriptmain" menu="false" wmode="transparent"></embed>
          </object>

          <?xml version="1.0" encoding="utf-8"?>
          <bcaster autoPlayTime="5">
          <item item_url="flash圖片" link="鏈接路徑" >
          </item>
          <item item_url="flash圖片" link="鏈接路徑" >
          </item>
          </bcaster>
          posted @ 2009-02-17 09:36 筱 筱 閱讀(165) | 評論 (0)編輯 收藏

          困擾我多年的sql語句執(zhí)行順序今天終于在網(wǎng)上找到了
          1. 先where 后select
          2. 先where 再group 再having 后select
          3. 先where 再group 再having 再order 后select
          4. 先join 再where 后select
          例:select top 3 name from student group by name order by sum(mark) desc
              (查詢班上總分排名前三的學(xué)生姓名)
          開心啦,開心!
          posted @ 2009-02-03 16:31 筱 筱 閱讀(270) | 評論 (0)編輯 收藏

          1,load()方法從來就是假定數(shù)據(jù)在數(shù)據(jù)庫中是存在的,在使用時如果不存在則會拋出ObjectNotFoundException;而get()方法不會假定數(shù)據(jù)在數(shù)據(jù)庫中存在,如果不存在則返回null
          2,load()方法返回的是實體類的代理類,因此load()可以使用延遲加載策略來加載對象
                get()方法返回的不一定是實體類,可能是代理類,因為get()方法如果在session緩存(一級緩存)中找到了該id對應(yīng)的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關(guān)聯(lián)對象延遲加載過,那么返回的還是原先的代理對象,而不是實體類對象。
          3,load()方法查詢數(shù)據(jù)時會先從session緩存(一級緩存)中查找,如果沒有找到則會創(chuàng)建代理類,該代理類僅僅初始化了OID屬性,當(dāng)?shù)谝淮卧L問其他屬性值時,則會依次從二級緩存-->數(shù)據(jù)庫查找,直到找到數(shù)據(jù),最后將所有屬性值賦給代理類。而get()方法則會直接按照一級緩存-->二級緩存-->數(shù)據(jù)庫的順序查找。

          看到網(wǎng)上的全都是復(fù)制的,而且錯誤不少,怎么就沒有人修正一下呢?
          posted @ 2009-01-22 10:29 筱 筱 閱讀(487) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 阳信县| 康保县| 金沙县| 睢宁县| 泰州市| 响水县| 麟游县| 五原县| 元阳县| 朝阳区| 神农架林区| 龙门县| 屏南县| 广昌县| 荆门市| 德州市| 新余市| 襄垣县| 达拉特旗| 孟州市| 济宁市| 阜阳市| 涿州市| 财经| 垫江县| 开封县| 西青区| 天峨县| 连城县| 高陵县| 敖汉旗| 当雄县| 休宁县| 长寿区| 宣武区| 玉田县| 德兴市| 沂水县| 晋宁县| 安康市| 汉沽区|