作者:江å—白衣åQŒåŽŸæ–‡å‡ºå¤„ï¼š http://blog.csdn.net/calvinxiu/archive/2007/01/27/1495778.aspxåQŒè{载请ä¿ç•™å‡ºå¤„ã€?/p>
   Unix¾pÈ»Ÿæ°¸è¿œåªä¼š‘Šæ¥‘Šå¤šåQŒå¼€å‘äh员就没必è¦ç‰¹æ„å¦ä¹ 它们的安装ã€é…¾|®å’Œ½Ž¡ç†äº†ï¼Œž®±å…¨éƒ¨äº¤¾l™é›†æˆäh员å§ã€?br />   但开å‘äh员行èµîCºŽUnix之间åQŒä¾ç„¶æœ‰å››æ ·ä¸œè¥¿è¦ç†Ÿ¾lƒã€?/p>
   虽然Unix上的文本¾~–辑器已¾lè¶Šæ¥è¶Šå¥½ç”¨åQŒä½†ä¸åœ¨Consoleå‰é¢åQŒç½‘速也ä¸å¤Ÿ˜qžXWindows的时候,˜q˜æ˜¯è¦ä¾èµ–VIã€?br />   回想VI的时代背景,å‘现VI对开å‘äh员已¾l周到得¼›»è°±äº†ï¼Œçƒé”®å¤šåˆ°ä½ åŒæ‰‹ä¸¼›»é”®ç›˜å°±èƒ½å®Œæˆå¤§åŠç¼–辑工作ã€?br />Â Â Â å»ø™®®è‡ªå·±åˆ¶ä½œä¸€å¼ 自å·Þp®¤ä¸ºæœ‰ç”¨ï¼Œä½†åˆ¾l常忘记的命令的sheetåQŒæ‹¿å‡ø™€ƒè¯•的力气把它背熟ã€?/p>
     开å‘äh员在Unix下干得最多的除了Make和除Bug外,大概ž®±æ˜¯å¤„ç†æ—¥å¿—æ–‡äšgã€ä¸šåŠ¡æ–‡ä»¶è¿›è¡ŒæŸ¥é”™å’Œ¾lŸè®¡äº†ã€?br />    åªä¼šmoreå’Œgrep是ä¸å¤Ÿçš„åQŒå¼€å‘è€æ‰‹ä¼šæŠŠawk,sed,grep,sort,uniq,wc,head,tail˜q™äº›æ–‡æœ¬å¤„ç†å‘½ä×oåQŒé€šè¿‡½Ž¡é“玩具å¼çš„æ‹†å¸æ‹ÆD£…åQŒæœ€åŽå®Œæˆä¸€ä»¶åŽŸæœ¬ä»¥ä¸ºéž¾~–写大段代ç ä¸å¯çš„å·¥ä½œã€‚å‘¨åˆ°çš„å‚æ•°è®‘Ö®šåQŒè®©äººå†ä¸€‹Æ¡æ„Ÿåšw‚£ä¸ªç®€å•çš„òq´ä»£åQŒè¿™æ ·å¤æ‚到æžè‡´çš„设è®?......怪ä¸å¾—《Unix ¾~–程艺术》的作者有那么骄傲的自觉ã€?/p>
Â Â Â Â æ¯”å¦‚è½¦ä¸œçš„æ¯æœˆè®¿é—®TOP10 ¾lŸè®¡è„šæœ¬åQ?/p>
   ¾~–程是开å‘äh员的天赋本能åQŒä¸è®ÞZ»€ä¹ˆè¯a€åQŒçœ‹çœ‹å‚考手册应该就能上手ã€?/p>
   è§?a >Bash新手指å—䏿–‡ç‰?/a>åQŒä¸€ä»½å†™¾l™æ–°æ‰‹çœ‹çš„包å«å¾ˆå¤šè€æ‰‹çŸ¥è¯†çš„æŒ‡å—ã€?/p>
   用过Javaçš„AntåŽï¼ŒæƒŒ™“vMakež®Þp§‰å¾—很烦,很厌倦。æ€Õd½’˜q˜æ˜¯ä¼šçš„åQŒè§GNU Make 3.8.0 䏿–‡æ‰‹å†ŒÂ   Â
    ä¸è¿‡å³ä‹Émake已绾_ùN€šåˆ°å˜æ€ï¼Œæ¯ä¸ªäººå†™å‡ºæ¥çš„MakeFile˜q˜æ˜¯åƒå¥‡ç™¾æ€ªï¼Œå†çœ‹çœ‹å¼€æºé¡¹ç›®ä»¬ä¸ªä¸ªéƒ½æ˜¯automake+autoconf了,我们自己也长˜q›ä¸€ç‚¹å§ã€‚手工编写MakeFile.amåQŒè®©auotomakeå˜æˆMakeFile.inåQŒå†è®©ç”¨æˆ?/configure ç”Ÿæˆæœ€¾lˆçš„MakeFileã€?br />   Â
   生æˆçš„MakeFile既能跨越òq›_°åQŒåˆæ˜¯æ ‡å‡†çš„写法åQŒæœ€é‡è¦çš„æ˜¯åQŒç¼–写MakeFile.amçš„å·¥ä½œé‡æ¯”MakeFilež®‘多了,åªè¦½Ž€å•çš„å®šä¹‰ç›®æ ‡æ–‡äšgåQŒå…ˆè¦å¤„ç†çš„å目录,需è¦çš„æºæ–‡ä»Óž¼Œå¤´æ–‡ä»¶ä¸Žåº“文件就å¯ä»¥äº†ã€‚如果看完下é¢ä¸¤½‹‡è¿˜æ˜¯ä¸æ‡‚,直接看ACE里的Makefile.amž®±æ‡‚了ã€?/p>
Â Â Â Â å…¥é—¨æ–‡ç« åQ?a >使用AutoMakeè½ÀL¾ç”ŸæˆMakefileÂ
   ˜q›é˜¶æ–‡ç« åQ?a href="javascript:void(0);/*1169901219468*/">IBM DW:ä¾?/a>è§?autoconf å’?automake ç”Ÿæˆ Makefile æ–‡äšg
   完整的å…费电å书åQšÂ?a >GNU Autoconf, Automake and Libtool
   å¦å¤–åQŒACE里还贡献了一个更厉害çš?a >MPC(Makefile, Project, and Workspace Creator )åQŒÂ  自动的生æˆäº†MakeFile.am或者VC的项目文件ã€?br />
   上下左å³åQ?/strong>
   ctrl+u/d 上下åŠå±åQŒctrl+f/b,上下一å±?br />   H/Gå±å¹•å¤?æ–‡ç« æœ?åQ?/$ 行首行末
  Â
Â Â Â å¢žåˆ æ”¹ï¼š
   yy/dd å¤åˆ¶/åˆ é™¤ 一行,p/PåQšå°†yy/dd的内容paste出æ¥
   I/A 在行é¦?æœ«æ·»åŠ ï¼Œ o/O 开新行åQŒd0/d$ åˆ é™¤åˆ°è¡Œé¦–ï¼Œè¡Œæœ«
   u:undo
   查:
   ? å‘剿Ÿ¥æ‰¾åQ?n/N é‡å¤ä¸Šä¸€‹Æ¡æŸ¥æ‰?/p>
  awkåQ?/strong>处熾l“构化的文本(æ¯è¡Œä»¥å›ºå®šç¬¦å·åˆ†æˆè‹¥òq²åˆ—)åQŒæå–æ‰“å°æŸäº›å—ŒDµï¼Œå¦‚:
   ls -l|awk '{print $1}' --ž®†ls-l¾l“果的第一列打å°å‡ºæ?br />   awk -F":" '{print $1" "$6}' /etc/passwd åQŒå°†ä»?分割çš?etc/passwdæ–‡äšg的第1åQ?列打å°å‡ºæ¥ï¼Œä¸é—´ä»¥ç©ºæ ¼åˆ†å¼€
   详è§IBM DWä¸å›½çš„AWK实例(å…?½‹? æˆ?Bash新手指å—䏿–‡ç‰ˆç¬¬6ç«?/a>ã€?/p>
   sedåQ?/strong>‹¹ç¼–辑器åQŒä¸»è¦ç”¨äºŽæ›¿æ¢ï¼Œå¦‚:
   sed -e '1,10s/foo/bar/g' myfile2.txt ž®?åˆ?0行的文本ä¸çš„foo æ›¿æ¢æˆbar,s代表替æ¢,g代表全局替æ¢
Â Â Â æ”¯æŒæ£åˆ™çš„æ›¿æ¢å—½W¦ä¸²åQŒå¯ä»¥åªæ›¿æ¢æŸä¸ªèŒƒå›´å†…的内容ã€?br />   用法ä¸ç®—½Ž€å?详è§IBM DWä¸å›½çš„Sed实例(å…?½‹?æˆ?Bash新手指å—䏿–‡ç‰ˆç¬¬5ç«?/a>ã€?br />   Â
   sortåQ?/strong>排åºåQŒå‚数有åQ?br />   -r逆åº, -n æ•°å—æ¯”较 , -M 日历比较 Feb,Dec, -f 忽略大å°å†?br />Â Â Â åŒæ ·æ”¯æŒ¾l“构化文ä»Óž¼Œå¦?br />   sort -t : -k 1,1 /etc/passwdåQŒä»¥: 分割,åªæŒ‰½W?列排åº?br />   sort -t : -k 1,1 -k2.2,3.4 /etc/passwd åQŒä»¥:分割,先按½W?列排åº?冿Œ‰½W?列的½W¬äºŒä¸ªå—½W¦åˆ°½W?列的½W?个嗽W¦æŽ’åºã€?/p>
   wcåQ?/strong> ¾lŸè®¡ã€?br />   -l è¡?-m å—符,-w å•è¯
PS:以下文å—ä¸ç®—å—æ•°Â
    一个多月没有更新åšå®¢äº†åQŒå› 为公å”R‡Œè°ƒäº†æ–°éƒ¨é—¨ï¼Œå¾ˆå¤šä¸œè¥¿è¦å¦ä¹ 。太久没试过åŽä¸½çš„åœ¨ä¸Šçæ—‰™—´åQŒåœ¨å·¥ä½œä¸ï¼Œåœ¨åŒäº‹ä»¬íw«ä¸Šå¦åˆ°˜q™ä¹ˆå¤šä¸œè¥¿äº†åQŒå¾ˆæ˜¯å¼€å¿ƒã€?br />Â Â Â Â ä¸‹å‘¨å¼€å§‹çˆ†å‘æ›´æ–°ã€?/p>
在环境å˜é‡ä¸è®„¡½®ä»¥ä¸‹ä¸‰ä¸ªå˜é‡åQ?br />JAVA_HOME=C:\j2sdk1.4.1 //å¯ä»¥æ”¹äؓ相应的目å½?br />CLASSPATH=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
PATH=%JAVA_HOME%\bin;%PATH%
ç„¶åŽåœ¨å‘½ä»¤è¡Œè¾“å…¥java -version命ä×oåQŒå¦‚果出çŽ?br />java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
则说明已¾lé…¾|®æˆåŠŸï¼
HelloWorld.javaæºç¨‹åºå¦‚下:
public class HelloWorld{Â
 public static void main(String[] args) { Â
  System.out.println("Hello World!");Â
  }
}
在命令行执行javac HelloWorld.java
如果没有输出ä»ÖM½•ä¿¡æ¯åˆ™è¯´æ˜Žç¼–译æˆåŠŸã€?/p>
在命令行˜q行java HelloWorldåQŒè¾“出:
Hello World!
代表æˆåŠŸæ‰§è¡Œäº†java½E‹åºã€?/p>
-----------------
åˆå¦è€…常犯的错误
-----------------
1. ˜q行æ—Óž¼Œå¸¦äº†.classåŽç¼€
å¦‚æžœä½ è¯•å›¾ä‹É用如下命令:
E:\java\src>java HelloWorld.class
¾pÈ»Ÿä¼šè¯¯è®¤äØ“ä½ è¿è¡Œçš„æ˜¯HelloWorld包下的å为class的类文äšgåQŒä¼šåˆ°ç³»¾lŸçš„CLASSPATH下(一般都包括当å‰ç›®å½•åQ‰ä¼å›‘Ö¯»æ‰¾HelloWorld.class.class˜q™æ ·çš„ç±»åQŒè¿™æ ïLš„¾cÕd½“ç„¶ä¸å˜åœ¨äº†ï¼›òq¶ä¸”也ä¸å¯èƒ½å˜åœ¨åQŒå› 为class是关键å—åQŒä¸èƒ½ä½œä¸ÞZ¸€ä¸ªç±»çš„åå—。所以会报如下错误信æ¯ï¼š
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class
2. æ–‡äšgå大ž®å†™é”™è¯¯
对于åƒWindows˜q™æ ·çš„ç³»¾lŸï¼Œ¾~–译时å¯ä»¥ä¸å…›_¿ƒå¤§å°å†™ã€‚比如编译HelloWorld.javaæ—Óž¼Œä¹Ÿå¯ä»¥ä‹É用:
E:\java\src>javac helloworld.java
也å¯ä»¥ç¼–译通过åQŒä½†äº§ç”Ÿçš„类文äšgä»ç„¶æ˜¯å’Œæºæ–‡ä»¶ç›¸½W¦çš„åQšHelloWorld.classã€?br />但在˜qè¡Œæ—¶ä¸€å®šè¦æ³¨æ„大å°å†™ï¼Œæ¯”如试图使用如下命ä×o˜q行åQ?br />E:\java\src>java helloworld
ž®†æŠ¥¾cÖM¼¼äº?ä¸çš„错误åQ?br />Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)
----------------------------
包å«åŒ…层‹Æ¡çš„HelloWorld.java
----------------------------
比如上é¢çš„HelloWorld.java修改如下åQ?br />package org.javaresearch;
public class HelloWorld{
public static void main(String[] args) {
System.out.println("Hello World!");Â
}
}
¾~–è¯‘æ—¶æœ‰ä¸¤ç§æ–ÒŽ³•
1. 直接¾~–译
E:\java\src>javac HelloWorld.java
æ¤æ—¶åœ¨å½“å‰ç›®å½•下输出HelloWorld.classã€‚æ¤æ—Óž¼Œ˜q行ä¸èƒ½ä½¿ç”¨ä¸Šé¢ç›¸åŒçš„æ–¹æ³•,使用åQ?br />E:\java\src>java HelloWorld
˜q行æ—Óž¼Œå‡ºçŽ°å¦‚ä¸‹é”™è¯¯åQ?br />Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)
从上˜q°é”™è¯¯ä¿¡æ¯ä½ 也å¯ä»¥çœ‹åˆŽÍ¼Œ¾pÈ»Ÿå¯ä»¥æ‰‘Öˆ°HelloWorld¾c»ï¼ˆå› 䨓当å‰è·¯å¾„包å«åœ¨CLASSPATHä¸ï¼Œå…·ä½“ä¸ÞZ»€ä¹ˆä¼šæç¤ºwrong nameåQŒæœ‰å…´è¶£çš„æœ‹å‹å‚è§Javaè¯è¨€è§„范åQ‰ï¼Œä½†è¿™ä¸ªç±»å±žäºŽorg.javaresearchåŒ…ã€‚æ‰€ä»¥ï¼Œä½ è¦åšçš„ž®±æ˜¯æŒ‰ç…§ä¸Šè¿°åŒ…层‹Æ¡ï¼Œç›¸åº”的创建目录层‹Æ¡ï¼ŒæŠŠä¸Šé¢ç”Ÿæˆçš„HelloWorld.class攑ֈ°E:\java\src\org\javaresearch\目录下。è¿è¡Œï¼š
E:\java\src >java org.javaresearch.HelloWorld
¾pÈ»Ÿæ‰“å°å‡ºï¼š
Hello World!
˜q™å„¿è¦æ³¨æ„的是,ä¸èƒ½ä½¿ç”¨java org\javaresearch\HelloWorldæ¥è¿è¡Œï¼Œæ¤æ—¶åŒæ ·ä¼šå‡ºçŽ°å¦‚ä¸‹é”™è¯¯ï¼š
Exception in thread "main" java.lang.NoClassDefFoundError:org\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)
2. 使用 -d <directory>¾~–译选项
æ˜¯ä¸æ˜¯è§‰å¾—上é¢çš„¾~–译æ–ÒŽ³•有点éºÈƒ¦åQŒèƒ½ä¸èƒ½è‡ªåŠ¨åœ¨å½“å‰èµ\径(或ä“Qæ„æŒ‡å®šçš„路径åQ‰ä¸‹ç”ŸæˆåŒ…层‹Æ¡å‘¢åQŸæœ‰åQä‹Éç”?d <directory>¾~–译选项ž®Þpƒ½åšåˆ°ã€?br />E:\java\src >javac -d . HelloWorld.java
æ¤æ—¶åQŒåœ¨å½“å‰ç›®å½•下就生æˆäº†ä¸€ä¸ªorg\javaresearch目录åQŒåƈ且输出的.classæ–‡äšg也在里é¢ã€‚è¿è¡Œï¼š
E:\java\src >java org.javaresearch.HelloWorld
¾pÈ»Ÿæ‰“å°åQšHello World!
å¦‚æžœä½ æƒ³æŠŠç”Ÿæˆçš„¾cÀL–‡ä»‰™›†ä¸å˜æ”‘Öœ¨ä¸€ä¸ªç›®å½•ä¸åQŒæ¯”如:E:\java\classesä¸‹ï¼Œé‚£ä¹ˆä½ é¦–å…ˆåˆ›å»ø™¿™ä¸ªç›®å½•,然厾~–译æ—Óž¼š
E:\java\src >javac -d E:\java\classes HelloWorld.java
ž®±å¯ä»¥æŠŠç”Ÿæˆçš„类文äšg攑ֈ°E:\java\classes目录下,òq¶ä¸”按照包层‹Æ¡ç›¸åº”的创å¾ç›®å½•è·¯å¾„ã€‚ä½ å¯ä»¥åœ¨E:\java\classes\org\javaresearch下找到HelloWorld.classæ–‡äšgã€‚æ¤æ—¶ä‹É用如下命令å¯ä»¥æ£¼‹®è¿è¡Œï¼ˆæ³¨æ„如果è¦ç”¨åˆ°å…¶å®ƒç±»åQŒè¯·åœ¨CLASSPATHä¸è®¾å¥½ï¼‰åQ?br />E:\java\classes >java org.javaresearch.HelloWorld
æˆ–è€…ä½ å¯ä»¥åœ¨E:\java目录下题q行以下命ä×oæ¥æ‰§è¡?br />E:\java >java -classpath .\classes org.javaresearch.HelloWorld
使用javaçš?classpath傿•°å¯ä»¥ž®†ä¸€äº›ç›®å½•åŠ å…¥ç±»è·¯å¾„
-------------------
打包jaræ–‡äšg
-------------------
å¯ä»¥æŠŠä¸€ä¸ªåŒ…内的所有classæ–‡äšg打包ä¸ÞZ¸€ä¸ªjaræ–‡äšgåQŒä¾¿äºŽå˜æ”‘Ö’Œ˜q行。以上文的org.javaresearchåŒ…äØ“ä¾‹ï¼Œå…¶æ‰“åŒ…å‘½ä»¤å¦‚ä¸‹ï¼š
E:\java\classes >jar cvf wxb.jar org
会生æˆä¸€ä¸ªwxb.jaræ–‡äšgåQŒå°†å…¶ä¸META-INF\MANIFEST.MFæ–‡äšg䏿·»åŠ å¦‚ä¸‹ä¸€è¡Œï¼š
Main-Class: org.javaresearch.HelloWorld
ä¿å˜jaræ–‡äšgã€?/p>
æˆ–è€…é¦–å…ˆåˆ›å»ºåÆˆ¾~–辑一个MANIFEST.MFæ–‡äšgåQŒå…¶å†…容如下åQ?br />Manifest-Version: 1.0
Created-By: 1.4.1 (Sun Microsystems Inc.)
Main-Class: org.javaresearch.HelloWorld
ž®†å…¶ä¿å˜åˆ°classes目录ä¸?br />然厞®†å…¶ä¸€èµäh‰“包到jaræ–‡äšgä¸ï¼Œæ‰“包命ä×o如下åQ?br />E:\java\classes >jar cvfm wxb.jar MANIFEST.MF org
-------------
˜q行jaræ–‡äšg
-------------
在命令行ä¸è¾“入如下命令å³å¯ï¼š
E:\java\classes >java -jar wxb.jar
输出为:
Hello World!
------------------------
用Antæ¥ç¼–译è¿è¡Œjava½E‹åº
------------------------
首先安装AntåQŒæ¥éª¤å¾ˆ½Ž€å•:
1.ž®†Ant压羃包解压到一个目录,例如D:\Ant1.5.2åQ?br />2.在环境å˜é‡ä¸æ·ÕdР以䏋å˜é‡åQ?br />ANT_HOME=D:\Ant1.5.2 //å¯ä»¥æ”¹äؓ相应的目å½?br />3.修改Path环境å˜é‡
PATH=%ANT_HOME%\bin;%PATH%
最åŽç»™å‡ÞZº†ä¸€ä¸ªAntçš„build.xmlæ–‡äšgåQŒè¿è¡Œantå›_¯å®Œæˆæ‰€æœ‰ä»¥ä¸Šçš„¾~–译和è¿è¡Œè¿‡½E‹ï¼Œå…¶buildæ–‡äšg如下åQ?br /><project name="HelloWorld" default="jar" basedir=".">
   <description>
       building HelloWorld!
   </description>
 <!-- set global properties for this build -->
 <property name="src" location="src"/>
 <property name="build" location="classes"/>
 <property name="dist" location="dist"/>
 <property name="user.name" value="Wang Xuebin"/>
 <target name="init">
   <!-- Create the time stamp -->
   <tstamp/>
   <!-- Create the classes directory structure used by compile -->
   <mkdir dir="${build}"/>
 </target>
 <target name="build" depends="init" description="build the source code" >
   <!-- Compile the java code from ${src} into ${build} -->
   <javac srcdir="${src}" destdir="${build}"/>
 </target>
 <target name="jar" depends="build"
       description="generate the distribution" >
   <!-- Create the distribution directory -->
   <mkdir dir="${dist}/lib"/>
   <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
  <jar destfile="${dist}/HelloWorld-${DSTAMP}.jar" basedir="${build}">
   <manifest>
    <attribute name="Built-By" value="${user.name}"/>
    <attribute name="Main-Class" value="org.javaresearch.HelloWorld"/>
   </manifest>
  </jar>Â
 </target>
Â
 <target name="run" depends="build" description="run HelloWorld">
   <java classpath="${build}" classname="org.javaresearch.HelloWorld"></java>
 </target>
 <target name="runjar" depends="jar" description="run HelloWorld in jar file">
        <java jar="${dist}/HelloWorld-${DSTAMP}.jar"
          fork="true"
          failonerror="true"
          maxmemory="128m"
          >
        <arg value="-h"/>
        <classpath>
          <pathelement location="${dist}/HelloWorld-${DSTAMP}.jar"/>
          <pathelement path="${java.class.path}"/>
        </classpath>
      </java>
 </target>
Â
 <target name="clean"
       description="clean up" >
   <!-- Delete the ${build} and ${dist} directory trees -->
   <delete dir="${build}"/>
   <delete dir="${dist}"/>
 </target>
</project>
  ˜q‘å¹´æ¥ï¼Œéšç€Internet/Intranet建网技术的飞速å‘展和在世界范围内的迅速普åŠï¼Œè®¡ç®—æœ?/p>
  应用½E‹åºå·²ä»Žä¼ 统的桌é¢åº”用è{到Web应用。基于B/SåQˆBrowser/ServeråQ‰æž¶æž„çš„3层开呿¨¡å¼é€æ¸å–代C/SåQˆClient/ServeråQ‰æž¶æž„çš„å¼€å‘æ¨¡å¼ï¼Œæˆäؓ开å‘ä¼ä¸šçñ”应用和电å商务普é采用的技术。在Web应用开å‘的早期åQŒä¸»è¦ä‹É用的技术是CGIåH?a target="_blank">ASPåH?a target="_blank">PHP½{‰ã€‚之åŽï¼ŒSunå…¬å¸æŽ¨å‡ºäº†åŸºäº?a target="_blank">Javaè¯è¨€çš„Servlet+Jsp+JavaBeanæŠ€æœ¯ã€‚ç›¸æ¯”ä¼ ¾lŸçš„å¼€å‘æŠ€æœ¯ï¼Œå®ƒå…·æœ‰è·¨òq›_°åH?a target="_blank">安全åH‘有效﹑å¯ç§»æ¤ç‰ç‰ÒŽ€§ï¼Œ˜q™ä‹É其更便于使用和开å‘ã€?/p>
  Java应用½E‹åºè®‰K—®æ•°æ®åº?/font>的基本原ç?/p>
  在Javaè¯è¨€ä¸ï¼ŒJDBCåQˆJava DataBase ConnectionåQ‰æ˜¯åº”用½E‹åºä¸Žæ•°æ®åº“沟通的桥æ¢,
  å³Javaè¯è¨€é€šè¿‡JDBC技术访问数æ®åº“。JDBC是一¿U“开æ”ä€çš„æ–ÒŽ¡ˆåQŒå®ƒä¸ºæ•°æ®åº“应用开å‘äh员﹑数æ®åº“å‰å°å·¥å…·å¼€å‘äh员æä¾›äº†ä¸€¿Uæ ‡å‡†çš„åº”ç”¨½E‹åºè®¾è®¡æŽ¥å£åQŒä‹Éå¼€å‘äh员å¯ä»¥ç”¨¾U¯Javaè¯è¨€¾~–写完整的数æ®åº“应用½E‹åºã€‚JDBCæä¾›ä¸¤ç§APIåQŒåˆ†åˆ«æ˜¯é¢å‘å¼€å‘äh员的APIå’Œé¢å‘底层的JDBC驱动½E‹åºAPIåQŒåº•层主è¦é€šè¿‡ç›´æŽ¥çš„JDBC驱动和JDBC-ODBC桥驱动实çŽîC¸Žæ•°æ®åº“çš„˜qžæŽ¥ã€?/p>
  一般æ¥è¯ß_¼ŒJava应用½E‹åºè®‰K—®æ•°æ®åº“çš„˜q‡ç¨‹åQˆå¦‚å›?所½Cºï¼‰æ˜¯ï¼š
  ①装载数æ®åº“驱动½E‹åºåQ?/p>
  ②通过JDBC建立数æ®åº“连接;
  ③访问数æ®åº“åQŒæ‰§è¡ŒSQLè¯å¥åQ?/p>
  ④æ–开数æ®åº“连接ã€?/p>
POåQ?br />persistant objectæŒä¹…对象
最形象的ç†è§£å°±æ˜¯ä¸€ä¸ªPOž®±æ˜¯æ•°æ®åº“ä¸çš„一æ¡è®°å½•ã€?br />好处是å¯ä»¥æŠŠä¸€æ¡è®°å½•作ä¸ÞZ¸€ä¸ªå¯¹è±¡å¤„ç†ï¼Œå¯ä»¥æ–¹ä¾¿çš„è{为其它对象ã€?br />
BOåQ?br />business object业务对象
主è¦ä½œç”¨æ˜¯æŠŠä¸šåŠ¡é€»è¾‘ž®è£…ä¸ÞZ¸€ä¸ªå¯¹è±¡ã€‚这个对象å¯ä»¥åŒ…括一个或多个其它的对象ã€?br />比如一个简历,有教育ç»åކã€å·¥ä½œç»åކã€ç¤¾ä¼šå…³¾pȉ½{‰ã€?br />我们å¯ä»¥æŠŠæ•™è‚²ç»åŽ†å¯¹åº”ä¸€ä¸ªPOåQŒå·¥ä½œç»åŽ†å¯¹åº”ä¸€ä¸ªPOåQŒç¤¾ä¼šå…³¾pÕd¯¹åº”一个POã€?br />建立一个对应简历的BOå¯¹è±¡å¤„ç†½Ž€åŽ†ï¼Œæ¯ä¸ªBO包嫘q™äº›POã€?br />˜q™æ ·å¤„ç†ä¸šåŠ¡é€»è¾‘æ—Óž¼Œæˆ‘们ž®±å¯ä»¥é’ˆå¯¹BOåŽÕd¤„ç†ã€?br />
VO åQ?br />value object值对è±?br />ViewObject表现层对è±?br />
主è¦å¯¹åº”ç•Œé¢æ˜„¡¤ºçš„æ•°æ®å¯¹è±¡ã€‚对于一个WEB™åµé¢åQŒæˆ–者SWTã€SWING的一个界é¢ï¼Œç”¨ä¸€ä¸ªVO对象对应整个界é¢çš„倹{€?br />
DTO åQ?br />Data Transfer Objectæ•°æ®ä¼ 输对象
主è¦ç”¨äºŽ˜qœç¨‹è°ƒç”¨½{‰éœ€è¦å¤§é‡ä¼ 输对象的地方ã€?br />æ¯”å¦‚æˆ‘ä»¬ä¸€å¼ è¡¨æœ?00个嗌Dµï¼Œé‚£ä¹ˆå¯¹åº”çš„POž®±æœ‰100个属性ã€?br />但是我们界é¢ä¸Šåªè¦æ˜¾½C?0个嗌Dµï¼Œ
客户端用WEB serviceæ¥èŽ·å–æ•°æ®ï¼Œæ²¡æœ‰å¿…è¦æŠŠæ•´ä¸ªPOå¯¹è±¡ä¼ é€’åˆ°å®¢æˆ·ç«¯ï¼Œ
˜q™æ—¶æˆ‘们ž®±å¯ä»¥ç”¨åªæœ‰˜q?0个属性的DTOæ¥ä¼ 递结果到客户端,˜q™æ ·ä¹Ÿä¸ä¼šæš´éœ²æœåŠ¡ç«¯è¡¨ç»“æž?到达客户端以åŽï¼Œå¦‚果用这个对象æ¥å¯¹åº”ç•Œé¢æ˜„¡¤ºåQŒé‚£æ¤æ—¶å®ƒçš„íw«ä†¾ž®Þp{为VO
POJO åQ?br />plain ordinary java object ½Ž€å•java对象
个äh感觉POJOæ˜¯æœ€å¸¸è§æœ€å¤šå˜çš„对象,是一个ä¸é—´å¯¹è±¡ï¼Œä¹Ÿæ˜¯æˆ‘们最常打交é“的对象ã€?br />
一个POJOæŒä¹…化以åŽå°±æ˜¯PO
ç›´æŽ¥ç”¨å®ƒä¼ é€’ã€ä¼ 递过½E‹ä¸ž®±æ˜¯DTO
直接用æ¥å¯¹åº”表示层就是VO
DAOåQ?br />data access objectæ•°æ®è®‰K—®å¯¹è±¡
˜q™ä¸ªå¤§å®¶æœ€ç†Ÿæ‚‰åQŒå’Œä¸Šé¢å‡ 个O区别最大,基本没有互相转化的å¯èƒ½æ€§å’Œå¿…è¦.
主è¦ç”¨æ¥ž®è£…å¯ÒŽ•°æ®åº“的访问。通过它å¯ä»¥æŠŠPOJOæŒä¹…åŒ–äØ“POåQŒç”¨PO¾l„装出æ¥VOã€DTO
      æ€È»“ä¸‹æˆ‘è®¤äØ“ä¸€ä¸ªå¯¹è±¡ç©¶ç«Ÿæ˜¯ä»€ä¹ˆOè¦çœ‹å…·ä½“环境åQŒåœ¨ä¸åŒçš„层ã€ä¸åŒçš„应用场åˆåQŒå¯¹è±¡çš„íw«ä†¾ä¹Ÿä¸ä¸€æ øP¼Œè€Œä¸”对象íw«ä†¾çš„è{化也是很自然的。就åƒä½ 对è€å©†æ¥è¯´ž®±æ˜¯è€å…¬åQŒå¯¹çˆ¶æ¯æ¥è¯´ž®±æ˜¯å女。设计这些概å¿ëŠš„åˆè¡·ä¸æ˜¯ä¸ÞZº†å”¬äh而是ä¸ÞZº†æ›´å¥½çš„ç†è§£å’Œå¤„ç†å„ç§é€»è¾‘åQŒè®©å¤§å®¶èƒ½æ›´å¥½çš„åŽÈ”¨é¢å‘对象的方å¼å¤„ç†é—®é¢?
      大家åƒä¸‡ä¸è¦é™·å…¥˜q‡åº¦è®¾è®¡åQŒå¤§å¯ä¸å¿…äØ“äº†è®¾è®¡è€Œè®¾è®¡ä¸€å®šè¦åœ¨ä»£ç ä¸åŒºåˆ†å„个对象。一å¥è¯æŠ€æœ¯æ˜¯ä¸ºåº”用æœåŠ¡çš„ã€?br />
‹Æ¢è¿ŽæŒ‡æ£ã€?br />
    åšwebå¼€å?òq´äº†åQŒå±…ç„¶æ‰å‘现有这么好的æµè§ˆå™¨å¼€å‘工典P¼ŒçœŸæ˜¯æƒæ„§äº?br />
      åšJavaçš„webå¼€å‘,肯定¼›ÖM¸å¼€‹¹è§ˆå™¨ï¼ŒçŽ°åœ¨‹¹è¡Œçš„æµè§ˆå™¨é™¤äº†å¾®èÊYçš„IEåQŒè¿˜æœ‰å…¶ä»–æµè¡Œçš„‹¹è§ˆå™¨ï¼šfirefox,opera。俗è¯è¯´åQšâ€œæ¬²è¦å–„其事åQŒå¿…先利其器â€ï¼Œä¸‹é¢æˆ‘就列出工作ä¸é’ˆå¯¹è¿™äº›æµè§ˆå™¨å¸¸ç”¨çš„工兗÷€?br />1.Instant Source ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹IE的工兗÷€‚对¾|‘é¡µæºæ–‡ä»¶çš„æŸ¥çœ‹åQŒå¯ä»¥ä‹É我们获得更多与网™å늛¸å…³çš„ä¿¡æ¯åQŒå¯¹¾|‘页制作者æ¥è¯ß_¼Œä¸€äº›è®¾è®¡å¾—较有特色的网™åµï¼Œé€šè¿‡å¯¹å…¶æºä»£ç æ¥æŸ¥çœ‹ä»¥ä½œ˜q›ä¸€æ¥åœ°å¦ä¹ 借鉴ž®±æ›´æœ‰å¿…è¦äº†ã€‚但在IE䏿Ÿ¥çœ‹æºæ–‡äšgæžäØ“ä¸ä¾¿ã€‚Instant Source是一个éžå¸¸å®žç”¨çš„IEæ’äšgåQŒåªè¦ä½ ç”¨é¼ æ ‡æŒ‡å‘网™åµä¸Šçš„æŸä¸€å…ƒç´ åQŒå®ƒçš„HTML代ç ä¾¿å³æ—¶æ˜¾½Cºå‡ºæ¥ï¼Œé…åˆShiftã€Ctrl键的æ“作åQŒè¿˜å¯ä»¥é”定昄¡¤ºçš„æºä»£ç 和显½CºHTML代ç 的上¾U§å…ƒç´ 。æ¤å¤–ï¼Œé€šè¿‡é¼ æ ‡˜q˜å¯ä»¥ç›´æŽ¥èŽ·å–网™åµä¸Šå„ç§é¢œè‰²çš„Rã€Gã€B值åŠHEX代ç ã€?br />2.ieHTTPHeaders ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹IE的工兗÷€‚我们进行webå¼€å‘的时候,使用的就是httpåè®®åQŒè¿™ä¸ªèÊY件能够帮助我们查看httpå议的表头的信æ¯ã€?br />3.Internet Explorer Developer Toolbar ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹IE的工兗÷€‚IE Developer Toolbar ç‰ÒŽ€§å¦‚下: åQæµè§ˆå’Œä¿®æ”¹Web™å늚„文档对象模型åQˆDOMåQ‰ã€‚ï¼é€šè¿‡å¤šç§æŠ€æœ¯æ–¹å¼å®šä½ã€é€‰å®šWeb™åµä¸Šçš„ç‰¹å®šå…ƒç´ ã€‚ï¼¼›æ¢æˆ–æ¿€‹z»IE讄¡½®ã€‚ï¼æŸ¥çœ‹HTML对象的类åã€IDåQŒä»¥åŠç±»ä¼¼é“¾æŽ¥èµ\径ã€tab™åºåºã€å¿«æ·é”®½{‰ç»†èŠ‚ã€‚ï¼æç»˜è¡¨æ ¼ã€å•å…ƒæ ¼ã€å›¾ç‰‡æˆ–é€‰å®šæ ‡ç¾çš„è½®å»“ã€‚ï¼æ˜„¡¤ºå›„¡‰‡è±¡ç´ ã€å¤§ž®ã€èµ\å¾„ã€æ›¿ä»£æ–‡å—ç‰ã€‚ï¼åÏx—¶é‡å®šä¹‰æµè§ˆå™¨½H—å£å¤§å°åˆ?00x600或自定义大å°ã€‚ï¼æ¸…空‹¹è§ˆå™¨ç¼“å˜å’ŒcookieåQŒè¢«æ¸…除™å¹å¯ä»Žæ‰€æœ‰å¯¹è±¡æˆ–¾l™å®šåŸŸä¸é€‰æ‹©ã€‚ï¼ç›´æŽ¥è®‰K—®å…Œ™”W3C规范å‚考ã€IEå¼€å‘组blogæˆ–å…¶ä»–æ¥æºã€‚ï¼æ˜„¡¤ºè®¾è®¡æ—¶æ ‡ž®ºï¼Œå¸®åŠ©å¯šw½å¯¹è±¡ã€‚该工具æ¡å¯é›†æˆåœ¨IE½H—å£åQŒæˆ–以æÕQ动窗å£åÅžå¼å˜åœ¨\\使用æ–ÒŽ³•:安装好以å?打开IE,在èœå•æ ä¸é€‰æ‹© 查看---工具æ ?勾上 Developer Toolbar 4.FireBug ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹FireFox的工å…?å¯ä»¥æŸ¥çœ‹å’ŒäÍæ—¶ä¿®æ”¹HTMLæºä»£ç ã€æŸ¥çœ‹CSS定义ã€è°ƒè¯•JavaScript.ž®¤å…¶æ˜¯åœ¨firefox上调试javascript功能éžå¸¸çš„强大,但是firefox对javascript的兼å®ÒŽ€§æ²¡æœ‰IE好,所以这‹Æ¾æ’ä»¶å°±ä¼šæœ‰å¾ˆå¤§çš„å±€é™æ€§ã€?br />5.script debugger ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹IEçš„javascript调试工具。æ¤å·¥å…·çš„特ç‚ÒŽ˜¯ž®åéyåQŒåŠŸèƒ½é½å…¨ï¼Œdebugæ—¶èƒ½å¤Ÿå•æ¥æ‰§è¡Œï¼Œèƒ½å¤Ÿæ˜„¡¤ºå˜é‡åQŒObjectçš„å€û|¼Œ¾~ºç‚¹æ˜¯ä¸å¤Ÿç¨³å®šï¼Œå¾ˆå®¹æ˜“出错,出错以厘q™ä¸ªå·¥å…·ž®±å†ä¹Ÿæ‰“å¼€ä¸äº†ã€?br />6.microsoft script editor ˜q™æ˜¯ä¸€‹ÆùN’ˆå¯¹IE的工å…?调试javascript的功能éžå¸¸çš„强大åQŒä»–是跟éšofficeå‘布的,˜q™ä¸ªå·¥å…·å¾ˆç¨³å®šï¼Œä¸€èˆ¬ä¸ä¼šå‡ºé”™ï¼Œè°ƒè¯•javascript需è¦çš„功能都具有,唯一的缺ç‚ÒŽ˜¯å 内å˜è¾ƒå¤šï¼Œæ¯”较慢,如果内嘞®çš„è¯å¯ä»¥è€ƒè™‘使用script debugger. |
   ¾l过五个斚w¢çš„æ¯”较,newxy+struts WEBå¼€å‘与deiphi桌é¢å¼€å‘相比,速度更快åQŒèƒ½åŠ›æ›´å¼ºã€?
   newxy是hibernate的替代者,struts+newxy是struts+hibernate的替代方案�
   struts的丑»I¼Œä¸‹é¢ä¸€½‹‡æ–‡ç« 有代表性:《Struts的巨大烦æ?真的ä¸é€‚åˆå¤§ç³»¾lŸï¼Ÿã€?a >http://dev.csdn.net/develop/article/85/85114.shtmã€?br />主è¦è§‚点是:
    一ã€è{到展½Cºå±‚æ—Óž¼Œéœ€è¦é…¾|®forwardåQŒæ¯ä¸€‹Æ¡è{到展½Cºå±‚åQŒç›¸ä¿¡å¤§å¤šæ•°éƒ½æ˜¯ç›´æŽ¥è½¬åˆ°jspåQ?而涉åŠåˆ°è½¬å‘åQŒéœ€è¦é…¾|®forwardåQŒå¦‚果有å个展示层的jspåQŒéœ€è¦é…¾|®å‹Æ¡strutsåQ?而且˜q˜ä¸åŒ…æ‹¬æœ‰æ—¶å€™ç›®å½•ã€æ–‡ä»¶å˜æ›ß_¼Œéœ€è¦é‡æ–îC¿®æ”¹forwardåQŒæ³¨æ„ï¼Œæ¯æ¬¡ä¿®æ”¹é…置之åŽåQ?è¦æ±‚釿–°éƒ¨çÖv整个™å¹ç›®åQŒè€Œtomcate˜q™æ ·çš„æœåŠ¡å™¨åQŒè¿˜å¿…须釿–°å¯åЍæœåŠ¡å™¨ï¼Œå¦‚æžœä¸šåŠ¡å˜æ›´å¤æ‚频ç¹çš„ç³»¾lŸï¼Œ ˜q™æ ·çš„æ“ä½œç®€å•ä¸å¯æƒ³è±¡ã€‚çŽ°åœ¨å°±æ˜¯è¿™æ øP¼Œå‡ å上百个ähåŒæ—¶åœ¨çº¿ä½¿ç”¨æˆ‘们çš?¾pÈ»ŸåQ?大家å¯ä»¥æƒŒ™±¡ä¸€ä¸‹ï¼Œæˆ‘çš„çƒ¦æ¼æœ‰å¤šå¤§ã€?br />   二ã€å½“™åµé¢è¡¨å•需è¦è‡ªåЍå˜åŒ–或者频¾Jå˜åŒ–æ—¶ã€?br />   对于一个æˆç†Ÿçš„MIS¾pÈ»Ÿæ¥è¯´,™åµé¢è¡¨å•肯定是ä¸å›ºå®šçš?甚至象有些系¾lŸï¼Œ™åµé¢è¡¨å•是å˜åœ¨æ•°æ®åº“ä¸ï¼Œ 需è¦å¡«å†™çš„表å•在页é¢è‡ªåŠ¨ç”Ÿæˆï¼Œæ¯”如填写一个äh员基本信æ?本æ¥åªéœ€è¦å¡«å†?å§“åã€æ€§åˆ«ã€å‡ºç”Ÿå¹´æœ?ä¸‰ä¸ªæŒ‡æ ‡åQ?è€Œæˆ‘åŽæ¥éœ€è¦å¢žåŠ ç±è´¯è¿™æ ïLš„æŒ‡æ ‡åQŒæˆ‘åªéœ€è¦åœ¨æ•°æ®åº“䏿·ÕdŠ ¾c诘q™ä¸ªè®°å½•åQŒåƈ在页é¢å°±èƒ½è‡ªåŠ¨å¢žåŠ ç±è´¯è¿™æ ïLš„表å•ã€?è€?struts在这斚w¢åQŒå…¶ä¼˜åŠ¿åè€Œå˜æˆäº†ä¸èƒöåQŒæˆ‘å‚考了éžå¸¸å¤šçš„äººåŠ›èµ„æº½Ž¡ç†¾pÈ»ŸåQŒè¿™äº›ç³»¾lŸå‡ 乎都能够åšç³»¾lŸé‡Œé¢å°±å¯ä»¥æŽ§åˆ¶äººå‘˜ä¿¡æ¯çš„æŒ‡½Cºï¼Œ ˜q›è¡Œä½¿å±•½Cºå±‚能éšä¹‹çµ‹zÕd˜åŒ–,如果使用了strutsåQŒè¿™äº›çµ‹zÀL€§å°±æ ÒŽœ¬ç”¨ä¸ä¸Šã€‚ã€€åŒæ—¶åQŒå¦‚果页é¢è¡¨å•频¾Jå˜åŒ–æ—¶åQŒå°±éœ€è¦é¢‘¾J修改formbean对应的方法和属性,而毋ơ修改之åŽï¼Œž®Þp¦æ±‚釿–°éƒ¨¾|ÔŒ¼Œæˆ–è€…é‡æ–°å¯åЍæœåŠ¡å™¨â€¦â€¦ã€?br />   hibernate的丑»I¼Œä¸‹é¢æ˜¯ä¸€ä½ç½‘å‹çš„看法åQŒå…·æœ‰ä»£è¡¨æ€§ï¼š
   一ã€å¯¹è±¡ä¸Žæ•°æ®åº“çš„æ˜ å°„åQŒå…³é”®åœ¨äºŽå¯¹è±¡å…³¾pÈš„æ˜ å°„åQŒä½†æ˜¯æ²¡åšåˆ°å¾ˆç†æƒ»I¼Œé…ç½®˜q‡å¤šåQŒæŽ§åˆ¶å¤æ‚, å¦å¤–˜q˜ä¼šå‡ºé”™ã€‚其实本质在于对象ä¸å¤Ÿè‡ªç”±ã€?br />   二ã€äº‹åС处ç†ã€‚这点上更容易出问题åQŒç›¸å¯¹äºŽå„ç§å„æ ·çš„äº‹åŠ¡ç®¡ç†å™¨åQŒè¦å…¼å®¹æ˜¯ä¸€ä¸ªå¤§é—®é¢˜åQ?æ€Õd½’在儿U应用æœåŠ¡å™¨ä¸Šæœ‰å¾ˆå¤šé—®é¢˜ã€‚å…¶æœ¬è´¨åœ¨äºŽåˆ›å¾äº†ä¸€ä¸ªè‡ªæˆ‘æ•°æ®å˜å–å°çŽ¯å¢ƒåQŒå¿…焉™¢ä¸´å„¿U兼定w—®é¢˜ã€?br />   三ã€HQLè¯è¨€ã€‚å¾ç«‹å¯¹è±¡æŸ¥è¯¢è¯a€åQŒç±»SQLåQŒä½†æ˜¯ä¸åŒäºŽä»ÖM½•一¿USQLåQŒè°ƒè¯•çŽ¯å¢ƒå¤æ‚。本质在于创å»ÞZº†ä¸€¿Uè¯a€åQŒå¢žåŠ å¦ä¹ æˆæœ¬ã€?br />   ˜q™ä½¾|‘勘q˜æå‡ÞZº†å‡åŒ–和退化方案ã€?
   struts+newxyè‡Ïx‰€ä»¥åœ¨å¼€å‘效率上比struts+hibernate能æé«˜åå€ã€ç”šè‡›_‡ åå€ï¼Œæ˜¯å› 为克æœäº†struts与hiberate的丑Ÿë€?br />   利用newxy DAO¾c»ï¼Œæ ‡ç¾åQ?struts+newxyå¯ä»¥åœ¨ä»¥ä¸‹å‡ 个方é¢ä¸ç”¨å†™java代ç åQŒä¸ç”¨é…¾|®strutsã€?
   1.æ•°æ®åº“的增ã€åˆ ã€æ”¹åQ?
   2.å¯ÒŽŸ¥è¯¢æ‰€å¾—æ•°æ®ç¼“å˜ï¼ŒæŒ‡å®š¾~“å˜æ—‰™•¿åQ?
   3.æ•°æ®åº“å—½W¦ç¼–ç 与本地å—符¾~–ç 转æ¢åQ?
   4.æ–‡äšgä¸Šä¼ åQŒä¸Šä¼ 大ž®æŽ§åˆÓž¼›
   5.æ–‡äšg下è²åQŒä¸‹è½½è®°æ•ŽÍ¼›
   6.囄¡‰‡æ˜„¡¤ºåQ?
   7.æ•°æ®åˆ†é¡µæ˜„¡¤ºåQ?
   8.å®¢æˆ·ç«¯æ ‡è®°è®°å½•é›†å“ªæ¡è®°å½•被选择åQ?
Â Â Â å› äØ“å¯ä»¥ä¸å†™java代ç åQŒä¸ç”¨å¾ç«‹ActionForm¾c…R€Action¾c»ï¼Œå› 而ä¸ç”¨é…¾|®strutsåQŒä¸ç”¨é‡æ–°ç¼–译类文äšgã€ä¸ç”¨é‡æ–°æ‰“包ã€ä¸ç”¨é‡å¯æœåС噍ã€?å¯ä»¥å…‹æœstruts的丑Ÿë€?br />   在克æœhibernate的丑Ïx–¹é¢ï¼Œnewxy采用“退化â€å’Œâ€œè¿›åŒ–â€åƈ用的æ–ÒŽ¡ˆã€?br />   newxy在进行数æ®çš„æŸ¥è¯¢ã€å¢žã€åˆ ã€æ”¹æ—‰™ƒ½ä¼šè°ƒç”¨ä¸€æ³¨å†Œæ–ÒŽ³•åQŒæ ¹æ®ä¸šåŠ¡æ¶‰åŠåˆ°çš„æ•°æ®åº“ç›¸å…³æ•°æ®æºå和表å进行注册, 注册的目的是è¦èŽ·å¾—è¡¨å—æ®µå¯¹åº”çš„java¾cÕdåQŒä¸»å…³é”®å—段å,ä¸Õd…³é”®å—ŒDµé•¿åº¦ç‰æ•°æ®åQŒä¿å˜åœ¨ä¸€ä¸ªå•å实例ä¸åQŒä»¥ä¾›DAO¾c»è°ƒç”¨ã€?如果已注册ä¸å†æ³¨å†Œã€?br />   å¯ä»¥å¯¹å¤šè¡¨æŸ¥è¯¢è¯å¥æ³¨å†Œï¼Œå¦‚:“select a.field1,b.field2 from table1 as a,table2 as b where ...";
   å¯ä»¥å¯¹è·¨æ•°æ®æºçš„æŸ¥è¯¢æ³¨å†Œã€‚如åQ?select a.field1,b.field2 from table1 as a,DB3.dto.table2 as b where ...";
   如果是数æ®å¢žã€åˆ ã€æ”¹åQŒåˆ™æ˜¯å¯¹å•一表注册;
   ç”׃ºŽstruts+newxyç”¨å³æ—¶æ³¨å†Œçš„æ–ÒŽ³•åQŒå¯ä»¥ä¸è±¡hibernateé‚£æ ·ç”¨é™æ€æ–‡ä»¶åª„ž®„æ•°æ®åº“到值对象类。开å‘者ä¸ç”¨é…¾|®ä“Q何文件。å¯ä»¥ä‹É用ä“Qæ„æŸ¥è¯¢è¯å¥ï¼Œå…‹æœâ€œå¯¹è±¡ä¸å¤Ÿè‡ªç”±â€é—®é¢˜ã€?br />   hibernate通过é…置文äšg讄¡½®è¡¨ä¹‹é—´çš„关系åQŒæœ‰ä¸€å®šæ„义,newxy在这斚w¢½Ž—是“退化â€çš„åQŒä½†struts+newxyåœ¨å¤„ç†æ•°æ®åº“表之间关¾pÀL–¹é¢æ˜¯å¾ˆå®¹æ˜“çš„ã€?br />Â Â Â åœ¨äº‹åŠ¡å¤„ç†æ–¹é¢ï¼Œnewxyæä¾›äº†ä¸€äº‹åŠ¡¾c»net.newxy.dbm.Transaction。它å¯ä»¥ž®†å¤šä¸ªæ•°æ®åº“çš„æ“作放在一个事务ä¸ã€‚由于DAO¾cÕd¯¹æ•°æ®æ“作å‰çš„æ³¨å†Œæ–ÒŽ³•得到的表åŠå…¶å—段å„ç§ç‰ÒŽ€§éƒ½æ˜¯ä¸Žæ•°æ®åº“直接相关的åQŒè€Œä¸æ˜¯äº‹å…ˆç”¨é™æ€æ–‡ä»¶åª„ž®„, å› è€Œæžž®‘å‘生错误;开å‘者å¯ä»¥é€šè¿‡Transactionçš„æ–¹æ³•äØ“ä¸åŒçš„æ•°æ®åº“讄¡½®ä¸åŒçš„éš”¼›È‰¾U§ï¼›å¯ä»¥è®„¡½®æ“时回滚旉™—´åQŒåœ¨è®„¡½®çš„æ—¶é—´å†…事务没有完æˆåQŒä¼šæœ‰ä¸€¾U¿ç¨‹˜q›è¡Œòq²é¢„åQŒå°†äº‹åŠ¡å›žæ»šã€?br />   hibernateçš„HQLè¯è¨€æ˜¯å’Œæ•°æ®åº“与对象影射规则盔R€‚åº”çš„ï¼Œå®ƒæ²¡æœ‰ç‰¹åˆ«åŠŸèƒ½ï¼Œä¸»è¦æ˜¯åˆ©ç”¨å€¼å¯¹è±¡ç±»æ¥æŸ¥è¯¢æ•°æ®ã€?newxy也æä¾›äº†ä¸€¿U查询è¯a€NQL。开å‘者ä¸éœ€ç”¨ç‰¹ŒDŠçš„è¯æ³•æ¥æž„建查询è¯å¥ã€‚éžå¸¸å®¹æ˜“ç†è§£ï¼Œä¸ä¼šå¢žåŠ å¦ä¹ æˆæœ¬ã€?
struts一旦与newxy¾l“åˆåˆîC¸€èµ¯‚¿ç”¨æ˜¯å¦‚æ¤½Ž€å•,下列是struts+newxy代替struts+hibernate的例åã€?
       strutsé…ç½®ä¸ï¼ŒformBeançš„type是“net.newxy.struts_faces.DynaFormBeanâ€ï¼Œå¼€å‘者ä¸éœ€å¦å¤–设计ActionForm¾c…R€‚如åQ?br />           <form-bean name="myFormBean" type="net.newxy.struts_faces.DynaFormBean" />
       用户从页é¢è¡¨å•submitæ•°æ®åŽï¼Œåœ¨Action¾cÈš„æ–ÒŽ³•ä¸ï¼Œå¼€å‘者å¯ä»¥ç”¨DynaFormBean代替struts ActionForm,用DynaDto代替hibernate 对象¾c…R€?br />       public ActionForward methodName(ActionMapping actionMapping, ActionForm actionForm,
                             HttpServletRequest httpServletRequest,
           HttpServletResponse httpServletResponse) throws Exception{
           ......
           DynaFormBean form=(DynaFormBean)actionForm;
           DynaDto dto=(DynaDto)form.getDto();
           dto.set_table("table1");//如果用户™åµé¢æ²¡æœ‰ä¼ æ¥æ•°æ®åº“表åã€?br />           try{
               IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"),
                     httpServletRequest.getLocale()); //¾l大多数情况是:IFacade ifacade=IFacadeFactory.getFacade();
               //更新或æ’入,如果result==null,为updateåQŒå¦åˆ™äØ“insertã€?br />               result = ifacade.update(dto);//或:FormBeanUtils.update(ifacade, form);
               //åˆ é™¤è®°å½•
               ifacade.remove(dto);//�FormBeanUtils.remove(ifacade, form);
               //æ•°æ®æŸ¥è¯¢åQŒå¦‚æžœä¸Šä¼ äº†½W¦åˆnewxy多项查询规则的数æ®ã€‚查询记录集攑֜¨newForm çš„_coll属性ä¸ã€?br />               DynaFormBean newForm=new DynaFormBean();
               FormBeanUtils.createForm(newForm, httpServletRequest);
               ......
               //å¼€å‘者如果想知é“生æˆçš„sqlè¯å¥åQŒå¯ä»¥è¿™æ øP¼š
               //string sql=form.get_sql();
               //ç”׃ºŽå¼€å‘者在å¯ÒŽ•°æ®è¿›è¡Œæ“作时完全ä¸éœ€çŸ¥é“sqlè¯å¥åQŒæ‰€ä»¥æ²¡æœ‰æä¾›æ–¹æ³•让开å‘者直接得到sqlè¯å¥æ¥æŽ§åˆ¶æ•°æ®æ“作ã€?br />               //未æ¥ç‰ˆæœ¬å¯èƒ½æä¾›˜q™æ ·çš„æ–¹æ³•ã€?br />           }catch(Exception e){
               ......
           }
       }
       如果使用newxyçš„æ ‡½{‘֯以ä¸å»ºç«‹Action¾c»ï¼Œä¸è®¾¾|®strutsçš„formBeanåŠactionåQŒå¯ä»¥ä¸å†™ä»£ç ã€?br />  Â
newxy也æä¾›äº†ä¸€äº›å®žç”¨ç±»ã€‚本文档ž®±æ˜¯ç”¨newxy自èín工具¾c»è½»æ‘־立的ã€?