
2015年3月12日
關于HTTP請求超時字段定義
一、ConnectionRequestTimeout 超時
HttpClient 使用連接池來管理連接,這個時間是從連接池獲取連接的超時時間,可以聯想從數據庫連接池獲取數據庫連接。
二、ConnectTimeout 超時
建立連接超時,客戶端和服務器間建立連接進行的三次握手完成的時間
三、SocketTimeout 超時
數據傳輸過程中數據包之間間隔的最大時間,Http響應報文可能有多個小報文組成,
如果傳輸報文的間隔時間超過設置這個時間,會報 java.net.SocketTimeoutException: Read timed out 異常的
posted @
2018-04-20 14:36 ForMeBlog 閱讀(362) |
評論 (0) |
編輯 收藏
提示:編寫Eclipse常用快捷鍵寫成文檔,主要是為了自己熟悉一下這些快捷鍵,方便以后查找和編程中使用!
一、編輯類快捷鍵
1、Ctrl + 1 快速修復,可以解決很多問題,例如import類、try catch包圍等。
2、Ctrl + Shift + F 格式化當前代碼。
3、Ctrl + Shift + M 添加類的import引入。
4、Ctrl + Shift + M 組織類的import引入,既有Ctrl + Shift + M 的作用,又可以幫你去除沒有用的引入。
5、Ctrl + Y 重做與Ctrl + Z 相反的作用。
6、Alt + / 內容輔助
7、Ctrl + D 刪除當前行或者選中的多行
8、Alt + Down 當前行和下面一行交換位置
9、Alt + Up 當前行和上面一行交換位置
10、Shift + Enter 在當前行的下一行插入空行
11、Ctrl + / 注釋當前行,再次按則取消注釋
二、選擇快捷鍵
1、Alt + Shift + Up 選擇封裝元素
2、Alt + Shift + Left 選擇上一個元素
3、Alt + Shift + Right選擇下一個元素
4、Shift + Left 從光標處開始往左選擇字符串
5、Shift + Right 從光標處開始往右選擇字符串
6、Ctrl + Shift + Left 選中光標左邊的單詞
7、Ctrl + Shift + Right 選中光標右邊的單詞
三、移動快捷鍵
1、Ctrl + Left 光標移到左邊單詞的開頭,
2、Ctrl + Right 光標移到右邊單詞的末尾。
四、搜索快捷鍵
1、Ctrl + K 參照選中的文字快速定位到下一個,如果沒有選中文字則搜索上一次使用搜索的文字。
2、Ctrl + Shift + K 參照選中的文字快速定位到上一個。
3、Ctrl + J 正向增量查找,按下這個快捷鍵后,你所輸入的每個字母編輯器都提供快速匹配到某個單詞,如果沒有在狀態欄中顯示沒有找到,退出這個模式按ESC鍵。
4、Ctrl + Shift + J 反向增量查找
5、Ctrl + Shift + U 列出所有包含字符串的行
6、Ctrl + G 工作區中的聲明
7、Ctrl + Shift + G 工作區中的引用
五、導航快捷鍵
1、Ctrl + Shift + T 搜索類
2、Ctrl + Shift + R 搜索工程中的文件
3、Ctrl + E 快速顯示當前編輯區的下拉列表
4、F4 打開類型層次結構
5、F3 跳轉到聲明處
6、Alt + Left 前一個編輯頁面
7、Alt + Right 下一個編輯頁面
8、Ctrl + PageUp/PageDown在編輯器中,切換已經打開的文件
六、調試快捷鍵
1、F5 單步跳入
2、F6 單步跳過
3、F7 單步還回
4、F8 繼續
5、Ctrl + Shift + D 顯示變量的值
6、Ctrl + shift + B 在當前行設置或者去掉斷點
7、Ctrl + R 運行至行,比較好用可以省好多的斷點
七、重構快捷鍵
1、Alt + Shift + R 重命名類名、方法名、屬性(變量)名。
2、Alt + Shift + M 把一段函數內的代碼抽取成方法,這是重構里面最常用的方法之一,特別是對于一大坨代碼很有用。
3、Alt + Shift + C 修改函數結構,比較實用有N個函數調用了這個方法修改一次就行了。
4、Alt + Shift + L 抽取本地變量,可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多出調用的時候。
5、Alt + Shift + F 把Class中的局部變量變為全局變量
6、Alt + Shift + I 合并變量,將創建簡化
7、Alt + Shift + Z 撤銷重構
八、其他快捷鍵
1、Alt + Enter 顯示當前選擇資源的屬性,在windows下查看文件的屬性就是這個快捷鍵,通常可以用來查看文件在windows中的實際路徑。
2、Ctrl + Up文本編輯器向上滾行
3、Ctrl + Down 文本編輯器向下滾行
4、Ctrl + M 最大化當前的Edit或者View,再按則縮小
5、Ctrl + O 快速顯示Outline
6、Ctrl + T 快速顯示當前類的繼承結構,選中接口方法按下這快捷可以跳轉到實現類,在項目DAO中經常用。
7、Ctrl + W 關閉當前Editer
8、Ctrl + L 文本編輯器轉至行
9、F2 顯示工具提示描述,選擇類或者變量按下該鍵會有提示出來
posted @
2015-11-20 16:36 ForMeBlog 閱讀(450) |
評論 (0) |
編輯 收藏
今天遇到調用encodeURL調用二次的疑問,雖然之前知道要調用二次,但是具體不是太清楚里面具體的運行過程,這是轉載的這個寫的比較詳細,把整個運行過程詳細解讀了一下,非常不錯所以轉載過了供其他人分享。
.encodeURL函數主要是來對URI來做轉碼,它默認是采用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個字節構成,每一個字節會轉換成16進制的編碼,同時添加上%號.
假設頁面端輸入的中文是一個“中”,按照下面步驟進行解碼
1.第一次encodeURI,按照utf-8方式獲取字節數組變成[-28,-72-83],對字節碼數組進行遍歷,把每個字節轉化成對應的16進制數,這樣就變成了[E4,B8,AD],最后變成[%E4,%B8,%AD] 此時已經沒有了多字節字符,全部是單字節字符。
2、第二次encodeURI,進行編碼,會把%看成一個轉義字符,并不編碼%以后字符,會把%編碼成%25.把數組最后變成[%25E4,%25B8,%25AD]然后就把處理后的數據[%25E4,%25B8,%25AD]發往服務器端,
當應用服務器調用getParameter方法,getParameter方法會去向應用服務器請求參數
應用服務器最初獲得的就是發送來的[%25E4,%25B8,%25AD],應用服務器會對這個數據進行URLdecode操作,應用服務器進行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[%E4,%B8,%AD],因為都會把%25解析成%.并把這個值返回給getParameter方法
3\、再用UTF-8解碼一次,就得到"中"了。
想想看,如果不編碼兩次,當服務器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現亂碼。
JS:
- document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;
JAVA后臺:
- roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");
posted @
2015-08-18 11:20 ForMeBlog 閱讀(421) |
評論 (0) |
編輯 收藏
一、概念
Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(類、方法、成員變量等)進行關聯。
更通俗的意思是為程序的元素(類、方法、成員變量)加上更直觀更明了的說明,這些說明信息是與程序的業務邏輯無關,并且是供指定的工具或框架使用的。
Annontation像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的聲明語句中。
二、原理
Annotation其實是一種接口。通過Java的反射機制相關的API來訪問annotation信息。相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。
annotation是不會影響程序代碼的執行,無論annotation怎么變化,代碼都始終如一地執行。
Java語言解釋器在工作時會忽略這些annotation,因此在JVM 中這些annotation是“不起作用”的,只能通過配套的工具才能對這些annontaion類型的信息進行訪問和處理。
Annotation與interface的異同:
1)、Annotation類型使用關鍵字@interface而不是interface。
這個關鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個interface
2)、Annotation類型、方法定義是獨特的、受限制的。
Annotation 類型的方法必須聲明為無參數、無異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型。而方法返回值類型必須為primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一作為元素的一維數組。方法的后面可以使用 default和一個默認數值來聲明成員的默認值,null不能作為成員默認值,這與我們在非annotation類型中定義方法有很大不同。
Annotation類型和它的方法不能使用annotation類型的參數、成員不能是generic。只有返回值類型是Class的方法可以在annotation類型中使用generic,因為此方法能夠用類轉換將各種類型轉換為Class。
3)、Annotation類型又與接口有著近似之處。
它們可以定義常量、靜態成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實現或者繼承。
三、應用場合
annotation一般作為一種輔助途徑,應用在軟件框架或工具中,在這些工具類中根據不同的 annontation注解信息采取不同的處理過程或改變相應程序元素(類、方法及成員變量等)的行為。
例如:Junit、Struts、Spring等流行工具框架中均廣泛使用了annontion。使代碼的靈活性大提高。
四、常見標準的Annotation
從java5版本開始,自帶了三種標準annontation類型,
(1)、Override
java.lang.Override 是一個marker annotation類型,它被用作標注方法。它說明了被標注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時加一個保障性的校驗過程。
(2)、Deprecated
Deprecated也是一種marker annotation。當一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標注的程序元素。所以使用這種修飾具有一定的 “延續性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為 @Deprecated,但編譯器仍然要報警。
注意:@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,而后者是被javadoc工具所識別用來生成文檔(包含程序成員為什么已經過時、它應當如何被禁止或者替代的描述)。
(3)、SuppressWarnings
此注解能告訴Java編譯器關閉對類、方法及成員變量的警告。
有時編譯時會提出一些警告,對于這些警告有的隱藏著Bug,有的是無法避免的,對于某些不想看到的警告信息,可以通過這個注解來屏蔽。
SuppressWarning不是一個marker annotation。它有一個類型為String[]的成員,這個成員的值為被禁止的警告名。對于javac編譯器來講,被-Xlint選項有效的警告名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。
annotation語法允許在annotation名后跟括號,括號中是使用逗號分割的name=value對用于為annotation的成員賦值:
代碼:
@SuppressWarnings(value={"unchecked","fallthrough"})
public void lintTrap() { /* sloppy method body omitted */ }
在這個例子中SuppressWarnings annotation類型只定義了一個單一的成員,所以只有一個簡單的value={...}作為name=value對。又由于成員值是一個數組,故使用大括號來聲明數組值。
注意:我們可以在下面的情況中縮寫annotation:當annotation只有單一成員,并成員命名為"value="。這時可以省去"value="。比如將上面的SuppressWarnings annotation進行縮寫:
代碼:
@SuppressWarnings({"unchecked","fallthrough"})
如果SuppressWarnings所聲明的被禁止警告個數為一個時,可以省去大括號:
@SuppressWarnings("unchecked")
五、自定義annontation示例
示例共涉及四個類:
清單1:Author.java
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();
}
清單2:Description.java
/**
*
*/
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();
}
清單3:Utility.java
package com.magc.annotation;
@Description(value = "這是一個有用的工具類")
public class Utility {
@Author(name = "haoran_202",group="com.magc")
public String work()
{
return "work over!";
}
}
注:這是個普通的Java類,運行了@Description和@Author注解。
清單3:AnalysisAnnotation.java
package com.magc.annotation;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
/**
* 在運行時分析處理annotation類型的信息
*
*
*/
public static void main(String[] args) {
try {
//通過運行時反射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();
}
}
}
注:這是個與自定義@Description和@Author配套的基礎框架或工具類,通過此類來獲得與普通Java類Utility.java關聯的信息,即描述和作者。
運行AnalysisAnnotation,輸出結果為:
Utility's Description--->這是一個有用的工具類
Utility's Author--->haoran_202 from com.magc
posted @
2015-06-11 18:06 ForMeBlog 閱讀(256) |
評論 (0) |
編輯 收藏
在ORACLE 數據庫中有一種方法可以實現級聯查詢
select * //要查詢的字段
from table //具有子接點ID與父接點ID的表
start with selfid=id //給定一個startid(字段名為子接點ID,及開始的ID號)
connect by prior selfid=parentid //聯接條件為子接點等于父接點,不能反
這個SQL主要用于菜單的級聯查詢,給一個父接點可以查出所有的子接點。及子接點的子接點,一查到底,很實用。不過呢這個程序只能在oracle里面用,我目前還不知道在其它數據庫里是怎么調用的。等我找到了,再貼出來與大家分享。
這個程序,估計好多人看不明白,其實放了這么久我也一時沒看明白,重新測了一下,補充說明一下,不然我下次又看不懂了。
以一個windows系統的菜單為例。我那一個這樣的表menu。
說明:
mid:菜單的ID號
mname:菜單名稱
mpid:菜單的
quickey:快捷鍵
validate:權限表(存放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 |
|
|
如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個SQL程序:
select * from menu
start with mid=1
connect by prior mid=mpid;
這樣就可以把 “文件”里的子菜單全部列出來了。當然實際應用不會這么簡單,如附加其實條件,尤其是權限管理,這時根據你的系統要求,是對個個驗證,還是對角色驗證,把這些人的ID放在validate這個字段里,組成一個字符串,N個ID用逗號隔開,(注意,在往數據庫保存時要注意對字符串處理一下,截取掉最后一個逗號這樣可以節省很多麻煩)
select * from menu
where validate in(……)
and mid in(
select mid from menu //這里不能用*號了。
start with mid=1
connect by prior mid=mpid;
)
最后再補充一點關于隨機查詢的代碼
select * from user order by sys_guid()
posted @
2015-03-12 12:04 ForMeBlog 閱讀(1478) |
評論 (0) |
編輯 收藏