關(guān)于HTTP請求超時字段定義
今天遇到調(diào)用encodeURL調(diào)用二次的疑問,雖然之前知道要調(diào)用二次,但是具體不是太清楚里面具體的運(yùn)行過程,這是轉(zhuǎn)載的這個寫的比較詳細(xì),把整個運(yùn)行過程詳細(xì)解讀了一下,非常不錯所以轉(zhuǎn)載過了供其他人分享。
.encodeURL函數(shù)主要是來對URI來做轉(zhuǎn)碼,它默認(rèn)是采用的UTF-8的編碼.
. UTF-8編碼的格式:一個漢字來三個字節(jié)構(gòu)成,每一個字節(jié)會轉(zhuǎn)換成16進(jìn)制的編碼,同時添加上%號.
假設(shè)頁面端輸入的中文是一個“中”,按照下面步驟進(jìn)行解碼
1.第一次encodeURI,按照utf-8方式獲取字節(jié)數(shù)組變成[-28,-72-83],對字節(jié)碼數(shù)組進(jìn)行遍歷,把每個字節(jié)轉(zhuǎn)化成對應(yīng)的16進(jìn)制數(shù),這樣就變成了[E4,B8,AD],最后變成[%E4,%B8,%AD] 此時已經(jīng)沒有了多字節(jié)字符,全部是單字節(jié)字符。
2、第二次encodeURI,進(jìn)行編碼,會把%看成一個轉(zhuǎn)義字符,并不編碼%以后字符,會把%編碼成%25.把數(shù)組最后變成[%25E4,%25B8,%25AD]然后就把處理后的數(shù)據(jù)[%25E4,%25B8,%25AD]發(fā)往服務(wù)器端,
當(dāng)應(yīng)用服務(wù)器調(diào)用getParameter方法,getParameter方法會去向應(yīng)用服務(wù)器請求參數(shù)
應(yīng)用服務(wù)器最初獲得的就是發(fā)送來的[%25E4,%25B8,%25AD],應(yīng)用服務(wù)器會對這個數(shù)據(jù)進(jìn)行URLdecode操作,應(yīng)用服務(wù)器進(jìn)行解碼的這一次,不管是按照UTF-8,還是GBK,還是ISO-8859,,都能得到[%E4,%B8,%AD],因為都會把%25解析成%.并把這個值返回給getParameter方法
3\、再用UTF-8解碼一次,就得到"中"了。
想想看,如果不編碼兩次,當(dāng)服務(wù)器自動解碼的時候,假如是按照ISO-8859去解碼UTF-8編碼的東西,就是會出現(xiàn)亂碼。
JS:
JAVA后臺:
一、概念
Annontation是Java5開始引入的新特征。中文名稱一般叫注解。它提供了一種安全的類似注釋的機(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是不會影響程序代碼的執(zhí)行,無論annotation怎么變化,代碼都始終如一地執(zhí)行。
Java語言解釋器在工作時會忽略這些annotation,因此在JVM 中這些annotation是“不起作用”的,只能通過配套的工具才能對這些annontaion類型的信息進(jìn)行訪問和處理。
Annotation與interface的異同:
1)、Annotation類型使用關(guān)鍵字@interface而不是interface。
這個關(guān)鍵字聲明隱含了一個信息:它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個interface
2)、Annotation類型、方法定義是獨(dú)特的、受限制的。
Annotation 類型的方法必須聲明為無參數(shù)、無異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類型。而方法返回值類型必須為primitive類型、Class類型、枚舉類型、annotation類型或者由前面類型之一作為元素的一維數(shù)組。方法的后面可以使用 default和一個默認(rèn)數(shù)值來聲明成員的默認(rèn)值,null不能作為成員默認(rèn)值,這與我們在非annotation類型中定義方法有很大不同。
Annotation類型和它的方法不能使用annotation類型的參數(shù)、成員不能是generic。只有返回值類型是Class的方法可以在annotation類型中使用generic,因為此方法能夠用類轉(zhuǎn)換將各種類型轉(zhuǎn)換為Class。
3)、Annotation類型又與接口有著近似之處。
它們可以定義常量、靜態(tài)成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實(shí)現(xiàn)或者繼承。
三、應(yīng)用場合
annotation一般作為一種輔助途徑,應(yīng)用在軟件框架或工具中,在這些工具類中根據(jù)不同的 annontation注解信息采取不同的處理過程或改變相應(yīng)程序元素(類、方法及成員變量等)的行為。
例如:Junit、Struts、Spring等流行工具框架中均廣泛使用了annontion。使代碼的靈活性大提高。
四、常見標(biāo)準(zhǔn)的Annotation
從java5版本開始,自帶了三種標(biāo)準(zhǔn)annontation類型,
?。?span style="font-family: DejaVu Serif, serif" face="DejaVu Serif, serif">1)、Override
java.lang.Override 是一個marker annotation類型,它被用作標(biāo)注方法。它說明了被標(biāo)注的方法重載了父類的方法,起到了斷言的作用。如果我們使用了這種annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。
這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時加一個保障性的校驗過程。
(2)、Deprecated
Deprecated也是一種marker annotation。當(dāng)一個類型或者類型成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標(biāo)注的程序元素。所以使用這種修飾具有一定的 “延續(xù)性”:如果我們在代碼中通過繼承或者覆蓋的方式使用了這個過時的類型或者成員,雖然繼承或者覆蓋后的類型或者成員并不是被聲明為 @Deprecated,但編譯器仍然要報警。
注意:@Deprecated這個annotation類型和javadoc中的 @deprecated這個tag是有區(qū)別的:前者是java編譯器識別的,而后者是被javadoc工具所識別用來生成文檔(包含程序成員為什么已經(jīng)過時、它應(yīng)當(dāng)如何被禁止或者替代的描述)。
?。?span style="font-family: DejaVu Serif, serif" face="DejaVu Serif, serif">3)、SuppressWarnings
此注解能告訴Java編譯器關(guān)閉對類、方法及成員變量的警告。
有時編譯時會提出一些警告,對于這些警告有的隱藏著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對。又由于成員值是一個數(shù)組,故使用大括號來聲明數(shù)組值。
注意:我們可以在下面的情況中縮寫annotation:當(dāng)annotation只有單一成員,并成員命名為"value="。這時可以省去"value="。比如將上面的SuppressWarnings annotation進(jìn)行縮寫:
代碼:
@SuppressWarnings({"unchecked","fallthrough"})
如果SuppressWarnings所聲明的被禁止警告?zhèn)€數(shù)為一個時,可以省去大括號:
@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類,運(yùn)行了@Description和@Author注解。
清單3:AnalysisAnnotation.java
package com.magc.annotation;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
/**
* 在運(yùn)行時分析處理annotation類型的信息
*
*
*/
public static void main(String[] args) {
try {
//通過運(yùn)行時反射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配套的基礎(chǔ)框架或工具類,通過此類來獲得與普通Java類Utility.java關(guān)聯(lián)的信息,即描述和作者。
運(yùn)行AnalysisAnnotation,輸出結(jié)果為:
Utility's Description--->這是一個有用的工具類
Utility's Author--->haoran_202 from com.magc
mid | mname | mpid | quickey | validate |
1 | 文件 | ctrl+f | 1,2,3,4,11,23,45 | |
2 | 編輯 | ctrl+e | ||
3 | 新建 | 1 | alt+w | |
4 | 文件夾 | 3 |
|
今天看到某網(wǎng)友關(guān)于“如何以Java實(shí)現(xiàn)網(wǎng)頁截圖技術(shù)”的咨詢帖,由于出現(xiàn)該咨詢的地點(diǎn)非常不適合較長回復(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)勢:簡單易用,不需要任何第三方插件。
缺點(diǎn):不能同時處理大量數(shù)據(jù),技術(shù)含量過低,屬于應(yīng)急型技巧。
實(shí)現(xiàn)方法:使用如下代碼即可
2、最常規(guī)的方式——利用JNI,調(diào)用第三方C/C++組件
方法詳解:目前來講,Java領(lǐng)域?qū)τ诰W(wǎng)頁截圖組件的開發(fā)明顯不足(商機(jī)?),當(dāng)您需要完成此種操作時,算得上碰到了Java的軟肋。但是,眾所周知Java也擁有強(qiáng)大的JNI能力,可以輕易將C/C++開發(fā)的同類組件引為己用。
優(yōu)勢:實(shí)現(xiàn)簡單,只需要封裝對應(yīng)的DLL文件,就可以讓Java實(shí)現(xiàn)同類功能。
劣勢:同其他JNI實(shí)現(xiàn)一樣,在跨平臺時存在隱患,而且您的程序?qū)⒉辉賹儆诩僇ava應(yīng)用。
實(shí)現(xiàn)方法:可參見此用例,具體封裝何種C/C++組件請自行選擇。
PS:示例來源于ACA HTML to Image Converter項目(http://www.acasystems.com/en/web-thumb-activex/faq-convert-html-to-image-in-java.htm ),這是一個收費(fèi)的HTML轉(zhuǎn)Image第三方組件,但封裝方式在Java中大同小異。
引用JNI封裝:
CPP部分的實(shí)現(xiàn):
以該組件圖像化yahoo界面的效果圖:
3、最扎實(shí)的方法——自行解析HTML標(biāo)記,并將其圖像化
方法詳解:眾所周知,HTML之所以在瀏覽器中以具體的網(wǎng)頁格式出現(xiàn),并非服務(wù)器端傳了一整個應(yīng)用到客戶端,而是源自于瀏覽器對于客戶端自行解析的結(jié)果。因此,只要我們將對應(yīng)的解析一一實(shí)現(xiàn),那么將網(wǎng)頁圖形化,就將不是什么難事。
優(yōu)勢:純Java實(shí)現(xiàn),一勞永逸,一旦開發(fā)完成則永遠(yuǎn)通用,而且有一定的商用價值。
劣勢:開發(fā)費(fèi)時,且需要針對不同語法做精確分析,才能保證輸出的基本正確。尤其在涉及到JavaScript解析時,難度將尤其增大。
實(shí)現(xiàn)方法:目前尚無具體案例可供參考。但是,由于Java有jdic之類的瀏覽器項目存在(https://jdic.dev.java.net/ ),而Java圖形界面又屬繪制生成。從理論上說,我們可以將所有具備Graphics的組件圖形化保存。
而如果自行解析,那么您需要建立HTML解析器(或使用第三方的,萬幸Java在這方面的組件很多),了解Java2D機(jī)制,了解何時該使用drawString繪制文字,何時又該使用drawImage插入圖片等等。
補(bǔ)充:
這是一個利用內(nèi)置瀏覽器截圖的示例,使用了DJNativeSwing組件。
示例工程下載地址(Eclipse工程,含lib):http://greenvm.googlecode.com/files/Screenshot.7z