锘??xml version="1.0" encoding="utf-8" standalone="yes"?> and the compilation unit: This example illustrates six points:
鍛靛懙錛屾垜鏄病鏈夎兘澶熷叏閮ㄧ瓟瀵?/p>
鍙﹀涓綃囧叧浜嶴tring intern鐨勬枃绔狅細(xì) http://laiseeme.javaeye.com/blog/102442package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
package other;
public class Other { static String hello = "Hello"; } 姝g‘絳旀錛歵rue true true true false true
String
object (§4.3.1).
String
object.
String
object.
]]>
浣滆咃細(xì)鏉ヨ嚜ITPUB璁哄潧 2008-01-24
鍚戝ぇ瀹朵粙緇嶄竴縐嶅緢涓嶉敊錛屼篃鏄疞inux涓殑鏉冮檺綆$悊綆楁硶銆?
銆銆瀹氫箟a^b涓猴細(xì)a鐨刡嬈℃柟
銆銆鍋囧錛屾垜浠負(fù)姣忎竴涓搷浣滆瀹氫竴涓敮涓鐨勬暣鏁板鹼紝姣斿錛?/p>
銆銆鍒犻櫎A---0
銆銆淇敼A---1
銆銆娣誨姞A---2
銆銆鍒犻櫎B---3
銆銆淇敼B---4
銆銆娣誨姞B---5
銆銆銆傘傘?/p>
銆銆鐞嗚涓婂彲浠ユ湁N涓搷浣滐紝榪欏彇鍐充簬浣犵敤浜庡偍瀛樼敤鎴鋒潈闄愬肩殑鏁版嵁綾誨瀷浜嗐?/p>
銆銆榪欐牱錛屽鏋滅敤鎴鋒湁鏉冮檺錛氭坊鍔燗---2;鍒犻櫎B---3;淇敼B---4
銆銆閭g敤鎴風(fēng)殑鏉冮檺鍊?purview =2^2+2^3+2^4=28錛屼篃灝辨槸2鐨勬潈鐨勫拰浜?/p>
銆銆鍖栨垚浜岃繘鍒跺彲浠ヨ〃紺轟負(fù)11100
銆銆濡傛灉瑕侀獙璇佺敤鎴鋒槸鍚︽湁鍒犻櫎B鐨勬潈闄愶紝灝卞彲浠ラ氳繃浣嶄笌榪愮畻鏉ュ疄鐜般?/p>
銆銆鍦↗ava閲岋紝浣嶄笌榪愮畻榪愮畻絎﹀彿涓?amp;
銆銆鍗蟲槸錛歩nt value = purview &((int)Math.pow(2,3));
銆銆浣犱細(xì)鍙戠幇錛屽綋鐢ㄦ埛鏈夋搷浣滄潈闄愭椂錛岃繍綆楀嚭鏉ョ殑緇撴灉閮戒細(xì)絳変簬榪欎釜鎿嶄綔闇瑕佺殑鏉冮檺鍊?
銆銆鍘熺悊錛?/p>
銆銆浣嶄笌榪愮畻錛岄【鍚嶆濅箟灝辨槸瀵逛綅榪涜涓庤繍綆楋細(xì)
銆銆浠ヤ笂闈㈢殑寮忓瓙涓轟緥錛歱urview & 2^3 涔熷氨鏄28&8
銆銆灝嗗畠浠寲鎴愪簩榪涘埗鏈?/p>
銆銆11100
銆銆& 01000
銆銆-------------------
銆銆01000 == 8(鍗佽繘鍒?銆==銆2^3
銆銆鍚岀悊錛屽鏋滆楠岃瘉鏄惁鏈夊垹闄---0鐨勬潈闄?/p>
銆銆鍙互鐢細(xì)purview &((int)Math.pow(2,0));
銆銆鍗籌細(xì)
銆銆11100
銆銆& 00001
銆銆------------------------
銆銆00000 == 0(鍗佽繘鍒?銆銆!=銆2^0
銆銆榪欑綆楁硶鐨勪竴涓紭鐐規(guī)槸閫熷害蹇傚彲浠ュ悓鏃跺鐞哊涓潈闄愶紝璁劇疆N縐嶈鑹?
銆銆濡傛灉鎯抽獙璇佹槸鍚﹀悓鏃舵湁鍒犻櫎A---0鍜屽垹闄---3鐨勬潈闄?/p>
銆銆鍙互鐢╬urview&(2^0+2^3)==(2^0+2^3)?true:false;
銆銆璁劇疆澶氳鑹茬敤鎴楓傛牴鎹潈闄愬煎垽鏂敤鎴風(fēng)殑瑙掕壊銆傘傘?/p>
銆銆涓嬮潰鎻愪緵涓涓猨ava鐨勫崟鎿嶄綔鏉冮檺鍒ゆ柇鐨勪唬鐮侊細(xì)
銆銆//userPurview鏄敤鎴峰叿鏈夌殑鎬繪潈闄?br /> //optPurview鏄竴涓搷浣滆姹傜殑鏉冮檺涓轟竴涓暣鏁?娌℃湁緇忚繃鏉冪殑!)
public static boolean checkPower(int userPurview, int optPurview){
int purviewValue = (int)Math.pow(2, optPurview);
return (userPurview & purviewValue) == purviewValue;
}
銆銆褰撶劧錛屽鏉冮檺鐨勯獙璇佸彧瑕佹墿灞曚竴涓嬪氨鍙互浜嗐?/p>
銆銆鍑犵偣娉ㄦ剰浜嬮」錛氶鍏堬紝涓涓郴緇熷彲鑳芥湁寰堝鐨勬搷浣滐紝鍥犳錛岃寤虹珛鏁版嵁瀛楀吀錛屼互渚挎煡闃咃紝淇敼鏃朵嬌鐢ㄣ傚叾嬈★紝濡傛灉鐢ㄦ暟鎹簱鍌ㄥ瓨鐢ㄦ埛鏉冮檺錛岃娉ㄦ剰鏁板肩殑 鏈夋晥鑼冨洿銆傛搷浣滄潈闄愬艱鐢ㄥ敮涓鐨勬暣鏁?Java鐨刬nt綾誨瀷鏈澶氬彲浠ュ偍瀛?1涓潈闄愬拰.濡傛灉瓚呰繃錛屽彲浠ラ夋嫨鍏跺畠鏁版嵁綾誨瀷錛岃屼笖寤鴻涓嶅悓妯″潡錛屼嬌鐢ㄥ涓潈闄? 鍙橀噺.
鐢變簬涓嶅悓鐨勬満鍣ㄥ浜?strong>澶氬瓧鑺傛暟鎹?int 灝辨槸閲囩敤4涓猙yte淇濆瓨鏁版嵁錛?/strong>鐨勫瓨鍌ㄦ柟寮忎笉鍚?鍙兘鏄?浣庡瓧鑺傚悜楂樺瓧鑺傚瓨鍌?涔熷彲鑳芥槸浠庨珮瀛楄妭鍚戜綆瀛楄妭瀛樺偍,榪欐牱,鍦?鍒嗘瀽緗戠粶鍗忚鎴栨枃浠舵牸鏃?/strong>,涓轟簡瑙e喅涓嶅悓鏈哄櫒涓婄殑瀛楄妭瀛樺偍欏哄簭闂,鐢╞yte綾誨瀷鏉ヨ〃紺烘暟鎹槸鍚堥傜殑銆?strong>鑰岄氬父鎯呭喌涓?鐢變簬鍏惰〃紺虹殑鏁版嵁鑼冨洿寰堝皬,瀹規(guī)槗閫犳垚婧㈠嚭,搴旈伩鍏嶄嬌鐢ㄣ?/strong>
/**
* Convert an int to a byte array
*
* @param value int
* @return byte[]
*/
public static byte[] intToByteArray(int value) {
byte[] b = new byte[4];
// 浣跨敤4涓猙yte琛ㄧずint
for (int i = 0; i < 4; i++) {
int offset = (b.length - 1 - i) * 8; // 鍋忕Щ閲?br> b[i] = (byte) ((value >> offset) & 0xFF); //姣忔鍙?bit
}
return b;
}
/**
* Convert the byte array to an int starting from the given offset.
*
* @param b The byte array
* @param offset The array offset,濡傛灉byte鏁扮粍闀垮害灝辨槸4錛屽垯璇ュ間負(fù)0
* @return The integer
*/
public static int byteArrayToInt(byte[] b, int offset) {
int value = 0;
for (int i = 0; i < b.length; i++) {
int shift = (b.length - 1 - i) * 8;
value += (b[i + offset] & 0xFF) << shift;
}
return value;
}
public static void main(String[] args) {
byte[] bb=intToByteArray(255);
for(int i=0;i<bb.length;i++){
System.out.println(bb[i]);
}
}
杈撳嚭緇撴灉錛?/p>
0
0
0
-1
榪欐槸琛ョ爜鐨勫艦寮忥紙10000001錛夛紝鍙栧弽鍔?鍙互寰楀埌婧愮爜錛?1111111錛?
byte
data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte
data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int
where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation. short
data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with byte
, the same guidelines apply: you can use a short
to save memory in large arrays, in situations where the memory savings actually matters. int
data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive). For integral values, this data type is generally the default choice unless there is a reason (like the above) to choose something else. This data type will most likely be large enough for the numbers your program will use, but if you need a wider range of values, use long
instead. long
data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive). Use this data type when you need a range of values wider than those provided by int
. float
data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section 4.2.3 of the Java Language Specification. As with the recommendations for byte
and short
, use a float
(instead of double
) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead. Numbers and Strings covers BigDecimal
and other useful classes provided by the Java platform. double
data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section 4.2.3 of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency. boolean
data type has only two possible values: true
and false
. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined. char
data type is a single 16-bit Unicode character. It has a minimum value of '\u0000'
(or 0) and a maximum value of '\uffff'
(or 65,535 inclusive).
綾誨瀷鍚嶇О |
綾誨瀷瀹氫箟 | 綾誨瀷鍙栧?/strong> |
boolean | 甯冨皵鍊?/td> | true, false |
byte | 8浣?strong>鏈夌鍙鋒暣鏁?/strong> | 鏈灝忓?128錛屾渶澶у?27 |
short | 16浣?strong>鏈夌鍙鋒暣鏁?/strong> |
鏈灝忓?32768錛?215錛夛紝鏈澶у?2767錛?15-1錛?/p> |
int | 32浣?strong>鏈夌鍙鋒暣鏁?/strong> | 鏈灝忓?2147483648錛?231錛夛紝鏈澶у?147483647錛?31-1錛?/td> |
long | 64浣?strong>鏈夌鍙鋒暣鏁?/strong> |
-263~(263-1) |
float | 32浣嶆誕鐐規(guī)暟 |
1.4E-45~3.4028235E38 |
double | 64浣嶆誕鐐規(guī)暟 | 4.9E-324~1.7976931348623157E308 |
char | 16浣峌nicode瀛楃 | |
鍙栧弽錛?/strong>~x 涓庢搷浣滐細(xì)AND x & y 鎴栨搷浣滐細(xì)OR 寮傛垨鎿嶄綔錛歑OR 宸︾Щ鎿嶄綔錛歋hift left 灝唜宸︾Щy浣嶏紝縐誨姩榪囩▼涓紝楂樹綅浼?xì)涓㈠? 鏈夌鍙鋒暟鍙崇Щ鎿嶄綔錛歋hift Right - Signed 鏃犵鍙鋒暟鍙崇Щ錛歋hift Right - Unsigned 涓嬮潰鐨勪緥瀛愭樉紺哄浣曞皢涓涓猧nt鏁扮粍閫氳繃縐諱綅鎿嶄綔鍘嬬緝鍒頒竴涓猧nt鍐呬繚瀛橈紝鍏跺師鐞嗘槸鍦╦ava璇█涓紝int綾誨瀷浣跨敤4 bytes鏉ヤ繚瀛橈紝鍥犳瀵逛簬闇瑕佸帇緙╃殑int鏁扮粍錛屽叾涓殑姣忎竴涓猧nt鍊肩殑澶у皬涓嶈兘瓚呰繃255錛?鐨?嬈℃柟-1錛夛紝鍥犳榪欏彧鏄竴涓疄渚嬶細(xì) int [] aRGB = {0x56, 0x78, 0x9A, 0xBC}; // 鏄敤16榪涘埗淇濆瓨鐨?縐嶉鑹插?br> int color_val = aRGB[3]; 鎿嶄綔瀹岀殑緇撴灉鏄?6 78 9A BC 濡傛灉瑕佷粠colorVal 榪樺師涓篿nt鏁扮粍錛屾垨鑰呭緱鍒版暟緇勪腑鐨勬煇涓鹼紝鍙渶瑕佸colorVal 榪涜鐩稿簲鐨勫彸縐繪搷浣滃嵆鍙細(xì) int alpha_val = (colorVal >>> 24) & 0xFF; 鍙傝冭祫鏂欙細(xì)
- flips each bit to the opposite value.
- AND operation between the corresponding bits in x and y.
x | y
- OR operation between the corresponding bits in x and y.
x ^ y
- XOR operation between the corresponding bits in x and y.
x << y
- shifts x to the left by y bits. The high order bits are lost while zeros fill the right bits.
x >> y
- shifts x to the right by y bits. The low order bits are lost while the sign bit value (0 for positive numbers, 1 for negative) fills in the left bits.
x >>> y
- shifts x to the right by y bits. The low order bits are lost while zeros fill in the left bits regardless of the sign. 渚嬪瓙錛?/strong>
color_val = color_val | (aRGB[2] << 8); // 涓轟簡鍘嬬緝錛岄渶瑕佹斁緗埌color_val鍊肩殑絎簩涓瓧鑺備綅緗笂錛氬皢aRGB[2] 宸︾Щ鍒扮浜屼釜byte錛屽悓鏃朵笌color_val榪涜鎴栨搷浣滐紝涓嬮潰鍚岀悊
color_val = color_val | (aRGB[1] << 16);
color_val = color_val | (aRBG[0] << 24);
int red_val = (colorVal >>> 16) & 0xFF;
int green_val = (colorVal >>> 8) & 0xFF;
int blue_val = colorVal & 0xFF;
]]>
http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml
PA浣滀負(fù)涓欏瑰璞℃寔涔呭寲鐨勬爣鍑嗭紝涓嶄絾鍙互鑾峰緱Java EE搴旂敤鏈嶅姟鍣ㄧ殑鏀寔錛岃繕鍙互鐩存帴鍦↗ava SE涓嬌鐢ㄣ?/p>
浠嬬粛寰楀緢娓呮鐨勬枃绔?/p>
JPA姒傝堪
JPA(Java Persistence API)浣滀負(fù)Java EE 5.0騫沖彴鏍囧噯鐨凮RM瑙勮寖錛屽皢寰楀埌鎵鏈塉ava EE鏈嶅姟鍣ㄧ殑鏀寔銆係un榪欐鍚稿彇浜嗕箣鍓岴JB瑙勮寖鎯ㄧ棝澶辮觸鐨勭粡鍘嗭紝鍦ㄥ厖鍒嗗惛鏀剁幇鏈塐RM妗嗘灦鐨勫熀紜涓婏紝寰楀埌浜嗕竴涓槗浜庝嬌鐢ㄣ佷幾緙╂у己鐨凮RM瑙勮寖銆備粠鐩墠鐨勫紑鍙戠ぞ鍖虹殑鍙嶅簲涓婄湅錛孞PA鍙楀埌浜嗘瀬澶х殑鏀寔鍜岃禐鎵紝JPA浣滀負(fù)ORM棰嗗煙鏍囧噯鍖栨暣鍚堣呯殑鐩爣搴旇涓嶉毦瀹炵幇銆?nbsp;
JPA閫氳繃JDK 5.0娉ㄨВ鎴朮ML鎻忚堪瀵硅薄錛嶅叧緋昏〃鐨勬槧灝勫叧緋伙紝騫跺皢榪愯鏈熺殑瀹炰綋瀵硅薄鎸佷箙鍖栧埌鏁版嵁搴撲腑錛屽浘 1寰堝ソ鍦版弿榪頒簡JPA鐨勭粨鏋勶細(xì)
Sun寮曞叆鏂扮殑JPA ORM瑙勮寖鍑轟簬涓や釜鍘熷洜錛氬叾涓錛岀畝鍖栫幇鏈塉ava EE鍜孞ava SE搴旂敤鐨勫璞℃寔涔呭寲鐨勫紑鍙戝伐浣滐紱鍏朵簩錛孲un甯屾湜鏁村悎瀵筄RM鎶鏈紝瀹炵幇澶╀笅褰掍竴銆?nbsp;
JPA鐢盓JB 3.0杞歡涓撳緇勫紑鍙戯紝浣滀負(fù)JSR-220瀹炵幇鐨勪竴閮ㄥ垎銆備絾瀹冧笉鍥夸簬EJB 3.0錛屼綘鍙互鍦╓eb搴旂敤銆佺敋鑷蟲闈㈠簲鐢ㄤ腑浣跨敤銆侸PA鐨勫畻鏃ㄦ槸涓篜OJO鎻愪緵鎸佷箙鍖栨爣鍑嗚鑼冿紝鐢辨鍙錛岀粡榪囪繖鍑犲勾鐨勫疄璺墊帰绱紝鑳藉鑴辯瀹瑰櫒鐙珛榪愯錛屾柟渚垮紑鍙戝拰嫻嬭瘯鐨勭悊蹇靛凡緇忔繁鍏ヤ漢蹇冧簡銆傜洰鍓岺ibernate 3.2銆乀opLink 10.1.3浠ュ強(qiáng)OpenJpa閮芥彁渚涗簡JPA鐨勫疄鐜般?
JPA鐨勬諱綋鎬濇兂鍜岀幇鏈塇ibernate銆乀opLink錛孞DO絳塐RM妗嗘灦澶т綋涓鑷淬傛葷殑鏉ヨ錛孞PA鍖呮嫭浠ヤ笅3鏂歸潰鐨勬妧鏈細(xì)
涓轟簡澶囦喚blog錛岀畝鍗曞啓浜嗕竴涓傜敤浜巄logjava絳塵etaWeblog鐨刡log澶囦喚宸ュ叿錛屽姛鑳斤細(xì)
錛?錛夊浠絧ost鐨勬鏂囧埌鏈湴
錛?錛夊浠芥鏂囦腑鐨勫浘鐗囥乧ss鏂囦歡鍒版湰鍦?/p>
錛?錛夊熀浜庝互涓婁袱鐨勬楠わ紝淇敼鐩稿叧鐨勯摼鎺ワ紝瀹炵幇鏈湴鑴辨満嫻忚
鎯沖埌浜嗕絾鏄湭瀹炵幇鐨勫姛鑳斤細(xì)
錛?錛夎瘎璁烘棤娉曚繚瀛?/p>
錛?錛夊悎閫傜殑璇濆彲浠ヨ冭檻浠clipes RCP褰㈠紡鍖呰
錛?錛夎幏鍙杙ost鐨勬柟娉曪細(xì)浣跨敤MetaWeblog鎻愪緵鐨凙PI鎺ュ彛
metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) returns array of structs,
Each struct represents a recent weblog post, containing the same information that a call to metaWeblog.getPost would return.
If numberOfPosts is 1, you get the most recent post. If it's 2 you also get the second most recent post, as the second array element. If numberOfPosts is greater than the number of posts in the weblog you get all the posts in the weblog.
(2) 浣跨敤姝e垯琛ㄨ揪寮忓垎鏋愯幏鍙栦笅鏉ョ殑post錛岃В鏋愬嚭post涓寘鍚殑css鍜屽浘鐗囨枃浠剁殑鍦板潃錛屾墽琛屼袱姝ユ搷浣?/p>
(3) 浣跨敤xml-rpc鏉ョ畝鍖栬繙紼嬭皟鐢ㄨ繃紼嬬殑緙栫▼
Java's java.util.regex 鍖呭寘鎷細(xì)Pattern綾匯丮atcher綾匯丮atchResult鎺ュ彛鍜孭atternSyntaxException寮傚父錛?/p>
character sequence
by interpreting a Pattern
. 鍚屾椂榪橀渶瑕佷簡瑙f槸CharSequence錛孞DK 1.4瀹氫箟鐨勬柊鐨勬帴鍙o紝瀹冩彁渚涗簡String鍜孲tringBuffer榪欎袱涓被鐨勫瓧絎﹀簭鍒楃殑鎶借薄
interface CharSequence {
charAt(int i);
length();
subSequence(int start, int end);
toString();
}
涓轟簡瀹炵幇榪欎釜鏂扮殑CharSequence鎺ュ彛錛孲tring錛孲tringBuffer浠ュ強(qiáng)CharBuffer閮戒綔浜嗕慨鏀癸紝寰堝鐨勬鍒欒〃杈懼紡鐨勬搷浣滈兘瑕佹嬁CharSequence浣滃弬鏁般?
Group鏄寚閲岀敤鎷彿鎷搗鏉ョ殑錛岃兘琚悗闈㈢殑琛ㄨ揪寮忚皟鐢ㄧ殑姝e垯琛ㄨ揪寮忋?/p>
Group 0 琛ㄧず鏁翠釜琛ㄨ揪寮忥紝group 1琛ㄧず絎竴涓鎷搗鏉ョ殑group錛屼互姝ょ被鎺ㄣ傛墍浠ワ紱
A(B(C))D
閲岄潰鏈変笁涓猤roup錛歡roup 0鏄疉BCD錛?group 1鏄疊C錛実roup 2鏄疌銆?
浣犲彲浠ョ敤涓嬭堪Matcher鏂規(guī)硶鏉ヤ嬌鐢╣roup錛?
浣跨敤group鍙互鍋氬埌閫愭緙╁皬鍖歸厤鐨勮寖鍥達(dá)紝鐩磋嚦綺劇‘鍖歸厤鐨勭洰鐨勩?
start( )鍜宔nd( )錛氬鏋滃尮閰嶆垚鍔燂紝start( )浼?xì)杩斿洖姝啤鍖归厤鐨勫紑濮嬩綅緗紝end( )浼?xì)杩斿洖姝啤鍖归厤鐨劸l撴潫浣嶇疆錛屽嵆鏈鍚庝竴涓瓧絎︾殑涓嬫爣鍔犱竴銆傚鏋滀箣鍓嶇殑鍖歸厤涓嶆垚鍔?鎴栬呮病鍖歸厤)錛岄偅涔堟棤璁烘槸璋冪敤start( )榪樻槸end( )錛岄兘浼?xì)寮曞彂涓涓狪llegalStateException銆?/p>
String str="abc efg ABC";
String regEx="a|f"; //琛ㄧずa鎴杅
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher(str);
boolean rs=m.find();
濡傛灉str涓湁regEx錛岄偅涔坮s涓簍rue錛屽惁鍒欎負(fù)flase銆傚鏋滄兂鍦ㄦ煡鎵炬椂蹇界暐澶у皬鍐欙紝鍒欏彲浠ュ啓鎴怭attern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
String regEx=".+\\\\(.+)$";
String str="c:\\dir1\\dir2\\name.txt";
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher(str);
boolean rs=m.find();
for(int i=1;i<=m.groupCount();i++){
System.out.println(m.group(i));
}
浠ヤ笂鐨勬墽琛岀粨鏋滀負(fù)name.txt錛屾彁鍙栫殑瀛楃涓插偍瀛樺湪m.group(i)涓紝鍏朵腑i鏈澶у間負(fù)m.groupCount();
String regEx="::";
Pattern p=Pattern.compile(regEx);
String[] r=p.split("xd::abc::cde");
鎵ц鍚庯紝r灝辨槸{"xd","abc","cde"}錛屽叾瀹炲垎鍓叉椂榪樻湁璺熺畝鍗曠殑鏂規(guī)硶錛?
String str="xd::abc::cde";
String[] r=str.split("::");
String regEx="a+"; //琛ㄧず涓涓垨澶氫釜a
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher("aaabbced a ccdeaa");
String s=m.replaceAll("A");
緇撴灉涓?Abbced A ccdeA"
濡傛灉鍐欐垚絀轟覆錛屾棦鍙揪鍒板垹闄ょ殑鍔熻兘錛屾瘮濡傦細(xì)
String s=m.replaceAll("");
緇撴灉涓?bbced ccde"
涓嬮潰鐨勫嚱鏁版槸涓涓疄闄呭簲鐢ㄧ殑渚嬪瓙錛岄渶姹傛槸闇瑕佸皢鎶撳彇鐨勭綉欏典腑鐨?lt;img src=''http://aa.bb.cc.com/images/**.jpg"> 涓殑鍦板潃錛屼繚瀛樺埌涓涓湴鍧鍒楄〃涓紙浠ヤ緵鎶撳彇鍥劇墖浣跨敤錛夛紝騫跺皢緇濆鍦板潃鏇挎崲鎴愭湰鍦扮殑鐩稿鍦板潃錛屽嵆<img src="images/**.jpg">銆?/p>
public static Map<String, String> getImagesURL(String description) {
Map<String, String> map = new HashMap<String, String>();
// img 鐨勬鍒欒〃杈懼紡:鍖歸厤<img>鏍囩
String imgPattern = "<\\s*img\\s+([^>]+)\\s*>";
Pattern pattern1 = Pattern.compile(imgPattern, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern1.matcher(description);
// img src鍏冪礌鐨勬鍒欒〃杈懼紡錛氬尮閰峣mg鏍囩鍐呯殑src灞炴?br />
String srcPattern = "\\s*src\\s*=\\s*\"([^\"]+)\\s*\"";
Pattern pattern2 = Pattern.compile(srcPattern, Pattern.CASE_INSENSITIVE);
while (matcher.find()) {
//group()榪斿洖絎﹀悎琛ㄨ揪寮忕殑鍐呭
Matcher matcher2 = pattern2 .matcher(matcher.group());
// 涓瀹氳find(),榪欐槸瀹為檯鐨勫尮閰嶅姩浣?br />
if (matcher2.find()) {
String src = matcher2.group();
log.info(src);
int i2 = src.lastIndexOf('/');
int i1 = src.indexOf("http");
if (i1 != -1) {
map.put(src.substring(i2 + 1, src.length() - 1), src
.substring(i1, src.length() - 1));
}
}
}
log.debug("鍥劇墖錛? + map);
return map;
}
鏁翠綋鎬濊礬鏄厛鍖歸厤鍒癷mg鏍囩錛岀劧鍚庡尮閰峴rc灞炴э紝騫朵慨鏀箂rc鐨勫睘鎬?/p>
"<\\s*img\\s+([^>]+)\\s*>" 鐨勮В閲婏細(xì)
\\s* :0 鎴栧涓┖鏍?nbsp; \\s+: 鑷沖皯涓涓┖鏍?/p>
([^>]+)錛氭寚鐨勬槸闈?gt;鐨勬墍鏈夌殑瀛楃錛岃嚦灝戜竴涓?/p>
瀛楃闆嗙被
. 琛ㄧず浠繪剰涓涓瓧絎?
[abc] 琛ㄧず瀛楃a錛宐錛宑涓殑浠繪剰涓涓?涓巃|b|c鐩稿悓)
[^abc] 闄錛宐錛宑涔嬪鐨勪換鎰忎竴涓瓧絎?鍚﹀畾)
[a-zA-Z] 浠巃鍒皕鎴朅鍒癦褰撲腑鐨勪換鎰忎竴涓瓧絎?鑼冨洿)
[abc[hij]] a,b,c,h,i,j涓殑浠繪剰涓涓瓧絎?涓巃|b|c|h|i|j鐩稿悓)(騫墮泦)
[a-z&&[hij]] h,i,j涓殑涓涓?浜ら泦)
\s 絀烘牸瀛楃(絀烘牸閿? tab, 鎹㈣, 鎹㈤〉, 鍥炶濺)
\S 闈炵┖鏍煎瓧絎?[^\s])
\d 涓涓暟瀛楋紝涔熷氨鏄痆0-9]
\D 涓涓潪鏁板瓧鐨勫瓧絎︼紝涔熷氨鏄痆^0-9]
\w 涓涓崟璇嶅瓧絎?word character)錛屽嵆[a-zA-Z_0-9]
\W 涓涓潪鍗曡瘝鐨勫瓧絎︼紝[^\w]
瀛楃綾伙細(xì)
B 瀛楃B
\xhh 16榪涘埗鍊?xhh鎵琛ㄧず鐨勫瓧絎?
\uhhhh 16榪涘埗鍊?xhhhh鎵琛ㄧず鐨刄nicode瀛楃
\t Tab
\n 鎹㈣絎?
\r 鍥炶濺絎?
\f 鎹㈤〉絎?
\e Escape
閫昏緫榪愮畻絎?/strong>
XY X 鍚庨潰璺熺潃 Y
X|Y X鎴朰
(X) 涓涓?瑕佸尮閰嶇殑緇?capturing group)". 浠ュ悗鍙互鐢╘i鏉ヨ〃紺虹i涓鍖歸厤鐨勭粍銆?
杈圭晫鍖歸厤絎?/strong>
^ 涓琛岀殑寮濮?
$ 涓琛岀殑緇撳熬
\b 涓涓崟璇嶇殑杈圭晫
\B 涓涓潪鍗曡瘝鐨勮竟鐣?
\G 鍓嶄竴涓尮閰嶇殑緇撴潫
鏁伴噺琛ㄧず絎?/strong>
"鏁伴噺琛ㄧず絎?quantifier)"鐨勪綔鐢ㄦ槸瀹氫箟妯″紡搴旇鍖歸厤澶氬皯涓瓧絎︺?
Greedy Reluctant Possessive 鍖歸厤
X? X?? X?+ 鍖歸厤涓涓垨闆朵釜X
X* X*? X*+ 鍖歸厤闆舵垨澶氫釜X
X+ X+? X++ 鍖歸厤涓涓垨澶氫釜X
X{n} X{n}? X{n}+ 鍖歸厤姝eソn涓猉
X{n,} X{n,}? X{n,}+ 鍖歸厤鑷沖皯n涓猉
X{n,m} X{n,m}? X{n,m}+ 鍖歸厤鑷沖皯n涓紝鑷沖m涓猉
瑕佹兂榪涗竴姝ュ涔?fàn)姝e垯琛ㄨ緫旨忓Q屽緩璁湅Mastering Regular Expression, 2nd Edition錛屼綔鑰匤effrey E. F. Friedl (O’Reilly, 2002)銆?
"Regular Expressions and the Java Programming Language," Dana Nourie and Mike McCloskey (Sun Microsystems, August 2002) presents a brief overview of java.util.regex, including five illustrative regex-based applications:
http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/
http://www.tkk7.com/beike/archive/2006/04/28/43832.html
http://wcjok.bokee.com/4293762.html
http://www.xd-tech.com.cn/blog/article.asp?id=34
涓鑸殑鎯呭喌涓嬫垜浠兘鏄嬌鐢↖E鎴栬匩avigator嫻忚鍣ㄦ潵璁塊棶涓涓猈EB鏈嶅姟鍣紝鐢ㄦ潵嫻忚欏甸潰鏌ョ湅淇℃伅鎴栬呮彁浜や竴浜涙暟鎹瓑絳夈傛墍璁塊棶鐨勮繖浜涢〉闈㈡湁鐨勪粎浠呮槸涓浜涙櫘閫氱殑欏甸潰錛屾湁鐨勯渶瑕佺敤鎴風(fēng)櫥褰曞悗鏂瑰彲浣跨敤錛屾垨鑰呴渶瑕佽璇佷互鍙?qiáng)鏄竴浜涢氳繃鍔犲瘑鏂瑰紡浼犺緭錛屼緥濡侶TTPS銆傜洰鍓嶆垜浠嬌鐢ㄧ殑嫻忚鍣ㄥ鐞嗚繖浜涙儏鍐甸兘涓嶄細(xì)鏋勬垚闂銆備笉榪囦綘鍙兘鍦ㄦ煇浜涙椂鍊欓渶瑕侀氳繃紼嬪簭鏉ヨ闂繖鏍風(fēng)殑涓浜涢〉闈紝姣斿浠庡埆浜虹殑緗戦〉涓滃伔鈥濅竴浜涙暟鎹紱鍒╃敤鏌愪簺绔欑偣鎻愪緵鐨勯〉闈㈡潵瀹屾垚鏌愮鍔熻兘錛屼緥濡傝鎴戜滑鎯崇煡閬撴煇涓墜鏈哄彿鐮佺殑褰掑睘鍦拌屾垜浠嚜宸卞張娌℃湁榪欐牱鐨勬暟鎹紝鍥犳鍙ソ鍊熷姪鍏朵粬鍏徃宸叉湁鐨勭綉绔欐潵瀹屾垚榪欎釜鍔熻兘錛岃繖涓椂鍊欐垜浠渶瑕佸悜緗戦〉鎻愪氦鎵嬫満鍙風(fēng)爜騫朵粠榪斿洖鐨勯〉闈腑瑙f瀽鍑烘垜浠兂瑕佺殑鏁版嵁鏉ャ傚鏋滃鏂逛粎浠呮槸涓涓緢綆鍗曠殑欏甸潰錛岄偅鎴戜滑鐨勭▼搴忎細(xì)寰堢畝鍗曪紝鏈枃涔熷氨娌℃湁蹇呰澶у紶鏃楅紦鐨勫湪榪欓噷嫻垂鍙h垖銆備絾鏄冭檻鍒頒竴浜涙湇鍔℃巿鏉冪殑闂錛屽緢澶氬叕鍙告彁渚涚殑欏甸潰寰寰騫朵笉鏄彲浠ラ氳繃涓涓畝鍗曠殑URL灝卞彲浠ヨ闂殑錛岃屽繀欏葷粡榪囨敞鍐岀劧鍚庣櫥褰曞悗鏂瑰彲浣跨敤鎻愪緵鏈嶅姟鐨勯〉闈紝榪欎釜鏃跺欏氨娑夊強(qiáng)鍒?COOKIE闂鐨勫鐞嗐傛垜浠煡閬撶洰鍓嶆祦琛岀殑***欏墊妧鏈緥濡侫SP銆丣SP鏃犱笉鏄氳繃COOKIE鏉ュ鐞嗕細(xì)璇濅俊鎭殑銆備負(fù)浜嗕嬌鎴戜滑鐨勭▼搴忚兘浣跨敤鍒漢鎵鎻愪緵鐨勬湇鍔¢〉闈紝灝辮姹傜▼搴忛鍏堢櫥褰曞悗鍐嶈闂湇鍔¢〉闈紝榪欒繃紼嬪氨闇瑕佽嚜琛屽鐞哻ookie錛屾兂鎯沖綋浣犵敤java.net.HttpURLConnection 鏉ュ畬鎴愯繖浜涘姛鑳芥椂鏄涔堟亹鎬栫殑浜嬫儏鍟婏紒鍐典笖榪欎粎浠呮槸鎴戜滑鎵璇寸殑欏藉浐鐨刉EB鏈嶅姟鍣ㄤ腑鐨勪竴涓緢甯歌鐨勨滈〗鍥衡濓紒鍐嶆湁濡傞氳繃HTTP鏉ヤ笂浼犳枃浠跺憿錛熶笉闇瑕佸ご鐤鹼紝榪欎簺闂鏈変簡鈥滃畠鈥濆氨寰堝鏄撹В鍐充簡錛?
鎴戜滑涓嶅彲鑳藉垪涓炬墍鏈夊彲鑳界殑欏藉浐錛屾垜浠細(xì)閽堝鍑犵鏈甯歌鐨勯棶棰樿繘琛屽鐞嗐傚綋鐒朵簡錛屾濡傚墠闈㈣鍒扮殑錛屽鏋滄垜浠嚜宸變嬌鐢?java.net.HttpURLConnection鏉ユ悶瀹氳繖浜涢棶棰樻槸寰堟亹鎬栫殑浜嬫儏錛屽洜姝ゅ湪寮濮嬩箣鍓嶆垜浠厛瑕佷粙緇嶄竴涓嬩竴涓紑鏀炬簮鐮佺殑欏圭洰錛岃繖涓」鐩氨鏄?Apache寮婧愮粍緇囦腑鐨刪ttpclient錛屽畠闅跺睘浜嶫akarta鐨刢ommons欏圭洰錛岀洰鍓嶇殑鐗堟湰鏄?.0RC2銆俢ommons涓嬫湰鏉ュ凡緇忔湁涓涓猲et鐨勫瓙欏圭洰錛屼絾鏄張鎶奾ttpclient鍗曠嫭鎻愬嚭鏉ワ紝鍙http鏈嶅姟鍣ㄧ殑璁塊棶緇濋潪鏄撲簨銆?
Commons-httpclient欏圭洰灝辨槸涓撻棬璁捐鏉ョ畝鍖朒TTP瀹㈡埛绔笌鏈嶅姟鍣ㄨ繘琛屽悇縐嶉氳緙栫▼銆傞氳繃瀹冨彲浠ヨ鍘熸潵寰堝ご鐤肩殑浜嬫儏鐜板湪杞繪澗鐨勮В鍐籌紝渚嬪浣犱笉鍐嶇鏄疕TTP鎴栬匟TTPS鐨勯氳鏂瑰紡錛屽憡璇夊畠浣犳兂浣跨敤HTTPS鏂瑰紡錛屽墿涓嬬殑浜嬫儏浜ょ粰 httpclient鏇夸綘瀹屾垚銆傛湰鏂囦細(xì)閽堝鎴戜滑鍦ㄧ紪鍐橦TTP瀹㈡埛绔▼搴忔椂緇忓父紕板埌鐨勫嚑涓棶棰樿繘琛屽垎鍒粙緇嶅浣曚嬌鐢╤ttpclient鏉ヨВ鍐沖畠浠紝涓轟簡璁╄鑰呮洿蹇殑鐔熸?zhèn)墭q欎釜欏圭洰鎴戜滑鏈寮濮嬪厛緇欏嚭涓涓畝鍗曠殑渚嬪瓙鏉ヨ鍙栦竴涓綉欏電殑鍐呭錛岀劧鍚庡驚搴忔笎榪涜В鍐蟲帀鍓嶈繘涓殑鎵褰緧鐙?/font>
1錛?璇誨彇緗戦〉(HTTP/HTTPS)鍐呭
涓嬮潰鏄垜浠粰鍑虹殑涓涓畝鍗曠殑渚嬪瓙鐢ㄦ潵璁塊棶鏌愪釜欏甸潰
/*
* Created on 2003-12-14 by Liudong
*/
package http.demo;
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
/**
* 鏈綆鍗曠殑HTTP瀹㈡埛绔?鐢ㄦ潵婕旂ず閫氳繃GET鎴栬匬OST鏂瑰紡璁塊棶鏌愪釜欏甸潰
* @author Liudong
*/
public class SimpleClient {
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
//璁劇疆浠g悊鏈嶅姟鍣ㄥ湴鍧鍜岀鍙?nbsp;
//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
//浣跨敤GET鏂規(guī)硶錛屽鏋滄湇鍔″櫒闇瑕侀氳繃HTTPS榪炴帴錛岄偅鍙渶瑕佸皢涓嬮潰URL涓殑http鎹㈡垚https
HttpMethod method = new GetMethod(" //浣跨敤POST鏂規(guī)硶 //HttpMethod method = new PostMethod(" client.executeMethod(method); //鎵撳嵃鏈嶅姟鍣ㄨ繑鍥炵殑鐘舵? System.out.println(method.getStatusLine()); //鎵撳嵃榪斿洖鐨勪俊鎭? System.out.println(method.getResponseBodyAsString()); //閲婃斁榪炴帴 method.releaseConnection(); } 鍦ㄨ繖涓緥瀛愪腑棣栧厛鍒涘緩涓涓狧TTP瀹㈡埛绔?HttpClient)鐨勫疄渚嬶紝鐒跺悗閫夋嫨鎻愪氦鐨勬柟娉曟槸GET鎴栬?POST錛屾渶鍚庡湪HttpClient瀹炰緥涓婃墽琛屾彁浜ょ殑鏂規(guī)硶錛屾渶鍚庝粠鎵閫夋嫨鐨勬彁浜ゆ柟娉曚腑璇誨彇鏈嶅姟鍣ㄥ弽棣堝洖鏉ョ殑緇撴灉銆傝繖灝辨槸浣跨敤HttpClient鐨勫熀鏈祦紼嬨傚叾瀹炵敤涓琛屼唬鐮佷篃灝卞彲浠ユ悶瀹氭暣涓姹傜殑榪囩▼錛岄潪甯哥殑綆鍗曪紒 2錛?浠ET鎴栬匬OST鏂瑰紡鍚戠綉欏墊彁浜ゅ弬鏁? 鍏跺疄鍓嶉潰涓涓渶綆鍗曠殑紺轟緥涓垜浠凡緇忎粙緇嶄簡濡備綍浣跨敤GET鎴栬匬OST鏂瑰紡鏉ヨ姹備竴涓〉闈紝鏈皬鑺備笌涔嬩笉鍚岀殑鏄浜嗘彁浜ゆ椂璁懼畾欏甸潰鎵闇鐨勫弬鏁幫紝鎴戜滑鐭ラ亾濡傛灉鏄疓ET鐨勮姹傛柟寮忥紝閭d箞鎵鏈夊弬鏁伴兘鐩存帴鏀懼埌欏甸潰鐨刄RL鍚庨潰鐢ㄩ棶鍙蜂笌欏甸潰鍦板潃闅斿紑錛屾瘡涓弬鏁扮敤&闅斿紑錛屼緥濡傦細(xì)http://java.sun.com?name=liudong&mobile=123456錛屼絾鏄綋浣跨敤POST鏂規(guī)硶鏃跺氨浼?xì)绋嶅井鏈変竴鐐圭偣楹葷儲銆傛湰灝忚妭鐨勪緥瀛愭紨紺哄悜濡備綍鏌ヨ鎵嬫満鍙風(fēng)爜鎵鍦ㄧ殑鍩庡競錛屼唬鐮佸涓嬶細(xì) /* * Created on 2003-12-7 by Liudong */ package http.demo; import java.io.IOException; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.*; /** * 鎻愪氦鍙傛暟婕旂ず * 璇ョ▼搴忚繛鎺ュ埌涓涓敤浜庢煡璇㈡墜鏈哄彿鐮佹墍灞炲湴鐨勯〉闈? * 浠ヤ究鏌ヨ鍙風(fēng)爜孌?330227鎵鍦ㄧ殑鐪佷喚浠ュ強(qiáng)鍩庡競 * @author Liudong */ public class SimpleHttpClient { public static void main(String[] args) throws IOException { HttpClient client = new HttpClient(); client.getHostConfiguration().setHost(" HttpMethod method = getPostMethod();//浣跨敤POST鏂瑰紡鎻愪氦鏁版嵁 client.executeMethod(method); //鎵撳嵃鏈嶅姟鍣ㄨ繑鍥炵殑鐘舵? System.out.println(method.getStatusLine()); //鎵撳嵃緇撴灉欏甸潰 String response = new String(method.getResponseBodyAsString().getBytes("8859_1")); //鎵撳嵃榪斿洖鐨勪俊鎭? System.out.println(response); method.releaseConnection(); } /** * 浣跨敤GET鏂瑰紡鎻愪氦鏁版嵁 * @return */ private static HttpMethod getGetMethod(){ return new GetMethod("/simcard.php?simcard=1330227"); } /** * 浣跨敤POST鏂瑰紡鎻愪氦鏁版嵁 * @return */ private static HttpMethod getPostMethod(){ PostMethod post = new PostMethod("/simcard.php"); NameValuePair simcard = new NameValuePair("simcard","1330227"); post.setRequestBody(new NameValuePair[] { simcard}); return post; } } 鍦ㄤ笂闈㈢殑渚嬪瓙涓〉闈?a >http://www.imobile.com.cn/simcard.php 3錛?澶勭悊欏甸潰閲嶅畾鍚? 鍦↗SP/Servlet緙栫▼涓璻esponse.sendRedirect鏂規(guī)硶灝辨槸浣跨敤HTTP鍗忚涓殑閲嶅畾鍚戞満鍒躲傚畠涓嶫SP涓殑<jsp:forward 鈥?gt;鐨勫尯鍒湪浜庡悗鑰呮槸鍦ㄦ湇鍔″櫒涓疄鐜伴〉闈㈢殑璺寵漿錛屼篃灝辨槸璇村簲鐢ㄥ鍣ㄥ姞杞戒簡鎵瑕佽煩杞殑欏甸潰鐨勫唴瀹瑰茍榪斿洖緇欏鎴風(fēng)錛涜屽墠鑰呮槸榪斿洖涓涓姸鎬佺爜錛岃繖浜涚姸鎬佺爜鐨勫彲鑳藉艱涓嬭〃錛岀劧鍚庡鎴風(fēng)璇誨彇闇瑕佽煩杞埌鐨勯〉闈㈢殑URL騫墮噸鏂板姞杞芥柊鐨勯〉闈€傚氨鏄繖鏍蜂竴涓繃紼嬶紝鎵浠ユ垜浠紪紼嬬殑鏃跺欏氨瑕侀氳繃 HttpMethod.getStatusCode()鏂規(guī)硶鍒ゆ柇榪斿洖鍊兼槸鍚︿負(fù)涓嬭〃涓殑鏌愪釜鍊兼潵鍒ゆ柇鏄惁闇瑕佽煩杞傚鏋滃凡緇忕‘璁ら渶瑕佽繘琛岄〉闈㈣煩杞簡錛岄偅涔堝彲浠ラ氳繃璇誨彇HTTP澶翠腑鐨刲ocation灞炴ф潵鑾峰彇鏂扮殑鍦板潃銆? 鐘舵佺爜 涓嬮潰鐨勪唬鐮佺墖孌墊紨紺哄浣曞鐞嗛〉闈㈢殑閲嶅畾鍚? client.executeMethod(post); System.out.println(post.getStatusLine().toString()); post.releaseConnection(); //媯鏌ユ槸鍚﹂噸瀹氬悜 int statuscode = post.getStatusCode(); if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode == HttpStatus.SC_SEE_OTHER) || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) { //璇誨彇鏂扮殑URL鍦板潃 Header header = post.getResponseHeader("location"); if (header != null) { String newuri = header.getValue(); if ((newuri == null) || (newuri.equals(""))) newuri = "/"; GetMethod redirect = new GetMethod(newuri); client.executeMethod(redirect); System.out.println("Redirect:"+ redirect.getStatusLine().toString()); redirect.releaseConnection(); } else System.out.println("Invalid redirect"); } 鎴戜滑鍙互鑷緙栧啓涓や釜JSP欏甸潰錛屽叾涓竴涓〉闈㈢敤response.sendRedirect鏂規(guī)硶閲嶅畾鍚戝埌鍙﹀涓涓〉闈㈢敤鏉ユ祴璇曚笂闈㈢殑渚嬪瓙銆? 4錛?妯℃嫙杈撳叆鐢ㄦ埛鍚嶅拰鍙d護(hù)榪涜鐧誨綍 鏈皬鑺傚簲璇ヨ鏄疕TTP瀹㈡埛绔紪紼嬩腑鏈甯哥瑙佺殑闂錛屽緢澶氱綉绔欑殑鍐呭閮藉彧鏄娉ㄥ唽鐢ㄦ埛鍙鐨勶紝榪欑鎯呭喌涓嬪氨蹇呴』瑕佹眰浣跨敤姝g‘鐨勭敤鎴峰悕鍜屽彛浠ょ櫥褰曟垚鍔熷悗錛屾柟鍙祻瑙堝埌鎯寵鐨勯〉闈€傚洜涓篐TTP鍗忚鏄棤鐘舵佺殑錛屼篃灝辨槸榪炴帴鐨勬湁鏁堟湡鍙檺浜庡綋鍓嶈姹傦紝璇鋒眰鍐呭緇撴潫鍚庤繛鎺ュ氨鍏抽棴浜嗐傚湪榪欑鎯呭喌涓嬩負(fù)浜嗕繚瀛樼敤鎴風(fēng)殑鐧誨綍淇℃伅蹇呴』浣跨敤鍒癈ookie鏈哄埗銆備互JSP/Servlet涓轟緥錛屽綋嫻忚鍣ㄨ姹備竴涓狫SP鎴栬呮槸Servlet鐨勯〉闈㈡椂錛屽簲鐢ㄦ湇鍔″櫒浼?xì)杩斿洖涓涓弬鏁幫紝鍚嶄負(fù)jsessionid錛堝洜涓嶅悓搴旂敤鏈嶅姟鍣ㄨ屽紓錛夛紝鍊兼槸涓涓緝闀跨殑鍞竴瀛楃涓茬殑Cookie錛岃繖涓瓧絎︿覆鍊間篃灝辨槸褰撳墠璁塊棶璇ョ珯鐐圭殑浼?xì)璇濇爣璇嗐傛祻瑙堝櫒鍦ㄦ瘡璁塊棶璇ョ珯鐐圭殑鍏朵粬欏甸潰鏃跺欓兘瑕佸甫涓妀sessionid榪欐牱鐨凜ookie淇℃伅錛屽簲鐢ㄦ湇鍔″櫒鏍規(guī)嵁璇誨彇榪欎釜浼?xì)璇濇爣璇嗘潵鑾峰彇瀵瑰簲鐨勪細(xì)璇濅俊鎭? 瀵逛簬闇瑕佺敤鎴風(fēng)櫥褰曠殑緗戠珯錛屼竴鑸湪鐢ㄦ埛鐧誨綍鎴愬姛鍚庝細(xì)灝嗙敤鎴瘋祫鏂欎繚瀛樺湪鏈嶅姟鍣ㄧ殑浼?xì)璇濅腑锛寴q欐牱褰撹闂埌鍏朵粬鐨勯〉闈㈡椂鍊欙紝搴旂敤鏈嶅姟鍣ㄦ牴鎹祻瑙堝櫒閫佷笂鐨凜ookie涓鍙栧綋鍓嶈姹傚搴旂殑浼?xì)璇濇爣璇嗕互鑾峰緱瀵瑰簲鐨勪細(xì)璇濅俊鎭Q岀劧鍚庡氨鍙互鍒ゆ柇鐢ㄦ埛璧勬枡鏄惁瀛樺湪浜庝細(xì)璇濅俊鎭腑錛屽鏋滃瓨鍦ㄥ垯鍏佽璁塊棶欏甸潰錛屽惁鍒欒煩杞埌鐧誨綍欏甸潰涓姹傜敤鎴瘋緭鍏ュ笎鍙峰拰鍙d護(hù)榪涜鐧誨綍銆傝繖灝辨槸涓鑸嬌鐢↗SP寮鍙戠綉绔欏湪澶勭悊鐢ㄦ埛鐧誨綍鐨勬瘮杈冮氱敤鐨勬柟娉曘? 榪欐牱涓鏉ワ紝瀵逛簬HTTP鐨勫鎴風(fēng)鏉ヨ錛屽鏋滆璁塊棶涓涓彈淇濇姢鐨勯〉闈㈡椂灝卞繀欏繪ā鎷熸祻瑙堝櫒鎵鍋氱殑宸ヤ綔錛岄鍏堝氨鏄姹傜櫥褰曢〉闈紝鐒跺悗璇誨彇Cookie鍊鹼紱鍐嶆璇鋒眰鐧誨綍欏甸潰騫跺姞鍏ョ櫥褰曢〉鎵闇鐨勬瘡涓弬鏁幫紱鏈鍚庡氨鏄姹傛渶緇堟墍闇鐨勯〉闈€傚綋鐒跺湪闄ょ涓嬈¤姹傚鍏朵粬鐨勮姹傞兘闇瑕侀檮甯︿笂 Cookie淇℃伅浠ヤ究鏈嶅姟鍣ㄨ兘鍒ゆ柇褰撳墠璇鋒眰鏄惁宸茬粡閫氳繃楠岃瘉銆傝浜嗚繖涔堝錛屽彲鏄鏋滀綘浣跨敤httpclient鐨勮瘽錛屼綘鐢氳嚦榪炰竴琛屼唬鐮侀兘鏃犻渶澧炲姞錛屼綘鍙渶瑕佸厛浼犻掔櫥褰曚俊鎭墽琛岀櫥褰曡繃紼嬶紝鐒跺悗鐩存帴璁塊棶鎯寵鐨勯〉闈紝璺熻闂竴涓櫘閫氱殑欏甸潰娌℃湁浠諱綍鍖哄埆錛屽洜涓虹被HttpClient宸茬粡甯綘鍋氫簡鎵鏈夎鍋氱殑浜嬫儏浜嗭紝澶浜嗭紒涓嬮潰鐨勪緥瀛愬疄鐜頒簡榪欐牱涓涓闂殑榪囩▼銆? /* * Created on 2003-12-7 by Liudong */ package http.demo; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.cookie.*; import org.apache.commons.httpclient.methods.*; /** * 鐢ㄦ潵婕旂ず鐧誨綍琛ㄥ崟鐨勭ず渚? * @author Liudong */ public class FormLoginDemo { static final String LOGON_SITE = "localhost"; static final int LOGON_PORT = 8080; public static void main(String[] args) throws Exception{ HttpClient client = new HttpClient(); client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT); //妯℃嫙鐧誨綍欏甸潰login.jsp->main.jsp PostMethod post = new PostMethod("/main.jsp"); NameValuePair name = new NameValuePair("name", "ld"); NameValuePair pass = new NameValuePair("password", "ld"); post.setRequestBody(new NameValuePair[]{name,pass}); int status = client.executeMethod(post); System.out.println(post.getResponseBodyAsString()); post.releaseConnection(); //鏌ョ湅cookie淇℃伅 CookieSpec cookiespec = CookiePolicy.getDefaultSpec(); Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies()); if (cookies.length == 0) { System.out.println("None"); } else { for (int i = 0; i < cookies.length; i++) { System.out.println(cookies[i].toString()); } } //璁塊棶鎵闇鐨勯〉闈ain2.jsp GetMethod get = new GetMethod("/main2.jsp"); client.executeMethod(get); System.out.println(get.getResponseBodyAsString()); get.releaseConnection(); } } 5錛?鎻愪氦XML鏍煎紡鍙傛暟 鎻愪氦XML鏍煎紡鐨勫弬鏁板緢綆鍗曪紝浠呬粎鏄竴涓彁浜ゆ椂鍊欑殑ContentType闂錛屼笅闈㈢殑渚嬪瓙婕旂ず浠庢枃浠舵枃浠朵腑璇誨彇XML淇℃伅騫舵彁浜ょ粰鏈嶅姟鍣ㄧ殑榪囩▼錛岃榪囩▼鍙互鐢ㄦ潵嫻嬭瘯Web鏈嶅姟銆? import java.io.File; import java.io.FileInputStream; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.EntityEnclosingMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * 鐢ㄦ潵婕旂ず鎻愪氦XML鏍煎紡鏁版嵁鐨勪緥瀛? */ public class PostXMLClient { public static void main(String[] args) throws Exception { File input = new File(鈥渢est.xml鈥?; PostMethod post = new PostMethod(鈥渉ttp://localhost:8080/httpclient/xml.jsp鈥?; // 璁劇疆璇鋒眰鐨勫唴瀹圭洿鎺ヤ粠鏂囦歡涓鍙? post.setRequestBody(new FileInputStream(input)); if (input.length() < Integer.MAX_VALUE) post.setRequestContentLength(input.length()); else post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED); // 鎸囧畾璇鋒眰鍐呭鐨勭被鍨? post.setRequestHeader("Content-type", "text/xml; charset=GBK"); HttpClient httpclient = new HttpClient(); int result = httpclient.executeMethod(post); System.out.println("Response status code: " + result); System.out.println("Response body: "); System.out.println(post.getResponseBodyAsString()); post.releaseConnection(); } } 6錛?閫氳繃HTTP涓婁紶鏂囦歡 httpclient浣跨敤浜嗗崟鐙殑涓涓狧ttpMethod瀛愮被鏉ュ鐞嗘枃浠剁殑涓婁紶錛岃繖涓被灝辨槸MultipartPostMethod錛岃綾誨凡緇忓皝瑁呬簡鏂囦歡涓婁紶鐨勭粏鑺傦紝鎴戜滑瑕佸仛鐨勪粎浠呮槸鍛婅瘔瀹冩垜浠涓婁紶鏂囦歡鐨勫叏璺緞鍗沖彲錛屼笅闈㈢殑浠g爜鐗囨婕旂ず濡備綍浣跨敤榪欎釜綾匯? MultipartPostMethod filePost = new MultipartPostMethod(targetURL); filePost.addParameter("fileName", targetFilePath); HttpClient client = new HttpClient(); //鐢變簬瑕佷笂浼犵殑鏂囦歡鍙兘姣旇緝澶?鍥犳鍦ㄦ璁劇疆鏈澶х殑榪炴帴瓚呮椂鏃墮棿 client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); int status = client.executeMethod(filePost); 涓婇潰浠g爜涓紝targetFilePath鍗充負(fù)瑕佷笂浼犵殑鏂囦歡鎵鍦ㄧ殑璺緞銆? 7錛?璁塊棶鍚敤璁よ瘉鐨勯〉闈? 鎴戜滑緇忓父浼?xì)纰板埌杩欐狅L(fēng)殑欏甸潰錛屽綋璁塊棶瀹冪殑鏃跺欎細(xì)寮瑰嚭涓涓祻瑙堝櫒鐨勫璇濇瑕佹眰杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜鍚庢柟鍙紝榪欑鐢ㄦ埛璁よ瘉鐨勬柟寮忎笉鍚屼簬鎴戜滑鍦ㄥ墠闈粙緇嶇殑鍩轟簬琛ㄥ崟鐨勭敤鎴瘋韓浠介獙璇併傝繖鏄疕TTP鐨勮璇佺瓥鐣ワ紝httpclient鏀寔涓夌璁よ瘉鏂瑰紡鍖呮嫭錛氬熀鏈佹憳瑕佷互鍙?qiáng)NTLM璁よ瘉銆傚叾涓熀鏈璇佹渶綆鍗曘侀氱敤浣嗕篃鏈涓嶅畨鍏紱鎽樿璁よ瘉鏄湪HTTP 1.1涓姞鍏ョ殑璁よ瘉鏂瑰紡錛岃孨TLM鍒欐槸寰蔣鍏徃瀹氫箟鐨勮屼笉鏄氱敤鐨勮鑼冿紝鏈鏂扮増鏈殑NTLM鏄瘮鎽樿璁よ瘉榪樿瀹夊叏鐨勪竴縐嶆柟寮忋? 涓嬮潰渚嬪瓙鏄粠httpclient鐨凜VS鏈嶅姟鍣ㄤ腑涓嬭澆鐨勶紝瀹冪畝鍗曟紨紺哄浣曡闂竴涓璇佷繚鎶ょ殑欏甸潰錛? import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.methods.GetMethod; public class BasicAuthenticationExample { public BasicAuthenticationExample() { } public static void main(String[] args) throws Exception { HttpClient client = new HttpClient(); client.getState().setCredentials( " "realm", new UsernamePasswordCredentials("username", "password") ); GetMethod get = new GetMethod(" get.setDoAuthentication( true ); int status = client.executeMethod( get ); System.out.println(status+""+ get.getResponseBodyAsString()); get.releaseConnection(); } } 8錛?澶氱嚎紼嬫ā寮忎笅浣跨敤httpclient 澶氱嚎紼嬪悓鏃惰闂甴ttpclient錛屼緥濡傚悓鏃朵粠涓涓珯鐐逛笂涓嬭澆澶氫釜鏂囦歡銆傚浜庡悓涓涓狧ttpConnection 鍚屼竴涓椂闂村彧鑳芥湁涓涓嚎紼嬭闂紝涓轟簡淇濊瘉澶氱嚎紼嬪伐浣滅幆澧冧笅涓嶄駭鐢熷啿紿侊紝httpclient浣跨敤浜嗕竴涓綰跨▼榪炴帴綆$悊鍣ㄧ殑綾伙細(xì) MultiThreadedHttpConnectionManager錛岃浣跨敤榪欎釜綾誨緢綆鍗曪紝鍙渶瑕佸湪鏋勯燞ttpClient瀹炰緥鐨勬椂鍊欎紶鍏ュ嵆鍙紝浠g爜濡備笅錛?pre>MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
浠ュ悗灝界璁塊棶client瀹炰緥鍗沖彲銆?
鍙傝冭祫鏂欙細(xì)
httpclient棣栭〉錛?nbsp; http://jakarta.apache.org/commons/httpclient/
}
瀵瑰簲HttpServletResponse鐨勫父閲?br> 璇︾粏鎻忚堪
301銆 SC_MOVED_PERMANENTLY
欏甸潰宸茬粡姘鎬箙縐誨埌鍙﹀涓涓柊鍦板潃
302銆 SC_MOVED_TEMPORARILY
欏甸潰鏆傛椂縐誨姩鍒板彟澶栦竴涓柊鐨勫湴鍧
303銆 SC_SEE_OTHER
瀹㈡埛绔姹傜殑鍦板潃蹇呴』閫氳繃鍙﹀鐨刄RL鏉ヨ闂?br>307銆 SC_TEMPORARY_REDIRECT銆 鍚孲C_MOVED_TEMPORARILY
鍏充簬NTLM鏄浣曞伐浣滐細(xì) http://davenport.sourceforge.net/ntlm.html
]]>
1銆佸簳灞傜殑鐩存帴涓庢枃浠剁郴緇熸垨鑰呯‖浠舵墦浜ら亾鐨勭被(鍏呭綋鏁版嵁婧愮殑綾?錛?
鍖呮嫭InputStream鍜孫utPutStream涓ゅぇ綾伙紝鍒嗗埆鐢ㄤ簬杈撳叆鍜岃緭鍑猴紝鏁版嵁婧愬彲浠ユ槸bytes array錛孲tring瀵硅薄錛宖ile鏂囦歡錛宻tream搴忓垪絳夛細(xì)
絳夛紝鍏蜂綋鍙傜湅涓嬮潰鐨刯ava io綾誨浘
2銆佸厖褰撹楗板姛鑳界殑io綾?閫氳繃瑁呴グ搴曞眰鐨勭被鏉ュ疄鐜版洿楂樼駭鐨勫姛鑳斤紝緇ф壙鑷狥ilterOutputStream/FilterOutputStream錛屽寘鎷細(xì)
絳夛紝鍏蜂綋鍙傜湅涓嬮潰鐨刯ava io綾誨浘
浣跨敤FilterOutputStream/FilterOutputStream鏃訛紝棣栧厛鍒涘緩涓涓暟鎹簮IO錛岀劧鍚庢牴鎹渶瑕佺殑鍔熻兘鍒涘緩瑁呴グ綾籭o錛屽叾鏋勯犲嚱鏁扮殑鍙傛暟涓哄凡鍒涘緩鐨勬暟鎹簮io銆?
鍚屾椂錛宩ava鐨処O浣撶郴鍙堝彲浠ュ垎鎴愶細(xì)inputStream/outputStream鍜宺eader/writer涓ょ被錛?
錛?錛?Reader/Writer鏄潰鍚慤nicode瀛楃鐨勶紙Characters錛?
錛?錛?InputStream/OutputStream鏄洿鎺ラ潰鍚戝瓧鑺傜殑錛坆ytes錛夈?
Reader/Writer緇ф壙浣撶郴涔嬫墍浠ュ瓨鍦紝鏈閲嶈鐨勫師鍥犳槸涓轟簡鍥介檯鍖栵紝鏃у紡I/O stream 鐨勭戶鎵夸綋緋諱粎浠呮敮鎸?-bit byte stream錛岃屼笖鏃犳硶澶勭悊16-bit unicode 瀛楃銆傜敱浜巙nicode琚敤浜庡瓧絎﹀浗闄呭寲錛屾墍浠ュ姞鍏eader/Writer浠ヤ究鍦ㄦ墍鏈夌殑io鍔ㄤ綔涓婃彁渚涘unicode鐨勬敮鎸併?
鍑犱箮鎵鏈夌殑java io stream classes閮芥湁鐩稿簲鐨凴eader鍜學(xué)riter鏉ユ彁渚涘unicode鐨勬敮鎸侊紝浣嗘槸鍦ㄦ煇浜涘満鍚堬紝浣跨敤byte-oriented InputStream鍜孫utPutStream鎵嶆槸姝e彇鐨勬柟娉曪紝鏈鍚堢悊鐨勬柟寮忔槸灝藉彲鑳藉厛灝濊瘯浣跨敤Read鍜學(xué)riter錛屽叾嬈℃墠浣跨敤byte-oriented搴撱?
InputStreamReader鍜孫utputStreamWriter錛屽彲浠ユ妸涓涓互瀛楄妭涓哄鍚戠殑stream杞崲鎴愪竴涓互瀛楃涓哄鍚戠殑stream銆?
Java 1.0 class錛坆yte oriented錛?nbsp; Java 1.1 class(unicode character oriented)
瑁呴グ鍓嶇殑琛屼負(fù)
InputStream Reader 杞崲鍣細(xì)InputStreamReader
OutputStreamReader Writer 杞崲鍣細(xì)OutputStreamWriter
FileInputSream FileOutputStream
FileReader FileWriter
StringBufferInputStream StringReader/StringWriter
ByteArrayInputStream ByteArrayOutputStream
CharArrayReader CharArrayWriter
瑁呴グ鍚庣殑琛屼負(fù)
BufferedInputStream BufferedOutputStream
BufferedReader BufferedWriter
PrintStream PrintWriter
DataInputStream鍜孌ataOutputStream
Java涓櫎浜嗕簩榪涘埗鏂囦歡鍜屼嬌鐢ㄦ枃鏈枃浠跺榪樻湁鍩轟簬Data鐨勬暟鎹搷浣滐紝榪欓噷鐨凞ata鎸囩殑鏄疛ava鐨勫熀鏈暟鎹被鍨嬪拰String銆傚熀鏈暟鎹被鍨嬪寘鎷琤yte銆乮nt銆乧har銆乴ong銆乫loat銆乨ouble銆乥oolean鍜宻hort銆?/b>
渚嬪瓙錛?/b>
protected void connect (Socket socket)
throws IOException, SocketException
{
this.socket = socket;
applyTimeout();
serverIn = new DataInputStream (
new BufferedInputStream (socket.getInputStream ())
);
serverOut = new DataOutputStream(
new BufferedOutputStream(socket.getOutputStream(), 2048)
);
usable = true;
cnt[CONNECT]++;
setChanged();
notifyObservers();
}
鍦―ataInputStream鍜孌ataOutputStream涓や釜綾諱腑鐨勬柟娉曢兘寰堢畝鍗曪紝鍩烘湰緇撴瀯涓簉eadXXXX()鍜寃riteXXXX()鍏朵腑XXXX浠h〃鍩烘湰鏁版嵁綾誨瀷鎴栬匰tring銆?/p>
Document doc = new Document(new Element("rootElement"))
鎴栬?
Document doc = new Document();
// 鏍瑰厓绱?/p>
Element root = new Element("persons");
doc.addContent(root);
// add person
Element person = new Element("person").setText("test1");
root.addContent(person);
//add person 2
person = new Element("person").setText("test2");
root.addContent(person);
鍙﹀涓縐嶆柟寮忥細(xì)
Document doc = new Document(new Element("family")
.addContent(new Element("mom"))
.addContent(new Element("dad").addContent("kidOfDad")));
涓鑸岃█錛屼嬌鐢╫rg.jdom.input.SAXBuilder鏇村揩錛屾帹鑽愪嬌鐢紝鑰宱rg.jdom.input.DOMBuilder閫傜敤浜庡凡緇忓瓨鍦―OM瀵硅薄鐨勫満鍚堛?
SAXBuilder b = new SAXBuilder();
// Create the document
Document doc = b.build(new File(xmlfilename));
// Get a List of direct children as Elements
List allChildren = element.getChildren();// Get all direct children with a given name
List namedChildren = element.getChildren("name");// Get the first kid with a given name
Element kid = element.getChild("name");
List allChildren = element.getChildren();
// Remove the fourth child
allChildren.remove(3);
// Remove all children named "jack"
allChildren.removeAll(element.getChildren("jack"));鎴栬?br /> element.removeChildren("jack");
// Add a new child
allChildren.add(new Element("jane"));鎴栬?br /> element.addContent(new Element("jane"));
// Add a new child in the second position
allChildren.add(1, new Element("second"));
// 璇誨彇灞炴э細(xì)
String value =table.getAttributeValue("width");// table 鏄痚lement
// 涔熷彲浠ュ湪璇誨彇灞炴х殑鍚屾椂榪涜綾誨瀷杞崲
try {
value =table.getAttribute("border").getIntValue();
}
catch (DataConversionException e) { }
// 璁劇疆灞炴?
// Add an attribute
table.addAttribute("vspace", "0");
// Add an attribute more formally 姣旇緝姝e紡鐨勫啓娉?br /> table.addAttribute(new Attribute("name", "value"))
// Remove an attribute
table.removeAttribute("border");
// Remove all attributes 縐婚櫎鎵鏈夊睘鎬?br /> table.getAttributes().clear();
姣斿<description>A cool demo</description>錛屽垯鍙互鐩存帴鑾峰彇鍐呭
String content = element.getText();
// 縐婚櫎澶氫綑鐨勭┖鐧斤紝瀛楃涓插墠鍚庣殑絀虹櫧錛屼笉浼?xì)绉婚櫎瀛椊W︿覆鍐呴儴鐨勭┖鐧?
element.getTextNormalize();
// This blows away all current content
element.setText("A new description");
//Special characters are interpreted correctly: 鐗規(guī)畩瀛楃鍙互琚紜湴杞箟
element.setText("<xml> content");
// 鍒涘緩cdata鍏冪礌
element.addContent(new CDATA("<xml> content"));
XMLOutputter 綾葷敤鏉ュ疄鐜癤ML鏂囦歡鐨勮緭鍑猴紝鍦ㄥ垱寤虹殑鏃跺欓渶瑕佷竴涓狥ormat瀵硅薄鏉ユ牸寮忓寲XML鏂囦歡錛孎ormat瀵硅薄鏄竴涓伐鍘傜被錛屾彁渚涘嚑涓潤鎬佺殑宸ュ巶鏂規(guī)硶鏉ユ彁渚涗竴浜涘父瑙勭殑XML鏍煎紡錛屾瘮濡俫etPrettyFormat()錛?
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
try {
outputter.output(doc, new FileOutputStream(new File("xmlfile/persons.xml")));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Namespace xhtml = Namespace.getNamespace("xhtml", “http://www.w3.org/1999/xhtml”);
List kids = element.getChildren("p", xhtml);
Element kid = element.getChild("title", xhtml);
Attribute height = element.getAttribute("height", xhtml);
闄勫綍錛欽ava涓媂ML緙栫▼鎺ュ彛姣旇緝錛欴OM SAX JDOM JAXP錛堢綉緇滆杞斤級
涓銆丏OM 錛堟枃。瀵硅薄妯″瀷锛
涓?XML 鏂囨。鐨勫凡瑙f瀽鐗堟湰瀹氫箟浜嗕竴緇勬帴鍙c傝В鏋愬櫒璇誨叆鏁翠釜鏂囨。錛岀劧鍚庢瀯寤轟竴涓┗鐣欏唴瀛樼殑鏍?wèi)缁撴瀯锛岀劧鍚庝唬鐮仦鍙互鋴社?DOM 鎺ュ彛鏉ユ搷浣滆繖涓爲(wèi)緇撴瀯銆?br /> 浼樼偣錛氭暣涓枃。鏍(wèi)鍦ㄥ唴瀛樹腑錛屼究浜庢搷浣滐紱鏀寔鍒犻櫎銆佷慨鏀廣侀噸鏂版帓鍒楃瓑澶氱鍔熻兘錛?br /> 緙虹偣錛氬皢鏁翠釜鏂囨。璋冨叆鍐呭瓨錛堝寘鎷棤鐢ㄧ殑鑺傜偣錛夛紝嫻垂鏃墮棿鍜岀┖闂達(dá)紱
浣跨敤鍦哄悎錛氫竴鏃﹁В鏋愪簡鏂囨。榪橀渶澶氭璁塊棶榪欎簺鏁版嵁錛?br /> 紜歡璧勬簮鍏呰凍錛堝唴瀛樸丆PU錛?br /> 浜屻丼AX
涓鴻В鍐矰OM鐨勯棶棰橈紝鍑虹幇浜哠AX銆?br /> SAX 錛屼簨浠墮┍鍔ㄣ傚綋瑙f瀽鍣ㄥ彂鐜板厓绱犲紑濮嬨佸厓绱犵粨鏉熴佹枃鏈佹枃。鐨勫紑濮嬫垨緇撴潫絳夋椂錛屽彂閫佷簨浠訛紝紼嬪簭鍛樼紪鍐欏搷搴旇繖浜涗簨浠剁殑浠g爜錛屼繚瀛樻暟鎹?br /> 浼樼偣錛氫笉鐢ㄤ簨鍏堣皟鍏ユ暣涓枃。锛屽崰鐢ㄨ祫婧悶畱锛
SAX瑙f瀽鍣ㄤ唬鐮佹瘮DOM瑙f瀽鍣ㄤ唬鐮佸皬錛岄備簬Applet錛屼笅杞?br /> 緙虹偣錛氫笉鏄寔涔呯殑錛涗簨浠惰繃鍚庯紝鑻ユ病淇濆瓨鏁版嵁錛岄偅涔堟暟鎹氨涓簡錛?br /> 鏃犵姸鎬佹э紱浠庝簨浠朵腑鍙兘寰楀埌鏂囨湰錛屼絾涓嶇煡璇ユ枃鏈睘浜庡摢涓厓绱狅紱
浣跨敤鍦哄悎錛欰pplet;
鍙渶XML鏂囨。鐨勫皯閲忓唴瀹癸紝寰堝皯鍥炲ご璁塊棶錛?br /> 鏈哄櫒鍐呭瓨灝戯紱
涓夈丣DOM
涓哄噺灝慏OM銆丼AX鐨勭紪鐮侀噺錛屽嚭鐜頒簡JDOM錛?br /> 浼樼偣錛?0-80鍘熷垯錛屾瀬澶у噺灝戜簡浠g爜閲?br /> 浣跨敤鍦哄悎錛氳瀹炵幇鐨勫姛鑳界畝鍗曪紝濡傝В鏋愩佸垱寤虹瓑錛屼絾鍦ㄥ簳灞傦紝JDOM榪樻槸浣跨敤SAX錛堟渶甯哥敤錛夈丏OM銆乆anan
鍥涖丣AXP
涓哄涓猉ML瑙f瀽鍣ㄦ彁渚涗簡緇熶竴緙栫▼鎺ュ彛
鏇存崲瑙f瀽鍣紝涓嶇敤鏇存敼浠g爜
浣跨敤鍦哄悎錛氳嫢涓嶇敤Jdom錛屼竴鑸緩璁嬌鐢↗APX錛屽皢浠g爜涓庡悇縐嶈В鏋愬櫒鐨勫疄鐜扮粏鑺傞殧紱匯?/p>
• JDOM should be straightforward for Java programmers
– Use the power of the language (Java 2)
– Take advantage of method overloading, the Collections APIs, reflection, weak references
– Provide conveniences like type conversions
• JDOM should hide the complexities of XML wherever possible
– An Element has content, not a child Text node with content
– Exceptions should contain useful error messages
– Give line numbers and specifics, use no SAX or DOM specifics
• JDOM should integrate with DOM and SAX
– Support reading and writing DOM documents and SAX events
– Support runtime plug-in of any DOM or SAX parser
– Easy conversion from DOM/SAX to JDOM
– Easy conversion from JDOM to DOM/SAX
• JDOM should stay current with the latest XML standards
– DOM Level 2, SAX 2.0, XML Schema
• JDOM does not need to solve every problem
– It should solve 80% of the problems with 20% of the effort
– We think we got the ratios to 90% / 10%
• Classes for reading XML from existing sources:
– DOMBuilder
– SAXBuilder
• Also, outside contributions in jdom-contrib:
– ResultSetBuilder
– SpitfireBuilder
• New support for JAXP-based input
– Allows consistency across applications
– Builders pick up JAXP information and user automatically
– Sets stage for JAXP version.next
Classes for writing XML to various forms of output:
– DOMOutputter
– SAXOutputter
– XMLOutputter
Also, outside contributions in jdom-contrib:
– JTreeOutputter
• TRaX is now supported in org.jdom.transform
– Supports XSLT transformations
– Defines Source and Result interfaces
– JDOMSource
– JDOMResult
• Normally XML Document -> SAXBuilder ->XMLOutputter
瀹屾暣鐨刾df涓嬭澆鍦板潃錛?span style="font-weight: bold;">JDOM: How It Works,and How It Opened the Java Processby Jason Hunter
http://www.tkk7.com/Files/cherishchen/JDOM%20How%20It%20Works.zip
棣栧厛榪樻槸閲嶆俯涓?/span>java鐨勫紓甯鎬綋緋葷粨鏋勶紝濡傚浘鎵紺猴紝鎵鏈夊紓甯哥殑鏍規(guī)槸Throwable錛屽紓甯稿張鍒嗕負(fù)checked exception鍜?/span>unchecked exception錛?/span>RuntimeException灝辨槸灞炰簬unchecked exception錛?/span>JVM 涓鏃︽崟鎹夊埌unchecked exception 灝變細(xì)緇堟褰撳墠榪愯鐨勭▼搴忥紝騫跺湪console涓墦鍑洪敊璇俊鎭?/span>
ption hierarchy
Client's reaction when exception happens |
Exception type |
Client code cannot do anything |
Make it an unchecked exception |
Client code will take some useful
recovery action based on information in exception |
Make it a checked exception |
鍙﹀錛?/span>unchecked exceptions鐨勪紭鐐瑰湪浜庝笉寮鴻揩瀹㈡埛绔唬鐮佹樉寮忓湴澶勭悊浠栦滑錛屽紓甯稿彲浠ヤ竴鐩村線涓婁紶閫掞紙闄ら潪闇瑕佽漿鍖栧紓甯革紝鍚﹀垯寮傚父涓嶉渶瑕佸湪涓棿琚崟鎹夛紝鑺傜渷浜嗗緢澶氱殑try{}catch()錛屼唬鐮佹洿鍔犵畝媧侊級錛岀洿鍒頒綘鎯蟲崟鎹夊鐞嗕粬浠紝錛堟湁浜轟細(xì)闂紝濡備綍涓嶅己鍒跺鎴風(fēng)澶勭悊浠栦滑錛屾瘮濡傚儚checked exceptions榪欐牱錛屼笉澶勭悊灝辨槸璇硶閿欒錛屽浣曚繚璇佸紓甯歌兘澶熷緱鍒板鐞嗗憿錛熷湪榪欑偣涓婏紝java鎻愪緵鐨勫畬鍠勭殑鏂囨。鏈哄埗錛岄氳繃API瀹㈡埛绔▼搴忓憳鍙互寰堟柟渚垮湴鐭ラ亾浠栬皟鐢ㄧ殑鏂規(guī)硶鍙兘浼?xì)鎶涘囖Z粈涔堝紓甯革紝涓涓礋璐d漢鐨勭▼搴忓憳灝卞簲璇ュ鍏惰繘琛?/span>catch鍜屽鐞嗭級錛?/span>Java API鎻愪緵浜嗗緢澶氱殑unchecked exceptions錛屾瘮濡?/span>NullPointerException
, IllegalArgumentException
, and IllegalStateException
錛屼嬌鐢?span lang="EN-US">java鎻愪緵鐨勬爣鍑嗙殑
unchecked exceptions鏄煎緱鎺ㄨ崘鐨勶紝榪欐牱鐨勫ソ澶勫湪浜庝嬌浠g爜鏇村姞綆媧佸茍鍙互鍑忓皯浠g爜瀵瑰唴瀛樼殑鍗犵敤銆?/span>
Java寮傚父搴旇灝藉彲鑳藉湴鎺ㄨ繜澶勭悊錛岄櫎闈炶杞寲寮傚父錛岄噸鏂版姏鍑猴紝鍚﹀垯鏈濂戒笉瑕佸鐞嗭紝鑰屾槸鐣欑粰鏈鍚庤兘澶熷鐞嗗紓甯哥殑鍦版柟銆?/span>
閫氳繃涓烘柟娉曟坊鍔?/span>throws澹版槑錛屽彲浠ュ皢澶勭悊寮傚父鐨勮矗浠諱紶閫掑埌鏇撮珮鐨勫眰嬈°傚湪澹版槑鍝簺闇瑕佹姏鍑虹殑鏃跺欙紝搴旇灝藉彲鑳藉湴璇︾粏銆傝繖鏍峰仛鐨勭洰鐨勬槸鍙互鍦?/span>API涓緇嗗湴琛ㄨ堪鍑鴻鏂規(guī)硶鍙兘浼?xì)鍑虹幇鐨勫紓甯稿Q屼粠鑰岃璋冪敤璇ユ柟娉曠殑clinet紼嬪簭鍛樺仛濂藉鐞嗗紓甯哥殑鍑嗗錛屾瘮濡傚浜庝唬鐮侀氳繃throws璇彞璇︾粏鍦板0鏄庝簡鍙兘浼?xì)鎶涘嚭鐨勫紓甯稿Q岃繖鏍瘋皟鐢ㄨ鏂規(guī)硶鐨勭▼搴忓憳灝變細(xì)鐭ラ亾灝嗕細(xì)鏈変粈涔堟牱鐨勫紓甯鎬細(xì)鍙戠敓銆?/span>
throws IllegalArgumentException,
FileNotFoundException, IOException
{
if (filename == null)
{
throw new IllegalArgumentException
("filename is null");
} //if
//
InputStream in = new FileInputStream(filename);
//
}
浠庤娉曚笂璁詫紝IllegalArgumentException鏄?/span>unckecked exception 鏄笉闇瑕佸0鏄庣殑錛屼絾鏄負(fù)浜嗕粠鏂囨。鐨勮搴﹁冭檻錛屾渶濂借繕鏄姞涓婏紝榪欐牱鍙互璁╄皟鐢ㄨ繖涓柟娉曠殑紼嬪簭鍛樼煡閬擄紝榪欎釜鏂規(guī)硶浼?xì)鍙兘鎶涘國櫙ュ紓甯稿Q岄渶瑕佸姞浠ユ崟鎹夊拰澶勭悊銆?/span>
涓嶇濡備綍錛屾渶緇堢▼搴忚偗瀹氭槸瑕佸寮傚父榪涜澶勭悊鐨勶紝鍚﹀垯浼?xì)瀵艰嚧涓嵓嫯瀹氭儏鍐电殑鍙戠敓锛屼絾鏄夋嫨寮傚父澶勭悊鐨勪綅緗嵈鏄湁鎶宸х殑錛岄氬父瑕佷箞鏄▼搴忓湪榪欎簺鍦版柟浠庡紓甯鎬腑鎭㈠銆佺戶緇墽琛屼笖涓嶄細(xì)瀵艱嚧榪涗竴姝ュ紓甯哥殑鍙戠敓錛岃涔堟槸鍦ㄨ繖浜涘湴鏂硅兘涓虹敤鎴峰弽棣堢壒瀹氱殑淇℃伅錛屾瘮濡傦紝濡備綍閬垮厤寮傚父鐨勫彂鐢熸垨鑰呭浣曚粠寮傚父涓仮澶嶃傚洜姝わ紝瀵逛簬鏈夌敤鎴風(fēng)晫闈㈠眰鐨勭▼搴忥紝灝嗗紓甯哥殑鎹曟崏鍜屽鐞嗘帹榪熷埌UI灞傛槸鏈夊ソ澶勭殑錛屽湪UI灞傚彲浠ヤ嬌鐢ㄥ璇濇鎴栬呭叾浠栨柟寮忔彁紺虹敤鎴峰嚭鐜板紓甯搞?/span>
Best Practices for Exception Handling by Gunjan Doshi
Three Rules for Effective Exception Handling by Jim Cushing
涓句緥鏉ヨ錛屽鏋滃浘涓殑欏剁偣琛ㄧず鍩庡競錛岃岃竟涓婄殑鏉冮噸琛ㄧず钁楀煄甯傞棿寮杞﹁緇忕殑璺濈銆?Dijkstra綆楁硶鍙互鐢ㄦ潵鎵懼埌涓や釜鍩庡競涔嬮棿鐨勬渶鐭礬寰勩?/p>
Dijkstra綆楁硶鐨勮緭鍏ュ寘鍚簡涓涓湁鏉冮噸鐨勬湁鍚戝浘G錛屼互鍙?qiáng)G涓殑涓涓潵婧愰《鐐?em>S銆?鎴戜滑浠?em>V琛ㄧずG涓墍鏈夐《鐐圭殑闆嗗悎銆傚浘涓殑姣忎竴涓竟錛岄兘鏄袱涓《鐐規(guī)墍褰㈡垚鐨勬湁搴忓厓绱犲銆?u,v)琛ㄧず浠庨《鐐?em>u鍒?em>v鏈夎礬寰勭浉榪炪?鍋囪E涓?/em>鎵鏈夎竟鐨勯泦鍚堬紝鑰岃竟鐨勬潈閲嶅垯鐢辨潈閲嶅嚱鏁?em>w: E → [0, ∞]瀹氫箟銆?鍥犳錛?em>w(u,v)灝辨槸浠庨《鐐?em>u鍒伴《鐐?em>v鐨勯潪璐熻姳璐瑰?cost)銆?杈圭殑鑺辮垂鍙互鎯沖儚鎴愪袱涓《鐐逛箣闂寸殑璺濈銆備換涓ょ偣闂磋礬寰勭殑鑺辮垂鍊鹼紝灝辨槸璇ヨ礬寰勪笂鎵鏈夎竟鐨勮姳璐瑰兼誨拰銆?宸茬煡鏈?em>V涓湁欏剁偣s鍙?em>t錛孌ijkstra綆楁硶鍙互鎵懼埌s鍒?em>t鐨勬渶浣庤姳璐硅礬寰?i.e. 鏈鐭礬寰?銆?榪欎釜綆楁硶涔熷彲浠ュ湪涓涓浘涓紝鎵懼埌浠庝竴涓《鐐?em>s鍒頒換浣曞叾浠栭《鐐圭殑鏈鐭礬寰勩?/p>
榪欎釜綆楁硶鏄氳繃涓烘瘡涓《鐐?em>v淇濈暀鐩墠涓烘鎵鎵懼埌鐨勪粠s鍒皏鐨勬渶鐭礬寰勬潵宸ヤ綔鐨勩傚垵濮嬫椂錛屾簮鐐箂鐨勮礬寰勯暱搴﹀艱璧嬩負(fù)0錛?em>d[s]=0錛夛紝 鍚屾椂鎶婃墍鏈夊叾浠栭《鐐圭殑璺緞闀垮害璁句負(fù)鏃犵┓澶э紝鍗寵〃紺烘垜浠笉鐭ラ亾浠諱綍閫氬悜榪欎簺欏剁偣鐨勮礬寰勶紙瀵逛簬V涓墍鏈夐《鐐?em>v闄?em>s澶?em>d[v]= ∞錛夈傚綋綆楁硶緇撴潫鏃訛紝d[v]涓偍瀛樼殑渚挎槸浠?em>s鍒?em>v鐨勬渶鐭礬寰勶紝鎴栬呮槸鏃犵┓澶э紙濡傛灉璺緞涓嶅瓨鍦ㄧ殑璇濓級銆?
Dijstra綆楁硶鐨勫熀紜鎿嶄綔鏄竟鐨勬嫇灞曪細(xì)濡傛灉瀛樺湪涓鏉′粠u鍒?em>v鐨勮竟錛岄偅涔堜粠s鍒皏鐨勬渶鐭礬寰勫彲浠ラ氳繃灝嗚竟(u,v)娣誨姞鍒皊鍒皍鐨勫熬閮ㄦ潵鎷撳睍銆傝繖鏉¤礬寰勭殑闀垮害鏄痙[u]+w(u,v)銆傚鏋滆繖涓兼瘮鐩墠宸茬煡鐨?em>d[v]鐨勫艱灝忥紝鎴戜滑鍙互鐢ㄦ柊鍊兼潵鏇夸唬褰撳墠d[v]涓殑鍊箋傛嫇灞曡竟鐨勬搷浣滀竴鐩存墽琛屽埌鎵鏈夌殑d[v]閮戒唬琛ㄤ粠s鍒皏鏈鐭礬寰勭殑鑺辮垂銆傝繖涓畻娉曠粡榪囬傚綋鐨勭粍緇囧洜鑰屽綋d[u]杈懼埌瀹冩渶緇堢殑鍊肩殑鏃跺欙紝姣忔潯杈?u,v)閮藉彧琚嫇灞曚竴嬈°?/p>
綆楁硶緇存姢涓や釜欏剁偣闆哠鍜孮銆傞泦鍚圫淇濈暀浜嗘垜浠凡鐭ョ殑鎵鏈塪[v]鐨勫煎凡緇忔槸鏈鐭礬寰勭殑鍊奸《鐐癸紝鑰岄泦鍚圦鍒欎繚鐣欏叾浠栨墍鏈夐《鐐廣傞泦鍚圫鍒濆鐘舵佷負(fù)絀猴紝鑰?
鍚庢瘡涓姝ラ兘鏈変竴涓《鐐逛粠Q縐誨姩鍒癝銆傝繖涓閫夋嫨鐨勯《鐐規(guī)槸Q涓嫢鏈夋渶灝忕殑d[u]鍊肩殑欏剁偣銆傚綋涓涓《鐐箄浠嶲涓漿縐誨埌浜哠涓紝綆楁硶瀵規(guī)瘡鏉″鎺ヨ竟(u,v)榪?
琛屾嫇灞曘?/p>
Spring鎺ㄨ崘浜嬪姟鐨勬帶鍒跺湪service灞傚疄鐜幫紝鑰屼笉鏄儚鍗曠嫭浣跨敤hibernate閭f牱錛屽湪dao灞傚疄鐜幫紝榪欐牱鐨勫ソ澶勫湪浜庢洿濂藉湴鏀寔declear鏂瑰紡鐨勪簨鍔★紙service灞傞氬父鎻愪緵鎺ュ彛錛岃繖鏍峰彲浠ラ拡瀵規(guī)帴鍙f潵瀹氫箟浜嬪姟絳栫暐錛岃屼笉鏄拡瀵瑰叿浣撶殑service瀹炵幇錛屽洜姝ゅ彲浠ュ緢鏂逛究鍦版浛鎹ervice鐨勫疄鐜幫紝鑰屼笉闇瑕佷慨鏀逛簨鍔$殑閰嶇疆錛夛紝鏇村姞鐏墊椿銆傚悓鏃訛紝鍙互鏇村姞鏂歸潰鑷劧鍦板疄鐜板叏灞浜嬪姟鐨勬帶鍒躲?/span>
涓句緥濡備笅錛?/p>
service鎺ュ彛
spring.xml錛屾敞鎰忓湪澹版槑浜嬪姟鐨勬椂鍊欙紝鏄拡瀵箂ervice鎺ュ彛鐨勶紝鑰屼笉鏄拡瀵箂ervice瀹炵幇鐨?br>
瀵逛簬妯法澶氫釜Hibernate SessionFacotry鐨勫垎甯冨紡浜嬪姟錛屽彧闇綆鍗曞湴灝?/span> JtaTransactionManager 鍚屽涓?/span> LocalSessionFactoryBean 鐨勫畾涔夌粨鍚堣搗鏉ヤ綔涓轟簨鍔$瓥鐣ャ備綘鐨勬瘡涓涓?/span>DAO閫氳繃bean灞炴у緱鍒板悇鑷殑 SessionFactory 寮曠敤銆傚湪闇瑕佽繘琛岃法澶氫釜鏁版嵁搴撶殑浜嬪姟鎿嶄綔鏃訛紝鍙渶瑕佸畾涔変竴涓?/span>service灞傦紝浣跨敤 JtaTransactionManager 浣滀負(fù)浜嬪姟絳栫暐錛屾í璺ㄥ涓?/span>DAO鍜屽涓?/span>session
factories鏉ュ垝鍒嗕簨鍔★紝鑰屼笉闇瑕佺壒孌婄殑澶勭悊銆?/span>
jPDL鏄竴縐嶇洿瑙傜殑嫻佺▼璇█錛岀敤浠ュ睍鐜板晢涓氶昏緫鐨勫鐞嗚繃紼嬨俲PDL鍖呭惈鐨勬蹇墊秹鍙?qiáng)鋼Q鍔°佸紓姝ラ氳鐘舵併佸畾鏃跺櫒銆佽嚜鍔ㄦ墽琛岀殑鍔ㄤ綔絳夛紝涓烘錛屼負(fù)浜嗘暣鍚堜笂榪拌涓猴紝jPDL鎻愪緵浜嗗己澶с佸彲鎵╁睍鐨勬帶鍒舵祦鏈哄埗銆?/p>
implementation technique for graph based execution languages錛?/p>
The strategy on how graph execution can be implemented on top of an OO programming language. For those who are familiar with design patterns, it's a combination of the command pattern and the chain of responsibility pattern.
1銆乀ransitions 鍙互鐞嗚В涓鴻繘鍏ュ拰紱誨紑鑺傜偣鐨勭澶達(dá)紝搴旇瀛樺湪澶氫釜Transitions 榪涘叆涓涓妭鐐瑰拰涓涓妭鐐規(guī)湁澶氫釜紱誨紑鐨?strong>Transitions 鐨勬儏鍐?/p>
the structure of the graph is represented with the classes Node and Transition錛岃?tt>Transition鏄叿鏈夋柟鍚戞х殑
transitions are able to pass the execution from a source node to a destination node with the method take.
2銆乪xecution 錛岀被浼紁etri涓殑鏍囪錛屾槸鍙樿縼灝辯華鐨勫墠鎻?/strong>
An execution (also known as a token) is represented with a class called Execution. An execution has a reference to the current node.
3銆丯ode
A node is a command and has an execute method. Subclasses of Node are supposed to override the execute method to implement some specific behaviour for that node type.
When an execution arrives in a node, that node is executed. The Node's execute method is also responsible for propagating the execution. Propagating the execution means that a node can pass the execution that arrived in the node over one of its leaving transitions to the next node.
When a node's execute method does not propagate the execution, it behaves as a wait state.
Also when a new execution is created, it is initialized in some start node and then waits for an event.
An event is given to an execution and it can trigger the execution to start moving. If the event given to an execution relates to a leaving transition of the current node, the execution takes that transition. The execution then will continue to propagate until it enters another node that behaves as a wait state.
So now we can already see that the two main features are supported : wait states and a graphical representation. During wait states, an Execution just points to a node in the graph
4銆丄ctions
An Action is a command with an execute method. Actions can be associated with events.
The default propagation of execution is synchronous.
JGAP (pronounced "jay-gap") is a Genetic Algorithms and Genetic Programming component provided as a Java framework. It provides basic genetic mechanisms that can be easily used to apply evolutionary principles to problem solutions. See the examples for a demonstration or watch out the graphical tree that can be created with JGAP for found solutions of genetically evolved programs.
JGAP was designed to be very easy to use "out of the box", while also designed to be highly modular so that more adventurous users can easily plug-in custom genetic operators and other sub-components.
Documentation, quality and stability of code are the top concerns when developing JGAP. You find really many unit tests packaged with JGAP, extensive Javadocs, and quite a lot of examples. Compare JGAP with other projects! Feedback is always welcome.
鏈榪戜竴涓闈㈢殑紼嬪簭闇瑕佷嬌鐢ㄥ祵鍏ュ紡鏁版嵁搴擄紝閫夋嫨浜嗗緢澶氫笉鍚岀殑宓屽叆寮忔暟鎹?鏈緇堥夋嫨浜咹2錛屾ц兘鏄竴涓緢閲嶈鐨勫師鍥狅紝涓嬪浘鏄痟2鎻愪緵鐨凱erformance鐨勬瘮杈冨浘
http://www.h2database.com/html/images/performance.png
h2鏄疶homas Mueller鎻愪緵鐨勪竴涓紑婧愮殑銆佺函java瀹炵幇鐨勫叧緋繪暟鎹簱錛屽湪google涓婇潰鏈夎璁虹粍h2-database@googlegroups.com錛孴homas Mueller涔熼潪甯哥儹鎯咃紝鍥炵瓟闂闈炲父鍙?qiáng)鏃躲?/p>
涓嬮潰璇翠笅鎴戞渶緇堥夋嫨h2鐨勫師鍥狅細(xì)
錛?錛夋ц兘銆佸皬宸?/p>
錛?錛夊悓鏃舵敮鎸佺綉緇滅増鍜屽祵鍏ュ紡鐗堟湰錛屽彟澶栬繕鎻愪緵浜嗗唴瀛樼増
錛?錛夋湁姣旇緝濂界殑鍏煎鎬э紝鏀寔鐩稿綋鏍囧噯鐨剆ql鏍囧噯錛堝疄闄呬笂涔熶笉瀛樺湪涓涓暟鎹簱鑳藉100%絎﹀悎鏍囧噯錛?/p>
錛?錛夋彁渚涗簡闈炲父鍙嬪ソ鐨勫熀浜巜eb鐨勬暟鎹簱綆$悊鐣岄潰
錛?錛夋敮鎸乭ibernate
This database supports the following transaction isolation levels:
When using the isolation level 'serializable', dirty reads, non-repeatable reads, and phantom reads are prohibited.
錛?錛夊悎鐞嗕嬌鐢╟hecked exception鍜寀nchecked exception錛岃鏄庝嬌鐢ㄨ繖涓ょ寮傚父鐨勫師鍒欑殑鏂囩珷寰堝錛屼笉澶氱綏鍡︿簡
錛?錛夊紓甯哥殑杞崲錛屽鏋滈渶瑕侊紝鍙互灝嗗簳灞傜殑寮傚父鍖呰涓哄寘鍚洿澶氬惈涔夌殑鑷畾涔夊紓甯擱噸鏂版姏鍑猴紙鍖呮嫭checked鍜?/span>unchecked鐨勮嚜瀹氫箟寮傚父浣撶郴錛夛紝鑷畾涔夊紓甯鎬笉浠呬粎闇瑕佸寘鍚師濮嬬殑寮傚父淇℃伅錛岃繕瑕佸寘鍚竴浜涚壒瀹氱殑鍚箟鍜屽鐞嗘柟娉曪紱
(3) 寮傚父鐨勬姏鍑猴紝灝介噺涓嶈鍦ㄤ腑闂村眰澶勭悊寮傚父錛岃涔堝湪寮傚父鍙戠敓鐨勫湴鏂瑰鐞嗭紝瑕佷箞鎶涘嚭錛屾帹榪熷埌鐢辨渶緇堣皟鐢ㄥ眰鏉ュ鐞嗭紝姣斿鐢?span style="font-size: 10pt;">涓庣敤鎴風(fēng)洿鎺ユ墦浜ら亾鐨?span lang="EN-US">UI灞?/span>錛屾崟鎹夊紓甯革紝騫朵互閿欒淇℃伅妗嗐佸璇濇絳変俊鎭澆浣撳弽棣堣壇濂界殑淇℃伅緇欑敤鎴?/span>
鑼冧緥錛?span lang="EN-US">
錛?span lang="EN-US">1錛夊畾涔夎嚜瀹氫箟鐨勫紓甯革細(xì)鍖呮嫭浜嗕袱涓瀯閫犲嚱鏁幫紝涓涓敤浜庢彁渚涢粯璁ょ殑寮傚父淇℃伅錛屼竴涓緵紼嬪簭鍛樻坊鍔犳洿鍔犺緇嗙殑寮傚父淇℃伅錛岃繖涓紓甯革紝鍙互鐢ㄦ潵灝佽鎵鏈夌殑搴曞眰寮傚父錛屼絾鏄竴鑸湪閫昏緫涓婃洿鍔犳竻妤氾紝鍙互澧炲姞涓嶅悓鐨勮嚜瀹氫箟寮傚父錛屾瘮濡傛暟鎹簱澶勭悊寮傚父銆佹枃浠跺鐞嗗紓甯搞佺綉緇滃鐞嗗紓甯哥瓑
錛?/span>2錛変嬌鐢ㄨ嚜瀹氫箟鐨勫紓甯稿皝瑁呭簳灞傚紓甯革細(xì)
錛?span lang="EN-US">3錛夊湪鐢ㄦ埛鐣岄潰閮ㄥ垎鐨勫鐞嗭紝閫氳繃MessageDialog鍙嶉緇欑敤鎴鋒紜殑淇℃伅錛?/span>
select calldate,
sum(case class when '1' then callcount else 0 end)
as A綾?span lang="EN-US">,
sum(case class when '2' then callcount else 0 end)
as B綾?span lang="EN-US">,
sum(case class when '3' then callcount else 0 end)
as C綾?