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

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

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

    和風(fēng)細(xì)雨

    世上本無(wú)難事,心以為難,斯乃真難。茍不存一難之見(jiàn)于心,則運(yùn)用之術(shù)自出。

    #

    C/S架構(gòu)和B/S架構(gòu)的概念和區(qū)別

    C/S 架構(gòu)

    C/S 架構(gòu)是一種典型的兩層架構(gòu),其全程是Client/Server,即客戶端服務(wù)器端架構(gòu),其客戶端包含一個(gè)或多個(gè)在用戶的電腦上運(yùn)行的程序,而服務(wù)器端有兩種,一種是數(shù)據(jù)庫(kù)服務(wù)器端,客戶端通過(guò)數(shù)據(jù)庫(kù)連接訪問(wèn)服務(wù)器端的數(shù)據(jù);另一種是Socket服務(wù)器端,服務(wù)器端的程序通過(guò)Socket與客戶端的程序通信。
    C/S 架構(gòu)也可以看做是胖客戶端架構(gòu)。因?yàn)榭蛻舳诵枰獙?shí)現(xiàn)絕大多數(shù)的業(yè)務(wù)邏輯和界面展示。這種架構(gòu)中,作為客戶端的部分需要承受很大的壓力,因?yàn)轱@示邏輯和事務(wù)處理都包含在其中,通過(guò)與數(shù)據(jù)庫(kù)的交互(通常是SQL或存儲(chǔ)過(guò)程的實(shí)現(xiàn))來(lái)達(dá)到持久化數(shù)據(jù),以此滿足實(shí)際項(xiàng)目的需要。

    C/S 架構(gòu)的優(yōu)缺點(diǎn)

    優(yōu)點(diǎn):
    1.C/S架構(gòu)的界面和操作可以很豐富。
    2.安全性能可以很容易保證,實(shí)現(xiàn)多層認(rèn)證也不難。
    3.由于只有一層交互,因此響應(yīng)速度較快。

    缺點(diǎn):
    1.適用面窄,通常用于局域網(wǎng)中。
    2.用戶群固定。由于程序需要安裝才可使用,因此不適合面向一些不可知的用戶。
    3.維護(hù)成本高,發(fā)生一次升級(jí),則所有客戶端的程序都需要改變。

    B/S架構(gòu)

    B/S架構(gòu)的全稱為Browser/Server,即瀏覽器/服務(wù)器結(jié)構(gòu)。Browser指的是Web瀏覽器,極少數(shù)事務(wù)邏輯在前端實(shí)現(xiàn),但主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn),Browser客戶端,WebApp服務(wù)器端和DB端構(gòu)成所謂的三層架構(gòu)。B/S架構(gòu)的系統(tǒng)無(wú)須特別安裝,只有Web瀏覽器即可。
    B/S架構(gòu)中,顯示邏輯交給了Web瀏覽器,事務(wù)處理邏輯在放在了WebApp上,這樣就避免了龐大的胖客戶端,減少了客戶端的壓力。因?yàn)榭蛻舳税倪壿嫼苌伲虼艘脖怀蔀槭菘蛻舳恕?/p>

    B/S架構(gòu)的優(yōu)缺點(diǎn)

    優(yōu)點(diǎn):
    1)客戶端無(wú)需安裝,有Web瀏覽器即可。
    2)BS架構(gòu)可以直接放在廣域網(wǎng)上,通過(guò)一定的權(quán)限控制實(shí)現(xiàn)多客戶訪問(wèn)的目的,交互性較強(qiáng)。
    3)BS架構(gòu)無(wú)需升級(jí)多個(gè)客戶端,升級(jí)服務(wù)器即可。

    缺點(diǎn):
    1)在跨瀏覽器上,BS架構(gòu)不盡如人意。
    2)表現(xiàn)要達(dá)到CS程序的程度需要花費(fèi)不少精力。
    3)在速度和安全性上需要花費(fèi)巨大的設(shè)計(jì)成本,這是BS架構(gòu)的最大問(wèn)題。
    4)客戶端服務(wù)器端的交互是請(qǐng)求-響應(yīng)模式,通常需要刷新頁(yè)面,這并不是客戶樂(lè)意看到的。(在Ajax風(fēng)行后此問(wèn)題得到了一定程度的緩解)

    posted @ 2008-04-29 15:13 和風(fēng)細(xì)雨 閱讀(96094) | 評(píng)論 (12)編輯 收藏

    特殊的String

     

    String的特殊之處

    String是Java編程中很常見(jiàn)的一個(gè)類,這個(gè)類的實(shí)例是不可變的(immutable ).為了提高效率,JVM內(nèi)部對(duì)其操作進(jìn)行了一些特殊處理,本文就旨在于幫助大家辨析這些特殊的地方.
    在進(jìn)入正文之前,你需要澄清這些概念:
    1) 堆與棧
    2) 相同與相等,==與equals
    3) =的真實(shí)意義.

    棧與堆

    1. 棧(stack)與堆(heap)都是Java用來(lái)在內(nèi)存中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投眩绦騿T不能直接地設(shè)置棧或堆。每個(gè)函數(shù)都有自己的棧,而一個(gè)程序只有一個(gè)堆.
    2. 棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。另外,棧數(shù)據(jù)可以共享,詳見(jiàn)第3點(diǎn)。堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。 3. Java中的數(shù)據(jù)類型有兩種。   一種是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char(注意,并沒(méi)有string的基本類型)。這種類型的定義是通過(guò)諸如int a = 3; long b = 255L;的形式來(lái)定義的,稱為自動(dòng)變量。值得注意的是,自動(dòng)變量存的是字面值,不是類的實(shí)例,即不是類的引用,這里并沒(méi)有類的存在。如int a = 3; 這里的a是一個(gè)指向int類型的引用,指向3這個(gè)字面值。這些字面值的數(shù)據(jù),由于大小可知,生存期可知(這些字面值固定定義在某個(gè)程序塊里面,程序塊退出后,字段值就消失了),出于追求速度的原因,就存在于棧中。   另外,棧有一個(gè)很重要的特殊性,就是存在棧中的數(shù)據(jù)可以共享。假設(shè)我們同時(shí)定義   int a = 3;    int b = 3;   編譯器先處理int a = 3;首先它會(huì)在棧中創(chuàng)建一個(gè)變量為a的引用,然后查找有沒(méi)有字面值為3的地址,沒(méi)找到,就開(kāi)辟一個(gè)存放3這個(gè)字面值的地址,然后將a指向3的地址。接著處理int b = 3;在創(chuàng)建完b的引用變量后,由于在棧中已經(jīng)有3這個(gè)字面值,便將b直接指向3的地址。這樣,就出現(xiàn)了a與b同時(shí)均指向3的情況。   特別注意的是,這種字面值的引用與類對(duì)象的引用不同。假定兩個(gè)類對(duì)象的引用同時(shí)指向一個(gè)對(duì)象,如果一個(gè)對(duì)象引用變量修改了這個(gè)對(duì)象的內(nèi)部狀態(tài),那么另一個(gè)對(duì)象引用變量也即刻反映出這個(gè)變化。相反,通過(guò)字面值的引用來(lái)修改其值,不會(huì)導(dǎo)致另一個(gè)指向此字面值的引用的值也跟著改變的情況。如上例,我們定義完a與 b的值后,再令a=4;那么,b不會(huì)等于4,還是等于3。在編譯器內(nèi)部,遇到a=4;時(shí),它就會(huì)重新搜索棧中是否有4的字面值,如果沒(méi)有,重新開(kāi)辟地址存放4的值;如果已經(jīng)有了,則直接將a指向這個(gè)地址。因此a值的改變不會(huì)影響到b的值。   另一種是包裝類數(shù)據(jù),如Integer, String, Double等將相應(yīng)的基本數(shù)據(jù)類型包裝起來(lái)的類。這些類數(shù)據(jù)全部存在于堆中,Java用new()語(yǔ)句來(lái)顯示地告訴編譯器,在運(yùn)行時(shí)才根據(jù)需要?jiǎng)討B(tài)創(chuàng)建,因此比較靈活,但缺點(diǎn)是要占用更多的時(shí)間。

    相同與相等,==與equals

    在Java中,相同指的是兩個(gè)變量指向的地址相同,地址相同的變量自然值相同;而相等是指兩個(gè)變量值相等,地址可以不同.
    相同的比較使用==,而相等的比較使用equals.
    對(duì)于字符串變量的值比較來(lái)說(shuō),我們一定要使用equals而不是==.

    =的真實(shí)意義

    =即賦值操作,這里沒(méi)有問(wèn)題,關(guān)鍵是這個(gè)值有時(shí)是真正的值,有的是地址,具體來(lái)說(shuō)會(huì)根據(jù)等號(hào)右邊的部分而變化.
    如果是基本類型(八種),則賦值傳遞的是確定的值,即把右邊變量的值傳遞給左邊的變量.
    如果是類類型,則賦值傳遞的是變量的地址,即把等號(hào)左邊的變量地址指向等號(hào)右邊的變量地址.

    指出下列代碼的輸出

    String andy="andy";
    String bill="andy";

    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    String str=“andy”的機(jī)制分析

    上頁(yè)代碼的輸出是andy和bill地址相同.
    當(dāng)通過(guò)String str=“andy”;的方式定義一個(gè)字符串時(shí),JVM先在棧中尋找是否有值為“andy”的字符串,如果有則將str指向棧中原有字符串的地址;如果沒(méi)有則創(chuàng)建一個(gè),再將str的地址指向它. String andy=“andy”這句代碼走的是第二步,而String bill=“andy”走的是第一步,因此andy和bill指向了同一地址,故而andy==bill,andy和bill地址相等,所以輸出是andy和bill地址相同.
    這樣做能節(jié)省空間—少創(chuàng)建一個(gè)字符串;也能節(jié)省時(shí)間—定向總比創(chuàng)建要省時(shí).

    指出下列代碼的輸出

    String andy="andy";
    String bill="andy";
    bill="bill";

    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    輸出及解釋

    上頁(yè)代碼的輸出是:andy和bill地址不同
    當(dāng)執(zhí)行bill=“bill”一句時(shí),外界看來(lái)好像是給bill變換了一個(gè)新值bill,但JVM的內(nèi)部操作是把棧變量bill的地址重新指向了棧中一塊值為bill的新地址,這是因?yàn)樽址闹凳遣豢勺兊?要換值(賦值操作)只有將變量地址重新轉(zhuǎn)向. 這樣andy和bill的地址在執(zhí)行bill=“bill”一句后就不一樣了,因此輸出是andy和bill地址不同.

    指出下列代碼的輸出

    String andy=new String("andy");
    String bill=new String("andy");

    // 地址比較
    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    // 值比較
    if(andy.equals(bill)){
      System.out.println("andy和bill值相等");
    }
    else{
      System.out.println("andy和bill值不等");
    }

    輸出及機(jī)制分析

    andy和bill地址不同
    andy和bill值相等
    我們知道new操作新建出來(lái)的變量一定處于堆中,字符串也是一樣.
    只要是用new()來(lái)新建對(duì)象的,都會(huì)在堆中創(chuàng)建,而且其字符串是單獨(dú)存值的,即每個(gè)字符串都有自己的值,自然地址就不會(huì)相同.因此輸出了andy和bill地址不同.
    equals操作比較的是值而不是地址,地址不同的變量值可能相同,因此輸出了andy和bill值相等.

    指出下列代碼的輸出

    String andy=new String("andy");
    String bill=new String(andy);

    // 地址比較
    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    // 值比較
    if(andy.equals(bill)){
      System.out.println("andy和bill值相等");
    }
    else{
      System.out.println("andy和bill值不等");
    }


    輸出

    andy和bill地址不同
    andy和bill值相等

    道理仍和第八頁(yè)相同.只要是用new()來(lái)新建對(duì)象的,都會(huì)在堆中創(chuàng)建,而且其字符串是單獨(dú)存值的,即每個(gè)字符串都有自己的值,自然地址就不會(huì)相同.

    指出下列代碼的輸出

    String andy="andy";
    String bill=new String(“Bill");
    bill=andy;

    // 地址比較
    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    // 值比較
    if(andy.equals(bill)){
      System.out.println("andy和bill值相等");
    }
    else{
      System.out.println("andy和bill值不等");
    }


    輸出及解析

    andy和bill地址相同
    andy和bill值相等
    String bill=new String(“Bill”)一句在棧中創(chuàng)建變量bill,指向堆中創(chuàng)建的”Bill”,這時(shí)andy和bill地址和值都不相同;而執(zhí)行bill=andy;一句后,棧中變量bill的地址就指向了andy,這時(shí)bill和andy的地址和值都相同了.而堆中的”Bill”則沒(méi)有指向它的指針,此后這塊內(nèi)存將等待被垃圾收集.


    指出下列代碼的輸出

    String andy="andy";
    String bill=new String("bill");
    andy=bill;

    // 地址比較
    if(andy==bill){
      System.out.println("andy和bill地址相同");
    }
    else{
      System.out.println("andy和bill地址不同");
    }

    // 值比較
    if(andy.equals(bill)){
      System.out.println("andy和bill值相等");
    }
    else{
      System.out.println("andy和bill值不等");
    }

    輸出

    andy和bill地址相同
    andy和bill值相等

    道理同第十二頁(yè)

    結(jié)論

    使用諸如String str = “abc”;的語(yǔ)句在棧中創(chuàng)建字符串時(shí)時(shí),str指向的字符串不一定會(huì)被創(chuàng)建!唯一可以肯定的是,引用str本身被創(chuàng)建了。至于這個(gè)引用到底是否指向了一個(gè)新的對(duì)象,必須根據(jù)上下文來(lái)考慮,如果棧中已有這個(gè)字符串則str指向它,否則創(chuàng)建一個(gè)再指向新創(chuàng)建出來(lái)的字符串. 清醒地認(rèn)識(shí)到這一點(diǎn)對(duì)排除程序中難以發(fā)現(xiàn)的bug是很有幫助的。
    使用String str = “abc”;的方式,可以在一定程度上提高程序的運(yùn)行速度,因?yàn)镴VM會(huì)自動(dòng)根據(jù)棧中數(shù)據(jù)的實(shí)際情況來(lái)決定是否有必要?jiǎng)?chuàng)建新對(duì)象。而對(duì)于String str = new String(“abc”);的代碼,則一概在堆中創(chuàng)建新對(duì)象,而不管其字符串值是否相等,是否有必要?jiǎng)?chuàng)建新對(duì)象,從而加重了程序的負(fù)擔(dān)。
    如果使用new()來(lái)新建字符串的,都會(huì)在堆中創(chuàng)建字符串,而且其字符串是單獨(dú)存值的,即每個(gè)字符串都有自己的值,且其地址絕不會(huì)相同
    當(dāng)比較包裝類里面的數(shù)值是否相等時(shí),用equals()方法;當(dāng)測(cè)試兩個(gè)包裝類的引用是否指向同一個(gè)對(duì)象時(shí),用==。
    由于String類的immutable性質(zhì),當(dāng)String變量需要經(jīng)常變換其值如SQL語(yǔ)句拼接,HTML文本輸出時(shí),應(yīng)該考慮使用StringBuffer類,以提高程序效率。

    posted @ 2008-04-29 15:10 和風(fēng)細(xì)雨 閱讀(399) | 評(píng)論 (0)編輯 收藏

    [轉(zhuǎn)載]Web2.0-個(gè)人品牌打造指南

         摘要: 序言:本指南旨在幫助你建立全面的個(gè)人品牌戰(zhàn)略。個(gè)人品牌的建立是你銷售自己從而在商業(yè)上取得成功的重要一環(huán)。個(gè)人品牌的建立是一個(gè)持續(xù)的過(guò)程正如你不斷認(rèn)識(shí)自己的過(guò)程。你自己強(qiáng)大了,品牌也亦然。在全球化導(dǎo)致工作競(jìng)爭(zhēng)加劇的今天,個(gè)人品牌的提升也顯得尤為重要。正如像金子那樣發(fā)光,你能在人群中嶄露自己,就能步入精英的行列。如今這場(chǎng)角力將比你的預(yù)想更為激烈和艱難。

    或許是David Samuel這個(gè)家伙把我?guī)нM(jìn)個(gè)人品牌研究這一行的,幾年前我看了他的報(bào)告。他在報(bào)告中說(shuō)了我們?yōu)槭裁葱枰獋€(gè)人品牌。當(dāng)時(shí)他的聽(tīng)眾來(lái)自一個(gè)電信大公司:

    “如果我們根據(jù)人的智力把他們劃分三六九等,那么他們就是一群A,一群B,一群C和一群D。因?yàn)槿蚧厔?shì),C群和D群的工作已經(jīng)被外包了。一切已經(jīng)過(guò)去了。至于留下的你們,現(xiàn)在就要為躋身A群和B群而開(kāi)始競(jìng)爭(zhēng)。或許在這個(gè)人才濟(jì)濟(jì)的群體中,你會(huì)想用大聲嚷嚷來(lái)取得關(guān)注了。如何才能讓自己受到關(guān)注?你該如何讓自己發(fā)光以證明自己可以獲得額外的工作機(jī)會(huì)?你該如何從身邊每個(gè)人都像你一樣能干甚至更甚于你的環(huán)境中勝出?如果你身邊的每個(gè)人都是很能干的A群B群,你又該如何與他  閱讀全文

    posted @ 2008-03-31 11:55 和風(fēng)細(xì)雨 閱讀(202) | 評(píng)論 (0)編輯 收藏

    全排列算法示例

    package com.sitinspring;

    /**
     * 全排列算法示例
    如果用P表示n個(gè)元素的排列,而Pi表示不包含元素i的排列,(i)Pi表示在排列Pi前加上前綴i的排列,那么,n個(gè)元素的排列可遞歸定義為:
    如果n=1,則排列P只有一個(gè)元素i
    如果n>1,則排列P由排列(i)Pi構(gòu)成(i=1、2、.、n-1)。
    根據(jù)定義,容易看出如果已經(jīng)生成了k-1個(gè)元素的排列,那么,k個(gè)元素的排列可以在每個(gè)k-1個(gè)元素的排列Pi前添加元素i而生成。
    例如2個(gè)元素的排列是1  2和2   1,對(duì)3個(gè)元素而言,p1是2  3和3  2,在每個(gè)排列前加上1即生成1 2 3和1 3 2兩個(gè)新排列,
    p2和p3則是1  3、3  1和1  2、2  1,
    按同樣方法可生成新排列2 1 3、2 3 1和3 1 2、3 2 1。
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-3-25
     
    */

    public class Permutation<T>{
        
    public static void main(String[] args){
            String[] arr
    ={"1","2","3"};
            
            Permutation
    <String> a=new Permutation<String>();
            a.permutation(arr,
    0,arr.length);
        }

        
        
    public void permutation(T[] arr,int start,int end){
            
    if(start<end+1){
                permutation(arr,start
    +1,end);
                
                
    for(int i=start+1;i<end;i++){
                    T temp;
                    
                    temp
    =arr[start];
                    arr[start]
    =arr[i];
                    arr[i]
    =temp;
                    
                    permutation(arr,start
    +1,end);
                    
                    temp
    =arr[i];
                    arr[i]
    =arr[start];
                    arr[start]
    =temp;
                }

            }

            
    else{
                
    for(int i=0;i<end;i++){
                    System.out.print(arr[i]);
                }

                System.out.print(
    "\n");
            }

        }

    }

    posted @ 2008-03-25 05:33 和風(fēng)細(xì)雨 閱讀(303) | 評(píng)論 (0)編輯 收藏

    JNDI概述

    JNDI(Java Naming and Directory Interface)的中文意思是Java命名和目錄接口。
    借助于JNDI ,開(kāi)發(fā)者能夠通過(guò)名字定位用戶,機(jī)器,網(wǎng)絡(luò),對(duì)象,服務(wù)。 JNDI的常見(jiàn)功能有定位資源,如定位到內(nèi)網(wǎng)中一臺(tái)打印機(jī),定位Java對(duì)象或RDBMS(關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))等
    在EJB,RMI,JDBC等JavaEE(J2EE)API技術(shù)中JNDI得到了廣泛應(yīng)用。JNDI為J2EE平臺(tái)提供了標(biāo)準(zhǔn)的機(jī)制,并借助于名字來(lái)查找網(wǎng)絡(luò)中的一切對(duì)象。

    理解“命名和目錄服務(wù)”

    在掌握J(rèn)NDI之前,開(kāi)發(fā)者必須理解命名和目錄服務(wù)。
    名字類似于引用,即能標(biāo)識(shí)某實(shí)體如對(duì)象,人等。在企業(yè)應(yīng)用中,經(jīng)常需要借助于名字實(shí)現(xiàn)對(duì)各種對(duì)象的引用,如借助于名字引用電話號(hào)碼,IP地址,遠(yuǎn)程對(duì)象等。
    命名服務(wù)類似于話務(wù)員,如果需要打電話給某人,但又不知道他的電話號(hào)碼,于是將電話打到查詢臺(tái),以便能夠詢問(wèn)到用戶的電話號(hào)碼,打電話者需要提供人名給他。隨后,話務(wù)員就能查到那人的電話號(hào)碼。



    命名服務(wù)的功能

    將名字與對(duì)象綁定在一起,這類似于電話公司提供的服務(wù),比如將人名綁定到被叫端的電話。
    提供根據(jù)名字查找對(duì)象的機(jī)制。這稱為查找對(duì)象或者解析名字。這同電話公司提供的服務(wù)類似,比如根據(jù)人名查找到電話號(hào)碼。

    在現(xiàn)實(shí)的計(jì)算機(jī)環(huán)境中,命名服務(wù)很常見(jiàn),如需要定位網(wǎng)絡(luò)中的某臺(tái)機(jī)器,則借助于域名系統(tǒng)(Domain Name System,DNS)能夠?qū)C(jī)器名轉(zhuǎn)化成IP地址。

    目錄對(duì)象和目錄服務(wù)

    在命名服務(wù)中,借助名字能夠找到任何對(duì)象,其中有一類對(duì)象比較特殊,它能在對(duì)象中存儲(chǔ)屬性,它們被稱之為目錄對(duì)象或稱之為目錄入口項(xiàng)(Directory Entry)。將目錄對(duì)象連接在一起便構(gòu)成了目錄(Directory),它是一個(gè)樹(shù)狀結(jié)構(gòu)的構(gòu)成,用戶可以通過(guò)節(jié)點(diǎn)和分支查找到每個(gè)目錄對(duì)象。
    目錄服務(wù)是對(duì)命名服務(wù)的擴(kuò)展,它能夠依據(jù)目錄對(duì)象的屬性而提供目錄對(duì)象操作。

    JNDI的概念和主要用途

    為實(shí)現(xiàn)命名和目錄服務(wù),基于java的客戶端需要借助于JNDI系統(tǒng),它為命名和目錄服務(wù)架起了通信的橋梁。JNDI的主要用途有:
    開(kāi)發(fā)者使用JNDI,能夠?qū)崿F(xiàn)目錄和Java對(duì)象之間的交互。
    使用JNDI,開(kāi)發(fā)者能獲得對(duì)JAVA事務(wù)API中UserTransaction接口的引用。
    借助于JNDI,開(kāi)發(fā)者能連接到各種資源工廠,如JDBC數(shù)據(jù)源,Java消息服務(wù)等。
    客戶和EJB組件能夠借助于JNDI查找到其他EJB組件。

    名字,綁定和上下文的概念

    JNDI中存在多種名字,一種是原子名,如src/com/sitinspring中的src,com和sitinspring;一種是復(fù)合名,它由0個(gè)或多個(gè)原子名構(gòu)成,如src/com/sitinspring。
    綁定就是將名字和對(duì)象關(guān)聯(lián)起來(lái)的操作。如system.ini綁定到硬盤中的文件, src/com/sitinspring/.classpath分別綁定到三個(gè)目錄和一個(gè)文件。
    上下文(Context)由0個(gè)或多個(gè)綁定構(gòu)成,每個(gè)綁定存在不同的原子名。如WEB-INF文件夾下分別含有.cvsignore和web.xml的文件名。在JNDI中, WEB-INF是上下文,它含有原子名.cvsignore和web.xml的綁定,它們分別綁定到硬盤中的文件。
    上下文中也允許存在上下文,它們被成為子上下文(subcontext),子上下文和上下文類似,它也能含有多個(gè)名字到對(duì)象的綁定。這類似于文件夾下含有子文件夾。

    命名系統(tǒng)和初始上下文

    命名系統(tǒng)由一套連在一起的上下文構(gòu)成,而且這些上下文使用了相同的命名語(yǔ)法。可以用目錄樹(shù)來(lái)類比這個(gè)概念。
    瀏覽命名空間的起點(diǎn)稱之為初始上下文(Initial Context),初始上下文類似于目錄樹(shù)中的根節(jié)點(diǎn)概念。

    借助于初始上下文,能夠開(kāi)始命名和目錄服務(wù)。

    JNDI查找資源示例

    try {
      Context initCtx = new InitialContext();
      // java:comp/env是命名空間,相當(dāng)于是本機(jī)JNDI資源引用根目錄
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      Member bean = (Member) envCtx.lookup("Member");

      System.out.print("member name=" + bean.getMemberName() + " age="
          + bean.getAge());
    } catch (NamingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    JNDI有關(guān)API

    list():用于獲得當(dāng)前上下文的綁定列表
    lookup():用于解析上下文中名字綁定,該操作將返回綁定到給定名字的對(duì)象。
    rename():重新命名
    createSubContext():從當(dāng)前上下文創(chuàng)建子上下文。
    destroySubContext():從當(dāng)前上下文銷毀子上下文。
    bind()。從當(dāng)前上下文中創(chuàng)建名字到對(duì)象的綁定。
    rebind():再次綁定,如果已經(jīng)存在同名綁定則覆蓋之。

    posted @ 2008-03-20 12:55 和風(fēng)細(xì)雨 閱讀(663) | 評(píng)論 (0)編輯 收藏

    如何配置filter解決Struts的中文問(wèn)題

    1.制作一filter類如下:
    package com.sitinspring.filter;

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;

    public class SetCharacterEncodingFilter implements Filter {
        
    protected String encoding = null;

        
    protected FilterConfig filterConfig = null;

        
    protected boolean ignore = true;

        
    public void destroy() {
            
    this.encoding = null;
            
    this.filterConfig = null;
        }


        
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) 
    throws IOException, ServletException {

            
    // Conditionally select and set the character encoding to be used
            if (ignore || (request.getCharacterEncoding() == null)) {
                String encoding 
    = selectEncoding(request);
                
    if (encoding != null)
                    request.setCharacterEncoding(encoding);
            }


            
    // Pass control on to the next filter
            chain.doFilter(request, response);

        }


        
    public void init(FilterConfig filterConfig) throws ServletException {

            
    this.filterConfig = filterConfig;
            
    this.encoding = filterConfig.getInitParameter("encoding");
            String value 
    = filterConfig.getInitParameter("ignore");
            
    if (value == null)
                
    this.ignore = true;
            
    else if (value.equalsIgnoreCase("true"))
                
    this.ignore = true;
            
    else if (value.equalsIgnoreCase("yes"))
                
    this.ignore = true;
            
    else
                
    this.ignore = false;

        }


        
    protected String selectEncoding(ServletRequest request) {
            
    return (this.encoding);
        }


    }


    2.在Web.xml中配置這個(gè)filter。
        <!-- filter -->
        
    <filter>
            
    <filter-name>Set Character Encoding</filter-name>
            
    <filter-class>com.sitinspring.filter.SetCharacterEncodingFilter</filter-class>
            
    <init-param>
                
    <param-name>encoding</param-name>
                
    <param-value>UTF-8</param-value>
            
    </init-param>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>Set Character Encoding</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>

    3.Action調(diào)用示例:
    package com.sitinspring.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.beanutils.PropertyUtils;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;

    /**
     * Action定義處
     * 
    @author sitinspring
     *
     * @date 2008-3-20
     
    */

    public final class HelloAction extends Action {
        
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                
    throws Exception {
            request.setCharacterEncoding(
    "UTF-8");

            
    // 取Form中參數(shù)name
            String name = (String) PropertyUtils.getSimpleProperty(form, "name");
            
            request.setAttribute(
    "msg""歡迎你!"+name);

            
    return (mapping.findForward("SayHello"));
        }

    }


    以上。

    posted @ 2008-03-20 12:46 和風(fēng)細(xì)雨 閱讀(797) | 評(píng)論 (0)編輯 收藏

    使用正則表達(dá)式解析SQL語(yǔ)句

    本文詳細(xì)代碼請(qǐng)見(jiàn):
    http://m.tkk7.com/sitinspring/archive/2008/03/14/186372.html

     

    問(wèn)題:將左邊的SQL語(yǔ)句解析成右邊的形式

    Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3

    select
         c1,
        c2,
        c3
    from
         t1,
        t2,
        t3
    where
         condi1=5 and
         condi6=6 or
         condi7=7
    group by
         g1,
        g2,
        g3
    order by
         g2,
        g3

    按關(guān)鍵字找出SQL語(yǔ)句中各部分

    我們閱讀SQL語(yǔ)句會(huì)把整句分來(lái)成列,表,條件,分組字段,排序字段來(lái)理解,解析SQL的目的也是這樣.
    分解SQL語(yǔ)句有規(guī)律可循,以列為例,它必定包含在select和from之間,我們只要能找到SQL語(yǔ)句中的關(guān)鍵字select和from,就能找到查詢的列.
    怎么找到select和from之間的文字呢?其實(shí)一個(gè)正則表達(dá)式就能解決:(select)(.+)(from),其中第二組(.+)代表的文字就是select和from之間的文字.
    程序見(jiàn)右邊.

    /**
     * 從文本text中找到regex首次匹配的字符串,不區(qū)分大小寫
     * @param regex: 正則表達(dá)式
     * @param text:欲查找的字符串
     * @return regex首次匹配的字符串,如未匹配返回空
     */
    private static String getMatchedString(String regex,String text){
      Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
       
        Matcher matcher=pattern.matcher(text);

        while(matcher.find()){
          return matcher.group(2);
        }
       
        return null;
    }

    解析函數(shù)分析

    private static String getMatchedString(String regex,String text){
      Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
       
        Matcher matcher=pattern.matcher(text);

        while(matcher.find()){
          return matcher.group(2);
        }
       
        return null;
    }

    左邊的這個(gè)函數(shù),第一個(gè)參數(shù)是擬定的正則表達(dá)式,第二個(gè)是整個(gè)SQL語(yǔ)句.
    當(dāng)正則表達(dá)式為(select)(.+)(from)時(shí),程序?qū)⒃赟QL中查找第一次匹配的地方(有Pattern.CASE_INSENSITIVE的設(shè)置,查找不區(qū)分大小寫),如果找到了則返回模式中的第二組代表的文字.
    如果sql是select a,b from tc,則返回的文字是a,b.

    選擇的表對(duì)應(yīng)的查找正則表達(dá)式

    選擇的表比較特殊,它不想選擇的列一樣固定處于select和from之間,當(dāng)沒(méi)有查找條件存在時(shí),它處于from和結(jié)束之間;當(dāng)有查找條件存在時(shí),它處于from和where之間.
    因此查詢函數(shù)寫為右邊的形式:

    /**
     * 解析選擇的表
     *
     */
    private void parseTables(){
        String regex="";  
       
        if(isContains(sql,"\\s+where\\s+")){
          regex="(from)(.+)(where)";  
        }
        else{
          regex="(from)(.+)($)";  
        }
       
        tables=getMatchedString(regex,sql);
    }


    isContains函數(shù)

    isContains函數(shù)用于在lineText中查找word,其中不區(qū)分大小些,只要找到了即返回真.

    /**
     * 看word是否在lineText中存在,支持正則表達(dá)式
     * @param lineText
     * @param word
     * @return
     */
    private static boolean isContains(String lineText,String word){
      Pattern pattern=Pattern.compile(word,Pattern.CASE_INSENSITIVE);
      Matcher matcher=pattern.matcher(lineText);
      return matcher.find();
    }

    解析查找條件的函數(shù)

    private void parseConditions(){
        String regex="";  
       
        if(isContains(sql,"\\s+where\\s+")){
          // 包括Where,有條件
         
          if(isContains(sql,"group\\s+by")){
            // 條件在where和group by之間
            regex="(where)(.+)(group\\s+by)"; 
          }
          else if(isContains(sql,"order\\s+by")){
            // 條件在where和order by之間
            regex="(where)(.+)(order\\s+by)"; 
          }
          else{
            // 條件在where到字符串末尾
            regex="(where)(.+)($)"; 
          }       
        }
        else{
          // 不包括where則條件無(wú)從談起,返回即可
          return;
        }
       
        conditions=getMatchedString(regex,sql);
    }

    解析GroupBy的字段

    private void parseGroupCols(){
        String regex="";  
       
        if(isContains(sql,"group\\s+by")){
          // 包括GroupBy,有分組字段

          if(isContains(sql,"order\\s+by")){
            // group by 后有order by
            regex="(group\\s+by)(.+)(order\\s+by)"; 
          }
          else{
            // group by 后無(wú)order by
            regex="(group\\s+by)(.+)($)"; 
          }     
        }
        else{
          // 不包括GroupBy則分組字段無(wú)從談起,返回即可
          return;
        }
       
        groupCols=getMatchedString(regex,sql);
    }


    解析OrderBy的字段

    private void parseOrderCols(){
        String regex="";  
       
        if(isContains(sql,"order\\s+by")){
          // 包括order by,有分組字段
          regex="(order\\s+by)(.+)($)";                 
        }
        else{
          // 不包括GroupBy則分組字段無(wú)從談起,返回即可
          return;
        }
         
        orderCols=getMatchedString(regex,sql);
    }

    得到解析后的各部分

    按以上解析方法獲得了列,表,條件,分組條件,排序條件各部分之后,它們會(huì)存儲(chǔ)到各個(gè)成員變量中.
    注意這些成員變量的原值都是null,如果在SQL語(yǔ)句中能夠找到對(duì)應(yīng)的部分的話它們將借助getMatchedString獲得值,否則還是null.我們通過(guò)判斷這些成員變量是否為空就能知道它對(duì)應(yīng)的部分是否被解析出來(lái).

     /**
       * 待解析的SQL語(yǔ)句
       */
      private String sql;
     
      /**
       * SQL中選擇的列
       */
      private String cols;
     
      /**
       * SQL中查找的表
       */
      private String tables;
     
      /**
       * 查找條件
       */
      private String conditions;
     
      /**
       * Group By的字段
       */
      private String groupCols;
     
      /**
       * Order by的字段
       */
      private String orderCols;

    取得不需要單行顯示時(shí)的SQL語(yǔ)句

    進(jìn)展到這一步,SQL語(yǔ)句中列,表,條件,分組條件,排序條件各部分都被獲取了出來(lái),這時(shí)把它們重新組合一下就能得到整理后的SQL語(yǔ)句.
    如下面的SQL語(yǔ)句將變成右邊的部分(先使靜態(tài)成員isSingleLine=false):
    Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3

    select
         c1,c2,c3
    from
         t1,t2,t3
    where
         condi1=5 and condi6=6 or condi7=7
    group by
         g1,g2,g3
    order by
         g2,g3


    進(jìn)一步解析

    有時(shí)我們需要把列,表,條件,分組條件,排序條件單行顯示以方便查看或加上注釋,這就要求我們對(duì)列,表,條件,分組條件,排序條件等進(jìn)行進(jìn)一步解析.
    初看解析很方便,以固定的分隔符劈分即可,但需要注意的是查詢條件中分隔符有and和or兩種,如果貿(mào)然分隔會(huì)使重新組合時(shí)使SQL失真.
    推薦一種做法,我們可以在分隔符后加上一個(gè)標(biāo)志如空行,然后再以這個(gè)標(biāo)志來(lái)劈分.這樣就不會(huì)使SQL失真了.
    請(qǐng)見(jiàn)下頁(yè)的getSplitedParagraph函數(shù).

    getSplitedParagraph函數(shù)

    private static List<String> getSplitedParagraph(String paragraph,String splitStr){
      List<String> ls=new ArrayList<String>();   
     
      // 先在分隔符后加空格
      Pattern p = Pattern.compile(splitStr,Pattern.CASE_INSENSITIVE);

      Matcher m = p.matcher(paragraph);
      StringBuffer sb = new StringBuffer();

      boolean result = m.find();
      while (result) {
        m.appendReplacement(sb, m.group(0) + Crlf);
        result = m.find();
      }
      m.appendTail(sb);
     
      // 再按空格斷行
      String[] arr=sb.toString().split("[\n]+");
      for(String temp:arr){
        ls.add(FourSpace+temp+Crlf);
      }
     
      return ls;
    }

    處理結(jié)果

    把靜態(tài)成員變量isSingleLine=true后我們來(lái)看看執(zhí)行結(jié)果:
    select
         c1,
        c2,
        c3
    from
         t1,
        t2,
        t3
    where
         condi1=5 and
         condi6=6 or
         condi7=7
    group by
         g1,
        g2,
        g3
    order by
         g2,
        g3

    小結(jié)

    從這個(gè)例子中我們體會(huì)了分治的思想:分治是把一個(gè)大問(wèn)題分解成小問(wèn)題,然后分別解決小問(wèn)題,再組合起來(lái)大問(wèn)題的解決方法就差不多了.這種思想在工程領(lǐng)域解決問(wèn)題時(shí)很普遍,我們要學(xué)會(huì)使用這種思想來(lái)看待,分析和解決問(wèn)題,不要貪多求大,結(jié)果導(dǎo)致在大問(wèn)題面前一籌莫展.
    其次我們可以從這個(gè)例子中學(xué)習(xí)找規(guī)律,然后借助規(guī)律的過(guò)程,現(xiàn)實(shí)世界千變?nèi)f化,但都有規(guī)律可循,只要我們找到了規(guī)律,就等于找到了事物之門的鑰匙.
    接下了我們復(fù)習(xí)了正則表達(dá)式用于查找的方法,以前的正則表達(dá)式學(xué)習(xí)多用于驗(yàn)證匹配,其實(shí)這只是正則表達(dá)式的一部分功能.
    最后從解析條件成單行的過(guò)程中,我們可以學(xué)習(xí)到一種解決問(wèn)題的技巧,即當(dāng)現(xiàn)實(shí)中的規(guī)律存在變數(shù)時(shí)加入人為設(shè)置的規(guī)律,這有時(shí)能使我們更好更快的解決問(wèn)題.

    posted @ 2008-03-19 22:00 和風(fēng)細(xì)雨 閱讀(9660) | 評(píng)論 (4)編輯 收藏

    Blogjava的CSS實(shí)現(xiàn)

    效果:


    CSS頁(yè)面設(shè)置代碼:
    body{
        margin
    :0 auto;
        text-align
    :center;
        min-width
    :760px;
        background
    :#e6e6e6;
    }


    #bodyDiv
    {
        width
    :924px;
        margin
    :0 auto;
        text-align
    :left;
        background
    :#eefaec;
    }


    #header
    {
        width
    :924px;
        height
    :132px;
        background
    :#ffffff;
    }


    #sidebar
    {
        margin
    :2px;
        width
    :170px;
        height
    :560px;
        float
    :right;
        background
    :#ffffff;
        border-style
    :dashed;
        border-color
    :#b9ecae;
        border-width
    :1px;
        padding-top
    :20px;
        padding-bottom
    :20px;
    }


    #sidebar li
    {
        padding-left
    :20px;
        padding-right
    :20px;
    }


    #content
    {
        margin
    :2px;
        width
    :740px;
        height
    :560px;
        float
    :left;
        border-style
    :dashed;
        border-color
    :#b9ecae;
        border-width
    :1px;
        background
    :#f8f8f8;
        padding-top
    :20px;
    }


    #footer
    {
        clear
    :both;
        background
    :#eefaec;
    }


    ul
    {
        margin
    :0;
        padding
    :0;
        list-style-type
    :none;
    }


    a:link 
    {
        color
    : #6fbc4c;
        text-decoration
    : none;
    }

    a:active 
    {
        color
    : #6fbc4c;
    }

    a:visited 
    {
        color
    : #6fbc4c;
    }

    a:hover 
    {
        color
    : #646464;
    }


    h1 
    {
        font-size
    : 18px; 
        margin
    : 10px 0px 5px; 
        color
    : #666666; 
        text-align
    : center;
    }

    h2 
    {
        font-size
    : 16px; 
        margin
    : 10px 0px 5px; 
        color
    : #666666; 
        text-align
    : center;
    }

    h3 
    {
        font-size
    : 14px; 
        margin
    : 10px 0px 5px; 
        color
    : #666666; 
        text-align
    : center;
    }

    頁(yè)面代碼:
    <%@ page contentType="text/html; charset=UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>Bug管理布局示例</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" rev="stylesheet" href="web/css/bugmngLayout.css"
        type
    ="text/css" />
    </head>

    <body>
    <div id="bodyDiv">
    <div id="header">
        
    <jsp:include page="/web/page/branch/header2.jsp"/>
    </div>
    <div id="sidebar">
        
    <jsp:include page="/web/page/branch/sidebar.jsp"/>
    </div>
    <div id="content">
        
    <jsp:include page="/web/page/branch/content.jsp"/>
    </div>
    <div id="footer">
        
    <jsp:include page="/web/page/branch/footer.jsp"/>
    </div>
    </div>
    </body>
    </html>





    posted @ 2008-03-17 22:06 和風(fēng)細(xì)雨 閱讀(353) | 評(píng)論 (0)編輯 收藏

    使用CSS設(shè)置網(wǎng)頁(yè)元素樣式

    在XHTML中CSS的意義

    傳統(tǒng)的HTML能夠并已經(jīng)創(chuàng)建了大量?jī)?yōu)秀美觀使用的網(wǎng)頁(yè),但隨著時(shí)代的發(fā)展和客戶要求的逐步提高,傳統(tǒng)HTML網(wǎng)頁(yè)將網(wǎng)頁(yè)的數(shù)據(jù),表現(xiàn)和行為混雜的方式妨礙了自身可維護(hù)性和精確性的提高。
    在XHTML中,CSS能把網(wǎng)頁(yè)的數(shù)據(jù)和表現(xiàn)(主要是格式和樣式規(guī)則)分隔開(kāi)來(lái),使人對(duì)網(wǎng)頁(yè)能有更精確細(xì)致的控制,同時(shí)可維護(hù)性也變得更好,更方便。
    在本文中,我們將學(xué)習(xí)CSS的相關(guān)知識(shí)。

    框模型

    在CSS處理網(wǎng)頁(yè)時(shí),它認(rèn)為網(wǎng)頁(yè)包含的每一個(gè)元素都包含在一個(gè)不可見(jiàn)的框中,這個(gè)框由內(nèi)容(Content),內(nèi)容外的內(nèi)邊距(padding),內(nèi)邊距的外邊框(border)和外邊框的不可見(jiàn)空間-外邊距(margin)組成。


    塊級(jí)元素和行內(nèi)元素

    在XHTML中,元素可能是塊級(jí)(block)的,也可能是行級(jí)(inline)的。
    塊級(jí)元素會(huì)產(chǎn)生一個(gè)新行(段落),而行級(jí)元素是行內(nèi)的,不會(huì)產(chǎn)生新行(段落)。
    常見(jiàn)的塊級(jí)元素有div,p等,常見(jiàn)的行級(jí)元素有a,span等。
    在默認(rèn)情況下,元素按照在XHTML中從上到下的次序顯示,并且在每個(gè)塊級(jí)元素的框的開(kāi)頭和結(jié)尾換行。

    注意:塊級(jí)元素和行級(jí)元素不是絕對(duì)的,我們可以通過(guò)樣式設(shè)置來(lái)改變?cè)氐倪@個(gè)屬性。

    元素的基本屬性

    內(nèi)邊距:padding
    邊框:border
    外邊距:margin
    大小:width,height
    對(duì)齊:text-align
    顏色:color
    背景:background
    使元素浮動(dòng):float

    下面將講述如何對(duì)這些元素屬性進(jìn)行設(shè)置。

    改變?cè)乇尘?/strong>

    Background有以下子屬性:
    background-color:背景顏色,默認(rèn)值transparent,輸入#rrggbb即可。
    background-image:背景圖像,默認(rèn)值none
    background-repeat:背景圖像的重復(fù)顯示,默認(rèn)值repeat(縱橫重復(fù)),repeat-x(水平重復(fù)),repeat-y(垂直重復(fù)),no-repeat(使圖像不并排顯示)
    background-attachment:默認(rèn)值scroll,表示隨頁(yè)面滾動(dòng),如果是fixed則不隨頁(yè)面滾動(dòng)。
    background-posistion:默認(rèn)值top left。

    這些屬性也可以統(tǒng)一設(shè)置,如:background:#ccc url(theadbg.gif) repeat-x left center;
    例:
    TABLE.Listing TH {
        FONT-WEIGHT: bold;
        background:#ccc url(theadbg.gif) repeat-x left center;
        BORDER-BOTTOM: #6b86b3 1px solid
    }

    設(shè)定元素的大小

    設(shè)置width和height即可,如:
    width:180px;
    height:50%;
    注意這里可以設(shè)置絕對(duì)大小如180px也可以設(shè)置相對(duì)大小50%,其中百分?jǐn)?shù)是相對(duì)與父元素的比例,父元素即容納本元素的元素。
    此外設(shè)置元素大小還可以使用min-width,max-width,max-height,min-height等,但在部分瀏覽器中不支持這些屬性。
    例:
    #content{
    width:640px;
    height:500px;
    float:right;
    background:#f8f8f8;
    }

    Px和em的區(qū)別

    px像素(Pixel)。相對(duì)長(zhǎng)度單位。像素px是相對(duì)于顯示器屏幕分辨率而言的。(引自CSS2.0手冊(cè))
    em是相對(duì)長(zhǎng)度單位。相對(duì)于當(dāng)前對(duì)象內(nèi)文本的字體尺寸。如當(dāng)前對(duì)行內(nèi)文本的字體尺寸未被人為設(shè)置,則相對(duì)于瀏覽器的默認(rèn)字體尺寸。(引自CSS2.0手冊(cè)) 任意瀏覽器的默認(rèn)字體高都是16px。所有未經(jīng)調(diào)整的瀏覽器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。為了簡(jiǎn)化font-size的換算,需要在css中的body選擇器中聲明Font-size=62.5%,這就使em值變?yōu)?16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說(shuō)只需要將你的原來(lái)的px數(shù)值除以10,然后換上em作為單位就行了。

    設(shè)置元素的外邊距

    外邊距是一個(gè)元素與下一個(gè)元素之間的透明空間量,位于元素的邊框外邊。
    設(shè)置外邊距設(shè)置margin的值即可,如margin:1;它將應(yīng)用與四個(gè)邊。
    如果要為元素的上右下左四個(gè)邊設(shè)置不同的外邊距,可以設(shè)置margin-top,margin-right,margin-bottom,margin-left四個(gè)屬性。
    例:
    fieldset{
    margin:1em 0;
    padding:1em;
    border:1px solid #ccc;
    background:#f8f8f8;
    }

    添加元素的內(nèi)邊距

    內(nèi)邊距是邊框到內(nèi)容的中間空間。使用它我們可以把內(nèi)容和邊界拉開(kāi)一些距離。
    設(shè)置內(nèi)邊距如右:padding:1px;
    如果要為元素的上右下左四個(gè)邊設(shè)置不同的內(nèi)邊距,可以設(shè)置padding-top,padding-right,padding-bottom,padding-left四個(gè)屬性。
    例:
    li{
    padding-left:10px;
    }


    控制元素浮動(dòng)

    float屬性可以使元素浮動(dòng)在文本或其它元素中,這種技術(shù)的最大用途是創(chuàng)建多欄布局(layout)
    float可以取兩個(gè)值:left,浮動(dòng)到左邊,right:浮動(dòng)到右邊
    例:
    #sidebar{
    width:180px;
    height:500px;
    float:left;
    background:#f8f8f8;
    padding-top:20px;
    padding-bottom:20px;
    }

    #content{
    width:640px;
    height:500px;
    float:right;
    background:#f8f8f8;
    }

    設(shè)置邊框

    邊框位于外邊距和內(nèi)邊距中間,在應(yīng)用中常用來(lái)標(biāo)示特定的區(qū)域。它的子屬性有:
    border-style:可以設(shè)定邊框的樣式,常見(jiàn)的有solid,dotted,dashed等。
    border-width:邊框的寬度。
    border-color:邊框顏色
    border-top,border-right,border-bottom,border-left可以把邊框限制在一條或幾條邊上。
    例:
    ul a{
    display:block;
    padding:2px;
    text-align:center;
    text-decoration:none;
    width:130px;
    margin:2px;
    color:#8d4f10;
    }

    ul a:link{
    background:#efb57c;
    border:2px outset #efb57c;
    }

    控制元素內(nèi)容的對(duì)齊

    text-align屬性可以讓我們?cè)O(shè)置元素內(nèi)容的對(duì)齊,它可以取的值有l(wèi)eft,center,right等。
    例:
    body{
    margin:0 auto;
    text-align:center;
    min-width:760px;
    background:#e6e6e6;
    }

    #bodyDiv{
    width:822px;
    margin:0 auto;
    text-align:left;
    background:#f8f8f8;
    border:1px solid #FFFFFf;
    }

    控制元素在父元素的垂直對(duì)齊

    設(shè)置vertical-align可以控制元素在父元素的垂直對(duì)齊位置,它可以取的值有:
    middle:垂直居中
    text-top:在父元素中頂對(duì)齊
    text-bottom:是元素的底線和父元素的底線對(duì)齊。

    在網(wǎng)頁(yè)中引入樣式表

    <title>"記賬系統(tǒng)"單項(xiàng)收支記錄瀏覽頁(yè)面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="web/js/ajax.js" type="text/javascript"></script>
    <link rel="stylesheet" rev="stylesheet" href="web/css/style.css"
    type="text/css" />

    </head>

    樣式表示例

    body{
      margin:0 auto;
      text-align:center;
      min-width:760px;
      background:#e6e6e6;
    }

    #bodyDiv{
      width:822px;
      margin:0 auto;
      text-align:left;
      background:#f8f8f8;
      border:1px solid #FFFFFf;
    }


    TABLE.Listing {
        MARGIN: 0px 0px 8px;
        WIDTH: 92%;
        BORDER-BOTTOM: #6b86b3 3px solid
    }

    #content{
      width:640px;
      height:500px;
      float:right;
      background:#f8f8f8;
    }

    #content h1,#content h2,#content p{
      padding-left:20px;
    }

    #footer{
      clear:both;
    }

    fieldset{
      margin:1em 0;
      padding:1em;
      border:1px solid #ccc;
      background:#f8f8f8;
    }


    如何知道頁(yè)面元素對(duì)應(yīng)樣式表的那部分?

    如果頁(yè)面元素設(shè)置了id,則它對(duì)應(yīng)的樣式表部分是#id,如#bodyDiv。
    如果頁(yè)面元素設(shè)定了class,則它在樣式表中尋找”元素類型.class”對(duì)應(yīng)的部分,如TABLE.Listing。
    如果沒(méi)有寫明,則元素會(huì)找和自己類型對(duì)應(yīng)的樣式設(shè)置,如fieldset。

    注意CSS中沒(méi)有大小寫的區(qū)別。

    例:
    <div id="content">

    <table id="TbSort" class="Listing" width=100% align=center>

    <fieldset><legend>添加賬目</legend>

    posted @ 2008-03-14 12:59 和風(fēng)細(xì)雨 閱讀(1336) | 評(píng)論 (0)編輯 收藏

    JavaScript基本語(yǔ)法

    JavaScript的運(yùn)行環(huán)境和代碼位置

    編寫JavaScript腳本不需要任何特殊的軟件,一個(gè)文本編輯器和一個(gè)Web瀏覽器就足夠了,JavaScript代碼就是運(yùn)行在Web瀏覽器中。
    用JavaScript編寫的代碼必須嵌在一份html文檔才能得到執(zhí)行,這可以通過(guò)兩種方法得到,第一種是將JavaScript代碼直接寫在html文件中,這多用于僅適用于一個(gè)頁(yè)面的JS程序;另一種是把JavaScript代碼存入一個(gè)獨(dú)立的文件中(.js作為擴(kuò)展名),在利用<Script>標(biāo)簽的src屬性指向該文件.

    將JavaScript直接嵌入頁(yè)面文件中

    <%@ page contentType="text/html; charset=UTF-8" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>歡迎進(jìn)入"我的事務(wù)備忘錄"</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="web/js/strUtil.js" type="text/javascript"></script>
    </head>

    <body>
    <div>這個(gè)頁(yè)面應(yīng)該很快消失,如果它停止說(shuō)明Web容器已經(jīng)停止運(yùn)作了,或JavaScript功能未開(kāi)啟
    <form method=post action="ShowPage?page=login">
    </form>
    <div>
    </body>
    </html>

    <script LANGUAGE="JavaScript">
    <!--
    document.body.onload=function(){
     document.forms[0].submit();

    //-->
    </script>


    將JavaScript存入單獨(dú)的文件中(頁(yè)面文件)

    <%@ page contentType="text/html; charset=UTF-8" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>"我的事務(wù)備忘錄"用戶登錄頁(yè)面</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script src="web/js/ajax.js" type="text/javascript"></script>
    <link rel="stylesheet" rev="stylesheet" href="web/css/style.css"
     type="text/css" />
    </head>

    <body>
    <div id="branding">歡迎進(jìn)入"個(gè)人事務(wù)備忘錄",請(qǐng)輸入您的用戶名和密碼,再按登錄鍵登錄
    <form method=post action="ShowPage?page=loginCheck">
     <table  bgcolor="#ffffff" id="TbSort" class="Listing" width="200" align=center>
      <tbody id="loginTable">
       <tr><th align="center" colspan=3>用戶登錄.</th></tr>
       <tr>
        <td width=50>用戶名:</td>
        <td width=150><input type="text" name="userName" value=""
          style="width: 300px; height: 20px" /></td>
       </tr>
       <tr>
        <td width=50>密碼:</td>
        <td width=150><input type="text" name="userPswd" value=""
          style="width: 300px; height: 20px" /></td>
       </tr>
       <tr>
        <td width=50></td>
        <td width=150><input type="submit" value="登錄"
          style="width: 100px; height: 20px" /></td>
       </tr>
      </tbody>
     </table>
    </form>
    <div>
    </body>
    </html>

    將JavaScript存入單獨(dú)的文件中(ajax.js)

    var prjName="/MyTodoes/";
    var ajaxObj;

    function createAjaxObject(){
     try{return new ActiveXObject("Msxml2.XMLHTTP");}catch(e){};
     try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(e){};
     try{return new XMLHttpRequest();}catch(e){};
     alert("XmlHttpRequest not supported!");
     return null;
    }

    function $(id){
         return document.getElementById(id);
    }

    JavaScript中的語(yǔ)句和注釋

    JavaScript中的語(yǔ)句和Java中一樣,也是一行書(shū)寫一條語(yǔ)句,末尾加上分號(hào)’;’,雖然js中也可以把多條語(yǔ)句寫在一行,但推薦不要這樣做.
    JavaScript中注釋也和Java中一樣,以// 來(lái)注釋單行,/*….*/來(lái)注釋多行,雖然HTML風(fēng)格的注釋<!-- *****  --> 在JS中也有效,但建議不要這樣做.


    JavaScript中的變量

    在js中,變量允許字母,數(shù)字,美元符號(hào)和下劃線字符.變量定義使用var關(guān)鍵字,如
    var age;
    age=23;
    var name=“andy”;
    雖然js允許程序員可以直接對(duì)變量進(jìn)行賦值而無(wú)需提前對(duì)它們做出聲明,但我們強(qiáng)烈建議不要這樣做.
    Js中變量和其它語(yǔ)法元素都是區(qū)分字母大小寫的,如變量age,Age,AGE沒(méi)有任何關(guān)系,它們都不是同一個(gè)變量.

    JavaScript是一種弱類型語(yǔ)言

    和強(qiáng)制要求程序員對(duì)數(shù)據(jù)類型做出聲明的強(qiáng)類型(Strongly typed)程序設(shè)計(jì)語(yǔ)言如java,C#等不一樣,js不要求程序員進(jìn)行類型說(shuō)明,這就是所謂的弱類型”weakly typed”語(yǔ)言.這意味著程序員可以隨意改變某個(gè)變量的數(shù)據(jù)類型.
    以下寫法在Java中是絕對(duì)不允許的,但在js中完全沒(méi)有問(wèn)題:
    var age=23;
    age=“Twenty three”
    Js并不關(guān)心age的值是字符串還是變量.

    JavaScript中的數(shù)據(jù)類型-字符串

    字符串必須放在單引號(hào)或雙引號(hào)中.如
    var name=“Andy”;
    var name=‘Bill’;
    一般情況下宜使用雙引號(hào),但如果字符串中有雙引號(hào)則應(yīng)該把字符串放在單引號(hào)中,反之則應(yīng)該把字符串放在雙引號(hào)中.

    JavaScript中的數(shù)據(jù)類型-數(shù)值

    Js中并沒(méi)有int,float,double,long的區(qū)別,它允許程序員使用任意位數(shù)的小數(shù)和整數(shù),實(shí)際上js中的數(shù)值應(yīng)該被稱為浮點(diǎn)數(shù).
    如:
    var salary=10000;
    var price=10.1;
    var temperature=-6;

    JavaScript中的數(shù)據(jù)類型-布爾值

    Js中的布爾值和Java中的一致,true表示真,false表示假,如:
    var isMale=true;
    var isFemale=false;

    注意布爾值true和false不要寫成了字符串”true”和’false’.

    JS中的函數(shù)

    如果需要多次使用同一組語(yǔ)句,可以把這些語(yǔ)句打包成一個(gè)函數(shù)。所謂函數(shù)就是一組允許人們?cè)诖a中隨時(shí)調(diào)用的語(yǔ)句。從效果上看,每個(gè)函數(shù)都相當(dāng)于一個(gè)短小的腳本。
    和Java中每個(gè)函數(shù)都在類中不一樣,JS中函數(shù)不必屬于一個(gè)類,在使用上它類似于Java中的靜態(tài)公有函數(shù),只要引入這個(gè)函數(shù)所在的文件就可以使用它。

    JS中函數(shù)的語(yǔ)法

    JS中,一個(gè)函數(shù)的大致語(yǔ)法如下:
    function fname(args){
          statements;
    }
    Function是函數(shù)的固定標(biāo)志;fname是函數(shù)名;args是函數(shù)參數(shù),它可以有很多個(gè),只要你把它們用逗號(hào)分割開(kāi)來(lái)即可;statements是其中的語(yǔ)句,每句結(jié)尾都和java中一樣用“;”表示結(jié)束。

    在定義了這個(gè)函數(shù)的腳本(頁(yè)面)中,你可以從任意位置去調(diào)用這個(gè)函數(shù);引入這個(gè)頁(yè)面后,你還可以從其它頁(yè)面訪問(wèn)它。

    一般來(lái)說(shuō),對(duì)于共通性強(qiáng),適用面廣,會(huì)在多個(gè)頁(yè)面中調(diào)用的函數(shù),我們一般把它們放在一個(gè)JS頁(yè)面中,然后由需要使用這些函數(shù)的頁(yè)面引入它們;而對(duì)于只適用于一個(gè)頁(yè)面的函數(shù),還是把它放在單個(gè)頁(yè)面中較好。

    JS函數(shù)的返回值

    在JS中,函數(shù)不僅能夠以參數(shù)的形式接受數(shù)據(jù),運(yùn)行代碼,它和其它編程語(yǔ)言中的函數(shù)一樣,可以返回?cái)?shù)據(jù)。
    讓JS函數(shù)返回?cái)?shù)據(jù),你不需要也不能在函數(shù)簽名上動(dòng)任何手腳,只需要用return語(yǔ)句返回你想返回的數(shù)字即可,舉例如下:
    function substract(op1,op2){
         return op1-op2; }
    }

    JS中變量的作用域

    在JS中,我們提倡用var來(lái)定義一個(gè)變量,凡是變量就會(huì)有作用域的問(wèn)題,根據(jù)定義方式和位置的不同,它既可能是全局的,也有可能是局部的。
    用var定義在腳本文件中,不屬于任何一個(gè)函數(shù)的變量,它的作用域就是全局性的,它可以在腳本中的任何位置被引用,包括有關(guān)函數(shù)的內(nèi)部。全局變量的作用域是整個(gè)腳本。
    用var定義在函數(shù)中的變量,它的作用域就是局部性的,它的作用域僅限于這個(gè)函數(shù),在函數(shù)的外部是無(wú)法使用它的。
    不用var定義在函數(shù)中的變量,它的作用域是全局的,如果你的腳本里已經(jīng)存在一個(gè)與之同名的變量,這個(gè)函數(shù)將覆蓋那個(gè)現(xiàn)有變量的值。
    定義函數(shù)時(shí),我們必須明確的把它內(nèi)部的變量都明確的聲明為局部變量,如果從來(lái)沒(méi)有忘記在函數(shù)中使用var關(guān)鍵字,就可以避免任何形式的二義性隱患。

    JS中的數(shù)組

    在JS中,我們使用Array關(guān)鍵字聲明數(shù)組,在聲明時(shí)對(duì)數(shù)組長(zhǎng)度進(jìn)行限定,如:
    var arr=Array(3);
    有時(shí)運(yùn)行起來(lái)才知道數(shù)組長(zhǎng)度,JS中我們也可以這樣定義數(shù)組:
    var arr=Array();
    向數(shù)組中添加元素時(shí)你需要給出新元素的值,還需要在數(shù)組中為新元素制定存放位置,這個(gè)位置由下標(biāo)給出,如arr[1]=4。

    在JS中定義數(shù)組的例子

    定義方式一:
    var arr=Array(3);
    arr[0]=“劉備”; arr[1]=“關(guān)于”; arr[2]=“張飛”;
    定義方式二:
    var arr=Array();
    arr[0]=3; arr[1]=4;arr[2]=5;
    定義方式三:
    Var arr=Array(“1”,2,true);
    定義方式四:
    var arr=[“征東”,”平西”,”鎮(zhèn)南”,”掃北”];

    posted @ 2008-03-14 12:49 和風(fēng)細(xì)雨 閱讀(1993) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共10頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 9 下一頁(yè) Last 
    主站蜘蛛池模板: 抽搐一进一出gif免费视频| 四虎永久在线精品视频免费观看| 久久99精品视免费看| 91大神在线免费观看| 日日AV拍夜夜添久久免费| 亚洲国产成人精品青青草原| 免费又黄又爽又猛大片午夜 | 一个人看的www在线免费视频| 国产精品麻豆免费版| 亚洲人成网国产最新在线| aa级毛片毛片免费观看久| 最近2019中文字幕免费看最新| 亚洲无圣光一区二区| 亚美影视免费在线观看| 免费午夜爽爽爽WWW视频十八禁| 亚洲精品无码专区| 影音先锋在线免费观看| 久久精品国产精品亚洲艾| 亚洲成a∨人片在无码2023| 毛片免费观看的视频在线| 日本亚洲精品色婷婷在线影院| 国产一区二区三区免费观看在线| 亚洲中文字幕久久精品无码喷水| WWW国产成人免费观看视频| 久久久久亚洲精品天堂久久久久久| 亚洲人成综合网站7777香蕉| 免费看国产精品3a黄的视频| 亚洲VA成无码人在线观看天堂| 搡女人免费免费视频观看| 亚洲国产无套无码av电影| 国产性生大片免费观看性| 精品国产综合成人亚洲区| a毛片在线免费观看| 国产∨亚洲V天堂无码久久久| 日本道免费精品一区二区| 亚洲AV永久无码区成人网站| 免费福利电影在线观看| 精品无码一区二区三区亚洲桃色| 亚洲视频在线观看免费视频| 亚洲一欧洲中文字幕在线| 免费毛片在线视频|