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

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

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

    vickzhu

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

    2008年10月13日 #

    ##通用查詢?nèi)罩荆河涗浗⒌目蛻舳诉B接和執(zhí)行的語句
    ##慢查詢?nèi)罩荆河涗浰袌?zhí)行時(shí)間超過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 筱 筱 閱讀(181) | 評論 (0)編輯 收藏

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

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

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

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

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

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

    wfentry表中的state字段來自于接口WorkflowEntry,有如下幾個(gè)值:
        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實(shí)現(xiàn)(如:BasicWorkflow)有時(shí)并不能滿足業(yè)務(wù)的需要,因此我們可以實(shí)現(xiàn)自己的Workflow,具體可以參照BasicWorkflow 
    繼承AbstractWorkflow,接著加入自己想要的方法。同理,我們可以通過繼承相應(yīng)的WorkflowStore(如:HibernateWorkflowStore)來編寫自己的方法
    posted @ 2012-06-26 14:49 筱 筱 閱讀(5727) | 評論 (0)編輯 收藏

    1、日期格式化:
        DateFormat
        SimplateDateFormat

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

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

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

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

    當(dāng)你第一次添加或者導(dǎo)入文件到Subversion中時(shí),Subversion會檢測該文件是否是二進(jìn)制文件。目前,Subversion的策略是只檢測文件的前1024個(gè)字節(jié);如果所有字節(jié)都是0,或者超過15%都是非ASCII碼輸出字符的話,那么Subversion就認(rèn)定該文件是二進(jìn)制文件。
    如果Subversion認(rèn)定文件是二進(jìn)制文件,那么這個(gè)文件就會自動添加svn:mime-type屬性,并設(shè)置為“application/octet-stream”。(你隨時(shí)可以使用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操作時(shí)將遠(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

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

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

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

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

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

    在頁面中顯示某字段時(shí),字段值過長會導(dǎo)致頁面樣式錯(cuò)亂,這時(shí)候我們需要對值進(jìn)行截取,當(dāng)截取值時(shí)會碰到以下問題:
    1、如果按字符截取會導(dǎo)致中英文顯示的長度不一
    2、如果按字節(jié)截取可能會導(dǎo)致最后一個(gè)中文截成兩部分
    以下代碼是在網(wǎng)上獲取并經(jīng)過改造而成,能夠很好的解決上面兩個(gè)問題
        /**
         * 根據(jù)指定字節(jié)數(shù)截取字符串,當(dāng)指定處為中文第一個(gè)字節(jié)時(shí)少截取一個(gè)字符,當(dāng)長度大于指定截取長度時(shí),截取后在字符串末尾追加指定字符串<br/>
         * 這里添加了字符串的編碼,因?yàn)轫撁娴木幋a不同,字符串所占字節(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 筱 筱 閱讀(350) | 評論 (0)編輯 收藏

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

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

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

    PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,
    這塊內(nèi)存主要是被 JVM存放Class和Method信息的,Class在被Loader時(shí)就會被放到PermGen space中,
    它和存放類實(shí)例 (Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運(yùn)行期對
    PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤,
    這種錯(cuò)誤常見在web服務(wù)器對 JSP進(jìn)行pre compile(預(yù)編譯)的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小
    超過了jvm默認(rèn)的大小(4M)那么就會 產(chǎn)生此錯(cuò)誤信息了。
    解決方法: 手動設(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)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動的時(shí)候會自動設(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 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(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 筱 筱 閱讀(242) | 評論 (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)站的運(yùn)行需要一個(gè)可靠、安全、可擴(kuò)展、易維護(hù)的應(yīng)用系統(tǒng)平臺做為支撐,以保證網(wǎng)站應(yīng)用的平穩(wěn)運(yùn)行。

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

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


    負(fù)載均衡系統(tǒng)分為硬件和軟件兩種。硬件負(fù)載均衡效率高,但是價(jià)格貴,比如F5等。軟件負(fù)載均衡系統(tǒng)價(jià)格較低或者免費(fèi),效率較硬件負(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ù)庫必須也是高可靠的才能保證整個(gè)服務(wù)體系的高可靠性,如何構(gòu)建一個(gè)高可靠的、可以提供大規(guī)模并發(fā)處理的數(shù)據(jù)庫體系?

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

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

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

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

    4)        讀數(shù)據(jù)庫有多臺,通過負(fù)載均衡設(shè)備實(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á)到實(shí)現(xiàn)以下目標(biāo):

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    posted @ 2010-03-31 13:37 筱 筱 閱讀(2372) | 評論 (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 筱 筱 閱讀(280) | 評論 (0)編輯 收藏

    服務(wù)端:http://labs.northscale.com/memcached-packages/
    客戶端:http://code.google.com/p/memcached/wiki/Clients/
    posted @ 2009-12-31 10:57 筱 筱 閱讀(428) | 評論 (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.
            此時(shí)產(chǎn)生名為:Apache Tomcat tomcat 的服務(wù)
    6、卸載命令:service remove tomcat
            執(zhí)行結(jié)果為:
                The service 'tomcat' has been removed

    posted @ 2009-12-25 15:12 筱 筱 閱讀(669) | 評論 (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 筱 筱 閱讀(358) | 評論 (0)編輯 收藏

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

      1、程序

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

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

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

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

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

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

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

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

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

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


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


      3、集群
      通常會使用CDN與GSBL與DNS負(fù)載均衡技術(shù),每個(gè)地區(qū)一組前臺服務(wù)器群,例如:網(wǎng)易,百度使用了DNS負(fù)載均衡技術(shù),每個(gè)頻道一組前臺服務(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ù)庫

      因?yàn)槭乔f人同時(shí)訪問的網(wǎng)站,所以一般是有很多個(gè)數(shù)據(jù)庫同時(shí)工作的,說明白一點(diǎn)就是數(shù)據(jù)庫集群和并發(fā)控制,數(shù)據(jù)分布到地理位置不同的數(shù)據(jù)中心,以免發(fā)生斷電事故。另外還有一點(diǎn)的是,那些網(wǎng)站的靜態(tài)化網(wǎng)頁并不是真的,而是通過動態(tài)網(wǎng)頁與靜態(tài)網(wǎng)頁網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite 這樣的開源網(wǎng)址映射器實(shí)現(xiàn)。這樣的網(wǎng)站實(shí)時(shí)性也是相對的,因?yàn)樵跀?shù)據(jù)庫復(fù)制數(shù)據(jù)的時(shí)候有一個(gè)過程,一般在技術(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ù)時(shí)則根據(jù)負(fù)載選擇一臺從服務(wù)器或者主服務(wù)器來讀取,將數(shù)據(jù)按不同策略劃分到不同的服務(wù)器(組)上,分散數(shù)據(jù)庫壓力。

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


      5、頁面

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

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

      新聞類的網(wǎng)站可以用靜態(tài)頁存儲,采用定時(shí)更新機(jī)制減輕服務(wù)器負(fù)擔(dān);首頁每個(gè)小模塊可以使用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)址映射器實(shí)現(xiàn),后綴名為htm或者h(yuǎn)tml并不能說明程序生成了靜態(tài)頁面,可能是通過 url重寫來實(shí)現(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)頁面的缺點(diǎn):

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

      2) 不利于管理資料

      3) 速度不是最快

      4) 傷硬盤

      6、緩存

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

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

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


    將response內(nèi)響應(yīng)給使用者的內(nèi)容,使用GZIP壓縮的方式回傳給瀏覽器,而IE5和NS6也都有支持Gzip的壓縮格式。
    這個(gè)方法在之前就有人提出過,因?yàn)槭亲尵W(wǎng)頁在輸出時(shí)經(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 筱 筱 閱讀(289) | 評論 (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),且公開密鑰與私有密鑰是一對。非對稱加密算法實(shí)現(xiàn)機(jī)密信息交換的基本過程是:甲方生成一對密鑰并將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機(jī)密信息進(jìn)行加密后再發(fā)送給甲方;甲方再用自己保存的另一把專用密鑰對加密后的信息進(jìn)行解密。甲方只能用其專用密鑰解密由其公用密鑰加密后的任何信息。非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要,但加密和解密花費(fèi)時(shí)間長、速度慢,它不適合于對文件加密而只適用于對少量數(shù)據(jù)進(jìn)行加密。經(jīng)典的非對稱加密算法如RSA(三個(gè)人名:Ron Rivest, AdiShamir 和Leonard Adleman)算法等安全性都相當(dāng)高。

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

    Insert是T-sql中常用語句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應(yīng)用程序開發(fā)中必不可少。但我們在開發(fā)、測試過程中,經(jīng)常會遇到需要表復(fù)制的情況,如將一個(gè)table1的數(shù)據(jù)的部分字段復(fù)制到table2中,或者將整個(gè)table1復(fù)制到table2中,這時(shí)候我們就要使用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不存在,因?yàn)樵诓迦霑r(shí)會自動創(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 筱 筱 閱讀(474) | 評論 (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對話框,點(diǎn)next
    b.就到了選擇安裝類型的對話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來說選典型就可以了,典型和完全安裝都會裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
    c.點(diǎn)擊next->install就開始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
    d.跟著就到了一個(gè)問你是否要申請一個(gè)登錄MySQL.com的帳戶,有興趣的話可以按步驟來申請一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
    e.點(diǎn)finish后會馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對話框,點(diǎn)next
    f.又到了一個(gè)選擇配置類型的對話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
    g.再選擇服務(wù)器類型“開發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù) 據(jù)庫類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點(diǎn)next
    h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
    i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動的連接;“手動設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
    j.選擇端口,3306就可以了,點(diǎn)next
    k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語言”使用的是UTF-8,支持中文;“手動選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
    l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱,例如“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中,建議加入的好,點(diǎn)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.點(diǎ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對話框,點(diǎn)next
    b.就到了選擇安裝類型的對話框了,有三種類型:(1)典型 (2)完全(3)自定義。一般來說選典型就可以了,典型和完全安裝都會裝在默認(rèn)的路徑C:\Program Files\MySQL\MySQL Server 5.0,如果要改變安裝路徑就要選擇自定義,我這里選擇的是“完全”
    c.點(diǎn)擊next->install就開始安裝了。如果選擇“自定義”的話,改變你的安裝路徑后,再點(diǎn)擊next->install是一樣的。
    d.跟著就到了一個(gè)問你是否要申請一個(gè)登錄MySQL.com的帳戶,有興趣的話可以按步驟來申請一個(gè),呵呵。我選擇的是Skip Sign-Up->finish。注意這時(shí)并沒有安裝完成,接著要進(jìn)行配置,配置好后才能使用!
    e.點(diǎn)finish后會馬上彈出一個(gè)MySQL Server Instance Configuration Wizard的對話框,點(diǎn)next
    f.又到了一個(gè)選擇配置類型的對話框,“詳細(xì)”和“標(biāo)準(zhǔn)”配置,如果想快的話就選“標(biāo)準(zhǔn)”,再點(diǎn)next就可以了。不過我強(qiáng)烈推薦選“詳細(xì)”的單選按鈕,點(diǎn)next
    g.再選擇服務(wù)器類型“開發(fā)者”,“服務(wù)器”,“專門的MySQL服務(wù)器”,三者之間的區(qū)別是占用的內(nèi)存的不同,從最小,中等,最大。點(diǎn)next,選擇數(shù) 據(jù)庫類型:“多功能的”,“事務(wù)專用的”,“非事務(wù)專用”。三者的區(qū)別是:“多功能的”可以同時(shí)使用MyISAM和InnoDB儲存引擎,它們占用 MySQL可用資源各半;“事務(wù)專用的”InnoDB作為主儲存引擎,占用大量的資源,MyISAM引擎仍然可用;“非事務(wù)專用的”InnoDB就不能再 用了,點(diǎn)next
    h.(因?yàn)槲疫x的是“多功能的”,不同的選項(xiàng)這里可能會不同)這里可以選擇存放InnoDB表空間的目錄,我選的默認(rèn),點(diǎn)next
    i.就到了為服務(wù)器設(shè)置合適的并發(fā)連接數(shù),有三種類型:“決策支持”并發(fā)連接數(shù)較小,默認(rèn)設(shè)為20;“在線事務(wù)處理”可以在任何時(shí)候達(dá)到500個(gè)活動的連接;“手動設(shè)定”自己想要的連接數(shù),選了這個(gè)后,從右邊的下拉框選一個(gè)合適的數(shù)值,點(diǎn)next后
    j.選擇端口,3306就可以了,點(diǎn)next
    k.設(shè)置字符集,這里又是有三個(gè)選擇:“標(biāo)準(zhǔn)”使用的是latin1字符集,不支持中文;“多語言”使用的是UTF-8,支持中文;“手動選擇默認(rèn)的字符集”,選中后可以從右邊的下拉框中選擇你想要的字符集,里面有g(shù)b2312和gbk是支持中文的,點(diǎn)next
    l.安裝成為windows的服務(wù),并可以從右邊的下拉框中為它選擇一個(gè)名稱,例如“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中,建議加入的好,點(diǎn)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.點(diǎ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>
    看到上面這個(gè)就說明安裝成功!一般的登錄為: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項(xiàng)用'#'注釋掉,因?yàn)閣indows下沒有,又因?yàn)槲疑厦嬗昧硕丝?306,所以這里要把端口也改了,改為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,密碼為空,同時(shí)因?yàn)槲腋牧硕丝冢砸由?-port選項(xiàng)。

    一臺機(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ù)同上面的非安裝版本的安裝過程是一樣的,過程如下:
    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 筱 筱 閱讀(275) | 評論 (0)編輯 收藏

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

    頁面如果用到Ext最好不要在body有任何文字輸出,不然的話ext會報(bào)一個(gè)錯(cuò)誤!

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

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

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

    apache common Pool 對象池
    apache common dbcp 數(shù)據(jù)庫連接池
    common dbcp依賴 common pool
    posted @ 2009-07-09 09:53 筱 筱 閱讀(174) | 評論 (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 筱 筱 閱讀(324) | 評論 (1)編輯 收藏

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

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

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

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

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

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

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


    })

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

    在這里推薦一個(gè)很實(shí)用的Js方法:

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

     

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

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

    呈現(xiàn)。

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

    failure:function(form, action){
        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'){
            //客戶端數(shù)據(jù)驗(yàn)證失敗的情況下,例如客戶端驗(yàn)證郵件格式不正確的情況下提交表單
         Ext.Msg.alert('提示','數(shù)據(jù)錯(cuò)誤,非法提交');
        }else{
            //其它類型的錯(cuò)誤
         Ext.MessageBox.alert('警告', '服務(wù)器數(shù)據(jù)傳輸失敗:'+action.response.responseText);
        }
    },
    posted @ 2009-05-22 13:50 筱 筱 閱讀(575) | 評論 (0)編輯 收藏

    Ext的數(shù)據(jù)存儲器為:Ext.data.Store
    ExtJS中有一個(gè)名為Record的類,表格等控件中使用的數(shù)據(jù)是存放在Record對象中,一個(gè)Record可以理解為關(guān)系數(shù)據(jù)表中的一行,也可以稱為記錄。Record對象中即包含了記錄(行中各列)的定義信息(也就是該記錄包含哪些字段,每一個(gè)字段的數(shù)據(jù)類型等),同時(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í)候會自動使用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 筱 筱 閱讀(750) | 評論 (0)編輯 收藏

           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:'用戶名或者密碼錯(cuò)誤!!!'}";
    posted @ 2009-05-08 11:11 筱 筱 閱讀(1386) | 評論 (0)編輯 收藏

    使用group by子句的注意事項(xiàng):

    (1)在SELECT子句的字段列表中,除了聚集函數(shù)外,其他所出現(xiàn)的字段一定要在group by子句中有定義才行。例如“group by A,B”,那么“SELECT SUM(A),C”就有問題,因?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ù)類型的字段不能作為group by子句的分組依據(jù)。

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

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

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

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

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

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

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

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

    ESCAPE
    轉(zhuǎn)換

    前面說過變量可以用作替換用途,但是在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)志為是否對其內(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 筱 筱 閱讀(148) | 評論 (0)編輯 收藏

    概述:
    Servlet監(jiān)聽器用于監(jiān)聽一些重要事件的發(fā)生,監(jiān)聽器對象可以在事情發(fā)生前、發(fā)生后可以做一些必要的處理。
    接口:
    目前Servlet2.4和JSP2.0總共有8個(gè)監(jiān)聽器接口和6個(gè)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)聽接口
    補(bǔ)充知識:
    通過ServletContext 的實(shí)例可以存取應(yīng)用程序的全局對象以及初始化階段的變量。
    在JSP文件中,application 是 ServletContext 的實(shí)例,由JSP容器默認(rèn)創(chuàng)建。Servlet 中調(diào)用 getServletContext()方法得到 ServletContext 的實(shí)例。
    注意:
    全局對象即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)容器啟動時(shí),會建立一個(gè)Application范圍的對象,若要在JSP網(wǎng)頁中取得此變量時(shí):
    String name = (String)application.getInitParameter("Name");
    或者使用EL時(shí):
    ${initPara.name}
    若是在Servlet中,取得Name的值方法:
    String name = (String)ServletContext.getInitParameter("Name");


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

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


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

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

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

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

    2.HttpSessionAttributeListener接口
    HttpSessionAttributeListener監(jiān)聽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比較類似。

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

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

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


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

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

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

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

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

    服務(wù)器關(guān)閉時(shí)(實(shí)現(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)聽器問題,所以簡單了點(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、顯示頁面 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();
    // 新建一個(gè)session時(shí)觸發(fā)此操作
    public void sessionCreated(HttpSessionEvent se) {
    sc=se.getSession().getServletContext();
    System.out.println("新建一個(gè)session");
    }
    // 銷毀一個(gè)session時(shí)觸發(fā)此操作
    public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("銷毀一個(gè)session");
    if (!list.isEmpty()) {
       list.remove((String) se.getSession().getAttribute("userName"));
       sc.setAttribute("list", list);
    }
    }
    // 在session中添加對象時(shí)觸發(fā)此操作,在list中添加一個(gè)對象
    public void attributeAdded(HttpSessionBindingEvent sbe) {
    list.add((String) sbe.getValue());
    sc.setAttribute("list", list);
    }
    // 修改、刪除session中添加對象時(shí)觸發(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>


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

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

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

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

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

    一,查看linux的ssh服務(wù)是否已經(jīng)啟動:service sshd status;
        如果沒有啟動則執(zhí)行:service sshd start 或者 service sshd restart
    二,使linux防火墻開啟22端口,因?yàn)閟sh是通過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 筱 筱 閱讀(574) | 評論 (0)編輯 收藏

    redhat9下安裝VMware Tools

    下面是安裝步驟:
    1.啟動Rad Hat 9.0(圖形界面方式登陸),并且以管理員的身份登陸。
    2.在VMware虛擬機(jī)的菜單中點(diǎn)擊:虛擬機(jī)->安裝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.打開一個(gè)終端(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 筱 筱 閱讀(125) | 評論 (0)編輯 收藏

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

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

    Plugoo

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

    Hab.la

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

    Chatback Badge

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

    TocPlus

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

    vawkr

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

    -以下5個(gè)來自web20share

    Gabbly

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

    Blobber

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

    Woocall

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

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

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

    Twitterchat

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

    chirrup

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

    Aimboo

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

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

    FTPClient client = new FTPClient();
      client.connect("ip地址", 21);
      client.login("用戶名", "密碼");
      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();//回到上級目錄
       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ī)訪問文件類
         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 筱 筱 閱讀(1914) | 評論 (0)編輯 收藏

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

    posted @ 2009-03-20 10:57 筱 筱 閱讀(496) | 評論 (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 筱 筱 閱讀(566) | 評論 (0)編輯 收藏

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

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

    Hibernate支持第三方的連接池,官方推薦的連接池是C3P0,Proxool,以及DBCP。在配置連接池時(shí)需要注意的有三點(diǎn):
      一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已經(jīng)不再推薦使用,官方的解釋是這個(gè)連接池存在缺陷。如果你因?yàn)槟撤N原因需要在Hibernate3中使用DBCP,建議采用JNDI方式。
      二、默認(rèn)情況下(即沒有配置連接池的情況下),Hibernate會采用內(nèi)建的連接池。但這個(gè)連接池性能不佳,且存在諸多BUG,因此官方也只是建議僅在開發(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)境下幾種常見的連接池配置,都是以連接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中,都是必需的,因?yàn)閔ibernate會根據(jù)上述的配置來生成connections,再交給c3p0或dbcp管理。但是proxool則不能,可以讓proxool自身來生成連接,這在下面再講。
      從網(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)在來看下配置的意思:
      <alias>配置連接池的別名;
      <driver-url>和寫JDBC連接數(shù)據(jù)庫時(shí)的URL一樣。
      <driver-class>和寫JDBC連接數(shù)據(jù)庫時(shí)的Driver一樣。
      <driver-properies>就是連接數(shù)據(jù)庫時(shí)的用戶名和密碼。
      <house-keeping-sleep-time>proxool自動偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀
      <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>
      <!--連接池的別名,即配置連接池時(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需要做的只是通過JNDI名查找到此數(shù)據(jù)源。應(yīng)用服務(wù)器將連接池對外顯示為JNDI綁定數(shù)據(jù)源,它是javax.jdbc.Datasource類的一個(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。
    posted @ 2009-03-10 09:23 筱 筱 閱讀(481) | 評論 (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 筱 筱 閱讀(240) | 評論 (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 筱 筱 閱讀(162) | 評論 (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 筱 筱 閱讀(264) | 評論 (0)編輯 收藏

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

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

    HTTP頭中一般斷點(diǎn)下載時(shí)才用到Range和Content-Range實(shí)體頭,
    Range用戶請求頭中,指定第一個(gè)字節(jié)的位置和最后一個(gè)字節(jié)的位置,如(Range:200-300)
    Content-Range用于響應(yīng)頭

    請求下載整個(gè)文件:
    ***********************************
    GET  /test.rar  HTTP/1.1
    Connection:  close
    Host:  116.1.219.219
    Range:  bytes=0-100
    ***********************************
    Range頭域可以請求實(shí)體的一個(gè)或者多個(gè)子范圍,Range的值為0表示第一個(gè)字節(jié),也就是Range計(jì)算字節(jié)數(shù)是從0開始的
    表示頭500個(gè)字節(jié):bytes=0-499
    表示第二個(gè)500字節(jié):bytes=500-999
    表示最后500個(gè)字節(jié):bytes=-500
    表示500字節(jié)以后的范圍:bytes=500-
    第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
    同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999


    一般正常回應(yīng)
    ***********************************
    HTTP/1.1 206 OK
    Content-Length:  801     
    Content-Type:  application/octet-stream 
    Content-Location: http://www.onlinedown.net/hj_index.htm
    Content-Range:  bytes  0-100/2350 //2350:文件總大小
    Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
    Accept-Ranges: bytes
    ETag: "d67a4bc5190c91:512"
    Server: Microsoft-IIS/6.0
    Date: Wed, 18 Feb 2009 07:55:26 GMT
    ***********************************

    注意:如果用戶的請求中含有range ,則服務(wù)器的相應(yīng)代碼為206。
    206 - Partial Content 客戶發(fā)送了一個(gè)帶有Range頭的GET請求,服務(wù)器完成了它(HTTP 1.1新)。
    posted @ 2009-01-21 17:48 筱 筱 閱讀(4362) | 評論 (0)編輯 收藏

            最近我們公司的jsp網(wǎng)站要和另一家公司的asp網(wǎng)站做通訊,之間通過xml傳遞信息
            現(xiàn)假如我們公司是A,對方公司是B,如果A發(fā)送一條信息給B,B必須反饋一條信息表示是否執(zhí)行成功。這里有兩種模式可以使用,
        第一:A、B把對方都當(dāng)做服務(wù)器進(jìn)行消息發(fā)送
        第二:A相當(dāng)于瀏覽器、B相當(dāng)于服務(wù)器,A發(fā)送一個(gè)消息給B,B直接返回給A信息。
        下面我們來看看這兩種方式分別怎么實(shí)現(xiàn)?
        第一種:
            1、A(a.jsp)的代碼:
            StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            sb.append("<User>");
            sb.append("<HEAD>");
            sb.append("<SUCCESS></SUCCESS>");
            sb.append("</HEAD>");
            sb.append("<BODY>");
            sb.append("<MOBILE></MOBILE>");
            sb.append("<NAME></NAME>");
            sb.append("<SEX></SEX>");
            sb.append("</BODY>");
            sb.append("</User>");
            URL url = new URL("B服務(wù)器的接收路徑");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
            conn.setConnectTimeout(5000);
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(sb.toString().getBytes());
            os.flush();
            os.close();
            2、B服務(wù)器接收到A的請求后,也以類似于1(當(dāng)然asp中的代碼我不知道怎么寫)將反饋信息發(fā)送到A的指定路徑(b.jsp)
            3、A(b.jsp)接收B的反饋信息:
                InputStream is=request.getInputStream();
        第二種:
            1、A(a.jsp)的代碼
                StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?>");
                sb.append("<User>");
                sb.append("<HEAD>");
                sb.append("<SUCCESS></SUCCESS>");
                sb.append("</HEAD>");
                sb.append("<BODY>");
                sb.append("<MOBILE></MOBILE>");
                sb.append("<NAME></NAME>");
                sb.append("<SEX></SEX>");
                sb.append("</BODY>");
                sb.append("</User>");
                URL url = new URL("B服務(wù)器的接收路徑");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestProperty("Content-Type", "text/xml;charset=gbk");
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Length", String.valueOf(xml.length()));
                conn.setConnectTimeout(5000);
                conn.setDoOutput(true);
                OutputStream os = conn.getOutputStream();
                os.write(sb.toString().getBytes());
                os.flush();
                os.close();
            2、B接收到A(a.jsp)服務(wù)器的代碼后用
                    byte[] byts = new byte[Request.InputStream.Length];
                 Request.InputStream.Read(byts,
    0,byts.Length);
                    
    然后用Response.OutputStream.write()返回信息
            3、A(a.jsp)接收B服務(wù)器的反饋信息(和1的代碼同在a.jsp中,并且就接著1代碼的后面)
                   if(conn.getResponseCode()==200){
                       String line=null;
                       String body="";
                       is = conn.getInputStream();
                       BufferedReader br = new BufferedReader(new InputStreamReader(is));
                       while ((line = br.readLine()) != null) {
                            body += line;
                       }
                       conn.disconnect();
                  }
            其中訪問一個(gè)頁面主要用到了HttpURLConnection這個(gè)類,當(dāng)然還有其它幾種方式可以使用,具體請參見我的文章http://www.tkk7.com/vickzhu/archive/2008/11/12/240013.html
    posted @ 2009-01-04 14:57 筱 筱 閱讀(1046) | 評論 (1)編輯 收藏

    錯(cuò)誤代碼:
    org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
    錯(cuò)誤原因:
    OpenSessionInViewFilter在getSession的時(shí)候,會把獲取回來的session的flush mode 設(shè)為FlushMode.NEVER。然后把該sessionFactory綁定到TransactionSynchronizationManager,使request的整個(gè)過程都使用同一個(gè)session,在請求過后再解除該sessionFactory的綁定,最后closeSessionIfNecessary根據(jù)該session是否已和transaction綁定來決定是否關(guān)閉session。在這個(gè)過程中,若HibernateTemplate 發(fā)現(xiàn)自當(dāng)前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫權(quán)限。
    也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉(zhuǎn)為Flush.AUTO,擁有insert,update,delete操作權(quán)限,如果沒有transaction,并且沒有另外人為地設(shè)flush model的話,則doFilter的整個(gè)過程都是Flush.NEVER。所以受transaction保護(hù)的方法有寫權(quán)限,沒受保護(hù)的則沒有。
    參考文章:
    http://calvin.blog.javascud.org/post/46.htm
    解決辦法:
    采用spring的事務(wù)聲明,使方法受transaction控制
    <bean id="baseTransaction"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="proxyTargetClass" value="true"/>
    <property name="transactionAttributes">
    <props>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="remove*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
        <bean id="userService" parent="baseTransaction">
    <property name="target">
    <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
    </property>
    </bean>

    posted @ 2008-12-11 11:20 筱 筱 閱讀(441) | 評論 (0)編輯 收藏

    暫時(shí)發(fā)現(xiàn)了兩種靜態(tài)頁包含靜態(tài)頁的方法
    1、<object style="border:0px" type="text/x-scriptlet" data="test.html" width=100% height=1000></object>
    2、<iframe src="" frameborder="0"></iframe>
    第一種可以解決大部分問題,不過第二種如果你的a頁面包含b頁面,b頁面中的鏈接都是在b頁面本頁打開的話,b鏈接的頁面就不會在a主窗體顯示
    posted @ 2008-11-26 09:49 筱 筱 閱讀(329) | 評論 (0)編輯 收藏

    public class VickTest {
     public static void main(String[] args) throws InterruptedException {

      for (int i = 0; i <= 65535; i++) {
       MyTask mt=new MyTask(i);
       Thread thread=new Thread(mt);
       thread.start();
       if(i%100==0){
        Thread.sleep(500);
       }
      }
     }

    }

    class MyTask implements Runnable{
     int port;
     public MyTask(int port) {
      this.port = port;
     }

     public void run() {
      try {
       Socket s=new Socket(,port);
       System.out.println("端口"+port+"綁定成功!");
      } catch (UnknownHostException e) {
       System.out.println("主機(jī)不明");
      } catch (IOException e) {
       System.out.println("端口"+port+"綁定失敗.");
      }
     }
    }


    cvsnt配置 創(chuàng)建用戶

    1 、下載cvsNt地址
           http://www.march-hare.com/cvsnt/features/cvsnt/

    2、創(chuàng)建倉庫(Ropository)                          (版本為:CVS 2.5.03)
       
            安裝完成后,打開 "開始"菜單——>“程序”——> “CVSNT"——> "CVSNT Control Panel" 程序 ,打開cvs管     

             理窗品,選擇"Ropository configuation"選項(xiàng)卡,單擊"add"按鈕添加倉庫,location為文件本機(jī)存放路徑。


           選擇一個(gè)路徑。Name會自動改為"/目錄文件夾"! 這個(gè)名子也可以修改。點(diǎn)擊OK按鈕,它會提示你“這個(gè)

            文件夾不是cvs倉庫,是否初始化?”的英文提示。點(diǎn)擊“是“。創(chuàng)建倉庫完畢。

    3、創(chuàng)建新用戶

           cvs默認(rèn)高級管理員為windows高級管理員。在添加新用戶時(shí),首先用高級管理員登陸。步驟如下:

           1> 打開Dos窗口 輸入以一命令
              set cvsroot=:pserver:administrator@127.0.0.1:/cvs    回車
                 其中
    “/cvs”就是在創(chuàng)建倉庫時(shí)的name
         
    2>輸入cvs login                              回車

          3>輸入administrator的密碼                回車                          

            4>輸入
    cvs passwd -a xgz //添加用戶xgz    回車

           5>輸入新密碼

              6>再次輸入密碼


    OK新用戶創(chuàng)建成功!

    set cvsroot=:pserver:xgz@127.0.0.1:/cvsRoot   測試一下

    別忘了 cvs login

    輸入密碼登陸測試添加用戶是否成功.

    如果出現(xiàn)

    Fatal error, aborting.
           cvs [login aborted]: test1: no such user

    這種錯(cuò)誤.還要打開"
    CVSNT Control Panel" 程序在"Server Settings"選項(xiàng)卡的Run as 下拉框,選中administrator   默認(rèn)為 client user
    posted @ 2008-11-13 16:11 筱 筱 閱讀(1857) | 評論 (0)編輯 收藏

    以下都是實(shí)戰(zhàn)經(jīng)驗(yàn):
    1、Socket讀取
          String strServer=http://www.google.cn;//這里同樣可以用ip來訪問:203.208.35.100
          String strPage="/language_tools?hl=zh-CN";
          try { 
               String hostname = strServer; 
               int port = 80; 
               InetAddress addr = InetAddress.getByName(hostname); 
               Socket socket = new Socket(addr, port);
               BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")); 
               wr.write("GET " + strPage + " HTTP/1.0\r\n"); 
               wr.write("HOST:" + strServer + "\r\n"); 
               wr.write("\r\n"); 
               wr.flush();
               BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               String line; 
               while ((line = rd.readLine()) != null) { 
                    System.out.println(line); 
               }
               wr.close(); 
               rd.close(); 
          } catch (Exception e) { 
               System.out.println(e.toString()); 
          }
    2、HttpClient方式
          HttpClient client=new HttpClient();
          GetMethod method=new GetMethod("       int status=client.executeMethod(method);
          if(status==HttpStatus.SC_OK){
           //讀取內(nèi)容
           byte[] responseBody = method.getResponseBody();
           //處理內(nèi)容
           System.out.println(new String(responseBody));
           System.out.println("文件名稱:"+method.getPath());
            }
    3、HttpURLConnection方式
          URL url = new URL("這里是你要連接的地址");
          HttpURLConnection conn = (HttpURLConnection)url.openConnection();
          conn.setDoOutput(true);//是否可用于輸出(輸出參數(shù)),默認(rèn)為fasle。另:setDoInput()為是否可用于輸入,默認(rèn)為true
          String parameters = "name=admin&password=123456";//這里是要傳遞的參數(shù)
          OutputStream os = conn.getOutputStream();
          os.write(parameters.getBytes("utf-8"));
          os.flush();
          os.close();
          System.out.println("返回狀態(tài)碼:"+conn.getResponseCode());
          System.out.println("返回消息:"+conn.getResponseMessage());
          InputStream is = conn.getInputStream();
          BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
          String line = null;
          while((line=br.readLine())!=null){
           System.out.println(line);
          }
        //  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();;
        //  DocumentBuilder db = dbf.newDocumentBuilder();
        //  Document doc = db.parse(is);
    如果誰還有更多的方式分享,請留言!

        getOutputStream() has already been called for this response 這個(gè)錯(cuò)誤遇到過不少次,網(wǎng)上看到大多不能解決問題。
        下面兩點(diǎn)是我自己總結(jié)出來的:
        1、在我們應(yīng)用驗(yàn)證碼時(shí),都會用到字節(jié)流response.getOutputStream()來將驗(yàn)證碼輸出,但是jsp頁面自己最后會調(diào)用字符流JspWriter的out()方法將頁面的內(nèi)容輸出。通過查看servlet的API我們可以看到知道,在servlet中不能夠同時(shí)利用這兩個(gè)流輸出,解決辦法將驗(yàn)證碼寫在servlet中,具體見下面。
        2、相信請求轉(zhuǎn)發(fā)( request.getRequestDispacher().forward() )和請求跳轉(zhuǎn)( response.sendRedirect() )的區(qū)別大家都知道。其中request.getRequestDispacher().forward() 方法的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個(gè)訪問請求和響應(yīng)過程。JSP頁面轉(zhuǎn)譯為的_servlet會最后調(diào)用releasePageContext()方法( All PageContext objects obtained via this method shall be released by invoking releasePageContext().)釋放我們頁面所有的實(shí)體對象,當(dāng)我們的調(diào)用者有頁面輸出時(shí),就會拋出這個(gè)異常。具體原因也沒有弄清楚,各位大俠如果誰知道可以告知一下。其實(shí)驗(yàn)證碼也是同一個(gè)原理,如果我們將驗(yàn)證碼的代碼寫在jsp頁面中,因?yàn)閖sp頁面會調(diào)用JspWriter的out()方法將內(nèi)容輸出,同時(shí)我們的圖片又調(diào)用了response.getOutputStream()方法因此會拋出這個(gè)異常;如果我們將驗(yàn)證碼寫在servlet中,就不會同時(shí)使用兩種輸出也就不會出錯(cuò)。有時(shí)即使調(diào)用者頁面沒有輸出,也會拋出這個(gè)異常,仔細(xì)看jsp轉(zhuǎn)譯以后的源碼發(fā)現(xiàn)輸出了換行,因此,我們最好把調(diào)用者頁面的%>和<%之間換行去掉,把%>和<%直接寫在一起。
        另外,如果我們實(shí)在要在jsp中用到response.getOutputStream(),比如驗(yàn)證碼、jspSmartUpload,我們需要在最后加入如下代碼:
            response.reset();
            out.clear();
            out=pageContext.pushBody();

        有不對之處還望指教!
        
    posted @ 2008-11-03 14:38 筱 筱 閱讀(37265) | 評論 (19)編輯 收藏

    網(wǎng)上找了很久,關(guān)于這方面的文章都是轉(zhuǎn)載的,而且過時(shí)了,根本就用不上,自己做了一個(gè)這方面的整合,現(xiàn)在和大家分享一下:
    準(zhǔn)備工作:
        一、下載Apache服務(wù)器:
                地址:http://apache.justdn.org/httpd/binaries/win32/apache_2.2.10-win32-x86-no_ssl.msi
                (D:\Program Files\Apache Software Foundation\Apache2.2)
        二、下載JK(Apache、tomcat整合必須)
                地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.26/mod_jk-1.2.26-httpd-2.2.4.so
                放在D:\Program Files\Apache Software Foundation\Apache2.2\modules下
                (mod_jk-1.2.26-httpd-2.2.4.so適用于Apache2.2所有版本)
        三、Tomcat和JDK就不用說了,我用的是Tomcat6.0(D:\Programe Files\Tomcat 6.0)和JDK1.6(D:\Programe Files\JDK1.6)
    配置:
            1、在D:\Programe Files\Tomcat 6.0\conf 下新建文件workers.properties
            內(nèi)容如下:
            workers.tomcat_home=D:\Programe Files\Tomcat 6.0 
            #讓mod_jk模塊知道Tomcat的位置
            workers.java_home=D:\Programe Files\JDK1.6\jre 
            #讓mod_jk模塊知道jre的位置 
            ps=\ 
            worker.list=ajp13 #模塊版本 
            worker.ajp13.port=8009 
            #工作端口,若沒占用則不用修改 
            worker.ajp13.host=192.168.0.142
            #本機(jī)
            worker.ajp13.type=ajp13 
            #類型 
            worker.ajp13.lbfactor=1 
            #代理數(shù),不用修改

        2、修改D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf文件
            端口:Listen 80 這是默認(rèn)的,大家可以改這里
            模塊:里面有一堆模塊在其中添加一個(gè)LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
            ServerAdmin:不用改,是個(gè)郵件地址
            ServerName:服務(wù)器名稱,可以用ip也可用dns,這里通常注釋了,我們通常把注釋給去掉,否則當(dāng)你啟動apache的時(shí)候會報(bào)Could not reliably determine the server's fully qualified domain name, using 192.168.0.142 for ServerName錯(cuò)誤,但是這并不影響你的程序的運(yùn)行
            DocumentRoot:工程的根路徑,和Tomcat里配置的虛擬目錄docBase屬性相同
            <Directory "  ">:這里必須和DocumentRoot設(shè)置一樣
            添加如下代碼:
                <VirtualHost localhost>
                 DirectoryIndex index.html index.htm index.jsp
                 JkMount /servlet/* ajp13
                 #讓Apache支持對servlet傳送,用以Tomcat解析
                 JkMount /*.jsp* ajp13 
                 #讓Apache支持對jsp傳送,用以Tomcat解析
                 JkMount /*.bst* ajp13 
                 #讓Apache支持對.bst傳送,用以Tomcat解析
                 JkMount /RandCode* ajp13
                 #讓Apache支持對Servlet傳送,用以Tomcat解析
                </VirtualHost>
        完畢,運(yùn)行http://localhosthttp://locahost:8080可以看到結(jié)果是一樣的
        不正確的地方請多多指教!
    posted @ 2008-10-30 17:34 筱 筱 閱讀(1696) | 評論 (2)編輯 收藏

    公司里的表里有很多數(shù)據(jù)不正確,今天打算將數(shù)據(jù)庫中的數(shù)據(jù)整理一下,正好發(fā)現(xiàn)兩張表需要聯(lián)合更新

    在網(wǎng)上查了一些資料,自己試了一下,sql語句如下:
        update law_answer set law_answer.lmakerID=q.lUserID from law_answer a,law_question q where a.lquestionID=q.lquestionID
    注意set后面要更新的列不能用別名
    posted @ 2008-10-29 15:52 筱 筱 閱讀(1156) | 評論 (0)編輯 收藏

            今天又測試了一下搭建了一下SSH框架,但是出了一個(gè)問題,當(dāng)我用get()加載一個(gè)對象的時(shí)候沒有異常,但是用load()的時(shí)候拋出了異常,異常如下:
    java.lang.NullPointerException
     at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
     at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
     at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
     at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
     at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
     at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
     at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
     at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
     at org.springframework.orm.hibernate3.HibernateTemplate$3.doInHibernate(HibernateTemplate.java:508)
     at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
     at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:502)
     at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:496)
     at com.bestone.SSH.hibernate.LawUserDAO.findByName(LawUserDAO.java:104)
     at com.bestone.SSH.service.impl.LoginServiceImpl.checkLogin(LoginServiceImpl.java:30)
     at com.bestone.SSH.struts.action.LoginAction.execute(LoginAction.java:63)
     at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
     at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
     at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
     at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
     at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
     at java.lang.Thread.run(Thread.java:619)

            碰到這個(gè)問題,我馬上想到了加載數(shù)據(jù)時(shí)load和get的區(qū)別:
            1、load總是假定要查詢的數(shù)據(jù)存在,如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會拋出一個(gè)ObjectNotFoundException。
            2、load方法返回實(shí)體的代理實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
            3、load方法可以充分的利用一級緩存和二級緩存中的數(shù)據(jù),而get方法則僅僅在一級緩存中進(jìn)行數(shù)據(jù)查找,如果沒有發(fā)現(xiàn)對應(yīng)的數(shù)據(jù),將越過二級緩存,直接調(diào)用sql完成數(shù)據(jù)讀取(經(jīng)過我的證實(shí),在hibernate3.2中g(shù)et()方法是可以查找二級緩存的)。
            仔細(xì)看了看錯(cuò)誤,想來想去應(yīng)該是生成代理類的時(shí)候出現(xiàn)了錯(cuò)誤。java中生成代理類有兩種形式,一是java動態(tài)代理,二是利用cglib生成。而hibernate中實(shí)體的代理類是用cglib生成的。
            后來仔細(xì)研究了一下jar包,通過jar包源碼發(fā)現(xiàn),原來是cglib-2.1.3.jar和cglib-nodep-2.1_3.jar相沖突,只需要把cglib-2.1.3.jar包刪除就沒有問題了。查看cglib-nodep-2.1_3.jar的源碼我們還發(fā)現(xiàn)一個(gè)問題,它包含了asm-attrs.jar的全部類,但是使用的包名不同,不知道有沒有沖突,運(yùn)行程序查看日志,暫時(shí)沒有發(fā)現(xiàn)什么問題,就留著asm-attrs.jar吧。
            
    posted @ 2008-10-22 17:36 筱 筱 閱讀(997) | 評論 (2)編輯 收藏

    1、gpedit.msc   組策略
    2、msconfig      系統(tǒng)配置實(shí)用程序
    3、dxdiag         DirectX診斷工具 可以查看顯卡,聲卡是否安裝等
    4、winmsd       系統(tǒng)信息(包括硬件資源、軟件環(huán)境、組件、Internet設(shè)置等)
    5、secpol         本地安全策略

    posted @ 2008-10-22 15:12 筱 筱 閱讀(140) | 評論 (0)編輯 收藏

    修改/bin/service.bat里面的 set SERVICE_NAME=Tomcat6(這里是服務(wù)名,名字可以隨意起)
    在命令行執(zhí)行下面的命令:
    安裝服務(wù):service install Tomcat6
    卸載服務(wù):service remove Tomcat6

    啟動服務(wù):net start Tomcat6
    關(guān)閉服務(wù):net stop Tomcat6
    posted @ 2008-10-17 14:41 筱 筱 閱讀(874) | 評論 (0)編輯 收藏

    posted @ 2008-10-13 10:53 筱 筱 閱讀(211) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 涩涩色中文综合亚洲| 免费下载成人电影| 久久精品国产亚洲网站| 国产精品玖玖美女张开腿让男人桶爽免费看 | 免费播放特黄特色毛片| 国产精品亚洲专区一区| 国产裸模视频免费区无码| 亚洲1区2区3区精华液| 日本免费电影一区| 国产精品亚洲专区无码不卡| 国产免费啪嗒啪嗒视频看看| 国产精品亚洲一区二区在线观看| 日本免费人成视频播放| 国产精品亚洲综合天堂夜夜| 午夜亚洲av永久无码精品| 日韩在线视频播放免费视频完整版| 又黄又爽的视频免费看| 免费无码国产在线观国内自拍中文字幕| 四虎影永久在线高清免费| 美女视频黄频a免费大全视频| 亚洲 小说区 图片区 都市| 成人福利在线观看免费视频| 久久亚洲色一区二区三区| 99在线免费观看| 婷婷精品国产亚洲AV麻豆不片| 59pao成国产成视频永久免费 | 亚洲无码一区二区三区| 特级淫片国产免费高清视频| 在线观看亚洲视频| 久久影视综合亚洲| 日本高清高色视频免费| 亚洲国产精品成人精品软件| 无码一区二区三区免费视频| 亚洲国产成人久久综合| 免费成人在线观看| 四虎影视无码永久免费| 久久亚洲精品成人无码网站| 男人的好看免费观看在线视频| 色五月五月丁香亚洲综合网| 久久久久久亚洲精品不卡| 日韩免费的视频在线观看香蕉|