ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>中文无码久久精品,国产99久久久国产精品,国产精品久久久久久久久久http://www.aygfsteel.com/oaixgnaw/archive/2007/01/29/96627.htmlè¡?/dc:creator>è¡?/author>Mon, 29 Jan 2007 15:14:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/29/96627.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/96627.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/29/96627.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/96627.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/96627.html  开发äh员行走Unix的随íw«å››è‰?/a>

   作者:江南白衣å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>

    一、VI

    虽然Unix上的文本¾~–辑器已¾lè¶Šæ¥è¶Šå¥½ç”¨åQŒä½†ä¸åœ¨Console前面åQŒç½‘速也不够˜qžXWindows的时候,˜q˜æ˜¯è¦ä¾èµ–VIã€?br />    回想VI的时代背景,发现VI对开发äh员已¾lå‘¨åˆ°å¾—¼›»è°±äº†ï¼Œçƒ­é”®å¤šåˆ°ä½ åŒæ‰‹ä¸¼›»é”®ç›˜å°±èƒ½å®Œæˆå¤§åŠç¼–辑工作ã€?br />    廸™®®è‡ªå·±åˆ¶ä½œä¸€å¼ è‡ªå·Þp®¤ä¸ºæœ‰ç”¨ï¼Œä½†åˆ¾lå¸¸å¿˜è®°çš„命令的sheetåQŒæ‹¿å‡ø™€ƒè¯•的力气把它背熟ã€?/p>

    二、文本处�/h2>

       开发ä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>

awk -F ' t' '{ print   $ 4 }' 2004_2 . txt| grep chedong . com / tech / | uniq -c| sort  -rn|head - 10  
  • awk -F '\t' ž®?004_2.txt讉K—®¾Uªå½•æ–‡äšgåQŒç”¨TAB分割åQŒæ‰“印第4åˆ?
  • grep chedong.com/tech 只列出chedong.com/tech½W”记目录下的文档
  • uniq -c 汇总计æ•?
  • sort -rn 按数值排åº?
  • head -10 TOP 10

    三、Bash Shell ¾~–程

    ¾~–程是开发äh员的天赋本能åQŒä¸è®ÞZ»€ä¹ˆè¯­­a€åQŒçœ‹çœ‹å‚考手册应该就能上手ã€?/p>

    è§?a >Bash新手指南中文ç‰?/a>åQŒä¸€ä»½å†™¾l™æ–°æ‰‹çœ‹çš„包含很多老手知识的指南ã€?/p>

    四、Make与AutoMake

    用过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 />

    附录AåQšæˆ‘çš„VI易忘命ä×o手册

    上下左右å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>

附录B: 文本处理命ä×ož®ç»“

   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>

    grepåQ?/strong>˜q‡æ×oåQŒå¤§å®¶ç”¨å¾—最多的命ä×oåQŒæ”¯æŒæ­£åˆ™è¡¨è¾‘Ö¼ã€‚参数有åQ?br />    -i忽略大小写,-n昄¡¤ºline numberåQ?c ¾lŸè®¡åœ¨æ¯ä¸ªæ–‡ä»¶çš„出现‹Æ¡æ•°åQ?l只显½Cºç¬¦åˆçš„æ–‡äšg的名字ã€?/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>

    uniqåQ?/strong>去除重复行ã€?br />    除了正常用法外,˜q˜æœ‰-c¾lŸè®¡é‡å¤‹Æ¡æ•°åQŒå’Œ-u åQˆå”¯ä¸€åQ‰å’Œ -d åQˆé‡å¤ï¼‰ä¸¤ä¸ªå‚æ•°,只显½Cºå”¯ä¸€çš„和重复的行ã€?/p>

    wcåQ?/strong> ¾lŸè®¡ã€?br />    -l è¡?-m 字符,-w 单词

PS:以下文字不算字数 
     一个多月没有更新博客了åQŒå› ä¸ºå…¬å”R‡Œè°ƒäº†æ–°éƒ¨é—¨ï¼Œå¾ˆå¤šä¸œè¥¿è¦å­¦ä¹ ã€‚太久没试过华丽的在上班旉™—´åQŒåœ¨å·¥ä½œä¸­ï¼Œåœ¨åŒäº‹ä»¬íw«ä¸Šå­¦åˆ°˜q™ä¹ˆå¤šä¸œè¥¿äº†åQŒå¾ˆæ˜¯å¼€å¿ƒã€?br />     下周开始爆发更新ã€?/p>



]]>
Java环境讄¡½®ã€HelloWorld例子、Ant环境及运è¡?http://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94402.htmlè¡?/dc:creator>è¡?/author>Wed, 17 Jan 2007 04:56:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94402.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/94402.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94402.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/94402.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/94402.html一ŒD‰|—¶é—´ä¸ç”¨JavaåQŒç»å¸¸å¿˜è®îC¸€äº›çƒ¦ççš„讄¡½®åQŒç‰¹æ„å†™æ­¤æ–‡æ¡£å¤‡æ¡ˆã€?br />
-------------
java环境讄¡½®
-------------

在环境变量中讄¡½®ä»¥ä¸‹ä¸‰ä¸ªå˜é‡å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>



]]>
Java jdbc数据库连接池æ€È»“! http://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94401.htmlè¡?/dc:creator>è¡?/author>Wed, 17 Jan 2007 04:55:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94401.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/94401.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/17/94401.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/94401.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/94401.html Java jdbc数据库连接池æ€È»“! 1. 引言

  ˜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>


� Java数据库访问机�/div>
  JDBCä½œäØ“ä¸€¿Uæ•°æ®åº“讉K—®æŠ€æœ¯ï¼Œå…ähœ‰½Ž€å•易用的优点。但使用˜q™ç§æ¨¡å¼˜q›è¡ŒWeb应用
  ½E‹åºå¼€å‘,存在很多问题åQšé¦–先,每一‹Æ¡Webè¯äh±‚都要建立一‹Æ¡æ•°æ®åº“˜qžæŽ¥ã€‚徏立连接是一个费时的‹zÕdЍåQŒæ¯‹Æ¡éƒ½å¾—花è´?.05sï½?s的时é—ß_¼Œè€Œä¸”¾pȝ»Ÿ˜q˜è¦åˆ†é…å†…存资源。这个时间对于一‹Æ¡æˆ–几次数据库操作,或许感觉不出¾pȝ»Ÿæœ‰å¤šå¤§çš„开销。可是对于现在的Web应用åQŒå°¤å…¶æ˜¯å¤§åž‹ç”µå­å•†åŠ¡¾|‘ç«™åQŒåŒæ—¶æœ‰å‡ ç™¾äººç”šè‡›_‡ åƒäh在线是很正常的事。在˜q™ç§æƒ…况下,频繁的进行数据库˜qžæŽ¥æ“ä½œåŠ¿å¿…å ç”¨å¾ˆå¤šçš„ç³»¾lŸèµ„源,¾|‘站的响应速度必定下降åQŒä¸¥é‡çš„甚至会造成服务器的崩溃。不是危­a€è€¸å¬åQŒè¿™ž®±æ˜¯åˆ¶çº¦æŸäº›ç”µå­å•†åŠ¡¾|‘站发展的技术瓶颈问题。其‹Æ¡ï¼Œå¯¹äºŽæ¯ä¸€‹Æ¡æ•°æ®åº“˜qžæŽ¥åQŒä‹É用完后都得断开。否则,如果½E‹åºå‡ºçŽ°å¼‚å¸¸è€Œæœªèƒ½å…³é—­ï¼Œž®†ä¼šå¯ÆD‡´æ•°æ®åº“ç³»¾lŸä¸­çš„内存泄漏,最¾lˆå°†ä¸å¾—不重启数据库。还有,˜q™ç§å¼€å‘不能控制被创徏的连接对象数åQŒç³»¾lŸèµ„源会被毫无顾及的分配出去åQŒå¦‚˜qžæŽ¥˜q‡å¤šåQŒä¹Ÿå¯èƒ½å¯ÆD‡´å†…存泄漏åQŒæœåŠ¡å™¨å´©æºƒã€?/div>
 
  数据库连接池åQˆconnection poolåQ‰çš„工作原理
  1、基本概念及原理
ç”׃¸Šé¢çš„分析可以看出åQŒé—®é¢˜çš„æ ÒŽºž®±åœ¨äºŽå¯¹æ•°æ®åº?/font>˜qžæŽ¥èµ„源的低效管理。我们知道,
  对于å…׃ín资源åQŒæœ‰ä¸€ä¸ªå¾ˆè‘—名çš?a target="_blank">设计模式åQšèµ„源池åQˆResource PoolåQ‰ã€‚该模式正是ä¸ÞZº†è§£å†³èµ„源的频¾Jåˆ†é…ï¹‘é‡Šæ”¾æ‰€é€ æˆçš„é—®é¢˜ã€‚äØ“è§£å†³ä¸Šè¿°é—®é¢˜åQŒå¯ä»¥é‡‡ç”¨æ•°æ®åº“˜qžæŽ¥æ± æŠ€æœ¯ã€‚数据库˜qžæŽ¥æ± çš„基本思想ž®±æ˜¯ä¸ºæ•°æ®åº“˜qžæŽ¥å»ºç«‹ä¸€ä¸ªâ€œç¼“冲池”。预先在¾~“冲池中攑օ¥ä¸€å®šæ•°é‡çš„˜qžæŽ¥åQŒå½“需要徏立数据库˜qžæŽ¥æ—Óž¼Œåªéœ€ä»Žâ€œç¼“冲池”中取出一个,使用完毕之后再放回去。我们可以通过讑֮š˜qžæŽ¥æ± æœ€å¤§è¿žæŽ¥æ•°æ¥é˜²æ­¢ç³»¾lŸæ— ž®½çš„与数据库˜qžæŽ¥ã€‚更为重要的是我们可以通过˜qžæŽ¥æ± çš„½Ž¡ç†æœºåˆ¶ç›‘视数据库的˜qžæŽ¥çš„æ•°é‡ï¹‘使用情况åQŒäØ“¾pȝ»Ÿå¼€å‘﹑‹¹‹è¯•及性能调整提供依据。连接池的基本工作原理见下图2ã€?/div>

å›? ˜qžæŽ¥æ± çš„基本工作原理
  2、服务器自带的连接池
  JDBCçš„API中没有提供连接池的方法。一些大型的WEB应用服务器如BEAçš„WebLogicå’ŒIBMçš„WebSphere½{‰æä¾›äº†˜qžæŽ¥æ± çš„æœºåˆ¶åQŒä½†æ˜¯å¿…™åÀLœ‰å…¶ç¬¬ä¸‰æ–¹çš„专用类æ–ÒŽ³•支持˜qžæŽ¥æ± çš„用法ã€?/div>
  ˜qžæŽ¥æ± å…³é”®é—®é¢˜åˆ†æž?/div>
  1ã€åÆˆå‘é—®é¢?/div>
  ä¸ÞZº†ä½¿è¿žæŽ¥ç®¡ç†æœåŠ¡å…·æœ‰æœ€å¤§çš„é€šç”¨æ€§ï¼Œå¿…é¡»è€ƒè™‘å¤šçº¿½E‹çŽ¯å¢ƒï¼Œå›_ƈ发问题。这个问题相å¯Òޝ”较好解决åQŒå› ä¸?a target="_blank">Java语言自èín提供了对òq¶å‘½Ž¡ç†çš„æ”¯æŒï¼Œä½¿ç”¨synchronized关键字即可确保线½E‹æ˜¯åŒæ­¥çš„。ä‹Éç”¨æ–¹æ³•äØ“ç›´æŽ¥åœ¨ç±»æ–ÒŽ³•前面加上synchronized关键字,如:
public synchronized Connection getConnectionåQˆï¼‰
  2、多数据库服务器和多用户
  对于大型的企业çñ”应用åQŒå¸¸å¸”Rœ€è¦åŒæ—¶è¿žæŽ¥ä¸åŒçš„æ•°æ®åº“(如连æŽ?a target="_blank">Oracleå’?a target="_blank">SybaseåQ‰ã€‚如何连接不同的数据库呢åQŸæˆ‘们采用的½{–略是:设计一个符合单例模式的˜qžæŽ¥æ± ç®¡ç†ç±»åQŒåœ¨˜qžæŽ¥æ± ç®¡ç†ç±»çš„唯一实例被创建时è¯Õd–一个资源文ä»Óž¼Œå…¶ä¸­èµ„源文äšg中存攄¡€å¤šä¸ªæ•°æ®åº“çš„url地址åQ?lt;poolName.url>åQ‰ï¹‘用户名(<poolName.user>åQ‰ï¹‘密码åQ?lt;poolName.password>åQ‰ç­‰ä¿¡æ¯ã€‚如tx.url=192.168.1.123:5000/tx_itåQŒtx.user=cylåQŒtx.password=123456。根据资源文件提供的信息åQŒåˆ›å»ºå¤šä¸ªè¿žæŽ¥æ± ¾cȝš„实例åQŒæ¯ä¸€ä¸ªå®žä¾‹éƒ½æ˜¯ä¸€ä¸ªç‰¹å®šæ•°æ®åº“的连接池。连接池½Ž¡ç†¾cÕd®žä¾‹äؓ每个˜qžæŽ¥æ± å®žä¾‹å–一个名字,通过不同的名字来½Ž¡ç†ä¸åŒçš„连接池ã€?/div>
  对于同一个数据库有多个用户ä‹É用不同的名称和密码访问的情况åQŒä¹Ÿå¯ä»¥é€šè¿‡èµ„源文äšg处理åQŒå³åœ¨èµ„源文件中讄¡½®å¤šä¸ªå…ähœ‰ç›¸åŒurl地址åQŒä½†å…ähœ‰ä¸åŒç”¨æˆ·åå’Œå¯†ç çš„æ•°æ®åº“˜qžæŽ¥ä¿¡æ¯ã€?/div>
  3、事务处�/div>
  我们知道åQŒäº‹åŠ¡å…·æœ‰åŽŸå­æ€§ï¼Œæ­¤æ—¶è¦æ±‚å¯ÒŽ•°æ®åº“的操作符合“ALL-ALL-NOTHING”原åˆ?卛_¯¹äºŽä¸€¾l„SQL语句要么全做åQŒè¦ä¹ˆå…¨ä¸åšã€?br />åœ?a target="_blank">Java语言中,Connection¾cÀLœ¬íw«æä¾›äº†å¯¹äº‹åŠ¡çš„æ”¯æŒåQŒå¯ä»¥é€šè¿‡è®„¡½®Connectionçš„AutoCommitå±žæ€§äØ“false,然后昑ּçš„调用commit或rollbackæ–ÒŽ³•来实现。但要高效的˜q›è¡ŒConnection复用åQŒå°±å¿…须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现åQŒè¿™¿Uæ–¹æ³•可以大大降低事务管理的复杂性ã€?
  4、连接池的分配与释放
  ˜qžæŽ¥æ± çš„分配与释放,对系¾lŸçš„æ€§èƒ½æœ‰å¾ˆå¤§çš„影响。合理的分配与释放,可以提高˜qžæŽ¥çš„复用度åQŒä»Žè€Œé™ä½Žå¾ç«‹æ–°˜qžæŽ¥çš„开销åQŒåŒæ—¶è¿˜å¯ä»¥åŠ å¿«ç”¨æˆ·çš„è®¿é—®é€Ÿåº¦ã€?/div>
  对于˜qžæŽ¥çš„管理可使用½Iºé—²æ± ã€‚即把已¾låˆ›å»ÞZ½†ž®šæœªåˆ†é…å‡ºåŽ»çš„è¿žæŽ¥æŒ‰åˆ›å¾æ—‰™—´å­˜æ”¾åˆîC¸€ä¸ªç©ºé—²æ± ä¸­ã€‚每当用戯‚¯·æ±‚一个连接时åQŒç³»¾lŸé¦–先检查空闲池内有没有½Iºé—²˜qžæŽ¥ã€‚如果有ž®±æŠŠå»ºç«‹æ—‰™—´æœ€é•¿ï¼ˆé€šè¿‡å®¹å™¨çš„顺序存攑֮žçŽŽÍ¼‰çš„那个连接分配给他(实际是先做连接是否有效的判断åQŒå¦‚果可用就分配¾l™ç”¨æˆøP¼Œå¦‚不可用ž®±æŠŠ˜q™ä¸ª˜qžæŽ¥ä»Žç©ºé—²æ± åˆ æŽ‰åQŒé‡æ–°æ£€‹¹‹ç©ºé—²æ± æ˜¯å¦˜q˜æœ‰˜qžæŽ¥åQ‰ï¼›å¦‚果没有则检查当前所开˜qžæŽ¥æ± æ˜¯å¦è¾¾åˆ°è¿žæŽ¥æ± æ‰€å…è®¸çš„æœ€å¤§è¿žæŽ¥æ•°åQˆmaxConnåQ?如果没有辑ֈ°åQŒå°±æ–°å¾ä¸€ä¸ªè¿žæŽ¥ï¼Œå¦‚果已经辑ֈ°åQŒå°±½{‰å¾…一定的旉™—´åQˆtimeoutåQ‰ã€‚如果在½{‰å¾…的时间内有连接被释放出来ž®±å¯ä»¥æŠŠ˜q™ä¸ª˜qžæŽ¥åˆ†é…¾l™ç­‰å¾…的用户åQŒå¦‚果等待时间超˜q‡é¢„定时间timeout,则返回空å€û|¼ˆnullåQ‰ã€‚ç³»¾lŸå¯¹å·²ç»åˆ†é…å‡ºåŽ»æ­£åœ¨ä½¿ç”¨çš„è¿žæŽ¥åªåšè®¡æ•ŽÍ¼Œå½“ä‹É用完后再˜q”还¾l™ç©ºé—²æ± ã€‚对于空闲连接的状态,可开辟专门的¾U¿ç¨‹å®šæ—¶‹‚€‹¹‹ï¼Œ˜q™æ ·ä¼šèŠ±è´¹ä¸€å®šçš„¾pȝ»Ÿå¼€é”€åQŒä½†å¯ä»¥ä¿è¯è¾ƒå¿«çš„响应速度。也可采取不开辟专门线½E‹ï¼Œåªæ˜¯åœ¨åˆ†é…å‰‹‚€‹¹‹çš„æ–ÒŽ³•ã€?/div>
  5、连接池的配¾|®ä¸Ž¾l´æŠ¤
  ˜qžæŽ¥æ± ä¸­åˆ°åº•应该攄¡½®å¤šå°‘˜qžæŽ¥åQŒæ‰èƒ½ä‹É¾pȝ»Ÿçš„æ€§èƒ½æœ€ä½»I¼Ÿ¾pȝ»Ÿå¯é‡‡å–设¾|®æœ€ž®è¿žæŽ¥æ•°åQˆminConnåQ‰å’Œæœ€å¤§è¿žæŽ¥æ•°åQˆmaxConnåQ‰æ¥æŽ§åˆ¶˜qžæŽ¥æ± ä¸­çš„连接。最ž®è¿žæŽ¥æ•°æ˜¯ç³»¾lŸå¯åŠ¨æ—¶˜qžæŽ¥æ± æ‰€åˆ›å¾çš„è¿žæŽ¥æ•°ã€‚å¦‚æžœåˆ›å»ø™¿‡å¤šï¼Œåˆ™ç³»¾lŸå¯åŠ¨å°±æ…¢ï¼Œä½†åˆ›å»ºåŽ¾pȝ»Ÿçš„响应速度会很快;如果创徏˜q‡å°‘åQŒåˆ™¾pȝ»Ÿå¯åŠ¨çš„å¾ˆå¿«ï¼Œå“åº”èµäh¥å´æ…¢ã€‚è¿™æ øP¼Œå¯ä»¥åœ¨å¼€å‘æ—¶åQŒè®¾¾|®è¾ƒž®çš„æœ€ž®è¿žæŽ¥æ•°åQŒå¼€å‘è“v来会快,而在¾pȝ»Ÿå®žé™…使用时设¾|®è¾ƒå¤§çš„åQŒå› ä¸ø™¿™æ ·å¯¹è®‰K—®å®¢æˆ·æ¥è¯´é€Ÿåº¦ä¼šå¿«äº›ã€‚最大连接数是连接池中允许连接的最大数目,具体讄¡½®å¤šå°‘åQŒè¦çœ‹ç³»¾lŸçš„讉K—®é‡ï¼Œå¯é€šè¿‡åå¤‹¹‹è¯•åQŒæ‰¾åˆ°æœ€ä½³ç‚¹ã€?/div>
  如何¼‹®ä¿˜qžæŽ¥æ± ä¸­çš„æœ€ž®è¿žæŽ¥æ•°å‘¢ï¼Ÿæœ‰åŠ¨æ€å’Œé™æ€ä¸¤¿Uç­–略。动态即每隔一定时间就对连接池˜q›è¡Œ‹‚€‹¹‹ï¼Œå¦‚果发现˜qžæŽ¥æ•°é‡ž®äºŽæœ€ž®è¿žæŽ¥æ•°åQŒåˆ™è¡¥å……相应数量的新˜qžæŽ¥,以保证连接池的正常运转。静态是发现½Iºé—²˜qžæŽ¥ä¸å¤Ÿæ—¶å†åŽÀL£€æŸ¥ã€?br />˜qžæŽ¥æ± çš„实现
  1、连接池模型
  本文讨论的连接池包括一个连接池¾c»ï¼ˆDBConnectionPoolåQ‰å’Œä¸€ä¸ªè¿žæŽ¥æ± ½Ž¡ç†¾c»ï¼ˆDBConnetionPoolManageråQ‰å’Œä¸€ä¸ªé…¾|®æ–‡ä»¶æ“ä½œç±»(ParseDSConfig)。连接池¾cÀL˜¯å¯ÒŽŸä¸€æ•°æ®åº?/font>所有连接的“缓冲池”,主要实现以下功能åQšâ‘ ä»Žè¿žæŽ¥æ± èŽ·å–æˆ–åˆ›å»ºå¯ç”¨è¿žæŽ¥ï¼›â‘¡ä‹É用完毕之后,把连接返˜q˜ç»™˜qžæŽ¥æ± ï¼›â‘¢åœ¨¾pȝ»Ÿå…³é—­å‰ï¼Œæ–­å¼€æ‰€æœ‰è¿žæŽ¥åƈ释放˜qžæŽ¥å ç”¨çš„ç³»¾lŸèµ„源;④还能够处理无效˜qžæŽ¥åQˆåŽŸæ¥ç™»è®îCؓ可用的连接,ç”׃ºŽæŸç§åŽŸå› ä¸å†å¯ç”¨åQŒå¦‚­‘…æ—¶åQŒé€šè®¯é—®é¢˜åQ‰ï¼Œòq¶èƒ½å¤Ÿé™åˆ¶è¿žæŽ¥æ± ä¸­çš„˜qžæŽ¥æ€ÀL•°ä¸ä½ŽäºŽæŸä¸ªé¢„定值和不超˜q‡æŸä¸ªé¢„定倹{€?5)当多数据库时,且数据库是动态增加的è¯?ž®†ä¼šåŠ åˆ°é…ç½®æ–‡äšg中ã€?/div>
  ˜qžæŽ¥æ± ç®¡ç†ç±»æ˜¯è¿žæŽ¥æ± ¾cȝš„外覆¾c»ï¼ˆwrapperåQ?½W¦åˆå•例模式åQŒå³¾pȝ»Ÿä¸­åªèƒ½æœ‰ä¸€ä¸ªè¿žæŽ¥æ± ½Ž¡ç†¾cȝš„实例。其主要用于对多个连接池对象的管理,å…ähœ‰ä»¥ä¸‹åŠŸèƒ½åQšâ‘ è£…蝲òq¶æ³¨å†Œç‰¹å®šæ•°æ®åº“çš„JDBC驱动½E‹åºåQ›â‘¡æ ÒŽ®å±žæ€§æ–‡ä»¶ç»™å®šçš„信息åQŒåˆ›å»ø™¿žæŽ¥æ± å¯¹è±¡åQ›â‘¢ä¸ºæ–¹ä¾¿ç®¡ç†å¤šä¸ªè¿žæŽ¥æ± å¯¹è±¡åQŒäؓ每一个连接池对象取一个名字,实现˜qžæŽ¥æ± åå­—与其实例之间的映射åQ›â‘£è·Ÿè¸ªå®¢æˆ·ä½¿ç”¨˜qžæŽ¥æƒ…况åQŒä»¥ä¾‰Kœ€è¦æ˜¯å…³é—­˜qžæŽ¥é‡Šæ”¾èµ„源。连接池½Ž¡ç†¾cȝš„å¼•å…¥ä¸»è¦æ˜¯äØ“äº†æ–¹ä¾¿å¯¹å¤šä¸ª˜qžæŽ¥æ± çš„使用和管理,如系¾lŸéœ€è¦è¿žæŽ¥ä¸åŒçš„æ•°æ®åº“,或连接相同的数据库但ç”׃ºŽå®‰å…¨æ€§é—®é¢˜ï¼Œéœ€è¦ä¸åŒçš„用户使用不同的名¿U°å’Œå¯†ç ã€?br />         2、连接池实现(¾lè¿‡æœ¬äh改版,可以适用多数据库¾cÕdž‹çš„应用以及一¿Uæ•°æ®åº“¾cÕdž‹å¤šä¸ªæ•°æ®åº“且数据  库的数量可以动态增加的应用½E‹åº)
         1),DBConnectionPool.java   数据库连接池¾c?br />         2),DBConnectionManager .java   数据库管理类
         3),DSConfigBean .java                单个数据库连接信息Bean
         4),ParseDSConfig.java                操作å¤?˜q™ä¸ª'å¤?包括不同的数据库和同一¿Uæ•°æ®åº“有多个数据库)
                                                            数据 配置文äšgxml
         5),ds.config.xml                           数据库配¾|®æ–‡ä»¶xml
         原代码如� 
        DBConnectionPool.java  
        ----------------------------------------------------------
      /**
 * 数据库连接池¾c?br /> */
package com.chunkyo.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Timer;
/**
 * @author chenyanlin
 *
 */
public class DBConnectionPool implements TimerListener {
 private Connection con=null;
 private int inUsed=0;    //使用的连接数
 private ArrayList freeConnections = new ArrayList();//容器åQŒç©ºé—²è¿žæŽ?br /> private int minConn;     //最ž®è¿žæŽ¥æ•°
 private int maxConn;     //最大连æŽ?br /> private String name;     //˜qžæŽ¥æ± åå­?br /> private String password; //密码
 private String url;      //数据库连接地址
 private String driver;   //驱动
 private String user;     //用户�br /> public Timer timer;      //定时
 /**
  *
  */
 public DBConnectionPool() {
  // TODO Auto-generated constructor stub
 }
 /**
  * 创徏˜qžæŽ¥æ±?br />  * @param driver
  * @param name
  * @param URL
  * @param user
  * @param password
  * @param maxConn
  */
 public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)
 {
  this.name=name;
  this.driver=driver;
  this.url=URL;
  this.user=user;
  this.password=password;
  this.maxConn=maxConn;
 }
 /**
  * 用完åQŒé‡Šæ”¾è¿žæŽ?br />  * @param con
  */
 public synchronized void freeConnection(Connection con)
 {
  this.freeConnections.add(con);//æ·ÕdŠ åˆ°ç©ºé—²è¿žæŽ¥çš„æœ«å°¾
  this.inUsed--;
 }
 /**
  * timeout  æ ÒŽ®timeout得到˜qžæŽ¥
  * @param timeout
  * @return
  */
 public synchronized Connection getConnection(long timeout)
 {
  Connection con=null;
  if(this.freeConnections.size()>0)
  {
   con=(Connection)this.freeConnections.get(0);
   if(con==null)con=getConnection(timeout); //¾l§ç®‹èŽ·å¾—˜qžæŽ¥
  }
  else
  {
   con=newConnection(); //新徏˜qžæŽ¥
  }
  if(this.maxConn==0||this.maxConn<this.inUsed)
  {
   con=null;//辑ֈ°æœ€å¤§è¿žæŽ¥æ•°åQŒæš‚时不能获得连接了ã€?br />  }
  if(con!=null)
  {
   this.inUsed++;
  }
  return con;
 }
 /**
  *
  * 从连接池里得到连�br />  * @return
  */
 public synchronized Connection getConnection()
 {
  Connection con=null;
  if(this.freeConnections.size()>0)
  {
   con=(Connection)this.freeConnections.get(0);
   this.freeConnections.remove(0);//如果˜qžæŽ¥åˆ†é…å‡ºåŽ»äº†ï¼Œž®×ƒ»Ž½Iºé—²˜qžæŽ¥é‡Œåˆ é™?br />   if(con==null)con=getConnection(); //¾l§ç®‹èŽ·å¾—˜qžæŽ¥
  }
  else
  {
   con=newConnection(); //新徏˜qžæŽ¥
  }
  if(this.maxConn==0||this.maxConn<this.inUsed)
  {
   con=null;//½{‰å¾… ­‘…过最大连接时
  }
  if(con!=null)
  {
   this.inUsed++;
   System.out.println("得到 "+this.name+" 的连接,现有"+inUsed+"个连接在使用!");
  }
  return con;
 }
 /**
  *释放全部˜qžæŽ¥
  *
  */
 public synchronized void release()
 {
  Iterator allConns=this.freeConnections.iterator();
  while(allConns.hasNext())
  {
   Connection con=(Connection)allConns.next();
   try
   {
    con.close();
   }
   catch(SQLException e)
   {
    e.printStackTrace();
   }
   
  }
  this.freeConnections.clear();
   
 }
 /**
  * 创徏新连�br />  * @return
  */
 private Connection newConnection()
 {
  try {
   Class.forName(driver);
   con=DriverManager.getConnection(url, user, password);
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   System.out.println("sorry can't find db driver!");
  } catch (SQLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
   System.out.println("sorry can't create Connection!");
  }
  return con;
  
 }
 /**
  * 定时处理函数
  */
 public synchronized void TimerEvent()
 {
     //暂时˜q˜æ²¡æœ‰å®žçŽîC»¥åŽä¼šåŠ ä¸Šçš?br /> }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 }
 /**
  * @return the driver
  */
 public String getDriver() {
  return driver;
 }
 /**
  * @param driver the driver to set
  */
 public void setDriver(String driver) {
  this.driver = driver;
 }
 /**
  * @return the maxConn
  */
 public int getMaxConn() {
  return maxConn;
 }
 /**
  * @param maxConn the maxConn to set
  */
 public void setMaxConn(int maxConn) {
  this.maxConn = maxConn;
 }
 /**
  * @return the minConn
  */
 public int getMinConn() {
  return minConn;
 }
 /**
  * @param minConn the minConn to set
  */
 public void setMinConn(int minConn) {
  this.minConn = minConn;
 }
 /**
  * @return the name
  */
 public String getName() {
  return name;
 }
 /**
  * @param name the name to set
  */
 public void setName(String name) {
  this.name = name;
 }
 /**
  * @return the password
  */
 public String getPassword() {
  return password;
 }
 /**
  * @param password the password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }
 /**
  * @return the url
  */
 public String getUrl() {
  return url;
 }
 /**
  * @param url the url to set
  */
 public void setUrl(String url) {
  this.url = url;
 }
 /**
  * @return the user
  */
 public String getUser() {
  return user;
 }
 /**
  * @param user the user to set
  */
 public void setUser(String user) {
  this.user = user;
 }
}

-------------------------------------------
 DBConnectionManager .java
------------------------------------------
/**
 * 数据库连接池½Ž¡ç†¾c?br /> */
package com.chunkyo.db;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;
/**
 * @author chenyanlin
 *
 */
public class DBConnectionManager {
 static private DBConnectionManager instance;//唯一数据库连接池½Ž¡ç†å®žä¾‹¾c?br /> static private int clients;                 //客户˜qžæŽ¥æ•?br /> private Vector drivers  = new Vector();//驱动信息
 private Hashtable pools=new Hashtable();//˜qžæŽ¥æ±?br /> 
 /**
  * 实例化管理类
  */
 public DBConnectionManager() {
  // TODO Auto-generated constructor stub
  this.init();
 }
 /**
  * 得到唯一实例½Ž¡ç†¾c?br />  * @return
  */
 static synchronized public DBConnectionManager getInstance()
 {
  if(instance==null)
  {
   instance=new DBConnectionManager();
  }
  return instance;
  
 }
 /**
  * 释放˜qžæŽ¥
  * @param name
  * @param con
  */
 public void freeConnection(String name, Connection con)
 {
  DBConnectionPool pool=(DBConnectionPool)pools.get(name);//æ ÒŽ®å…³é”®åå­—得到˜qžæŽ¥æ±?br />  if(pool!=null)
  pool.freeConnection(con);//释放˜qžæŽ¥
 }
 /**
  * 得到一个连接根据连接池的名字name
  * @param name
  * @return
  */
 public Connection getConnection(String name)
 {
  DBConnectionPool pool=null;
  Connection con=null;
  pool=(DBConnectionPool)pools.get(name);//从名字中获取˜qžæŽ¥æ±?br />  con=pool.getConnection();//从选定的连接池中获得连æŽ?br />  if(con!=null)
  System.out.println("得到˜qžæŽ¥ã€‚。ã€?);
  return con;
 }
 /**
  * 得到一个连接,æ ÒŽ®˜qžæŽ¥æ± çš„名字和等待时é—?br />  * @param name
  * @param time
  * @return
  */
 public Connection getConnection(String name, long timeout)
 {
  DBConnectionPool pool=null;
  Connection con=null;
  pool=(DBConnectionPool)pools.get(name);//从名字中获取˜qžæŽ¥æ±?br />  con=pool.getConnection(timeout);//从选定的连接池中获得连æŽ?br />  System.out.println("得到˜qžæŽ¥ã€‚。ã€?);
  return con;
 }
 /**
  * 释放所有连�br />  */
 public synchronized void release()
 {
  Enumeration allpools=pools.elements();
  while(allpools.hasMoreElements())
  {
   DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();
   if(pool!=null)pool.release();
  }
  pools.clear();
 }
 /**
  * 创徏˜qžæŽ¥æ±?br />  * @param props
  */
 private void createPools(DSConfigBean dsb)
 {
  DBConnectionPool dbpool=new DBConnectionPool();
  dbpool.setName(dsb.getName());
  dbpool.setDriver(dsb.getDriver());
  dbpool.setUrl(dsb.getUrl());
  dbpool.setUser(dsb.getUsername());
  dbpool.setPassword(dsb.getPassword());
  dbpool.setMaxConn(dsb.getMaxconn());
  System.out.println("ioio:"+dsb.getMaxconn());
  pools.put(dsb.getName(), dbpool);
 }
 /**
  * 初始化连接池的参�br />  */
 private void init()
 {
  //加蝲驱动½E‹åº
  this.loadDrivers();
  //创徏˜qžæŽ¥æ±?br />  Iterator alldriver=drivers.iterator();
  while(alldriver.hasNext())
  {
   this.createPools((DSConfigBean)alldriver.next());
   System.out.println("创徏˜qžæŽ¥æ± ã€‚。ã€?);
   
  }
  System.out.println("创徏˜qžæŽ¥æ± å®Œæ¯•。。ã€?);
 }
 /**
  * 加蝲驱动½E‹åº
  * @param props
  */
 private void loadDrivers()
 {
  ParseDSConfig pd=new ParseDSConfig();
 //è¯Õd–数据库配¾|®æ–‡ä»?br />  drivers=pd.readConfigInfo("ds.config.xml");
  System.out.println("加蝲驱动½E‹åºã€‚。ã€?);
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 }
}
----------------------------------------
DSConfigBean.java
----------------------------------------
/**
 * 配置文äšgBean¾c?br /> */
package com.chunkyo.db;
/**
 * @author chenyanlin
 *
 */
public class DSConfigBean {
 private String type     =""; //数据库类åž?br /> private String name     =""; //˜qžæŽ¥æ± åå­?br /> private String driver   =""; //数据库驱åŠ?br /> private String url      =""; //数据库url
 private String username =""; //用户�br /> private String password =""; //密码
 private int maxconn  =0; //最大连接数
 /**
  *
  */
 public DSConfigBean() {
  // TODO Auto-generated constructor stub
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 }
 /**
  * @return the driver
  */
 public String getDriver() {
  return driver;
 }
 /**
  * @param driver the driver to set
  */
 public void setDriver(String driver) {
  this.driver = driver;
 }
 /**
  * @return the maxconn
  */
 public int getMaxconn() {
  return maxconn;
 }
 /**
  * @param maxconn the maxconn to set
  */
 public void setMaxconn(int maxconn) {
  this.maxconn = maxconn;
 }
 /**
  * @return the name
  */
 public String getName() {
  return name;
 }
 /**
  * @param name the name to set
  */
 public void setName(String name) {
  this.name = name;
 }
 /**
  * @return the password
  */
 public String getPassword() {
  return password;
 }
 /**
  * @param password the password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }
 /**
  * @return the type
  */
 public String getType() {
  return type;
 }
 /**
  * @param type the type to set
  */
 public void setType(String type) {
  this.type = type;
 }
 /**
  * @return the url
  */
 public String getUrl() {
  return url;
 }
 /**
  * @param url the url to set
  */
 public void setUrl(String url) {
  this.url = url;
 }
 /**
  * @return the username
  */
 public String getUsername() {
  return username;
 }
 /**
  * @param username the username to set
  */
 public void setUsername(String username) {
  this.username = username;
 }
}
-----------------------------------------------------
ParseDSConfig.java
-----------------------------------------------------
/**
 * 操作配置文äšg¾c?读Â?å†?修改 删除½{‰æ“ä½?
 */
package com.chunkyo.db;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Vector;
import java.util.Iterator;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
 * @author chenyanlin
 *
 */
public class ParseDSConfig {
 /**
  * 构造函�br />  */
 public ParseDSConfig() {
  // TODO Auto-generated constructor stub
 }
 /**
  * è¯Õd–xml配置文äšg
  * @param path
  * @return
  */
 public Vector readConfigInfo(String path)
 {
  String rpath=this.getClass().getResource("").getPath().substring(1)+path;
  Vector dsConfig=null;
  FileInputStream fi = null;
  try
  {
   fi=new FileInputStream(rpath);//è¯Õd–路径文äšg
   dsConfig=new Vector();
   SAXBuilder sb=new SAXBuilder();
   Document doc=sb.build(fi);
   Element root=doc.getRootElement();
   List pools=root.getChildren();
   Element pool=null;
   Iterator allPool=pools.iterator();
   while(allPool.hasNext())
   {
    pool=(Element)allPool.next();
    DSConfigBean dscBean=new DSConfigBean();
    dscBean.setType(pool.getChild("type").getText());
    dscBean.setName(pool.getChild("name").getText());
    System.out.println(dscBean.getName());
    dscBean.setDriver(pool.getChild("driver").getText());
    dscBean.setUrl(pool.getChild("url").getText());
    dscBean.setUsername(pool.getChild("username").getText());
    dscBean.setPassword(pool.getChild("password").getText());
    dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));
    dsConfig.add(dscBean);
   }
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  finally
  {
   try {
    fi.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  
  return dsConfig;
 }
/**
 *修改配置文äšg 没时间写 ˜q‡æ®µæ—‰™—´å†è„“上去 其实一æ ïLš„
 */
 public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception
 {
  String rpath=this.getClass().getResource("").getPath().substring(1)+path;
  FileInputStream fi=null; //è¯Õd‡º
  FileOutputStream fo=null; //写入
  
 }
/**
 *增加配置文äšg
 *
 */
 public void addConfigInfo(String path,DSConfigBean dsb)
 {
  String rpath=this.getClass().getResource("").getPath().substring(1)+path;
  FileInputStream fi=null;
  FileOutputStream fo=null;
  try
  {
   fi=new FileInputStream(rpath);//è¯Õd–xml‹¹?br />   
   SAXBuilder sb=new SAXBuilder();
   
   Document doc=sb.build(fi); //得到xml
   Element root=doc.getRootElement();
   List pools=root.getChildren();//得到xml子树
   
   Element newpool=new Element("pool"); //创徏新连接池
   
   Element pooltype=new Element("type"); //讄¡½®˜qžæŽ¥æ± ç±»åž?br />   pooltype.setText(dsb.getType());
   newpool.addContent(pooltype);
   
   Element poolname=new Element("name");//讄¡½®˜qžæŽ¥æ± åå­?br />   poolname.setText(dsb.getName());
   newpool.addContent(poolname);
   
   Element pooldriver=new Element("driver"); //讄¡½®˜qžæŽ¥æ± é©±åŠ?br />   pooldriver.addContent(dsb.getDriver());
   newpool.addContent(pooldriver);
   
   Element poolurl=new Element("url");//讄¡½®˜qžæŽ¥æ± url
   poolurl.setText(dsb.getUrl());
   newpool.addContent(poolurl);
   
   Element poolusername=new Element("username");//讄¡½®˜qžæŽ¥æ± ç”¨æˆ·å
   poolusername.setText(dsb.getUsername());
   newpool.addContent(poolusername);
   
   Element poolpassword=new Element("password");//讄¡½®˜qžæŽ¥æ± å¯†ç ?br />   poolpassword.setText(dsb.getPassword());
   newpool.addContent(poolpassword);
   
   Element poolmaxconn=new Element("maxconn");//讄¡½®˜qžæŽ¥æ± æœ€å¤§è¿žæŽ?br />   poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));
   newpool.addContent(poolmaxconn);
   pools.add(newpool);//ž®†childæ·ÕdŠ åˆ°root
   Format format = Format.getPrettyFormat();
      format.setIndent("");
      format.setEncoding("utf-8");
      XMLOutputter outp = new XMLOutputter(format);
      fo = new FileOutputStream(rpath);
      outp.output(doc, fo);
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  finally
  {
   
  }
 }
 /**
  *删除配置文äšg
  */
 public void delConfigInfo(String path,String name)
 {
  String rpath=this.getClass().getResource("").getPath().substring(1)+path;
  FileInputStream fi = null;
  FileOutputStream fo=null;
  try
  {
   fi=new FileInputStream(rpath);//è¯Õd–路径文äšg
   SAXBuilder sb=new SAXBuilder();
   Document doc=sb.build(fi);
   Element root=doc.getRootElement();
   List pools=root.getChildren();
   Element pool=null;
   Iterator allPool=pools.iterator();
   while(allPool.hasNext())
   {
    pool=(Element)allPool.next();
    if(pool.getChild("name").getText().equals(name))
    {
     pools.remove(pool);
     break;
    }
   }
   Format format = Format.getPrettyFormat();
      format.setIndent("");
      format.setEncoding("utf-8");
      XMLOutputter outp = new XMLOutputter(format);
      fo = new FileOutputStream(rpath);
      outp.output(doc, fo);
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  finally
  {
   try {
    fi.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  ParseDSConfig pd=new ParseDSConfig();
  String path="ds.config.xml";
  pd.readConfigInfo(path);
  //pd.delConfigInfo(path, "tj012006");
  DSConfigBean dsb=new DSConfigBean();
  dsb.setType("oracle");
  dsb.setName("yyy004");
  dsb.setDriver("org.oracle.jdbc");
  dsb.setUrl("jdbc:oracle://localhost");
  dsb.setUsername("sa");
  dsb.setPassword("");
  dsb.setMaxconn(1000);
  pd.addConfigInfo(path, dsb);
  pd.delConfigInfo(path, "yyy001");
 }
}

--------------------------------------
ds.config.xml   配置文äšg
--------------------------------------


<ds-config>
<pool>
<type>mysql</type>
<name>user</name>
<driver>com.mysql.jdbc.driver</driver>
<url>jdbc:mysql://localhost:3306/user</url>
<username>sa</username>
<password>123456</password>
<maxconn>100</maxconn>
</pool>
<pool>
<type>mysql</type>
<name>user2</name>
<driver>com.mysql.jdbc.driver</driver>
<url>jdbc:mysql://localhost:3306/user2</url>
<username>sa</username>
<password>1234</password>
<maxconn>10</maxconn>
</pool>
<pool>
<type>sql2000</type>
<name>books</name>
<driver>com.microsoft.sqlserver.driver</driver>
<url>jdbc:sqlserver://localhost:1433/books:databasename=books</url>
<username>sa</username>
<password></password>
<maxconn>100</maxconn>
</pool>
</ds-config>


3. ˜qžæŽ¥æ± çš„使用
  1。Connection的获得和释放
  DBConnectionManager   connectionMan=DBConnectionManager .getInstance();//得到唯一实例
   //得到˜qžæŽ¥
   String name="mysql";//从上下文得到你要讉K—®çš„æ•°æ®åº“的名å­?br />   Connection  con=connectionMan.getConnection(name);
  //使用
  。。。。。。�br />  // 使用完毕
 connectionMan.freeConnection(name,con);//释放åQŒä½†òq¶æœªæ–­å¼€˜qžæŽ¥
 2。数据库˜qžæŽ¥çš„动态增加和˜qžæŽ¥æ± çš„动态增åŠ?br />      1。调用xml操作增加¾c?br />
      2。重新实例华˜qžæŽ¥æ± ç®¡ç†æ± ¾c?/div>


]]>PO BO VO DTO POJO DAO概念及其作用åQˆé™„转换图)http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93856.htmlè¡?/dc:creator>è¡?/author>Mon, 15 Jan 2007 01:52:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93856.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/93856.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93856.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/93856.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/93856.html    首先声明偶也不是什么高手,以下æ€È»“都是自己的体会。不对之处请您多指教ã€?/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 />



ç”ÖMº†ä¸ªå›¾åQŒæ„Ÿè§‰æ²¡æœ‰å®Œå…¨è¡¨è¾‘Ö‡ºè‡ªå·±çš„æ„æ€ã€‚。。。。谁帮忙完善下,最好能体现各个O在MVC中的位置
snap20070108.jpg

]]>
谈新手修¾lƒJ2EE武功及学SSH的方æ³?/title><link>http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93852.html</link><dc:creator>è¡?/dc:creator><author>è¡?/author><pubDate>Mon, 15 Jan 2007 01:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93852.html</guid><wfw:comment>http://www.aygfsteel.com/oaixgnaw/comments/93852.html</wfw:comment><comments>http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/oaixgnaw/comments/commentRss/93852.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/oaixgnaw/services/trackbacks/93852.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="postTitle"> <a class="postTitle2" id="viewpost1_TitleUrl" href="/easyjf/archive/2007/01/11/93057.html"> <font color="#3468a4">谈新手修¾lƒJ2EE武功及学SSH的方æ³?</font> </a> </div> <font face="Verdana" size="2"> </font> <div> <font size="2"> <font face="Verdana"> <strong>  ˜q™æ˜¯ä¸¤å°ä¿¡ï¼Œä¸€ž®æ¥è‡ªç½‘å?/strong>adamed <strong>åQŒä¸€ž®æ˜¯æˆ‘的回复åQŒäº¤‹¹çš„æ˜¯åˆå­¦è€…如何学习J2EE及SSH的问题,得到adamed许可åQŒè¿™˜q™é‡Œå‘出来跟大家分äínåQŒæ¬¢˜qŽæ›´å¤šçš„æœ‹å‹æ¥äº¤‹¹ã€?br /><br /></strong></font> </font> </div> <div> <font face="Verdana"> <font size="2"> <strong> </strong> </font> </font> </div> <div> <font face="Verdana"> <font size="2"> <strong>主题åQ?/strong> è¯äh•™easyjf团队各位大侠</font> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2"> <div> </div> <div>  您好åQŒæˆ‘是一个在职èÊY件开发äh员。我æ˜?5òq´å¼€å§‹æŽ¥è§¦java开发ã€?6òq´åŠ å…¥åŒ—äº¬ä¸€å®¶å…¬å¸åˆ°çŽ°åœ¨ã€‚æˆ‘çš„å·¥ä½œæ˜¯åšJ2EEå¼€å‘ã€‚å…¬åæ€‹É用SSHæž¶æž„åQˆStrutsåQSpringåQhibernateåQ‰è¿›è¡Œå¼€å‘ã€?/div> <div>虽然˜q›å…¬å¸åŠòq´ä½†æ˜¯ç”±äºŽé¡¹ç›®åŽŸå› ï¼ŒçœŸæ­£åªåš˜q‡ä¸€ä¸ªStrutsåQ‹Hibernate的项目。现在我看了许多关于SSH的书。也看了一些代码,ž®±æ˜¯æ„Ÿè§‰è‡ªå·±æé«˜å¤ªæ…¢ã€?/div> <div> </div> <div>  偶然æœÞZ¼šåœ¨CSDNçš„blog上看åˆ?大侠 çš„blog知道了EasyJF。很钦佩你们的勇气,敢于开创中国开源项目之先河ã€?/div> <div> </div> <div>  ç”׃ºŽæŽ¥è§¦J2EEæ—‰™—´å¤ªçŸ­ã€‚而现在这æ ïLš„开源项目名目繁多。看了Spring的一些源代码只感觉头晕到不行。我实在不知道该如何提高自己。所以斗胆给各位EasyJF的朋友写˜q™å°é‚®äšgåQŒè¯·å¤§å®¶¾l™æˆ‘一些徏议好嘛?åQŸï¼ˆç”׃ºŽå…¬å¸ä½¿ç”¨SSH开发。所以不看这些东西还不行。)该大家给些徏议该如何学习ã€?/div> <div> </div> <div>psåQšçœ‹äº†EasyJF的介¾læˆ‘很想参与可惜能力实在有限。怕遭拒绝ã€?/div> <div>我现在有一颗火热的心想提高åQŒæƒ³åšæŠ€æœ¯ï¼Œæƒ³äؓ中国原创å‡ÞZ¸€ç‚¹åŠ›ã€‚ä½†æˆ‘ä¹ŸçŸ¥é“åšæŠ€æœ¯ä¸èƒ½æÕQíwã€‚故请各位帮忙ã€?/div> </font> <font face="宋体, MS Song" size="3"> </font> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">  adamed</font> </div> <div>  2007-01-09 </div> <div> </div> <p> <font face="Verdana" size="5"> <strong>下面是我的回信:</strong> </font> </p> <div> <font face="Verdana" color="#0000ff" size="2">您好åQ?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  感谢你对EasyJF的关注以及对国内开源的支持åQŒå›½å†…环境普遍æÕQíwï¼Œå› äؓ有太多像<a ><font color="#ff0000">春迷</font></a>˜q™æ ·çš„äh存在åQŒæžå¾—大安™ƒ½ä¸æ•¢è¡¨è¾¾è‡ªå·±çš„æ€æƒ³äº†ï¼Œå› æ­¤˜q˜å¸Œæœ›ä»¥åŽèƒ½¾l§ç®‹å¤šå¯¹å›½å†…开源äh¾l™äºˆæ”¯æŒã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2"> </font> </div> <div> <font face="Verdana" color="#0000ff" size="2">    关于您来信中说到的问题,我觉得可能是你对java的基¼‹€çš„æŽŒæ¡è¿˜ä¸å¤Ÿçš„原因,½Ž€å•来说就是内力不够。好比中国传¾lŸæ­¦ä¾ å°è¯´ä¸­¾lƒæ­¦äººçš„内力问题åQŒé™é¾™åå…«æŽŒ˜q™æ ·çš„绝世掌法,要是没有一定的内力作基¼‹€çš„话åQŒå°±åªèƒ½æ˜¯é™è›‡åå…«æŽŒåQŒç”šè‡Œ™›‡éƒ½é™ä¸äº†ã€‚虚竹小和尚的武功也是因为有了高æ·Þqš„内力åQŒæ‰èƒ½å˜å¾—那么牛的ã€?/font> <font face="Verdana" color="#0000ff" size="2">而修¾lƒJ2EE武学的内力,我认为大致分ä¸ÞZ¸‰å±‚,初çñ”层次是JAVA基础åQŒç¬¬äºŒå±‚‹Æ¡æ˜¯OO思想及模式,½W¬ä¸‰å±‚次是特定领åŸ?如Web开发相å…ÏxŠ€æœ¯è§„èŒƒã€Servlet规范、JPA规范、EJB3规范½{?、专业知识的学习。有了这些内力,不管他是SSH˜q˜æ˜¯EasyJFåQŒä‹É用è“v来都会非常容易的ã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2"> </font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  SSH属于框架åQŒå±žäºŽå·¥å…øP¼Œä¹Ÿæ˜¯ä¸­é—´ä»¶ã€‚他们是用来提高我们的开发效率,提高我们软äšg产品的可¾l´æŠ¤æ€§ã€å¯æ‰©å±•性乃è‡Ïx•æäh€§çš„ã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2"> </font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  他们里面有很我优¿U€çš„设计理念及模式应用。比如,</font> <font face="Verdana" color="#0000ff" size="2">struts属于MVC框架åQŒå…³é”®æ˜¯è¦äº†è§£MVC的概念及大致原理åQŒæŽŒæ¡å°±å¾ˆå®¹æ˜“了åQ›è€Œhibernate属于orm¾pȝ»ŸåQŒå±žäºŽæŒä¹…层的解å†Ïx–¹æ¡ˆï¼ŒåŒæ ·éœ€è¦å¯¹ORM的概念及原理有一个æ€ÖM½“的了解,必要时可以去查查EJB1及EJB2里面用于持久层的Entity Beançš„ä‹É用。而spring属于应用½E‹åºæ¡†æž¶åQŒå…¶æ ¸å¿ƒæ˜¯IOC容器以及AOPåQŒæŠŠ˜q™ä¸¤ä¸ªæ ¸å¿ƒæ¦‚å¿?也可¿UîCؓ大模å¼?了解以后åQŒå†åŠ ä¸Šä¸€å®šçš„å†…åŠ›ä¿®äØ“åQŒå…¶å®ƒå°±éƒ½ä¸éš¾äº†ã€‚Spring中还集成了很多适用东西(不过˜q™äº›ä¸œè¥¿80%的在某一个项目中可能一直用不上)åQŒæ¯”如对JDBC的封装、自å·Þqš„MVC、对动态语­a€çš„简‹zè®¿é—®ç­‰åQŒè¿™äº›ä½ æ ÒŽ®è‡ªå·±çš„项目情冉|¥é€‰æ‹©å­¦ä¹ åQŒç”¨åˆ°çš„æ—¶å€™å†çœ‹çœ‹ä»–的文档åQŒä¸€ä¸ªé¡¹ç›®ä¸‹æ¥åº”该就能把握ã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2"> </font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  说了那么多,我篏了,你一定也有点晕了åQŒä¸‹é¢ç»“合你的情况,½Ž€å•发表一ç‚ÒŽˆ‘的徏议:</font>        </div> <div> <div> <font face="Verdana" color="#0000ff" size="2">  åQ‘、用一òq´çš„æ—‰™—´æ…¢æ…¢æå‡è‡ªå·±çš„内力,然后˜q™æœŸé—´å¯ä»¥é€šè¿‡ä¸‹é¢çš„æ–¹æ³•同步学习ä‹É用sshã€?/font> </div> </div> <div> <font face="Verdana" color="#0000ff" size="2">  2、看一些国内作者原创的书籍åQŒåƈ˜qè¡Œç›¸å…³ä»£ç åQŒæ¯”如孙卫琴的Struts及Hibernate½{‰å…¥é—¨æ•™½E‹ï¼Œ¾|—时飞的Spring教程。他们的书都通谷易懂åQŒå¾ˆå¤šå±žäºŽä»–们在学习˜q‡ç¨‹ä¸­çš„ç‚ÒŽ»´è®°å½•åQŒå› æ­¤ä¸€å®šéžå¸¸å¥½æ‡‚。不要一下子ž®±åŽ»è¯»Rod的《J2EE Without EJB》,或者是Spring开发团队编写的《Spring框架高çñ”¾~–程》,甚至《Spring in action》!ç”׃ºŽå¾ˆå¤š¾~˜æ•…åQŒè¿™äº›ä¹¦çœ‹äº†ä½ ä¸€å®šä¼šæ›´æ™•ã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  3、下载一些国内原创的SSH应用源码½CÞZ¾‹ã€‚国外有很多˜q™æ ·çš„,也可以多看看ã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  4、运行这些框架所附带Example½CÞZ¾‹åQŒåƈ了解其设计原理,òq¶èƒ½½Ž€å•修攏V€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  5ã€è¿è¡ŒåÆˆå¤šçœ‹˜q™äº›æ¡†æž¶çš„æµ‹è¯•代码。要像买彩民分析采票走势å›ùN‚£æ äh…¢æ…¢ç¢¼‚¨åˆ†æžã€?/font> </div> <div> <font face="Verdana" color="#0000ff" size="2">  6ã€åœ¨è‡ªå·±çš„é¡¹ç›®ä¸­å¤šåŠ¨ç”¨ï¼Œç†Ÿç»ƒä½¿ç”¨ä¸€ä¸ªå¼€å‘å·¥å…øP¼Œå¦‚EclipseåQŒåƈ能掌握程序调试技巧ã€?/font> </div> <div>    </div> <div>  <font color="#ff0000">最后,关于Spring的学习,可以看看我们最˜q‘在¾~–写的《深入Spring 2åQšè½»é‡çñ”J2EE开发框架原理与实践》的电子版,现在有两章可以下载,比较适合入门åQ?/font>¾|‘址是:<a ><font color="#3468a4">http://www.easyjf.com/spring</font></a>ã€?/div> <div> </div> <div>  另外åQŒæˆ‘准备你给我的信及我给你的回信攑ֈ°æˆ‘çš„blog上,供大家分享我们的交流åQŒä¸çŸ¥é“您是否愿意?</div> <div> </div> <div>  ¼œï¼šå­¦ä¹ æ„‰å¿«åQŒå·¥ä½œé¡ºåˆ©ï¼</div> <div> </div> <div>    </div> <div>  EasyJF开源 大åˆö</div> <div> </div> <div>  2007-01-10</div> <img src ="http://www.aygfsteel.com/oaixgnaw/aggbug/93852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/oaixgnaw/" target="_blank">è¡?/a> 2007-01-15 09:46 <a href="http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐几个‹¹è§ˆå™¨å¼€å‘å·¥å…?http://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93849.htmlè¡?/dc:creator>è¡?/author>Mon, 15 Jan 2007 01:44:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93849.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/93849.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2007/01/15/93849.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/93849.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/93849.html 推荐几个‹¹è§ˆå™¨å¼€å‘å·¥å…?/a>
    做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.


]]>struts+hibernate的替代方案:struts+newxy?http://www.aygfsteel.com/oaixgnaw/archive/2006/09/11/69018.html�/dc:creator>�/author>Mon, 11 Sep 2006 12:14:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2006/09/11/69018.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/69018.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2006/09/11/69018.html#Feedback1http://www.aygfsteel.com/oaixgnaw/comments/commentRss/69018.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/69018.htmlnewxy技术网站:http://www.newxy.net
    在javaçš„web开发领域较éºÈƒ¦çš„æ˜¯æ•°æ®åº“操¾Uµï¼Œå¦‚果有工兯‚ƒ½åƒdelphi开发数据库˜qç”¨¾pȝ»Ÿé‚£æ ·é«˜æ•ˆåQŒå®ƒä¸€å®šä¼šå—到开发者的‹Æ¢è¿Žã€?

    ¾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½•一¿USQLå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»è½»æ‘Ö¾ç«‹çš„ã€?



]]>
爱护自己和你çˆÞqš„人——预防癌ç—?/title><link>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67841.html</link><dc:creator>è¡?/dc:creator><author>è¡?/author><pubDate>Tue, 05 Sep 2006 08:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67841.html</guid><wfw:comment>http://www.aygfsteel.com/oaixgnaw/comments/67841.html</wfw:comment><comments>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/oaixgnaw/comments/commentRss/67841.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/oaixgnaw/services/trackbacks/67841.html</trackback:ping><description><![CDATA[有关癌症<br /><br />三十多年前有一位服务于公卖局台北啤酒厂的张先生,参加该啤酒厂选派技术äh员到国外深造的考试åQŒä»¥ä¼˜å¼‚的成¾l©åŠæ ¹{€‚在出国前经某公立医院体‹‚€å‘现åQŒç½¹æ‚£æœ‰åƒå­©æ‹›_¤´å¤§å°çš„肺部肿瘤,因而不能出国ã€?<br />张先生非常失望之余,一直怀疑诊断有误;于是再到另一家医院检查,¾l“æžœ˜q˜æ˜¯è¯å®žåŽŸæ¥çš„è¯Šæ–­åÆˆæ— é”™è¯¯ã€‚å½“æ—¶å¹´è½ÕdŠ›å£®çš„å¼ å…ˆç”Ÿå¾—åˆ°è¿™æ ïLš„¾lç—‡åQŒåœ¨äººç”Ÿ¾læœ›ä¹‹ä½™åQŒå¤š‹Æ¡æ‰“电话¾l™å½“æ—¶ä“Q职台东县政府黄顺兴县长机要秘书的™ìå§“同学ã€?br />™ìå§“同学便利用星期日赶到台北和张先生见面åQŒå¼ å…ˆç”Ÿå‘魏同学详述相关¾læœ›çš„详情和悲观感受åQŒåƈ请位同学协助其后事,恰逢魏同学与前任马偕医院院é•?949åQ?5专精于癌症äÍ床研½I¶çš„吕革令博士)¾pȝŸ¥äº¤å¥½å‹ã€‚当卛_¾è®®å‰å¾€è®¿æ±‚吕博士医治,起初张先生说不愿再看åŒÈ”ŸåQŒä»¥å…å¾’增伤æ‚ÔŒ¼›ä½†é­åŒå­¦è¯´å…ˆå‰å·²ä»¥ç”µè¯è¯·æ•™è¿‡å•åšå£«åÆˆå®‰æŽ’å¥½æ—¶é—ß_¼Œå¼ å…ˆç”Ÿåªå¥½å•同前往吕博士住处造访。吕博士和张先生见面ž®Þp¯´åQšé­å…ˆç”Ÿæ˜¯æˆ‘的好友,介绍你和我认识是我们¾~˜ä†¾åQŒæ„Ÿè°¢ä¸Šå¸èµ¾l™æˆ‘们这个机会;我请教你åQšã€Žç™Œä¸ÞZ»€òqºå«¾lç—‡åQŒä½ å¯çŸ¥é“吗åQŸã€ã€?br />张先生和™ìå…ˆç”Ÿéƒ½ä¸çŸ¥é“如何作½{”ã€?br />吕博士又è¯ß_¼šã€Œäh¾cÕdŒ»æ²È™Œç—‡åˆ°ç›®å‰ä¸ºæ­¢åªæœ‰ä¸¤æ¡è·¯ï¼Œ½W¬ä¸€æ¡èµ\是消灭病源,½W¬äºŒæ¡èµ\是增加抵抗力。但很奇怪的是,癌无论用é’?0或其它药物去消灭癌细胞,可是癌细胞还没被消灭åQŒå¥½çš„细胞却先被杀歅R€‚另无论用什òqø™¥å……R€è¡¥è¯ï¼Œå¥½çš„¾l†èƒž˜q˜æœªå¸æ”¶åQŒç™Œ¾l†èƒžå´å…ˆå¸æ”¶ã€è®©ç™Œé•¿å¾—更快;因此可说上述两条路都行不通、所以叫¾lç—‡ã€‚ã€?<br />吕博士又è¯ß_¼šäººç±»çš„聪明连登陆月球也都已经成功åQŒä½†ä¸ÞZ»€òqºæ²¡æœ‰ähåŽÀL€€ç–‘上˜qîC¸¤æ¡æ²»ç™Œçš„路是在钻牛角ž®–,另外扄¡¬¬ä¸‰æ¡è·¯ï¼Ÿæ„Ÿè°¢ä¸Šå¸èµç»™æˆ‘以往在马偕医 院做癌症斚w¢çš„äÍ床实验,òq¶å¾—é™¢å†…å„éƒ¨åŒä»ååŠ©çš„æœºä¼šï¼Œæˆ‘å‘çŽ°ç™Œç—‡ç—…äºø™¡€æ¶²æ£€æŸ¥çš„¾l“果癑ֈ†ä¹‹ç™¾éƒ½æ˜¯é…¸æ€§ååº”。长期素食、且生活接近然的佛寺僧尼åQŒç”±äºŽä½“质都偏属优质å¼Þq¢±æ€§ï¼Œæ‰€ä»¥å°šæ²¡æœ‰å‘现¾|ÒŽ‚£ç™Œç—‡çš„病例。因此我大胆的断定在å¼Þq¢±æ€§ä½“质的状态下åQŒç™Œ¾l†èƒžæ˜¯æ— æ³•生é•ѝ€ç”šè‡Ïx˜¯æ— æ³•生存的。张先生我徏议你从现在è“vž®‘吃酸性的荤食¾c»ï¼Œå¤šåƒ¼„±æ€§é£Ÿç‰©ï¼Œå¦å¤–可吃¾l¿è—»å’Œå¸¦å£Œ™±è§’汤åQŒæ”¹å˜ä½ çš„体质,òq¶åŠ±è¡ŒæŽ¥˜q‘自然的良好生活规律åQ›å¦‚果五òq´å†…不死、你ž®±æ²¡é—®é¢˜äº†ï¼Œæ„¿ä¸Šå¸ç¥¼›ä½ ã€‚ã€?<br />张先生依照吕博士的徏议,认真改变吃的习惯åQŒæ¯å¤©åˆåƒç»¿è—…R€å–èÞp§’汤,乐观加上每天适当的运动,一òq´åŽå†åˆ°åŒä¸€å…¬ç«‹åŒ»é™¢‹‚€æŸ¥ç»“果,发现肿瘤不但没有长大、反而已呈现萎羃状态,遂ä×o医院‹‚€æŸ¥äh员惊为奇˜q¹ï¼Œäº”年后竟完全处于萎羃、至˜q‘于消失状态ã€?<br />¾lè¿‡äº†å°†˜q‘四十年岁月åQŒçŽ°åœ¨å¼ å…ˆç”Ÿçš„å¥åºähƒ…å†µå®Œå…¨æ­£å¸¸ï¼Œç”Ÿæ´»èµ·å±…ç”šäØ“æ„‰å¿«ã€‚ç‘ô张先生之后,有位前台东省立医院æ€ÕdŠ¡è¯ùN•¿é™ˆæ·»å¯¿å…ˆç”Ÿï¼ŒåŒæ ·å¾—到肺癌åQ›é­å…ˆç”Ÿå¾—知后将张先生的¾lè¿‡è½¬å‘Šé™ˆæ·»å¯¿å…ˆç”Ÿï¼Œé™ˆå…ˆç”Ÿä¹ƒä¾ç…§å•åšå£«çš„å»ø™®®˜q›è¡Œæ”¹å˜ä½“è´¨åQŒç»“果与张先生同æ äh„ˆç™Œç—‡ã€?<br />那时吕博士全家已¿UÀL°‘¾ŸŽå›½åQŒäº‹åŽå•博士回来台湾再与™ìå…ˆç”Ÿè§é¢æ—¶åQŒé­å…ˆç”Ÿž®†å¼ å…ˆç”Ÿå’Œé™ˆå…ˆç”Ÿçš„经˜q‡å‘Šè¯‰å•博士åQŒåƈ提议ç”׃»–们俩位亲自向吕博士陈˜qŽÍ¼Œè¯·å•博士发表其改变体质之自疗成果报告。吕博士谦虚地回½{”说åQšæˆ‘òq´äº‹å·²å¤§åQ?  且没有äÍ床纪录不能做为成果。请™ìå…ˆç”Ÿè{告亲友,如果友äh认同的话åQŒè¯·ä»–们¾l§ç®‹åšä½“éªŒåÆˆòq¿äؓ宣导........。ã€?<br />å…›_¿ƒè‡ªå·±ä¹Ÿè¦å…›_¿ƒåˆ«ähåQ?5åHªç™Œç—‡ç—…患属于酸性体质。健康äh的血液是成弱¼„±æ€§çš„åQŒçº¦æ˜¯PH7.35ï½?.45左右。婴儿也是属于弱¼„±æ€§çš„体质。成长期的成人有体质酸化的现象。根据一™å¹å…­ç™¾ä½ç™Œç—‡ç—…äh体液分布的研½IÓž¼Œæ˜„¡¤º85åHªç™Œç—‡ç—…患属于酸性体质。因此,如何使体质维持在å¼Þq¢±æ€§å°±æ˜¯è¿œ¼›È–¾ç—…çš„½W¬ä¸€æ­¥ã€?br />酸性体质的生理表征åQ?br />1.皮肤无光泽ã€?br />2.香港脚ã€?br />3.½Eåš˜qåЍåÏx„Ÿç–²åгåQŒä¸€ä¸Šå…¬è½¦ä¾¿æƒ³ç¡è§‰ã€?br />4.上下楼梯å®ÒŽ˜“气喘ã€?br />5.肥胖、下腹突出ã€?br />6.步伐¾~“慢、动作迟¾~“ã€?br />ä¸ÞZ»€òqÞZ¼šå½¢æˆé…¸æ€§ä½“质?<br />1.˜q‡åº¦æ‘„取乳酸性食å“?br />aåQ‰è‚‰¾c…R€å¥¶é…ªåˆ¶å“ä¸Žè›‹ã€ç‰›è‚‰ã€ç«è…¿ç­‰çš†å±žäºŽé…¸æ€§é£Ÿå“ã€?<br />båQ‰æ‘„取过量的酸性食品血液会們֐‘酸性而变黏稠åQŒä¸æ˜“流到细血½Ž¡çš„æœ«ç¨åQŒè€Œæ˜“造成手脚或膝盖的冷寒症,以及肩膀åƒëŠ¡¬å’Œå¤±çœ ç­‰ã€?<br />cåQ‰å¹´è½ÕdŠ›å£®æ—¶åƒé€‚é‡çš„è‚‰¾cÀL˜¯å¯¹çš„åQŒä½†è€å¹´äººåˆ™ä»¥è”¬èœæˆ–ž®é±¼ä¸ºå®œã€?br />2.生活步调失常会造成酸性体è´?<br />aåQ‰ç”Ÿ‹zÀL­¥è°ƒå¤±å¸æ€¼šé€ æˆ¾_„¡¥žä¸Žè‚‰ä½“的压力ã€?<br />båQ‰æ®¾lŸè®¡åQŒæ™šç¡è€…ç½¹æ‚£ç™Œç—‡çš„æœºçŽ‡æ¯”æ­£å¸æ€h高出五倍ã€?<br />cåQ‰äh¾cÀLœ¬æ¥å°±‹zÕdœ¨èŠ‚å¥çš„ä¸–ç•Œé‡ŒåQŒæ— æ³•事先储备睡眠或饮食åQŒä¹Ÿä¸èƒ½æ—¥å¤œé¢ å€’ã€?br />dåQ‰äh体内脏受自律¼œžç»æŽ§åˆ¶åQŒç™½å¤©ä¸»è¦æ˜¯äº¤æ„Ÿ¼œžç»‹zÕdЍåQŒæ™šä¸Šåˆ™ç”±å‰¯äº¤æ„Ÿ¼œžç»å·¥ä½œåQŒè‹¥ä½¿å…¶é”™äؕ及倒置åQŒå°±äº¦ç™¾ç—…滋生ã€?br />3.情çÈA˜q‡äºŽç´§å¼ <br />aåQ‰æ–‡æ˜Žç¤¾ä¼šä¼šé€ æˆçš„压力ã€?br />båQ‰å·¥ä½œä¸Šæˆ–ç²¾¼œžä¸Šçš„压力。Â? <br />cåQ‰å½“一个äh承受¾_„¡¥žåŽ‹åŠ›åŽï¼Œä¸€æ—¦ç´§å¼ æ¾å¼›ï¼Œæ—¶ä¼šé€ æˆçŒæ­»åQŒç§°ä¸ºæ½œåœ¨æ€§å‰¯è‚„¡š®è´¨æœºèƒ½ä¸å…¨ç—‡ã€?br />4.肉体的紧å¼?br />aåQ‰åŠ¨æ‰‹æœ¯ä¹‹å‰åº”å…ˆ‹‚€æŸ¥è‚¾ä¸Šè…ºçš®è´¨æœø™ƒ½æ˜¯å¦æ­£å¸¸ã€‚如果副肄¡š®è´¨æœºèƒ½è¾ƒå·®ï¼Œ 或手术压力远­‘…过副肾调整功能åQŒåˆ™å¯èƒ½é€ æˆç—…ähæ­ÖMº¡æˆ–其它不良媄响ã€?br />båQ‰è‹¥å‘现病患脔Rƒ¨‹¹®è‚¿åQŒéœ€è¯¦åŠ è¯¢é—®ç—…å²åŠæœè¯çŠ¶å†µï¼Œä¸ºé•¿æœŸæœç”¨è‚¾ä¸Šè…ºçš®è´¨è´ºå°”è’™è€…ï¼Œæ–½ä»¥é’ˆç¸è¦ç‰¹åˆ«æ³¨æ„ååº”ã€?br />cåQ‰åŠ³åŠ¨æˆ–˜qåЍ˜q‡åº¦åQŒé€šå®µæ‰“牌、开车等压力都应ž®½é‡é¿å…ã€?br />附录åQšå¸¸è§é£Ÿç‰©çš„酸碱æ€?br />1.强酸性食品:蛋黄、奶酪、白¾p–做的西ç‚ÒŽˆ–柿子、乌鱼子、柴鱼等ã€?br />2.中酸性食品:火腿、培栏V€é¸¡è‚‰ã€é²”é±¹{€çŒªè‚‰ã€é³—é±¹{€ç‰›è‚‰ã€é¢åŒ…、小麦、奶沏V€é©¬è‚‰ç­‰ã€?br />3.弱酸性食品:白米、落èŠÞq”Ÿã€å•¤é…’、酒、æÑa炸豆腐、æ“v苔、文蛤、章é±?泥鳅ã€?<br />4.å¼Þq¢±æ€§é£Ÿå“ï¼š¾U¢è±†ã€èåœã€è‹¹æžœã€ç”˜è“èœã€?‹z‹è‘±ã€è±†è…ç­‰ã€?br />5.中碱性食品:萝卜òqŒÓ€å¤§è±†ã€çº¢èåœã€è•ƒèŒ„ã€?香蕉、橘子、番瓜、草莓、蛋白、梅òqŒÓ€æŸ æª¬ã€è èœç­‰ã€‚ Â?br />6.强碱性食品:葡萄、茶叶、葡萄酒、æ“v带芽、æ“v带等ã€?ž®¤å…¶æ˜¯å¤©ç„¶ç»¿è—Õd¯Œå«å¶¾l¿ç´ åQŒæ˜¯ä¸é”™çš„碱性健康食品,而茶¾cÖM¸å®œè¿‡é‡ï¼Œæœ€ä½³é¥®ç”¨æ—¶é—´äؓ早上ã€?br /><img src ="http://www.aygfsteel.com/oaixgnaw/aggbug/67841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/oaixgnaw/" target="_blank">è¡?/a> 2006-09-05 16:47 <a href="http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让你的网站排名靠å‰?http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67840.htmlè¡?/dc:creator>è¡?/author>Tue, 05 Sep 2006 08:43:00 GMThttp://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67840.htmlhttp://www.aygfsteel.com/oaixgnaw/comments/67840.htmlhttp://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67840.html#Feedback0http://www.aygfsteel.com/oaixgnaw/comments/commentRss/67840.htmlhttp://www.aygfsteel.com/oaixgnaw/services/trackbacks/67840.html
成功案例推荐åQšhttp://sooboo.com.cn/


˜q˜åœ¨¾l§ç®‹æ•´ç†ä¸­ï¼Œè€Œä¸”我们的网站也在不断优化中.........

1ã€?¾|‘站建好后首先到各大搜烦引擎免费ç™Õd½•ä½ çš„¾|‘ç«™

http://www.sowang.com/freesubmit.htm
http://bbs.5ixb.com/simple/index.php?t584.html

2ã€?下蝲一个spider模拟å™? 来查看你¾|‘页被SE‹‚€‹¹‹åˆ°çš„ä¿¡æ? 可以在这个网址查看你页面被搜烦引擎攉™›†åˆ°çš„信息: http://www.webconfs.com/search-engine-spider-simulator.php, æ ÒŽ®˜q™äº›ä¿¡æ¯, 修改™åµé¢, åŽÀLŽ‰æ— ç”¨ä¿¡æ¯, 增加你认为有用的信息ã€?

3ã€?ž®½é‡ä¸è¦æŠŠæ•´ä¸ªé¡µé¢éƒ½ç”¨Flash或者图片来实现, ˜q™æ ·SE无法扑ֈ°™åµé¢çš„æœ‰ç”¨ä¿¡æ?

4ã€?用标准代码设计网™å?一个页面最主要æœ?个部分需要关æ³? 一个是<head></head>, 另外一个是<boy></body>, 臛_°‘˜q?部分应该设计好了, SE喜欢从左到右,自上而下搜烦信息, 它认为页面上面的信息更重è¦? 所以尽量把你要½Hå‡ºçš„信息放在页面的上面

5�<title>标志:
  titleæ ‡å¿—ä½œäØ“™åµé¢çš„重要信æ? SE非常看重, 应该把本™åµé¢è¦çªå‡ºçš„信息¾_„¡®€åˆ?0ä¸ªå­—ä»¥å†…ä½œäØ“titleçš„å€? 但不要用与页面无关的关键字作为titleå€? 否则会被SE惩罚.

6�lt;Meta>标志:
  每页都加上关键词比较好,但是不要堆砌关键词,堆砌关键词会被搜索引擎视ä¸ÞZ½œå¼Šï¼Œæœ€å¥½æ˜¯æœ?ã€?癑֭—的内宏V€‚在内容中有主要关键词,而关键词密度åœ?åQ…到8åQ…之é—ß_¼ˆ˜q™æ˜¯ç›®å‰å‡ ä¸ªæœˆçš„æœ€ä½›_…³é”®è¯å¯†åº¦åQŒä»¥åŽå¯èƒ½ä¼šå˜ï¼‰. 关键词要注意åQšTitle和网™åµå†…容中含有关键词最重要、其‹Æ¡æ˜¯Meta描述åQ†Meta 关键词。然后网™åµå†…容中çš?lt;h></h>之间的标题中是否含有关键词也很重要。Meta最重要的是DescriptionåQŒè€ŒMeta Keywords现在大型的搜索引擎都不会在意åQŒæ¯”如Googleå’ŒYahoo都不会根据Meta Keywords来进行网™å‰|Ž’åã€‚Description中关键词的原则同æ äh˜¯æœçƒ¦é‡æœ€å¤§æœ€ç›¸å…³çš„æ”¾åœ¨æœ€å‰é¢åQŒæ¯”如我们网站是做汽车保险报ä»ïLš„åQŒåŽŸæ¥æˆ‘ä»¬ç½‘ç«™çš„å…³é”®å­—æ˜¯˜q™æ ·æè¿°çš?

<meta content="òq³ä­h车险,搜保,搜保¾|?低ä­h车险,搜保车险¾|?车险,北京车险,车险报ä­h,车险­‘…市,搜保车险,æ±½èžR保险,车险¾|?华安车险,中保车险,中华联合车险,òq›_®‰è½¦é™©,太åã^‹z‹èžRé™?便宜车险,保险­‘…市,在线投保"name="keywords">åQŒåœ¨baidu中打入“保险”,你会发现“èžR险计½Ž—”这个关键词的搜索量是最高的åQŒè¿™ä¸ªå…³é”®è¯ä¸ç”¨åQŒç­‰äºŽæµªè´¹ï¼ŒæŒ‰ç…§ç™‘Öº¦¼‹®å®šå…³é”®è¯æœç´¢é‡çš„æ–¹æ³•,排在最前面的关键词是:车险计算,òq›_®‰è½¦é™©,äºÞZ¿è½¦é™©,北京车险,强制车险,中保车险,太åã^‹z‹èžRé™?车险论坛,车险知识,上æ“v车险,车险理赔,车险¿Uç±»,保得车险¾|?车险营销,武汉车险,天åã^车险,车险¾|?中国车险¾|?¾|‘上车险åQŒæ‰€ä»¥æˆ‘æ”ÒŽˆ˜q™æ ·åQ?
<meta content="车险计算和èžR险投保尽在搜保网。国内首家网上专业代理åã^安èžRé™?äºÞZ¿è½¦é™©,中保车险,太åã^‹z‹èžR险。向消费者提供åã^ä»—÷€å¿«é€Ÿã€é«˜å“è´¨çš„æ±½è½¦ä¿é™©é”€å”®æœåŠ¡ã€? name="DESCRIPTION">
<meta content="车险åQŒèžR险计½Ž?òq›_®‰è½¦é™©,äºÞZ¿è½¦é™©,北京车险,强制车险,中保车险,太åã^‹z‹èžRé™?车险知识,车险理赔,车险¿Uç±»,车险¾|?¾|‘上车险,车险报ä­håQŒæœä¿ç½‘,车险报ä­h,搜保车险,æ±½èžR保险,低ä­h车险,搜保车险¾|?òq³ä­h车险,便宜车险,在线投保" name="keywords">
一般可以把˜q™æ®µå­å†™åˆîC¸€ä¸ªtitle.lbiæ–‡äšg中,å¦?
<title>搜保¾|?全国首家专业车险报ä­hòq›_°åQŒäؓ您提供精¼‹®å¿«é€Ÿçš„¾|‘上报ä­h服务</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta content="车险åQŒèžR险计½Ž?òq›_®‰è½¦é™©,äºÞZ¿è½¦é™©,北京车险,强制车险,中保车险,太åã^‹z‹èžRé™?车险知识,车险理赔,车险¿Uç±»,车险¾|?¾|‘上车险,车险报ä­håQŒæœä¿ç½‘,车险报ä­h,搜保车险,æ±½èžR保险,低ä­h车险,搜保车险¾|?òq³ä­h车险,便宜车险,在线投保" name="keywords">
<meta content="车险计算和èžR险投保尽在搜保网。国内首家网上专业代理åã^安èžRé™?äºÞZ¿è½¦é™©,中保车险,太åã^‹z‹èžR险。向消费者提供åã^ä»—÷€å¿«é€Ÿã€é«˜å“è´¨çš„æ±½è½¦ä¿é™©é”€å”®æœåŠ¡ã€? name="DESCRIPTION">
然后嵌入到页面中åQŒå¦‚
<HTML>
<HEAD>
<!--#include virtual="/Library/title.lbi" -->
</head>
<html>

7、我之所以把“èžR险报价”放在了后面åQŒæ˜¯å› äؓ你按照我的方法在癑ֺ¦ä¸­æœç´¢ä¼šå‘现“èžR险报价”这个关键词æ ÒŽœ¬æ²¡æœ‰ä»€ä¹ˆäh搜烦åQŒæ‰€ä»¥æ”¾åœ¨åŽé¢ï¼Œæ²¡æœ‰äººæœç´¢å°±è¡¨ç¤ºæ²¡æœ‰äººæµåQŒå…³é”®è¯æ˜¯åˆ«äººçš„æœçƒ¦ä¹ æƒ¯åQŒä¸æ˜¯ä¿ºä»¬åš¾|‘页的自己想出来的,所以首先要分析什么关键词别äh用的最å¤?

8ã€?javascript: SE一般对javascript不感å†? ž®½é‡ä¸è¦åœ¨é¡µé¢çš„<head></head>间放¾|®å¤§é‡çš„javascript函数, ˜q™æ ·ä¼šä‹ÉSE不知所æŽ? 而且大部分SE在爬行你的页面时都有旉™—´é™åˆ¶, 或者最大信息量限制, 在前面放¾|®å¾ˆå¤šjavascript代码会ä‹ÉSE˜qè¡Œ¾~“æ…¢, 降低对你的兴­‘? 最主要˜q˜æ˜¯˜q™éƒ¨åˆ†ä»£ç æŠŠä½ åŽé¢æœ‰ç”¨ä¿¡æ¯å ç”¨äº†,使得SE无法获取你页面有用的信息, 如果你实在要用javascript, ž®½é‡æŠŠæ‰€æœ‰javascript代码攑֜¨ä¸€ä¸ªjsæ–‡äšgé‡? 然后在页面连接这个JSæ–‡äšg卛_¯

9ã€?¾l™æ‰€æœ?lt;img>加上alt属æ€? ˜q™ä¸ªä¸€ä¸ªå¥½çš„ä¹ æƒ? ž®¤å…¶æ˜¯æŒ‡å‘一个连接的囄¡‰‡ä¸€å®šè¦åŠ ä¸Šè¦è¿žæŽ¥ç½‘å€çš„å…³é”®ä¿¡æ? SE会对有连接指向的囄¡‰‡çš„ALT属性进行识åˆ? 但对无连接的囄¡‰‡ä¸ä½œå¤„理.

10ã€?<h1><h2>: SE对这æ ïLš„信息很感兴趣, 而且会对其增加权é‡? 所以把最重要的信息用<h1></h1>标识出来, 把次重要的信息用<h2></h2>标识出来. 注意: 一个页面应该只有一ä¸?lt;h1></h1>, 可以有多ä¸?lt;h2></h2>, 否则会被SEè®¤äØ“æ˜¯ä½œå¼Šçš„

11ã€?ž®½é‡ä¸è¦ç”¨mouseovers, 最好在css里用hover来实çŽ?

12ã€?ž®½é‡ä¸è¦å¥—用多层‹Æ¡çš„<table>, SE一般最多只能读å?ä¸?lt;table>的嵌å¥? 如果多了, 它就懒得è¯ÖM¸‹åŽÖMº†, 造成你的有用信息没有被检‹¹‹åˆ°.

13ã€?<b><strong>: ˜q™äº›æ ‡è¯†ä¹Ÿä¼šè¢«SE很好的注意到, 虽然权重不如<h1><h2>那么é«? 可以灉|´»ä½¿ç”¨.

14ã€?一个页面的˜qžæŽ¥æ•°é‡æœ€å¤šä¸è¦è¶…˜q?00ä¸? googleè®¤äØ“åªæœ‰å‰?00个是有用çš?

15ã€?对于搜烦引擎来说åQŒé¡µé¢å„个元素的权重比例ã€?
  内部˜qžæŽ¥: 10 åˆ?
  标题title: 10 �
  域名: 7 �
  <h1>�lt;h2>: 5 �
  ™åµé¢½W¬ä¸€ä¸ªæ®µè½çš„开始部åˆ? 5 åˆ?
  路径和文件名: 4 �
ã€€ã€€ç›æ€¼¼å…³é”®è¯? 4 åˆ?
  每个句子的开始部�1.5 �
  <b>�lt;strong>: 1 �
  内容: 1 �
  Title属� 1 � (注意不是<title>, 是title属� 比如<a href=�title=”�gt;)
  alt 标志: 0.5 �
  <meta>的description属� 0.5 �
  <meta>�keywords属� 0.05 �

16ã€?ž®½é‡ç”¨HTML的格å¼? 如果的确要用数据åº? ž®½é‡å‡å°‘参数的长åº?

17ã€?我的¾|‘ç«™( http://www.sooboo.com.cn/ )以前昄¡¤ºå•†å“éƒ½æ˜¯ç”¨ä¸€ä¸ªaspxæ–‡äšg通过参数传递的, ¾l“æžœ˜q™ä¸ªaspxæ–‡äšg只能被SE收录1™å? 而且排名æ ÒŽœ¬æ‰¾ä¸åˆ? 后来我把动态页面è{换成了静态页é?用HTML格式昄¡¤º, 每个商品一个HTML™åµé¢, ¾l“æžœgoogle收录增加äº?000多页, 而且每个商品在google的排行基本都在第一™åµäº†, 一搜的也是. 最˜q‘来自一搜的讉K—®é‡æˆå€å¢žåŠ? 一搜基本上只对HTMLæ–‡äšg感兴­‘? 对动态页面不太感å†?
可以写个基类åQŒå¦‚





public class BasePage: System.Web.UI.Page
{
public BasePage()
{

}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
string name=Request.Url.AbsolutePath.Substring(1,Request.Url.AbsolutePath.Length-1).Replace("aspx","htm");
string newurl="";
if(name.IndexOf("/")>0)
{
newurl=Server.MapPath("../") + name;
}
else
{
newurl=Server.MapPath("./") + name;
}
MemoryStream ms = new MemoryStream();
StreamWriter sww = new StreamWriter(ms);
StreamWriter swr = new StreamWriter(newurl);
System.Web.UI.HtmlTextWriter htmlw = new HtmlTextWriter(swr);
base.Render(htmlw);
htmlw.Flush();
htmlw.Close();
string strLL = System.Text.Encoding.UTF8.GetString(ms.ToArray());
Response.Write(strLL);
Response.Redirect(Request.Url.AbsoluteUri.Replace("aspx","htm"), true);
}
}
然后在需要生成静态页面的™åµé¢ä¸­ç‘ô承就可以äº?
18ã€?反向˜qžæŽ¥:google非常重视反向˜qžæŽ¥, 可以通过以下方式来增加反向连æŽ?

A: 友情˜qžæŽ¥, 最好找PR高的, 而且被SE收录很多™åµé¢, 排名靠前的连æŽ? 千万不要和看èµäh¥PR很高, 但一眼就看出来是作弊的网站连æŽ? 也不要和PR状态栏是灰色的˜qžæŽ¥, ˜q™æ ·çš„网站有可能是没有被收录, 也有可能是被惩罚äº? 另外, ˜qžæŽ¥çš„æ—¶å€™ä¹Ÿä¸ä¸€å®šéžè¦è¿žæŽ¥ä½ çš„首™å? 也可以多˜qžæŽ¥äº›ä½ çš„其他重要的™åµé¢, 比如¾|‘站的站点地囄¡­‰™åµé¢, 首页外部˜qžæŽ¥ä¸è¦å¤ªå¤š,不超˜q?0ä¸? 20个以内最å¥?
  B: 登陆¾|‘址ç«? 象dmoz, yahoo½{‰ç›®å½•要使出‹¹‘èín解数来登é™? 但不要隔两天ž®Þq™»é™†ä¸€‹Æ? 其他的网址站登陆越多越å¥? 至于如果扄¡½‘址ç«? 你可以看看你的竞争对手在google里的反向˜qžæŽ¥, 在google输入 “link:www.****.comâ€? ž®±å¯ä»¥çœ‹åˆ°å¯¹æ–¹ç½‘站的反向˜qžæŽ¥, 你可以挨个进入搜索的¾l“æžœ, 在每个页面里也申请你的连æŽ? 可以方便的找到很多连接网址ç«?
  C: 留言板留­a€: ¾cÖM¼¼¾|‘址站登é™? 但写法一定要¿U‘å­¦, 否则ž®±æ²¡æœ‰æ„ä¹‰äº†, 一般我是这样写çš?
  <a href=http://â€?>¾|‘ç«™å?lt;/a>
  ¾|‘ç«™å?
  ¾|‘ç«™å?http://.... 甌™¯·å’Œè´µç«™å‹æƒ…连æŽ?
  D: Blog博客
  现在博客也在中国兴è“väº? 完全可以充分利用一ä¸? 可以注册一个帐å?来宣传你的网ç«? 也可以直接发表评è®? 评论内容基本和留­a€æ¿çš„æ ¼å¼ä¸€æ ?
  E: 论坛宣传
  ˜q™ä¸ªæˆ‘就不多说了, 反正不要让äh一看就是广告就行了

19ã€?内部˜qžæŽ¥
  很多人只看重外部˜qžæŽ¥, 岂不知道内部˜qžæŽ¥ä¹Ÿç›¸å½“重è¦? 我的基本思èµ\æ˜? 所有页面都包含主页和其他重要页面的˜qžæŽ¥, 和本™å늛¸å…³çš„™åµé¢ä¹ŸåŠ ä¸Šè¿žæŽ? 最¾lˆè®©ä½ æ‰€æœ‰çš„™åµé¢éƒ½èƒ½å¤Ÿäº’˜q?

20�域名和文件名
  SE看重域名和页面文件名, 但多情况ä¸? 域名已经不想改了, 只好修改文äšg名了, ž®½é‡è®©ä½ çš„æ–‡ä»¶ååŒ…含™åµé¢å…³é”®å­—的英文名称

21ã€?不要用作弊的手段来欺骗SE, 即ä‹É成功一æ—? 也不会成功永ä¹? 到时候肯定会被惩¾|? 所谓善恶到头终有报, 只挣来早与来˜q?况且, 合法优化¾|‘站也完全可以达到这个效æž?

22ã€?¾|‘站速度的媄响,¾|‘站速度对SE的排名也很有影响, 讉K—®é€Ÿåº¦æ…? 会让SE爬行你页面的时候失去耐æ€? 从而减ž®‘ä½ ™åµé¢çš„信息量, 让你的排名靠å? 如果你的服务器非常慢, ž®±åº”该考虑重新换应该快点的服务器了

23ã€?¾lå¸¸æ›´æ–°ä½ çš„重要™åµé¢, 哪怕只是更换应该图片也å¥? ˜q™æ ·ä¼šè®©SE了解åˆîC½ çš„网站更新很å¿? 有生命力, 对你的重视程度会增加, 排名当然也会提高çš? 我网站基æœ?天google更新一

24ã€?用Blogger.com做一个甚臛_‡ ä¸ªä¸ªäººåšå®¢ï¼Œåšå®¢ä¸­é¦–™åµå‡ ½‹‡æ–‡ç« ä¸­å«æœ‰æœä¿¾|‘的链接。将˜q™ä¸ªåšå®¢çš„RSS提交到Yahoo和各个rssç™Õd½•站点åQŒå› ä¸ºrss会每天搜索你的网站,一旦rss被别的网站引用,ž®Þq­‰äºŽåˆ«äººå…è´¹çš„间接的加入了你的搜保的网站,而你æ ÒŽœ¬ä¸éœ€è¦äº¤æ¢é“¾æŽ¥ï¼Œ˜q™ç§é“¾æŽ¥æ¯”交换链接更有效

可以从以下网站中ç™Õd½•

http://www.feedss.com/

http://www.okrss.com/search.html

http://www.rss-cn.com/

http://rss.blogbeta.com/

http://www.92rss.com/cn/

http://www.bloghome.cn/posts/506

http://www.sorss.com/rss.htm

http://bbs.5ixb.com/thread.php?fid=49

http://www.rssfav.com/baimin/rss.htm

http://www.jingzhengli.cn/baogao/f20060613.htm

http://www.700net.com/article.asp?id=112

http://blog.caihongxu.com/index.php/archives/70-OEAEBlogRSSyCo.html

http://www.rsschina.com.cn/



25ã€?在大型的汽èžR¾|‘站上要求买一个广告位åQŒä¹°ä¹‹å‰å…ˆçœ‹çœ‹PRå€û|¼Œ˜q™ç§åœ°æ–¹å¾€å¾€PRåœ?ã€?左右çš?000åˆ?000元以下就可以搞定åQˆçœ‹ä½ çš„囄¡‰‡å¤§å°åQ‰ï¼Œæœ‰çš„甚至100åˆ?00元就可以搞定。在˜q™ç§PR4以上的网站上攑ֹ¿å‘?个月以上åQŒä½ çš„网站至ž®‘会有PRä¸?。这时候äh‹¹è‡ªç„¶å°±ä¼šæ»šæ»šæ¥ã€?

26ã€?我用的最多的˜q˜æœ‰ä¸€ä¸ªæ–¹æ³•是写文章。比如我要做汽èžR保险åQŒæˆ‘会找到排名靠前的人气¾|‘ç«™åQŒæˆ–者个人网站,我不会说要交换链接,我会说我有一½‹‡æˆ‘自己写的专业文章åQŒå’Œä½ çš„¾|‘页内容很相养I¼Œæˆ‘愿意免è´ÒŽ”¾åœ¨ä½ çš„网站上åQŒä½ åªéœ€è¦å…è®¸æˆ‘的文章中保留我的出处ž®Þp¡ŒåQŒè€Œè¿™ä¸ªå‡ºå¤„就是我的真正要赚钱的商业网站链接,˜q™ä¸ªæ–ÒŽ³•如果你的文章真的写的很好åQŒæœ‰ä¸‰åˆ†ä¹‹ä¸€çš„站长会同意。而这些网站都是我研究˜q‡PR很高åQŒæˆ–者äh气很旺的¾|‘ç«™åQŒæ‰€ä»¥åœ¨˜q™äº›¾|‘站上一旦发表了你的文章åQŒä½ çš„网站PR自然会提高,而且人气会上来,˜q™ä¸ªæ–‡ç« ä¸€å®šè¦åŽŸåˆ›òq¶ä¸”题材吸引人。我的经验是吸引人的题材90åQ…都是“我是如何解å†?.....?"之类的文章Â?br />

]]>
你练åˆîC»€ä¹ˆç¨‹åº¦äº†åQˆJ2EEåQ?/title><link>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67830.html</link><dc:creator>è¡?/dc:creator><author>è¡?/author><pubDate>Tue, 05 Sep 2006 08:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67830.html</guid><wfw:comment>http://www.aygfsteel.com/oaixgnaw/comments/67830.html</wfw:comment><comments>http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/oaixgnaw/comments/commentRss/67830.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/oaixgnaw/services/trackbacks/67830.html</trackback:ping><description><![CDATA[¾lå¸¸ä¼šè·Ÿä¸€äº›æœ‹å‹è®¨è®ºæ€Žä¹ˆæ äh‰èƒ½å­¦å¥½Java,学到什么程度才½Ž—撑握了Java的问题。其中有一个J2EE½E‹åºå‘˜å±‚‹Æ¡åŠæ­¦åŠŸä¿®äØ“çš„é—®é¢˜ï¼Œæœ‰ç‚¹æ„æ€ã€‚è¿™é‡Œå°±æŠŠè®¨è®ºçš„å†…å®¹å¤§è‡´æ•´ç†ä¸€ä¸‹å‘å‡ºæ¥åQŒå¤§å®¶ç‘ô¾l­è®¨è®ºã€? <p> </p><p>  ¾Uµè§‚国内的èÊY件行业,靠Java吃饭的程序员˜q˜çœŸä¸æ˜¯ž®‘,而且Java½E‹åºå‘˜æ˜¯æœ‰å¾ˆå¤§ä¼˜­‘Šæ„Ÿçš„,毕竟对于很多用b/s搞开发的业内朋友来说åQŒJava技术意味着隑ֺ¦å¤§ã€é—¨æ§›é«˜åQŒå› æ­¤ç›¸å¯ÒŽ¥è¯´Java½E‹åºå‘˜æ¯”其它的程序员(如phpã€?net)收入高就理所当然。然而J2EE所涉及到的范畴是很òq¿çš„åQŒä¸èƒ½ä¸€ä¸ªJava½E‹åºå‘˜å°±æ¦‚括了事åQŒè€Œåº”该具有层‹Æ¡åŠæ°´åã^之分åQŒå¾ˆå¤šæ—¶å€™ç»å¸”Rœ€è¦è¿›è¡Œåˆ†¾cÀLˆ–评çñ”åQŒæœ‰æ—¶ä»–评、有时自评ã€?/p><p>  谈到国内J2EE领域的程序员层次水åã^åQŒå½“前流行的¿U°è°“及评¾U§ä¸å¤–乎ž®×ƒ¸‹é¢å‡ ¿Uï¼š</p><p>  ½W¬ä¸€¿Uæ˜¯¾_ùN€šæŽŒæ¡è®°äº‹æœ¬ã€Dreamweaver½{‰å·¥å…äh¥å†™JSP+JavaBean数据库应用的是J2EE½E‹åºå‘˜ï¼›<br />  ½W¬äºŒ¿Uæ˜¯ç”¨JBuilder、Eclipse½{‰ä¸“用Java开发工具写着一堆一堆过½E‹å¼Java BeanåQŒè€Œä¸”˜q˜èƒ½¾_ùN€šStruts+Spring+Hibernate½{‰åº”用框架的高çñ”J2EE½E‹åºå‘˜ï¼›<br />  ½W¬ä¸‰¿Uæ˜¯ç”¨Together建模åQŒç„¶åŽç”Ÿæˆä¸€å †Java接口或代码,开口闭口都是设计模式的资深Java½E‹åºåŒåŠé«˜çñ”¾pȝ»Ÿåˆ†æžã€æž„架师åQ?br />  最后还有一¿Uæ˜¯æ•´å¤©åœ¨BlogJava或JavaEye上谈¾lè®ºé“的大师们,˜q™äº›å¤§å¸ˆæŠ€æœ¯æ°´òq³éš¾ä»¥è§¦æ‘¸ï¼Œæ­¦åŠŸé—¨æ´¾ä¹Ÿå„å…ïL‰¹è‰ÔŒ¼Œä¸å¥½å½’ç±»åQŒæœ‰æ—¶ä¸å¥½ç§°ä¸ºç¨‹åºå‘˜åQˆå› ä¸ºæœ‰çš„æ—¶å€™ä»–们甚至不写或者写不出½E‹åºåQ‰ï¼Œä½†åˆåšç€ä¸ŽJ2EE½E‹åºå‘˜å¯†åˆ‡ç›¸å…³çš„事情åQŒæˆ‘ä»¬æš‚ä¸”å°±å½’äØ“â€œç‰›ç‰›â€æˆ–â€œå¤§å¸ˆâ€ã€?/p><p>  ¿U°è°“毕竟只是¿U°è°“åQŒå¸¦æœ‰ç‚¹ä¸»è§‚或者功利色彩,有时很难鉴定一个äh应该属于什么,因此åQŒæˆ‘们再从纯技术的角度åQŒä¹ŸåÏx­¦åŠŸä¿®ä¸ºçš„è§’åº¦åQŒä½œäº†ä¸€ä¸ªç®€å•的分析及归¾c»ï¼ŒæŠ?EE领域½E‹åºå‘˜å¤§è‡´åˆ†æˆä»¥ä¸‹å‡ ä¸ªå±‚‹Æ¡ï¼Œå¯ä»¥ä½œäؓ大家自评的一个参考标准:</p><p>  ½W¬ä¸€ä¸ªå±‚‹Æ¡ï¼š¾_ùN€šæŽŒæ¡Java语法、能调试基本的程序错误,¾_ùN€šæŽŒæ¡JSP+Java Bean写一些Nòq´å‰ASP、PHP¾˜È‰ˆçš„Java Web应用½E‹åºåQˆå¦‚论坛、网站新é—Õd‘布系¾lŸã€OA、网上商城等åQ‰ï¼Œ¾_ùN€šJDBC使用、精通SQL语句、精通XML½{‰ã€?/p><p>  ½W¬äºŒä¸ªå±‚‹Æ¡ï¼šæŽŒæ¡è®¾è®¡æ¨¡å¼åŽŸç†åŠåº”ç”¨ï¼ŒæŽŒæ¡åŸÞZºŽOO的分析及设计æ–ÒŽ³•,òq¶èƒ½¾_ùN€šç†Ÿ¾lƒä‹É用几¿UJavaä¸“ä¸šè®¾è®¡åŠå¼€å‘å·¥å…øP¼Œ¾_ùN€šæŽŒæ¡æµè¡Œçš„J2EE框架如Hibernate、EJB、Webwork、Spring的原理及应用åQŒç²¾é€šJ2EE中一两个¾l„成部分(如Servlet、EJB½{?的工作原理及¾l†èŠ‚ã€?/p><p>  ½W¬ä¸‰ä¸ªå±‚‹Æ¡ï¼šž®‘林的高僧有两种åQŒç¦…僧及武僧。J2EE½E‹åºå‘˜çš„½W¬ä¸‰ä¸ªå±‚‹Æ¡ä¹ŸåŒæ ·æœ‰ç¦…、武两个分支åQŒè¿™é‡Œæˆ‘们重点分析一下:</p><p>  ½W¬ä¸€ä¸ªåˆ†æ”¯å±žäºŽèµ°çš„禅僧线路。在¾lƒå®Œ½W¬äºŒä¸ªå±‚‹Æ¡ä¸­çš„各¿Uæ­¦åŠŸåŸº¼‹€ä¸Šï¼Œ¾l“合实际™å¹ç›®ä¸­çš„åƒå¥‡ç™¾æ€ªçš„ç”¨æˆ·éœ€æ±‚ï¼Œæ¸¸åˆƒæœ‰ä½™çš„é€‰æ‹©é€‚åˆçš„æŠ€æœ¯æ–¹æ¡ˆäØ“å®¢æˆ·è§£å†³é—®é¢˜åQŒåƈ形成自己的一套解å†Ïx–¹æ¡ˆã€‚达到这一个层‹Æ¡çš„J2EE½E‹åºå‘˜å·²¾lä¸åœ¨ä¹Žä½¿ç”¨ä»ÖM½•工具、ä“Q何框架了åQŒè€Œæ˜¯æ ÒŽ®ä¸åŒçš„对手,使用不同的武器或招式来应寏V€‚å¥½æ¯”å°æŽé£žåˆ€ä¸€æ øP¼Œåªæœ‰è¾‘Öˆ°äº†â€œæ‰‹ä¸­æ— åˆ€ã€å¿ƒä¸­æœ‰åˆ€â€çš„境界åQŒæ‰èƒ½è¾¾åˆ°â€œå‡ºæ‰‹ä¸€åˆ€åQŒä¾‹ä¸è™šå‘”的效果。这一层次的武功属于一个熟¾lƒåº¦é—®é¢˜åQŒåˆ€¾lƒå¾—多了、遇到的å¯Òމ‹å¤šäº†åQŒå†åŠ ä¸Šå‰é¢çš„æ­¦åŠŸä¿®ä¸ºï¼Œž®Þq®—做不åˆîC¾‹ä¸è™šå‘,也可辑ֈ°åå‘九中ã€?/p><p>  ½W¬äºŒä¸ªåˆ†æ”¯å±žäºŽèµ°çš„æ­¦åƒ§çº¿è·¯ï¼Œåœ¨æ’‘握熟悉第一二个层次中涉及到的内容后åQŒè¿›ä¸€æ­¥ä¸“ç ”åÆˆæ’‘æ¡J2EE底层开发,J2EE规范制订、规范实现、Java虚拟机的工作原理、各¿Uå¸¸è§çš„J2EE服务器内核工作机制、内存管理、进½E‹æœºåˆ¶ã€æºä»£ç ½{‰ã€‚因为涉及的很多东西都比较抽象,代码也很多,¾lƒè¿™ä¸€å±‚çš„æ­¦åŠŸéœ€è¦æœ‰å¾ˆå¥½çš„èµ„è´¨åŠè€æ€§ã€åÆˆå…¯‚¿˜å¾—有一定的环境及条件。好比神雕大侠杨˜q‡æ‹¿èµ·â€œçŽ„é“å‰‘â€ï¼Œòq¶ç»ƒæˆâ€œæš—焉™”€™ì‚掌”的成长˜q‡ç¨‹åQŒéœ€è¦å‰é¢çš„æ­¦åŠŸä¿®äØ“ä½œåŸº¼‹€åQŒæ›´éœ€é‚£åªå¨åŠ›¼œžæ­¦¼œžé›•çš„å¸®åŠ©æŒ‡ç‚¹åŠä»–å¤„å¤„äØ“æ°‘ã€æƒ©å¥”R™¤æ¶çš„侠之心态ã€?br />  <br />  胡侃了这么多åQŒçŽ°åœ¨æ¥æ ÒŽ®è‡ªå·±æƒ…况‹¹‹ç®—一下自å·Þqš„份量åQŒç»“果如下:</p><p>  ½W¬ä¸€å±‚ ¾lƒåˆ°8成;<br />  ½W¬äºŒå±‚ ¾lƒåˆ°5成;<br />  ½W¬ä¸‰å±‚ 准备走禅僧线路,当前½Ž—是¾lƒåˆ°1成;<br />  <br />  唉,后面的武功提升越来越难,真不知道要到何年何月才能辑ֈ°10成啊。你的武功练到哪一个层‹Æ¡äº†åQŒä¸é˜²äº®å‡ºæ¥å¤§å®¶åˆ‡ç£‹åˆ‡ç£‹ã€‚嘿嘿,要是有一天,å’׃»¬ä¸­å›½çš„Java½E‹åºå‘˜äh手一把“玄铁剑”、ähäºÞZ¼šä½Žì€œæš—焉™”€™ì‚掌”,那还了得åQæ±—...åQŒå†™ç€å†™ç€å±…然做è“v白日梦了åQŒä¸å¥½æ„æ€ï¼Œž®±æ­¤æ‰“住ã€?/p><img src ="http://www.aygfsteel.com/oaixgnaw/aggbug/67830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/oaixgnaw/" target="_blank">è¡?/a> 2006-09-05 16:13 <a href="http://www.aygfsteel.com/oaixgnaw/archive/2006/09/05/67830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ºÓÎ÷Çø</a>| <a href="http://" target="_blank">¼¦¶«ÏØ</a>| <a href="http://" target="_blank">ÇåÐÂÏØ</a>| <a href="http://" target="_blank">ÁéÉ½ÏØ</a>| <a href="http://" target="_blank">µÂ°²ÏØ</a>| <a href="http://" target="_blank">ººÖÐÊÐ</a>| <a href="http://" target="_blank">°²ÒåÏØ</a>| <a href="http://" target="_blank">·áË³ÏØ</a>| <a href="http://" target="_blank">²ßÀÕÏØ</a>| <a href="http://" target="_blank">ÃÉÒõÏØ</a>| <a href="http://" target="_blank">ÐËÒµÏØ</a>| <a href="http://" target="_blank">íã¿ÚÏØ</a>| <a href="http://" target="_blank">°Í¶«ÏØ</a>| <a href="http://" target="_blank">¶¨±ßÏØ</a>| <a href="http://" target="_blank">ÕÂÇðÊÐ</a>| <a href="http://" target="_blank">×Ͳ©ÊÐ</a>| <a href="http://" target="_blank">ÑïÖÐÊÐ</a>| <a href="http://" target="_blank">½­ÒõÊÐ</a>| <a href="http://" target="_blank">´óͬÊÐ</a>| <a href="http://" target="_blank">ÃçÀõÊÐ</a>| <a href="http://" target="_blank">¶ëɽ</a>| <a href="http://" target="_blank">Ì«±£ÊÐ</a>| <a href="http://" target="_blank">»ªÒõÊÐ</a>| <a href="http://" target="_blank">»ÔÏØÊÐ</a>| <a href="http://" target="_blank">»·½­</a>| <a href="http://" target="_blank">áªÉ½ÏØ</a>| <a href="http://" target="_blank">·ÊÎ÷ÏØ</a>| <a href="http://" target="_blank">äü¹ØÏØ</a>| <a href="http://" target="_blank">̨±±ÊÐ</a>| <a href="http://" target="_blank">Õ´»¯ÏØ</a>| <a href="http://" target="_blank">äàÑôÊÐ</a>| <a href="http://" target="_blank">Ã×Ò×ÏØ</a>| <a href="http://" target="_blank">ƽ¶¨ÏØ</a>| <a href="http://" target="_blank">äê´¨ÏØ</a>| <a href="http://" target="_blank">¶¨ÏåÏØ</a>| <a href="http://" target="_blank">ÃñÈ¨ÏØ</a>| <a href="http://" target="_blank">ÆÖÏØ</a>| <a href="http://" target="_blank">ÐĮ̈ÊÐ</a>| <a href="http://" target="_blank">ÎôÑôÏØ</a>| <a href="http://" target="_blank">ÈýºÓÊÐ</a>| <a href="http://" target="_blank">ÔÆÃÎÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>