﻿<?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-superwei-文章分类-JAVA</title><link>http://www.blogjava.net/superwei/category/4332.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 15 Nov 2012 10:08:10 GMT</lastBuildDate><pubDate>Thu, 15 Nov 2012 10:08:10 GMT</pubDate><ttl>60</ttl><item><title>SVN配置</title><link>http://www.blogjava.net/superwei/articles/97256.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Thu, 01 Feb 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/97256.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/97256.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/97256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/97256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/97256.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<div>
														<font size="3">下面是总结出来的SVN的配置方法：</font>
												</div>
												<div>
														<font size="3">
																<strong>一、服务器端的配置：</strong>
														</font>
												</div>
												<div>
														<font size="3">1.安装Apache，安装文件名为apache_2.0.58-win32-x86-no_ssl.msi，端口设为80，安装过程中的NetWork Domain和Server Name都设为本机的IP地址(假设你的IP地址为192.168.0.1)</font>
												</div>
												<div>
														<font size="3">2.编辑Apache的配置文件(<tt class="filename"><font face="新宋体">C:\Program Files\Apache Group\Apache2\conf\httpd.conf</font></tt>)<br />去掉下面两行的"#"</font>
														<span style="FONT-FAMILY: monospace">
																<br />
														</span>
														<font size="3">#<span>LoadModule dav_fs_module modules/mod_dav_fs.so</span></font>
												</div>
												<div>
														<span>
																<font size="3">#LoadModule dav_module modules/mod_dav.so</font>
														</span>
												</div>
												<div>
														<div>
																<span>
																		<font size="3">3.安装SVN，安装文件名为svn-1.3.2-setup.exe，直接点[下一步]就OK了</font>
																</span>
														</div>
														<div>
																<font size="3">如果在Apache的配置文件中的<span>LoadModule区域下面出现下面两句：</span></font>
														</div>
														<div>
																<span>
																		<span>
																				<font size="3">LoadModule dav_svn_module "C:/Program</font>
																		</span>
																</span>
														</div>
														<div>
																<span>
																		<span>
																				<font size="3">Files/Subversion/bin/mod_dav_svn.so"<br />LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so" </font>
																		</span>
																</span>
														</div>
														<div>
																<span>
																		<span>
																				<font size="3">就说明到此为止你的安装没有出现错误</font>
																		</span>
																</span>
														</div>
												</div>
												<div>
														<font size="3">4.安装TortoiseSVN，安装文件名为TortoiseSVN-1.3.2.5840-svn-1.3.0.msi，直接点[下一步]就搞定了，安装完了之后重新启动一下，然后还可以安装一个语言补丁，安装文件名为LanguagePack_1.3.2_zh_CN.exe</font>
												</div>
												<div>
														<font size="3">5.建立版本库。例如在E盘下面新建一个文件夹svn，右键点击文件夹svn，在TortoiseSVN中选择命令[在此创建文件库]，文件库类型就选择本地文件系统[FSFS]</font>
												</div>
												<div>
														<font size="3">6.编辑新建版本库的配置文件（E:\svn\conf\svnserve.conf)</font>
												</div>
												<div>
														<font size="3">去掉下面四行的"#"</font>
												</div>
												<div>
														<font size="3"># [general]</font>
												</div>
												<div>
														<font size="3"># anon-access = read<br /># auth-access = write</font>
												</div>
												<div>
														<font size="3"># password-db = passwd</font>
												</div>
												<div>
														<font size="3">8.创建用户。在命令行中输入cd <font face="新宋体">C:\Program Files\Apache Group\Apache2\Bin</font></font>
												</div>
												<div>
														<font face="新宋体" size="3">然后输入htpasswd,就看看到bin目录下面的htpasswd可执行文件有哪些参数,</font>
												</div>
												<div>
														<font size="3">
																<font face="新宋体">输入htpasswd -c e:\svn\passwd myloginame,表示在版本库e:\svn中创建一一个存放用户信息的文件passwd,然后在这个文件中添加了一个叫myloginame</font>的用户,回车后就可以设置该用户的密码了，这是创建第一个用户的方法，之后再创建用户切记一定要-c改了，可以改成-m,如<font face="新宋体">htpasswd -m e:\svn\passwd myloginame2,这样就可以创建很多个用户</font></font>
												</div>
												<div>
														<font size="3">7.重新编辑Apache的配置文件，在最后面加入下面的语句</font>
												</div>
												<div>
														<font size="3">&lt;Location /svn&gt;<br />DAV svn<br />SVNPath "e:\svn"</font>
												</div>
												<div>
														<font size="3">AuthType Basic<br />AuthName "Subversion repository"<br />AuthUserFile "e:\svn\passwd"<br />Require valid-user<br />&lt;/Location&gt;</font>
												</div>
												<div>
														<font size="3">至此服务器端就全部配置好了</font>
												</div>
												<div>
														<font size="3">
																<strong>二、客户端的配置</strong>
														</font>
												</div>
												<div>
														<font size="3">服务器端配置好了之后，客户端的配置就相对简单了，只需安装两个文件SVN和TortoiseSVN，就是服务器配置中的步骤3和4。客户端安装好了之后，即可访问服务器上的版本库了，使用方法如下：</font>
												</div>
												<div>
														<font size="3">1.建立自己的版本库拷贝。在E盘新建一个文件夹Mysvn，右键点击该文件夹，选择SVN取出命令，在文件库URL中输入</font>
														<a href="http://192.168.0.1/svn">
																<font size="3">http://192.168.0.1/svn</font>
														</a>
														<font size="3"> ,这个URL是由服务器端的配置得到的，192.168.0.1是步骤1设置，/svn是步骤7设置的，然后点确定就可以了</font>
												</div>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/superwei/aggbug/97256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2007-02-01 14:33 <a href="http://www.blogjava.net/superwei/articles/97256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j基本使用方法</title><link>http://www.blogjava.net/superwei/articles/75723.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Tue, 17 Oct 2006 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/75723.html</guid><description><![CDATA[
		<table style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="700" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" height="25">
										<font face="黑体" size="2">
										</font>
								</td>
						</tr>
						<tr bgcolor="#f9f9f9">
								<td id="fontzoom" style="LINE-HEIGHT: 200%">
										<p align="center">
												<font size="2">　　Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。</font>
										</p>
										<p>
												<font size="2">　　<strong>一、定义配置文件</strong></font>
										</p>
										<p>
												<font size="2">　　其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</font>
										</p>
										<p>
												<font size="2">　　1.配置根Logger，其语法为：</font>
										</p>
										<p>
												<font size="2">　　log4j.rootLogger = [ level ] , appenderName, appenderName, … </font>
										</p>
										<p>
												<font size="2">　　其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </font>
										</p>
										<p>
												<font size="2">　　2.配置日志信息输出目的地Appender，其语法为：</font>
										</p>
										<p>
												<font size="2">　　log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />　　log4j.appender.appenderName.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.option = valueN </font>
										</p>
										<p>
												<font size="2">　　其中，Log4j提供的appender有以下几种： <br />　　org.apache.log4j.ConsoleAppender（控制台）， <br />　　org.apache.log4j.FileAppender（文件）， <br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />　　org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）， <br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </font>
										</p>
										<p>
												<font size="2">　　3.配置日志信息的格式（布局），其语法为：</font>
										</p>
										<p>
												<font size="2">　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />　　log4j.appender.appenderName.layout.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.layout.option = valueN </font>
										</p>
										<p>
												<font size="2">　　其中，Log4j提供的layout有以下几种： <br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </font>
										</p>
										<p>
												<font size="2">　　Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息</font>
										</p>
										<p>
												<font size="2">　　%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />　　%r 输出自应用启动到输出该log信息耗费的毫秒数 <br />　　%c 输出所属的类目，通常就是所在类的全名 <br />　　%t 输出产生该日志事件的线程名 <br />　　%n 输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br />　　%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 <br />　　%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10) </font>
										</p>
										<p>
												<font size="2">　　<strong>二、在代码中使用Log4j</strong></font>
										</p>
										<p>
												<font size="2">　　1.得到记录器</font>
										</p>
										<p>
												<font size="2">　　使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为： </font>
										</p>
										<p>
												<font size="2">　　public static Logger getLogger( String name) </font>
										</p>
										<p>
												<font size="2">　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如： </font>
										</p>
										<p>
												<font size="2">　　static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )</font>
										</p>
										<p>
												<font size="2">　　2.读取配置文件 </font>
										</p>
										<p>
												<font size="2">　　当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：</font>
										</p>
										<p>
												<font size="2">　　BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />　　PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br />　　DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</font>
										</p>
										<p>
												<font size="2">　　3.插入记录信息（格式化日志信息）</font>
										</p>
										<p>
												<font size="2">　　当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</font>
										</p>
										<p>
												<font size="2">　　Logger.debug ( Object message ) ;<br />　　Logger.info ( Object message ) ;<br />　　Logger.warn ( Object message ) ;<br />　　Logger.error ( Object message ) ;</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/superwei/aggbug/75723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2006-10-17 19:29 <a href="http://www.blogjava.net/superwei/articles/75723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA-STRUTS教程-Struts入门经验</title><link>http://www.blogjava.net/superwei/articles/74134.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 09 Oct 2006 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/74134.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/74134.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/74134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/74134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/74134.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<table style="WIDTH: 100%; mso-cellspacing: 0mm; mso-padding-alt: 0mm 0mm 0mm 0mm" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0mm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0mm; PADDING-BOTTOM: 0mm; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0mm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; LINE-HEIGHT: 15pt">
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">以下内容是我自己整理的一些</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">实施的入门，希望能对大家有所帮助</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">安装：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">首先请到</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">
														<a href="http://jakarta.apache.org/Suts" target="_blank">
																<span style="mso-fareast-language: ZH-CN">http://jakarta.apache.org/Struts</span>
														</a>
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下载</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，建议使用</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">release</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">版，现在最高版本为</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">1.1</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，下载后得到的是一个</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">ZIP</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">文件。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">将<span lang="EN-US">ZIP包解开，可以看到这个目录：lib和webapps，webapps下有一些WAR文件。假设你的Tomcat装在c:Tomcat下，则将那些WAR文件拷贝到C:\Tomcat\webapps，重新启动Tomcat即可。打开浏览器，在地址栏中输入：<a href="http://localhost:8080/struts-example/index.jsp" target="_blank">http://localhost:8080/struts-example/index.jsp</a>，若能见到“powered by Struts”的深蓝色图标，即说明成功了。</span></span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">这是</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">自带的一个例子，附有详细的说明文档，可以做为初学者的入门教程。另外，</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">还提供了一系统实用对象：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">XML</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">处理、通过</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Java reflection APIs</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">自动处理</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">JavaBeans</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">属性、国际化的提示和消息等</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">一个实例：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">一个用户注册系统，用户通过网页输入相关信息：注册</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">ID</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">号，密码，</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">EMAIL</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，若注册成功，则返回成功提示信息，反之出现注册失败提示信息。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">以下是相关文件的部分核心代码。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">项目建立：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">正式开发前，需要在</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Tocmat</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">（我的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">tomcat</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">装在</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">c:tomcat</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">）中建立此项目。比较快的一种建立方式为：在</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">C:tomcatwebapps</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下新建目录</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">test</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，再将</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">C:tomcatwebappsStruts-example</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />WEB-INF</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">目录拷贝到</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">test</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">目录下，然后将</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">testWEB-INF</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">下的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">src</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">和</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">classes</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">目录清空，以及</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts-config.xml</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">文件中内容清空即可。这样，我们需要的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">类包及相关的配置文件就都齐了。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">开发时，将<span lang="EN-US">JSP文件放在test目录下，Java原文件放在testWEB-INFsrc下，编译后的类文件放在testWEB-INFclasses下。 <br /><br />注册页面：reguser.jsp <br /><br />&lt;%@ page contentType="text/html;charset=UTF-8" language="java" %&gt; <br />&lt;%@ taglib uri="/WEB-INF/Struts-bean.tld" prefix="bean" %&gt; <br />&lt;%@ taglib uri="/WEB-INF/Struts-html.tld" prefix="html" %&gt; <br />&lt;html:html locale="ue"&gt; <br />&lt;head&gt; <br />&lt;title&gt;RegUser&lt;/title&gt; <br />&lt;html:base/&gt; <br />&lt;/head&gt; <br />&lt;body bgcolor="white"&gt; <br />&lt;html:errors/&gt; <br />&lt;html:form action="/regUserAction" focus="logname"&gt; <br />&lt; border="0" width="100%"&gt; <br />&lt;&gt; <br />&lt;th align="right"&gt; <br />Logname: <br />&lt;/th&gt; <br />&lt; align="left"&gt; <br />&lt;html:text property="logname" size="20" maxlength="20"/&gt; <br />&lt;/&gt; <br />&lt;/&gt; <br />&lt;&gt; <br />&lt;th align="right"&gt; <br />Password: <br />&lt;/th&gt; <br />&lt; align="left"&gt; <br />&lt;html:password property="password" size="20" maxlength="20"/&gt; <br />&lt;/&gt; <br />&lt;/&gt; <br />&lt;&gt; <br />&lt;th align="right"&gt; <br />E-mail: <br />&lt;/th&gt; <br />&lt; align="left"&gt; <br />&lt;html:password property="email" size="30" maxlength="50"/&gt; <br />&lt;/&gt; <br />&lt;/&gt; <br />&lt;&gt; <br />&lt; align="right"&gt; <br />&lt;html:submit property="submit" value="Submit"/&gt; <br />&lt;/&gt; <br />&lt; align="left"&gt; <br />&lt;html:reset/&gt; <br />&lt;/&gt; <br />&lt;/&gt; <br />&lt;/&gt; <br />&lt;/html:form&gt; <br />&lt;/body&gt; <br />&lt;/html:html&gt; <br /><br />此JSP页面不同于普通的JSP页，因为它大量运用了taglib，这些taglib对初学者而言，可能难于掌握，可这却是Struts的精华之一。</span></span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">灵活运用，将大大提高开发效率。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />
												</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">Struts-config.xml： <br /><br />&lt;Struts-config&gt; <br />&lt;form-beans&gt; <br />&lt;form-bean name="regUserForm" <br />type="org.cjea.Struts.example. RegUserForm "/&gt; <br />&lt;/form-beans&gt; <br />&lt;action-mappings&gt; <br />&lt;action path="/regUserAction" <br />type=" org.cjea.Struts.example.RegUserAction " <br />atibute=" regUserForm " <br />scope="request" <br />validate="false"&gt; <br />&lt;forward name="failure" path="/ messageFailure.jsp"/&gt; <br />&lt;forward name="success" path="/ messageSuccess.jsp"/&gt; <br />&lt;/action&gt; <br />&lt;/action-mappings&gt; <br />&lt;/Struts-config&gt; <br /><br />Struts的核心是Conoller，即ActionServlet，而ActionServlet的核心就是Struts-config.xml，Struts-config.xml集中了所有页面的导航定义。</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">对于大型的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">WEB</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">项目，通过此配置文件即可迅速把握其脉络，这不管是对于前期的开发，还是后期的维护或升级都是大有裨益的。掌握</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts-config.xml</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是掌握</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的关键所在。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />FormBean</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">RegUserForm <br /><br />package org.cjea.Struts.example; <br /><br />import javax.Servlet.http.HttpServletRequest; <br />import org.apache.Struts.action.ActionForm; <br />import org.apache.Struts.action.ActionMapping; <br /><br />public final class RegUserForm extends ActionForm{ <br /><br />private Sing logname; <br />private Sing password; <br />private Sing email; <br /><br />public RegUserForm(){ <br />logname = null; <br />password = null; <br />email = null; <br />} <br /><br />public Sing getLogName() { <br />return this.logname; <br />} <br />public void setLogName(Sing logname) { <br />this.logname = logname; <br />} <br />public void setPassWord(Sing password) { <br />this.password = password; <br />} <br />public Sing getPassWord() { <br />return this.password; <br />} <br />public void setEmail(Sing email) { <br />this.email = email; <br />} <br />public Sing getEmail() { <br />return this.email; <br />} <br /><br />public void reset(ActionMapping mapping, HttpServletRequest request) <br />{ <br />logname = null; <br />password = null; <br />email = null; <br />} <br />} <br /><br /></span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">每一个</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">FormBean </span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">都必须继承</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">ActionForm</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">类，</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">FormBean</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是对页面请求的封装。即把</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">HTTP request </span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">封装在一个对象中，需要说明的一点就是多个</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">HTTP request</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">可以共用一个</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">FormBean</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，便于维护和重用。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />
												</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">ActionBean：RegUserAction <br /><br />package org.cjea.Struts.example; <br /><br />import javax.Servlet.http.*; <br />import org.apache.Struts.action.*; <br /><br />public final class RegUserAction extends Action <br />{ <br /><br />public ActionForward perform(ActionMapping mapping, <br />ActionForm form, HttpServletRequest req, <br />HttpServletResponse res) <br />{ <br />Sing title = req.getParameter("title"); <br />Sing password = req.getParameter("password"); <br />Sing email = req.getParameter("email"); <br />/* <br />取得用户请求,做相应数据库操作，略 <br />*/ <br />} <br />} <br /><br />FormBean的产生是为了提供数据给ActionBean，在ActionBean中可以取得FormBean中封装的数据，经相应的逻辑处理后，调用业务方法完成相应业务要求。 <br /><br />Servlet的演变：在常规的 JSP，Servlet，JavaBean三层结构中，JSP实现View的功能，Servlet实现Conoller的功能，JavaBean实现Model的实现。 <br /><br />在Struts中，将常规情况下的Servlet拆分与ActionServlet、FormBean、ActionBean三个部分。ActionServlet配合Struts-config.xml，专职完成页面导航，而不再负责具体的数据获取与相应逻辑，这两部分功能由FormBean和ActionBean来完成。 <br /><br /></span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">优缺点</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">优点：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">跟</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Tomcat</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">、</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Turbine</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">等诸多</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Apache</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">项目一样，是开源软件，这是它的一大优点。使开发者能更深入的了解其内部实现机制。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">除此之外，</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的优点主要集中体现在两个方面：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">和页面导航。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的标记库，灵活动用，能大大提高开发效率。另外，就目前国内的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">JSP</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">开发者而言，除了使用</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">JSP</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">自带的常用标记外，很少开发自己的标记，或许</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是一个很好的起点。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">关于页面导航，我认为那将是今后的一个发展方向，事实上，这样做，使系统的脉络更加清晰。通过一个配置文件，即可把握整个系统各部分之间的联系，这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时，这种优势体现得更加明显。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">缺点：</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />Taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的一大优势，但对于初学者而言，却需要一个持续学习的过程，甚至还会打乱你网页编写的习惯，但是，当你习惯了它时，你会觉得它真的很棒。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">将</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">MVC</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Conoller</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">一分为三，在获得结构更加清晰的同时，也增加了系统的复杂度。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">从产生到现在还不到半年，但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点，但它是一种非常优秀的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">J2EE MVC</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">实现方式，如果你的系统准备采用</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">J2EE MVC</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">架构，那么，不妨考虑一下</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />
												</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun">Struts实施经验： <br />1、基于Struts架构的项目开发，首先需要有一个很好的整体规划，整个系统中包括哪几个模块，每个模块各需要多少FormBean和ActionBean等，而且最好有专人负责Struts-config.xml的管理。</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">开发基于</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的项目的难点在于配置管理，尤其是对</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts-config.xml</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的管理</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />2</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">、如果你的项目非常紧，并且项目组中又没有富有经验的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">开发人员，建议不要冒然采用</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">。</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">的掌握需要一个过程，对于一个熟练的</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">JSP</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">程序员，自学大概需要半个月左右的时间。如果结合</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">titls</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，则需要更长的时间</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />3</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">、如果你在网页中大量运用</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，那么你的美工将做出部分牺牲。当你结合</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Tiles</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，功能增强的同时，这种牺牲尤为明显。当然，你对功能和美观的取舍由你自己决定</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />4</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">、</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是一个好东西，但灵活运用它却需要一个过程，如果你不想在</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Taglib</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">上花太多的时间，那么只需理解与</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">FORM</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">有关的几个标记，其它的标记就放着吧，以后再看，先去研究</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">ActionServlet</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">和</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts-config.xml</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">，你会觉得很有成就感</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<br />
														<br />5</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">、</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">是否只适合于大型项目呢？</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">No</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">！</span>
												<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">Struts</span>
												<span lang="ZH-CN" style="FONT-SIZE: 9pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">适合于各种大小的项目，当然，对于大型项目，它所体现出来的优势更加明显。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN">
														<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN"> <o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/superwei/aggbug/74134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2006-10-09 17:31 <a href="http://www.blogjava.net/superwei/articles/74134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME程序开发新手入门九大要点</title><link>http://www.blogjava.net/superwei/articles/28815.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Fri, 20 Jan 2006 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/28815.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/28815.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/28815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/28815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/28815.html</trackback:ping><description><![CDATA[<TABLE style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=700 align=center border=0>
<TBODY>
<TR>
<TD align=middle height=25><FONT face=黑体 size=4>J2ME程序开发新手入门九大要点</FONT></TD></TR>
<TR bgColor=#f9f9f9>
<TD id=fontzoom style="LINE-HEIGHT: 200%">
<P align=center>作者：佚名&nbsp;&nbsp;&nbsp;&nbsp;来自：未知</P>
<P>　　<STRONG>一、J2ME中需要的Java基础知识</STRONG></P>
<P>　　现在有大部分人，都是从零开始学J2ME的，学习J2ME的时候，总是从Java基础开始学习，而且现在讲Java基础的书籍中都是以J2SE来讲基础，这就给学习造成了一些不必要的麻烦，下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。</P>
<P>　　J2ME中使用到的Java基础知识：</P>
<P>　　 1、Java语法基础：包括基本数据类型、关键字、运算符等等</P>
<P>　　 2、面向对象的思想：类和对象的概念，继承和多态等等。</P>
<P>　　 3、异常处理</P>
<P>　　 4、多线程</P>
<P>　　J2ME中没有用到的Java基础知识：</P>
<P>　　 1、JDK中javac和java命令的使用 </P>
<P>　　 2、Java基础中的很多类在J2ME中没有，或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。</P>
<P>　　 3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。</P>
<P>　　简单说这么多，希望学J2ME的朋友们能少走一些弯路，不足之处希望大家积极指正和补充。 </P>
<P>　　<STRONG>二、J2ME中暂时无法完成的功能</STRONG></P>
<P>　　列一些J2ME中暂时无法完成的功能，希望大家能积极补充：</P>
<P>　　 1、在手机中不更改代码实现移植，主要指游戏。</P>
<P>　　 2、动态修改按钮文字。</P>
<P>　　 3、在Canvas上接受中文输入。</P>
<P>　　 4、操作本地资源、例如地址本、已收短信息等。</P>
<P>　　 5、制作破坏性的手机病毒。</P>
<P>　　 6、其他等待大家来补充。</P>
<P>　　<STRONG>三、J2ME的跨平台性</STRONG></P>
<P>　　J2ME技术源于Java，所以也具有JVM的优势，可以在支持Java的平台上进行移植，但是现在的J2ME技术在跨平台上却做的很糟糕，我们来简单看一下原因：</P>
<P>　　1、手机的屏幕尺寸不一：</P>
<P>　　这个主要在界面制作上。如果你使用的是高级用户界面，比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时，一般没有什么问题。</P>
<P>　　如果你使用的是低级用户界面，比如你做的是游戏，那么你就需要考虑这个问题了。</P>
<P>　　2、厂商的扩展API不统一：</P>
<P>　　例如Nokia的扩展API类库UI系列，在别的手机上或者没有实现，或者包名不同等等。</P>
<P>　　3、手机平台上实现的bug：</P>
<P>　　例如Nokia的7650在实现双缓冲上有bug，那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug，可以参看：<A href="http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx">http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx</A></P>
<P>　　4、手机性能问题。</P>
<P>　　不同手机的可用内存、最大jar文件都有要求，例如Nokia S40的大部分手机支持的最大jar文件为64K，最大可用内容为210K。</P>
<P>　　所以现在的手机软件，特别是游戏都提供支持的机型列表，也才有了手机游戏移植人员的存在。</P>
<P>　　<STRONG>四、学习J2ME可以从事的工作种类</STRONG></P>
<P>　　现在J2ME技术可以说相当的火暴，这里介绍一些学好了J2ME之后可以从事的工作的种类：</P>
<P>　　1、J2ME游戏开发人员</P>
<P>　　根据游戏策划或者文档要求，在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。这是现在大部分J2ME程序员从事的工作。</P>
<P>　　需要熟练掌握：高级用户界面、低级用户界面、线程，如果是网络游戏，还需要熟练网络编程。</P>
<P>　　2、J2ME应用开发人员</P>
<P>　　现在的移动应用还不是很多，但是还是出现了一些，特别是移动定位以及移动商务相关的内容。需要熟练掌握：高级用户界面、线程和网络编程。</P>
<P>　　3、J2ME游戏移植人员</P>
<P>　　参照源代码，将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上，或者索爱的T618等等。主要是控制屏幕坐标，有些可能需要替换一些API。</P>
<P>　　需要熟悉各平台之间的差异以及相关的技术参数，比如屏幕大小、最大jar文件尺寸等等。</P>
<P>　　<STRONG>五、J2ME程序设计的几个原则</STRONG></P>
<P>　　1、使用面向对象编程。</P>
<P>　　虽然使用面向过程编程可以减小文件的尺寸，但是为了以后维护的方便和利于扩展，还是要使用面向对象编程。</P>
<P>　　2、使用MVC模式</P>
<P>　　将模型、界面和控制分离。现在很多的程序将三者合一，但是如果你做的程序比较大的话，还是建议你进行分离。</P>
<P>　　3、自动存储用户设定</P>
<P>　　使用RMS来存储用户的信息，例如存储用户上次输入的用户名、密码、用户对于系统的设定等，这样不仅可以减少用户的输入，而且对用户友好。很多程序甚至做了自动登陆等。</P>
<P>　　4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。</P>
<P>　　5、将低级用户界面的绘制动作放在一个独立的线程里面去。</P>
<P>　　6、在需要大量时间才能完成的工作时，给用户一个等待界面。</P>
<P>　　<STRONG>六、从模拟器到真机测试</STRONG></P>
<P>　　对于J2ME开发者来说，模拟器给我们带来了很多方便，比如可以在模拟器中调试程序以及很方便的察看程序的效果，但是模拟器也给我们带来了一些问题，比如模拟器实现的bug等等，所以进行真机测试是必须的。</P>
<P>　　1、为什么要进行真机测试？</P>
<P>　　因为模拟器程序可能存在bug，以及真机的性能有限，所以必须进行真机测试。</P>
<P>　　2、如何将程序传输到机器中？</P>
<P>　　将程序传输到机器中有如下方式：</P>
<P>　　 a)　OTA下载<BR>　　 b)　使用数据线传输<BR>　　 c)　红外传输<BR>　　 d)　蓝牙</P>
<P>　　你可以根据条件，选择合适的方式。</P>
<P>　　3、 真机测试主要测什么？</P>
<P>　　真机测试的内容很多，主要测试以下几个方面：</P>
<P>　　 a)　程序的功能<BR>　　 b)　程序的操作性，是否易操作<BR>　　 c)　程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K<BR>　　 d)　程序运行速度，速度是否可以忍受。</P>
<P>　　<STRONG>七、从WTK到厂商SDK</STRONG></P>
<P>　　对于J2ME爱好者来说，基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的，但是对于实际应用来说，仅仅使用WTK是远远不够的，所以在学习过程中，必须完成从WTK到SDK的跨越。</P>
<P>　　1、厂商SDK的下载地址？</P>
<P>　　·Nokia <BR>　　Nokia不愧为手机行业的老大，对于j2me的支持也是一流的，有专门的网站提供SDK和各种文档说明。<BR>　　网址是：<A href="http://forum.nokia.com.cn/sch/index.html">http://forum.nokia.com.cn/sch/index.html</A></P>
<P>　　·Siemens<BR>　　Siemens对于J2ME的支持也不错，它提供了SDK，模拟器需要独立安装。下载地址如下：<BR>　　<A href="https://communication-market.siemens.de/portal/main.aspx?LangID=0&amp;MainMenuID=2&amp;LeftID=2&amp;pid=1&amp;cid=0&amp;tid=3000&amp;xid=0">https://communication-market.siemens.de/portal/main.aspx?LangID=0&amp;MainMenuID=2&amp;LeftID=2&amp;pid=1&amp;cid=0&amp;tid=3000&amp;xid=0</A></P>
<P>　　·SonyEricsson<BR>　　SonyEricsson SDK以及自己的模拟器，下载地址为：<BR>　　<A href="http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp">http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp</A><BR>　　<A href="http://mobilityworld.ericsson.com.cn/development/download_hit.asp">http://mobilityworld.ericsson.com.cn/development/download_hit.asp</A></P>
<P>　　·Motorola<BR>　　Motorola提供了专门的SDK，内部包含模拟器，下载地址为：<BR>　　<A href="http://www.motocoder.com/motorola/pcsHome.jsp">http://www.motocoder.com/motorola/pcsHome.jsp</A></P>
<P>　　·SamSung<BR>　　SamSung也提供了专门的SDK和模拟器，下载地址为：<BR>　　<A href="http://developer.samsungmobile.com/eng/front_zone/bbs/bbs_main.jsp?p_menu_id=1500">http://developer.samsungmobile.com/eng/front_zone/bbs/bbs_main.jsp?p_menu_id=1500</A></P>
<P>　　·NEC：<BR>　　NEC也提供了集成模拟器的SDK，下载地址为：<BR>　　<A href="http://www.nec-mfriend.com/cn">http://www.nec-mfriend.com/cn</A></P>
<P>　　2、厂商SDK和WTK有什么不同？</P>
<P>　　厂商SDK最简单的理解就是在WTK的基础上增加了自己的模拟器和自己的扩展API。也就是说，你在使用厂商的SDK时，可以使用厂商的扩展类库，例如Nokia的UI类库，和厂商自己的模拟器而已。每个厂商的扩展API都不多，而且不尽相同。</P>
<P>　　3、如何使用？</P>
<P>　　有些厂商SDK的使用都和WTK相同，例如SamSung。Nokia提供了独立的界面来开发，但是这个界面在实际开发中使用不多。</P>
<P>　　4、厂商SDK的问题</P>
<P>　　厂商SDK实现过程中，有一些bug，而且和真机实现不一致。例如NOKIA的混音播放问题等等。</P>
<P>　　<STRONG>八、在J2ME中获得手机IMEI的方法</STRONG></P>
<P>　　IMEI是Internation mobile entity identification的简称，在手机中输入*#06#可以显示该数字，长度为15位，全球唯一，永远不会冲突，所以可以作为识别用户的一个标志。</P>
<P>　　下面是在J2ME中获得IMEI的方法：</P>
<P>　　1、MOTO系列的手机可以通过读取系统的IMEI属性获得，代码如下：</P>
<P>　　 String imei = System.getProperty("IMEI");</P>
<P>　　2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得，代码如下：</P>
<P>　　 String imei = System.getProperty("com.siemens.IMEI");</P>
<P>　　<STRONG>九、J2ME网络连接中显示问题的解决办法</STRONG></P>
<P>　　在网络编程中，有些时候会出现一些在没有接收到网络数据就显示界面的，造成界面显示不符合要求（例如公告显示，会先显示公告的背景图片再显示公告信息），这里提一个简单的解决办法给大家：</P>
<P>　　解决这种情况的方法分成三个步骤：</P>
<P>　　1、在需要显示的界面中，调用发送网络数据的方法。每次显示时调用该构造方法，不调用Display的setCurrent方法显示。</P>
<P>　　2、显示等待界面(例如进度条等)，给用户提示，在进行网络连接。</P>
<P>　　3、在处理网络反馈的数据完以后，调用Display的setCurrent方法显示显示当前界面。</P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/superwei/aggbug/28815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2006-01-20 17:41 <a href="http://www.blogjava.net/superwei/articles/28815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向对象的思维方法</title><link>http://www.blogjava.net/superwei/articles/21657.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 28 Nov 2005 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/21657.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/21657.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/21657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/21657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/21657.html</trackback:ping><description><![CDATA[<SPAN class=javascript id=text76284>作者：范凯<BR>E-mail: robbin_fan@yahoo.com.cn<BR><BR>我是从学习Java编程开始接触OOP(面向对象编程)，刚开始使用Java编写程序的时候感觉很别扭，因为我早以习惯用C来编写程序，很欣赏C的简洁性和高效性，喜欢C简练而表达能力丰富的风格，特别忍受不了Java运行起来慢吞吞的速度，相对冗长的代码，而且一个很简单的事情，要写好多类，一个类调用一个类，心里的抵触情绪很强。<BR><BR>我对Java的面向对象的特性琢磨良久，自认为有所领悟，也开始有意识的运用OOP风格来写程序，然而还是经常会觉得不知道应该怎样提炼类，面对一个具体的问题的时候，会觉得脑子里千头万绪的，不知道怎么下手，一不小心，又会回到原来的思路上去。<BR><BR>举个例子，要发广告邮件，广告邮件列表存在数据库里面。倘若用C来写的话，一般会这样思考，先把邮件内容读入，然后连接数据库，循环取邮件地址，调用本机的qmail的sendmail命令发送。<BR><BR>然后考虑用Java来实现，既然是OOP，就不能什么代码都塞到main过程里面，于是就设计了三个类：<BR><BR>一个类是负责读取数据库，取邮件地址，调用qmail的sendmail命令发送；<BR>一个类是读邮件内容，MIME编码成HTML格式的，再加上邮件头；<BR>一个主类负责从命令读参数，处理命令行参数，调用发email的类。<BR><BR>把一件工作按照功能划分为3个模块分别处理，每个类完成一件模块任务。<BR><BR>仔细的分析一下，就会发现这样的设计完全是从程序员实现程序功能的角度来设计的，或者说，设计类的时候，是自低向上的，从机器的角度到现实世界的角度来分析问题的。因此在设计的时候，就已经把程序编程实现的细节都考虑进去了，企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。<BR><BR>这样的分析方法其实是不适用于Java这样面向对象的编程语言，因为，如果改用C语言，封装两个C函数，都会比Java实现起来轻松的多，逻辑上也清楚的多。<BR><BR>我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的，只要领会了这一点，就领会了面向对象的思维方法。<BR><BR>举一个非常简单的例子：假使现在需要写一个网页计数器，客户访问一次页面，网页计数器加1，计数器是这样来访问的<BR><BR><A class=ilink href="http://hostname/count.cgi?id=xxx" target=_blank>http://hostname/count.cgi?id=xxx</A><BR><BR>后台有一个数据库表，保存每个id（一个id对应一个被统计访问次数的页面）的计数器当前值，请求页面一次，对应id的计数器的字段加1(这里我们忽略并发更新数据库表，出现的表锁定的问题)。<BR><BR>如果按照一般从程序实现的角度来分析，我们会这样考虑：首先是从HTTP GET请求取到id，然后按照id查数据库表，获得某id对应的访问计数值，然后加1，更新数据库，最后向页面显示访问计数。<BR><BR>现在假设一个没有程序设计经验的人，他会怎样来思考这个问题的呢？他会提出什么样的需求呢？他很可能会这样想：<BR><BR>我需要有一个计数器，这个计数器应该有这样的功能，刷新一次页面，访问量就会加1，另外最好还有一个计数器清0的功能，当然计数器如果有一个可以设为任意值的功能的话，我就可以作弊了。<BR><BR>做为一个没有程序设计经验的人来说，他完全不会想到对数据库应该如何操作，对于HTTP变量该如何传递，他考虑问题的角度就是我有什么需求，我的业务逻辑是什么，软件应该有什么功能。<BR><BR>按照这样的思路(请注意，他的思路其实就是我们平时在生活中习惯的思维方式)，我们知道需要有一个计数器类 Counter，有一个必须的和两个可选的方法：<BR><BR>getCount() // 取计数器值方法<BR>resetCounter() // 计数器清0方法<BR>setCount() // 设计数器为相应的值方法<BR><BR>把Counter类完整的定义如下：<BR><BR>public class Counter {<BR>public int getCount(int id) {}<BR>public void resetCounter(int id) {}<BR>public void setCount(int id, int currentCount) {}<BR>}<BR><BR>解决问题的框架已经有了，来看一下如何使用Counter。 在count.cgi里面调用Counter来计数，程序片断如下：<BR><BR>// 这里从HTTP环境里面取id值<BR>...<BR>Counter myCounter = new Counter(); // 获得计数器<BR>int currentCount = myCounter.getCount(id); // 从计数器中取计数<BR>// 这里向客户浏览器输出<BR>...<BR><BR>程序的框架全都写好了，剩下的就是实现Counter类方法里面具体的代码了，此时才去考虑具体的程序语言实现的细节，比如，在getCount()方法里面访问数据库，更新计数值。<BR><BR>从上面的例子中看到，面向对象的思维方法其实就是我们在现实生活中习惯的思维方式，是从人类考虑问题的角度出发，把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程，在这个翻译的过程中，软件也就逐步被设计好了。<BR><BR>在运用面向对象的思维方法进行软件设计的过程中，最容易犯的错误就是开始分析的时候，就想到了程序代码实现的细节，因此封装的类完全是基于程序实现逻辑，而不是基于解决问题的业务逻辑。<BR><BR>学习JDBC编程的经典错误问法是：“我怎样封装对数据库的select操作？”<BR><BR>面向对象的设计是基于解决业务问题的设计，而不是基于具体编程技术的设计。我不会去封装select语句的，我只封装解决问题的业务逻辑，对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。<BR><BR>回过头看上面那个发广告邮件的例子，应该如何应用面向对象的思维方法呢？<BR><BR>对于一个邮件来说，有邮件头，邮件体，和邮件地址这三个属性，发送邮件，需要一个发送的方法，另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计：<BR><BR>类JunkMail<BR><BR>属性：<BR>head<BR>body<BR>address<BR>方法：<BR>sendMail() // 发送邮件<BR>listAllMail() // 列邮件地址<BR><BR>用Java来表示：<BR><BR>public class JunkMail {<BR>private String head;<BR>private String body;<BR>private String address;<BR>public JunkMain() { // 默认的类构造器<BR>// 从外部配置文件读邮件头和邮件体<BR>this.head=...;<BR>this.body=...;<BR>}<BR><BR>public static boolean sendMail(String address) {<BR>// 调用qmail，发送email<BR>}<BR><BR>public static Collection listAllMail() {<BR>// 访问数据库，返回一个邮件地址集合<BR>}<BR>}<BR><BR>当把JunkMail设计好了以后，再调用JunkMail类完成邮件的发送，将是非常轻松的事情。<BR><BR>如果说传统的面向过程的编程是符合机器运行指令的流程的话，那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。<BR><BR>在面向对象的软件分析和设计的时候，要提醒自己，不要一上来就去想程序代码的实现，应该抛开具体编程语言的束缚，集中精力分析我们要实现的软件的业务逻辑，分析软件的业务流程，思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体，业务才是我们真正要实现的目标。<BR><BR>但是在设计过程中，心里却往往在担心，如果我完全不去考虑程序代码的实现的话，那么我怎么知道我的设计一定合理呢？我怎么知道我设计的类、接口一定可以实现呢？所以经常可以看到的现象就是：<BR><BR>在设计过程中，虽然知道不能过早考虑代码实现，但是每设计一个类，一个接口，心里都要不知不觉的用自己熟悉的编程语言大概的评估一下，看看能否编出来，因此，一不小心，就会又回到按照程序功能实现的思路进行设计的老路上去了。<BR><BR>举个例子来说明，在做Web程序设计的时候，经常要遇到分页显示数据的情况。比如说需要把系统中所有的用户都列出来这样的功能。假设使用User类来表示用户，增加用户addUser()，删除用户deleteUser()，查询所有用户listUsers()方法。而数据库中有一个user表，一条记录是一个用户的信息。下面考虑一下User类的方法的实现：<BR><BR>addUser()和deleteUser()方法都好实现，就是对数据库增加记录和删除记录。对于listUsers()方法，其实就是对user表的select，取出一个记录集。但是该怎么从listUsers()方法中得到所有用户的列表呢？<BR><BR>一个方法调用的返回值只有一个，没有多个，所以很多情况下采用的办法就是返回值定义为集合类型，比如Vector。这样就可以在listUsers()方法的具体代码实现的时候，从数据库依次取出一个个记录，插入到Vector里面来。在主程序里面，调用listUsers()方法可以返回一个Vector，然后再对Vector遍历操作，就可以得到用户列表了。<BR><BR>public class User {<BR><BR>public static void addUser(...) {<BR>// 数据库insert一条记录<BR>}<BR><BR>public static void deleteUser(...) {<BR>// 数据库delete一条记录<BR>}<BR><BR>public Vector listUsers(...) {<BR>// 数据库select结果放到一个集合里面<BR>}<BR>}<BR><BR>这样的设计基本合理，但是仍然有点小问题。因为在设计的时候，就考虑到了用Java的集合类Vector来实现对不定长数据集的存放，因而违反了面向对象设计的一个原则：在设计的时候不应过早的考虑具体程序语言的实现。所以必须用抽象的方法，和具体实现无关的方法来表达业务逻辑。<BR><BR>我们知道，通常对具有集合特征的数据结构进行遍历通常可以使用next和hasNext方法，next实现取下一个用户，hasNext判断是否还有元素。 因此我们定义一个接口Iterator，这个接口中定义两个方法next和hasNext：<BR><BR>public interface Iterator {<BR>public boolean hasNext() {}<BR>public Object next() {}<BR>}<BR><BR>而User类的listUses方法返回值改为Iterator接口的实现类:<BR><BR>public class User {<BR>...<BR>public Iterator listUsers() {<BR>}<BR>...<BR>}<BR><BR>这样就把User类的设计和具体的实现方法分离开了，因为此时任何实现了next()和hasNext()方法的类都可以做为listUsers的返回值，都可以被用来表达“用户列表”，而不仅仅可以使用Vector而已。比如，我可以用ArrayList来表达用户列表，因为ArrayList也实现了Iterator，当然我也可以自己专门写一个类来存放用户列表，只要实现next()和hasNext()方法就行了。<BR><BR>这样在具体的编写代码的时候，程序员具有了最大的灵活性，可以根据具体的情况，采用不同的编程方法来存放用户列表。特别是降低了程序的耦合度，提高了程序的可移植性。对于上面那个JunkMail的listAllMail()方法也同样应该改为接口类型。<BR><BR>然后，在主程序里面就这样来使用User类的listUsers方法：<BR><BR>User myUser = new User();<BR>Iterator iterator = myUser.listUsers();<BR>while (iterator.hasNext()) {<BR>iterator.next();<BR>}<BR><BR>这样就可以完全不用考虑程序代码实现了，从高层次上把功能抽象出来，定义成为接口，同时又可以把系统设计的很合理，完全根据业务的需求来进行设计。<BR><BR>结语<BR><BR>通过上面的几个例子的设计说明，使用面向对象的思维方法，其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程，而这个抽象的过程是自上而下的，非常符合人类的思维习惯，也就是先不考虑问题解决的细节，把问题的最主要的方面抽象成为一个简单的框架，集中精力思考如何解决主要矛盾，然后在解决问题的过程中，再把问题的细节分割成一个一个小问题，再专门去解决细节问题。<BR><BR>因而一旦牢牢的抓住了这一点，你就会发现在软件设计和开发过程中，你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序，并且程序的设计和开发也变得不再那么枯燥，而一个合理运用面向对象技术进行设计和架构的软件，更是具备了思维的艺术美感。<BR><BR>最后，愿面向对象的思维方法也能给您的程序设计之路带来创作的乐趣。 </SPAN><img src ="http://www.blogjava.net/superwei/aggbug/21657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-11-28 13:19 <a href="http://www.blogjava.net/superwei/articles/21657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串中的正则表达式特殊符号 </title><link>http://www.blogjava.net/superwei/articles/17523.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17523.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17523.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17523.html</trackback:ping><description><![CDATA[<H3><A id=RecentPostsRepeater_RecentPostsRepeater__ctl9_lnkTitle HREF="/chinajox/archive/2005/10/28/17181.html"><FONT color=#333333>字符串中的正则表达式特殊符号</FONT></A> </H3>
<H4>
<TABLE cellSpacing=0 cellPadding=0 width=447 border=0>
<TBODY>
<TR>
<TD colSpan=2 height=29><FONT color=#000000 size=2>双面提供　时时整理<BR><BR>问题：<BR></FONT><FONT color=#000000><FONT size=2><STRONG>String s1="111+222+333";<BR>System.out.println(s1.split("+").length);<BR>//输出时提示错误：<BR></STRONG>java.util.regex.PatternSyntaxException: Dangling meta character '+' near index<BR>问题出现在加号附近，查询相关的资料显示，+、*、|、\等符号在正则表达示中有相应的不同意义。<BR><BR><STRONG>正则表达式的基本用法&nbsp;zt</STRONG> </FONT></FONT></TD></TR>
<TR>
<TD style="WORD-BREAK: break-all" colSpan=2><FONT color=#000000 size=2>1、“.”为通配符，表示任何一个字符，例如：“a.c”可以匹配“anc”、“abc”、“acc”；<BR>2、“[]”，在[]内可以指定要求匹配的字符，例如：“a[nbc]c”可以匹配“anc”、“abc”、“acc；<BR>但不可以匹配“ancc”,a到z可以写成[a-z],0到9可以写成[0-9];<BR><BR>3、数量限定符号，表示匹配次数（或者叫做长度）的符号：<BR><BR>包括：“*”——0次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“+”——1次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“?”——0次或者1次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n}”——匹配n次，n为整数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n,m}”——匹配从n到m之间的某个数的次数；n和m都是整数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n,}”——匹配n到无穷次之间任意次数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{,m}”——匹配0到m之间任意次数；<BR>他们放到匹配格式的后面：<BR>例如：<BR>电话号码：024－84820482，02484820482(假设前面3或者4位，后面7或者8位，并且中间的减号可有可无)<BR><BR>都是符合规定的，那么可以用如下格式来匹配：[0-9]{3,4}&nbsp;\-?&nbsp;[0-9]{7,8}；<BR>注意：“\”为转义字符，因为“-”在正则表达式用有代表一个范围的意义，例如：前面所说的[0-9]，<BR>所以它需要转义字符“\”进行转义才可使用；<BR><BR>4、“^”为否符号，表示不想匹配的符号，例如：[^z][a-z]+可以匹配所有除“z”开头的以外的所有字<BR><BR>符串（长度大于2，因为“+”表示大于等于1的次数，从第二位开始都是小写英文字符）；<BR>如果^放到[]的外边则表示以[]开头的字符串；^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符串；<BR><BR>5、“|”或运算符，例如：a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”；<BR>6、“$”以它前面的字符结尾的；例如：ab+$就可以被“abb”，“ab”匹配；<BR><BR>7、一些简单表示方法：<BR>\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab，空格等等;\S表示[^\t\n\r\f]，就是非空格字符;<BR><BR><BR>明白了这些以后，我们再返回头看看它们如何被运用呢？一般来讲只需要加[]、或是\\即可。<BR><BR>举例来讲：<BR></FONT><STRONG><FONT color=#000000 size=2>String s1="111+222+333";<BR>System.out.println(s1.split("[+]").length);<BR>或是<BR>String s1="111+222+333";<BR>System.out.println(s1.split("\\+").length);<BR><BR>其他用法类同。</FONT></STRONG></TD></TR></TBODY></TABLE></H4><img src ="http://www.blogjava.net/superwei/aggbug/17523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:40 <a href="http://www.blogjava.net/superwei/articles/17523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的原理与配置快速入门(4)</title><link>http://www.blogjava.net/superwei/articles/17520.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17520.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17520.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17520.html</trackback:ping><description><![CDATA[　<STRONG>创建一个SessionFactory对象<BR></STRONG><BR>　　为了能创建一个SessionFactory对象，你必须在Hibernate初始化时创建一个Configuration类的实例，并将已写好的映射文件交由它处理。这样，Configuration对象就可以创建一个SessionFactory对象，当SessionFactory对象创建成功后，Configuration对象就没有用了，你可以简单地抛弃它。如下是示例代码：<BR><FONT size=3><BR></FONT>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>Configuration cfg = new Configuration();<BR>cfg.addResource("hello/Message.hbm.xml");<BR>cfg.setProperties( System.getProperties() );<BR>SessionFactory sessions = cfg.buildSessionFactory(); </TD></TR></TBODY></TABLE><BR>　　在以上代码中，Message.hb.xml这个映射文件的位置比较特殊，它与当前的classpath相关。例如classpath包含当前目录，那在上述代码中的Message.hbm.xml映射文件就可以保存在当前目录下的hello目录中。<BR><BR>　　作为一种约定，Hibernate的映射文件默认以.htm.xml作为其扩展名。另一个约定是坚持为每一个持久类写一个配置文件，想一想如果你将所有持久类的映射写入一个单独的配置文件中的话，那这个配置文件肯定非常庞大，不易维护。但这里又出现了一个新问题：如果为每个类写一个配置文件的话，这么多的配置文件应该存放在哪里呢？<BR><BR>　　Hibernate推荐你将每个映射文件保存在与持久类相同的目录下，并且与持久类同名。例如我们第一个示例程序中的Message持久类放在hello目录下，那你必须在这个目录下存放名为Message.hbm.xml的映射文件。这样一个持久类都有自己的一个映射文件，避免了出现像struts项目中的“struts-config.xml地狱”的情况。如果你不遵循这种规定，那你必须手动地用addResource()方法将一个个的映射文件载入；但你如果遵循这种规定，那你可以方便地用addClass()方法同时将持久类和它的映射文件载入，以下是体现这种便利性的示例代码：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>SessionFactory sessions = new Configuration()<BR>.addClass(org.hibernate.auction.model.Item.class)<BR>.addClass(org.hibernate.auction.model.Category.class)<BR>.addClass(org.hibernate.auction.model.Bid.class)<BR>.setProperties( System.getProperties() )<BR>.buildSessionFactory(); </TD></TR></TBODY></TABLE><BR>　　当然，Hibernate的映射文件还有很多其它的配置选项，比如数据库连接的设定，或是能够改变Hibernate运行时行为的一些设定。所有的设置可能是非常庞杂的，足以让你喘不过气来，但是不必担心，因为Hibernate为绝大多数值都设定了一个合理缺省值，你只需要修改这些配置文件中的极小一部分值。<BR><BR>　　你可以通过以下几种方式来修改Hibernate的系统配置参数：<BR><BR>　　· 将一个Java.util.Properties实例作为参数传给Configuration类的setProperties()方法。<BR><BR>　　· 在Hibernate启动时用Java –Dproperty=value的方式设置值。<BR><BR>　　· 在classpath可以找到的路径下创建一个名为hibernate.properties的配置文件。 <BR><BR>　　· 在classpath可以找到的路径下创建一个名为hibernate.cfg.xml的文件，并在其＜property＞标签中定义属性值。<BR><BR>　　以上就是对Hibernate的一个大致介绍，如果你想知道得更多，那本文还是远远不够的，我将陆续推出更多关于Hibernate的资料。但有一点是毫无疑问的：它的确是一个非常优秀的持久层解决方案！<img src ="http://www.blogjava.net/superwei/aggbug/17520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:31 <a href="http://www.blogjava.net/superwei/articles/17520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的原理与配置快速入门(3)</title><link>http://www.blogjava.net/superwei/articles/17519.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17519.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17519.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17519.html</trackback:ping><description><![CDATA[<STRONG>一个重要的术语：Type<BR><BR></STRONG>　　Hibernate的设计者们发明了一个术语：Type，它在整个构架中是一个非常基础、有着强大功能的元素。一个Type对象能将一个Java类型映射到数据库中一个表的字段中去（实际上，它可以映射到表的多个字段中去）。持久类的所有属性都对应一个type。这种设计思想使用Hibernate有着高度的灵活性和扩展性。<BR><BR>　　Hibernate内置很多type类型，几乎包括所有的Java基本类型，例如Java.util.Currency、Java.util.calendar、byte[]和Java.io.Serializable。<BR><BR>　　不仅如此，Hibernate还支持用户自定义的type，通过实现接口UserType和接口CompositeUserType，你可以加入自己的type。你可以利用这种特色让你的项目中使用自定义的诸如Address、Name这样的type，这样你就可以获得更大的便利，让你的代码更优雅。自定义type在Hibernate中是一项核心特色，它的设计者鼓励你多多使用它来创建一个灵活、优雅的项目！<BR><BR>　　<STRONG>策略接口</STRONG><BR><BR>　　Hibernate与某些其它开源软件不同的还有一点――高度的可扩展性，这通过它的内置策略机制来实现。当你感觉到Hibernate的某些功能不足，或者有某些缺陷时，你可以开发一个自己的策略来替换它，而你所要做的仅仅只是继承它的某个策略接口，然后实现你的新策略就可以了，以下是它的策略接口：<BR><BR>　　· 主键的生成 (IdentifierGenerator 接口) <BR><BR>　　· 本地SQL语言支持 (Dialect 抽象类) <BR><BR>　　· 缓冲机制 (Cache 和CacheProvider 接口) <BR><BR>　　· JDBC 连接管理 (ConnectionProvider接口) <BR><BR>　　· 事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口) <BR><BR>　　· ORM 策略 (ClassPersister 接口) <BR><BR>　　· 属性访问策略 (PropertyAccessor 接口) <BR><BR>　　· 代理对象的创建 (ProxyFactory接口)<BR><BR>　　Hibernate为以上所列的机制分别创建了一个缺省的实现，因此如果你只是要增强它的某个策略的功能的话，只需简单地继承这个类就可以了，没有必要从头开始写代码。<BR><BR>　　以上就是Hibernate的一些核心接口，但当我们真正开始用它进行开发时，你的脑海里可能总会有一个疑问：我是通过什么方式，并从哪里取得Session的呢？以下我们就解答这个问题。<BR><BR>　　<STRONG>基础配置</STRONG> <BR><BR>　　现在回顾一下我们先前的内容：我们写出了一个示例程序，并简要地讲解了Hibernate的一些核心类。但要真正使你的项目运行起来，还有一件事必须要做：配置。Hibernate可以配置成可在任何Java环境中运行，一般说来，它通常被用在2－3层的C/S模式的项目中，并被部署在服务端。在这种项目中，Web浏览器、或Java GUI程序充当者客户端。尽管我们的焦点主要是集中在多层web应用，但实际上在一些基于命令行的应用中也可以使用Hibernate。并且，对Hibernate的配置在不同的环境下都会不同，Hibernate运行在两种环境下：可管理环境和不可管理环境<BR><BR>　　· 可管理环境――这种环境可管理如下资源：池资源管理，诸如数据库连接池和，还有事务管理、安全定义。一些典型的J2EE服务器（JBoss、Weblogic、WebSphere）已经实现了这些。<BR><BR>　　· 不可管理环境――只是提供了一些基本的功能，诸如像Jetty或Tomcat这样的servlet容器环境。一个普通的Java桌面应用或命令行程序也可以认为是处于这种环境下。这种环境不能提供自动事务处理、资源管理或安全管理，这些都必须由应用程序自己来定义。<BR><BR>　　Hibernate的设计者们将这两种环境设计了一个统一的抽象界面，因此对于开发者来说只有一种环境：可管理环境。如果实际项目是建立在诸如Tomcat这类不可管理的环境中时，那Hibernate将会使用它自己的事务处理代码和JDBC连接池，使其变为一个可管理环境。<BR>对于可管理的环境而言，Hibernate会将自己集成在这种环境中。对于开发者而言，你所要做的工作非常简单：只需从一个Configuration类中创建一个SessionFactory类就可以了。<img src ="http://www.blogjava.net/superwei/aggbug/17519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:31 <a href="http://www.blogjava.net/superwei/articles/17519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的原理与配置快速入门(2)</title><link>http://www.blogjava.net/superwei/articles/17518.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17518.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17518.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17518.html</trackback:ping><description><![CDATA[<P><SPAN class=f14>　　<STRONG>理解Hibernate的架构</STRONG><BR><BR>　　当你想用Hibernate开发自己的基于持久层的应用时，第一件事情应当是熟悉它的编程接口。Hibernate的API接口设计得尽量简洁明了，以方便开发人员。然而实际上由于ORM的复杂性，它的API一般都不可能设计得很简单。但是别担心，你没有必要一下子了解所有的Hibernate的API接口。下面这张图描述了Hibernate在应用层和持久层中的一些重要的接口类：</SPAN></P>
<P align=center><SPAN class=f14><IMG onmousewheel="return bbimg(this)" alt="" src="http://www.weste.net/Files/UpFiles/2004/10/27/2004102709050032701.jpg" onload=javascript:resizepic(this) border=undefined></SPAN></P>
<P><SPAN class=f14>　　在上图中，我们将应用层放在了持久层的上部，实际上在传统的项目中，应用层充当着持久层的一个客户端角色。但对于一些简单的项目来说，应用层和持久层并没有区分得那么清楚，这也没什么，在这种情况下你可以将应用层和持久层合并成了一层。<BR><BR>　　在上图中，Hibernate的接口大致可以分为以下几种类型：<BR><BR>　　· 一些被用户的应用程序调用的，用来完成基本的创建、读取、更新、删除操作以及查询操作的接口。这些接口是Hibernate实现用户程序的商业逻辑的主要接口，它们包括Session、Transaction和Query。<BR><BR>　　· Hibernate用来读取诸如映射表这类配置文件的接口，典型的代表有Configuration类。<BR><BR>　　· 回调(Callback)接口。它允许应用程序能对一些事件的发生作出相应的操作，例如Interceptor、Lifecycle和Validatable都是这一类接口。<BR><BR>　　· 一些可以用来扩展Hibernate的映射机制的接口，例如UserType、CompositeUserType和IdentifierGenerator。这些接口可由用户程序来实现（如果有必要）。<BR><BR>　　Hibernate使用了J2EE架构中的如下技术：JDBC、JTA、JNDI。其中JDBC是一个支持关系数据库操作的一个基础层；它与JNDI和JTA一起结合，使得Hibernate可以方便地集成到J2EE应用服务器中去。<BR><BR>　　在这里，我们不会详细地去讨论Hibernate API接口中的所有方法，我们只简要讲一下每个主要接口的功能，如果你想了解得更多的话，你可以在Hibernate的源码包中的net.sf.hibernate子包中去查看这些接口的源代码。下面我们依次讲一下所有的主要接口：<BR><BR>　　<STRONG>核心接口</STRONG><BR><BR>　　以下5个核心接口几乎在任何实际开发中都会用到。通过这些接口，你不仅可以存储和获得持久对象，并且能够进行事务控制。<BR><BR>　　Session接口<BR><BR>　　Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中，实例化的Session是一个轻量级的类，创建和销毁它都不会占用很多资源。这在实际项目中确实很重要，因为在客户程序中，可能会不断地创建以及销毁Session对象，如果Session的开销太大，会给系统带来不良影响。但值得注意的是Session对象是非线程安全的，因此在你的设计中，最好是一个线程只创建一个Session对象。<BR><BR>　　在Hibernate的设计者的头脑中，他们将session看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区，Hibernate能检测到这些持久对象的改变，并及时刷新数据库。我们有时也称Session是一个持久层管理器，因为它包含这一些持久层相关的操作，诸如存储持久对象至数据库，以及从数据库从获得它们。请注意，Hibernate 的session不同于JSP应用中的HttpSession。当我们使用session这个术语时，我们指的是Hibernate中的session，而我们以后会将HttpSesion对象称为用户session。<BR><BR>　　SessionFactory 接口<BR><BR>　　这里用到了一个设计模式――工厂模式，用户程序从工厂类SessionFactory中取得Session的实例。<BR><BR>　　令你感到奇怪的是SessionFactory并不是轻量级的！实际上它的设计者的意图是让它能在整个应用中共享。典型地来说，一个项目通常只需要一个SessionFactory就够了，但是当你的项目要操作多个数据库时，那你必须为每个数据库指定一个SessionFactory。<BR>SessionFactory在Hibernate中实际起到了一个缓冲区的作用，它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据，还缓冲了一些将来有可能重复利用的数据。<BR><BR>　　Configuration 接口<BR><BR>　　Configuration接口的作用是对Hibernate进行配置，以及对它进行启动。在Hibernate的启动过程中，Configuration类的实例首先定位映射文档的位置，读取这些配置，然后创建一个SessionFactory对象。<BR><BR>　　虽然Configuration接口在整个Hibernate项目中只扮演着一个很小的角色，但它是启动hibernate时你所遇到的每一个对象。<BR><BR>　　Transaction 接口<BR><BR>　　Transaction接口是一个可选的API，你可以选择不使用这个接口，取而代之的是Hibernate的设计者自己写的底层事务处理代码。 Transaction接口是对实际事务实现的一个抽象，这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面，使得自己的项目可以在不同的环境和容器之间方便地移值。<BR><BR>　　Query和Criteria接口<BR><BR>　　Query接口让你方便地对数据库及持久对象进行查询，它可以有两种表达方式：HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量，并最终执行查询操作。<BR><BR>　　Criteria接口与Query接口非常类似，它允许你创建并执行面向对象的标准化查询。<BR><BR>　　值得注意的是Query接口也是轻量级的，它不能在Session之外使用。<BR><BR>　　Callback 接口 <BR><BR>　　当一些有用的事件发生时――例如持久对象的载入、存储、删除时，Callback接口会通知Hibernate去接收一个通知消息。一般而言，Callback接口在用户程序中并不是必须的，但你要在你的项目中创建审计日志时，你可能会用到它。</SPAN></P><img src ="http://www.blogjava.net/superwei/aggbug/17518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:30 <a href="http://www.blogjava.net/superwei/articles/17518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的原理与配置快速入门(1)</title><link>http://www.blogjava.net/superwei/articles/17517.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17517.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17517.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17517.html</trackback:ping><description><![CDATA[也许你听说过Hibernate的大名，但可能一直不了解它，也许你一直渴望使用它进行开发，那么本文正是你所需要的！在本文中，我向大家重点介绍Hibernate的核心API调用库，并讲解一下它的基本配置。<BR><BR>　　看完本文后，我相信你对什么是ORM（对像/关系映射）以及它的优点会有一个深刻的认识，我们先通过一个简单的例子开始来展现它的威力。<BR><BR>　　正如一些传统的经典计算机文章大都会通过一个“hello,world”的例子开始讲解一样，我们也不例外，我们也将从一个相对简单的例子来阐述Hibernate的开发方法，但如果要真正阐述Hibernate的一些重要思想，仅仅靠在屏幕上打印一些字符是远远不够的，在我们的示例程序中，我们将创建一些对象，并将其保存在数据库中，然后对它们进行更新和查询。
<P>
<TABLE borderColor=#ffcc00 cellSpacing=4 width="90%" align=center border=1>
<TBODY>
<TR>
<TD width="35%"><FONT color=#0000ff>“Hello World”</FONT></TD>
<TD width="65%">“Hello world”示例程序让您对Hibernate有一个简单的认识<STRONG>。</STRONG></TD></TR>
<TR>
<TD><FONT color=#0000ff>理解Hibernate的架构</FONT></TD>
<TD>介绍Hibernate接口的主要功能。</TD></TR>
<TR>
<TD><FONT color=#0000ff>核心接口</FONT></TD>
<TD>Hibernate有5个核心接口，通过这几个接口开发人员可以存储和获得持久对象，并且能够进行事务控制</TD></TR>
<TR>
<TD><FONT color=#0000ff>一个重要的术语：Type</FONT></TD>
<TD>Type是Hibernate发明者发明的一个术语，它在整个构架中是一个非常基础、有着强大功能的元素，一个Type对象能将一个Java类型映射到数据库中一个表的字段中去。</TD></TR>
<TR>
<TD><FONT color=#0000ff>策略接口</FONT></TD>
<TD>Hibernate与某些其它开源软件不同的还有一点――高度的可扩展性，这通过它的内置策略机制来实现。</TD></TR>
<TR>
<TD><FONT color=#0000ff>基础配置</FONT></TD>
<TD>Hibernate可以配置成可在任何Java环境中运行，一般说来，它通常被用在2－3层的C/S模式的项目中，并被部署在服务端。</TD></TR>
<TR>
<TD height=36><FONT color=#0000ff>创建一个SessionFactory对象</FONT></TD>
<TD>要创建一个SessionFactory对象，必须在Hibernate初始化时创建一个Configuration类的实例，并将已写好的映射文件交由它处理。</TD></TR></TBODY></TABLE></P>
<P><SPAN class=f14>　　<STRONG>“Hello World”<BR></STRONG><BR>　　Hibernate应用程序定义了一些持久类，并且定义了这些类与数据库表格的映射关系。在我们这个“Hello world”示例程序中包含了一个类和一个映射文件。让我们看看这个简单的持久类包含有一些什么？映射文件是怎样定义的？另外，我们该怎样用Hibernate来操作这个持久类。<BR><BR>　　我们这个简单示例程序的目的是将一些持久类存储在数据库中，然后从数据库取出来，并将其信息正文显示给用户。其中Message正是一个简单的持久类：，它包含我们要显示的信息，其源代码如下：<BR><BR>　　列表1　Message.Java　一个简单的持久类<FONT size=3><BR><BR></P></FONT>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>package hello;<BR>public class Message {<BR>　private Long id;<BR>　private String text;<BR>　private Message nextMessage;<BR>　private Message() {}<BR>　public Message(String text) {<BR>　　this.text = text;<BR>　}<BR>　public Long getId() {<BR>　　return id;<BR>　}<BR>　private void setId(Long id) {<BR>　　this.id = id;<BR>　}<BR>　public String getText() {<BR>　　return text; <BR>　}<BR>　public void setText(String text) {<BR>　　this.text = text;<BR>　}<BR>　public Message getNextMessage() {<BR>　　return nextMessage;<BR>　}<BR>　public void setNextMessage(Message nextMessage) {<BR>　　this.nextMessage = nextMessage;<BR>　}<BR>} </TD></TR></TBODY></TABLE></P>
<P><BR>　　Message类有三个属性：Message的id 、消息正文、以及一个指向下一条消息的指针。其中id属性让我们的应用程序能够唯一的识别这条消息，通常它等同于数据库中的主键，如果多个Message类的实例对象拥有相同的id，那它们代表数据库某个表的同一个记录。在这里我们选择了长整型作为我们的id值，但这不是必需的。Hibernate允许我们使用任意的类型来作为对象的id值，在后面我们会对此作详细描述。<BR><BR>　　你可能注意到Message类的代码类似于JavaBean的代码风格，并且它有一个没有参数的构造函数，在我们以后的代码中我将继续使用这种风格来编写持久类的代码。<BR><BR>　　Hibernate会自动管理Message类的实例，并通过内部机制使其持久化，但实际上Message对象并没有实现任何关于Hibernate的类或接口，因此我们也可以将它作为一个普通的Java类来使用：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>Message message = new Message("Hello World");<BR>System.out.println( message.getText() ); </TD></TR></TBODY></TABLE></P>
<P><BR>　　以上这段代码正是我们所期望的结果：它打印“hello world”到屏幕上。但这并不是我们的最终目标；实际上Hibernate与诸如EJB容器这样的环境在持久层实现的方式上有很大的不同。我们的持久类(Message类)可以用在与容器无关的环境中，不像EJB必须要有EJB容器才能执行。为了能更清楚地表现这点，以下代码将我们的一个新消息保存到数据库中去：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>Session session = getSessionFactory().openSession();<BR>Transaction tx = session.beginTransaction();<BR>Message message = new Message("Hello World");<BR>session.save(message);<BR>tx.commit();<BR>session.close(); </TD></TR></TBODY></TABLE></P>
<P><BR>　　以上这段代码调用了Hibernate的Session和Transaction接口（关于getSessionFactory()方法我们将会马上提到）。它相当于我们执行了以下SQL语句：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)<BR>values (1, 'Hello World', null) </TD></TR></TBODY></TABLE></P>
<P><BR>　　在以上的SQL语句中，MESSAGE_ID字段到底被初始化成了什么值呢？由于我们并没有在先前的代码中为message对象的id属性赋与初始值，那它是否为null呢？实际上Hibernate对id属性作了特殊处理：由于它是一个对象的唯一标识，因此当我们进行save()调用时，Hibernate会为它自动赋予一个唯一的值（我们将在后面内容中讲述它是如何生成这个值的）。<BR><BR>　　我们假设你已经在数据库中创建了一个名为MESSAGE的表，那么既然前面这段代码让我们将Message对象存入了数据库中，那么现在我们就要将它们一一取出来。下面这段代码将按照字母顺序，将数据库中的所有Message对象取出来，并将它们的消息正文打印到屏幕上：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>Session newSession = getSessionFactory().openSession();<BR>Transaction newTransaction = newSession.beginTransaction();<BR>List messages =newSession.find("from Message as m order by m.text asc");<BR>System.out.println( messages.size() + " message(s) found:" );<BR>for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {<BR>　Message message = (Message) iter.next();<BR>　System.out.println( message.getText() );<BR>}<BR>newTransaction.commit();<BR>newSession.close(); </TD></TR></TBODY></TABLE></P>
<P><BR>　　在以上这段代码中，你可能被find()方法的这个参数困扰着："from Message as m order by m.text asc"，其实它是Hibernate自己定义的查询语言，全称叫Hibernate Query Language(HQL)。通俗地讲HQL与SQL的关系差不多就是方言与普通话之间的关系，咋一看，你会觉得它有点类似于SQL语句。其实在find()调用时，Hibernate会将这段HQL语言翻译成如下的SQL语句：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID<BR>from MESSAGES m<BR>order by m.MESSAGE_TEXT asc </TD></TR></TBODY></TABLE></P>
<P><BR>　　以下就是运行结果： <BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>1 message(s) found:<BR>Hello World </TD></TR></TBODY></TABLE></P>
<P><BR>　　如果你以前没有ORM（对象－关系映射）的开发经验，那你可能想在代码的某个地方去寻找这段SQL语句，但在Hibernate中你可能会失望：它根本不存在！所有就SQL语句都是Hibernate动态生成的。 <BR><BR>　　也许你会觉得还缺点什么，对！仅凭以上代码Hibernate是无法将我们的Message类持久化的。我们还需要一些更多的信息，这就是映射定义表！这个表在Hibernate中是以XML格式来体现的，它定义了Message类的属性是怎样与数据库中的MESSAGES表的字段进行一一对应的，列表2是这个示例程序的映射配置文件清单：<BR><BR>　　列表2：示例程序的对象－关系映射表 <BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version="1.0"?＞<BR>＜!DOCTYPE hibernate-mapping PUBLIC<BR>"-//Hibernate/Hibernate Mapping DTD//EN"<BR>"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"＞<BR>＜hibernate-mapping＞<BR>＜class name="hello.Message" table="MESSAGES"＞<BR>　＜id name="id" column="MESSAGE_ID"＞<BR>　　＜generator class="increment"/＞<BR>　＜/id＞<BR>　＜property name="text" column="MESSAGE_TEXT"/＞<BR>　＜many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID"/＞<BR>＜/class＞<BR>＜/hibernate-mapping＞ </TD></TR></TBODY></TABLE></P>
<P><BR>　　以上这个文档告诉Hibernate怎样将Message类映射到MESSAGES表中，其中Message类的id属性与表的MESSAGE_ID字段对应，text属性与表的MESSAGE_TEXT字段对应，nextMessage属性是一个多对一的关系，它与表中的NEXT_MESSAGE_ID相对应。 <BR><BR>　　相对于有些开源项目来说，Hibernate的配置文件其实是很容易理解的。你可以轻松地修改与维护它。只要你定义好了持久类与数据库中表字段的对应关系就行了，Hibernate会自动帮你生成SQL语句来对Message对象进行插入、更新、删除、查找工作，你可以不写一句SQL语句，甚至不需要懂得SQL语言！<BR><BR>　　现在让我们做一个新的试验，我们先取出第一个Message对象，然后修改它的消息正文，最后我们再生成一个新的Message对象，并将它作为第一个Message对象的下一条消息，其代码如下：<BR><BR>　　列表3　更新一条消息<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>Session session = getSessionFactory().openSession();<BR>Transaction tx = session.beginTransaction();<BR>// 1 is the generated id of the first message<BR>Message message =(Message) session.load( Message.class, new Long(1) );<BR>message.setText("Greetings Earthling");<BR>Message nextMessage = new Message("Take me to your leader (please)");<BR>message.setNextMessage( nextMessage );<BR>tx.commit();<BR>session.close(); </TD></TR></TBODY></TABLE></P>
<P><BR>　　以上这段代码在调用时，Hibernate内部自动生成如下的SQL语句：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID<BR>from MESSAGES m<BR>where m.MESSAGE_ID = 1<BR><BR>insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)<BR>values (2, 'Take me to your leader (please)', null)<BR><BR>update MESSAGES<BR>set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2<BR>where MESSAGE_ID = 1 </TD></TR></TBODY></TABLE></P>
<P><BR>　　当第一个Message对象的text属性和nextMessage被程序修改时，请注意Hibernate是如何检测到这种变化，并如何在数据库中自动对它更新的。这实际上是Hibernate的一个很有价值的特色，我们把它称为“自动脏数据检测”，Hibernate的这个特色使得当我们修改一个持久对象的属性后，不必显式地通知Hibernate去将它在数据库中进行更新。同样的，当第一个Message对象调用setNextMessage()方法将第二个Message对象作为它的下一条消息的引用时，第二条消息会无需调用save()方法，便可以自动地保存在数据库中。这种特色被称为“级联保存”，它也免去了我们显式地对第二个Message对象调用save()方法之苦。<BR><BR>　　如果我们再运行先前的那段将数据库中所有的Message对象都打印出来的代码，那它的运行结果如下：<BR><BR></P>
<P>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>2 message(s) found:<BR>Greetings Earthling<BR>Take me to your leader (please) </TD></TR></TBODY></TABLE></P>
<P><BR>　　“Hello world”示例程序现在介绍完毕。我们总算对Hibernate有了一个简单的认识，下面我们将回过头来，对Hibernate的主要API调用作一下简要的介绍：</P>
<P></SPAN></P><img src ="http://www.blogjava.net/superwei/aggbug/17517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:29 <a href="http://www.blogjava.net/superwei/articles/17517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十分钟在jb(JBuilder)里面运行hibernate的简单例子</title><link>http://www.blogjava.net/superwei/articles/17514.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17514.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17514.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17514.html</trackback:ping><description><![CDATA[方便门外的学习者，给一个简单的入门例子。 
<P>如果你有用过其他持久架构 转到hibernate其实很简单。一些原理方面就不讲了，</P>
<P>robbin讲的肯定比我好的多，自己去精华版看看。</P>
<P>我所给的只是我当初刚开始接触hibernate时候很想要的一个简单例子和设置方法。</P>
<P>一直没有找到，所以现在放到这里给大家看看，（只给想要入门的一个直观的感应，呵呵） </P>
<P>首先当然要新建一个项目</P>
<P>然后在Project Properties-&gt;Paths-&gt;Required Libraries-&gt;add-&gt;new 这里定义hibernate的类库 把hibernate的lib下面的所有jar包进去 当然还有hibernate2.jar也要</P>
<P>然后一路ok下去就可以了。</P>
<P>再来就是hibernate.properties </P>
<P>从hibernate的src下面找到 </P>
<P>把它拷到你项目的src目录下</P>
<P>（什么，你的项目没有src目录，新建一个随便的类就有src目录了）</P>
<P>这样一个JB下面的hibernate的开发环境就好了</P>
<P>然后在hibernate.properties里面设置你的数据库连接 </P>
<P>默认是HypersonicSQL </P>
<P>嗯 接下来的是你最想要做的事情了 其实很简单 </P>
<P>新建一个类Message.java</P>
<P>代码如下</P><PRE class=code>package hello;

import java.io.Serializable;

/**
 * @author getdown
 * @version 1.0
 */

public class Message implements Serializable {
  private Long id;
  private String text;
  //定义一个简单链表 指向另外的一个Message
  private Message nextMessage;
  public Message() {}

  public Message(Long id) {
    this.id = id;
  }

  public Message(String text) {
    this.text = text;
  }

  public Message(Long id, String text) {
    this.id = id;
    this.text = text;
  }

  public Long getId() {
    return id;
  }

  private void setId(Long id) {
    this.id = id;
  }

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public Message getNextMessage() {
    return nextMessage;
  }

  public void setNextMessage(Message nextMessage) {
    this.nextMessage = nextMessage;
  }

}
</PRE>
<P>接下来是这个类对应的hibernate的配置文件 Message.hbm.xml</P><PRE class=code>&lt;?xml version="1.0"?&gt;

&lt;!DOCTYPE hibernate-mapping PUBLIC
    "-//<A href="">Hibernate</A>/<A href="">Hibernate</A> Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"&gt;
&lt;hibernate-mapping&gt;
    &lt;!--定义类和表的对应--&gt;
    &lt;class
        name="hello.Message"
        table="Messages"
    &gt;
    &lt;!--定义ID字段和生成ID的策略 这里采用identity--&gt;
    &lt;id    name="id"
        column="MESSAGE_ID"
    &gt;
    &lt;generator class="identity"/&gt;
    &lt;/id&gt;
        &lt;!--定义里面的text字段--&gt;
    &lt;property
        name="text"
                type="string"&gt;
                &lt;!--定义text字段在数据库里面生成的方法--&gt;
        &lt;column
            name="TEXT"
            length="100"
                        not-null="true"
                /&gt;
    &lt;/property&gt;
       &lt;!--定义对象关联之间的对应关系和关联的字段--&gt;
    &lt;many-to-one
        name="nextMessage"
        cascade="all"
        column="NEXT_MESSAGE_ID"
    /&gt;
    &lt;/class&gt;
&lt;/hibernate-mapping&gt;
</PRE>
<P>然后就是测试类 </P><PRE class=code>package hello;

import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
import net.sf.hibernate.Session;
import net.sf.hibernate.Query;
import net.sf.hibernate.<A href="">Hibernate</A>;
import net.sf.hibernate.type.LongType;
import net.sf.hibernate.Transaction;



/**
 * @author getdown
 * @version 1.0
 */

public class Hello {
  public Hello() {
  }

  public static void main(String[] args) throws Exception {
    Configuration cfg = new Configuration().addClass(Message.class);

    /** 顾名思义 构建表。。。第一次运行的时候运行下面语句可以在数据库生成表
     * 之后可以把下面这句去掉
     * */
//    new SchemaExport(cfg).create(true, true);

    //先生成sessionFactory
    SessionFactory sessions = cfg.buildSessionFactory();
    //再从sessionFactory得到一个session
    Session session = sessions.openSession();
    //启动事务
   Transaction tx = session.beginTransaction();

    //开始对数据库的操作
    /*----对数据库的创建操作--------*/
    Message message = new Message("helloWorld");
    //创建一条记录

    session.save(message);
    //存入记录
   session.flush();
    //提交事务
    tx.commit();


    /*---对数据库的查询操作---------------*/
//    Message message = new Message();
//    Query q = session.createQuery("from Message as message where message.id=1");
//    message = (Message) q.list().get(0);
//    message.getNextMessage().setText("helloNext");
//    session.flush();
//    session.close();
//    Long id = new Long(1);
//    Message message = (Message) session.find("from Message as message where <BR>message.id=?", id, <A href="">Hibernate</A>.LONG).get(0);
//    System.out.println(message.getText());


//    /*-------事务的处理----------------*/
//    try {
//      Message message = new Message("hello");
//      session.save(message);
//      session.flush();
//      message = new Message("hello");
//      session.save(message);
//      session.flush();
//      tx.commit();
//    }
//    catch (<A href="">Hibernate</A>Exception ex) {
//      tx.rollback();
//    }

    /*-------添加1000条记录时间--------------*/
//    long start = System.currentTimeMillis();
//    for(int i = 0; i &lt; 1000; i ++) {
//      Message message = new Message("hello");
//      session.save(message);
//      session.flush();
//    }
//    tx.commit();
//    long end = System.currentTimeMillis();
//    System.out.println("添加1000条记录时间－－－" + (end-start)/1000 + "s");



    session.close();


  }

}
</PRE>
<P>ok了 运行一下Hello看看出来什么吧 </P>
<P>怎么样 比起CMP的持久 hibernate的持久是不是显得很轻量级。。</P>
<P>还可以试试看hibernate的性能 把Hello.java的最后一段注释去掉运行看看</P>
<P>当然hibernate最重要的还是它的原理，还有很多很好的，很有趣的功能和O/RM设计思想等着你自己发掘。</P>
<P>多看看它自己的文档，可以学到很多东西，它的文档真的非常好。</P><img src ="http://www.blogjava.net/superwei/aggbug/17514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:27 <a href="http://www.blogjava.net/superwei/articles/17514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象(object)与引用(reference) </title><link>http://www.blogjava.net/superwei/articles/17511.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17511.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17511.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17511.html</trackback:ping><description><![CDATA[两个常识 <BR>一,对象(object)与引用(reference) <BR>有许多书籍,对于对象与引用之间的关系一直语焉不详,甚至有的干脆是错误的说法,我们必须对这个问题 <BR>有个清晰的了解. <BR>我们知道: <BR>A a = new A(); <BR>产生一个A类型的对象,a是这个对象的的一个引用,即a指向heap中真正的对象,而a和其他基本数据类型 <BR>一起存放在stack中.也就是object通过reference操控,在底层的话,a更象一个指针. <BR>对于有些书本所说,a就是对象,初学者的话也没什么大问题,因为对a的操作,就是对a指向的对象的操作. <BR>问题是,当a的指向发生改变时,a就是对象的说法就不能适应程序设计的需要. <BR>让我们来看一个简单的程序: <BR><BR>class A <BR>{ <BR>private int i=0; <BR>public void setI(int x) <BR>{ <BR>i=x; <BR>} <BR>public int getI(){ <BR>return i; <BR>} <BR>} <BR><BR>public class MyRef1 { <BR><BR><BR>public static void main(String[] args) { <BR>A a=new A(); <BR>A b=new A(); <BR>a.setI(10); <BR>b.setI(15); <BR>System.out.println("a的i="+a.getI()); <BR>System.out.println("b的i="+b.getI()); <BR>a=b; <BR>a.setI(20); <BR>System.out.println("a的i="+a.getI()); <BR>System.out.println("b的i="+b.getI()); <BR><BR>} <BR><BR>} <BR>我想,大家对于程序的输出应该认为是: <BR>a的i=10 <BR>b的i=15 <BR>a的i=20 <BR>b的i=15 <BR>第一,第二行应该没什么异义,第三行是对a设置后i的值,问题是,第四行是不会输出i=15的,正确结果是: <BR>i=20 <BR>因此,a,b都是对对象的引用,当我们将b的引用赋予a时,a已经重新指向了b,对指向发生改变后的a的操作, <BR>就是对b的操作. <BR>当然,那些坚持"a,b就是对象"说法的人,还是可以解释这个问题:对啊,a对象"变成"了b对象,没有什么,很 <BR>正常啊. <BR>那么,我们再来看: <BR><BR>我们知道,java通过final来定义常量: <BR>final int i=10; <BR>当我们对一个常量重新赋值时,会发生编译错误: <BR>i=5;//编译不通过 <BR>我们也可以通过final来定义常量对象: <BR>final A a = new A(); <BR>这样的话,我们将不能对a重新赋值. <BR><BR><BR>如果a本身是个对象,那么,这个对象就不能发生改变,其实,a只不过是一个引用,它只能指向原来指向的对象, <BR>并不是说它所指的对象的状态不能改变,因此,我们可以通过不改变a原来的指向的情况下对对象状态进行改 <BR>变,看程序: <BR><BR>class A <BR>{ <BR>private int i=0; <BR>public void setI(int x) <BR>{ <BR>i=x; <BR>} <BR>public int getI(){ <BR>return i; <BR>} <BR>} <BR><BR>public class MyRef1 { <BR><BR><BR><BR>public static void main(String[] args) { <BR><BR><BR>final A a = new A(); <BR>System.out.println(a.getI()); <BR>a.setI(8); <BR>System.out.println(a.getI()); <BR><BR><BR>} <BR><BR>} <BR><BR>如果a本身是个对象,那么,根本就不可能 <BR>a.setI(8); <BR>而实际a是一个引用,程序可以编译并运行: <BR>显示:8 <BR><BR>总之,java通过renfence来操控object,是深入学习java知识的基础,例如下面一点: <BR><BR><BR>二,java参数是值(value)传递还是引用(reference)传递 <BR>我们先看程序: <BR>public class MyRef2 { <BR><BR>static int x=10; <BR>static int y=20; <BR>public static void fangfa(int i) <BR>{ <BR>i++; <BR>x=i; <BR>} <BR><BR>public static void main(String[] args) { <BR>System.out.println("x="+x); <BR>System.out.println("y="+y); <BR>MyRef2.fangfa(y); <BR>System.out.println("x="+x); <BR>System.out.println("y="+y); <BR><BR><BR>} <BR><BR>} <BR>显然,将显示: <BR>x=10 <BR>y=20 <BR>x=21 <BR>y=20 <BR>y的值并没有发生改变,MyRef2.fangfa(y)使用的仅仅是y的值,里面的i++也不会作用到y本身. <BR>显然,java的参数是值传递,但是,为什么会有引用传递的说法呢? <BR>看下面这个程序: <BR>class A <BR>{ <BR>private int i=0; <BR>public void setI(int x) <BR>{ <BR>i=x; <BR>} <BR>public int getI(){ <BR>return i; <BR>} <BR>} <BR><BR>public class MyRef1 { <BR><BR>public static void setA1(A newA,int t) <BR>{ <BR>newA.setI(t); <BR><BR>} <BR><BR>public static void main(String[] args) { <BR>A a=new A(); <BR>System.out.println(a.getI()); <BR>MyRef1.setA1(a, 30); <BR>System.out.println(a.getI()); <BR>} <BR><BR>} <BR>按照值传递的说法,MyRef1.setA1(a, 30);将使用a所指的对象的一个复件,最终对这个对象没有作用 <BR>而事实是,方法对这个对象起了作用,程序将显示0,30.那么,java参数是值传递是不是错误了呢? <BR>老爹告诉你:no! <BR>我们要记住,a只不过是对象的reference,而reference的复件与原来的reference指向的是同一个对象 <BR>我们对复件的操作,与对a的操作一样,最终还是对指向对象的操作,因此,java的参数,只有值传递. <BR><img src ="http://www.blogjava.net/superwei/aggbug/17511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 11:11 <a href="http://www.blogjava.net/superwei/articles/17511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的struts应用开发（5）</title><link>http://www.blogjava.net/superwei/articles/17504.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17504.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17504.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17504.html</trackback:ping><description><![CDATA[<P>第六步:建立JSP视图页面 (主要有两个jsp文件. 添加页面. adduser.jsp 查看页面 viewuser.jsp) <BR><BR>adduser.jsp <BR><BR>&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt; <BR>&lt;%@ page contentType="text/html; charset=gb2312" %&gt; <BR>&lt;html:html&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;title&gt; <BR>adduser <BR>&lt;/title&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>&lt;h1&gt; &lt;/h1&gt; <BR>&lt;p&gt; <BR>&lt;html:form action="/user1Action.do" method="POST"&gt; <BR>&lt;html:hidden property="action"/&gt; <BR>&lt;br&gt; <BR>部门: <BR>&lt;html:select property="dep"&gt; <BR>&lt;html:options collection="dep" property="id" labelProperty="name1"/&gt; <BR>&lt;/html:select&gt; <BR>&lt;br&gt; <BR>ID: <BR>&lt;logic:equal name="userActionForm" property="action" scope="request" value="add"&gt; <BR>&lt;html:text property="user_id"/&gt; <BR>&lt;/logic:equal&gt; <BR>&lt;logic:equal name="userActionForm" property="action" scope="request" value="edit"&gt; <BR>&lt;html:text property="user_id" readonly="true"/&gt; <BR>&lt;/logic:equal&gt; <BR>&lt;br&gt; <BR>名字:&lt;html:text property="user_name"/&gt; <BR>&lt;br&gt; <BR>电话:&lt;html:text property="tel"/&gt; <BR>&lt;br&gt; <BR>&lt;html:submit property="submit" value="Submit"/&gt;&lt;br&gt; <BR>&lt;html:reset value ="Reset"/&gt; <BR>&lt;/html:form&gt; <BR>&lt;/body&gt; <BR>&lt;/html:html&gt; <BR><BR>viewuser.jsp <BR><BR>&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt; <BR>&lt;%@ page contentType="text/html; charset=GBK" %&gt; <BR>&lt;html:html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt; <BR>viewuser <BR>&lt;/title&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>&lt;div align="center"&gt;&lt;a href="userAction.do?action=add"&gt;add &lt;/a&gt;&lt;/div&gt; <BR>&lt;table width="60%" border="1" align="center"&gt; <BR>&lt;tr bgcolor="#CCCCCC"&gt; <BR>&lt;td&gt;ID&lt;/td&gt; <BR>&lt;td&gt;user_name&lt;/td&gt; <BR>&lt;td&gt;dep&lt;/td&gt; <BR>&lt;td&gt;tel&lt;/td&gt; <BR>&lt;td&gt;modify&lt;/td&gt; <BR>&lt;td&gt;del&lt;/td&gt; <BR>&lt;/tr&gt; <BR>&lt;logic:iterate name="rs" id="user" scope="request" type="java.util.HashMap"&gt; <BR>&lt;tr&gt; <BR>&lt;td&gt;&lt;bean:write name="user" property="user_id"/&gt; &lt;/td&gt; <BR>&lt;td&gt;&lt;bean:write name="user" property="user_name"/&gt; &lt;/td&gt; <BR>&lt;td&gt;&lt;bean:write name="user" property="dep_name"/&gt; &lt;/td&gt; <BR>&lt;td&gt;&lt;bean:write name="user" property="tel"/&gt; &lt;/td&gt; <BR>&lt;td&gt;&lt;a href="userAction.do?action=edit&amp;key=&lt;bean:write name="user" property="user_id"/&gt;"&gt;modify&lt;/a&gt;&lt;/td&gt; <BR>&lt;td&gt;&lt;a href="userAction.do?action=del&amp;key=&lt;bean:write name="user" property="user_id"/&gt;"&gt;del&lt;/a&gt;&lt;/td&gt; <BR>&lt;/tr&gt; <BR>&lt;/logic:iterate&gt; <BR>&lt;/table&gt; <BR>&lt;/body&gt; <BR>&lt;/html:html&gt; <BR><BR>建产一个转向页面 (index.jsp) <BR>&lt;%@ page contentType="text/html; charset=gb2312" %&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;Untitled Document&lt;/title&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR><BR>&lt;body&gt; <BR>&lt;% response.sendRedirect("userAction.do?action=view"); %&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>递七步:建立struts配置文件 (WEB-INF/config-struts.xml) <BR><BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <BR>&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt; <BR>&lt;struts-config&gt; <BR>&lt;form-beans&gt; <BR>&lt;form-bean name="userActionForm" type="mystruts.userActionForm" /&gt; <BR>&lt;/form-beans&gt; <BR>&lt;action-mappings&gt; <BR>&lt;action type="mystruts.userAction" scope="request" path="/userAction"&gt; <BR>&lt;forward name="view" path="/viewuser.jsp" /&gt; <BR>&lt;forward name="add" path="/adduser.jsp" /&gt; <BR>&lt;forward name="delview" path="/userAction.do?action=view" /&gt; <BR>&lt;/action&gt; <BR>&lt;action name="userActionForm" type="mystruts.user1Action" scope="request" path="/user1Action"&gt; <BR>&lt;forward name="view" path="/userAction.do?action=view" /&gt; <BR>&lt;/action&gt; <BR>&lt;/action-mappings&gt; <BR>&lt;/struts-config&gt; <BR><BR>运行程序: <BR>启动tomcat <BR>启动IE 在地址栏中输入 http://localhost:8080/mystruts <BR><BR>OK..... </P><img src ="http://www.blogjava.net/superwei/aggbug/17504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 10:33 <a href="http://www.blogjava.net/superwei/articles/17504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的struts应用开发（4）</title><link>http://www.blogjava.net/superwei/articles/17503.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17503.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17503.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17503.html</trackback:ping><description><![CDATA[<BR>第五步:建立Action (userAction.java) <BR><BR>这里我们将建产两个Action . <BR><BR>userAction.java 将完成以下工作. <BR>1.添加(前期数据准备. 主是提取部门资料.并传递给adduser.jsp) <BR>2.修改(前期数据准备) <BR>3.删除 <BR>4.查看所有用户资料. <BR><BR>user1Action.java 将完成以下工作 <BR>1.添加用户(对myuser表操作) <BR>2.修改用户(对myuser表操作) <BR><BR>package mystruts; <BR><BR>import org.apache.struts.action.*; <BR>import javax.servlet.http.*; <BR>import mystruts.*; <BR>import java.util.*; <BR>import java.sql.*; <BR>import ConnectionPool.*; <BR><BR>public class userAction extends Action { <BR>public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception <BR>{ <BR>userdao dao=new userdao(); <BR>HttpServletRequest request=httpServletRequest; <BR>String action; <BR>if(request.getParameter("action").equals("") || request.getParameter("action")==null) <BR>{ <BR>action="add"; <BR>} <BR>else <BR>{ <BR>action=request.getParameter("action"); <BR>} <BR>if(action.equals("add")) <BR>{ <BR>request.setAttribute("dep",this.getDep()); <BR>return (actionMapping.findForward("add")); <BR>} <BR>if(action.equals("edit")) <BR>{ <BR>String key=request.getParameter("key"); <BR>request.setAttribute("dep",this.getDep()); <BR>request.setAttribute("userActionForm",dao.getUser(key)); <BR>return (actionMapping.findForward("add")); <BR>} <BR>if(action.equals("del")) <BR>{ <BR>String key=request.getParameter("key"); <BR>dao.delUser(key); <BR>return (actionMapping.findForward("delview")); <BR>} <BR>if(action.equals("view")) <BR>{ <BR>request.setAttribute("rs",dao.getAlluser()); <BR>return (actionMapping.findForward("view")); <BR>} <BR><BR>return null; <BR>} <BR>//--------------------------------------------- <BR>public Collection getDep() <BR>{ <BR>getDbConnection db=new getDbConnection(); <BR>Connection con=db.getCon(); <BR>ResultSet rs=null; <BR><BR>PreparedStatement ps = null; <BR><BR>ArrayList rslist = new ArrayList(); <BR><BR>String sql="select * from mydep"; <BR>try { <BR>ps = con.prepareStatement(sql); <BR>rs=ps.executeQuery(); <BR>while(rs.next()) <BR>{ <BR>HashMap rscol = new HashMap(); <BR>rscol.put("id",rs.getString("dep_id")); <BR>rscol.put("name1",rs.getString("dep_name")); <BR>rslist.add(rscol); <BR>} <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>return rslist; <BR>} <BR>} <BR><BR><BR><BR>package mystruts; <BR><BR>import org.apache.struts.action.*; <BR>import javax.servlet.http.*; <BR><BR>public class user1Action extends Action { <BR>public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception <BR>{ <BR>userActionForm uaf = (userActionForm) actionForm; <BR>if(uaf.getAction().equals("add")) <BR>{ <BR>new userdao().userInsert(uaf); <BR>return (actionMapping.findForward("view")); <BR>} <BR>if(uaf.getAction().equals("edit")) <BR>{ <BR>new userdao().userUpdate(uaf); <BR>return (actionMapping.findForward("view")); <BR>} <BR>return null; <BR>} <BR>}<img src ="http://www.blogjava.net/superwei/aggbug/17503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 10:32 <a href="http://www.blogjava.net/superwei/articles/17503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的struts应用开发（3）</title><link>http://www.blogjava.net/superwei/articles/17502.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17502.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17502.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17502.html</trackback:ping><description><![CDATA[第四步:建立数据库操作对象 (完成对表的增删修改与查询) <BR><BR>package mystruts; <BR><BR>import java.sql.*; <BR>import ConnectionPool.*; <BR>import java.util.*; <BR><BR>public class userdao { <BR>getDbConnection db=null; <BR>Connection con=null; <BR><BR>public userdao() { <BR>} <BR>//------------------------------------------------------------------- <BR>public void userInsert(userActionForm uaf1) <BR>{ <BR>db=new getDbConnection(); <BR>con=db.getCon(); <BR>userActionForm uaf=uaf1; <BR>PreparedStatement ps = null; <BR>String sql="insert into myuser (user_id,user_name,dep,tel) values(?,?,?,?)"; <BR>try { <BR><BR>ps = con.prepareStatement(sql); <BR>ps.setString(1,uaf.getUser_id()); <BR>ps.setString(2,uaf.getUser_name()); <BR>ps.setString(3,uaf.getDep()); <BR>ps.setString(4,uaf.getTel()); <BR>ps.executeUpdate(); <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>} <BR>//--------------------------------------------- <BR>public void userUpdate(userActionForm uaf1) <BR>{ <BR>db=new getDbConnection(); <BR>con=db.getCon(); <BR>userActionForm uaf=uaf1; <BR>PreparedStatement ps = null; <BR>String sql="update myuser set user_name=?,dep=?,tel=? where user_id=?"; <BR>try { <BR><BR>ps = con.prepareStatement(sql); <BR>ps.setString(1,uaf.getUser_name()); <BR>ps.setString(2,uaf.getDep()); <BR>ps.setString(3,uaf.getTel()); <BR>ps.setString(4,uaf.getUser_id()); <BR>ps.executeUpdate(); <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>} <BR>//--------------------------------------------- <BR>public userActionForm getUser(String key) <BR>{ <BR>db=new getDbConnection(); <BR>con=db.getCon(); <BR>ResultSet rs=null; <BR>userActionForm uaf=new userActionForm(); <BR>PreparedStatement ps = null; <BR>String sql="select * from myuser where user_id=?"; <BR>try { <BR>ps = con.prepareStatement(sql); <BR>ps.setString(1,key.trim()); <BR>rs=ps.executeQuery(); <BR>if(rs.next()) <BR>{ <BR>uaf.setUser_id(rs.getString("user_id")); <BR>uaf.setUser_name(rs.getString("user_name")); <BR>uaf.setDep(rs.getString("dep")); <BR>uaf.setTel(rs.getString("tel")); <BR>uaf.setAction("edit"); <BR>} <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>System.out.println("mod"+key); <BR>return uaf; <BR>} <BR>//---------------------------------------- <BR>public void delUser(String key) <BR>{ <BR>db=new getDbConnection(); <BR>con=db.getCon(); <BR>PreparedStatement ps = null; <BR>String sql="delete from myuser where user_id=?"; <BR>try { <BR>ps = con.prepareStatement(sql); <BR>ps.setString(1,key.trim()); <BR>ps.executeUpdate(); <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>System.out.println("del"+key); <BR>} <BR>//---------------------------------- <BR>public Collection getAlluser() <BR>{ <BR>db=new getDbConnection(); <BR>con=db.getCon(); <BR>ResultSet rs=null; <BR>userActionForm uaf=new userActionForm(); <BR>PreparedStatement ps = null; <BR><BR>ArrayList rslist = new ArrayList(); <BR><BR>String sql="select * from myuser u,mydep d where u.dep=d.dep_id"; <BR>try { <BR>ps = con.prepareStatement(sql); <BR>rs=ps.executeQuery(); <BR>while(rs.next()) <BR>{ <BR>HashMap rscol = new HashMap(); <BR>rscol.put("user_id",rs.getString("user_id")); <BR>rscol.put("user_name",rs.getString("user_name")); <BR>rscol.put("dep",rs.getString("dep")); <BR>rscol.put("dep_name",rs.getString("dep_name")); <BR>rscol.put("tel",rs.getString("tel")); <BR>rslist.add(rscol); <BR>} <BR>} <BR>catch (SQLException e) <BR>{ <BR>System.out.println("sql error"); <BR>} <BR>finally <BR>{ <BR>try{ <BR>con.close(); <BR>db.d_close(); <BR>} <BR>catch(Exception e) {} <BR>} <BR>return rslist; <BR>} <BR>//---------------------------------- <BR>} <img src ="http://www.blogjava.net/superwei/aggbug/17502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 10:31 <a href="http://www.blogjava.net/superwei/articles/17502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的struts应用开发（2）</title><link>http://www.blogjava.net/superwei/articles/17501.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17501.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17501.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17501.html</trackback:ping><description><![CDATA[第二步: 配置数据库 <BR><BR>1.首先创建数据联接bean, 并打包到 ConnectionPool, 它将从我们配置的联接池中取得可用联接. <BR><BR>// Java Document <BR>package ConnectionPool; <BR>import javax.naming.*; <BR>import javax.sql.*; <BR>import java.sql.*; <BR>import java.io.*; <BR>import java.util.*; <BR><BR>public class getDbConnection { <BR><BR>Connection conn; <BR>Statement stmt; <BR>ResultSet rs=null; <BR><BR>String foo = "Not Connected"; <BR>int bar = -1; <BR><BR>public getDbConnection() { <BR>try{ <BR>Context ctx = new InitialContext(); <BR>if(ctx == null ) <BR>throw new Exception("Boom - No Context"); <BR><BR>DataSource ds = <BR>(DataSource)ctx.lookup( <BR>"java:comp/env/jdbc/TestDB"); <BR><BR>if (ds != null) { <BR>conn = ds.getConnection(); <BR><BR>} <BR>} <BR>catch(Exception e) { <BR>e.printStackTrace(); <BR>} <BR>} <BR><BR>public Connection getCon() <BR>{ <BR>return conn; <BR>} <BR><BR><BR>public void d_close() throws SQLException <BR>{ <BR>if (rs != null) { <BR>try { rs.close(); } catch (SQLException e) { ; } <BR>rs = null; <BR>} <BR>if (stmt != null) { <BR>try { stmt.close(); } catch (SQLException e) { ; } <BR>stmt = null; <BR>} <BR>if (conn != null) { <BR>try { conn.close(); } catch (SQLException e) { ; } <BR>conn = null; <BR>} <BR><BR>} <BR><BR>protected void finalize() throws Throwable <BR>{ <BR>try { d_close(); } catch (SQLException e) { ; } <BR>} <BR><BR>} <BR><BR>2.创建数据库. <BR><BR>数据库名: mystruts <BR><BR>部门表: mydep <BR><BR>_______________________________________ <BR>dep_id dep_name <BR>_______________________________________ <BR>1 dep1 <BR>2 dep2 <BR>3 dep3 <BR>4 dep4 <BR>_______________________________________ <BR><BR>用户表: myuser <BR>______________________________________________ <BR>user_id user_name dep tel <BR>______________________________________________ <BR>1 jack 1 0769-2454042 <BR>2 max 2 0769-2454043 <BR>______________________________________________ <BR><BR>(注: 以上字段为了测试方便. 全部使用字符型) <BR><BR><BR>第三步: 创建ActionForm (userActionForm.java) <BR><BR>package mystruts; //请打包到mystruts下. <BR><BR>import org.apache.struts.action.*; <BR>import javax.servlet.http.*; <BR><BR>public class userActionForm extends ActionForm { <BR>private String action="add"; <BR>private String dep; <BR>private String tel; <BR>private String user_id; <BR>private String user_name; <BR>public String getAction() { <BR>return action; <BR>} <BR>public void setAction(String action) { <BR>this.action = action; <BR>} <BR>public String getDep() { <BR>return dep; <BR>} <BR>public void setDep(String dep) { <BR>this.dep = dep; <BR>} <BR>public String getTel() { <BR>return tel; <BR>} <BR>public void setTel(String tel) { <BR>this.tel = tel; <BR>} <BR>public String getUser_id() { <BR>return user_id; <BR>} <BR>public void setUser_id(String user_id) { <BR>this.user_id = user_id; <BR>} <BR>public String getUser_name() { <BR>return user_name; <BR>} <BR>public void setUser_name(String user_name) { <BR>this.user_name = user_name; <BR>} <BR>public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { <BR><BR>return null; <BR>} <BR>public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) { <BR>} <BR>} <img src ="http://www.blogjava.net/superwei/aggbug/17501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 10:30 <a href="http://www.blogjava.net/superwei/articles/17501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的struts应用开发（1）</title><link>http://www.blogjava.net/superwei/articles/17499.html</link><dc:creator>小辞猬</dc:creator><author>小辞猬</author><pubDate>Mon, 31 Oct 2005 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/superwei/articles/17499.html</guid><wfw:comment>http://www.blogjava.net/superwei/comments/17499.html</wfw:comment><comments>http://www.blogjava.net/superwei/articles/17499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/superwei/comments/commentRss/17499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/superwei/services/trackbacks/17499.html</trackback:ping><description><![CDATA[(mystruts应用)目录结构 <BR>mystruts <BR>|-WEB-INF <BR>| |- lib <BR>| | |- struts.jar <BR>| |- classes <BR>| | |- ConnectionPool <BR>| | | |- getDbConnection.class <BR>| | |-mystruts <BR>| | |- user1Action.class <BR>| | |- userAction.class <BR>| | |- userActionForm.class <BR>| | |- userdao.class <BR>| |-struts-bean.tld <BR>| |-struts-config.xml <BR>| |-struts-html.tld <BR>| |-struts-logic.tld <BR>| |-struts-template.tld <BR>|-adduser.jsp <BR>|-index.jsp <BR>|-viewuser.jsp <BR><BR>第一步: 开发环境配置 <BR><BR>(如果你还没有相关软件. 请到http://www.apache.org 下载) <BR><BR>tomcat5.0 配置 (建立一个 mystruts 应用, 并拷贝相关文件) <BR><BR>请在你的tomcat安装目录中找到\conf\Catalina\localhost 子目录. 新建 mystruts.xml 文件 <BR>文件内容如下. 在这个文件中. 我们将配置一个联接池.请把相关的驱动.数据库用户,密码改成你自己的本机配置. <BR>并把JDBC驱动拷贝一份到 Tomcat 5.0\common\lib 目录下. 请把 struts.jar \mystruts\WEB-INF\lib 目录下. <BR><BR><Context path="/mystruts" docBase="D:\www\mystruts\mystruts\mystruts" debug="0" privileged="true"> <BR><BR><Resource name="jdbc/TestDB" <BR>auth="Container" <BR>type="javax.sql.DataSource"/> <BR><BR><ResourceParams name="jdbc/TestDB"> <BR><parameter> <BR><name>factory</name> <BR><value>org.apache.commons.dbcp.BasicDataSourceFactory</value> <BR></parameter> <BR><BR><parameter> <BR><name>maxActive</name> <BR><value>10</value> <BR></parameter> <BR><BR><parameter> <BR><name>maxIdle</name> <BR><value>5</value> <BR></parameter> <BR><BR><parameter> <BR><name>maxWait</name> <BR><value>10000</value> <BR></parameter> <BR><BR><parameter> <BR><name>username</name> <BR><value>sa</value> <BR></parameter> <BR><parameter> <BR><name>password</name> <BR><value>test</value> <BR></parameter> <BR><BR><parameter> <BR><name>driverClassName</name> <BR><value>net.sourceforge.jtds.jdbc.Driver</value> <BR></parameter> <BR><BR><parameter> <BR><name>url</name> <BR><value>jdbc:jtds:sqlserver://192.168.10.223:1433/mystruts</value> <BR></parameter> <BR></ResourceParams> <BR></Context> <BR><BR>WEB-INF/web.xml (加入struts标记库的支持) <BR><BR><?xml version="1.0" encoding="UTF-8"?> <BR><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <BR><web-app> <BR><servlet> <BR><servlet-name>action</servlet-name> <BR><servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <BR><init-param> <BR><param-name>debug</param-name> <BR><param-value>2</param-value> <BR></init-param> <BR><init-param> <BR><param-name>config</param-name> <BR><param-value>/WEB-INF/struts-config.xml</param-value> <BR></init-param> <BR><load-on-startup>2</load-on-startup> <BR></servlet> <BR><servlet-mapping> <BR><servlet-name>action</servlet-name> <BR><url-pattern>*.do</url-pattern> <BR></servlet-mapping> <BR><taglib> <BR><taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <BR><taglib-location>/WEB-INF/struts-bean.tld</taglib-location> <BR></taglib> <BR><taglib> <BR><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri> <BR><taglib-location>/WEB-INF/struts-html.tld</taglib-location> <BR></taglib> <BR><taglib> <BR><taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri> <BR><taglib-location>/WEB-INF/struts-logic.tld</taglib-location> <BR></taglib> <BR><taglib> <BR><taglib-uri>/WEB-INF/struts-template.tld</taglib-uri> <BR><taglib-location>/WEB-INF/struts-template.tld</taglib-location> <BR></taglib> <BR></web-app><img src ="http://www.blogjava.net/superwei/aggbug/17499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/superwei/" target="_blank">小辞猬</a> 2005-10-31 10:23 <a href="http://www.blogjava.net/superwei/articles/17499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>