﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-谁说你不行了？</title><link>http://www.blogjava.net/oaixgnaw/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 09:40:30 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 09:40:30 GMT</pubDate><ttl>60</ttl><item><title>开发人员行走Unix的随身四艺 </title><link>http://www.blogjava.net/oaixgnaw/archive/2007/01/29/96627.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Mon, 29 Jan 2007 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2007/01/29/96627.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/96627.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/29/96627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/96627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/96627.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="">
						<img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /> 开发人员行走Unix的随身四艺</a>
		</div>
		<div class="postText">
				<p>   作者：<a href="http://blog.csdn.net/calvinxiu">江南白衣</a>，原文出处： <a href="http://blog.csdn.net/calvinxiu/archive/2007/01/27/1495778.aspx">http://blog.csdn.net/calvinxiu/archive/2007/01/27/1495778.aspx</a>，转载请保留出处。</p>
				<p>    Unix系统永远只会越来越多，开发人员就没必要特意学习它们的安装、配置和管理了，就全部交给集成人员吧。<br />    但开发人员行走于Unix之间，依然有四样东西要熟练。</p>
				<h2>    一、VI</h2>
				<p>    虽然Unix上的文本编辑器已经越来越好用，但不在Console前面，网速也不够连XWindows的时候，还是要依赖VI。<br />    回想VI的时代背景，发现VI对开发人员已经周到得离谱了，热键多到你双手不离键盘就能完成大半编辑工作。<br />    建议自己制作一张自己认为有用，但又经常忘记的命令的sheet，拿出考试的力气把它背熟。</p>
				<h2>    二、文本处理</h2>
				<p>       开发人员在Unix下干得最多的除了Make和除Bug外，大概就是处理日志文件、业务文件进行查错和统计了。<br />     只会more和grep是不够的，开发老手会把awk,sed,grep,sort,uniq,wc,head,tail这些文本处理命令，通过管道玩具式的拆卸拼装，最后完成一件原本以为非编写大段代码不可的工作。周到的参数设定，让人再一次感叹那个简单的年代，这样复杂到极致的设计.......怪不得《Unix 编程艺术》的作者有那么骄傲的自觉。</p>
				<p>     比如车东的每月访问TOP10 统计脚本：</p>
				<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
						<div>
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
								<span style="COLOR: #000000">awk -F '</span>
								<span style="COLOR: #000000">
								</span>
								<span style="COLOR: #000000">t' '{</span>
								<span style="COLOR: #0000ff">print</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">$</span>
								<span style="COLOR: #000000">4</span>
								<span style="COLOR: #000000">}' 2004_2</span>
								<span style="COLOR: #000000">.</span>
								<span style="COLOR: #000000">txt| grep chedong</span>
								<span style="COLOR: #000000">.</span>
								<span style="COLOR: #000000">com</span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">tech</span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">|</span>
								<span style="COLOR: #000000">uniq -c|</span>
								<span style="COLOR: #0000ff">sort</span>
								<span style="COLOR: #000000"> -rn|head -</span>
								<span style="COLOR: #000000">10</span>
								<span style="COLOR: #000000"> </span>
						</div>
				</div>
				<ul>
						<li>awk -F '\t' 将2004_2.txt访问纪录文件，用TAB分割，打印第4列 
</li>
						<li>grep chedong.com/tech 只列出chedong.com/tech笔记目录下的文档 
</li>
						<li>uniq -c 汇总计数 
</li>
						<li>sort -rn 按数值排序 
</li>
						<li>head -10 TOP 10<br /></li>
				</ul>
				<h2>    三、Bash Shell 编程</h2>
				<p>    编程是开发人员的天赋本能，不论什么语言，看看参考手册应该就能上手。</p>
				<p>    见<a href="http://xiaowang.net/bgb-cn/index.html">Bash新手指南中文版</a>，一份写给新手看的包含很多老手知识的指南。</p>
				<h2>    四、Make与AutoMake</h2>
				<p>    用过Java的Ant后，想起Make就觉得很烦，很厌倦。总归还是会的，见<a href="http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/">GNU Make 3.8.0 中文手册</a>     </p>
				<p>     不过即使make已经精通到变态，每个人写出来的MakeFile还是千奇百怪，再看看开源项目们个个都是automake+autoconf了，我们自己也长进一点吧。手工编写MakeFile.am，让auotomake变成MakeFile.in，再让用户./configure 生成最终的MakeFile。<br />    <br />    生成的MakeFile既能跨越平台，又是标准的写法，最重要的是，编写MakeFile.am的工作量比MakeFile少多了，只要简单的定义目标文件，先要处理的子目录，需要的源文件，头文件与库文件就可以了。如果看完下面两篇还是不懂，直接看ACE里的Makefile.am就懂了。</p>
				<p>    入门文章：<a href="http://www.ccw.com.cn/htm/app/linux/develop/01_7_25_7.asp">使用AutoMake轻松生成Makefile</a> <br />    进阶文章：<a href="javascript:void(0);/*1169901219468*/">IBM DW:</a><a href="javascript:void(0);/*1169901219468*/">例</a><a href="javascript:void(0);/*1169901219468*/">解 autoconf 和 automake 生成 Makefile 文件</a><br />    完整的免费电子书： <a href="http://sources.redhat.com/autobook/download.html">GNU Autoconf, Automake and Libtool</a></p>
				<p>    另外，ACE里还贡献了一个更厉害的<a href="http://www.ociweb.com/products/mpc">MPC(Makefile, Project, and Workspace Creator )</a>，  自动的生成了MakeFile.am或者VC的项目文件。<br /><br /></p>
				<h2>    附录A：我的VI易忘命令手册</h2>
				<p>
						<strong>    上下左右：</strong>
						<br />    ctrl+u/d 上下半屏，ctrl+f/b,上下一屏<br />    H/G屏幕头/文章末 ，0/$ 行首行末<br />    <br /><strong>    增删改：</strong><br />    yy/dd 复制/删除 一行，p/P：将yy/dd的内容paste出来<br />    I/A 在行首/末添加， o/O 开新行，d0/d$ 删除到行首，行末<br />    u:undo</p>
				<p>    <strong>查：</strong><br />    ? 向前查找， n/N 重复上一次查找</p>
				<h2>附录B: 文本处理命令小结</h2>
				<p>   <strong>awk：</strong>处理结构化的文本(每行以固定符号分成若干列)，提取打印某些字段，如：<br />    ls -l|awk '{print $1}'  --将ls-l结果的第一列打印出来<br />    awk -F":" '{print $1"  "$6}' /etc/passwd ，将以:分割的/etc/passwd文件的第1，6列打印出来，中间以空格分开<br />    详见<a href="javascript:void(0);/*1169985856171*/">IBM DW中国的AWK实例</a>(共3篇) 或 <a href="http://xiaowang.net/bgb-cn/ch06.html">Bash新手指南中文版第6章</a>。</p>
				<p>    <strong>grep：</strong>过滤，大家用得最多的命令，支持正则表达式。参数有：<br />    -i忽略大小写，-n显示line number，-c 统计在每个文件的出现次数，-l只显示符合的文件的名字。</p>
				<p>    <strong>sed：</strong>流编辑器，主要用于替换，如：<br />    sed -e '1,10s/foo/bar/g' myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换 <br />    支持正则的替换字符串，可以只替换某个范围内的内容。<br />    用法不算简单,详见<a href="http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html">IBM DW中国的Sed实例</a>(共3篇)或 <a href="http://xiaowang.net/bgb-cn/ch05.html">Bash新手指南中文版第5章</a>。<br />    <br />    <strong>sort：</strong>排序，参数有：<br />    -r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写<br />    同样支持结构化文件，如<br />    sort -t : -k 1,1 /etc/passwd，以: 分割,只按第1列排序<br />    sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ，以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。</p>
				<p>    <strong>uniq：</strong>去除重复行。<br />    除了正常用法外，还有-c统计重复次数，和-u （唯一）和 -d （重复）两个参数,只显示唯一的和重复的行。</p>
				<p>    <strong>wc：</strong> 统计。<br />    -l 行,-m 字符,-w 单词</p>
				<p>PS:以下文字不算字数 <br />     一个多月没有更新博客了，因为公司里调了新部门，很多东西要学习。太久没试过华丽的在上班时间，在工作中，在同事们身上学到这么多东西了，很是开心。<br />     下周开始爆发更新。</p>
		</div>
<img src ="http://www.blogjava.net/oaixgnaw/aggbug/96627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-29 23:14 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/29/96627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java环境设置、HelloWorld例子、Ant环境及运行 </title><link>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94402.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Wed, 17 Jan 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94402.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/94402.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/94402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/94402.html</trackback:ping><description><![CDATA[
		<p>一段时间不用Java，经常忘记一些烦琐的设置，特意写此文档备案。<br /><br />-------------<br />java环境设置<br />-------------</p>
		<p>在环境变量中设置以下三个变量：<br />JAVA_HOME=C:\j2sdk1.4.1 //可以改为相应的目录<br />CLASSPATH=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar<br />PATH=%JAVA_HOME%\bin;%PATH%</p>
		<p>然后在命令行输入java -version命令，如果出现<br />java version "1.4.1"<br />Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)<br />Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)<br />则说明已经配置成功！</p>
		<p>HelloWorld.java源程序如下：<br />public class HelloWorld{ <br /> public static void main(String[] args) {  <br />  System.out.println("Hello World!"); <br />  }<br />}</p>
		<p>在命令行执行javac HelloWorld.java<br />如果没有输出任何信息则说明编译成功。</p>
		<p>在命令行运行java HelloWorld，输出：<br />Hello World!<br />代表成功执行了java程序。</p>
		<p>-----------------<br />初学者常犯的错误<br />-----------------</p>
		<p>1. 运行时，带了.class后缀<br />如果你试图使用如下命令：<br />E:\java\src&gt;java HelloWorld.class<br />系统会误认为你运行的是HelloWorld包下的名为class的类文件，会到系统的CLASSPATH下（一般都包括当前目录）企图寻找HelloWorld.class.class这样的类，这样的类当然不存在了；并且也不可能存在，因为class是关键字，不能作为一个类的名字。所以会报如下错误信息：<br />Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class</p>
		<p>2. 文件名大小写错误<br />对于像Windows这样的系统，编译时可以不关心大小写。比如编译HelloWorld.java时，也可以使用：<br />E:\java\src&gt;javac helloworld.java<br />也可以编译通过，但产生的类文件仍然是和源文件相符的：HelloWorld.class。<br />但在运行时一定要注意大小写，比如试图使用如下命令运行：<br />E:\java\src&gt;java helloworld<br />将报类似于1中的错误：<br />Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)</p>
		<p>
				<br />----------------------------<br />包含包层次的HelloWorld.java<br />----------------------------</p>
		<p>比如上面的HelloWorld.java修改如下：<br />package org.javaresearch;<br />public class HelloWorld{<br />public static void main(String[] args) {<br />System.out.println("Hello World!"); <br />}<br />}</p>
		<p>编译时有两种方法</p>
		<p>1. 直接编译<br />E:\java\src&gt;javac HelloWorld.java<br />此时在当前目录下输出HelloWorld.class。此时，运行不能使用上面相同的方法，使用：<br />E:\java\src&gt;java HelloWorld<br />运行时，出现如下错误：<br />Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)<br />从上述错误信息你也可以看到，系统可以找到HelloWorld类（因为当前路径包含在CLASSPATH中，具体为什么会提示wrong name，有兴趣的朋友参见Java语言规范），但这个类属于org.javaresearch包。所以，你要做的就是按照上述包层次，相应的创建目录层次，把上面生成的HelloWorld.class放到E:\java\src\org\javaresearch\目录下。运行：<br />E:\java\src &gt;java org.javaresearch.HelloWorld<br />系统打印出：<br />Hello World!<br />这儿要注意的是，不能使用java org\javaresearch\HelloWorld来运行，此时同样会出现如下错误：<br />Exception in thread "main" java.lang.NoClassDefFoundError:org\javaresearch\HelloWorld (wrong name: org/javaresearch/HelloWorld)</p>
		<p>2. 使用 -d &lt;directory&gt;编译选项<br />是不是觉得上面的编译方法有点麻烦，能不能自动在当前路径（或任意指定的路径）下生成包层次呢？有！使用-d &lt;directory&gt;编译选项就能做到。<br />E:\java\src &gt;javac -d . HelloWorld.java<br />此时，在当前目录下就生成了一个org\javaresearch目录，并且输出的.class文件也在里面。运行：<br />E:\java\src &gt;java org.javaresearch.HelloWorld<br />系统打印：Hello World!<br />如果你想把生成的类文件集中存放在一个目录中，比如：E:\java\classes下，那么你首先创建这个目录，然后编译时：<br />E:\java\src &gt;javac -d E:\java\classes HelloWorld.java<br />就可以把生成的类文件放到E:\java\classes目录下，并且按照包层次相应的创建目录路径。你可以在E:\java\classes\org\javaresearch下找到HelloWorld.class文件。此时使用如下命令可以正确运行（注意如果要用到其它类，请在CLASSPATH中设好）：<br />E:\java\classes &gt;java org.javaresearch.HelloWorld</p>
		<p>或者你可以在E:\java目录下面运行以下命令来执行<br />E:\java &gt;java -classpath .\classes org.javaresearch.HelloWorld<br />使用java的-classpath参数可以将一些目录加入类路径</p>
		<p>-------------------<br />打包jar文件<br />-------------------<br />可以把一个包内的所有class文件打包为一个jar文件，便于存放和运行。以上文的org.javaresearch包为例，其打包命令如下：<br />E:\java\classes &gt;jar cvf wxb.jar org<br />会生成一个wxb.jar文件，将其中META-INF\MANIFEST.MF文件中添加如下一行：<br />Main-Class: org.javaresearch.HelloWorld<br />保存jar文件。</p>
		<p>或者首先创建并编辑一个MANIFEST.MF文件，其内容如下：<br />Manifest-Version: 1.0<br />Created-By: 1.4.1 (Sun Microsystems Inc.)<br />Main-Class: org.javaresearch.HelloWorld<br />将其保存到classes目录中<br />然后将其一起打包到jar文件中，打包命令如下：<br />E:\java\classes &gt;jar cvfm wxb.jar MANIFEST.MF org</p>
		<p>-------------<br />运行jar文件<br />-------------<br />在命令行中输入如下命令即可：<br />E:\java\classes &gt;java -jar wxb.jar<br />输出为：<br />Hello World!</p>
		<p>------------------------<br />用Ant来编译运行java程序<br />------------------------<br />首先安装Ant，步骤很简单：<br />1.将Ant压缩包解压到一个目录，例如D:\Ant1.5.2；<br />2.在环境变量中添加以下变量：<br />ANT_HOME=D:\Ant1.5.2  //可以改为相应的目录<br />3.修改Path环境变量<br />PATH=%ANT_HOME%\bin;%PATH%</p>
		<p>最后给出了一个Ant的build.xml文件，运行ant即可完成所有以上的编译和运行过程，其build文件如下：<br />&lt;project name="HelloWorld" default="jar" basedir="."&gt;<br />    &lt;description&gt;<br />        building HelloWorld!<br />    &lt;/description&gt;<br />  &lt;!-- set global properties for this build --&gt;<br />  &lt;property name="src" location="src"/&gt;<br />  &lt;property name="build" location="classes"/&gt;<br />  &lt;property name="dist"  location="dist"/&gt;<br />  &lt;property name="user.name" value="Wang Xuebin"/&gt;</p>
		<p>  &lt;target name="init"&gt;<br />    &lt;!-- Create the time stamp --&gt;<br />    &lt;tstamp/&gt;<br />    &lt;!-- Create the classes directory structure used by compile --&gt;<br />    &lt;mkdir dir="${build}"/&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="build" depends="init"  description="build the source code" &gt;<br />    &lt;!-- Compile the java code from ${src} into ${build} --&gt;<br />    &lt;javac srcdir="${src}" destdir="${build}"/&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="jar" depends="build"<br />        description="generate the distribution" &gt;<br />    &lt;!-- Create the distribution directory --&gt;<br />    &lt;mkdir dir="${dist}/lib"/&gt;</p>
		<p>    &lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;<br />  &lt;jar destfile="${dist}/HelloWorld-${DSTAMP}.jar" basedir="${build}"&gt;<br />   &lt;manifest&gt;<br />    &lt;attribute name="Built-By" value="${user.name}"/&gt;<br />    &lt;attribute name="Main-Class" value="org.javaresearch.HelloWorld"/&gt;<br />   &lt;/manifest&gt;<br />  &lt;/jar&gt;  <br /> &lt;/target&gt;<br />  <br />  &lt;target name="run" depends="build" description="run HelloWorld"&gt;<br />    &lt;java classpath="${build}" classname="org.javaresearch.HelloWorld"&gt;&lt;/java&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="runjar" depends="jar" description="run HelloWorld in jar file"&gt;<br />         &lt;java jar="${dist}/HelloWorld-${DSTAMP}.jar"<br />           fork="true"<br />           failonerror="true"<br />           maxmemory="128m"<br />           &gt;<br />         &lt;arg value="-h"/&gt;<br />         &lt;classpath&gt;<br />           &lt;pathelement location="${dist}/HelloWorld-${DSTAMP}.jar"/&gt;<br />           &lt;pathelement path="${java.class.path}"/&gt;<br />         &lt;/classpath&gt;<br />       &lt;/java&gt;<br />  &lt;/target&gt;<br />  <br />  &lt;target name="clean"<br />        description="clean up" &gt;<br />    &lt;!-- Delete the ${build} and ${dist} directory trees --&gt;<br />    &lt;delete dir="${build}"/&gt;<br />    &lt;delete dir="${dist}"/&gt;<br />  &lt;/target&gt;<br />&lt;/project&gt;</p>
<img src ="http://www.blogjava.net/oaixgnaw/aggbug/94402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-17 12:56 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java jdbc数据库连接池总结! </title><link>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94401.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Wed, 17 Jan 2007 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94401.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/94401.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/94401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/94401.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/chunkyo/archive/2007/01/16/94266.html">Java jdbc数据库连接池总结!</a>
		</div>1. 引言 
<p>　　近年来，随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及，计算机</p><p>　　应用程序已从传统的桌面应用转到Web应用。基于B/S（Browser/Server）架构的3层开发模式逐渐取代C/S（Client/Server）架构的开发模式，成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期，主要使用的技术是<a href="http://web.rdxx.com/CGI/" target="_blank"><font color="#3080cb">CGI</font></a>﹑<a href="http://web.rdxx.com/ASP/" target="_blank"><font color="#3080cb">ASP</font></a>﹑<a href="http://web.rdxx.com/PHP/" target="_blank"><font color="#3080cb">PHP</font></a>等。之后，Sun公司推出了基于<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言的Servlet+Jsp+JavaBean技术。相比传统的开发技术，它具有跨平台﹑<a href="http://net.rdxx.com/Safe/SafeTech/" target="_blank"><font color="#3080cb">安全</font></a>﹑有效﹑可移植等特性，这使其更便于使用和开发。</p><p>　　Java应用程序访问<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>的基本原理</p><p>　　在Java语言中，JDBC（Java DataBase Connection）是应用程序与数据库沟通的桥梁,</p><p>　　即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案，它为数据库应用开发人员﹑数据库前台工具开发人员提供了一种标准的应用程序<a href="http://soft.rdxx.com/Design/" target="_blank"><font color="#3080cb">设计</font></a>接口，使开发人员可以用纯Java语言编写完整的数据库应用程序。JDBC提供两种API，分别是面向开发人员的API和面向底层的JDBC驱动程序API，底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实现与数据库的连接。</p><p>　　一般来说，Java应用程序访问数据库的过程（如图1所示）是：</p><p>　　①装载数据库驱动程序；</p><p>　　②通过JDBC建立数据库连接；</p><p>　　③访问数据库，执行SQL语句；</p><p>　　④断开数据库连接。</p><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281387862.gif" border="0" /><br />图1 Java数据库访问机制</div><div align="left">　　JDBC作为一种数据库访问技术，具有简单易用的优点。但使用这种模式进行Web应用</div><div align="left">　　程序开发，存在很多问题：首先，每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动，每次都得花费0.05s～1s的时间，而且系统还要分配内存资源。这个时间对于一次或几次数据库操作，或许感觉不出系统有多大的开销。可是对于现在的Web应用，尤其是大型电子商务<a href="http://mg.rdxx.com/" target="_blank"><font color="#3080cb">网站</font></a>，同时有几百人甚至几千人在线是很正常的事。在这种情况下，频繁的进行数据库连接操作势必占用很多的系统资源，网站的响应速度必定下降，严重的甚至会造成服务器的崩溃。不是危言耸听，这就是制约某些电子商务网站发展的技术瓶颈问题。其次，对于每一次数据库连接，使用完后都得断开。否则，如果程序出现异常而未能关闭，将会导致数据库系统中的内存泄漏，最终将不得不重启数据库。还有，这种开发不能控制被创建的连接对象数，系统资源会被毫无顾及的分配出去，如连接过多，也可能导致内存泄漏，服务器崩溃。</div><div align="left"> </div><div align="left">　　数据库连接池（connection pool）的工作原理</div><div align="left">　　1、基本概念及原理<br />由上面的分析可以看出，问题的根源就在于对<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>连接资源的低效管理。我们知道， 
<div align="left">　　对于共享资源，有一个很著名的<a href="http://soft.rdxx.com/Design/" target="_blank"><font color="#3080cb">设计</font></a>模式：资源池（Resource Pool）。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题，可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接，当需要建立数据库连接时，只需从“缓冲池”中取出一个，使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况，为系统开发﹑测试及性能调整提供依据。连接池的基本工作原理见下图2。</div><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281311029.gif" border="0" /><br />图2 连接池的基本工作原理</div><div align="left">　　2、服务器自带的连接池</div><div align="left">　　JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制，但是必须有其第三方的专用类方法支持连接池的用法。</div><div align="left">　　连接池关键问题分析</div><div align="left">　　1、并发问题</div><div align="left">　　为了使连接管理服务具有最大的通用性，必须考虑多线程环境，即并发问题。这个问题相对比较好解决，因为<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言自身提供了对并发管理的支持，使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字，如：</div><div align="left">public synchronized Connection getConnection（） </div><div align="left">　　2、多数据库服务器和多用户</div><div align="left">　　对于大型的企业级应用，常常需要同时连接不同的数据库（如连接<a href="http://db.rdxx.com/Oracle/" target="_blank"><font color="#3080cb">Oracle</font></a>和<a href="http://db.rdxx.com/Sybase/" target="_blank"><font color="#3080cb">Sybase</font></a>）。如何连接不同的数据库呢？我们采用的策略是：设计一个符合单例模式的连接池管理类，在连接池管理类的唯一实例被创建时读取一个资源文件，其中资源文件中存放着多个数据库的url地址（&lt;poolName.url&gt;）﹑用户名（&lt;poolName.user&gt;）﹑密码（&lt;poolName.password&gt;）等信息。如tx.url=192.168.1.123:5000/tx_it，tx.user=cyl，tx.password=123456。根据资源文件提供的信息，创建多个连接池类的实例，每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字，通过不同的名字来管理不同的连接池。</div><div align="left">　　对于同一个数据库有多个用户使用不同的名称和密码访问的情况，也可以通过资源文件处理，即在资源文件中设置多个具有相同url地址，但具有不同用户名和密码的数据库连接信息。</div><div align="left">　　3、事务处理</div><div align="left">　　我们知道，事务具有原子性，此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做，要么全不做。<br />在<a href="http://dev.rdxx.com/Java/" target="_blank"><font color="#3080cb">Java</font></a>语言中，Connection类本身提供了对事务的支持，可以通过设置Connection的AutoCommit属性为false,然后显式的调用commit或rollback方法来实现。但要高效的进行Connection复用，就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现，这种方法可以大大降低事务管理的复杂性。 
<div align="left">　　4、连接池的分配与释放</div><div align="left">　　连接池的分配与释放，对系统的性能有很大的影响。合理的分配与释放，可以提高连接的复用度，从而降低建立新连接的开销，同时还可以加快用户的访问速度。</div><div align="left">　　对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时，系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长（通过容器的顺序存放实现）的那个连接分配给他（实际是先做连接是否有效的判断，如果可用就分配给用户，如不可用就把这个连接从空闲池删掉，重新检测空闲池是否还有连接）；如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数（maxConn）,如果没有达到，就新建一个连接，如果已经达到，就等待一定的时间（timeout）。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户，如果等待时间超过预定时间timeout,则返回空值（null）。系统对已经分配出去正在使用的连接只做计数，当使用完后再返还给空闲池。对于空闲连接的状态，可开辟专门的线程定时检测，这样会花费一定的系统开销，但可以保证较快的响应速度。也可采取不开辟专门线程，只是在分配前检测的方法。</div><div align="left">　　5、连接池的配置与维护</div><div align="left">　　连接池中到底应该放置多少连接，才能使系统的性能最佳？系统可采取设置最小连接数（minConn）和最大连接数（maxConn）来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多，则系统启动就慢，但创建后系统的响应速度会很快；如果创建过少，则系统启动的很快，响应起来却慢。这样，可以在开发时，设置较小的最小连接数，开发起来会快，而在系统实际使用时设置较大的，因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目，具体设置多少，要看系统的访问量，可通过反复测试，找到最佳点。</div><div align="left">　　如何确保连接池中的最小连接数呢？有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测，如果发现连接数量小于最小连接数，则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。<br />连接池的实现 
<div align="left">　　1、连接池模型</div><div align="left">　　本文讨论的连接池包括一个连接池类（DBConnectionPool）和一个连接池管理类（DBConnetionPoolManager）和一个配置文件操作类(ParseDSConfig)。连接池类是对某一<a href="http://db.rdxx.com/" target="_blank"><font color="#3080cb">数据库</font></a>所有连接的“缓冲池”，主要实现以下功能：①从连接池获取或创建可用连接；②使用完毕之后，把连接返还给连接池；③在系统关闭前，断开所有连接并释放连接占用的系统资源；④还能够处理无效连接（原来登记为可用的连接，由于某种原因不再可用，如超时，通讯问题），并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。(5)当多数据库时,且数据库是动态增加的话,将会加到配置文件中。</div><div align="left">　　连接池管理类是连接池类的外覆类（wrapper）,符合单例模式，即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理，具有以下功能：①装载并注册特定数据库的JDBC驱动程序；②根据属性文件给定的信息，创建连接池对象；③为方便管理多个连接池对象，为每一个连接池对象取一个名字，实现连接池名字与其实例之间的映射；④跟踪客户使用连接情况，以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理，如系统需要连接不同的数据库，或连接相同的数据库但由于<a href="http://net.rdxx.com/Safe/SafeTech/" target="_blank"><font color="#3080cb">安全</font></a>性问题，需要不同的用户使用不同的名称和密码。<br />         2、连接池实现(经过本人改版,可以适用多数据库类型的应用以及一种数据库类型多个数据库且数据  库的数量可以动态增加的应用程序)<br />         1),DBConnectionPool.java   数据库连接池类<br />         2),DBConnectionManager .java   数据库管理类<br />         3),DSConfigBean .java                单个数据库连接信息Bean<br />         4),ParseDSConfig.java                操作多(这个'多'包括不同的数据库和同一种数据库有多个数据库)<br />                                                            数据 配置文件xml<br />         5),ds.config.xml                           数据库配置文件xml<br />         原代码如下: <br />        DBConnectionPool.java   <br />        ----------------------------------------------------------<br />      /**<br /> * 数据库连接池类<br /> */<br />package <a href="http://www.tjyj.account.db/">com.chunkyo.db</a>;</div><div align="left">import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.SQLException;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.Timer;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionPool implements TimerListener {</div><div align="left"> private Connection con=null;<br /> private int inUsed=0;    //使用的连接数<br /> private ArrayList freeConnections = new ArrayList();//容器，空闲连接<br /> private int minConn;     //最小连接数<br /> private int maxConn;     //最大连接<br /> private String name;     //连接池名字<br /> private String password; //密码<br /> private String url;      //数据库连接地址<br /> private String driver;   //驱动<br /> private String user;     //用户名<br /> public Timer timer;      //定时<br /> /**<br />  * <br />  */<br /> public DBConnectionPool() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * 创建连接池<br />  * @param driver<br />  * @param name<br />  * @param URL<br />  * @param user<br />  * @param password<br />  * @param maxConn<br />  */<br /> public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)<br /> {<br />  this.name=name;<br />  this.driver=driver;<br />  this.url=URL;<br />  this.user=user;<br />  this.password=password;<br />  this.maxConn=maxConn;<br /> }<br /> /**<br />  * 用完，释放连接<br />  * @param con<br />  */<br /> public synchronized void freeConnection(Connection con) <br /> {<br />  this.freeConnections.add(con);//添加到空闲连接的末尾<br />  this.inUsed--;<br /> }<br /> /**<br />  * timeout  根据timeout得到连接<br />  * @param timeout<br />  * @return<br />  */<br /> public synchronized Connection getConnection(long timeout)<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()&gt;0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   if(con==null)con=getConnection(timeout); //继续获得连接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新建连接<br />  }<br />  if(this.maxConn==0||this.maxConn&lt;this.inUsed)<br />  {<br />   con=null;//达到最大连接数，暂时不能获得连接了。<br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />  }<br />  return con;<br /> }<br /> /**<br />  * <br />  * 从连接池里得到连接<br />  * @return<br />  */<br /> public synchronized Connection getConnection()<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()&gt;0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   this.freeConnections.remove(0);//如果连接分配出去了，就从空闲连接里删除<br />   if(con==null)con=getConnection(); //继续获得连接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新建连接<br />  }<br />  if(this.maxConn==0||this.maxConn&lt;this.inUsed)<br />  {<br />   con=null;//等待 超过最大连接时<br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />   System.out.println("得到　"+this.name+"　的连接，现有"+inUsed+"个连接在使用!");<br />  }<br />  return con;<br /> }<br /> /**<br />  *释放全部连接<br />  *<br />  */<br /> public synchronized void release()<br /> {<br />  Iterator allConns=this.freeConnections.iterator();<br />  while(allConns.hasNext())<br />  {<br />   Connection con=(Connection)allConns.next();<br />   try<br />   {<br />    con.close();<br />   }<br />   catch(SQLException e)<br />   {<br />    e.printStackTrace();<br />   }<br />   <br />  }<br />  this.freeConnections.clear();<br />   <br /> }<br /> /**<br />  * 创建新连接<br />  * @return<br />  */<br /> private Connection newConnection()<br /> {<br />  try {<br />   Class.forName(driver);<br />   con=DriverManager.getConnection(url, user, password);<br />  } catch (ClassNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />   System.out.println("sorry can't find db driver!");<br />  } catch (SQLException e1) {<br />   // TODO Auto-generated catch block<br />   e1.printStackTrace();<br />   System.out.println("sorry can't create Connection!");<br />  }<br />  return con;<br />  <br /> }<br /> /**<br />  * 定时处理函数<br />  */<br /> public synchronized void TimerEvent() <br /> {<br />     //暂时还没有实现以后会加上的<br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }<br /> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }<br /> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }<br /> /**<br />  * @return the maxConn<br />  */<br /> public int getMaxConn() {<br />  return maxConn;<br /> }<br /> /**<br />  * @param maxConn the maxConn to set<br />  */<br /> public void setMaxConn(int maxConn) {<br />  this.maxConn = maxConn;<br /> }<br /> /**<br />  * @return the minConn<br />  */<br /> public int getMinConn() {<br />  return minConn;<br /> }<br /> /**<br />  * @param minConn the minConn to set<br />  */<br /> public void setMinConn(int minConn) {<br />  this.minConn = minConn;<br /> }<br /> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }<br /> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }<br /> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }<br /> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }<br /> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }<br /> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }<br /> /**<br />  * @return the user<br />  */<br /> public String getUser() {<br />  return user;<br /> }<br /> /**<br />  * @param user the user to set<br />  */<br /> public void setUser(String user) {<br />  this.user = user;<br /> }</div><div align="left">}<br /><br />-------------------------------------------<br /> DBConnectionManager .java<br />------------------------------------------<br />/**<br /> * 数据库连接池管理类<br /> */<br />package <a href="http://www.tjyj.account.db/">com.chunkyo.db</a>;</div><div align="left">import java.sql.Connection;<br />import java.util.ArrayList;<br />import java.util.Enumeration;<br />import java.util.HashMap;<br />import java.util.Hashtable;<br />import java.util.Iterator;<br />import java.util.Properties;<br />import java.util.Vector;</div><div align="left">import <a href="http://www.tjyj.account.db.parsedsconfig/">com.chunkyo.db.ParseDSConfig</a>;<br />import <a href="http://www.tjyj.account.db.dsconfigbean/">com.chunkyo.db.DSConfigBean</a>;<br />import <a href="http://www.tjyj.account.db.dbconnectionpool/">com.chunkyo.db.DBConnectionPool</a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionManager {</div><div align="left"> static private DBConnectionManager instance;//唯一数据库连接池管理实例类<br /> static private int clients;                 //客户连接数<br /> private Vector drivers  = new Vector();//驱动信息<br /> private Hashtable pools=new Hashtable();//连接池<br /> <br /> /**<br />  * 实例化管理类<br />  */<br /> public DBConnectionManager() {<br />  // TODO Auto-generated constructor stub<br />  this.init();<br /> }<br /> /**<br />  * 得到唯一实例管理类<br />  * @return<br />  */<br /> static synchronized public DBConnectionManager getInstance()<br /> {<br />  if(instance==null)<br />  {<br />   instance=new DBConnectionManager();<br />  }<br />  return instance;<br />  <br /> }<br /> /**<br />  * 释放连接<br />  * @param name<br />  * @param con<br />  */<br /> public void freeConnection(String name, Connection con)<br /> {<br />  DBConnectionPool pool=(DBConnectionPool)pools.get(name);//根据关键名字得到连接池<br />  if(pool!=null)<br />  pool.freeConnection(con);//释放连接 <br /> }<br /> /**<br />  * 得到一个连接根据连接池的名字name<br />  * @param name<br />  * @return<br />  */<br /> public Connection getConnection(String name)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池<br />  con=pool.getConnection();//从选定的连接池中获得连接<br />  if(con!=null)<br />  System.out.println("得到连接。。。");<br />  return con;<br /> }<br /> /**<br />  * 得到一个连接，根据连接池的名字和等待时间<br />  * @param name<br />  * @param time<br />  * @return<br />  */<br /> public Connection getConnection(String name, long timeout)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池<br />  con=pool.getConnection(timeout);//从选定的连接池中获得连接<br />  System.out.println("得到连接。。。");<br />  return con;<br /> }<br /> /**<br />  * 释放所有连接<br />  */<br /> public synchronized void release()<br /> {<br />  Enumeration allpools=pools.elements();<br />  while(allpools.hasMoreElements())<br />  {<br />   DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();<br />   if(pool!=null)pool.release();<br />  }<br />  pools.clear();<br /> }</div><div align="left"> /**<br />  * 创建连接池<br />  * @param props<br />  */<br /> private void createPools(DSConfigBean dsb)<br /> {<br />  DBConnectionPool dbpool=new DBConnectionPool();<br />  dbpool.setName(dsb.getName());<br />  dbpool.setDriver(dsb.getDriver());<br />  dbpool.setUrl(dsb.getUrl());<br />  dbpool.setUser(dsb.getUsername());<br />  dbpool.setPassword(dsb.getPassword());<br />  dbpool.setMaxConn(dsb.getMaxconn());<br />  System.out.println("ioio:"+dsb.getMaxconn());<br />  pools.put(dsb.getName(), dbpool);<br /> }<br /> /**<br />  * 初始化连接池的参数<br />  */<br /> private void init()<br /> {<br />  //加载驱动程序<br />  this.loadDrivers();<br />  //创建连接池<br />  Iterator alldriver=drivers.iterator();<br />  while(alldriver.hasNext())<br />  {<br />   this.createPools((DSConfigBean)alldriver.next());<br />   System.out.println("创建连接池。。。");<br />   <br />  }<br />  System.out.println("创建连接池完毕。。。");<br /> }</div><div align="left"> /**<br />  * 加载驱动程序<br />  * @param props<br />  */<br /> private void loadDrivers()<br /> {<br />  ParseDSConfig pd=new ParseDSConfig();<br /> //读取数据库配置文件<br />  drivers=pd.readConfigInfo("ds.config.xml");<br />  System.out.println("加载驱动程序。。。");<br /> }<br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left">}<br />----------------------------------------<br />DSConfigBean.java<br />----------------------------------------<br />/**<br /> * 配置文件Bean类<br /> */<br />package <a href="http://www.tjyj.account.db/">com.chunkyo.db</a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DSConfigBean {</div><div align="left"> private String type     =""; //数据库类型<br /> private String name     =""; //连接池名字<br /> private String driver   =""; //数据库驱动<br /> private String url      =""; //数据库url<br /> private String username =""; //用户名<br /> private String password =""; //密码<br /> private int maxconn  =0; //最大连接数<br /> /**<br />  * <br />  */<br /> public DSConfigBean() {<br />  // TODO Auto-generated constructor stub<br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left"> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }</div><div align="left"> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }</div><div align="left"> /**<br />  * @return the maxconn<br />  */<br /> public int getMaxconn() {<br />  return maxconn;<br /> }</div><div align="left"> /**<br />  * @param maxconn the maxconn to set<br />  */<br /> public void setMaxconn(int maxconn) {<br />  this.maxconn = maxconn;<br /> }</div><div align="left"> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }</div><div align="left"> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }</div><div align="left"> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }</div><div align="left"> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }</div><div align="left"> /**<br />  * @return the type<br />  */<br /> public String getType() {<br />  return type;<br /> }</div><div align="left"> /**<br />  * @param type the type to set<br />  */<br /> public void setType(String type) {<br />  this.type = type;<br /> }</div><div align="left"> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }</div><div align="left"> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }</div><div align="left"> /**<br />  * @return the username<br />  */<br /> public String getUsername() {<br />  return username;<br /> }</div><div align="left"> /**<br />  * @param username the username to set<br />  */<br /> public void setUsername(String username) {<br />  this.username = username;<br /> }</div><div align="left">}<br />-----------------------------------------------------<br />ParseDSConfig.java<br />-----------------------------------------------------<br />/**<br /> * 操作配置文件类 读  写 修改 删除等操作 <br /> */<br />package <a href="http://www.tjyj.account.db/">com.chunkyo.db</a>;</div><div align="left">import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.util.List;<br />import java.util.Vector;<br />import java.util.Iterator;</div><div align="left">import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.JDOMException;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.output.Format;<br />import org.jdom.output.XMLOutputter;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class ParseDSConfig {</div><div align="left"> /**<br />  * 构造函数<br />  */<br /> public ParseDSConfig() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * 读取xml配置文件<br />  * @param path<br />  * @return<br />  */<br /> public Vector readConfigInfo(String path)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  Vector dsConfig=null;<br />  FileInputStream fi = null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取路径文件<br />   dsConfig=new Vector();<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    DSConfigBean dscBean=new DSConfigBean();<br />    dscBean.setType(pool.getChild("type").getText());<br />    dscBean.setName(pool.getChild("name").getText());<br />    System.out.println(dscBean.getName());<br />    dscBean.setDriver(pool.getChild("driver").getText());<br />    dscBean.setUrl(pool.getChild("url").getText());<br />    dscBean.setUsername(pool.getChild("username").getText());<br />    dscBean.setPassword(pool.getChild("password").getText());<br />    dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));<br />    dsConfig.add(dscBean);<br />   }<br />   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br />  <br />  return dsConfig;<br /> }<br /></div><div align="left">/**<br /> *修改配置文件 没时间写 过段时间再贴上去 其实一样的 <br /> */<br /> public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null; //读出<br />  FileOutputStream fo=null; //写入<br />  <br /> }<br />/**<br /> *增加配置文件<br /> *<br /> */<br /> public void addConfigInfo(String path,DSConfigBean dsb) <br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取xml流<br />   <br />   SAXBuilder sb=new SAXBuilder();<br />   <br />   Document doc=sb.build(fi); //得到xml<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();//得到xml子树<br />   <br />   Element newpool=new Element("pool"); //创建新连接池<br />   <br />   Element pooltype=new Element("type"); //设置连接池类型<br />   pooltype.setText(dsb.getType());<br />   newpool.addContent(pooltype);<br />   <br />   Element poolname=new Element("name");//设置连接池名字<br />   poolname.setText(dsb.getName());<br />   newpool.addContent(poolname);<br />   <br />   Element pooldriver=new Element("driver"); //设置连接池驱动<br />   pooldriver.addContent(dsb.getDriver());<br />   newpool.addContent(pooldriver);<br />   <br />   Element poolurl=new Element("url");//设置连接池url<br />   poolurl.setText(dsb.getUrl());<br />   newpool.addContent(poolurl);<br />   <br />   Element poolusername=new Element("username");//设置连接池用户名<br />   poolusername.setText(dsb.getUsername());<br />   newpool.addContent(poolusername);<br />   <br />   Element poolpassword=new Element("password");//设置连接池密码<br />   poolpassword.setText(dsb.getPassword());<br />   newpool.addContent(poolpassword);<br />   <br />   Element poolmaxconn=new Element("maxconn");//设置连接池最大连接<br />   poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));<br />   newpool.addContent(poolmaxconn);<br />   pools.add(newpool);//将child添加到root<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);<br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  finally<br />  {<br />   <br />  }<br /> }<br /> /**<br />  *删除配置文件<br />  */<br /> public void delConfigInfo(String path,String name)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi = null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//读取路径文件<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    if(pool.getChild("name").getText().equals(name))<br />    {<br />     pools.remove(pool);<br />     break;<br />    }<br />   }<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);</div><div align="left">   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br /> }<br /> /**<br />  * @param args<br />  * @throws Exception <br />  */<br /> public static void main(String[] args) throws Exception {<br />  // TODO Auto-generated method stub</div><div align="left">  ParseDSConfig pd=new ParseDSConfig();<br />  String path="ds.config.xml";<br />  pd.readConfigInfo(path);<br />  //pd.delConfigInfo(path, "tj012006");<br />  DSConfigBean dsb=new DSConfigBean();<br />  dsb.setType("oracle");<br />  dsb.setName("yyy004");<br />  dsb.setDriver("org.oracle.jdbc");<br />  dsb.setUrl("jdbc:oracle://localhost");<br />  dsb.setUsername("sa");<br />  dsb.setPassword("");<br />  dsb.setMaxconn(1000);<br />  pd.addConfigInfo(path, dsb);<br />  pd.delConfigInfo(path, "yyy001");<br /> }</div><div align="left">}<br /><br />--------------------------------------<br />ds.config.xml   配置文件<br />--------------------------------------<br /><br /><br />&lt;ds-config&gt;<br />&lt;pool&gt;<br />&lt;type&gt;mysql&lt;/type&gt;<br />&lt;name&gt;user&lt;/name&gt;<br />&lt;driver&gt;com.mysql.jdbc.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:mysql://localhost:3306/user&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;123456&lt;/password&gt;<br />&lt;maxconn&gt;100&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;pool&gt;<br />&lt;type&gt;mysql&lt;/type&gt;<br />&lt;name&gt;user2&lt;/name&gt;<br />&lt;driver&gt;com.mysql.jdbc.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:mysql://localhost:3306/user2&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;1234&lt;/password&gt;<br />&lt;maxconn&gt;10&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;pool&gt;<br />&lt;type&gt;sql2000&lt;/type&gt;<br />&lt;name&gt;books&lt;/name&gt;<br />&lt;driver&gt;com.microsoft.sqlserver.driver&lt;/driver&gt;<br />&lt;url&gt;jdbc:sqlserver://localhost:1433/books:databasename=books&lt;/url&gt;<br />&lt;username&gt;sa&lt;/username&gt;<br />&lt;password&gt;&lt;/password&gt;<br />&lt;maxconn&gt;100&lt;/maxconn&gt;<br />&lt;/pool&gt;<br />&lt;/ds-config&gt;<br /><br /><br />3. 连接池的使用<br />  1。Connection的获得和释放<br />  DBConnectionManager   connectionMan=DBConnectionManager .getInstance();//得到唯一实例<br />   //得到连接<br />   String name="mysql";//从上下文得到你要访问的数据库的名字<br />   Connection  con=connectionMan.getConnection(name);<br />  //使用<br />  。。。。。。。<br />  // 使用完毕<br /> connectionMan.freeConnection(name,con);//释放，但并未断开连接<br /> 2。数据库连接的动态增加和连接池的动态增加<br />      1。调用xml操作增加类<br /><br />      2。重新实例华连接池管理池类</div></div></div></div><img src ="http://www.blogjava.net/oaixgnaw/aggbug/94401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-17 12:55 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/17/94401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PO BO VO DTO POJO DAO概念及其作用（附转换图）</title><link>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93856.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Mon, 15 Jan 2007 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93856.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/93856.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/93856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/93856.html</trackback:ping><description><![CDATA[J2EE开发中大量的专业缩略语很是让人迷惑，尤其是跟一些高手讨论问题的时候，三分钟就被人家满口的专业术语喷晕了，PO VO BO DTO POJO DAO，一大堆的就来了（听过老罗对这种现象的批判的朋友会会心一笑）。
<p>    首先声明偶也不是什么高手，以下总结都是自己的体会。不对之处请您多指教。</p><p>PO：<br />persistant object持久对象<br /><br />最形象的理解就是一个PO就是数据库中的一条记录。<br />好处是可以把一条记录作为一个对象处理，可以方便的转为其它对象。<br /></p><p></p><hr /><p><br />BO：<br /><font size="4">business object</font><font size="4">业务对象<br /><br />主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。<br />比如一个简历，有教育经历、工作经历、社会关系等等。<br />我们可以把教育经历对应一个PO，工作经历对应一个PO，社会关系对应一个PO。<br />建立一个对应简历的BO对象处理简历，每个BO包含这些PO。<br />这样处理业务逻辑时，我们就可以针对BO去处理。<br /></font></p><p></p><hr /><p><br />VO ：<br />value object值对象<br /><font size="3">ViewObject表现层对象<br /><br /></font>主要对应界面显示的数据对象。对于一个WEB页面，或者SWT、SWING的一个界面，用一个VO对象对应整个界面的值。<br /></p><p></p><hr /><p><br />DTO ：<br />Data Transfer Object数据传输对象<br />主要用于远程调用等需要大量传输对象的地方。<br />比如我们一张表有100个字段，那么对应的PO就有100个属性。<br />但是我们界面上只要显示10个字段，<br />客户端用WEB service来获取数据，没有必要把整个PO对象传递到客户端，<br />这时我们就可以用只有这10个属性的DTO来传递结果到客户端，这样也不会暴露服务端表结构.到达客户端以后，如果用这个对象来对应界面显示，那此时它的身份就转为VO<br /></p><p></p><hr /><p><br />POJO ：<br /><font color="#333333" size="3">plain ordinary java object 简单java对象<br /></font>个人感觉POJO是最常见最多变的对象，是一个中间对象，也是我们最常打交道的对象。<br /><br />一个POJO持久化以后就是PO<br />直接用它传递、传递过程中就是DTO<br />直接用来对应表示层就是VO<br /><br /></p><p></p><hr /><p>DAO：<br />data access object数据访问对象<br />这个大家最熟悉，和上面几个O区别最大，基本没有互相转化的可能性和必要.<br />主要用来封装对数据库的访问。通过它可以把POJO持久化为PO，用PO组装出来VO、DTO<br /><br /><br />      总结下我认为一个对象究竟是什么O要看具体环境，在不同的层、不同的应用场合，对象的身份也不一样，而且对象身份的转化也是很自然的。就像你对老婆来说就是老公，对父母来说就是子女。设计这些概念的初衷不是为了唬人而是为了更好的理解和处理各种逻辑，让大家能更好的去用<font color="#ff0000">面向对象</font>的方式处理问题.<br /><br />      大家千万不要陷入过度设计，大可不必为了设计而设计一定要在代码中区分各个对象。一句话技术是为应用服务的。<br /><br />欢迎指正。<br /><br /></p><hr /><br />画了个图，感觉没有完全表达出自己的意思。。。。。谁帮忙完善下，最好能体现各个O在MVC中的位置<br /><img height="480" alt="snap20070108.jpg" src="http://www.blogjava.net/images/blogjava_net/vip01/snap20070108.jpg" width="557" border="0" /><img src ="http://www.blogjava.net/oaixgnaw/aggbug/93856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-15 09:52 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈新手修练J2EE武功及学SSH的方法</title><link>http://www.blogjava.net/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.blogjava.net/oaixgnaw/archive/2007/01/15/93852.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/93852.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/93852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/93852.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/easyjf/archive/2007/01/11/93057.html">
						<font color="#3468a4">谈新手修练J2EE武功及学SSH的方法 </font>
				</a>
		</div>
		<font face="Verdana" size="2"> </font>
		<div>
				<font size="2">
						<font face="Verdana">
								<strong>　　这是两封信，一封来自网友</strong>adamed <strong>，一封是我的回复，交流的是初学者如何学习J2EE及SSH的问题，得到adamed许可，这这里发出来跟大家分享，欢迎更多的朋友来交流。<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>主题：</strong> 请教easyjf团队各位大侠</font>
				</font>
		</div>
		<div>
				<font face="Verdana" size="2">
				</font> </div>
		<div>
				<font face="Verdana" size="2">
						<div> </div>
						<div>　　您好，我是一个在职软件开发人员。我是05年开始接触java开发。06年加入北京一家公司到现在。我的工作是做J2EE开发。公司使用SSH架构（Struts－Spring－hibernate）进行开发。</div>
						<div>虽然进公司半年但是由于项目原因，真正只做过一个Struts＋Hibernate的项目。现在我看了许多关于SSH的书。也看了一些代码，就是感觉自己提高太慢。</div>
						<div> </div>
						<div>　　偶然机会在CSDN的blog上看到 大侠 的blog知道了EasyJF。很钦佩你们的勇气，敢于开创中国开源项目之先河。</div>
						<div> </div>
						<div>　　由于接触J2EE时间太短。而现在这样的开源项目名目繁多。看了Spring的一些源代码只感觉头晕到不行。我实在不知道该如何提高自己。所以斗胆给各位EasyJF的朋友写这封邮件，请大家给我一些建议好嘛？？（由于公司使用SSH开发。所以不看这些东西还不行。）该大家给些建议该如何学习。</div>
						<div> </div>
						<div>ps：看了EasyJF的介绍我很想参与可惜能力实在有限。怕遭拒绝。</div>
						<div>我现在有一颗火热的心想提高，想做技术，想为中国原创出一点力。但我也知道做技术不能浮躁。故请各位帮忙。</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">您好：</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　感谢你对EasyJF的关注以及对国内开源的支持，国内环境普遍浮躁，因为有太多像<a href="http://blog.csdn.net/easyjf/archive/2006/07/12/910060.aspx"><font color="#ff0000">春迷</font></a>这样的人存在，搞得大家都不敢表达自己的思想了，因此还希望以后能继续多对国内开源人给予支持。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">
				</font> </div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">    关于您来信中说到的问题，我觉得可能是你对java的基础的掌握还不够的原因，简单来说就是内力不够。好比中国传统武侠小说中练武人的内力问题，降龙十八掌这样的绝世掌法，要是没有一定的内力作基础的话，就只能是降蛇十八掌，甚至蛇都降不了。虚竹小和尚的武功也是因为有了高深的内力，才能变得那么牛的。</font>
				<font face="Verdana" color="#0000ff" size="2">而修练J2EE武学的内力，我认为大致分为三层，初级层次是JAVA基础，第二层次是OO思想及模式，第三层次是特定领域(如Web开发相关技术规范、Servlet规范、JPA规范、EJB3规范等)、专业知识的学习。有了这些内力，不管他是SSH还是EasyJF，使用起来都会非常容易的。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">
				</font> </div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　SSH属于框架，属于工具，也是中间件。他们是用来提高我们的开发效率，提高我们软件产品的可维护性、可扩展性乃至敏捷性的。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">
				</font> </div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　他们里面有很我优秀的设计理念及模式应用。比如，</font>
				<font face="Verdana" color="#0000ff" size="2">struts属于MVC框架，关键是要了解MVC的概念及大致原理，掌握就很容易了；而hibernate属于orm系统，属于持久层的解决方案，同样需要对ORM的概念及原理有一个总体的了解，必要时可以去查查EJB1及EJB2里面用于持久层的Entity Bean的使用。而spring属于应用程序框架，其核心是IOC容器以及AOP，把这两个核心概念(也可称为大模式)了解以后，再加上一定的内力修为，其它就都不难了。Spring中还集成了很多适用东西(不过这些东西80%的在某一个项目中可能一直用不上)，比如对JDBC的封装、自己的MVC、对动态语言的简洁访问等，这些你根据自己的项目情况来选择学习，用到的时候再看看他的文档，一个项目下来应该就能把握。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">
				</font> </div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　说了那么多，我累了，你一定也有点晕了，下面结合你的情况，简单发表一点我的建议：</font>        </div>
		<div>
				<div>
						<font face="Verdana" color="#0000ff" size="2">　　１、用一年的时间慢慢提升自己的内力，然后这期间可以通过下面的方法同步学习使用ssh。</font>
				</div>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　2、看一些国内作者原创的书籍，并运行相关代码，比如孙卫琴的Struts及Hibernate等入门教程，罗时飞的Spring教程。他们的书都通谷易懂，很多属于他们在学习过程中的点滴记录，因此一定非常好懂。不要一下子就去读Rod的《J2EE Without EJB》，或者是Spring开发团队编写的《Spring框架高级编程》，甚至《Spring in action》！由于很多缘故，这些书看了你一定会更晕。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　3、下载一些国内原创的SSH应用源码示例。国外有很多这样的，也可以多看看。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　4、运行这些框架所附带Example示例，并了解其设计原理，并能简单修改。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　5、运行并多看这些框架的测试代码。要像买彩民分析采票走势图那样慢慢琢磨分析。</font>
		</div>
		<div>
				<font face="Verdana" color="#0000ff" size="2">　　6、在自己的项目中多动用，熟练使用一个开发工具，如Eclipse，并能掌握程序调试技巧。</font>
		</div>
		<div>    </div>
		<div>　　<font color="#ff0000">最后，关于Spring的学习，可以看看我们最近在编写的《深入Spring 2：轻量级J2EE开发框架原理与实践》的电子版，现在有两章可以下载，比较适合入门，</font>网址是：<a href="http://www.easyjf.com/spring"><font color="#3468a4">http://www.easyjf.com/spring</font></a>。</div>
		<div> </div>
		<div>　　另外，我准备你给我的信及我给你的回信放到我的blog上，供大家分享我们的交流，不知道您是否愿意？</div>
		<div> </div>
		<div>　　祝：学习愉快，工作顺利！</div>
		<div> </div>
		<div>　　　　</div>
		<div>　　EasyJF开源　大峡</div>
		<div> </div>
		<div>　　2007-01-10</div>
<img src ="http://www.blogjava.net/oaixgnaw/aggbug/93852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-15 09:46 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐几个浏览器开发工具 </title><link>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93849.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Mon, 15 Jan 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93849.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/93849.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/93849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/93849.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/littleredboy/archive/2007/01/10/92885.html">推荐几个浏览器开发工具</a>
		</div>
		<table class="t_msg" cellspacing="0" cellpadding="4" border="0">
				<tbody>
						<tr>
								<td class="line" style="PADDING-TOP: 10px" valign="top" height="100%">
										<div style="FONT-SIZE: 12px">    做web开发5年了，居然才发现有这么好的浏览器开发工具，真是惭愧了<br /><br />   <br />    做Java的web开发，肯定离不开浏览器，现在流行的浏览器除了微软的IE，还有其他流行的浏览器：firefox,opera。俗话说：“欲要善其事，必先利其器”，下面我就列出工作中针对这些浏览器常用的工具。<br />1.Instant Source<br />这是一款针对IE的工具。对网页源文件的查看，可以使我们获得更多与网页相关的信息，对网页制作者来说，一些设计得较有特色的网页，通过对其源代码来查看以作进一步地学习借鉴就更有必要了。但在IE中查看源文件极为不便。Instant Source是一个非常实用的IE插件，只要你用鼠标指向网页上的某一元素，它的HTML代码便即时显示出来，配合Shift、Ctrl键的操作，还可以锁定显示的源代码和显示HTML代码的上级元素。此外，通过鼠标还可以直接获取网页上各种颜色的R、G、B值及HEX代码。<br />2.ieHTTPHeaders<br />这是一款针对IE的工具。我们进行web开发的时候，使用的就是http协议，这个软件能够帮助我们查看http协议的表头的信息。<br />3.Internet Explorer Developer Toolbar<br />这是一款针对IE的工具。IE Developer Toolbar 特性如下： －浏览和修改Web页的文档对象模型（DOM）。－通过多种技术方式定位、选定Web页上的特定元素。－禁止或激活IE设置。－查看HTML对象的类名、ID，以及类似链接路径、tab顺序、快捷键等细节。－描绘表格、单元格、图片或选定标签的轮廓。－显示图片象素、大小、路径、替代文字等。－即时重定义浏览器窗口大小到800x600或自定义大小。－清空浏览器缓存和cookie，被清除项可从所有对象或给定域中选择。－直接访问关联W3C规范参考、IE开发组blog或其他来源。－显示设计时标尺，帮助对齐对象。该工具条可集成在IE窗口，或以浮动窗口形式存在\\使用方法:安装好以后,打开IE,在菜单栏中选择 查看---工具栏,勾上 Developer Toolbar<br />4.FireBug<br />这是一款针对FireFox的工具.可以查看和临时修改HTML源代码、查看CSS定义、调试JavaScript.尤其是在firefox上调试javascript功能非常的强大，但是firefox对javascript的兼容性没有IE好，所以这款插件就会有很大的局限性。<br />5.script debugger<br />这是一款针对IE的javascript调试工具。此工具的特点是小巧，功能齐全，debug时能够单步执行，能够显示变量，Object的值，缺点是不够稳定，很容易出错，出错以后这个工具就再也打开不了。<br />6.microsoft script editor<br />这是一款针对IE的工具.调试javascript的功能非常的强大，他是跟随office发布的，这个工具很稳定，一般不会出错，调试javascript需要的功能都具有，唯一的缺点是占内存较多，比较慢，如果内存小的话可以考虑使用script debugger.</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/oaixgnaw/aggbug/93849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2007-01-15 09:44 <a href="http://www.blogjava.net/oaixgnaw/archive/2007/01/15/93849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts+hibernate的替代方案：struts+newxy?</title><link>http://www.blogjava.net/oaixgnaw/archive/2006/09/11/69018.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Mon, 11 Sep 2006 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2006/09/11/69018.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/69018.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2006/09/11/69018.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/69018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/69018.html</trackback:ping><description><![CDATA[
		<p>newxy技术网站：<a href="http://www.newxy.net">http://www.newxy.net</a><br />    在java的web开发领域较麻烦的是数据库操纵，如果有工具能像delphi开发数据库运用系统那样高效，它一定会受到开发者的欢迎。 </p>
		<p>    经过五个方面的比较，newxy+struts WEB开发与deiphi桌面开发相比，速度更快，能力更强。 </p>
		<p>    newxy是hibernate的替代者，struts+newxy是struts+hibernate的替代方案。 </p>
		<p>    struts的不足，下面一篇文章有代表性：《Struts的巨大烦恼 真的不适合大系统？》<a href="http://dev.csdn.net/develop/article/85/85114.shtm">http://dev.csdn.net/develop/article/85/85114.shtm</a>。<br />主要观点是：<br />　    一、转到展示层时，需要配置forward，每一次转到展示层，相信大多数都是直接转到jsp， 而涉及到转向，需要配置forward，如果有十个展示层的jsp，需要配置十次struts， 而且还不包括有时候目录、文件变更，需要重新修改forward，注意，每次修改配置之后， 要求重新部署整个项目，而tomcate这样的服务器，还必须重新启动服务器，如果业务变更复杂频繁的系统， 这样的操作简单不可想象。现在就是这样，几十上百个人同时在线使用我们的 系统， 大家可以想象一下，我的烦恼有多大。<br />    二、当页面表单需要自动变化或者频繁变化时。<br />    对于一个成熟的MIS系统来说,页面表单肯定是不固定的,甚至象有些系统，页面表单是存在数据库中， 需要填写的表单在页面自动生成，比如填写一个人员基本信息,本来只需要填写 姓名、性别、出生年月 三个指标， 而我后来需要增加籍贯这样的指标，我只需要在数据库中添加籍贯这个记录，并在页面就能自动增加籍贯这样的表单。 而 struts在这方面，其优势反而变成了不足，我参考了非常多的人力资源管理系统，这些系统几乎都能够做系统里面就可以控制人员信息的指示， 进行使展示层能随之灵活变化，如果使用了struts，这些灵活性就根本用不上。　同时，如果页面表单频繁变化时，就需要频繁修改formbean对应的方法和属性，而每次修改之后，就要求重新部署，或者重新启动服务器……。<br />    hibernate的不足，下面是一位网友的看法，具有代表性：<br />    一、对象与数据库的映射，关键在于对象关系的映射，但是没做到很理想，配置过多，控制复杂， 另外还会出错。其实本质在于对象不够自由。<br />    二、事务处理。这点上更容易出问题，相对于各种各样的事务管理器，要兼容是一个大问题， 总归在各种应用服务器上有很多问题。其本质在于创建了一个自我数据存取小环境，必然面临各种兼容问题。<br />    三、HQL语言。建立对象查询语言，类SQL，但是不同于任何一种SQL，调试环境复杂。本质在于创建了一种语言，增加学习成本。<br />    这位网友还提出了减化和退化方案。 </p>
		<p>    struts+newxy至所以在开发效率上比struts+hibernate能提高十倍、甚至几十倍，是因为克服了struts与hiberate的不足。<br />    利用newxy DAO类，标签， struts+newxy可以在以下几个方面不用写java代码，不用配置struts。 </p>
		<p>    1.数据库的增、删、改； <br />    2.对查询所得数据缓存，指定缓存时长； <br />    3.数据库字符编码与本地字符编码转换； <br />    4.文件上传，上传大小控制； <br />    5.文件下载，下载记数； <br />    6.图片显示； <br />    7.数据分页显示； <br />    8.客户端标记记录集哪条记录被选择； </p>
		<p>    因为可以不写java代码，不用建立ActionForm类、Action类，因而不用配置struts，不用重新编译类文件、不用重新打包、不用重启服务器。 可以克服struts的不足。<br />    在克服hibernate的不足方面，newxy采用“退化”和“进化”并用的方案。<br />    newxy在进行数据的查询、增、删、改时都会调用一注册方法，根据业务涉及到的数据库相关数据源名和表名进行注册， 注册的目的是要获得表字段对应的java类名，主关键字段名，主关键字段长度等数据，保存在一个单子实例中，以供DAO类调用。 如果已注册不再注册。<br />    可以对多表查询语句注册，如：“select a.field1,b.field2 from table1 as a,table2 as b where ...";<br />    可以对跨数据源的查询注册。如："select a.field1,b.field2 from table1 as a,DB3.dto.table2 as b where ...";<br />    如果是数据增、删、改，则是对单一表注册；<br />    由于struts+newxy用即时注册的方法，可以不象hibernate那样用静态文件影射数据库到值对象类。开发者不用配置任何文件。可以使用任意查询语句，克服“对象不够自由”问题。<br />    hibernate通过配置文件设置表之间的关系，有一定意义，newxy在这方面算是“退化”的，但struts+newxy在处理数据库表之间关系方面是很容易的。<br />    在事务处理方面，newxy提供了一事务类net.newxy.dbm.Transaction。它可以将多个数据库的操作放在一个事务中。由于DAO类对数据操作前的注册方法得到的表及其字段各种特性都是与数据库直接相关的，而不是事先用静态文件影射， 因而极少发生错误；开发者可以通过Transaction的方法为不同的数据库设置不同的隔离等级；可以设置操时回滚时间，在设置的时间内事务没有完成，会有一线程进行干预，将事务回滚。<br />    hibernate的HQL语言是和数据库与对象影射规则相适应的，它没有特别功能，主要是利用值对象类来查询数据。 newxy也提供了一种查询语言NQL。开发者不需用特殊的语法来构建查询语句。非常容易理解，不会增加学习成本。 </p>
		<p>struts一旦与newxy结合到一起运用是如此简单，下列是struts+newxy代替struts+hibernate的例子。 </p>
		<p>        struts配置中，formBean的type是“net.newxy.struts_faces.DynaFormBean”，开发者不需另外设计ActionForm类。如：<br />            &lt;form-bean name="myFormBean" type="net.newxy.struts_faces.DynaFormBean" /&gt;</p>
		<p>        用户从页面表单submit数据后，在Action类的方法中，开发者可以用DynaFormBean代替struts ActionForm,用DynaDto代替hibernate 对象类。<br />        public ActionForward methodName(ActionMapping actionMapping, ActionForm actionForm,<br />                              HttpServletRequest httpServletRequest,<br />            HttpServletResponse httpServletResponse) throws Exception{<br />            ......<br />            DynaFormBean form=(DynaFormBean)actionForm;<br />            DynaDto dto=(DynaDto)form.getDto();<br />            dto.set_table("table1");//如果用户页面没有传来数据库表名。<br />            try{<br />                IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"),<br />                      httpServletRequest.getLocale());  //绝大多数情况是：IFacade ifacade=IFacadeFactory.getFacade();</p>
		<p>                //更新或插入，如果result==null,为update，否则为insert。<br />                result = ifacade.update(dto);//或：FormBeanUtils.update(ifacade, form);</p>
		<p>                //删除记录<br />                ifacade.remove(dto);//或:FormBeanUtils.remove(ifacade, form);</p>
		<p>                //数据查询，如果上传了符合newxy多项查询规则的数据。查询记录集放在newForm 的_coll属性中。<br />                DynaFormBean newForm=new DynaFormBean();<br />                FormBeanUtils.createForm(newForm, httpServletRequest);<br />                ......<br />                //开发者如果想知道生成的sql语句，可以这样：<br />                //string sql=form.get_sql();<br />                //由于开发者在对数据进行操作时完全不需知道sql语句，所以没有提供方法让开发者直接得到sql语句来控制数据操作。<br />                //未来版本可能提供这样的方法。<br />            }catch(Exception e){<br />                ......<br />            }<br />        }<br />        如果使用newxy的标签可以不建立Action类，不设置struts的formBean及action，可以不写代码。<br />    </p>
		<p>newxy也提供了一些实用类。本文档就是用newxy自身工具类轻松建立的。 <br /></p>
<img src ="http://www.blogjava.net/oaixgnaw/aggbug/69018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2006-09-11 20:14 <a href="http://www.blogjava.net/oaixgnaw/archive/2006/09/11/69018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>爱护自己和你爱的人——预防癌症</title><link>http://www.blogjava.net/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.blogjava.net/oaixgnaw/archive/2006/09/05/67841.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/67841.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/67841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/67841.html</trackback:ping><description><![CDATA[有关癌症<br /><br />三十多年前有一位服务于公卖局台北啤酒厂的张先生，参加该啤酒厂选派技术人员到国外深造的考试，以优异的成绩及格。在出国前经某公立医院体检发现，罹患有像孩拳头大小的肺部肿瘤，因而不能出国。 <br />张先生非常失望之余，一直怀疑诊断有误；于是再到另一家医院检查，结果还是证实原来的诊断并无错误。当时年轻力壮的张先生得到这样的绝症，在人生绝望之余，多次打电话给当时任职台东县政府黄顺兴县长机要秘书的魏姓同学。<br />魏姓同学便利用星期日赶到台北和张先生见面，张先生向魏同学详述相关绝望的详情和悲观感受，并请位同学协助其后事，恰逢魏同学与前任马偕医院院长1949－55专精于癌症临床研究的吕革令博士）系知交好友。当即建议前往访求吕博士医治，起初张先生说不愿再看医生，以免徒增伤悲；但魏同学说先前已以电话请教过吕博士并安排好时间，张先生只好偕同前往吕博士住处造访。吕博士和张先生见面就说：魏先生是我的好友，介绍你和我认识是我们缘份，感谢上帝赐给我们这个机会；我请教你：『癌为什幺叫绝症，你可知道吗？』」<br />张先生和魏先生都不知道如何作答。<br />吕博士又说：「人类医治癌症到目前为止只有两条路，第一条路是消灭病源，第二条路是增加抵抗力。但很奇怪的是，癌无论用钴60或其它药物去消灭癌细胞，可是癌细胞还没被消灭，好的细胞却先被杀死。另无论用什幺营养、补药，好的细胞还未吸收，癌细胞却先吸收、让癌长得更快；因此可说上述两条路都行不通、所以叫绝症。」 <br />吕博士又说：人类的聪明连登陆月球也都已经成功，但为什幺没有人去怀疑上述两条治癌的路是在钻牛角尖，另外找第三条路？感谢上帝赐给我以往在马偕医 院做癌症方面的临床实验，并得院内各部同仁协助的机会，我发现癌症病人血液检查的结果百分之百都是酸性反应。长期素食、且生活接近然的佛寺僧尼，由于体质都偏属优质弱碱性，所以尚没有发现罹患癌症的病例。因此我大胆的断定在弱碱性体质的状态下，癌细胞是无法生长、甚至是无法生存的。张先生我建议你从现在起少吃酸性的荤食类，多吃碱性食物，另外可吃绿藻和带壳菱角汤，改变你的体质，并励行接近自然的良好生活规律；如果五年内不死、你就没问题了，愿上帝祝福你。」 <br />张先生依照吕博士的建议，认真改变吃的习惯，每天又吃绿藻、喝菱角汤，乐观加上每天适当的运动，一年后再到同一公立医院检查结果，发现肿瘤不但没有长大、反而已呈现萎缩状态，遂令医院检查人员惊为奇迹，五年后竟完全处于萎缩、至近于消失状态。 <br />经过了将近四十年岁月，现在张先生的健康情况完全正常，生活起居甚为愉快。继张先生之后，有位前台东省立医院总务课长陈添寿先生，同样得到肺癌；魏先生得知后将张先生的经过转告陈添寿先生，陈先生乃依照吕博士的建议进行改变体质，结果与张先生同样愈癌症。 <br />那时吕博士全家已移民美国，事后吕博士回来台湾再与魏先生见面时，魏先生将张先生和陈先生的经过告诉吕博士，并提议由他们俩位亲自向吕博士陈述，请吕博士发表其改变体质之自疗成果报告。吕博士谦虚地回答说：我年事已大，!  且没有临床纪录不能做为成果。请魏先生转告亲友，如果友人认同的话，请他们继续做体验并广为宣导........。」 <br />关心自己也要关心别人，85﹪癌症病患属于酸性体质。健康人的血液是成弱碱性的，约是PH7.35～7.45左右。婴儿也是属于弱碱性的体质。成长期的成人有体质酸化的现象。根据一项六百位癌症病人体液分布的研究，显示85﹪癌症病患属于酸性体质。因此，如何使体质维持在弱碱性就是远离疾病的第一步。<br />酸性体质的生理表征：<br />1.皮肤无光泽。<br />2.香港脚。<br />3.稍做运动即感疲劳，一上公车便想睡觉。<br />4.上下楼梯容易气喘。<br />5.肥胖、下腹突出。<br />6.步伐缓慢、动作迟缓。<br />为什幺会形成酸性体质？<br />1.过度摄取乳酸性食品<br />a）肉类、奶酪制品与蛋、牛肉、火腿等皆属于酸性食品。 <br />b）摄取过量的酸性食品血液会倾向酸性而变黏稠，不易流到细血管的末稍，而易造成手脚或膝盖的冷寒症，以及肩膀僵硬和失眠等。 <br />c）年轻力壮时吃适量的肉类是对的，但老年人则以蔬菜或小鱼为宜。<br />2.生活步调失常会造成酸性体质 <br />a）生活步调失常会造成精神与肉体的压力。 <br />b）据统计，晚睡者罹患癌症的机率比正常人高出五倍。 <br />c）人类本来就活在节奏的世界里，无法事先储备睡眠或饮食，也不能日夜颠倒。<br />d）人体内脏受自律神经控制，白天主要是交感神经活动，晚上则由副交感神经工作，若使其错乱及倒置，就亦百病滋生。<br />3.情绪过于紧张<br />a）文明社会会造成的压力。<br />b）工作上或精神上的压力。   <br />c）当一个人承受精神压力后，一旦紧张松弛，时会造成猝死，称为潜在性副肾皮质机能不全症。<br />4.肉体的紧张<br />a）动手术之前应先检查肾上腺皮质机能是否正常。如果副肾皮质机能较差， 或手术压力远超过副肾调整功能，则可能造成病人死亡或其它不良影响。<br />b）若发现病患脸部浮肿，需详加询问病史及服药状况，为长期服用肾上腺皮质贺尔蒙者，施以针灸要特别注意反应。<br />c）劳动或运动过度，通宵打牌、开车等压力都应尽量避免。<br />附录：常见食物的酸碱性<br />1.强酸性食品：蛋黄、奶酪、白糖做的西点或柿子、乌鱼子、柴鱼等。<br />2.中酸性食品：火腿、培根、鸡肉、鲔鱼、猪肉、鳗鱼、牛肉、面包、小麦、奶油、马肉等。<br />3.弱酸性食品：白米、落花生、啤酒、酒、油炸豆腐、海苔、文蛤、章鱼,泥鳅。 <br />4.弱碱性食品：红豆、萝卜、苹果、甘蓝菜、 洋葱、豆腐等。<br />5.中碱性食品：萝卜干、大豆、红萝卜、蕃茄、 香蕉、橘子、番瓜、草莓、蛋白、梅干、柠檬、菠菜等。  <br />6.强碱性食品：葡萄、茶叶、葡萄酒、海带芽、海带等。 尤其是天然绿藻富含叶绿素，是不错的碱性健康食品，而茶类不宜过量，最佳饮用时间为早上。<br /><img src ="http://www.blogjava.net/oaixgnaw/aggbug/67841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2006-09-05 16:47 <a href="http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让你的网站排名靠前 </title><link>http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67840.html</link><dc:creator>行</dc:creator><author>行</author><pubDate>Tue, 05 Sep 2006 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67840.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/67840.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/67840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/67840.html</trackback:ping><description><![CDATA[网站做好了，怎样才能让你的网站在各大搜索引擎中排名靠前呢？网上的帖子很多，通过搜索和总结，整理出了一套自己行之有效的方法，写出来供大家参考 <br /><br />成功案例推荐：http://sooboo.com.cn/ <br /><br /><br />还在继续整理中，而且我们的网站也在不断优化中......... <br /><br />1、 网站建好后首先到各大搜索引擎免费登录你的网站 <br /><br />http://www.sowang.com/freesubmit.htm <br />http://bbs.5ixb.com/simple/index.php?t584.html <br /><br />2、 下载一个spider模拟器, 来查看你网页被SE检测到的信息, 可以在这个网址查看你页面被搜索引擎收集到的信息: http://www.webconfs.com/search-engine-spider-simulator.php, 根据这些信息, 修改页面, 去掉无用信息, 增加你认为有用的信息。 <br /><br />3、 尽量不要把整个页面都用Flash或者图片来实现, 这样SE无法找到页面的有用信息. <br /><br />4、 用标准代码设计网页,一个页面最主要有2个部分需要关注, 一个是&lt;head&gt;&lt;/head&gt;, 另外一个是&lt;boy&gt;&lt;/body&gt;, 至少这2部分应该设计好了, SE喜欢从左到右,自上而下搜索信息, 它认为页面上面的信息更重要, 所以尽量把你要突出的信息放在页面的上面 <br /><br />5、 &lt;title&gt;标志: <br />　　title标志作为页面的重要信息, SE非常看重, 应该把本页面要突出的信息精简到20个字以内作为title的值. 但不要用与页面无关的关键字作为title值, 否则会被SE惩罚. <br /><br />6、&lt;Meta&gt;标志: <br />　　每页都加上关键词比较好，但是不要堆砌关键词，堆砌关键词会被搜索引擎视为作弊，最好是有2、3百字的内容。在内容中有主要关键词，而关键词密度在2％到8％之间（这是目前几个月的最佳关键词密度，以后可能会变）. 关键词要注意：Title和网页内容中含有关键词最重要、其次是Meta描述＆Meta 关键词。然后网页内容中的&lt;h&gt;&lt;/h&gt;之间的标题中是否含有关键词也很重要。Meta最重要的是Description，而Meta Keywords现在大型的搜索引擎都不会在意，比如Google和Yahoo都不会根据Meta Keywords来进行网页排名。Description中关键词的原则同样是搜索量最大最相关的放在最前面，比如我们网站是做汽车保险报价的，原来我们网站的关键字是这样描述的 <br /><br />&lt;meta content="平价车险,搜保,搜保网,低价车险,搜保车险网,车险,北京车险,车险报价,车险超市,搜保车险,汽车保险,车险网,华安车险,中保车险,中华联合车险,平安车险,太平洋车险,便宜车险,保险超市,在线投保"name="keywords"&gt;，在baidu中打入“保险”，你会发现“车险计算”这个关键词的搜索量是最高的，这个关键词不用，等于浪费，按照百度确定关键词搜索量的方法，排在最前面的关键词是：车险计算,平安车险,人保车险,北京车险,强制车险,中保车险,太平洋车险,车险论坛,车险知识,上海车险,车险理赔,车险种类,保得车险网,车险营销,武汉车险,天平车险,车险网,中国车险网,网上车险，所以我改成这样： <br />&lt;meta content="车险计算和车险投保尽在搜保网。国内首家网上专业代理平安车险,人保车险,中保车险,太平洋车险。向消费者提供平价、快速、高品质的汽车保险销售服务。" name="DESCRIPTION"&gt; <br />&lt;meta content="车险，车险计算,平安车险,人保车险,北京车险,强制车险,中保车险,太平洋车险,车险知识,车险理赔,车险种类,车险网,网上车险,车险报价，搜保网,车险报价,搜保车险,汽车保险,低价车险,搜保车险网,平价车险,便宜车险,在线投保" name="keywords"&gt; <br />一般可以把这段子写到一个title.lbi文件中，如 <br />&lt;title&gt;搜保网-全国首家专业车险报价平台，为您提供精确快速的网上报价服务&lt;/title&gt; <br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <br />&lt;meta content="车险，车险计算,平安车险,人保车险,北京车险,强制车险,中保车险,太平洋车险,车险知识,车险理赔,车险种类,车险网,网上车险,车险报价，搜保网,车险报价,搜保车险,汽车保险,低价车险,搜保车险网,平价车险,便宜车险,在线投保" name="keywords"&gt; <br />&lt;meta content="车险计算和车险投保尽在搜保网。国内首家网上专业代理平安车险,人保车险,中保车险,太平洋车险。向消费者提供平价、快速、高品质的汽车保险销售服务。" name="DESCRIPTION"&gt; <br />然后嵌入到页面中，如 <br />&lt;HTML&gt; <br />&lt;HEAD&gt; <br />&lt;!--#include virtual="/Library/title.lbi" --&gt; <br />&lt;/head&gt; <br />&lt;html&gt; <br /><br />7、我之所以把“车险报价”放在了后面，是因为你按照我的方法在百度中搜索会发现“车险报价”这个关键词根本没有什么人搜索，所以放在后面，没有人搜索就表示没有人流，关键词是别人的搜索习惯，不是俺们做网页的自己想出来的，所以首先要分析什么关键词别人用的最多 <br /><br />8、 javascript: SE一般对javascript不感冒, 尽量不要在页面的&lt;head&gt;&lt;/head&gt;间放置大量的javascript函数, 这样会使SE不知所措, 而且大部分SE在爬行你的页面时都有时间限制, 或者最大信息量限制, 在前面放置很多javascript代码会使SE运行缓慢, 降低对你的兴趣, 最主要还是这部分代码把你后面有用信息占用了,使得SE无法获取你页面有用的信息, 如果你实在要用javascript, 尽量把所有javascript代码放在一个js文件里, 然后在页面连接这个JS文件即可 <br /><br />9、 给所有&lt;img&gt;加上alt属性, 这个一个好的习惯, 尤其是指向一个连接的图片一定要加上要连接网址的关键信息, SE会对有连接指向的图片的ALT属性进行识别, 但对无连接的图片不作处理. <br /><br />10、 &lt;h1&gt;&lt;h2&gt;: SE对这样的信息很感兴趣, 而且会对其增加权重, 所以把最重要的信息用&lt;h1&gt;&lt;/h1&gt;标识出来, 把次重要的信息用&lt;h2&gt;&lt;/h2&gt;标识出来. 注意: 一个页面应该只有一个&lt;h1&gt;&lt;/h1&gt;, 可以有多个&lt;h2&gt;&lt;/h2&gt;, 否则会被SE认为是作弊的 <br /><br />11、 尽量不要用mouseovers, 最好在css里用hover来实现 <br /><br />12、 尽量不要套用多层次的&lt;table&gt;, SE一般最多只能读取3个&lt;table&gt;的嵌套, 如果多了, 它就懒得读下去了, 造成你的有用信息没有被检测到. <br /><br />13、 &lt;b&gt;&lt;strong&gt;: 这些标识也会被SE很好的注意到, 虽然权重不如&lt;h1&gt;&lt;h2&gt;那么高, 可以灵活使用. <br /><br />14、 一个页面的连接数量最多不要超过100个, google认为只有前100个是有用的 <br /><br />15、 对于搜索引擎来说，页面各个元素的权重比例。 <br />　　内部连接: 10 分. <br />　　标题title: 10 分. <br />　　域名: 7 分. <br />　　&lt;h1&gt;和&lt;h2&gt;: 5 分. <br />　　页面第一个段落的开始部分: 5 分. <br />　　路径和文件名: 4 分. <br />　　相似关键词: 4 分. <br />　　每个句子的开始部分 1.5 分. <br />　　&lt;b&gt;和&lt;strong&gt;: 1 分. <br />　　内容: 1 分. <br />　　Title属性: 1 分. (注意不是&lt;title&gt;, 是title属性, 比如&lt;a href=… title=””&gt;) <br />　　alt 标志: 0.5 分. <br />　　&lt;meta&gt;的description属性: 0.5 分. <br />　　&lt;meta&gt;的 keywords属性: 0.05 分. <br /><br />16、 尽量用HTML的格式, 如果的确要用数据库, 尽量减少参数的长度 <br /><br />17、 我的网站( http://www.sooboo.com.cn/ )以前显示商品都是用一个aspx文件通过参数传递的, 结果这个aspx文件只能被SE收录1页, 而且排名根本找不到; 后来我把动态页面转换成了静态页面,用HTML格式显示, 每个商品一个HTML页面, 结果google收录增加了5000多页, 而且每个商品在google的排行基本都在第一页了, 一搜的也是. 最近来自一搜的访问量成倍增加. 一搜基本上只对HTML文件感兴趣, 对动态页面不太感冒. <br />可以写个基类，如 <br /><br /><br /><br /><br /><br />public class BasePage: System.Web.UI.Page <br />{ <br />public BasePage() <br />{ <br /><br />} <br />protected override void Render(System.Web.UI.HtmlTextWriter writer) <br />{ <br />string name=Request.Url.AbsolutePath.Substring(1,Request.Url.AbsolutePath.Length-1).Replace("aspx","htm"); <br />string newurl=""; <br />if(name.IndexOf("/")&gt;0) <br />{ <br />newurl=Server.MapPath("../") + name; <br />} <br />else <br />{ <br />newurl=Server.MapPath("./") + name; <br />} <br />MemoryStream ms = new MemoryStream(); <br />StreamWriter sww = new StreamWriter(ms); <br />StreamWriter swr = new StreamWriter(newurl); <br />System.Web.UI.HtmlTextWriter htmlw = new HtmlTextWriter(swr); <br />base.Render(htmlw); <br />htmlw.Flush(); <br />htmlw.Close(); <br />string strLL = System.Text.Encoding.UTF8.GetString(ms.ToArray()); <br />Response.Write(strLL); <br />Response.Redirect(Request.Url.AbsoluteUri.Replace("aspx","htm"), true); <br />} <br />} <br />然后在需要生成静态页面的页面中继承就可以了 <br />18、 反向连接:google非常重视反向连接, 可以通过以下方式来增加反向连接: <br /><br />A: 友情连接, 最好找PR高的, 而且被SE收录很多页面, 排名靠前的连接, 千万不要和看起来PR很高, 但一眼就看出来是作弊的网站连接. 也不要和PR状态栏是灰色的连接, 这样的网站有可能是没有被收录, 也有可能是被惩罚了; 另外, 连接的时候也不一定非要连接你的首页, 也可以多连接些你的其他重要的页面, 比如网站的站点地图等页面, 首页外部连接不要太多,不超过40个. 20个以内最好. <br />　　B: 登陆网址站, 象dmoz, yahoo等目录要使出浑身解数来登陆, 但不要隔两天就登陆一次, 其他的网址站登陆越多越好, 至于如果找网址站, 你可以看看你的竞争对手在google里的反向连接, 在google输入 “link:www.****.com”, 就可以看到对方网站的反向连接, 你可以挨个进入搜索的结果, 在每个页面里也申请你的连接, 可以方便的找到很多连接网址站. <br />　　C: 留言板留言: 类似网址站登陆, 但写法一定要科学, 否则就没有意义了, 一般我是这样写的: <br />　　&lt;a href=http://….&gt;网站名&lt;/a&gt; <br />　　网站名 <br />　　网站名 http://.... 申请和贵站友情连接 <br />　　D: Blog博客 <br />　　现在博客也在中国兴起了, 完全可以充分利用一下, 可以注册一个帐号,来宣传你的网站, 也可以直接发表评论, 评论内容基本和留言板的格式一样 <br />　　E: 论坛宣传 <br />　　这个我就不多说了, 反正不要让人一看就是广告就行了 <br /><br />19、 内部连接 <br />　　很多人只看重外部连接, 岂不知道内部连接也相当重要, 我的基本思路是, 所有页面都包含主页和其他重要页面的连接, 和本页相关的页面也加上连接, 最终让你所有的页面都能够互连. <br /><br />20、 域名和文件名 <br />　　SE看重域名和页面文件名, 但多情况下, 域名已经不想改了, 只好修改文件名了, 尽量让你的文件名包含页面关键字的英文名称 <br /><br />21、 不要用作弊的手段来欺骗SE, 即使成功一时, 也不会成功永久, 到时候肯定会被惩罚. 所谓善恶到头终有报, 只挣来早与来迟.况且, 合法优化网站也完全可以达到这个效果 <br /><br />22、 网站速度的影响，网站速度对SE的排名也很有影响, 访问速度慢, 会让SE爬行你页面的时候失去耐性, 从而减少你页面的信息量, 让你的排名靠后, 如果你的服务器非常慢, 就应该考虑重新换应该快点的服务器了 <br /><br />23、 经常更新你的重要页面, 哪怕只是更换应该图片也好, 这样会让SE了解到你的网站更新很快, 有生命力, 对你的重视程度会增加, 排名当然也会提高的. 我网站基本2天google更新一 <br /><br />24、 用Blogger.com做一个甚至几个个人博客，博客中首页几篇文章中含有搜保网的链接。将这个博客的RSS提交到Yahoo和各个rss登录站点，因为rss会每天搜索你的网站，一旦rss被别的网站引用，就等于别人免费的间接的加入了你的搜保的网站，而你根本不需要交换链接，这种链接比交换链接更有效 <br /><br />可以从以下网站中登录 <br /><br />http://www.feedss.com/ <br /><br />http://www.okrss.com/search.html <br /><br />http://www.rss-cn.com/ <br /><br />http://rss.blogbeta.com/ <br /><br />http://www.92rss.com/cn/ <br /><br />http://www.bloghome.cn/posts/506 <br /><br />http://www.sorss.com/rss.htm <br /><br />http://bbs.5ixb.com/thread.php?fid=49 <br /><br />http://www.rssfav.com/baimin/rss.htm <br /><br />http://www.jingzhengli.cn/baogao/f20060613.htm <br /><br />http://www.700net.com/article.asp?id=112 <br /><br />http://blog.caihongxu.com/index.php/archives/70-OEAEBlogRSSyCo.html <br /><br />http://www.rsschina.com.cn/ <br /><br /><br /><br />25、 在大型的汽车网站上要求买一个广告位，买之前先看看PR值，这种地方往往PR在3、4左右的1000到2000元以下就可以搞定（看你的图片大小），有的甚至100到200元就可以搞定。在这种PR4以上的网站上放广告3个月以上，你的网站至少会有PR为3。这时候人流自然就会滚滚来。 <br /><br />26、 我用的最多的还有一个方法是写文章。比如我要做汽车保险，我会找到排名靠前的人气网站，或者个人网站，我不会说要交换链接，我会说我有一篇我自己写的专业文章，和你的网页内容很相关，我愿意免费放在你的网站上，你只需要允许我的文章中保留我的出处就行，而这个出处就是我的真正要赚钱的商业网站链接，这个方法如果你的文章真的写的很好，有三分之一的站长会同意。而这些网站都是我研究过PR很高，或者人气很旺的网站，所以在这些网站上一旦发表了你的文章，你的网站PR自然会提高，而且人气会上来，这个文章一定要原创并且题材吸引人。我的经验是吸引人的题材90％都是“我是如何解决......?"之类的文章 <br /><img src ="http://www.blogjava.net/oaixgnaw/aggbug/67840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2006-09-05 16:43 <a href="http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你练到什么程度了（J2EE）</title><link>http://www.blogjava.net/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.blogjava.net/oaixgnaw/archive/2006/09/05/67830.html</guid><wfw:comment>http://www.blogjava.net/oaixgnaw/comments/67830.html</wfw:comment><comments>http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oaixgnaw/comments/commentRss/67830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oaixgnaw/services/trackbacks/67830.html</trackback:ping><description><![CDATA[经常会跟一些朋友讨论怎么样才能学好Java,学到什么程度才算撑握了Java的问题。其中有一个J2EE程序员层次及武功修为的问题，有点意思。这里就把讨论的内容大致整理一下发出来，大家继续讨论。 
<p> </p><p>　　纵观国内的软件行业，靠Java吃饭的程序员还真不是少，而且Java程序员是有很大优越感的，毕竟对于很多用b/s搞开发的业内朋友来说，Java技术意味着难度大、门槛高，因此相对来说Java程序员比其它的程序员(如php、.net)收入高就理所当然。然而J2EE所涉及到的范畴是很广的，不能一个Java程序员就概括了事，而应该具有层次及水平之分，很多时候经常需要进行分类或评级，有时他评、有时自评。</p><p>　　谈到国内J2EE领域的程序员层次水平，当前流行的称谓及评级不外乎就下面几种：</p><p>　　第一种是精通掌握记事本、Dreamweaver等工具来写JSP+JavaBean数据库应用的是J2EE程序员；<br />　　第二种是用JBuilder、Eclipse等专用Java开发工具写着一堆一堆过程式Java Bean，而且还能精通Struts+Spring+Hibernate等应用框架的高级J2EE程序员；<br />　　第三种是用Together建模，然后生成一堆Java接口或代码，开口闭口都是设计模式的资深Java程序同及高级系统分析、构架师；<br />　　最后还有一种是整天在BlogJava或JavaEye上谈经论道的大师们，这些大师技术水平难以触摸，武功门派也各具特色，不好归类，有时不好称为程序员（因为有的时候他们甚至不写或者写不出程序），但又做着与J2EE程序员密切相关的事情，我们暂且就归为“牛牛”或“大师”。</p><p>　　称谓毕竟只是称谓，带有点主观或者功利色彩，有时很难鉴定一个人应该属于什么，因此，我们再从纯技术的角度，也即武功修为的角度，作了一个简单的分析及归类，把2EE领域程序员大致分成以下几个层次，可以作为大家自评的一个参考标准：</p><p>　　第一个层次：精通掌握Java语法、能调试基本的程序错误，精通掌握JSP+Java Bean写一些N年前ASP、PHP翻版的Java Web应用程序（如论坛、网站新闻发布系统、OA、网上商城等），精通JDBC使用、精通SQL语句、精通XML等。</p><p>　　第二个层次：掌握设计模式原理及应用，掌握基于OO的分析及设计方法,并能精通熟练使用几种Java专业设计及开发工具，精通掌握流行的J2EE框架如Hibernate、EJB、Webwork、Spring的原理及应用，精通J2EE中一两个组成部分(如Servlet、EJB等)的工作原理及细节。</p><p>　　第三个层次：少林的高僧有两种，禅僧及武僧。J2EE程序员的第三个层次也同样有禅、武两个分支，这里我们重点分析一下：</p><p>　　第一个分支属于走的禅僧线路。在练完第二个层次中的各种武功基础上，结合实际项目中的千奇百怪的用户需求，游刃有余的选择适合的技术方案为客户解决问题，并形成自己的一套解决方案。达到这一个层次的J2EE程序员已经不在乎使用任何工具、任何框架了，而是根据不同的对手，使用不同的武器或招式来应对。好比小李飞刀一样，只有达到了“手中无刀、心中有刀”的境界，才能达到“出手一刀，例不虚发”的效果。这一层次的武功属于一个熟练度问题，刀练得多了、遇到的对手多了，再加上前面的武功修为，就算做不到例不虚发，也可达到十发九中。</p><p>　　第二个分支属于走的武僧线路，在撑握熟悉第一二个层次中涉及到的内容后，进一步专研并撑握J2EE底层开发，J2EE规范制订、规范实现、Java虚拟机的工作原理、各种常见的J2EE服务器内核工作机制、内存管理、进程机制、源代码等。因为涉及的很多东西都比较抽象，代码也很多，练这一层的武功需要有很好的资质及耐性、并具还得有一定的环境及条件。好比神雕大侠杨过拿起“玄铁剑”，并练成“暗然销魂掌”的成长过程，需要前面的武功修为作基础，更需那只威力神武神雕的帮助指点及他处处为民、惩奸除恶的侠之心态。<br />　　<br />　　胡侃了这么多，现在来根据自己情况测算一下自己的份量，结果如下：</p><p>　　第一层　练到8成；<br />　　第二层　练到5成；<br />　　第三层　准备走禅僧线路，当前算是练到1成；<br />　　<br />　　唉，后面的武功提升越来越难，真不知道要到何年何月才能达到10成啊。你的武功练到哪一个层次了，不防亮出来大家切磋切磋。嘿嘿，要是有一天，咱们中国的Java程序员人手一把“玄铁剑”、人人会使“暗然销魂掌”，那还了得！汗...，写着写着居然做起白日梦了，不好意思，就此打住。</p><img src ="http://www.blogjava.net/oaixgnaw/aggbug/67830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oaixgnaw/" target="_blank">行</a> 2006-09-05 16:13 <a href="http://www.blogjava.net/oaixgnaw/archive/2006/09/05/67830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>