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

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

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

    ply

    吞噬黑暗
    posts - 1, comments - 11, trackbacks - 0, articles - 13
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2012年3月16日

    jQuery調(diào)用JSON時(shí),net.sf.json.JSONException: There is a cycle in the hierarchy!

    遇到了一些問(wèn)題,如hibernate延遲加載錯(cuò)誤,這都是老掉牙的問(wèn)題了,一看就知道加個(gè)lazy=flase就OK了。想不到快要完成了又遇到了新的問(wèn)題,JSON死循環(huán),實(shí)在讓人郁悶。異常如下:


    net.sf.json.JSONException: There is a cycle in the hierarchy!
            at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.
    handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
            at net.sf.json.JSONObject._fromBean(JSONObject.java:674)
            at net.sf.json.JSONObject.fromObject(JSONObject.java:181)
            at net.sf.json.JSONArray._processValue(JSONArray.java:2381)
            at net.sf.json.JSONArray.processValue(JSONArray.java:2412)
            Truncated. see log file for complete stacktrace
    >


    仔細(xì)查了一下發(fā)現(xiàn)是hibernate主外鍵關(guān)聯(lián)的錯(cuò),后來(lái)就想下json源代碼下來(lái)看,發(fā)現(xiàn)大費(fèi)周章都沒(méi)搞到j(luò)son源碼,還是老辦法反編譯瞅瞅,發(fā)現(xiàn)JSONArray根據(jù)判斷取得的不同類(lèi)型調(diào)用相應(yīng)的方法,

    if (object instanceof Collection)
        return _fromCollection((Collection)object, jsonConfig);

    而我從hibernate那得到的是list,所以去調(diào)用了_fromCollection方法,而里面的方法發(fā)現(xiàn)一個(gè)問(wèn)題:該方法會(huì)不斷的拆開(kāi)實(shí)體屬性,直到?jīng)]有為止,而我的ContactGroup里有兩個(gè)屬性用于自身關(guān)聯(lián)

    private Set contactGroups = new HashSet(0);
    private Set contactGroupPersons = new HashSet(0);


    也就是說(shuō)主外鍵自身關(guān)聯(lián)的是個(gè)死循環(huán),那怎么才能不讓他出現(xiàn)這種情況呢,應(yīng)該有個(gè)配置的參數(shù)后者終止循環(huán)的地方吧,查看發(fā)
    現(xiàn),jsonConfig,呵呵,config應(yīng)該是配置參數(shù)吧,參看JsonConfig看見(jiàn)巨多的屬性,有點(diǎn)暈PropertyFilter
    ,不提了,看了老半天,發(fā)現(xiàn)了一個(gè)屬性PropertyFilter,PropertyFilter 是一個(gè)interface,代碼如下:


    public interface PropertyFilter
    {


    public abstract boolean apply(Object obj, String s, Object obj1);
    }


    也就是說(shuō)我可以通過(guò)這個(gè)方法過(guò)濾掉List里的相應(yīng)屬性,只要讓它返回true就可過(guò)濾掉,……,有點(diǎn)懸……我們重寫(xiě)一下這個(gè)方法:


    JsonConfig cfg = new JsonConfig();
        cfg.setJsonPropertyFilter(new PropertyFilter()
        {
             public boolean apply(Object source, String name, Object value) {
               if(name.equals("contactGroups")||name.equals("contactGroupPersons")) {
                 return true;
               } else {
                 return false;
              }
            }
           });

    將hibernate產(chǎn)生的實(shí)體bean中的contactGroups和contactGroupPersons過(guò)濾掉就OK了!

    然后調(diào)用JSONArray.fromObject(mychildren,cfg); mychildren是hibernate返回的list。

     

     1List<ShoppingCart> listCarts = sCartServiceImpl
     2                        .ShoppingCartTable(shoppingCart);
     3                // 先過(guò)濾對(duì)set集合的拆解
     4                JsonConfig config = new JsonConfig();
     5                config.setJsonPropertyFilter(new PropertyFilter() {
     6                    @Override
     7                    public boolean apply(Object arg0, String arg1, Object arg2) {
     8                        if (arg1.equals("shoppingCarts")) {
     9                            return true;
    10                        }
     else {
    11                            return false;
    12                        }

    13                    }

    14                }
    );
    15                // 將數(shù)據(jù)轉(zhuǎn)換成Json數(shù)據(jù)
    16                JSONArray jsonObject = JSONArray.fromObject(listCarts, config);
    17                System.out.println(jsonObject.toString());
    18

    搞了一下午,參考網(wǎng)絡(luò)的資料!解決問(wèn)題了!

    posted @ 2012-03-16 18:38 ply 閱讀(20653) | 評(píng)論 (10)編輯 收藏

    2011年12月26日

    -------------------------------------
    MyEclipse
    快捷鍵1(CTRL)
    -------------------------------------
    Ctrl+1 快速修復(fù)
    Ctrl+D:
    刪除當(dāng)前行
    Ctrl+Q  定位到最后編輯的地方
    Ctrl+L  定位在某行 
    Ctrl+O  快速顯示 OutLine

    Ctrl+T  快速顯示當(dāng)前類(lèi)的繼承結(jié)構(gòu)
    Ctrl+W  關(guān)閉當(dāng)前Editer
    Ctrl+K  快速定位到下一個(gè)
    Ctrl+E
    快速顯示當(dāng)前Editer的下拉列表
    Ctrl+J 
    正向增量查找(按下Ctrl+J后,你所輸入的每個(gè)字母編輯器都提供快速匹配定位到某個(gè)單詞,如果沒(méi)有,則在stutes line中顯示沒(méi)有找到了,)   

    Ctrl+Z 返回到修改前的狀態(tài)
    Ctrl+Y 與上面的操作相反
    Ctrl+/  注釋當(dāng)前行,再按則取消注釋

    Ctrl+D刪除當(dāng)前行。
    Ctrl+Q跳到最后一次的編輯處
    Ctrl+M切換窗口的大小
    Ctrl+I格式化激活的元素Format
    Active
    Elements。
    Ctrl+F6切換到下一個(gè)Editor
    Ctrl+F7切換到下一個(gè)Perspective
    Ctrl+F8切換到下一個(gè)View
    ------------------------------------------
    MyEclipse
    快捷鍵2(CTRL+SHIFT)
    ------------------------------------------
    Ctrl+Shift+E
    顯示管理當(dāng)前打開(kāi)的所有的View的管理器(可以選擇關(guān)閉,激活等操作)
    Ctrl+Shift+/ 自動(dòng)注釋代碼

    Ctrl+Shift+\自動(dòng)取消已經(jīng)注釋的代碼
    Ctrl+Shift+O 自動(dòng)引導(dǎo)類(lèi)包
    Ctrl+Shift+J
    反向增量查找(和上條相同,只不過(guò)是從后往前查)
    Ctrl+Shift+F4 關(guān)閉所有打開(kāi)的Editer
    Ctrl+Shift+X 
    把當(dāng)前選中的文本全部變?yōu)樾?xiě)
    Ctrl+Shift+Y  把當(dāng)前選中的文本全部變?yōu)樾?xiě)
    Ctrl+Shift+F 
    格式化當(dāng)前代碼
    Ctrl+Shift+M(先把光標(biāo)放在需導(dǎo)入包的類(lèi)名上) 作用是加Import語(yǔ)句
    Ctrl+Shift+P
    定位到對(duì)于的匹配符(譬如{}) (從前面定位后面時(shí),光標(biāo)要在匹配符里面,后面到前面,則反之)
    Ctrl+Shift+F格式化文件Format
    Document。
    Ctrl+Shift+O作用是缺少的Import語(yǔ)句被加入,多余的Import語(yǔ)句被刪除。

    Ctrl+Shift+S保存所有未保存的文件。
    Ctrl+Shift+/ 在代碼窗口中是這種/*~*/注釋?zhuān)贘SP文件窗口中是
    <!--~-->。
    Shift+Ctrl+Enter
    在當(dāng)前行插入空行(原理同上條)
    -----------------------------------------
    MyEclipse
    快捷鍵3(ALT)
    -----------------------------------------
    Alt+/ 代碼助手完成一些代碼的插入
    ,自動(dòng)顯示提示信息
    Alt+↓  當(dāng)前行和下面一行交互位置(特別實(shí)用,可以省去先剪切,再粘貼了)
    Alt+↑  當(dāng)前行和上面一行交互位置(同上)

    Alt+←  前一個(gè)編輯的頁(yè)面
    Alt+→  下一個(gè)編輯的頁(yè)面(當(dāng)然是針對(duì)上面那條來(lái)說(shuō)了)
    Alt+Enter
    顯示當(dāng)前選擇資源(工程,or 文件 or文件)的屬性


    MyEclipse 快捷鍵4(ALT+CTRL)


    Alt+CTRL+↓ 復(fù)制當(dāng)前行到下一行(復(fù)制增加)
    Alt+CTRL+↑
    復(fù)制當(dāng)前行到上一行(復(fù)制增加)
    -------------------------------------------
    MyEclipse
    快捷鍵5(ALT+SHIFT)
    -------------------------------------------
    Alt+Shift+R
    重命名
    Alt+Shift+M 抽取方法
    Alt+Shift+C 修改函數(shù)結(jié)構(gòu)(比較實(shí)用,有N個(gè)函數(shù)調(diào)用了這個(gè)方法,修改一次搞定)

    Alt+Shift+L 抽取本地變量
    Alt+Shift+F 把Class中的local變量變?yōu)閒ield變量
    Alt+Shift+I
    合并變量
    Alt+Shift+V 移動(dòng)函數(shù)和變量
    Alt+Shift+Z 重構(gòu)的后悔藥(Undo) Shift+Enter
    在當(dāng)前行的下一行插入空行(這時(shí)鼠標(biāo)可以在當(dāng)前行的任一位置,不一定是最后)
    Alt+Shift+O(或點(diǎn)擊工具欄中的Toggle Mark
    Occurrences按鈕) 當(dāng)點(diǎn)擊某個(gè)標(biāo)記時(shí)可使本頁(yè)面中其他地方的此標(biāo)記黃色凸顯,并且窗口的右邊框會(huì)出現(xiàn)白色的方塊,點(diǎn)擊此方塊會(huì)跳到此標(biāo)記處。

    下面的快捷鍵是重構(gòu)里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構(gòu)的快捷鍵都是Alt+Shift開(kāi)頭的了)


    --------------------------------------------
    MyEclipse 快捷鍵(6)
    --------------------------------------------
    F2當(dāng)鼠標(biāo)放在一個(gè)標(biāo)記處出現(xiàn)Tooltip時(shí)候按F2則把鼠標(biāo)移開(kāi)時(shí)Tooltip還會(huì)顯示即Show
    Tooltip Description。
    F3跳到聲明或定義的地方。
    F5單步調(diào)試進(jìn)入函數(shù)內(nèi)部。

    F6單步調(diào)試不進(jìn)入函數(shù)內(nèi)部,如果裝了金山詞霸2006則要把“取詞開(kāi)關(guān)”的快捷鍵改成其他的。
    F7由函數(shù)內(nèi)部返回到調(diào)用處。

    F8一直執(zhí)行到下一個(gè)斷點(diǎn)。



    posted @ 2011-12-26 17:17 ply 閱讀(283) | 評(píng)論 (0)編輯 收藏

    2011年12月2日

    length是數(shù)組的屬性,
    length()是字符串獲取長(zhǎng)度的方法,
    size是list的個(gè)數(shù)

    posted @ 2011-12-02 13:37 ply 閱讀(254) | 評(píng)論 (0)編輯 收藏

    2011年12月1日

    從對(duì)象的內(nèi)存角度來(lái)理解試試.

    假設(shè)現(xiàn)在有一個(gè)父類(lèi)Father,它里面的變量需要占用1M內(nèi)存.有一個(gè)它的子類(lèi)Son,它里面的變量需要占用0.5M內(nèi)存.

    現(xiàn)在通過(guò)代碼來(lái)看看內(nèi)存的分配情況:

    Father f = new Father();//系統(tǒng)將分配1M內(nèi)存.

    Son s = new Son();//系統(tǒng)將分配1.5M內(nèi)存.


    因?yàn)樽宇?lèi)中有一個(gè)隱藏的引用super會(huì)指向父類(lèi)實(shí)例,所以在實(shí)例化子類(lèi)之前會(huì)先實(shí)例化一個(gè)父類(lèi),也就是說(shuō)會(huì)先執(zhí)行父類(lèi)的構(gòu)造函數(shù).

    由于s中包含了父類(lèi)的實(shí)例,所以s可以調(diào)用父類(lèi)的方法.


    Son s1 = s;//s1指向那1.5M的內(nèi)存.(可以理解為就是:子類(lèi)引用指向子類(lèi)對(duì)象)


    Father f1 = (Father)s;//這時(shí)f1會(huì)指向那1.5M內(nèi)存中的1M內(nèi)存,即是說(shuō),f1只是指向了s中實(shí)例的父類(lèi)實(shí)例對(duì)象,所以f1只能調(diào)用父類(lèi)的方法(存儲(chǔ)在1M內(nèi)存中),而不能調(diào)用子類(lèi)的方法(存儲(chǔ)在0.5M內(nèi)存中).


    Son s2 = (Son)f;//這句代碼運(yùn)行時(shí)會(huì)報(bào)ClassCastException.因?yàn)閒中只有1M內(nèi)存,而子類(lèi)的引用都必須要有1.5M的內(nèi)存,所以無(wú)法轉(zhuǎn)換.


    Son s3 = (Son)f1;//這句可以通過(guò)運(yùn)行,這時(shí)s3指向那1.5M的內(nèi)存.由于f1是由s轉(zhuǎn)換過(guò)來(lái)的,所以它是有1.5M的內(nèi)存的,只是它指向的只有1M內(nèi)存.

     


    示例:

    class Father{

    void print(){};

    }


    class Son extends Father{

    void print(){System.out.println("子類(lèi)中!");}

    void show(){System.out.println("show 中!");}

    }


    class Demo{

    public static void main(String args[]){

    Father obj=new Son();

    obj.print();

    obj.show();  //這個(gè)調(diào)用會(huì)報(bào)錯(cuò)!

    }

    }


    1 .如果你想實(shí)現(xiàn)多態(tài),那么必須有三個(gè)條件,父類(lèi)引用,子類(lèi)對(duì)象,方法覆蓋

    你這里如果Fathor類(lèi)有一個(gè)show()方法,那么形成方法覆蓋,那么此時(shí)就可以這么寫(xiě):obj.show(),此刻形成了多態(tài).

    2. 沒(méi)有方法覆蓋,那你這里只能解釋為父類(lèi)引用去訪問(wèn)一個(gè)子類(lèi)的方法,當(dāng)然,父類(lèi)引用沒(méi)有這么大范圍的權(quán)限,當(dāng)然會(huì)報(bào)錯(cuò)

    PS:多態(tài)實(shí)際上是一種機(jī)制,在編譯時(shí)刻,會(huì)生成一張?zhí)摂M表,來(lái)記錄所有覆蓋的方法,沒(méi)有被覆蓋的方法是不會(huì)記錄到這張表的.

    若一個(gè)父類(lèi)引用調(diào)用了沒(méi)有覆蓋的子類(lèi)方法,那么是不符合該表的,那么編譯時(shí)刻就會(huì)報(bào)錯(cuò).

    在執(zhí)行程序的時(shí)候,虛擬機(jī)會(huì)去這張?zhí)摂M表中找覆蓋的方法,比如引用中實(shí)際上存的是一個(gè)子類(lèi)對(duì)象引用,那么就會(huì)去找子類(lèi)中的相應(yīng)的覆蓋的方法來(lái)執(zhí)行

    定義一個(gè)父類(lèi)類(lèi)型的引用指向一個(gè)子類(lèi)的對(duì)象既可以使用子類(lèi)強(qiáng)大的功能,又可以抽取父類(lèi)的共性。

    所以,父類(lèi)類(lèi)型的引用可以調(diào)用父類(lèi)中定義的所有屬性和方法,而對(duì)于子類(lèi)中定義而父類(lèi)中沒(méi)有的方法,它是無(wú)可奈何的;

    同時(shí),父類(lèi)中的一個(gè)方法只有在在父類(lèi)中定義而在子類(lèi)中沒(méi)有重寫(xiě)的情況下,才可以被父類(lèi)類(lèi)型的引用調(diào)用;

    對(duì)多態(tài)的理解:多態(tài)體現(xiàn)在繼承中,所以需要有繼承關(guān)系,然后子類(lèi)要重寫(xiě)父類(lèi)方法,最后父類(lèi)指向子類(lèi)(父類(lèi)本身具有一些方法,這些方法被子類(lèi)重寫(xiě)了,但調(diào)用這些方法時(shí),會(huì)自動(dòng)調(diào)子類(lèi)重寫(xiě)的那些)。

    多態(tài)具體表現(xiàn)在重寫(xiě)和重載,多態(tài)就是類(lèi)的多種表現(xiàn)方式,比如同名不同參,子類(lèi)重寫(xiě)父類(lèi)。

    看下面這段程序:

    class Father{

        public void func1(){

            func2();

        }


        //這是父類(lèi)中的func2()方法,因?yàn)橄旅娴淖宇?lèi)中重寫(xiě)了該方法

        //所以在父類(lèi)類(lèi)型的引用中調(diào)用時(shí),這個(gè)方法將不再有效

        //取而代之的是將調(diào)用子類(lèi)中重寫(xiě)的func2()方法

        public void func2(){

            System.out.println("AAA");

        }

    }

     

    class Child extends Father{

        //func1(int i)是對(duì)func1()方法的一個(gè)重載

        //由于在父類(lèi)中沒(méi)有定義這個(gè)方法,所以它不能被父類(lèi)類(lèi)型的引用調(diào)用

        //所以在下面的main方法中child.func1(68)是不對(duì)的

        public void func1(int i){

            System.out.println("BBB");

        }


        //func2()重寫(xiě)了父類(lèi)Father中的func2()方法

        //如果父類(lèi)類(lèi)型的引用中調(diào)用了func2()方法,那么必然是子類(lèi)中重寫(xiě)的這個(gè)方法

        public void func2(){

            System.out.println("CCC");

        }

    }


    public class PolymorphismTest {

        public static void main(String[] args) {

            Father child = new Child();

            child.func1();//打印結(jié)果將會(huì)是什么?  

        }

    }


      
    上面的程序是個(gè)很典型的多態(tài)的例子。子類(lèi)Child繼承了父類(lèi)Father,并重載了父類(lèi)的func1()方法,重寫(xiě)了父類(lèi)的func2()方法。重載后的func1(int
    i)和func1()不再是同一個(gè)方法,由于父類(lèi)中沒(méi)有func1(int i),那么,父類(lèi)類(lèi)型的引用child就不能調(diào)用func1(int
    i)方法。而子類(lèi)重寫(xiě)了func2()方法,那么父類(lèi)類(lèi)型的引用child在調(diào)用該方法時(shí)將會(huì)調(diào)用子類(lèi)中重寫(xiě)的func2()。


        那么該程序?qū)?huì)打印出什么樣的結(jié)果呢?

        很顯然,應(yīng)該是“CCC”。







    變量是不存在重寫(xiě)覆蓋的!

    public class A { int a = 1; }

    public class B extends A { int a = 2; }


    測(cè)試類(lèi)里調(diào)用了這個(gè)方法void compare(){

    if(super.a == this.a)

    System.out.println("not overrided");

    else

    System.out.println("overrided");}

    控制臺(tái)出來(lái)的是overrided

     類(lèi)中的屬性是沒(méi)有多態(tài)性的,即你在引用上面使用屬性時(shí),系統(tǒng)只會(huì)去找引用的靜態(tài)類(lèi)型中的那個(gè)屬性,而與它的實(shí)際類(lèi)型無(wú)關(guān)。

    靜態(tài)方法也是沒(méi)有多態(tài)性的。

    posted @ 2011-12-01 22:24 ply 閱讀(2842) | 評(píng)論 (0)編輯 收藏

    2011年9月15日

    web應(yīng)用類(lèi)型的轉(zhuǎn)換分為兩種情況:

    1.從客房端的字符串到自定義類(lèi)型的轉(zhuǎn)換。

    2.頁(yè)面輸出時(shí)從自定義類(lèi)型到字符串的轉(zhuǎn)換。

    在struts2中分兩種轉(zhuǎn)換,一種是局部轉(zhuǎn)換,另一種是全局類(lèi)型轉(zhuǎn)換。具體轉(zhuǎn)換的實(shí)施需要一個(gè)轉(zhuǎn)換類(lèi)和一個(gè)自定義類(lèi)。我們先來(lái)看局部類(lèi)型轉(zhuǎn)換。

    局部類(lèi)型轉(zhuǎn)換

    對(duì)于int等基本類(lèi)型,struts2會(huì)自動(dòng)完成類(lèi)型轉(zhuǎn)換,像age年齡,在輸入頁(yè)面是String型的,到Action后會(huì)自動(dòng)轉(zhuǎn)換成int型。而如果是轉(zhuǎn)換成對(duì)象類(lèi)型的話(huà),就需要自定義類(lèi)型轉(zhuǎn)換。這樣就需要一個(gè)自定義類(lèi)。要定義一個(gè)轉(zhuǎn)換類(lèi),需要繼承ognl.DefaultTypeConverter這個(gè)類(lèi) ,這是個(gè)類(lèi)型轉(zhuǎn)換的類(lèi)。代碼如下:

     1 public class PointConverter extends DefaultTypeConverter{

     2     public Ojbect convertValue(Map context,Object value,Class tyType){//重寫(xiě)方法
     3         if(Point.class==toType){
     4             Point point = new Point();
     5             String[] str = (String[])value;//將String轉(zhuǎn)換成類(lèi)的代碼處理
     6             return point;
     7          }
     8          if(String.class==toType){//說(shuō)明由類(lèi)轉(zhuǎn)換成String
     9              Point point = (Point)value;//將類(lèi)轉(zhuǎn)成String的代碼處理
    10              return String型的一個(gè)變量;
    11          }
    12          return null;
    13     }
    14 }

    方法對(duì)數(shù)說(shuō)明:1、Map context  ——應(yīng)用上正文

                        2、Object value ——是要進(jìn)行類(lèi)型轉(zhuǎn)換的值。如果是從客戶(hù)端到自定義的類(lèi),那么value是個(gè)字符串。注意:它是一個(gè)字符串的數(shù)組。因?yàn)椋涸诒韱沃锌梢杂卸鄠€(gè)文本域,而所有文本域可以是同一個(gè)名字,這時(shí)是考慮通用性而作為數(shù)組處理的。如果只有一個(gè)文本域,則數(shù)組只有一個(gè)元素,下標(biāo)為0。注:jsp的servlet中接收多個(gè)相同名字的輸入域用request.getParameterValues()方法。

                        3、class toType ——來(lái)指定向哪 一種類(lèi)型轉(zhuǎn)換,即是向類(lèi)轉(zhuǎn)換還是向客戶(hù)端轉(zhuǎn)換。

                        4、Point是一個(gè)類(lèi),即是我們的自定義類(lèi)。不是系統(tǒng)內(nèi)置的類(lèi)型

     1 if(類(lèi).class == toType){//說(shuō)明由客戶(hù)端向類(lèi)轉(zhuǎn)換
     2     Point point = new Point();//向哪個(gè)類(lèi)轉(zhuǎn)換,就實(shí)例化這個(gè)類(lèi)
     3     String[] str = (String[])value;//因?yàn)槭怯煽蛻?hù)端向類(lèi)轉(zhuǎn)換,所以此時(shí)value是一個(gè)String[]數(shù)組
     4     String[] paramValues = str[0].split(",");
     5     //下面部分代碼就是進(jìn)行轉(zhuǎn)換處理
     6 }
     7 if(String.class == toType){//說(shuō)明由類(lèi)向客戶(hù)端的String轉(zhuǎn)換,此時(shí)value是一個(gè)對(duì)象
     8     Point point = (Point)value;
     9     //下面部分的代碼就是進(jìn)行轉(zhuǎn)換處理;
    10 }

     自定義類(lèi)、轉(zhuǎn)換類(lèi)、action都創(chuàng)建好之后,要通告struts2轉(zhuǎn)換類(lèi)在什么地方,并且告訴struts2是對(duì)誰(shuí)進(jìn)行轉(zhuǎn)換。寫(xiě)一個(gè)文件:action文件名-conversion.properties,此屬性文件要與action在同一包下,此文件說(shuō)明對(duì)此action中的屬性進(jìn)行轉(zhuǎn)化。

     文件中的內(nèi)容如下:

    point = 轉(zhuǎn)換類(lèi)名

     內(nèi)容說(shuō)明:

    1、point是Action中的一個(gè)屬性,轉(zhuǎn)換類(lèi)指明所使用哪個(gè)轉(zhuǎn)換類(lèi)對(duì)此屬性進(jìn)行轉(zhuǎn)換

    2、properties文件中的注釋為“#”號(hào),前面加“#”的行是被注釋的

    類(lèi)型轉(zhuǎn)換的流程

     1、用戶(hù)進(jìn)行請(qǐng)求,根據(jù)請(qǐng)求名在struts.xml中尋找Action

     2、在Action中,根據(jù)請(qǐng)求域中的名字去尋找對(duì)應(yīng)的set方法。找到后在賦值之前會(huì)檢查這個(gè)屬性有沒(méi)有自定義的類(lèi)型轉(zhuǎn)換。沒(méi)有的話(huà),按照默認(rèn)進(jìn)行轉(zhuǎn)換;如果某個(gè)屬性已經(jīng)定義好了類(lèi)型轉(zhuǎn)換,則會(huì)去檢查在Action同一目錄下的 action文件名-conversion.properties 文件。

     3、從文件中找到要轉(zhuǎn)換的屬性及其轉(zhuǎn)換類(lèi)。

     4、然后進(jìn)入轉(zhuǎn)換類(lèi)中,在此類(lèi)中判斷轉(zhuǎn)換的方向。我們是先從用戶(hù)請(qǐng)求開(kāi)始的,所以這時(shí)先進(jìn)入從字符串到類(lèi)的轉(zhuǎn)換。返回轉(zhuǎn)換后的對(duì)象。流程返回Action。

     5、將返回的對(duì)象賦值給Action中的屬性,執(zhí)行Action中的execute()

     6、執(zhí)行完execute()方法,根據(jù)struts.xml的配置轉(zhuǎn)向頁(yè)面

     7、在jsp中顯示內(nèi)容時(shí),根據(jù)頁(yè)面中的屬性名去調(diào)用相應(yīng)的get方法,以便輸出

     8、在調(diào)用get方法之前,會(huì)檢查有沒(méi)有此屬性的自定義類(lèi)型轉(zhuǎn)換。如果有,再次跳轉(zhuǎn)到轉(zhuǎn)換類(lèi)當(dāng)中。

     9、在轉(zhuǎn)換類(lèi)中再次判斷轉(zhuǎn)換方向,進(jìn)入由類(lèi)到字符串的轉(zhuǎn)換,完成轉(zhuǎn)換后返回字符串。

     10、將返回的值直接帶出到要展示的頁(yè)面當(dāng)中去展示。

    posted @ 2011-09-15 14:39 ply 閱讀(480) | 評(píng)論 (0)編輯 收藏

    2011年9月5日

    <?xml version='1.0' encoding='utf-8'?>

      <role rolename="tomcat"/>
      <role rolename="role1"/>
      <role rolename="manager-gui"/>
      <role rolename="admin"/>
      <user username="admin" password="admin" roles="admin,manager-gui"/>
      <user username="tomcat" password="tomcat" roles="tomcat"/>
      <user username="role1" password="tomcat" roles="role1"/>
      <user username="both" password="tomcat" roles="tomcat,role1"/>

     

    </tomcat-users>

    posted @ 2011-09-05 20:34 ply 閱讀(238) | 評(píng)論 (0)編輯 收藏

    2011年9月3日

    tomcat官網(wǎng)

    http://tomcat.apache.org/download-60.cgi

    免安裝版

    1.把jdk放在C:\Program Files目錄下:

    1)在環(huán)境變量Path前面添加

    C:\Program Files\jdk1.6.0_10\bin;

    2)添加環(huán)境變量JAVA_HOME

    值為 C:\Program Files\jdk1.6.0_10

    2.把tomcat安裝在C:\Program Files目錄下:

    1)添加環(huán)境變量classpath

    值為.;C:\Program Files\jdk1.6.0_10\jre\lib;C:\Program Files\jdk1.6.0_10\lib\tools.jar;C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\bootstrap.jar

    2)添加環(huán)境變量TOMCAT_HOME

    值C:\Program Files\Apache Software Foundation\Tomcat 6.0

    3)添加環(huán)境變量CATALINA_HOME

    值C:\Program Files\Apache Software Foundation\Tomcat 6.0

    4)添加環(huán)境變量CATALINA_BASE

    值C:\Program Files\Apache Software Foundation\Tomcat 6.0

    驗(yàn)證Tomcat是否安裝成功:

    1)啟動(dòng)Tomcat;

    2)在Ie瀏覽器中敲入http://localhost:8080/,出來(lái)Tomcat首頁(yè),說(shuō)明Tomcat安裝成功;

    3)寫(xiě)一個(gè)jsp頁(yè)面a.jsp,放到Tomcat的webapps/Root目錄下,在Ie瀏覽器中敲入http://localhost:8080/a.jsp,

    如果不報(bào)錯(cuò),說(shuō)明Tomcat的JDK配置正確

    安裝版

    第一步:下載jdk和tomcat:JDK下載 Tomcat下載
        最新的jdk為1.6.10,tomcat為6.0,建議jdk1.4以上,tomcat4.0以上
    第二步:安裝和配置你的jdk和tomcat:執(zhí)行jdk和tomcat的安裝程序,然后設(shè)置按照路徑進(jìn)行安裝即可。
    1.安裝jdk以后,需要配置一下環(huán)境變量,在我的電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量(假定你的jdk安裝在C:\Program Files\Java):
    JAVA_HOME=C:\Program Files\Java\jdk1.6.0_10
    classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因?yàn)樗懋?dāng)前路徑)
    path=%JAVA_HOME%\bin 接著可以寫(xiě)一個(gè)簡(jiǎn)單的java程序來(lái)測(cè)試JDK是否已安裝成功:
    public class Test{
    public static void main(String args[]){
    System.out.println("This is a test program.");
    }
    }


    將上面的這段程序保存為文件名為T(mén)est.java的文件。
    然后打開(kāi)命令提示符窗口,cd到你的Test.java所在目錄,然后鍵入下面的命令
    javac Test.java
    java Test
    此時(shí)如果看到打印出來(lái)This is a test program.的話(huà)說(shuō)明安裝成功了,如果沒(méi)有打印出這句話(huà),你需要仔細(xì)檢查一下你的配置情況。

    2.安裝Tomcat后,在我的電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量(假定你的tomcat安裝在c:\tomcat):
    CATALINA_HOME:C:\Program Files\Apache Software Foundation\Tomcat 6.0 CATALINA_BASE:C:\Program Files\Apache Software Foundation\Tomcat 6.0
    TOMCAT_HOME: C:\Program Files\Apache Software Foundation\Tomcat 6.0
    然后修改環(huán)境變量中的classpath,把tomat安裝目錄下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:
    classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;
    【注意最新版本的Tomcat中可能沒(méi)有common這個(gè)文件夾了。所以servlet-api.jar應(yīng)該的路徑為
    %CATALINA_HOME%\lib\servlet-api.jar;請(qǐng)根據(jù)自己的情況自己修改!】
    接著可以啟動(dòng)tomcat,在IE中訪問(wèn)http://localhost:8080,如果看到tomcat的歡迎頁(yè)面的話(huà)說(shuō)明安裝成功了。
    第三步:建立自己的jsp app目錄
    1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類(lèi)Tomcat自帶的的目錄;
    2.在webapps目錄下新建一個(gè)目錄,起名叫myapp;
    3.myapp下新建一個(gè)目錄WEB-INF,注意,目錄名稱(chēng)是區(qū)分大小寫(xiě)的;
    4.WEB-INF下新建一個(gè)文件web.xml,內(nèi)容如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!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>
    <display-name>My Web Application</display-name>
    <description>
    A application for test.
    </description>
    </web-app>



    5.在myapp下新建一個(gè)測(cè)試的jsp頁(yè)面,文件名為index.jsp,文件內(nèi)容如下:

    <html>
    <body>
    <center>
    Now time is: <%=new java.util.Date()%>
    </center>
    </body>
    </html>


    6.重啟Tomcat
    7.打開(kāi)瀏覽器,輸入http://localhost:8080/myapp/index.jsp 看到當(dāng)前時(shí)間的話(huà)說(shuō)明就成功了。

    答案補(bǔ)充

    第四步:建立自己的Servlet:寫(xiě)入你的第一個(gè)Servlet:在你新建的Application myapp/WEB-INF/classes/test目錄下新建HelloWorld.javapackage test;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class HelloWorld extends HttpServlet
    {
        public void doGet(HttpServletRequest request,HttpServletResponse response)th
    rows ServletException,IOException
       {
        response.setContentType("text/html");

    答案補(bǔ)充

    PrintWriter out = response.getWriter();
        out.println("<html><head><title>");
        out.println("This is my first Servlet");
        out.println("</title></head><body>");
        out.println("<h1>Hello,World!</h1>");
        out.println("</body></html>");
      
       }
       }


    然后照樣用javac HelloWorld.java來(lái)編譯這個(gè)文件,如果出現(xiàn)無(wú)法import javax.servl
    et.*
       那么就是應(yīng)該把C:\Tomcat\common\lib里面的servlet-api.jar文件拷貝到C:\JDK\jre\lib\ext中,再次編譯,就沒(méi)有問(wèn)題了!

    posted @ 2011-09-03 13:31 ply 閱讀(318) | 評(píng)論 (0)編輯 收藏

    2011年9月2日

    1---:java.lang.NoClassDefFoundError: org/apache/struts2/dojo/views/jsp/ui/HeadTag

    解決辦法:原因缺少了dojo的JAR包,引入即可:struts2-dojo-plugin-2.1.2.jar

    The "head" tag renders required JavaScript code to configure Dojo and is required in order to use any of the tags included in the Dojo plugin.

    --------------------

    If you are planning to nest tags from the Dojo plugin, make sure you set parseContent="false", otherwise each request made by the inner tags will be performed twice.

    2---:Unable to load configuration. -bean -jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core- 2.1.2.jar!/struts-default.xml:46:178

    Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest -bean -jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178

    Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/RequestContext
    解決辦法:缺少JAR包,引入commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar即可

    3---:No tag "datetimepicker" defined in tag library imported with prefix "s"

    原因版本問(wèn)題:缺少struts-dojo-plugin JAR包,以及HTML的,<HEAD></HEAD>中沒(méi)有使用<s:head/>標(biāo)簽

    If you're using Struts 2.1.x you're probablymissing the>struts-dojo-plugin. Michal's reference below applies to Struts 2.1.xonly. In the lasts versions (since 2.0.9 I guess), all AJAX are in dojo> plugin.
    > > So you need toinclude <%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
    > > and <sx:head/>
    > >( Temp1:
    <sx:datetimepicker name="picker" />
    Temp2:
    <sx:datetimepicker type="time" name="picker" /><br/>
    Temp3:
    <sx:datetimepicker value="%{'2008-06-08'}" name="picker" />
    Temp4:
    <sx:datetimepicker value="date" name="picker" />)
    > > and call :<sx:datetimepicker .../>

    4---:使用TILES框架

    If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.

    <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"><tiles-definitions>


    5---:struts2中不支持EL表達(dá)式

    Struts2.1 tags do not allow evaluation of JSP EL within their attributes.Instead, Struts2 tags evaluate attribute values as OGNL. Allowing bothexpression languages within the same attribute opens major securityvulnerabilities.


    6---文件上傳過(guò)程中取不到文件名和文件類(lèi)型,即都取到NULL

    原因:如果頁(yè)面中file的name=“a”則我們ACTION中設(shè)置String aContentType,String aFileName;(此兩個(gè)其實(shí)無(wú)所謂,關(guān)鍵是SET方法)

    setA(File file)(){}; setAContentType(String s){};setAFileName(String name){} 即格式如下:setXContentType() setXFileName().X代表你給FILE取的NAME名字

    必須和它相同,固定格式


    7---嚴(yán)重: Unable to parse request
    org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
    警告: Could not find property [struts.valueStack]
    2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error
    嚴(yán)重: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)
    2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
    警告: Could not find property [org.apache.catalina.jsp_file]

    原因:上傳文件大小超過(guò)預(yù)定大小,可以在struts.properties配置文件中設(shè)置struts.multipart.maxSize=XXX(XXX為文件大小)


    8---配置了文件類(lèi)型限制后,當(dāng)傳錯(cuò)誤類(lèi)型可以攔截不讓用戶(hù)上傳該文件,可是跳轉(zhuǎn)的頁(yè)面卻沒(méi)有跳轉(zhuǎn)到input配置的錯(cuò)誤頁(yè)面,而是返回

    到了success正確頁(yè)面。

    嚴(yán)重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
    《我的打印輸出DEBUG語(yǔ)句內(nèi)容:File:null FlieName:null type:null》即攔截類(lèi)型成功了
    java.lang.NullPointerException
    at java.io.FileInputStream.<init>(FileInputStream.java:103)
    at com.study.web.util.FileUploadUtil.uploadFile(FileUploadUtil.java:36)
    at com.study.web.action.UploadFileAction.execute(UploadFileAction.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)。。。

    2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
    警告: Could not find property [org.apache.catalina.jsp_file]
    2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
    警告: Could not find property [struts]
    2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
    信息: Removing file filedata \tmp\upload__5b01657_11a329d4dcf__8000_00000000.tmp

    原因及解決辦法:在該文件上傳Action中只配置了FileUploadInterceptor后缺少配置了defaultStack攔截器.

    在ACTION中配置玩defaultStack攔截器后改錯(cuò)誤消失。


    9---struts.properties中全局配置文件大小,再使用默認(rèn)FileUploadInterceptor攔截器時(shí)候能實(shí)現(xiàn)攔截的功能但是后臺(tái)出現(xiàn)異常。

    嚴(yán)重: Unable to parse request
    org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (380) exceeds the configured maximum (10)
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)

    原因:未知。將全局配置中的限制大小去掉,再重新在ACTION中覆蓋配置FileUploadInterceptor攔截器設(shè)置大小和文件類(lèi)型限制,可消除異常。


    10---多文件上傳中,其中一個(gè)傳被限制的文件如限制aplication/msword(即.doc)文件,允許傳文本文件。然而當(dāng)夾雜在一起傳的時(shí)候,后臺(tái)能截獲類(lèi)型錯(cuò)誤不可傳信息,但是

    實(shí)際卻還是上傳成功。

    嚴(yán)重: Content-Type not allowed: filedata "upload_4d958287_11a33e76ab9__8000_00000007.tmp" application/msword
    file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000006.tmp fileName:project.txt fileType:text/plain
    file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000007.tmp fileName:application base.doc fileType:application/msword
    file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000008.tmp fileName:zhongqi-bug.txt fileType:text/plain

    原因:忘記了繼承ActionSupport類(lèi)。繼承后異常消失。


    11--文件上傳異常,不能創(chuàng)建File文件

    Cannot create type class java.io.File from value C:\Documents and Settings\admin\桌面\OrderReporterServiceImp.java - [unknown location]

    原因:忘記了在form表單里將enctype設(shè)置成文件上傳格式:enctype="multipart/form-data"

    12--當(dāng)使用限制文件類(lèi)型和大小的時(shí)候拋出空指針異常

    java.lang.NullPointerExceptiondemo.struts2.action.ValidatFileUploadAction.execute(ValidatFileUploadAction.java:71)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)原因:在ACTION中配置了fileUpload攔截器后忘記了配置默認(rèn)攔截器:defautlStack。注意當(dāng)ACTION中配置自己的攔截器后需要顯示配置默認(rèn)

    攔截器defaultStack


    13--在國(guó)際化時(shí)候拋空指針異常:

    16:31:12,812 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException at java.text.MessageFormat.applyPattern(MessageFormat.java:414)

    at java.text.MessageFormat.<init>(MessageFormat.java:350)
    at com.opensymphony.xwork2.DefaultTextProvider.getText(DefaultTextProvider.java:70)

    原因:忘記了在struts.xml中配置國(guó)際化常量,或者在struts.properties中配置全局國(guó)際化常量 struts.custom.i18n.resources=globeMessage


    14-- struts action的配置文件加載失敗:

    Unable to load configuration. - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26

    Caused by: No result type specified for result named 'error', perhaps the parent package does not specify the result type? - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:609)

    原因:忘記了繼承包struts-default


    15-- struts action 配置文件注意事項(xiàng):

    1. 別忘記了繼承struts-default默認(rèn)配置包

    2.如果配置命名空間,一定要以"/"開(kāi)始,例如:namespace="/test"

    3.每個(gè)模塊struts action配置文件中都可以配置全局result,global-result 經(jīng)測(cè)試不會(huì)沖突,STRTUS會(huì)智能尋找該Action請(qǐng)求的

    模塊STRUTS ACTION配置包

    關(guān)鍵字: 警告: no configuration found for the specified action

    警告: No configuration found for the specified action: 'ShowMessage' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

    解決方法:

    經(jīng)過(guò)測(cè)試發(fā)現(xiàn),是沒(méi)有正確使用tag的原因,這種情況下,正確的寫(xiě)法應(yīng)該是,<s:form name="login" method="post" action="login" >

    您是否添加了action這個(gè)呢?

    posted @ 2011-09-02 23:07 ply 閱讀(1501) | 評(píng)論 (0)編輯 收藏

    2011年9月1日

      實(shí)習(xí)過(guò)程中,需要在Linux環(huán)境下配置免安裝版本的Tomcat,下面列出詳細(xì)步驟,希望對(duì)大家有幫助。

    一、下載免安裝版Tomcat

          打開(kāi)Tomcat主頁(yè)http://tomcat.apache.org/,下載Tomcat免安裝版,我這里下載的是apache-tomcat-7.0.2.tar.gz。

    二、配置Java環(huán)境變量

          Java的環(huán)境變量已經(jīng)在前幾篇文章里有了概述,詳細(xì)見(jiàn):http://www.fengwenxuan.com/index.php/red-hat-enterprise-linux/238.html

    三、解壓Tomcat

          將Tomcat解壓縮到/usr/local目錄下

          # tar zxvf apache-tomcat-7.0.2.tar.gz 

    四、啟動(dòng)Tomcat

          # cd /usr/local/apache-tomcat-7.0.2/bin

          # ./startup.sh

          如果啟動(dòng)成功,shell終端會(huì)出現(xiàn)如下提示:

     

          Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.2

          Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.2

          Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.2/temp

          Using JRE_HOME:       /usr/local/jdk1.6.0_21

          如果終端報(bào)錯(cuò),基本上可以肯定是Jdk環(huán)境變量沒(méi)有配置好,仔細(xì)在檢查一下Jdk環(huán)境變量的配置

    五、測(cè)試Tomcat

          打開(kāi)火狐瀏覽器,地址欄輸入http://localhost:8080,回車(chē)后看到Tomcat的LOGO,表示一切正常。也可以更改Tomcat目錄下的conf文件夾,里面有一個(gè)server.xml文件,修改成使用80端口,這樣瀏覽器只要輸入http://localhost/就可以直接進(jìn)入你的主頁(yè)了。

    六、停止Tomcat

          # cd /usr/local/apache-tomcat-7.0.2/bin

          # ./shutdown.sh

    七、設(shè)置開(kāi)機(jī)自動(dòng)啟動(dòng)Tomcat

     

    方法一:

    在/usr/local/apache-tomcat-7.0.2/bin/startup.sh 為:

    JAVA_HOME=/home/fwx/jdk1.6.0_14

    CLASSPATH=.:$JAVA_HOME/lib/tools.jar

    PATH=$JAVA_HOME/bin:$PATH

    export JAVA_HOME CLASSPATH PATH

    export CATALINA_HOME=/usr/local/apache-tomcat-7.0.2
    /usr/local/tomcat/bin/catalina.sh start

     

    在/etc/rc.d/rc.local中加入:
    /usr/local/apache-tomcat-7.0.2/bin/startup.sh


    方法二:
    1、把下面的代碼保存為tomcat文件,并讓它成為可執(zhí)行文件 chmod 755 tomcat.
    #!/bin/bash
    #
    # fengwx0413@163.com
    # /etc/rc.d/init.d/tomcat
    # init script for tomcat precesses
    #
    # processname: tomcat
    # description: tomcat is a j2se server
    # chkconfig: 2345 86 16
    # description: Start up the Tomcat servlet engine.

    if [ -f /etc/init.d/functions ]; then
            . /etc/init.d/functions
    elif [ -f /etc/rc.d/init.d/functions ]; then
            . /etc/rc.d/init.d/functions
    else
            echo -e "/atomcat: unable to locate functions lib. Cannot continue."
            exit -1
    fi

    RETVAL=$?
    CATALINA_HOME="/usr/local/apache-tomcat-7.0.2"

    case "$1" in
    start)
            if [ -f $CATALINA_HOME/bin/startup.sh ];
              then
                echo $"Starting Tomcat"
                $CATALINA_HOME/bin/startup.sh
            fi
            ;;
    stop)
            if [ -f $CATALINA_HOME/bin/shutdown.sh ];
              then
                echo $"Stopping Tomcat"
                $CATALINA_HOME/bin/shutdown.sh
            fi
            ;;
    *)
            echo $"Usage: $0 {start|stop}"
            exit 1
            ;;
    esac

    exit $RETVAL

    2、將tomcat文件拷貝到/etc/init.d/下,并運(yùn)行:chkconfig --add tomcat

    3、在apache-tomcat-7.0.2/bin/catalina.sh文件中加入以下語(yǔ)句:
    export JAVA_HOME=/home/fwx/jdk1.6.0_14
    export CATALINA_HOME=/usr/local/apache-tomcat-7.0.2

    export CATALINA_BASE=/usr/local/apache-tomcat-7.0.2
    export CATALINA_TMPDIR=/usr/local/apache-tomcat-7.0.2/temp

    啟動(dòng)tomcat: service tomcat start
    停止tomcat: service tomcat stop 

    posted @ 2011-09-01 23:06 ply 閱讀(11368) | 評(píng)論 (0)編輯 收藏

    2011年8月22日

    關(guān)于getInitParameter()的調(diào)用
    關(guān)于getInitParameter()的調(diào)用        
    getInitParameter()方法是在GenericServlet接口中新定義的一個(gè)方法,用來(lái)調(diào)用初始化在web.xml中存放的參量。
    在web.xml配置文件中一個(gè)servlet中參量的初始化是使用

    <init-param>

    <param-name>name</param-name>

    <param-value>zhangsan</param-value>

    </init-param>

    來(lái)實(shí)現(xiàn)的。這里的參量只對(duì)這個(gè)servlet可用。

     

    如果通過(guò)在web.xml中的ServletContext上下文中定義參量,那么整個(gè)web應(yīng)用程序中的servlet都可調(diào)用,web.xml中的格式為:

    <context-param>

    <param-name>test</param-name>

    <param-value>Is it me</param-value>

    < context -param>

     

     

    調(diào)用<init-param>中的參量:

    一般我們寫(xiě)servlet都是用HttpServlet類(lèi)來(lái)寫(xiě),它是實(shí)現(xiàn)了GenericServlet接口,所以它就有g(shù)etInitParameter()方法。調(diào)用格式為:

    String name = getInitParameter(“name”); 或

    String name = getServletConfig().getInitParameter(“name”);

     

    調(diào)用<context-param>中的參量:

    調(diào)用格式為:

    String name =getServletContext(). getInitParameter(“name”); 或

    String name = getServletConfig().getServletConfig().getInitParameter(“name”);

     

    注意:<context-param>中定義的參數(shù)在Jsp中也能調(diào)用


    posted @ 2011-08-22 01:44 ply 閱讀(2859) | 評(píng)論 (1)編輯 收藏

    主站蜘蛛池模板: 久久精品电影免费动漫| a级毛片在线免费| 日韩大片免费观看视频播放| 日日躁狠狠躁狠狠爱免费视频| 国产va免费精品| 久久aⅴ免费观看| 成人免费无码视频在线网站| 国产片免费在线观看| 亚洲中文字幕无码爆乳av中文 | 日韩高清免费观看| 亚洲精品岛国片在线观看| 久久精品国产亚洲AV麻豆~| 亚洲国产一区在线观看| 亚洲AV成人一区二区三区观看| 九一在线完整视频免费观看| 亚洲免费视频网站| 好吊妞在线成人免费| 中文字幕第13亚洲另类| 亚洲狠狠狠一区二区三区| 亚洲日韩在线中文字幕综合| 波霸在线精品视频免费观看| 1000部拍拍拍18勿入免费凤凰福利| 在线jyzzjyzz免费视频| 亚洲精品无码久久久久sm| 久久夜色精品国产噜噜亚洲a| 四虎精品成人免费视频| 最近免费字幕中文大全视频 | 无码av免费毛片一区二区| 免费va在线观看| 亚洲美女视频一区| 成人a毛片视频免费看| 1000部拍拍拍18免费网站| 亚洲一级片内射网站在线观看| 久久久久久亚洲精品成人| 美女视频黄a视频全免费网站色| 免费在线观看一级片| 在线观看91精品国产不卡免费| 久久亚洲伊人中字综合精品| 相泽南亚洲一区二区在线播放| 免费国产黄网站在线观看视频| 免费真实播放国产乱子伦|