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

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

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

    隨筆-23  評(píng)論-0  文章-5  trackbacks-0
      2010年11月16日

    關(guān)于HTTP請(qǐng)求超時(shí)字段定義

    一、ConnectionRequestTimeout 超時(shí)
    HttpClient 使用連接池來管理連接,這個(gè)時(shí)間是從連接池獲取連接的超時(shí)時(shí)間,可以聯(lián)想從數(shù)據(jù)庫連接池獲取數(shù)據(jù)庫連接。

    二、ConnectTimeout 超時(shí)
    建立連接超時(shí),客戶端和服務(wù)器間建立連接進(jìn)行的三次握手完成的時(shí)間

    三、SocketTimeout 超時(shí)
    數(shù)據(jù)傳輸過程中數(shù)據(jù)包之間間隔的最大時(shí)間,Http響應(yīng)報(bào)文可能有多個(gè)小報(bào)文組成,
    如果傳輸報(bào)文的間隔時(shí)間超過設(shè)置這個(gè)時(shí)間,會(huì)報(bào) java.net.SocketTimeoutException: Read timed out 異常的
    posted @ 2018-04-20 14:36 ForMeBlog 閱讀(362) | 評(píng)論 (0)編輯 收藏
    提示:編寫Eclipse常用快捷鍵寫成文檔,主要是為了自己熟悉一下這些快捷鍵,方便以后查找和編程中使用!
    一、編輯類快捷鍵
    1、Ctrl + 1 快速修復(fù),可以解決很多問題,例如import類、try catch包圍等。
    2、Ctrl + Shift + F 格式化當(dāng)前代碼。
    3、Ctrl + Shift + M 添加類的import引入。
    4、Ctrl + Shift + M 組織類的import引入,既有Ctrl + Shift + M 的作用,又可以幫你去除沒有用的引入。
    5、Ctrl + Y 重做與Ctrl + Z 相反的作用。
    6、Alt + / 內(nèi)容輔助
    7、Ctrl + D 刪除當(dāng)前行或者選中的多行
    8、Alt + Down 當(dāng)前行和下面一行交換位置
    9、Alt + Up 當(dāng)前行和上面一行交換位置
    10、Shift + Enter 在當(dāng)前行的下一行插入空行
    11、Ctrl + / 注釋當(dāng)前行,再次按則取消注釋
    二、選擇快捷鍵
    1、Alt + Shift + Up 選擇封裝元素
    2、Alt + Shift + Left 選擇上一個(gè)元素
    3、Alt + Shift + Right選擇下一個(gè)元素
    4、Shift + Left 從光標(biāo)處開始往左選擇字符串
    5、Shift + Right 從光標(biāo)處開始往右選擇字符串
    6、Ctrl + Shift + Left 選中光標(biāo)左邊的單詞
    7、Ctrl + Shift + Right 選中光標(biāo)右邊的單詞
     
    三、移動(dòng)快捷鍵
    1、Ctrl + Left 光標(biāo)移到左邊單詞的開頭,
    2、Ctrl + Right 光標(biāo)移到右邊單詞的末尾。
     
    四、搜索快捷鍵
    1、Ctrl + K 參照選中的文字快速定位到下一個(gè),如果沒有選中文字則搜索上一次使用搜索的文字。
    2、Ctrl + Shift + K 參照選中的文字快速定位到上一個(gè)。
    3、Ctrl + J 正向增量查找,按下這個(gè)快捷鍵后,你所輸入的每個(gè)字母編輯器都提供快速匹配到某個(gè)單詞,如果沒有在狀態(tài)欄中顯示沒有找到,退出這個(gè)模式按ESC鍵。
    4、Ctrl + Shift + J 反向增量查找
    5、Ctrl + Shift + U 列出所有包含字符串的行
    6、Ctrl + G 工作區(qū)中的聲明
    7、Ctrl + Shift + G 工作區(qū)中的引用
     
    五、導(dǎo)航快捷鍵
    1、Ctrl + Shift + T 搜索類
    2、Ctrl + Shift + R 搜索工程中的文件
    3、Ctrl + E 快速顯示當(dāng)前編輯區(qū)的下拉列表
    4、F4 打開類型層次結(jié)構(gòu)
    5、F3 跳轉(zhuǎn)到聲明處
    6、Alt + Left 前一個(gè)編輯頁面
    7、Alt + Right 下一個(gè)編輯頁面
    8、Ctrl + PageUp/PageDown在編輯器中,切換已經(jīng)打開的文件
     
    六、調(diào)試快捷鍵
    1、F5 單步跳入
    2、F6 單步跳過
    3、F7 單步還回
    4、F8 繼續(xù)
    5、Ctrl + Shift + D 顯示變量的值
    6、Ctrl + shift + B 在當(dāng)前行設(shè)置或者去掉斷點(diǎn)
    7、Ctrl + R 運(yùn)行至行,比較好用可以省好多的斷點(diǎn)
     
    七、重構(gòu)快捷鍵
    1、Alt + Shift + R 重命名類名、方法名、屬性(變量)名。
    2、Alt + Shift + M 把一段函數(shù)內(nèi)的代碼抽取成方法,這是重構(gòu)里面最常用的方法之一,特別是對(duì)于一大坨代碼很有用。
    3、Alt + Shift + C 修改函數(shù)結(jié)構(gòu),比較實(shí)用有N個(gè)函數(shù)調(diào)用了這個(gè)方法修改一次就行了。
    4、Alt + Shift + L 抽取本地變量,可以直接把一些魔法數(shù)字和字符串抽取成一個(gè)變量,尤其是多出調(diào)用的時(shí)候。
    5、Alt + Shift + F 把Class中的局部變量變?yōu)槿肿兞?/div>
    6、Alt + Shift + I 合并變量,將創(chuàng)建簡(jiǎn)化
    7、Alt + Shift + Z 撤銷重構(gòu)
     
    八、其他快捷鍵
    1、Alt + Enter 顯示當(dāng)前選擇資源的屬性,在windows下查看文件的屬性就是這個(gè)快捷鍵,通常可以用來查看文件在windows中的實(shí)際路徑。
    2、Ctrl + Up文本編輯器向上滾行
    3、Ctrl + Down 文本編輯器向下滾行
    4、Ctrl + M 最大化當(dāng)前的Edit或者View,再按則縮小
    5、Ctrl + O 快速顯示Outline
    6、Ctrl + T 快速顯示當(dāng)前類的繼承結(jié)構(gòu),選中接口方法按下這快捷可以跳轉(zhuǎn)到實(shí)現(xiàn)類,在項(xiàng)目DAO中經(jīng)常用。
    7、Ctrl + W 關(guān)閉當(dāng)前Editer
    8、Ctrl + L 文本編輯器轉(zhuǎn)至行
    9、F2 顯示工具提示描述,選擇類或者變量按下該鍵會(huì)有提示出來
    posted @ 2015-11-20 16:36 ForMeBlog 閱讀(450) | 評(píng)論 (0)編輯 收藏

    今天遇到調(diào)用encodeURL調(diào)用二次的疑問,雖然之前知道要調(diào)用二次,但是具體不是太清楚里面具體的運(yùn)行過程,這是轉(zhuǎn)載的這個(gè)寫的比較詳細(xì),把整個(gè)運(yùn)行過程詳細(xì)解讀了一下,非常不錯(cuò)所以轉(zhuǎn)載過了供其他人分享。
    .encodeURL函數(shù)主要是來對(duì)URI來做轉(zhuǎn)碼,它默認(rèn)是采用的UTF-8的編碼.

    . UTF-8編碼的格式:一個(gè)漢字來三個(gè)字節(jié)構(gòu)成,每一個(gè)字節(jié)會(huì)轉(zhuǎn)換成16進(jìn)制的編碼,同時(shí)添加上%號(hào).

    假設(shè)頁面端輸入的中文是一個(gè)“中”,按照下面步驟進(jìn)行解碼

    1.第一次encodeURI,按照utf-8方式獲取字節(jié)數(shù)組變成[-28,-72-83],對(duì)字節(jié)碼數(shù)組進(jìn)行遍歷,把每個(gè)字節(jié)轉(zhuǎn)化成對(duì)應(yīng)的16進(jìn)制數(shù),這樣就變成了[E4,B8,AD],最后變成[%E4,%B8,%AD]  此時(shí)已經(jīng)沒有了多字節(jié)字符,全部是單字節(jié)字符。

    2、第二次encodeURI,進(jìn)行編碼,會(huì)把%看成一個(gè)轉(zhuǎn)義字符,并不編碼%以后字符,會(huì)把%編碼成%25.把數(shù)組最后變成[%25E4,%25B8,%25AD]然后就把處理后的數(shù)據(jù)[%25E4,%25B8,%25AD]發(fā)往服務(wù)器端,
    當(dāng)應(yīng)用服務(wù)器調(diào)用getParameter方法,getParameter方法會(huì)去向應(yīng)用服務(wù)器請(qǐng)求參數(shù)
    應(yīng)用服務(wù)器最初獲得的就是發(fā)送來的
    [%25E4,%25B8,%25AD],應(yīng)用服務(wù)器會(huì)對(duì)這個(gè)數(shù)據(jù)進(jìn)行URLdecode操作,應(yīng)用服務(wù)器進(jìn)行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[%E4,%B8,%AD],因?yàn)槎紩?huì)把%25解析成%.并把這個(gè)值返回給getParameter方法

    3\、再用UTF-8解碼一次,就得到"中"了。

    想想看,如果不編碼兩次,當(dāng)服務(wù)器自動(dòng)解碼的時(shí)候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會(huì)出現(xiàn)亂碼。

    JS:

    1. document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;  


    JAVA后臺(tái):
       

    1. roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");  
    posted @ 2015-08-18 11:20 ForMeBlog 閱讀(422) | 評(píng)論 (0)編輯 收藏

     

    、概念

     

     

       AnnontationJava5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機(jī)制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類、方法、成員變量等)進(jìn)行關(guān)聯(lián)。

     

      更通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業(yè)務(wù)邏輯無關(guān),并且是供指定的工具或框架使用的。

     

    Annontation像一種修飾符一樣,應(yīng)用于包、類型、構(gòu)造方法、方法、成員變量、參數(shù)及本地變量的聲明語句中。

     

    、原理

     

      Annotation其實(shí)是一種接口。通過Java的反射機(jī)制相關(guān)的API來訪問annotation信息。相關(guān)類(框架或工具中的類)根據(jù)這些信息來決定如何使用該程序元素或改變它們的行為。

     

      annotation是不會(huì)影響程序代碼的執(zhí)行,無論annotation怎么變化,代碼都始終如一地執(zhí)行。

     

      Java語言解釋器在工作時(shí)會(huì)忽略這些annotation,因此在JVM 中這些annotation是“不起作用”的,只能通過配套的工具才能對(duì)這些annontaion類型的信息進(jìn)行訪問和處理。

     

      Annotationinterface的異同

     

        1)、Annotation類型使用關(guān)鍵字@interface而不是interface

     

      這個(gè)關(guān)鍵字聲明隱含了一個(gè)信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個(gè)interface

     

        2)、Annotation類型、方法定義是獨(dú)特的、受限制的。

     

      Annotation 類型的方法必須聲明為無參數(shù)、無異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型。而方法返回值類型必須為primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一作為元素的一維數(shù)組。方法的后面可以使用 default和一個(gè)默認(rèn)數(shù)值來聲明成員的默認(rèn)值,null不能作為成員默認(rèn)值,這與我們?cè)诜?span style="font-family: DejaVu Serif, serif" face="DejaVu Serif, serif">annotation類型中定義方法有很大不同。

     

      Annotation類型和它的方法不能使用annotation類型的參數(shù)、成員不能是generic。只有返回值類型是Class的方法可以在annotation類型中使用generic,因?yàn)榇朔椒軌蛴妙愞D(zhuǎn)換將各種類型轉(zhuǎn)換為Class

     

        3)、Annotation類型又與接口有著近似之處。

     

      它們可以定義常量、靜態(tài)成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實(shí)現(xiàn)或者繼承。

     

     

    、應(yīng)用場(chǎng)合

     

      annotation一般作為一種輔助途徑,應(yīng)用在軟件框架或工具中,在這些工具類中根據(jù)不同的 annontation注解信息采取不同的處理過程或改變相應(yīng)程序元素(類、方法及成員變量等)的行為。

     

      例如:JunitStrutsSpring等流行工具框架中均廣泛使用了annontion。使代碼的靈活性大提高。

     

     

     四、常見標(biāo)準(zhǔn)的Annotation

     

      從java5版本開始,自帶了三種標(biāo)準(zhǔn)annontation類型,

     

        (1)、Override

     

      java.lang.Override 是一個(gè)marker annotation類型,它被用作標(biāo)注方法。它說明了被標(biāo)注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個(gè)沒有覆蓋父類方法的方法時(shí),java編譯器將以一個(gè)編譯錯(cuò)誤來警示。

     

      這個(gè)annotaton常常在我們?cè)噲D覆蓋父類方法而確又寫錯(cuò)了方法名時(shí)加一個(gè)保障性的校驗(yàn)過程。

     

        (2)、Deprecated

     

      Deprecated也是一種marker annotation。當(dāng)一個(gè)類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵(lì)使用這個(gè)被標(biāo)注的程序元素。所以使用這種修飾具有一定的 “延續(xù)性”:如果我們?cè)诖a中通過繼承或者覆蓋的方式使用了這個(gè)過時(shí)的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為 @Deprecated,但編譯器仍然要報(bào)警。

     

      注意:@Deprecated這個(gè)annotation類型和javadoc中的 @deprecated這個(gè)tag是有區(qū)別的:前者是java編譯器識(shí)別的,而后者是被javadoc工具所識(shí)別用來生成文檔(包含程序成員為什么已經(jīng)過時(shí)、它應(yīng)當(dāng)如何被禁止或者替代的描述)。

     

        (3)、SuppressWarnings

     

      此注解能告訴Java編譯器關(guān)閉對(duì)類、方法及成員變量的警告。

     

      有時(shí)編譯時(shí)會(huì)提出一些警告,對(duì)于這些警告有的隱藏著Bug,有的是無法避免的,對(duì)于某些不想看到的警告信息,可以通過這個(gè)注解來屏蔽。

     

      SuppressWarning不是一個(gè)marker annotation。它有一個(gè)類型為String[]的成員,這個(gè)成員的值為被禁止的警告名。對(duì)于javac編譯器來講,被-Xlint選項(xiàng)有效的警告名也同樣對(duì)@SuppressWarings有效,同時(shí)編譯器忽略掉無法識(shí)別的警告名。

     

      annotation語法允許在annotation名后跟括號(hào),括號(hào)中是使用逗號(hào)分割的name=value對(duì)用于為annotation的成員賦值:

     

    代碼:

     

    @SuppressWarnings(value={"unchecked","fallthrough"})

    public void lintTrap() { /* sloppy method body omitted */ }

     

     

     

    在這個(gè)例子中SuppressWarnings annotation類型只定義了一個(gè)單一的成員,所以只有一個(gè)簡(jiǎn)單的value={...}作為name=value對(duì)。又由于成員值是一個(gè)數(shù)組,故使用大括號(hào)來聲明數(shù)組值。

     

     

    注意:我們可以在下面的情況中縮寫annotation:當(dāng)annotation只有單一成員,并成員命名為"value="。這時(shí)可以省去"value="。比如將上面的SuppressWarnings annotation進(jìn)行縮寫:

     

    代碼:

     

    @SuppressWarnings({"unchecked","fallthrough"})

     

     

     

     

    如果SuppressWarnings所聲明的被禁止警告?zhèn)€數(shù)為一個(gè)時(shí),可以省去大括號(hào):

     

     

     

    @SuppressWarnings("unchecked")

     

     

     

    、自定義annontation示例

     

      示例共涉及四個(gè)類:

      清單1:Author.java

    復(fù)制代碼
    package com.magc.annotation;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    /**
    * 定義作者信息,name和group
    *
    @author magc
    *
    */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    public @interface Author {

    String name();
    String group();
    }
    復(fù)制代碼

      清單2:Description.java

    復(fù)制代碼
    /**
    *
    */
    package com.magc.annotation;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    /**
    *
    @author magc
    *
    * 定義描述信息 value
    */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @Documented

    public @interface Description {
    String value();
    }
    復(fù)制代碼

    清單3:Utility.java

    復(fù)制代碼
    package com.magc.annotation;

    @Description(value
    = "這是一個(gè)有用的工具類")
    public class Utility {

    @Author(name
    = "haoran_202",group="com.magc")
    public String work()
    {
    return "work over!";
    }



    }
    復(fù)制代碼

    注:這是個(gè)普通的Java類,運(yùn)行了@Description和@Author注解。

    清單3:AnalysisAnnotation.java

    復(fù)制代碼
    package com.magc.annotation;

    import java.lang.reflect.Method;

    public class AnalysisAnnotation {
    /**
    * 在運(yùn)行時(shí)分析處理annotation類型的信息
    *
    *
    */
    public static void main(String[] args) {
    try {
    //通過運(yùn)行時(shí)反射API獲得annotation信息
    Class rt_class = Class.forName("com.magc.annotation.Utility");
    Method[] methods
    = rt_class.getMethods();

    boolean flag = rt_class.isAnnotationPresent(Description.class);

    if(flag)
    {
    Description description
    = (Description)rt_class.getAnnotation(Description.class);
    System.out.println(
    "Utility's Description--->"+description.value());
    for (Method method : methods) {
    if(method.isAnnotationPresent(Author.class))
    {
    Author author
    = (Author)method.getAnnotation(Author.class);
    System.out.println(
    "Utility's Author--->"+author.name()+" from "+author.group());

    }
    }
    }


    }
    catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    }
    復(fù)制代碼

    注:這是個(gè)與自定義@Description和@Author配套的基礎(chǔ)框架或工具類,通過此類來獲得與普通Java類Utility.java關(guān)聯(lián)的信息,即描述和作者。

    運(yùn)行AnalysisAnnotation,輸出結(jié)果為:

    Utility's Description--->這是一個(gè)有用的工具類
    Utility's Author--->haoran_202 from com.magc

    posted @ 2015-06-11 18:06 ForMeBlog 閱讀(256) | 評(píng)論 (0)編輯 收藏
    在ORACLE 數(shù)據(jù)庫中有一種方法可以實(shí)現(xiàn)級(jí)聯(lián)查詢
    select *                //要查詢的字段
    from table              //具有子接點(diǎn)ID與父接點(diǎn)ID的表 
    start with selfid=id      //給定一個(gè)startid(字段名為子接點(diǎn)ID,及開始的ID號(hào))
    connect by prior selfid=parentid       //聯(lián)接條件為子接點(diǎn)等于父接點(diǎn),不能反

    這個(gè)SQL主要用于菜單的級(jí)聯(lián)查詢,給一個(gè)父接點(diǎn)可以查出所有的子接點(diǎn)。及子接點(diǎn)的子接點(diǎn),一查到底,很實(shí)用。不過呢這個(gè)程序只能在oracle里面用,我目前還不知道在其它數(shù)據(jù)庫里是怎么調(diào)用的。等我找到了,再貼出來與大家分享。
    這個(gè)程序,估計(jì)好多人看不明白,其實(shí)放了這么久我也一時(shí)沒看明白,重新測(cè)了一下,補(bǔ)充說明一下,不然我下次又看不懂了。
    以一個(gè)windows系統(tǒng)的菜單為例。我那一個(gè)這樣的表menu。
    說明:
    mid:菜單的ID號(hào)
    mname:菜單名稱
    mpid:菜單的
    quickey:快捷鍵
    validate:權(quán)限表(存放userid,或者角色id)
    mid mname mpid quickey validate                                                                  
    1 文件   ctrl+f 1,2,3,4,11,23,45
    2 編輯   ctrl+e  
    3 新建 1 alt+w  
    4 文件夾 3  

     

    如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個(gè)SQL程序:
    select * from menu
    start with mid=1     
    connect by prior mid=mpid;
    這樣就可以把 “文件”里的子菜單全部列出來了。當(dāng)然實(shí)際應(yīng)用不會(huì)這么簡(jiǎn)單,如附加其實(shí)條件,尤其是權(quán)限管理,這時(shí)根據(jù)你的系統(tǒng)要求,是對(duì)個(gè)個(gè)驗(yàn)證,還是對(duì)角色驗(yàn)證,把這些人的ID放在validate這個(gè)字段里,組成一個(gè)字符串,N個(gè)ID用逗號(hào)隔開,(注意,在往數(shù)據(jù)庫保存時(shí)要注意對(duì)字符串處理一下,截取掉最后一個(gè)逗號(hào)這樣可以節(jié)省很多麻煩)
    select * from menu
    where validate in(……)
    and mid in(
       select mid from menu  //這里不能用*號(hào)了。
       start with mid=1     
       connect by prior mid=mpid;
    )
    最后再補(bǔ)充一點(diǎn)關(guān)于隨機(jī)查詢的代碼
    select * from user order by sys_guid()
    posted @ 2015-03-12 12:04 ForMeBlog 閱讀(1478) | 評(píng)論 (0)編輯 收藏

    今天看到某網(wǎng)友關(guān)于“如何以Java實(shí)現(xiàn)網(wǎng)頁截圖技術(shù)”的咨詢帖,由于出現(xiàn)該咨詢的地點(diǎn)非常不適合較長(zhǎng)回復(fù),故以博文形式回答。

     

    事實(shí)上,如果您想以Java實(shí)現(xiàn)網(wǎng)頁截圖,也就是“輸入一段網(wǎng)址,幾秒鐘過后就能截取一張網(wǎng)頁縮略圖”的效果。那么,您至少有3種方式可以選擇。

     

    1、最直接的方式——使用Robot

     

    方法詳解:該方法利用Robat提供的強(qiáng)大桌面操作能力,硬性調(diào)用瀏覽器打開指定網(wǎng)頁,并將網(wǎng)頁信息保存到本地。

     

    優(yōu)勢(shì):簡(jiǎn)單易用,不需要任何第三方插件。

     

    缺點(diǎn):不能同時(shí)處理大量數(shù)據(jù),技術(shù)含量過低,屬于應(yīng)急型技巧。

     

    實(shí)現(xiàn)方法:使用如下代碼即可


     

     

    1. public static void main(String[] args) throws MalformedURLException,  
    2.         IOException, URISyntaxException, AWTException {  
    3.     //此方法僅適用于JdK1.6及以上版本   
    4.     Desktop.getDesktop().browse(  
    5.             new URL("http://google.com/intl/en/").toURI());  
    6.     Robot robot = new Robot();  
    7.     robot.delay(10000);  
    8.     Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());  
    9.     int width = (int) d.getWidth();  
    10.     int height = (int) d.getHeight();  
    11.     //最大化瀏覽器   
    12.     robot.keyRelease(KeyEvent.VK_F11);  
    13.     robot.delay(2000);  
    14.     Image image = robot.createScreenCapture(new Rectangle(00, width,  
    15.             height));  
    16.     BufferedImage bi = new BufferedImage(width, height,  
    17.             BufferedImage.TYPE_INT_RGB);  
    18.     Graphics g = bi.createGraphics();  
    19.     g.drawImage(image, 00, width, height, null);  
    20.     //保存圖片   
    21.     ImageIO.write(bi, "jpg"new File("google.jpg"));  
    22. }  

     

     

    2、最常規(guī)的方式——利用JNI,調(diào)用第三方C/C++組件

    方法詳解:目前來講,Java領(lǐng)域?qū)τ诰W(wǎng)頁截圖組件的開發(fā)明顯不足(商機(jī)?),當(dāng)您需要完成此種操作時(shí),算得上碰到了Java的軟肋。但是,眾所周知Java也擁有強(qiáng)大的JNI能力,可以輕易將C/C++開發(fā)的同類組件引為己用。

    優(yōu)勢(shì):實(shí)現(xiàn)簡(jiǎn)單,只需要封裝對(duì)應(yīng)的DLL文件,就可以讓Java實(shí)現(xiàn)同類功能。

     

    劣勢(shì):同其他JNI實(shí)現(xiàn)一樣,在跨平臺(tái)時(shí)存在隱患,而且您的程序?qū)⒉辉賹儆诩僇ava應(yīng)用。

     

    實(shí)現(xiàn)方法:可參見此用例,具體封裝何種C/C++組件請(qǐng)自行選擇。

     

    PS:示例來源于ACA HTML to Image Converter項(xiàng)目(http://www.acasystems.com/en/web-thumb-activex/faq-convert-html-to-image-in-java.htm ),這是一個(gè)收費(fèi)的HTML轉(zhuǎn)Image第三方組件,但封裝方式在Java中大同小異。

     

    引用JNI封裝:

     

     

     

    1. import sun.awt.*;  
    2. import java.awt.*;  
    3. import javax.swing.*;  
    4. import java.awt.event.*;  
    5. import java.awt.*;  
    6. import java.awt.peer.*;  
    7. public class Snap  
    8. {  
    9.   static  
    10.   {  
    11.     System.loadLibrary("Snap");  
    12.   }  
    13.   public static void main( String[] argv )  
    14.   {  
    15.     Snap t_xSnap = new Snap();  
    16.     t_xSnap.Start("http://www.google.com""snapshot-google.png");  
    17.   }  
    18.   public native void Start(String pi_strURL, String pi_strImageName);  
    19. }  

     

     

    CPP部分的實(shí)現(xiàn):

     

     

     

    1. #include <windows.h>  
    2. #include <atlbase.h>  
    3. #include "snap.h"  
    4. #pragma comment(lib,"atl.lib")  
    5. #import "./../../acawebthumb.dll" no_namespace  
    6. JNIEXPORT void JNICALL Java_Snap_Start(JNIEnv *pEnv, jobject, jstring pi_strUrl, jstring pi_strFileName)  
    7. {  
    8.   CoInitialize(0);  
    9.   _bstr_t t_strUrl = pEnv->GetStringUTFChars(pi_strUrl, 0);  
    10.   _bstr_t t_strFileName = pEnv->GetStringUTFChars(pi_strFileName, 0);      
    11.   IThumbMakerPtr HTML_Converter = NULL;  
    12.   HRESULT hr = HTML_Converter.CreateInstance(L"ACAWebThumb.ThumbMaker");      
    13.   if (SUCCEEDED(hr))  
    14.   {   
    15.     HTML_Converter->SetURL(t_strUrl);  
    16.     if ( 0 == HTML_Converter->StartSnap() )  
    17.       HTML_Converter->SaveImage(t_strFileName);  
    18.   }  
    19.   if (HTML_Converter)  
    20.     HTML_Converter.Release();  
    21.   CoUninitialize();           
    22. }  

     

     

    以該組件圖像化yahoo界面的效果圖:

     

    00


    3、最扎實(shí)的方法——自行解析HTML標(biāo)記,并將其圖像化

     

    方法詳解:眾所周知,HTML之所以在瀏覽器中以具體的網(wǎng)頁格式出現(xiàn),并非服務(wù)器端傳了一整個(gè)應(yīng)用到客戶端,而是源自于瀏覽器對(duì)于客戶端自行解析的結(jié)果。因此,只要我們將對(duì)應(yīng)的解析一一實(shí)現(xiàn),那么將網(wǎng)頁圖形化,就將不是什么難事。


    優(yōu)勢(shì):純Java實(shí)現(xiàn),一勞永逸,一旦開發(fā)完成則永遠(yuǎn)通用,而且有一定的商用價(jià)值。

     

    劣勢(shì):開發(fā)費(fèi)時(shí),且需要針對(duì)不同語法做精確分析,才能保證輸出的基本正確。尤其在涉及到JavaScript解析時(shí),難度將尤其增大。

     

    實(shí)現(xiàn)方法:目前尚無具體案例可供參考。但是,由于Java有jdic之類的瀏覽器項(xiàng)目存在(https://jdic.dev.java.net/ ),而Java圖形界面又屬繪制生成。從理論上說,我們可以將所有具備Graphics的組件圖形化保存。

     

    而如果自行解析,那么您需要建立HTML解析器(或使用第三方的,萬幸Java在這方面的組件很多),了解Java2D機(jī)制,了解何時(shí)該使用drawString繪制文字,何時(shí)又該使用drawImage插入圖片等等。

     


    補(bǔ)充:

     

    這是一個(gè)利用內(nèi)置瀏覽器截圖的示例,使用了DJNativeSwing組件。

     

    示例工程下載地址(Eclipse工程,含lib):http://greenvm.googlecode.com/files/Screenshot.7z

     

     

     

     

    1. import java.awt.BorderLayout;  
    2. import java.awt.Dimension;  
    3. import java.awt.FlowLayout;  
    4. import java.awt.image.BufferedImage;  
    5. import java.io.File;  
    6. import java.io.IOException;  
    7. import javax.imageio.ImageIO;  
    8. import javax.swing.JFrame;  
    9. import javax.swing.JPanel;  
    10. import javax.swing.SwingUtilities;  
    11. import chrriis.dj.nativeswing.swtimpl.NativeComponent;  
    12. import chrriis.dj.nativeswing.swtimpl.NativeInterface;  
    13. import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;  
    14. import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;  
    15. import chrriis.dj.nativeswing.swtimpl.components.WebBrowserEvent;  
    16. public class Main extends JPanel {  
    17.     /** 
    18.      *  
    19.      */  
    20.     private static final long serialVersionUID = 1L;  
    21.     // 行分隔符   
    22.     final static public String LS = System.getProperty("line.separator""/n");  
    23.     // 文件分割符   
    24.     final static public String FS = System.getProperty("file.separator""http://");  
    25.     //以javascript腳本獲得網(wǎng)頁全屏后大小   
    26.     final static StringBuffer jsDimension;  
    27.       
    28.     static {  
    29.         jsDimension = new StringBuffer();  
    30.         jsDimension.append("var width = 0;").append(LS);  
    31.         jsDimension.append("var height = 0;").append(LS);  
    32.         jsDimension.append("if(document.documentElement) {").append(LS);  
    33.         jsDimension.append(  
    34.                         "  width = Math.max(width, document.documentElement.scrollWidth);")  
    35.                 .append(LS);  
    36.         jsDimension.append(  
    37.                         "  height = Math.max(height, document.documentElement.scrollHeight);")  
    38.                 .append(LS);  
    39.         jsDimension.append("}").append(LS);  
    40.         jsDimension.append("if(self.innerWidth) {").append(LS);  
    41.         jsDimension.append("  width = Math.max(width, self.innerWidth);")  
    42.                 .append(LS);  
    43.         jsDimension.append("  height = Math.max(height, self.innerHeight);")  
    44.                 .append(LS);  
    45.         jsDimension.append("}").append(LS);  
    46.         jsDimension.append("if(document.body.scrollWidth) {").append(LS);  
    47.         jsDimension.append(  
    48.                 "  width = Math.max(width, document.body.scrollWidth);")  
    49.                 .append(LS);  
    50.         jsDimension.append(  
    51.                 "  height = Math.max(height, document.body.scrollHeight);")  
    52.                 .append(LS);  
    53.         jsDimension.append("}").append(LS);  
    54.         jsDimension.append("return width + ':' + height;");  
    55.     }  
    56.   //DJNativeSwing組件請(qǐng)于http://djproject.sourceforge.net/main/index.html下載   
    57.     public Main(final String url, final int maxWidth, final int maxHeight) {  
    58.         super(new BorderLayout());  
    59.         JPanel webBrowserPanel = new JPanel(new BorderLayout());  
    60.         final String fileName = System.currentTimeMillis() + ".jpg";  
    61.         final JWebBrowser webBrowser = new JWebBrowser(null);  
    62.         webBrowser.setBarsVisible(false);  
    63.         webBrowser.navigate(url);  
    64.         webBrowserPanel.add(webBrowser, BorderLayout.CENTER);  
    65.         add(webBrowserPanel, BorderLayout.CENTER);  
    66.         JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 44));  
    67.         webBrowser.addWebBrowserListener(new WebBrowserAdapter() {  
    68.             // 監(jiān)聽加載進(jìn)度   
    69.             public void loadingProgressChanged(WebBrowserEvent e) {  
    70.                 // 當(dāng)加載完畢時(shí)   
    71.                 if (e.getWebBrowser().getLoadingProgress() == 100) {  
    72.                     String result = (String) webBrowser  
    73.                             .executeJavascriptWithResult(jsDimension.toString());  
    74.                     int index = result == null ? -1 : result.indexOf(":");  
    75.                     NativeComponent nativeComponent = webBrowser  
    76.                             .getNativeComponent();  
    77.                     Dimension originalSize = nativeComponent.getSize();  
    78.                     Dimension imageSize = new Dimension(Integer.parseInt(result  
    79.                             .substring(0, index)), Integer.parseInt(result  
    80.                             .substring(index + 1)));  
    81.                     imageSize.width = Math.max(originalSize.width,  
    82.                             imageSize.width + 50);  
    83.                     imageSize.height = Math.max(originalSize.height,  
    84.                             imageSize.height + 50);  
    85.                     nativeComponent.setSize(imageSize);  
    86.                     BufferedImage image = new BufferedImage(imageSize.width,  
    87.                             imageSize.height, BufferedImage.TYPE_INT_RGB);  
    88.                     nativeComponent.paintComponent(image);  
    89.                     nativeComponent.setSize(originalSize);  
    90.                     // 當(dāng)網(wǎng)頁超出目標(biāo)大小時(shí)   
    91.                     if (imageSize.width > maxWidth  
    92.                             || imageSize.height > maxHeight) {  
    93.                         //截圖部分圖形   
    94.                         image = image.getSubimage(00, maxWidth, maxHeight);  
    95.                         /*此部分為使用縮略圖 
    96.                         int width = image.getWidth(), height = image 
    97.                             .getHeight(); 
    98.                          AffineTransform tx = new AffineTransform(); 
    99.                         tx.scale((double) maxWidth / width, (double) maxHeight 
    100.                                 / height); 
    101.                         AffineTransformOp op = new AffineTransformOp(tx, 
    102.                                 AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
    103.                         //縮小 
    104.                         image = op.filter(image, null);*/  
    105.                     }  
    106.                     try {  
    107.                         // 輸出圖像   
    108.                         ImageIO.write(image, "jpg"new File(fileName));  
    109.                     } catch (IOException ex) {  
    110.                         ex.printStackTrace();  
    111.                     }  
    112.                     // 退出操作   
    113.                     System.exit(0);  
    114.                 }  
    115.             }  
    116.         }  
    117.         );  
    118.         add(panel, BorderLayout.SOUTH);  
    119.     }  
    120.     public static void main(String[] args) {  
    121.         NativeInterface.open();  
    122.         SwingUtilities.invokeLater(new Runnable() {  
    123.             public void run() {  
    124.                 // SWT組件轉(zhuǎn)Swing組件,不初始化父窗體將無法啟動(dòng)webBrowser   
    125.                 JFrame frame = new JFrame("以DJ組件保存指定網(wǎng)頁截圖");  
    126.                 // 加載指定頁面,最大保存為640x480的截圖   
    127.                 frame.getContentPane().add(  
    128.                         new Main("http://blog.csdn.net/cping1982"640480),  
    129.                         BorderLayout.CENTER);  
    130.                 frame.setSize(800600);  
    131.                 // 僅初始化,但不顯示   
    132.                 frame.invalidate();  
    133.                 frame.pack();  
    134.                 frame.setVisible(false);  
    135.             }  
    136.         });  
    137.         NativeInterface.runEventPump();  
    138.     }  
    139. }  

     

     

     

    posted @ 2015-01-21 12:00 ForMeBlog 閱讀(436) | 評(píng)論 (0)編輯 收藏
    public HttpServletResponse download(String path, HttpServletResponse response) {
            
    try {
                
    // path是指欲下載的文件的路徑。
                File file = new File(path);
                
    // 取得文件名。
                String filename = file.getName();
                
    // 取得文件的后綴名。
                String ext = filename.substring(filename.lastIndexOf("."+ 1).toUpperCase();

                
    // 以流的形式下載文件。
                InputStream fis = new BufferedInputStream(new FileInputStream(path));
                
    byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                
    // 清空response
                response.reset();
                
    // 設(shè)置response的Header
                response.addHeader("Content-Disposition""attachment;filename=" + new String(filename.getBytes()));
                response.addHeader(
    "Content-Length""" + file.length());
                OutputStream toClient 
    = new BufferedOutputStream(response.getOutputStream());
                response.setContentType(
    "application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            } 
    catch (IOException ex) {
                ex.printStackTrace();
            }
            
    return response;
        }

        
    public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
            
    // 下載本地文件
            String fileName = "Operator.doc".toString(); // 文件的默認(rèn)保存名
            
    // 讀到流中
            InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路徑
            
    // 設(shè)置輸出的格式
            response.reset();
            response.setContentType(
    "bin");
            response.addHeader(
    "Content-Disposition""attachment; filename=\"" + fileName + "\"");
            
    // 循環(huán)取出流中的數(shù)據(jù)
            byte[] b = new byte[100];
            
    int len;
            
    try {
                
    while ((len = inStream.read(b)) > 0)
                    response.getOutputStream().write(b, 
    0, len);
                inStream.close();
            } 
    catch (IOException e) {
                e.printStackTrace();
            }
        }

        
    public void downloadNet(HttpServletResponse response) throws MalformedURLException {
            
    // 下載網(wǎng)絡(luò)文件
            int bytesum = 0;
            
    int byteread = 0;

            URL url 
    = new URL("windine.blogdriver.com/logo.gif");

            
    try {
                URLConnection conn 
    = url.openConnection();
                InputStream inStream 
    = conn.getInputStream();
                FileOutputStream fs 
    = new FileOutputStream("c:/abc.gif");

                
    byte[] buffer = new byte[1204];
                
    int length;
                
    while ((byteread = inStream.read(buffer)) != -1) {
                    bytesum 
    += byteread;
                    System.out.println(bytesum);
                    fs.write(buffer, 
    0, byteread);
                }
            } 
    catch (FileNotFoundException e) {
                e.printStackTrace();
            } 
    catch (IOException e) {
                e.printStackTrace();
            }
        }
    //支持在線打開文件的一種
    public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
            File f 
    = new File(filePath);
            
    if (!f.exists()) {
                response.sendError(
    404"File not found!");
                
    return;
            }

            BufferedInputStream br 
    = new BufferedInputStream(new FileInputStream(f));
            
    byte[] buf = new byte[1024];
            
    int len = 0;

            response.reset(); 
    // 非常重要
            if (isOnLine) // 在線打開方式
                URL u = new URL("file:///" + filePath);
                response.setContentType(u.openConnection().getContentType());
                response.setHeader(
    "Content-Disposition""inline; filename=" + f.getName());
                
    // 文件名應(yīng)該編碼成UTF-8
            }
     else // 純下載方式
                response.setContentType("application/x-msdownload");
                response.setHeader(
    "Content-Disposition""attachment; filename=" + f.getName());
            }

            OutputStream out 
    = response.getOutputStream();
            
    while ((len = br.read(buf)) > 0)
                out.write(buf, 
    0, len);
            br.close();
            out.close();
        }
    方式

    posted @ 2015-01-04 16:32 ForMeBlog 閱讀(190) | 評(píng)論 (0)編輯 收藏
    原始的message.xml
    <?xml version="1.0" encoding="UTF-8"?><users>
        
    <Messages>
            
    <sendName>sendUsers</sendName>
            
    <receiveName>snake</receiveName>
            
    <date>2007-12-04 12:20:00</date>
            
    <status>1</status>
            
    <message>this is Content</message>
        
    </Messages>
    </users>

    java程序
    import java.io.File;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;

    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;

    public class UpdateXml {
        
    public static boolean doc2XmlFile(Document document, String filename) {
            
    boolean flag = true;
            
    try {
               
                TransformerFactory tFactory 
    = TransformerFactory.newInstance();
                Transformer transformer 
    = tFactory.newTransformer();
               
                
    // transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
                DOMSource source = new DOMSource(document);
                StreamResult result 
    = new StreamResult(new File(filename));
                transformer.transform(source, result);
            } 
    catch (Exception ex) {
                flag 
    = false;
                ex.printStackTrace();
            }
            
    return flag;
        }

        
    public static Document load(String filename) {
            Document document 
    = null;
            
    try {
                DocumentBuilderFactory factory 
    = DocumentBuilderFactory
                        .newInstance();
                DocumentBuilder builder 
    = factory.newDocumentBuilder();
                document 
    = builder.parse(new File(filename));
                document.normalize();
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
            
    return document;
        }

       
        
    public static void xmlUpdateDemo() {
            Document document 
    = load("message.xml");
            Node root 
    = document.getDocumentElement();
           
            
    if (root.hasChildNodes()) {
               
                NodeList ftpnodes 
    = root.getChildNodes();
               
                
    for (int i = 0; i < ftpnodes.getLength(); i++) {
                    NodeList ftplist 
    = ftpnodes.item(i).getChildNodes();
                    
    for (int k = 0; k < ftplist.getLength(); k++) {
                        Node subnode 
    = ftplist.item(k);
                       
                        
    // if (subnode.getNodeType()==Node.ELEMENT_NODE&&subnode.
                        
    // getNodeName()=="ftp-chn")
                        
    // {
                        
    // ftpnodes.item(i).removeChild(subnode);
                        
    // }
                       
                        
    if (subnode.getNodeType() == Node.ELEMENT_NODE
                                
    && subnode.getNodeName() == "status") {
                            subnode.getFirstChild().setNodeValue(
    "9");
                        }
                    }

                }
            }

            doc2XmlFile(document, 
    "message.xml");
        }

        
    public static void main(String args[]) throws Exception {
            UpdateXml.xmlUpdateDemo();
        }
    }

    修改后的message.xml
    <?xml version="1.0" encoding="UTF-8"?><users>
        
    <Messages>
            
    <sendName>sendUsers</sendName>
            
    <receiveName>snake</receiveName>
            
    <date>2007-12-04 12:20:00</date>
            
    <status>9</status>
            
    <message>this is Content</message>
        
    </Messages>
    </users>
    posted @ 2014-07-29 17:05 ForMeBlog 閱讀(533) | 評(píng)論 (0)編輯 收藏
         摘要: 一、概述 ant 是一個(gè)將軟件編譯、測(cè)試、部署等步驟聯(lián)系在一起加以自動(dòng)化的一個(gè)工具,大多用于Java環(huán)境中的軟件開發(fā)。在實(shí)際軟件開發(fā)中,有很多地方可以用到ant。   開發(fā)環(huán)境: System:Windows JDK:1.6+ IDE:eclipse ant:1.9.1   Email:hoojo_@126.com Blog:http://blog....  閱讀全文
    posted @ 2014-07-29 17:01 ForMeBlog 閱讀(279) | 評(píng)論 (0)編輯 收藏
         摘要: Ant是一個(gè)Apache基金會(huì)下的跨平臺(tái)的構(gòu)件工具,它可以實(shí)現(xiàn)項(xiàng)目的自動(dòng)構(gòu)建和部署等功能。在本文中,主要讓讀者熟悉怎樣將Ant應(yīng)用到Java項(xiàng)目中,讓它簡(jiǎn)化構(gòu)建和部署操作。 一.             安裝與配置 下載地址:http://ant.apache.org...  閱讀全文
    posted @ 2014-07-29 16:49 ForMeBlog 閱讀(3223) | 評(píng)論 (0)編輯 收藏

     

    在開放過程中有時(shí)候工作環(huán)境不編譯文件,解決方案如下:
    1、確保 project->build automatically 已經(jīng)被選上。

    2、如果選上了也不好使, 使用這一招: project->clean..->選第2個(gè)clean select project,,勾上start build immediatelly。

    3、刪除現(xiàn)在的項(xiàng)目,提前設(shè)置好編譯文件輸出路徑,重新導(dǎo)入源文件,設(shè)置MyEclipse為保存時(shí)編譯,然后在保存的時(shí)候就可以自動(dòng)編譯了。

    4、如果項(xiàng)目里引了某個(gè)不用的jar包,而那個(gè)包又被你刪了,就會(huì)出現(xiàn)不報(bào)錯(cuò)但怎么也編譯不出來class文件的情 況,可以把所有包都刪除,然后一個(gè)一個(gè)的再引入(需要的),不要一下子把所有包都引入來,沒用的可能會(huì)引起不良后果。

    5、想刪掉某個(gè)class文件重新生成,刪除class文件后,但classes目錄下的文件夾被其它程序打開,比如Total Commander。此時(shí)編譯也不會(huì)通過,在problems下可能會(huì)提示“con't delete classes ……”,關(guān)掉其它程序重新編譯即可。

    6、還有種情況是remove掉 JRE System Library,重新導(dǎo)入即可編譯。但是什么原因?qū)е碌倪€不清楚。

    7、把build path中所有包都remove掉,然后又add jars,add libraries把需要的加進(jìn)去,居然又開始編譯了。

    8、project->properties->java build path->source->.../WEB-INF/src的output folder不要默認(rèn),編輯讓它指向../WEB-INF/classes然后重新點(diǎn)擊build工程即可自動(dòng)編譯。我的問題出在這里,我把這個(gè)編譯目錄給誤刪了。

    9、再就是最重要的要看工程下面是否缺少了work目錄,由于CVS控制時(shí)不把work加如版本,所以 checkout后沒有這個(gè)目錄,要手工加上有的工程就能自動(dòng)編譯了最開始的時(shí)候,我只找到了前面7個(gè)方法,但是他們都沒有解決我的問題,無意中我打開了"Problems"標(biāo)簽,發(fā)現(xiàn)里面說缺少work目錄,手工 加上,然后刷新項(xiàng)目就可以了,最后兩個(gè)是我在寫這個(gè)總結(jié)的時(shí)候發(fā)現(xiàn)的,特別是第九條對(duì)使用CVS進(jìn)行版本控制的項(xiàng)目比較有用.classpath這個(gè)xml文件要仔細(xì)看。

     

    posted @ 2014-04-24 15:48 ForMeBlog 閱讀(12275) | 評(píng)論 (0)編輯 收藏
            weblogic安裝的系統(tǒng)是window,weblogic版本是8.1.5版本,運(yùn)行weblogic服務(wù)后,查看bea\user_projects\domains\mydomain\myserver目錄下myserver.log文件(我這邊建的服務(wù)是默認(rèn)的服務(wù)myserver,如果你沒有用默認(rèn)服務(wù),那你就到你建的server下面找),以記事本的方式打開文件,查找file.encoding等于的值,這個(gè)默認(rèn)是系統(tǒng)的編碼,如果系統(tǒng)編碼不適合你當(dāng)前的編碼,可以通過下面方式修改我們weblogic的編碼。
            一、首先修改啟動(dòng)文件startWebLogic.cmd,將編碼改變
                  startWebLogic.cmd文件在bea\user_projects\domains\mydomain目錄下,以記事本方式打開,拉到最下面有一下內(nèi)容:
                  
    %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE% -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" weblogic.Server
                  在“%JAVA_OPTIONS%”后面添加-Dfile.encoding="UTF-8",中間要用空格但是不要換行。
            二、重新啟動(dòng)weblogic服務(wù)
                 重啟weblogic服務(wù)后,可以到bea\user_projects\domains\mydomain\myserver目錄下查看myserver.log文件里面的file.encoding值變成了UTF-8,則證明修改成功了。
    posted @ 2014-04-09 16:53 ForMeBlog 閱讀(8712) | 評(píng)論 (0)編輯 收藏
    一、搭建框架的目的
        主要學(xué)習(xí)了解各個(gè)框架之間如何結(jié)合使用。了解用戶訪問到返回給用戶結(jié)果的流程怎樣進(jìn)行,原理是什么。怎樣才能深入理解使用框架。
    二、項(xiàng)目實(shí)現(xiàn)目標(biāo)
        用戶訪問頁面填寫用戶名和密碼,進(jìn)過后臺(tái)處理返回登錄成功或失敗。
    三、理解項(xiàng)目流程
        首先,用戶訪問login.jsp頁面,瀏覽器顯示登錄要填寫的信息,點(diǎn)擊提交后首先在web.xml里面配置Struts攔截器會(huì)處理,之后轉(zhuǎn)到struts.xml,根據(jù)用戶訪問的請(qǐng)求找到相應(yīng)的配置,根據(jù)配置找到applicationContext.xml里面bean對(duì)于的Java文件,對(duì)于這個(gè)對(duì)象Spring里面有數(shù)據(jù)庫操作類的注入,這使得Action類能夠連接數(shù)據(jù)庫并處理數(shù)據(jù),Action類里面返回處理結(jié)果,根據(jù)struts.xml配置返回相應(yīng)的界面。
        下載項(xiàng)目文件
    四、數(shù)據(jù)庫代碼
    1create table USERINFO
    2(
    3  ID       NUMBER,
    4  USERNAME VARCHAR2(50),
    5  PASSWORD VARCHAR2(50)
    6)


    posted @ 2014-03-07 17:53 ForMeBlog 閱讀(474) | 評(píng)論 (0)編輯 收藏
         摘要:    學(xué)習(xí)能力代表著成長(zhǎng)的加速度,大家上場(chǎng)的時(shí)候,其實(shí)速度都差不到那里去。但是過了幾年,差距就拉大了。因?yàn)橛腥嗽?5 檔上飚車,有人在 1 檔慢慢前行…還有在開倒車。   對(duì)于職場(chǎng)新人,雇主在學(xué)習(xí)能力方面更為重視。畢竟和有經(jīng)驗(yàn)的員工相比,公司招應(yīng)屆生,你的潛力還是一個(gè)關(guān)鍵因素。   本文包括 3 部分: ·   &nbs...  閱讀全文
    posted @ 2014-02-24 11:15 ForMeBlog 閱讀(277) | 評(píng)論 (0)編輯 收藏
      
    初學(xué)struts也是一知半解,比如action與dispatchAction的區(qū)別,最近便讓我十分困惑。  

    做為一個(gè)初學(xué)者,在目前使用過的東西中,主要有mapping.findForward(),action,dispatchAction三個(gè)實(shí)用功能,這三者放在一起本不太合適,但是在我看來,也有一定的相關(guān)性。  

    struts主要用途
    1. 判斷url傳值所要做的操作。比如 http://www.baidu.com/index.jsp?run=showAll ,這個(gè)如果使用了action,可以使用request.getParameter()接收。
    2. 使用mapping.findForward(url);替換servlet的response.sendRedirect("http://www.baidu.com");
    3. 把form提交的內(nèi)容封裝到formBean。這樣在使用了大量form的時(shí)候,可以用formBean的一實(shí)例lf.formName這樣去調(diào)用。
    好處在于不用使用request.getParameter("formName");去接收。
    4. 使用dispatchAction,在struts-config.xml中進(jìn)行配置,直接可以判斷get鏈接中的傳值,也可以避免使用request.getParameter("formName");去接收。

    formBean與dispatchAction的區(qū)別: 
    顯而易見,formBean使用在大量的post表單的情況下。
    dispatchAction常用來處理url鏈接中傳來的值。

    Action與dispatchAction的區(qū)別: 
    這里使用區(qū)別并不合適,因?yàn)閐ispatchAction繼承自Action,所以dispatchAction是對(duì)action進(jìn)行了功能的擴(kuò)充,action常需要使用getParameter()先獲取傳入的值,再判斷這個(gè)值是否正常,再重定向到不同的頁面。 
    而dispatchAction把判斷放以了struts-config.xml文件中,而不需要再到業(yè)務(wù)層進(jìn)行判斷。并且dispatchAction在使用中,更常用于處理url傳入的get請(qǐng)求。


    Struts的生存周期

    啟動(dòng)web服務(wù)器 -- 加載web.xml文件 -- 產(chǎn)生ActionServlet實(shí)例 -- 加載struts-config.xml文件 -- 解析出多個(gè)action并放入actionMapping池 
    客戶端發(fā)現(xiàn)請(qǐng)求 -- web容器 -- 請(qǐng)求發(fā)送到ActionServlet -- 分發(fā)到不同的action并實(shí)例化 -- 模型層處理 -- 處理結(jié)果返回到actionServlet -- 返回結(jié)果到視圖層

    舉例
    下面是一個(gè)使用了dispatchAction的項(xiàng)目的完整struts-config.xml配置
    ---------------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    <struts-config>
    <data-sources />
    <form-beans />
    <global-exceptions />
    <global-forwards />
    <form-beans>      //formbean的定義,name="loginForm"對(duì)應(yīng)于下文中的name="loginForm"
    <form-bean name="loginForm" type="org.jsw.struts.form.LoginForm" />
    </form-beans>
    <action-mappings >

    <action                    //定義了一個(gè)action
    path="/manager"           //此action的訪問路徑
    name="loginForm"          //此action用于接收哪個(gè)formbean,對(duì)應(yīng)于上文<form-beans>中的內(nèi)容
    parameter="method"      //此action用于接怍method的值,如果method值是add,那么自動(dòng)調(diào)用業(yè)務(wù)層的add方法
    type="com.umt.struts.action.ManagerAction">
    <forward name="success" path="/success.jsp"></forward>     //定義了重向向地址
    <forward name="delete" path="/delete.jsp"></forward>
    </action>
    </action-mappings>

    <message-resources parameter="com.jsw.struts.ApplicationResources" />
    </struts-config>
    posted @ 2013-11-05 16:37 ForMeBlog 閱讀(476) | 評(píng)論 (0)編輯 收藏
    String   str   =   "";//add   your   string   content

    InputStream   inputStream   =   new   ByteArrayInputStream(str.getBytes());


     1 package org.kodejava.example.io;
    2
    3  import java.io.ByteArrayInputStream;
    4  import java.io.InputStream;
    5
    6  public class StringToStream {
    7 public static void main(String[] args) {
    8 String text = "Converting String to InputStream Example";
    9
    10 /*
    11 * Convert String to InputString using ByteArrayInputStream class.
    12 * This class constructor takes the string byte array which can be
    13 * done by calling the getBytes() method.
    14 */
    15 try {
    16 InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
    17 } catch (UnsupportedEncodingException e) {
    18 e.printStackTrace();
    19 }
    20 }
    21 }
    22  

     





    1、字符串轉(zhuǎn)inputStream

     

    Java代碼  
    1. String string;  
    2. //......  
    3. InputStream is = new ByteArrayInputStream(string.getBytes());  
     

    2、InputStream轉(zhuǎn)字符串

     

    Java代碼  
    1. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    2. int i;  
    3. while ((i = is.read()) != -1) {  
    4.     baos.write(i);  
    5. }  
    6. String str = baos.toString();  
    7. System.out.println(str);  
     

    3、String寫入OutputStream

     

    Java代碼  
    1. OutputStream os = System.out;  
    2. os.write(string.getBytes());  
     

    4、OutputStream寫入String

     

    這聽起來有點(diǎn)荒謬,OutputStream本來就是輸出源,還寫入String?

    不過最近項(xiàng)目里確實(shí)遇到了個(gè)類似的問題,比如 SOAPMessage.writeTo(OutputStream os) 這個(gè)方法,是將SOAPMessage的內(nèi)容寫到一個(gè)輸出流中,而我想得到這個(gè)流的內(nèi)容,總不能把他先寫進(jìn)文件再去讀這個(gè)文件吧,研究了好半天,終于想起可以如下這般:

     

    Java代碼  
    1. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    2. //向OutPutStream中寫入,如 message.writeTo(baos);  
    3. String str = baos.toString();  


    將InputStream/OutputStream轉(zhuǎn)換成string

     

    這里需要用到一個(gè)特殊的類ByteArrayOutputStream,利用他,我們可以將輸出流在內(nèi)存中直接轉(zhuǎn)換成String類型。

    具體代碼如下:

     

    首先從輸入流中將數(shù)據(jù)讀出來寫入ByteArrayOutputStream,然后再將其轉(zhuǎn)換成String.

     

    Java代碼  
    1. InputStream in = urlconn.getInputStream();//獲取輸入流  
    2.   
    3. ByteArrayOutputStream bos = new ByteArrayOutputStream();  
    4.   
    5. //讀取緩存  
    6. byte[] buffer = new byte[2048];  
    7. int length = 0;  
    8. while((length = in.read(buffer)) != -1) {  
    9.     bos.write(buffer, 0, length);//寫入輸出流  
    10. }  
    11. in.close();//讀取完畢,關(guān)閉輸入流  
    12.   
    13. // 根據(jù)輸出流創(chuàng)建字符串對(duì)象  
    14. new String(bos.toByteArray(), "UTF-8");  
    15. //or  
    16. //bos.toString("UTF-8");  

     

    根據(jù)同樣的原理,我們可以將outputstream直接轉(zhuǎn)換成String對(duì)象。



    指定一下字符集
    byte[] b = str.getBytes("utf-8");
    String s = new String(b,"utf-8");



    OUTPUTSTREAM中方法WRITE用法

     void write(byte[] b) 
              將 b.length 個(gè)字節(jié)從指定的 byte 數(shù)組寫入此輸出流。 
     void write(byte[] b, int off, int len) 
              將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此輸出流。 
    abstract  void write(int b) 
              將指定的字節(jié)寫入此輸出流。 
    轉(zhuǎn)載地址:http://blog.csdn.net/soundtravel/article/details/6927006
    posted @ 2013-07-11 16:18 ForMeBlog 閱讀(352) | 評(píng)論 (0)編輯 收藏
    解決方案1(推薦):
    只需要在project build path中先移除JRE System Library,再添加庫JRE System Library,重新編譯后就一切正常了。
    解決方案2:
    Windows -> Preferences -> Java -> Compiler -> Errors/Warnings ->
    Deprecated and trstricted API -> Forbidden reference (access rules): -> change to warning
    posted @ 2013-06-07 15:26 ForMeBlog 閱讀(196) | 評(píng)論 (0)編輯 收藏
    在靜態(tài)頁面中,table標(biāo)簽里面的換行可以用<tr></tr>來實(shí)現(xiàn)換行,但是從數(shù)據(jù)庫里面讀出來的數(shù)據(jù)是數(shù)組,遍歷出來中間沒有辦法加入<tr></tr>實(shí)現(xiàn)換行,結(jié)果是頁面上顯示一列。現(xiàn)在可以解決了,你可以試一試用下面方法。
    下面是舉的一個(gè)例子你可以考到有struts 2環(huán)境的項(xiàng)目中看一下。
     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib prefix="s" uri="/struts-tags" %>
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>
     6     <title>My JSP 'index.jsp' starting page</title>
     7  <meta http-equiv="pragma" content="no-cache">
     8  <meta http-equiv="cache-control" content="no-cache">
     9  <meta http-equiv="expires" content="0">   
    10  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    11  <meta http-equiv="description" content="This is my page">
    12  <!--
    13  <link rel="stylesheet" type="text/css" href="styles.css">
    14  -->
    15  <s:head/>
    16   </head>
    17  
    18   <body>
    19     <table border="0">
    20     <tr>
    21      <s:iterator value="{'banana','apple','orange','cherry'}" id="fruitName" status="st">
    22       <td><s:property value="fruitName"/></td>
    23       <s:if test="(#st.index+1)%3==0"><!-- #st.index獲取數(shù)組的下標(biāo) -->
    24        </tr><tr>
    25       </s:if>
    26      </s:iterator>
    27      </tr>
    28      </table>
    29   </body>
    30 </html>
    posted @ 2012-03-17 18:47 ForMeBlog 閱讀(1912) | 評(píng)論 (0)編輯 收藏
    你可以在struts.xml文件中修改成如下:
    <action name="addnew" class="ay.jf.action.AddNewAction">
        <result name="success" type="chain" >
            <param name="namespace">/manager</param>
            <param name="actionName">newlist</param>
            <param name="method">receive</param>
        </result>
    </action>
    <action name="newlist" class="ay.jf.action.NewLIstAction">
         <result name="success">/feng.jsp</result>
    </action>
    posted @ 2011-11-05 18:41 ForMeBlog 閱讀(987) | 評(píng)論 (0)編輯 收藏

    在Struts2里,如果需要在Action中使用session,可以通過下面兩種方式得到
    1.通過ActionContext class中的方法getSession得到
    2.Action實(shí)現(xiàn)org.apache.struts2.interceptor.SessionAware接口的方式來對(duì)session進(jìn)行操作


    一、
    package s2.ex.action; 
    import java.util.Map;
    import com.opensymphony.xwork2.ActionContext; 

    import com.opensymphony.xwork2.ActionSupport; 

    public class SessionTestAction extends ActionSupport {     

         public String execute() {       

                 ActionContext actionContext = ActionContext.getContext();        

                 Map session = actionContext.getSession();        

                 session.put("UserName", "admin");  //設(shè)置session      

                 return SUCCESS;      
        }  

    }

    在這個(gè)例子中,通過ActionContext得到session,并往session里放置一個(gè)key為UserName,值為admin的內(nèi)容。

     


    二、下面是一個(gè)實(shí)現(xiàn)org.apache.struts2.interceptor.SessionAware接口來對(duì)session操作的例子
     

    package s2.ex.action;  
    import java.util.Map;  
    import org.apache.struts2.interceptor.SessionAware;  
    import com.opensymphony.xwork2.ActionSupport;  
    public class SessionTest1Action extends ActionSupport implements SessionAware {       
        private Map session;       
        public void setSession(Map session)  {          
            this.session = session;     
        }       
        public String execute() {         
            this.session.put("UserName", "admin");          
            return SUCCESS;       
        }  
    }

     

    下面是一個(gè)在JSP中使用session的例子:
    <%@ page contentType="text/html; charset=UTF-8" %>  
    <%@ page pageEncoding="utf-8" %>  
    <%@ taglib prefix="s" uri="/struts-tags" %>  
    <html>  
    <head>      
    <title>Session Test-JAVA中文網(wǎng):http://www.javaweb.cc/</title>  
    </head>  
    <body>  
    <h1><s:property value="#session.USER_NAME"/></h1>   <h1></h1>  
    </body>  
    </html>

    此文章經(jīng)過修改,根據(jù)Java中文網(wǎng)
    地址是:http://javaweb.cc/architecture/struts/261792.shtml

    posted @ 2011-10-22 10:13 ForMeBlog 閱讀(1305) | 評(píng)論 (0)編輯 收藏
    package mypack;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    public class DownloadServlet extends HttpServlet { 
        public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 
            OutputStream out; //輸出響應(yīng)正文的輸出流 
            InputStream in; //讀取本地文件的輸入流 //獲得filename請(qǐng)求參數(shù) 
            String filename=request.getParameter("filename"); 
            if(filename==null){ 
                out=response.getOutputStream(); 
                out.write("Please input filename.".getBytes()); 
                out.close();
                return; 
            } //創(chuàng)建讀取本地文件的輸入流 
         in= getServletContext().getResourceAsStream("/store/"+filename);
         int length=in.available(); //設(shè)置響應(yīng)正文的MIME類型 
        response.setContentType("application/force-download"); 
        response.setHeader("Content-Length",String.valueOf(length)); 
        response.setHeader("Content-Disposition", "attachment;filename=\""+filename +"\" ");/** 把本地文件中的數(shù)據(jù)發(fā)送給客戶 */ 
        out=response.getOutputStream(); 
        int bytesRead = 0; 
        byte[] buffer = new byte[512]; 
        while ((bytesRead = in.read(buffer)) != -1)    { 
            out.write(buffer, 0, bytesRead); 
        }
         in.close(); 
        out.close(); 
        }
    }
    posted @ 2010-12-03 22:04 ForMeBlog 閱讀(210) | 評(píng)論 (0)編輯 收藏
    如果你在你的數(shù)據(jù)庫中存的Blob類型的圖片,你想讀取它并顯示為圖片。你可以先建一個(gè)showimage.jsp頁面,如果你連接數(shù)據(jù)庫的密碼和用戶名跟這里不一樣,記得要改一下不然就會(huì)出錯(cuò)。
    <%@ page contentType="text/html;charset=bg2312"%>
    <%@ page import="java.sql.*" %>
    <html>
    <head>
    <title>顯示數(shù)據(jù)庫圖片測(cè)試頁</title>
    </head>
    <body>
    <%
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con=DriverManager.getConnection("jdbc:odbc:denglu","root","root");
    Statement stmt=con.createStatement();
    String sql=new String();
    sql = "select id from picturenews";
    ResultSet rs=stmt.executeQuery(sql);
    //顯示最后一條記錄的圖片
    rs.last();
    %>
    <table>
    <tr><td><img src='testimageout.jsp?id=<%=rs.getInt("id")%>'></td></tr>
    </table>
    </body>
    </html> 
    在建另一頁面讀取數(shù)據(jù)庫中圖片testimageout.jsp
    <%@ page contentType="text/html; charset=gbk" %>
    <%@ page import="java.io.*"%>
    <%@ page import="java.sql.*, javax.sql.*" %>
    <%@ page import="java.util.*"%>
    <%@ page import="java.math.*"%>

    <%
    String photo_no = request.getParameter("photo_no");

    //mysql連接 
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    String URL="jdbc:mysql://localhost:3306/todream";
    Connection con = DriverManager.getConnection(URL,"root","root");


    try{
    // 準(zhǔn)備語句執(zhí)行對(duì)象
    Statement stmt = con.createStatement();

    String sql = " SELECT * FROM todream_exhibition WHERE id = "+ photo_no;
    ResultSet rs = stmt.executeQuery(sql);
    if (rs.next()) {
    Blob b = rs.getBlob("workimg");
    long size = b.length();
    //out.print(size);
    byte[] bs = b.getBytes(1, (int)size);
    response.setContentType("image/jpeg"); 
    OutputStream outs = response.getOutputStream(); 
    outs.write(bs);
    outs.flush();
    rs.close(); 
    }
    else {
    rs.close();
    response.sendRedirect("./images/error.gif");
    }
    }
    finally{
    con.close();
    }
    %>
    轉(zhuǎn)載http://wenwen.soso.com/z/q114766705.htm  如果你想嘗試你必須要將數(shù)據(jù)庫建好,并與這一樣或?qū)sp頁面改了跟你的一樣。
    posted @ 2010-11-16 13:49 ForMeBlog 閱讀(1211) | 評(píng)論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲精品免费网站| 亚洲综合色7777情网站777| 三年片免费高清版| 免费在线观看黄网站| 久久水蜜桃亚洲AV无码精品 | 亚洲AV成人片色在线观看高潮| 国产一级在线免费观看| 青青草原亚洲视频| 国产精品内射视频免费| 国产亚洲成人久久| 男女一边桶一边摸一边脱视频免费| 免费**毛片在线播放直播| 国产青草亚洲香蕉精品久久 | 亚洲精品免费视频| 亚洲天堂中文字幕| 91短视频免费在线观看| 亚洲国产成人久久99精品| 久草免费在线观看视频| 亚洲国产亚洲综合在线尤物| 在线观看无码AV网站永久免费| 亚洲人成网亚洲欧洲无码| 国产精品免费看久久久无码| 日韩色视频一区二区三区亚洲| 亚洲?V乱码久久精品蜜桃 | 亚洲va在线va天堂va手机| 成人奭片免费观看| 无码亚洲成a人在线观看| 免费一级做a爰片性色毛片| 51午夜精品免费视频| 亚洲成色www久久网站夜月| 8888四色奇米在线观看免费看| 亚洲国产精品线观看不卡| 最新中文字幕免费视频| 亚洲av日韩av永久无码电影| 亚洲欧洲一区二区三区| 免费无码又爽又刺激网站直播| 亚洲综合无码一区二区| 男人的好看免费观看在线视频| 亚洲国产一区二区三区在线观看| 亚洲精品人成无码中文毛片| 怡红院免费全部视频在线视频|