ply

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

          2012年3月16日

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

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


          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)的錯,后來就想下json源代碼下來看,發(fā)現(xiàn)大費(fèi)周章都沒搞到j(luò)son源碼,還是老辦法反編譯瞅瞅,發(fā)現(xiàn)JSONArray根據(jù)判斷取得的不同類型調(diào)用相應(yīng)的方法,

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

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

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


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


          public interface PropertyFilter
          {


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


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


          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)生的實體bean中的contactGroups和contactGroupPersons過濾掉就OK了!

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

           

           1List<ShoppingCart> listCarts = sCartServiceImpl
           2                        .ShoppingCartTable(shoppingCart);
           3                // 先過濾對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ò)的資料!解決問題了!

          posted @ 2012-03-16 18:38 ply 閱讀(20659) | 評論 (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)前類的繼承結(jié)構(gòu)
          Ctrl+W  關(guān)閉當(dāng)前Editer
          Ctrl+K  快速定位到下一個
          Ctrl+E
          快速顯示當(dāng)前Editer的下拉列表
          Ctrl+J 
          正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,)   

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

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

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

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

          Alt+←  前一個編輯的頁面
          Alt+→  下一個編輯的頁面(當(dāng)然是針對上面那條來說了)
          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)(比較實用,有N個函數(shù)調(diào)用了這個方法,修改一次搞定)

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

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


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

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

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



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

          2011年12月2日

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

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

          2011年12月1日

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

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

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

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

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


          因為子類中有一個隱藏的引用super會指向父類實例,所以在實例化子類之前會先實例化一個父類,也就是說會先執(zhí)行父類的構(gòu)造函數(shù).

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


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


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


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


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

           


          示例:

          class Father{

          void print(){};

          }


          class Son extends Father{

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

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

          }


          class Demo{

          public static void main(String args[]){

          Father obj=new Son();

          obj.print();

          obj.show();  //這個調(diào)用會報錯!

          }

          }


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

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

          2. 沒有方法覆蓋,那你這里只能解釋為父類引用去訪問一個子類的方法,當(dāng)然,父類引用沒有這么大范圍的權(quán)限,當(dāng)然會報錯

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

          若一個父類引用調(diào)用了沒有覆蓋的子類方法,那么是不符合該表的,那么編譯時刻就會報錯.

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

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

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

          同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調(diào)用;

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

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

          看下面這段程序:

          class Father{

              public void func1(){

                  func2();

              }


              //這是父類中的func2()方法,因為下面的子類中重寫了該方法

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

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

              public void func2(){

                  System.out.println("AAA");

              }

          }

           

          class Child extends Father{

              //func1(int i)是對func1()方法的一個重載

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

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

              public void func1(int i){

                  System.out.println("BBB");

              }


              //func2()重寫了父類Father中的func2()方法

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

              public void func2(){

                  System.out.println("CCC");

              }

          }


          public class PolymorphismTest {

              public static void main(String[] args) {

                  Father child = new Child();

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

              }

          }


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


              那么該程序?qū)蛴〕鍪裁礃拥慕Y(jié)果呢?

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







          變量是不存在重寫覆蓋的!

          public class A { int a = 1; }

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


          測試類里調(diào)用了這個方法void compare(){

          if(super.a == this.a)

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

          else

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

          控制臺出來的是overrided

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

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

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

          2011年9月15日

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

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

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

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

          局部類型轉(zhuǎn)換

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

           1 public class PointConverter extends DefaultTypeConverter{

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

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

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

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

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

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

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

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

          point = 轉(zhuǎn)換類名

           內(nèi)容說明:

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

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

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

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

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

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

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

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

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

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

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

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

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

          posted @ 2011-09-15 14:39 ply 閱讀(484) | 評論 (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 閱讀(246) | 評論 (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

          驗證Tomcat是否安裝成功:

          1)啟動Tomcat;

          2)在Ie瀏覽器中敲入http://localhost:8080/,出來Tomcat首頁,說明Tomcat安裝成功;

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

          如果不報錯,說明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)境變量,在我的電腦->屬性->高級->環(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;(.;一定不能少,因為它代表當(dāng)前路徑)
          path=%JAVA_HOME%\bin 接著可以寫一個簡單的java程序來測試JDK是否已安裝成功:
          public class Test{
          public static void main(String args[]){
          System.out.println("This is a test program.");
          }
          }


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

          2.安裝Tomcat后,在我的電腦->屬性->高級->環(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中可能沒有common這個文件夾了。所以servlet-api.jar應(yīng)該的路徑為
          %CATALINA_HOME%\lib\servlet-api.jar;請根據(jù)自己的情況自己修改!】
          接著可以啟動tomcat,在IE中訪問http://localhost:8080,如果看到tomcat的歡迎頁面的話說明安裝成功了。
          第三步:建立自己的jsp app目錄
          1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類Tomcat自帶的的目錄;
          2.在webapps目錄下新建一個目錄,起名叫myapp;
          3.myapp下新建一個目錄WEB-INF,注意,目錄名稱是區(qū)分大小寫的;
          4.WEB-INF下新建一個文件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下新建一個測試的jsp頁面,文件名為index.jsp,文件內(nèi)容如下:

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


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

          答案補(bǔ)充

          第四步:建立自己的Servlet:寫入你的第一個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來編譯這個文件,如果出現(xiàn)無法import javax.servl
          et.*
             那么就是應(yīng)該把C:\Tomcat\common\lib里面的servlet-api.jar文件拷貝到C:\JDK\jre\lib\ext中,再次編譯,就沒有問題了!

          posted @ 2011-09-03 13:31 ply 閱讀(323) | 評論 (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"

          原因版本問題:缺少struts-dojo-plugin JAR包,以及HTML的,<HEAD></HEAD>中沒有使用<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---文件上傳過程中取不到文件名和文件類型,即都取到NULL

          原因:如果頁面中file的name=“a”則我們ACTION中設(shè)置String aContentType,String aFileName;(此兩個其實無所謂,關(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]

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


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

          到了success正確頁面。

          嚴(yán)重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
          《我的打印輸出DEBUG語句內(nèi)容:File:null FlieName:null type:null》即攔截類型成功了
          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攔截器后改錯誤消失。


          9---struts.properties中全局配置文件大小,再使用默認(rèn)FileUploadInterceptor攔截器時候能實現(xiàn)攔截的功能但是后臺出現(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è)置大小和文件類型限制,可消除異常。


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

          實際卻還是上傳成功。

          嚴(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類。繼承后異常消失。


          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)使用限制文件類型和大小的時候拋出空指針異常

          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--在國際化時候拋空指針異常:

          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中配置國際化常量,或者在struts.properties中配置全局國際化常量 struts.custom.i18n.resources=globeMessage


          14-- struts action的配置文件加載失?。?/p>

          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 配置文件注意事項:

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

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

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

          模塊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)過測試發(fā)現(xiàn),是沒有正確使用tag的原因,這種情況下,正確的寫法應(yīng)該是,<s:form name="login" method="post" action="login" >

          您是否添加了action這個呢?

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

          2011年9月1日

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

          一、下載免安裝版Tomcat

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

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

                Java的環(huán)境變量已經(jīng)在前幾篇文章里有了概述,詳細(xì)見: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 

          四、啟動Tomcat

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

                # ./startup.sh

                如果啟動成功,shell終端會出現(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

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

          五、測試Tomcat

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

          六、停止Tomcat

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

                # ./shutdown.sh

          七、設(shè)置開機(jī)自動啟動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文件中加入以下語句:
          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

          啟動tomcat: service tomcat start
          停止tomcat: service tomcat stop 

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

          2011年8月22日

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

          <init-param>

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

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

          </init-param>

          來實現(xiàn)的。這里的參量只對這個servlet可用。

           

          如果通過在web.xml中的ServletContext上下文中定義參量,那么整個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>中的參量:

          一般我們寫servlet都是用HttpServlet類來寫,它是實現(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 閱讀(2864) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 淅川县| 璧山县| 阳山县| 嘉义县| 柯坪县| 舒城县| 夏河县| 沛县| 浦北县| 山东省| SHOW| 卫辉市| 炉霍县| 鲜城| 黎城县| 邳州市| 平原县| 邛崃市| 黎平县| 余庆县| 菏泽市| 莱阳市| 金门县| 北宁市| 博爱县| 通城县| 南阳市| 清原| 安阳市| 桃源县| 富锦市| 大田县| 杨浦区| 靖江市| 克拉玛依市| 磐安县| 区。| 渭源县| 巴彦县| 建水县| 宣武区|