<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2012年3月16日

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

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


    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
    >


    仔細查了一下發現是hibernate主外鍵關聯的錯,后來就想下json源代碼下來看,發現大費周章都沒搞到json源碼,還是老辦法反編譯瞅瞅,發現JSONArray根據判斷取得的不同類型調用相應的方法,

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

    而我從hibernate那得到的是list,所以去調用了_fromCollection方法,而里面的方法發現一個問題:該方法會不斷的拆開實體屬性,直到沒有為止,而我的ContactGroup里有兩個屬性用于自身關聯

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


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


    public interface PropertyFilter
    {


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


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


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

    然后調用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                // 將數據轉換成Json數據
    16                JSONArray jsonObject = JSONArray.fromObject(listCarts, config);
    17                System.out.println(jsonObject.toString());
    18

    搞了一下午,參考網絡的資料!解決問題了!

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

    2011年12月26日

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

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

    Ctrl+Z 返回到修改前的狀態
    Ctrl+Y 與上面的操作相反
    Ctrl+/  注釋當前行,再按則取消注釋

    Ctrl+D刪除當前行。
    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
    顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)
    Ctrl+Shift+/ 自動注釋代碼

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

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

    Alt+←  前一個編輯的頁面
    Alt+→  下一個編輯的頁面(當然是針對上面那條來說了)
    Alt+Enter
    顯示當前選擇資源(工程,or 文件 or文件)的屬性


    MyEclipse 快捷鍵4(ALT+CTRL)


    Alt+CTRL+↓ 復制當前行到下一行(復制增加)
    Alt+CTRL+↑
    復制當前行到上一行(復制增加)
    -------------------------------------------
    MyEclipse
    快捷鍵5(ALT+SHIFT)
    -------------------------------------------
    Alt+Shift+R
    重命名
    Alt+Shift+M 抽取方法
    Alt+Shift+C 修改函數結構(比較實用,有N個函數調用了這個方法,修改一次搞定)

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

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


    --------------------------------------------
    MyEclipse 快捷鍵(6)
    --------------------------------------------
    F2當鼠標放在一個標記處出現Tooltip時候按F2則把鼠標移開時Tooltip還會顯示即Show
    Tooltip Description。
    F3跳到聲明或定義的地方。
    F5單步調試進入函數內部。

    F6單步調試不進入函數內部,如果裝了金山詞霸2006則要把“取詞開關”的快捷鍵改成其他的。
    F7由函數內部返回到調用處。

    F8一直執行到下一個斷點。



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

    2011年12月2日

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

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

    2011年12月1日

    從對象的內存角度來理解試試.

    假設現在有一個父類Father,它里面的變量需要占用1M內存.有一個它的子類Son,它里面的變量需要占用0.5M內存.

    現在通過代碼來看看內存的分配情況:

    Father f = new Father();//系統將分配1M內存.

    Son s = new Son();//系統將分配1.5M內存.


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

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


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


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


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


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

     


    示例:

    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();  //這個調用會報錯!

    }

    }


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

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

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

    PS:多態實際上是一種機制,在編譯時刻,會生成一張虛擬表,來記錄所有覆蓋的方法,沒有被覆蓋的方法是不會記錄到這張表的.

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

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

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

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

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

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

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

    看下面這段程序:

    class Father{

        public void func1(){

            func2();

        }


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

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

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

        public void func2(){

            System.out.println("AAA");

        }

    }

     

    class Child extends Father{

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

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

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

        public void func1(int i){

            System.out.println("BBB");

        }


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

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

        public void func2(){

            System.out.println("CCC");

        }

    }


    public class PolymorphismTest {

        public static void main(String[] args) {

            Father child = new Child();

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

        }

    }


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


        那么該程序將會打印出什么樣的結果呢?

        很顯然,應該是“CCC”。







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

    public class A { int a = 1; }

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


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

    if(super.a == this.a)

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

    else

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

    控制臺出來的是overrided

     類中的屬性是沒有多態性的,即你在引用上面使用屬性時,系統只會去找引用的靜態類型中的那個屬性,而與它的實際類型無關。

    靜態方法也是沒有多態性的。

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

    2011年9月15日

    web應用類型的轉換分為兩種情況:

    1.從客房端的字符串到自定義類型的轉換。

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

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

    局部類型轉換

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

     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轉換成類的代碼處理
     6             return point;
     7          }
     8          if(String.class==toType){//說明由類轉換成String
     9              Point point = (Point)value;//將類轉成String的代碼處理
    10              return String型的一個變量;
    11          }
    12          return null;
    13     }
    14 }

    方法對數說明:1、Map context  ——應用上正文

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

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

                        4、Point是一個類,即是我們的自定義類。不是系統內置的類型

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

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

     文件中的內容如下:

    point = 轉換類名

     內容說明:

    1、point是Action中的一個屬性,轉換類指明所使用哪個轉換類對此屬性進行轉換

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

    類型轉換的流程

     1、用戶進行請求,根據請求名在struts.xml中尋找Action

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

     3、從文件中找到要轉換的屬性及其轉換類。

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

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

     6、執行完execute()方法,根據struts.xml的配置轉向頁面

     7、在jsp中顯示內容時,根據頁面中的屬性名去調用相應的get方法,以便輸出

     8、在調用get方法之前,會檢查有沒有此屬性的自定義類型轉換。如果有,再次跳轉到轉換類當中。

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

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

    posted @ 2011-09-15 14:39 ply 閱讀(479) | 評論 (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 閱讀(237) | 評論 (0)編輯 收藏

    2011年9月3日

    tomcat官網

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

    免安裝版

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

    1)在環境變量Path前面添加

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

    2)添加環境變量JAVA_HOME

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

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

    1)添加環境變量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)添加環境變量TOMCAT_HOME

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

    3)添加環境變量CATALINA_HOME

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

    4)添加環境變量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:執行jdk和tomcat的安裝程序,然后設置按照路徑進行安裝即可。
    1.安裝jdk以后,需要配置一下環境變量,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的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;(.;一定不能少,因為它代表當前路徑)
    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.的話說明安裝成功了,如果沒有打印出這句話,你需要仔細檢查一下你的配置情況。

    2.安裝Tomcat后,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的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
    然后修改環境變量中的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應該的路徑為
    %CATALINA_HOME%\lib\servlet-api.jar;請根據自己的情況自己修改!】
    接著可以啟動tomcat,在IE中訪問http://localhost:8080,如果看到tomcat的歡迎頁面的話說明安裝成功了。
    第三步:建立自己的jsp app目錄
    1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類Tomcat自帶的的目錄;
    2.在webapps目錄下新建一個目錄,起名叫myapp;
    3.myapp下新建一個目錄WEB-INF,注意,目錄名稱是區分大小寫的;
    4.WEB-INF下新建一個文件web.xml,內容如下:
    <?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,文件內容如下:

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


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

    答案補充

    第四步:建立自己的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");

    答案補充

    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來編譯這個文件,如果出現無法import javax.servl
    et.*
       那么就是應該把C:\Tomcat\common\lib里面的servlet-api.jar文件拷貝到C:\JDK\jre\lib\ext中,再次編譯,就沒有問題了!

    posted @ 2011-09-03 13:31 ply 閱讀(317) | 評論 (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/>標簽

    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表達式

    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中設置String aContentType,String aFileName;(此兩個其實無所謂,關鍵是SET方法)

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

    必須和它相同,固定格式


    7---嚴重: 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
    嚴重: 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]

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


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

    到了success正確頁面。

    嚴重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain
    《我的打印輸出DEBUG語句內容: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中全局配置文件大小,再使用默認FileUploadInterceptor攔截器時候能實現攔截的功能但是后臺出現異常。

    嚴重: 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攔截器設置大小和文件類型限制,可消除異常。


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

    實際卻還是上傳成功。

    嚴重: 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--文件上傳異常,不能創建File文件

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

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

    12--當使用限制文件類型和大小的時候拋出空指針異常

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

    攔截器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的配置文件加載失敗:

    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默認配置包

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

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

    模塊STRUTS ACTION配置包

    關鍵字: 警告: 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.

    解決方法:

    經過測試發現,是沒有正確使用tag的原因,這種情況下,正確的寫法應該是,<s:form name="login" method="post" action="login" >

    您是否添加了action這個呢?

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

    2011年9月1日

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

    一、下載免安裝版Tomcat

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

    二、配置Java環境變量

          Java的環境變量已經在前幾篇文章里有了概述,詳細見: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終端會出現如下提示:

     

          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環境變量沒有配置好,仔細在檢查一下Jdk環境變量的配置

    五、測試Tomcat

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

    六、停止Tomcat

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

          # ./shutdown.sh

    七、設置開機自動啟動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文件,并讓它成為可執行文件 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/下,并運行: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 閱讀(11367) | 評論 (0)編輯 收藏

    2011年8月22日

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

    <init-param>

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

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

    </init-param>

    來實現的。這里的參量只對這個servlet可用。

     

    如果通過在web.xml中的ServletContext上下文中定義參量,那么整個web應用程序中的servlet都可調用,web.xml中的格式為:

    <context-param>

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

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

    < context -param>

     

     

    調用<init-param>中的參量:

    一般我們寫servlet都是用HttpServlet類來寫,它是實現了GenericServlet接口,所以它就有getInitParameter()方法。調用格式為:

    String name = getInitParameter(“name”); 或

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

     

    調用<context-param>中的參量:

    調用格式為:

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

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

     

    注意:<context-param>中定義的參數在Jsp中也能調用


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

    主站蜘蛛池模板: 色拍自拍亚洲综合图区| 国产青草视频在线观看免费影院| 可以免费观看的国产视频| 在线看片免费人成视频福利| 亚洲人成免费电影| 免费高清小黄站在线观看| 亚洲精品456播放| 久久亚洲成a人片| 亚洲精品av无码喷奶水糖心| 亚洲毛片无码专区亚洲乱| 亚洲欧洲国产经精品香蕉网| 久久久久亚洲精品无码网址色欲 | 日日摸日日碰夜夜爽亚洲| 一二三四在线观看免费中文在线观看| a在线免费观看视频| 久久精品国产99精品国产亚洲性色 | 亚洲人成网站18禁止一区| 黄色免费在线网址| 毛片在线播放免费观看| 久久精品亚洲中文字幕无码麻豆| 美女内射无套日韩免费播放 | 亚洲综合AV在线在线播放| 亚洲色精品三区二区一区| 免费无码黄网站在线看| 亚洲激情中文字幕| 久久福利青草精品资源站免费| 91在线亚洲精品专区| 午夜网站在线观看免费完整高清观看 | 亚洲国产中文字幕在线观看| 国产免费A∨在线播放| 国产性生交xxxxx免费| 高h视频在线免费观看| 亚洲VA中文字幕不卡无码| 最近中文字幕无免费视频| 亚洲日韩乱码久久久久久| 免费看的黄色大片| 久久国产乱子精品免费女 | 人妻巨大乳hd免费看| 久久水蜜桃亚洲av无码精品麻豆| 卡1卡2卡3卡4卡5免费视频| 亚洲xxxx视频|