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

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

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

    posts - 110, comments - 101, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

     


        
    public static int getStrLenth(String str){
            
    if(str==null || str.length()<0){
                
    return 0;
            }

            
    int len=0;
            
    char c;
            
    for(int i=str.length()-1;i>=0;i--){
                c
    =str.charAt(i);
                
    if (c > 255{
                    
    /*
                     * GBK 編碼格式 中文占兩個字節(jié)
                     * UTF-8 編碼格式中文占三個字節(jié) len += 3;
                     
    */

                    len 
    += 2;
                }
     else {
                    len
    ++;
                }

            }

            
    return len;
        }


    同時 獲取一個字符串的長度 還可以使用
    str.getBytes("GBK").length 這個和上面的代碼一樣的效果
    如果工程的編碼格式 是utf-8 那上面的getStrLenth(String str) 得到的長度 就不對了
    str.getBytes("UTF-8").length 




    posted @ 2011-06-12 22:10 云云 閱讀(1566) | 評論 (0)編輯 收藏

    1.char 

    char的長度是固定的,最大支持2000個字節(jié)。 char的長度是固定的,比如說,你定義了char(20),即使你你插入abc,不足二十個字節(jié),數(shù)據(jù)庫也會在abc后面自動加上17個空格,以補足二十個字節(jié); char是區(qū)分中英文的,中文在char中占兩個字節(jié),而英文占一個,所以char(20)你只能存20個字母或10個漢字。 char適用于長度比較固定的,一般不含中文的情況 

    2.varchar/varchar2 

    varchar是長度不固定的,最大支持4000個字節(jié)。 varchar是長度不固定的,比如說,你定義了varchar(20),當你插入abc,則在數(shù)據(jù)庫中只占3個字節(jié)。 varchar同樣區(qū)分中英文,這點同char。 varchar的效率低于char。 varchar2基本上等同于varchar,它是oracle自己定義的一個非工業(yè)標準varchar,不同之處在于,varchar2用null代替varchar的空字符串 varchar/varchar2適用于長度不固定的,一般不含中文的情況 

    3.nvarchar/nvarchar2 

    nvarchar和nvarchar2是長度不固定的 nvarchar不區(qū)分中英文,比如說:你定義了nvarchar(20),你可以存入20個英文字母/漢字或中英文組合,這個20定義的是字符數(shù)而不是字節(jié)數(shù) nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占兩個字節(jié) nvarchar/nvarchar2適用于存放中文

    posted @ 2011-06-12 21:49 云云 閱讀(592) | 評論 (0)編輯 收藏

        /**
         * 取得指定子串在字符串中出現(xiàn)的次數(shù)。
         * <p/>
         * <p>
         * 如果字符串為<code>null</code>或空,則返回<code>0</code>。
         * <pre>
         * StringUtil.countMatches(null, *)       = 0
         * StringUtil.countMatches("", *)         = 0
         * StringUtil.countMatches("abba", null)  = 0
         * StringUtil.countMatches("abba", "")    = 0
         * StringUtil.countMatches("abba", "a")   = 2
         * StringUtil.countMatches("abba", "ab")  = 1
         * StringUtil.countMatches("abba", "xxx") = 0
         * </pre>
         * </p>
         * 
    @param str    要掃描的字符串
         * 
    @param subStr 子字符串
         * 
    @return 子串在字符串中出現(xiàn)的次數(shù),如果字符串為<code>null</code>或空,則返回<code>0</code>
         
    */

        
    public static int countMatches(String str, String subStr) {
            
    if ((str == null|| (str.length() == 0|| (subStr == null|| (subStr.length() == 0)) {
                
    return 0;
            }


            
    int count = 0;
            
    int index = 0;

            
    while ((index = str.indexOf(subStr, index)) != -1{
                count
    ++;
                index 
    += subStr.length();
            }


            
    return count;
        }

    posted @ 2011-05-26 13:51 云云 閱讀(1756) | 評論 (0)編輯 收藏

    1.聲明一個map: Map map = new HashMap(); 
    2.向map中放值,注意:map是key-value的形式存放的.如:

    map.put(”sa”,”dd”);

    3.從map中取值:String str = map.get(”sa”).toString();結果是:str = ”dd”;

    4.遍歷一個map,從中取得key 和value

    JDK1.
    5

    Map m 
    = new HashMap(); 
    for (Object o : map.keySet()) 
    map.get(o); 
    }


    JDK1.
    4

    Map map 
    = new HashMap() ; 

    Iterator it 
    = map.entrySet().iterator() ; 
    while (it.hasNext()) 

    Map.Entry entry 
    = (Map.Entry) it.next() ; 
    Object key 
    = entry.getKey() ; 
    Object value 
    = entry.getValue() ; 
    }

    遍歷效率對比:
    第一種:

      Map map 
    = new HashMap();

      Iterator iter 
    = map.entrySet().iterator();

      
    while (iter.hasNext()) {

      Map.Entry entry 
    = (Map.Entry) iter.next(); Object key = entry.getKey();

      Object val 
    = entry.getValue();

      }


      效率高,以后一定要使用此種方式
    !

      第二種:

      Map map 
    = new HashMap();

      Iterator iter 
    = map.keySet().iterator();

      
    while (iter.hasNext()) {

      Object key 
    = iter.next();

      Object val 
    = map.get(key);

      }


      效率低,以后盡量少使用
    !

      HashMap的遍歷有兩種常用的方法,那就是使用keyset及entryset來進行遍歷,但兩者的遍歷速度是有差別的,下面請看實例:

      
    public class HashMapTest {

      
    public static void main(String[] args) {

      HashMap hashmap 
    = new HashMap();

      
    for (int i = 0; i <1000; i ) {

      hashmap.put(
    "" i, "thanks");

      }


      
    long bs = Calendar.getInstance().getTimeInMillis();

      Iterator iterator 
    = hashmap.keySet().iterator();

      
    while (iterator.hasNext()) {

      System.out.print(hashmap.get(iterator.next()));

      }


      System.out.println();

      System.out.println(Calendar.getInstance().getTimeInMillis() 
    - bs);

      listHashMap();

      }


      
    public static void listHashMap() {

      java.util.HashMap hashmap 
    = new java.util.HashMap();

      
    for (int i = 0; i <1000; i ) {

      hashmap.put(
    "" i, "thanks");

      }


      
    long bs = Calendar.getInstance().getTimeInMillis();

      java.util.Iterator it 
    = hashmap.entrySet().iterator();

      
    while (it.hasNext()) {

      java.util.Map.Entry entry 
    = (java.util.Map.Entry) it.next();

      
    // entry.getKey() 返回與此項對應的鍵

      
    // entry.getValue() 返回與此項對應的值

      System.out.print(entry.getValue());

      }


      System.out.println();

      System.out.println(Calendar.getInstance().getTimeInMillis() 
    - bs);

      }


      }


      對于keySet其實是遍歷了2次,一次是轉為iterator,一次就從hashmap中取出key所對于的value。而entryset只是遍歷了第一次,他把key和value都放到了entry中,所以就快了。

      注:Hashtable的遍歷方法和以上的差不多
    !

    posted @ 2011-05-12 21:13 云云 閱讀(10257) | 評論 (3)編輯 收藏

    <SCRIPT LANGUAGE="JavaScript">
    <!--
        function getGener()
    {
          var gender
    =document.forms[0].gener;     
          var genderValue
    ="";
          
    if(gender.length){
              
    for(var i=0;i<gender.length;i++){
                 
    if(gender[i].checked){
                   genderValue
    =gender[i].value;
                   
    break;
                 }

              }

          }
    else{
              
    if(gender.checked){
                   genderValue
    =gender.value;
            }

          }

          alert(genderValue);
          
    return false;
        }

    //-->
    </SCRIPT>
     
    <BODY>
      
    <form name="" onsubmit="return getGener()">
         
    <input  type="radio" name="gener" value="Man">Man
         
    <input type="radio" name="gener" value="Women">Women
         
    <input type="submit" value="提交"> 
      
    </form>
     
    </BODY>

    posted @ 2011-05-11 22:20 云云 閱讀(768) | 評論 (4)編輯 收藏

         摘要: package com.ali.luna.commons.util; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** *//**  * 鏃ユ湡鏃墮棿宸ュ叿綾伙紝榪涜鍚勭鏃ユ湡鏃墮...  閱讀全文

    posted @ 2011-05-05 18:29 云云 閱讀(943) | 評論 (0)編輯 收藏


    以前通常是用svn客戶端提交文件 用起來不太方便
    所以后來用myeclipse的插件來管理

    第一次用myeclipse的svn插件提交時就出了問題
    不知不覺就把class文件和log還有target文件夾提交上去了

    好了總結了這個問題 希望對新人有幫助 不要出了問題找不到原因

    先把項目share到svn庫
    然后選擇項目中的target文件夾 右鍵 選擇Team ---添加至svn:ignore

    按照這樣設置你不想提交到svn庫的文件

    posted @ 2011-05-04 15:29 云云 閱讀(11059) | 評論 (1)編輯 收藏

    http://blog.sina.com.cn/s/blog_3fed3a390100kn7d.html

    posted @ 2011-04-11 09:57 云云 閱讀(1607) | 評論 (0)編輯 收藏

    setTimeout(表達式,延遲時間); 單位:ms(毫秒);1s=1000ms; 

      setInterval(表達式,交互時間);  單位:ms(毫秒);1s=1000ms; 

      window.setTimeout()

       在執(zhí)行時,它從載入后延遲指定的時間去執(zhí)行一個表達式或者是函數(shù);僅執(zhí)行一次;和window.clearTimeout一起使用.

      window.setInterval()

       在執(zhí)行時,它從載入頁面后每隔指定的時間執(zhí)行一個表達式或者是函數(shù);(功能類似于遞歸函數(shù));和window.clearInterval一起使用.

      1,基本用法:

       執(zhí)行一段代碼:  var i=0;

       setTimeout("i+=1;alert(i)",1000);

       執(zhí)行一個函數(shù):

       var i=0;

       setTimeout(function(){i+=1;alert(i);},1000);

       //注意比較上面的兩種方法的不同。

       下面再來一個執(zhí)行函數(shù)的:

      var i=0;
    function test(){
    i+=1;
    alert(i);
    }
    setTimeout("test()",1000);
    也可以這樣:
    setTimeout(test,1000);

       總結:

       setTimeout的原型是這樣的:

       iTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])

      setTimeout有兩種形式

      setTimeout(code,interval)

      setTimeout(func,interval,args)

      其中code是一個字符串

      func是一個函數(shù).

      注意"函數(shù)"的意義,是一個表達式,而不是一個語句.

      比如你想周期性執(zhí)行一個函數(shù)

     function a(){
    //...
    }

      可寫為

      setInterval("a()",1000)

      或

      setInterval(a,1000)

      這里注意第二種形式中,是a,不要寫成a(),切記!!!

      展開來說,不管你這里寫的是什么,如果是一個變量,一定是一個指向某函數(shù)的變量;如果是個函數(shù),那它的返回值就 要是個函數(shù)

      2,用setTimeout實現(xiàn)setInterval的功能

      思路很簡單,就是在一個函數(shù)中調(diào)用不停執(zhí)行自己,有點像遞歸

      var i=0;
    function xilou(){
    i+=1;
    if(i>10){alert(i);return;}
    setTimeout("xilou()",1000);
    //用這個也可以
    //setTimeout(xilou,1000);
    }

      3,在類中使用setTimeout

      終于到正題了,其實在類中使用大家遇到的問題都是關于this的,只要解決了這個this的問題就萬事無憂了。

      呵呵。讓我們來分析一下:

      function xilou(){
    //by 西樓冷月 www.chinacms.org
    this.name="xilou";
    this.sex="男";
    this.num=0;
    }
    xilou.prototype.count=function(){
    this.num+=1;
    alert(this.num);
    if(this.num>10){return;}
    //下面用四種方法測試,一個一個輪流測試。
    setTimeout("this.count()",1000);//A:當下面的x.count()調(diào)用時會發(fā)生錯誤:對象不支持此屬性或方法。
    setTimeout("count()",1000);//B:錯誤顯示:缺少對象
    setTimeout(count,1000);//C:錯誤顯示:'count'未定義
    //下面是第四種 by 西樓冷月 www.chinacms.org
    var self=this;
    setTimeout(function(){self.count();},1000);//D:正確

    }

    var x=new xilou();
    x.count();

      錯誤分析:

      A:中的this其實指是window對象,并不是指當前實例對象

      B:和C:中的count()和count其實指的是單獨的一個名為count()的函數(shù),但也可以是window.count(),因為window.count()可以省略為count()

      D:將變量self指向當前實例對象,這樣js解析引擎就不會混肴this指的是誰了。

      話說回來,雖然我們知道setTimeout("this.count()",1000)中的this指的是window對象,但還是不明白為什么會是

      window對象^_^(有點頭暈...)

      那我們可以想象一下這個setTimeout是怎樣被定義的:

      setTimeout是window的一個方法,全稱是這樣的:window.setTimeout()

      那應該是這樣被定義的:

      window.setTimeout=function(vCode, iMilliSeconds [, sLanguage]){
    //.....代碼
    return timer//返回一個標記符
    }

      所以當向setTimeout()傳入this的時候,當然指的是它所屬的當前對象window了

    posted @ 2011-04-09 00:25 云云 閱讀(1533) | 評論 (0)編輯 收藏

    HttpSession常見問題
        1、session在何時被創(chuàng)建 

        一個常見的誤解是以為session在有客戶端訪問時就被創(chuàng)建,然而事實是直到某server端程序調(diào)用 HttpServletRequest.getSession(true)這樣的語句時才被創(chuàng)建,注意如果JSP沒有顯示的使用 <%@page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。 

        由于session會消耗內(nèi)存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。 

        2、session何時被刪除 

        綜合前面的討論,session在下列情況下被刪除a.程序調(diào)用HttpSession.invalidate();或b.距離上一次收到客戶端發(fā)送的session id時間間隔超過了session的超時設置;或c.服務器進程被停止(非持久session) 

        3、如何做到在瀏覽器關閉時刪除session 

        嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關閉動作,然后向服務器發(fā)送一個請求來刪除session。但是對于瀏覽器崩潰或者強行殺死進程這些非常規(guī)手段仍然無能為力。 

        4、有個HttpSessionListener是怎么回事 

        你可以創(chuàng)建這樣的listener去監(jiān)控session的創(chuàng)建和銷毀事件,使得在發(fā)生這樣的事件時你可以做一些相應的工作。注意是session的創(chuàng)建和銷毀動作觸發(fā)listener,而不是相反。類似的與HttpSession有關的listener還有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。 

        5、存放在session中的對象必須是可序列化的嗎 

        不是必需的。要求對象可序列化只是為了session能夠在集群中被復制或者能夠持久保存或者在必要時server能夠暫時把session交換出內(nèi)存。在 Weblogic Server的session中放置一個不可序列化的對象在控制臺上會收到一個警告。我所用過的某個iPlanet版本如果session中有不可序列化的對象,在session銷毀時會有一個Exception,很奇怪。 

        6、如何才能正確的應付客戶端禁止cookie的可能性 

        對所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL,具體做法參見[6]
    http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770 

        7、開兩個瀏覽器窗口訪問應用程序會使用同一個session還是不同的session 

        參見第三小節(jié)對cookie的討論,對session來說是只認id不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對這個問題的答案有影響。 

        8、如何防止用戶打開兩個瀏覽器窗口操作導致的session混亂 

        這個問題與防止表單多次提交是類似的,可以通過設置客戶端的令牌來解決。就是在服務器每次生成一個不同的id返回給客戶端,同時保存在session里,客戶端提交表單時必須把這個id也返回服務器,程序首先比較返回的id與保存在session里的值是否一致,如果不一致則說明本次操作已經(jīng)被提交過了。可以參看《J2EE核心模式》關于表示層模式的部分。需要注意的是對于使用javascript window.open打開的窗口,一般不設置這個id,或者使用單獨的id,以防主窗口無法操作,建議不要再window.open打開的窗口里做修改操作,這樣就可以不用設置。 

        9、為什么在Weblogic Server中改變session的值后要重新調(diào)用一次session.setValue 
        
        做這個動作主要是為了在集群環(huán)境中提示W(wǎng)eblogic Server session中的值發(fā)生了改變,需要向其他服務器進程復制新的session值。 

        10、為什么session不見了 

        排除session正常失效的因素之外,服務器本身的可能性應該是微乎其微的,雖然筆者在iPlanet6SP1加若干補丁的Solaris版本上倒也遇到過;瀏覽器插件的可能性次之,筆者也遇到過3721插件造成的問題;理論上防火墻或者代理服務器在cookie處理上也有可能會出現(xiàn)問題。
    出現(xiàn)這一問題的大部分原因都是程序的錯誤,最常見的就是在一個應用程序中去訪問另外一個應用程序。我們在下一節(jié)討論這個問題。 

        七、跨應用程序的session共享 

        常常有這樣的情況,一個大項目被分割成若干小項目開發(fā),為了能夠互不干擾,要求每個小項目作為一個單獨的web應用程序開發(fā),可是到了最后突然發(fā)現(xiàn)某幾個小項目之間需要共享一些信息,或者想使用session來實現(xiàn)SSO(single sign on),在session中保存login的用戶信息,最自然的要求是應用程序間能夠訪問彼此的session。 

        然而按照Servlet規(guī)范,session的作用范圍應該僅僅限于當前應用程序下,不同的應用程序之間是不能夠互相訪問對方的session的。各個應用服務器從實際效果上都遵守了這一規(guī)范,但是實現(xiàn)的細節(jié)卻可能各有不同,因此解決跨應用程序session共享的方法也各不相同。 

        首先來看一下Tomcat是如何實現(xiàn)web應用程序之間session的隔離的,從Tomcat設置的cookie路徑來看,它對不同的應用程序設置的 cookie路徑是不同的,這樣不同的應用程序所用的session id是不同的,因此即使在同一個瀏覽器窗口里訪問不同的應用程序,發(fā)送給服務器的session id也可以是不同的。
     
        
        根據(jù)這個特性,我們可以推測Tomcat中session的內(nèi)存結構大致如下。


        筆者以前用過的iPlanet也采用的是同樣的方式,估計SunONE與iPlanet之間不會有太大的差別。對于這種方式的服務器,解決的思路很簡單,實際實行起來也不難。要么讓所有的應用程序共享一個session id,要么讓應用程序能夠獲得其他應用程序的session id。

        iPlanet中有一種很簡單的方法來實現(xiàn)共享一個session id,那就是把各個應用程序的cookie路徑都設為/(實際上應該是/NASApp,對于應用程序來講它的作用相當于根)。

        <session-info>
        <path>/NASApp</path>
        </session-info>

        需要注意的是,操作共享的session應該遵循一些編程約定,比如在session attribute名字的前面加上應用程序的前綴,使得setAttribute("name", "neo")變成setAttribute("app1.name", "neo"),以防止命名空間沖突,導致互相覆蓋。

        在Tomcat中則沒有這么方便的選擇。在Tomcat版本3上,我們還可以有一些手段來共享session。對于版本4以上的Tomcat,目前筆者尚未發(fā)現(xiàn)簡單的辦法。只能借助于第三方的力量,比如使用文件、數(shù)據(jù)庫、JMS或者客戶端cookie,URL參數(shù)或者隱藏字段等手段。

        我們再看一下Weblogic Server是如何處理session的。


        從截屏畫面上可以看到Weblogic Server對所有的應用程序設置的cookie的路徑都是/,這是不是意味著在Weblogic Server中默認的就可以共享session了呢?然而一個小實驗即可證明即使不同的應用程序使用的是同一個session,各個應用程序仍然只能訪問自己所設置的那些屬性。這說明Weblogic Server中的session的內(nèi)存結構可能如下:

        對于這樣一種結構,在session機制本身上來解決session共享的問題應該是不可能的了。除了借助于第三方的力量,比如使用文件、數(shù)據(jù)庫、JMS 或者客戶端cookie,URL參數(shù)或者隱藏字段等手段,還有一種較為方便的做法,就是把一個應用程序的session放到ServletContext 中,這樣另外一個應用程序就可以從ServletContext中取得前一個應用程序的引用。示例代碼如下, 

        應用程序A :
        context.setAttribute("appA", session); 

        應用程序B :
        contextA = context.getContext("/appA"); 
        HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); 

        值得注意的是這種用法不可移植,因為根據(jù)ServletContext的JavaDoc,應用服務器可以處于安全的原因?qū)τ赾ontext.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通過。 

        那么Weblogic Server為什么要把所有的應用程序的cookie路徑都設為/呢?原來是為了SSO,凡是共享這個session的應用程序都可以共享認證的信息。一個簡單的實驗就可以證明這一點,修改首先登錄的那個應用程序的描述符weblogic.xml,把cookie路徑修改為/appA訪問另外一個應用程序會重新要求登錄,即使是反過來,先訪問cookie路徑為/的應用程序,再訪問修改過路徑的這個,雖然不再提示登錄,但是登錄的用戶信息也會丟失。注意做這個實驗時認證方式應該使用FORM,因為瀏覽器和web服務器對basic認證方式有其他的處理方式,第二次請求的認證不是通過session來實現(xiàn)的。具體請參看[7] secion 14.8 Authorization,你可以修改所附的示例程序來做這些試驗。 

        八、總結 

        session機制本身并不復雜,然而其實現(xiàn)和配置上的靈活性卻使得具體情況復雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗或者某一個瀏覽器,服務器的經(jīng)驗當作普遍適用的經(jīng)驗,而是始終需要具體情況具體分析。 

    posted @ 2011-04-09 00:04 云云 閱讀(8535) | 評論 (2)編輯 收藏

    僅列出標題
    共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 
    主站蜘蛛池模板: 亚洲最大天堂无码精品区| 在线永久看片免费的视频| 亚洲kkk4444在线观看| 人人狠狠综合久久亚洲88| 国产中文字幕免费| 性盈盈影院免费视频观看在线一区| a在线免费观看视频| 思思久久99热免费精品6| 亚洲人成电影网站免费| 亚洲福利视频网站| 亚洲阿v天堂在线| 亚洲欧洲日产国码一级毛片| 日日夜夜精品免费视频| 91在线品视觉盛宴免费| 中文字幕免费视频| 国内精品一级毛片免费看| 一区二区三区免费精品视频| 国产精品亚洲专区一区| 国产亚洲中文日本不卡二区| 91亚洲国产成人精品下载| 亚洲AV日韩精品久久久久久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 最近中文字幕无免费视频| 久久综合国产乱子伦精品免费| 在线观看免费无码视频| 久青草视频在线观看免费| sss在线观看免费高清| 特黄特色的大片观看免费视频| 亚洲AV成人一区二区三区观看| 亚洲天然素人无码专区| 亚洲AV无码久久久久网站蜜桃 | 日韩免费无码视频一区二区三区 | 国产午夜无码视频免费网站| 影音先锋在线免费观看| 最近高清国语中文在线观看免费| 国产人成免费视频网站| 亚洲毛片在线免费观看| 国产在线观看片a免费观看| 精品久久久久成人码免费动漫| 麻豆最新国产剧情AV原创免费| AA免费观看的1000部电影|