﻿<?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-WEB2.0开发</title><link>http://www.blogjava.net/yaominxi/</link><description>心态决定行为，行为决定习惯，习惯决定命运  </description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 07:56:01 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 07:56:01 GMT</pubDate><ttl>60</ttl><item><title>华为招聘ERP实施、ORACLE开发、软件开发人员</title><link>http://www.blogjava.net/yaominxi/archive/2007/10/03/150299.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 03 Oct 2007 13:19:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/10/03/150299.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/150299.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/10/03/150299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/150299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/150299.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为支持公司业务的快速发展，华为IT要大量引进人才。目前招聘的基本要求如下：<br />
&nbsp;<br />
&nbsp;&nbsp; 1、空缺岗位：ERP实施、ORACLE开发、软件开发等<br />
&nbsp;<br />
&nbsp;&nbsp; 2、基本条件：本科3年以上工作经验，硕士2年以上工作经验，相关毕业、学位、英语证书(4级及以上)</p>
<p>&nbsp;&nbsp; PS.只针对社招人员</p>
<p>&nbsp;&nbsp; 若您或您的朋友有这方面的意向,请提供简历到:yaominxi@huawei.com</p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/150299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-10-03 21:19 <a href="http://www.blogjava.net/yaominxi/archive/2007/10/03/150299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate入门 - 基础配置</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/08/116028.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Tue, 08 May 2007 11:30:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/08/116028.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/116028.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/08/116028.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/116028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/116028.html</trackback:ping><description><![CDATA[
<table cellpadding="0" width="100%" cellspacing="0" border="0">
<tbody>
<tr>
<td>
<table cellpadding="0" bgcolor="#FFFFFF" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
<td bgcolor="#EEEEEE" colspan="3" align="middle" height="40" width="100%" class="title1"><strong>Hibernate入门 - 基础配置</strong></td>
</tr>
<tr>
<td width="100%" align="middle" bgcolor="#EEEEEE"><a href="mailto:thinking-org@email.com">thinking_org</a> 原创 更新：2006-07-07 20:39:43 版本: 1.0</td>
</tr>
</tbody>
</table>
</td>
</tr>
<!-- end of article title -->
<tr>
<td width="100%" align="middle" valign="top"><!--start of article content -->
<table width="98%" border="0" class="rtable">
<tbody>
<tr>
<td width="100%" align="left" class="text"><br/>Hibernate配置文件可以有两种格式，一种是 hibernate.properties ，另一种是 hibernate.cfg.xml<br/><br/>后者稍微方便一些，当增加hbm映射文件的时候，可以直接在 hibernate.cfg.xml 里面增加，不必像 hibernate.properties 必须在初始化代码中加入。<br/><br/>但不管怎么说，两种的配置项都是一样的，下面详细介绍：<br/><br/>在Hibernate的src目录下有一个 hibernate.properties 模板，我们不必自己从头写，修改模板就可以了:)<br/><br/><br/>hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'<br/><br/>这个配置意思是当你在Hibernate里面输入true的时候，Hibernate会转化为1插入数据库，当你在Hibernate里面输入false的时候，Hibernate会转化为0插入数据库，后面的Y，N同理。<br/><br/>对于某些数据库，例如Oracle来说，没有boolean数据类型，就是采用1代表true，0代表false，因此使用这个配置在Hibernate里面直接用true/false会非常直观。<br/><br/><br/>hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/>hibernate.connection.driver_class com.mysql.jdbc.Driver<br/>hibernate.connection.url jdbc:mysql:///test<br/>hibernate.connection.username root<br/>hibernate.connection.password<br/><br/>这是一个连接MySQL数据库的例子，很直观，不必解释，不同的数据库的连接参数模板中全部给出了。<br/><br/><br/>hibernate.connection.pool_size 1<br/>hibernate.statement_cache.size 25<br/><br/>这是Hibernate自带的连接池的配置参数，在默认情况下将采用。意义很直观，不多解释。<br/><br/>只是提醒一点，Hibernate这个连接池是非常原始非常简单的连接池，如果你在项目中用Hibernate的话，建议你首选App Server的连接池，次选Hibernate带的DBCP连接池。自带的连接池应该做为末选。<br/><br/>如果你采用DBCP连接池，除了要配置DBCP连接池以外，还需要取消掉下行的注释：<br/><br/>hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider<br/><br/>其它的连接池同理。<br/><br/>如果采用App Server的连接池，假设App Server连接池的DataSource的JNDI名称为"mypool"的话，配置应该如下：<br/><br/>hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/>hibernate.connection.datasource mypool<br/>hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider<br/><br/>其它参数就不必写了，因为已经在App Server配置连接池的时候指定好了。<br/><br/>如果你不是在App Server环境中使用Hibernate，例如远程客户端程序，但是你又想用App Server的数据库连接池，那么你还需要配置JNDI的参数，例如Hibernate连接远程Weblogic上的数据库连接池：<br/><br/>hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/>hibernate.connection.datasource mypool<br/>hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider<br/>hibernate.jndi.class weblogic.jndi.WLInitialContextFactory<br/>hibernate.jndi.url t3://servername:7001/<br/><br/><br/>最后，如果你需要在EJB或者JTA中使用Hibernate，需要取消下行的注释：<br/><br/>hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory<br/><br/>杂项配置：<br/><br/><br/>hibernate.show_sql false<br/><br/>是否将Hibernate发送给数据库的sql显示出来，这是一个非常非常有用处的功能。当你在调试Hibernate的时候，让Hibernate打印sql语句，可以帮助你迅速解决问题。<br/><br/><br/>#hibernate.connection.isolation 4<br/><br/>指定数据库的隔离级别，往往不同的数据库有自己定义的隔离级别，未必是Hibernate的设置所能更改的，所以也不必去管它了。<br/><br/><br/>hibernate.jdbc.fetch_size 50<br/>hibernate.jdbc.batch_size 25<br/><br/>这两个选项非常非常非常重要！！！将严重影响Hibernate的CRUD性能!<br/><br/>C = create, R = read, U = update, D = delete<br/><br/>Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。<br/><br/>例如一次查询1万条记录，对于Oracle的JDBC驱动来说，是不会1次性把1万条取出来的，而只会取出Fetch Size条数，当纪录集遍历完了这些记录以后，再去数据库取Fetch Size条数据。<br/><br/>因此大大节省了无谓的内存消耗。当然Fetch Size设的越大，读数据库的次数越少，速度越快；Fetch Size越小，读数据库的次数越多，速度越慢。<br/><br/>这有点像平时我们写程序写硬盘文件一样，设立一个Buffer，每次写入Buffer，等Buffer满了以后，一次写入硬盘，道理相同。<br/><br/>Oracle数据库的JDBC驱动默认的Fetch Size=10，是一个非常保守的设定，根据我的测试，当Fetch Size=50的时候，性能会提升1倍之多，当Fetch Size=100，性能还能继续提升20%，Fetch Size继续增大，性能提升的就不显著了。<br/><br/>因此我建议使用Oracle的一定要将Fetch Size设到50。<br/><br/>不过并不是所有的数据库都支持Fetch Size特性，例如MySQL就不支持。<br/><br/>MySQL就像我上面说的那种最坏的情况，他总是一下就把1万条记录完全取出来，内存消耗会非常非常惊人！这个情况就没有什么好办法了 :(<br/><br/>Batch Size是设定对数据库进行批量删除，批量更新和批量插入的时候的批次大小，有点相当于设置Buffer缓冲区大小的意思。<br/><br/>Batch Size越大，批量操作的向数据库发送sql的次数越少，速度就越快。我做的一个测试结果是当Batch Size=0的时候，使用Hibernate对Oracle数据库删除1万条记录需要25秒，Batch Size = 50的时候，删除仅仅需要5秒！！！<br/><br/>可见有多么大的性能提升！很多人做Hibernate和JDBC的插入性能测试会奇怪的发现Hibernate速度至少是JDBC的两倍，就是因为Hibernate使用了Batch Insert，而他们写的JDBC没有使用Batch的缘故。<br/><br/>以我的经验来看，Oracle数据库 Batch Size = 30 的时候比较合适，50也不错，性能会继续提升，50以上，性能提升的非常微弱，反而消耗内存更加多，就没有必要了。<br/><br/><br/>#hibernate.jdbc.use_scrollable_resultset true<br/><br/>设定是否可以使用JDBC2.0规范的可滚动结果集，这对Hibernate的分页显示有一定的作用，默认就好了。<br/><br/><br/>#hibernate.cglib.use_reflection_optimizer false<br/><br/>默认打开，启用cglib反射优化。cglib是用来在Hibernate中动态生成PO字节码的，打开优化可以加快字节码构造的速度。<br/><br/>不过，当你在调试程序过程中，特别是和proxy，lazy loading相关的应用中，代码出错，但是出错提示信息有语焉不详，那么你可以把cglib优化关掉，这样Hibernate会输出比较详细的调试信息，帮助你debug<br/></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.blogjava.net/yaominxi/aggbug/116028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-08 19:30 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/08/116028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>电子纸：报纸替代品</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/08/116027.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Tue, 08 May 2007 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/08/116027.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/116027.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/08/116027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/116027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/116027.html</trackback:ping><description><![CDATA[
<table style="TABLE-LAYOUT: fixed" cellspacing="0" align="center" width="580" cellpadding="0" border="0">
<tbody>
<tr>
<td width="578" style="WORD-WRAP: break-word" colspan="2" align="middle" valign="bottom"><strong>电子纸：报纸替代品？<br/></strong></td>
</tr>
<tr>
<td width="578" align="middle" colspan="2">
<hr width="100%" align="center" noshade="noshade" size="1"/></td>
</tr>
<tr>
<td width="578" align="middle" class="NEWSREADME" colspan="2">时间：2005-3-22 10:36:38 来源：全球财经观察 作者：朱品燕 阅读3271次</td>
</tr>
<tr>
<td width="578" align="middle" colspan="2">
<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed" border="0" align="center">
<tbody>
<tr>
<td height="40"/>
</tr>
<tr>
<td style="WORD-WRAP: break-word" class="news">
<p>2004 年11月30日，世界各国科学家投入研究已有近四十年历史的电子纸领域，又传来了一个好消息。日本日立公司新近成功开发出了一种超薄的电子纸，这种纸张显示尺寸为16.2厘米×18.1厘米，厚度仅有3毫米，样品重量100克。与一般竞争对手开发的只能显示两色的电子纸不同，日立的该款产品，其液晶显示器已经达到能同时显示64色的水平。最令人惊讶的是，它可以直接贴在墙上，并且可以根据遥控器的指挥而随意改变显示的图像和信息。日立公司称，这款产品可以用于在墙上显示各种内容，比如家庭照片、工作计划表和菜谱等。</p>
<p><strong>技术流派殊途同归</strong></p>
<p>所谓"电子纸"（Electronic Papers），其实就是一种外观像纸或像投影片的新型的超薄平面监示器，在各种场合（尤其是户外）的文字辨认性上，优于常规的LCD，且能够与报纸相比拟。</p>
<p>"电子纸"概念兴起于1980年代前后，彼时，一大批科学家开始投入此领域的研究，在当时研究者的理想中，该种纸张将可以逐渐代替传统纸张，既便于文字阅读，又可以改写内容，反复使用。到了本世纪初，随着技术研究呈现出若干可喜的回报，有人开始大胆预测，电子纸会在未来三五年内达到大规模应用阶段，而10 年左右的时间，传统平面媒体业将会因电子纸技术的普及而发生颠覆性的变革。</p>
<p>目前的电子纸大致可分液晶型以及非液晶型两大类。液晶型产品多半是由LCD厂商所开发出，以不使用偏光片或彩色滤光片的方式降低监视器厚度，或是采用特殊的液晶材料及显示方式达到目标。其中代表厂商是Fuji Xerox和大日本INK公司。而非液晶型领域较知名者为E-Ink公司的电子墨水（Electronic Ink）监视器，以及SONY的电解析出型电子监视器。</p>
<p>在电子纸的研制领域，成立于1997年的美国E-Ink公司的地位显得首屈一指，这家隶属于麻省理工学院的公司的电子超薄显示器技术代表着目前业内的最高水准。公司最新的成果是一种应用于电子报纸、可穿戴式电脑屏幕、便携信息终端屏幕、电子词典、电子图书和智慧型身份辨识卡的电子装置。公司发言人表示：这是至今为止世界上最完美的电子纸张产品，只有0.3毫米厚，可以任意弯曲而不发生字面的扭曲；支持以无线的方式下载文本内容，如果必要的话，可以随时进行阅读内容的网络刷新和内容改写。</p>
<p>E-Ink公司所研发的电子纸张，表面看起来与普通纸张十分相似，可以像报纸一样被折叠卷起，但实际上却有天壤之别。它上面涂有一种由无数微小的透明颗粒组成的电子墨水，颗粒直径只有人的头发丝的一半大小。这种微小颗粒内包含着黑色的染料和一些更为微小的白色粒子，染料使包裹着它的透明颗粒呈黑色，那些更为微小的白色粒子能够感应电荷而朝不同的方向运动，当它们集中向某一个方向运动时，就能使原本看起来呈黑色的颗粒的某一面变成白色。根据这一原理，当这种电子墨水被涂到纸、布或其他平面物体上后，人们只要适当地对它予以电击，就能使数以亿计的颗粒变幻颜色，从而根据人们的设定不断地改变所显现的图案和文字，这便是电子墨水的神奇功效。当然，电子墨水的颜色并不局限于黑白两色，只要调整颗粒内的染料和微型粒子的颜色，便能够使电子墨水展现出五彩缤纷的色彩和图案来。由于此种监视器具有记忆性，因此只有画素颜色变化时（例如从黑转到白）才耗电，关电源后显示幕上画面仍可保留，因此非常省电。2颗AA电池即可供数周以上长期使用。</p>
<p>而SONY的电子纸张发展，则以显示静态画面为主，主要是利用银（Ag）在电子化学反应过程中，在透明电极上析出，或于固态电解质中溶解的方式达到呈现黑与百的效果。 这一技术最主要的贡献将在于提高电子纸的反射率。</p>
<p>虽然当前有许多厂商进行电子纸相关技术研发，发展方向亦相当分歧，但我们已经可以从中归结出现代电子纸的产品特性：一为较轻、较薄，比当前通用TFT LCD、STN LCD模块为薄。二为大多数具有资料保存性，只有画面异动时（例如由黑转到白）才耗电，电源关闭后信息仍可留存在监视器上，因此比TFT LCD、STN LCD更为省电。三为反射率高于反射式LCD，更接近报纸水平，有些厂商的产品甚至可达影印用纸水平（因此肉眼对其所显示的文字内容更易辨识）。四为对比度优于一般报纸。五为初期以黑白方式显示文字内容为主，较缺乏全彩或动画功能，应答速度普遍较TFT LCD、STN LCD慢。六为部分电子纸监视器具可挠性或是可以卷曲。</p>
<p><strong>蕴含巨大商机?</strong></p>
<p>电子纸张属于一种新兴技术，各厂商皆在摸索之中，主要市场尚待确认。按照目前业界比较一致的观点来说，接下来两三年仍然属于电子纸的技术成熟阶段：更轻更薄，由单色到多色，由静态到动态。其正式的市场起飞可能要等到2007年或更晚。届时，信用卡、可贴附在衣服或公文包上、具PDA功能的电子纸张，可能是未来应用的发展方向。但初期应用主要还是以电子海报、超薄电子书为主。依照各厂商产品发展计划，未来不但可以看到随身携带的电子报纸、电子书、电子速记本外，电子纸张亦可能成为捷运、公车或一般商家的平面广告载具。当前在上述场所见到的平面印刷广告，将来有可能出现全新风貌。比如当你拥有一张报社发放的电子报纸阅读器的话，那么每天的报纸内容将会以无线的方式发送到你的面前.</p>
<p>未来对电子纸需求有正面效益的一个观察重点，是全球用纸量在近十年来激增，背后因素当然是信息量产出的爆炸，除报纸以外，各式各样的杂志、宣传海报以及计算机印出数量均有大幅增加情形。而需求数量庞大的传统纸张对森林的威胁使环保人士感到愤怒。此一背景对于电子纸监视器有利，因为其有助于节约用纸量。但相应的问题也随之而来，与报纸、杂志、海报等纸张类媒体相比，目前的电子纸因成本过高而缺乏长远的竞争力。同时，大部分的电子纸还是不够薄，反射率不够高。另一方面，对于所有的显示用电子纸来说，目前最致命的缺陷是无法表达足够连贯的视频画面--市面上普通的LCD的最短画面响应时间低于12ms，但即使如此，LCD仍然被指责为无法与CRT进行这方面的性能抗衡。而普通电子纸的画面响应时间将超过100 ms。如果电子纸无法对动画画面的显示有所突破，那么它被人们接受的可能就会受到极大限制。</p>
<p>诸如以上因素，因此虽然根据预测，2005年电子纸张潜在市场规模具有100亿美元商机，不过因为相关技术不成熟，有待改善空间仍大，加上厂商生产成本下降速度以及产能是否能够配合等多项问题，预估2005年实际市场规模只有预测的1/10左右。</p>
<p>幸而研究人员从未放弃过技术改善的脚步。今年3月，日本千叶大学已经开发出了厚度只有0.1毫米的电子纸产品，这是人类首次将电子纸真正在厚度上接近到了纸的范畴。而早在2002年上半，SONY已展示了一款比报纸反射率（约60%）更高的电子纸张，反射率达到73%，纯白表现程度与影印纸相当，有助提高消费者观看意愿。至于动态图像的支持，九州大学与普利斯通的研究小组开发的使用粉状墨的电子纸，相应速度目前为世界最高，已经到达0.2ms。</p>
<p>由此我们完全可以乐观地推断，随着科学技术的不断完善，电子纸时代也将很快到来。事实上，尽管目前普及显得遥远，但真实的应用的确已经出现--SONY的 LIBRIe、Adobe的在线书籍商店，都是电子纸技术初期应用的最好体现。今年4月末，SONY推出了一种被称为LIBRIe的电子书产品。 LIBRIe的大小和一本普通的书差不多，但是作为一种电子产品，LIBRIe配备了USB和耳机接口，同时内置文字放大和字典查询的功能。用户可以凭借 LIBRIe提供的MS卡存储数字化的文字，也可以通过SONY开设的电子书租赁服务"Timebook Town"以月租的方式从网上下载阅读内容。这样的服务模式标志着多年来的电子纸及其下游产品已经进入了真正的实用阶段，人类的数字化生活也许要因此而翻开崭新的一页。</p>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.blogjava.net/yaominxi/aggbug/116027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-08 19:29 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/08/116027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目管理与Project2000的应用</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/08/116026.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Tue, 08 May 2007 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/08/116026.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/116026.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/08/116026.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/116026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/116026.html</trackback:ping><description><![CDATA[
<table style="TABLE-LAYOUT: fixed">
<tbody>
<tr>
<td>
<div class="cnt">
<p><strong>[前 言]：</strong>众所皆知，项目管理要做的三件大事就是：计划、组织和控制，然而如何计划、组织和控制好一个项目，不仅要求项目经理要有系统</p>
<table cellpadding="0" cellspacing="0" align="left" border="0">
<tbody>
<tr>
<td><br/></td>
</tr>
</tbody>
</table>
统的项目管理理论知识和丰富的项目经验，而且一套优秀的项目管理工具软件也很重要。有效的运用好项目管理工具，它能使我们的项目管理工作事半功倍。下面就侧重从计划的制定、计划的应用，以及计划的控制等三个方面，来谈谈如何使用Project2000这个有效的工具来帮助我们做好项目管理工作。
<p><strong>[关健词]：</strong>基准计划、比较基准工期、比较基准成本、工期差异、成本差异、BCWS、ACWP、BCWP、SV、CV等。</p>
<p><strong>一、 项目管理与Project2000的关系</strong></p>
<p>在项目管理知识体系中，包括九大知识领域（范围管理、时间管理、费用管理、质量管理、人力资源管理、沟通管理、风险管理、采购管理、综合管理）。但从项目管理辅助工具软件Project2000来说，它包含了这九大知识领域中的5大核心领域，另外4个领域需要通过其它辅助工具或人工操作来完成。包括的5大领域如下所述：</p>
<p>1、 范围管理<br/>项目管理的第一个知识领域就是"范围管理"，在项目范围中，包括两层内容：一是项<br/>目范围；二是产品范围。项目范围针对的是我们项目的目标，包括软件开发、集成、培训和项目实施等。产品范围侧重在软件的需求范围，可以理解为对项目范围的一个重要补充。两者有一定关联，但也各有侧重，只有这两者相加，才构成了我们完整的项目范围。然而在Project2000工具中，指的项目范围是指第一种,结果输出就是WBS分解。</p>
<p>2、 时间管理<br/>时间管理也称进度管理，在Project2000中，它提供了工期估计、工作搭接关系、进度安排、进度控制等基本功能。还能够自动计算出关健路径，可以很方便的设置我们的里程碑控制点，并能够实现项目的动态跟踪。还提供了多种时间的管理方法，甘特图、网络图、日历图等。应该说时间管理，是Project 2000中最强大的功能。</p>
<p>3、 费用管理<br/>在费用管理中，Project2000中采用的是"自底向上费用估算"的技术，由于它是依赖每个WBS任务的估算，所以使得费用估算更为准确。并且它还能与EXCEL等进行结合，生成费用曲线图和挣得值趋势图。</p>
<p>4、 人力资源管理<br/>在人力资源管理中，Project2000提供了人力资源的规划、人力资源责任矩阵、资源需求直方图、资源均衡等，它能帮我们做好资源的分配、进行资源的工作量、成本和工时的统计。</p>
<p>5、 整合管理<br/>项目管理的整合管理就是对于整个项目的范围、时间、费用、资源等进行综合管理和协调，在Project2000中，它能根据范围、时间、资源的变化自动进行相应计算和调整。</p>
<p><strong>二、 Project2000使用前的环境设置</strong></p>
<p>在进行计划编制前，需先设置好Project2000的使用环境，这样可以更方便我们计划编<br/>制时的操作。环境设置一要根据自己的习惯，二是要根据项目的实际情况。下面介绍几种常用的环境设置项。</p>
<p>* 首先，要设置项目摘要信息，在摘要信息中需输入该项目的标题、项目经理和单位等信息。主要是便于打印时显示的信息。<br/>操作方法：选中菜单 文件－》属性－》摘要信息－》。<br/>* 设置项目的日历，默认从星期日开始，中国人的习惯一般是从周一开始。<br/>操作方法：选中菜单 工具－》选项－》日历－》每周开始于－》。<br/>* 设置任务类型，默认为"固定工时"，固定工时的含义是当一项任务分配给一个人做是10天，当增加一人时，则工期自动变为5天。我们的操作习惯应该是人员增加时，原工期一般要求仍不变。所以需选择为"固定工期"。<br/>操作方法：选中菜单 工具－》选项－》日程 －》默认任务类型－》。<br/>* 设置WBS编号，默认无WBS编号，为了计划阅读清晰，建议设置大纲编号作为WBS编号。<br/>操作方法：选中菜单 工具－》选项－》视图－》选中显示大纲编号。<br/>* 设置工作时间，默认是按标准日，也即周六、周日休息。行政日指不但考虑周六、周日休息，而且考虑到中国的传统节假日（如国庆、五一等）。我们一般要根据项目的具体情况，如该项目比较工期比较紧，项目组要求每周六加班，周日休息，那么就需将周六设置为"非默认工作时间"。<br/>操作方法：选中菜单 工具－》更改工作时间－》选中对象－》非默认工作时间。<br/>* 设置条形式样式，可根据自己的习惯，设定关健任务、非关健任务、进度条、里程碑为不同的样式和颜色。</p>
<p>操作方法：选中菜单 格式－》条形图样式－》。</p>
<p>说明：建议环境设置可以设置为一个模板，这样就无需每个项目都进行设置一下，提高计划编制效率。</p>
<p><strong>三、 如何使用Project 2000来制定计划</strong></p>
<p>在项目管理知识体系中，项目的计划包括4个核心计划和4个辅助计划，4个核心计划为：范围计划、人力资源计划、进度计划和费用计划；4个辅助计划为：质量计划、沟通计划、风险计划和采购计划。利用Project2000工具，能很方便的完成4个核心计划的制定。</p>
<p>为了使我们能够更好的掌握如何运用Project2000工具来做计划的，在这里将上述讲述的4个核心计划，分解成8个步骤来讲述，并在每个步骤当中，给予案例，这样更便于我们的理解和操作。</p>
<p><strong>案例背景描述：</strong></p>
<p>某企业决定开发一套项目管理软件。<br/>该软件的主要功能包括：项目及工作信息的录入、项目网络计划图的绘制、项目时间计划的安排、甘特图计划的制定、项目执行信息的录入与分析及各种计划报表的输出等。该企业准备投入25万元进行该系统的开发，时间要求是20～25周。该软件项目的计划开始时间是2002.1.1日，企业要求软件正式验收前需要试运行４周以上的时间，并根据试运行情况进行适当修改。</p>
<p>1、 目标确定<br/>项目目标就是实施项目所要达到的期望结果，是衡量项目成功与否的标</p>
<table cellpadding="0" cellspacing="0" align="left" border="0">
<tbody>
<tr>
<td>
<div name="embedAd">
<table cellpadding="0" cellspacing="0" style="MARGIN: 5px 8px 3px 7px" border="0">
<tbody>
<tr>
<td/>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
标准。项目目标<br/>包括约束性目标和成果性目标。约束性目标主要指进度、费用、质量三重约束，成果性目标主要指要完成的产品。
<p>项目目标的描述必须明确、具体、尽量定量描述，需满足Smart原则：<br/>* Specific 明确<br/>* Measurable 可衡量性<br/>* Achievable 虽然极具挑战性, 但是有计划完成<br/>* Result Driven 面向成果<br/>* Time 具时间性</p>
<p>案例示范：目标描述：<br/>a、 总费用：在25万的费用预算内；<br/>b、 时间：从2002年1月1日开始，至2002年6月27日完成，总工期24周；<br/>c、 交付物：开发一套功能齐全的项目管理软件、其中主要功能为：项目及工作信息的录入；项目网络计划图的绘制；项目时间计划的安排；甘特图计划的制定；项目执行信息的录入与分析及各种计划报表的输出等。</p>
<p>说明：在Project2000中，没有特定的项目目标书面位置，可以专门采用Word文档进行描述，也可直接在Project2000中的备注栏中注明。</p>
<p>2、 范围定义<br/>范围定义就是将项目可交付成果分成几个小的、更易管理的单元。范围定义的结果是<br/>形成工作结构分解图（WBS）。WBS分解就是先把复杂的项目逐步分解成一层一层的要素（工作），直到具体明确为止。</p>
<p>WBS分解的步骤：<br/>* 总项目<br/>* 子项目或主体工作任务<br/>* 主要工作任务<br/>* 次要工作任务<br/>* 具体工作包</p>
<p>WBS的表现形式：<br/>* 树形列表<br/>* 锯齿列表</p>
<p>WBS分解结果要求：<br/>* 可管理、可定量测量、可独立分配任务的；<br/>* 可以进行费用和时间的估计；<br/>* 不体现工期和活动的先后顺序；<br/>* 包括管理活动；<br/>* 分解完后需进行核对。</p>
<p>说明：WBS分解是项目计划的基础，也是最关健的。需要做的前期调研和需求分析工作。如果WBS偏差率较高，则整个计划的基本上很难执行。所以这块基石一定要打好。<br/>另外，在WBS分解过程当中，项目管理工作内容不能漏掉。</p>
<p>案例示范：<br/>在Project 2000中，WBS分解采用的是锯齿形式，WBS编码能自动生成，最多可分解<br/>为500多层，100万个WBS任务。如：<br/><img width="406" height="229" src="http://www.mypm.net/articles/pictures/2004715160542.jpg"/></p>
<p>3、 工作排序<br/>工作排序的确定涉及到各工作之间相互关系的识别和说明。任何工作的执行必须依赖于一定工作的完成，也就是说它的执行必须在某些工作完成之后才行，这就是工作的先后依赖关系。工作的先后依赖关系有两种：一种是工作之间本身存在的、无法改变的逻辑关系。如设计与开发。还有一种是组织关系，一般由管理人员根据实际情况来确定。我们要在逻辑关系的基础上再加以分析，考虑组织关系。</p>
<p>工作排序需要确定的内容：<br/>* 强制的逻辑关系的确定；<br/>* 组织关系的确定；<br/>* 外部制约关系的确定；<br/>* 实际过程中的限制和假设。</p>
<p>工作排序常用的方法：<br/>* 单代号法（AON法）<br/>* 双代号法（AOA法）</p>
<p>案例示范：<br/><img width="554" height="229" src="http://www.mypm.net/articles/pictures/2004715160645.jpg"/></p>
<p>4、 工期估计</p>
<p>工时的估计是项目计划制定的一项重要的基础工作，它直接关系到项目的总工期。如果估计的太短，那么在工作中会造成被动局面；相反，如果估计的太长，那么整个工期延长。所以说在工时估计的时候，要在考虑到各种资源、人力、物力、财力的情况下，把工作置于独立的正常状态下进行估计，要做统盘考虑，不可顾此失彼。</p>
<p>工期估计的方法：<br/>* 专家判断。依赖于专家组成员的历史经验。<br/>* 类比估计法。依赖于同类型项目的历史实际数据。<br/>说明：在人力资源尚未分配时，进行工时估计，一般以按平均资源能力进行估算。<br/><img width="462" height="214" src="http://www.mypm.net/articles/pictures/2004715160744.jpg"/></p>
<p>5、 进度安排</p>
<p>根据项目内容的分解，找出各组成要素工作的先后顺序，估计出各工作的延续时间之后，就要安排好项目的时间进度。因为在进度安排之前，我们的计划都是假设在正常情况下的计划，实际中我们的计划会受到各种因素的影响和限制，所以需要根据这些限制重新对进度进行调整。进度安排主要是要根据实际情况来考虑我们的计划。另外，在进度安排中，要将里程碑计划和关健路径计划加入。</p>
<p>进度安排的方法：<br/>* 关健路径法。关健路径是指机动时间为0的工作，如果延期，会导致总工期延期，需特别关注。<br/>* 里程碑计划法。为更好的对项目进度的进展测量进行测量，需设置合理的里程碑点，用于检查阶段性成果的输出，以及实际进度与计划的偏差。<br/>* 计划评审技术（PERT）。对于工作先后逻辑关系及活动不确的时间，可采用最最短时间a、最可能时间m、最长时间b，然后按照β分布计算该工作的期望时间t。<br/>* 并行压缩法。对于限定工期的项目，往往需采用并行处理技术，保证项目在限定的工期内完成。并行处理虽然压缩了时间，但同时会引发人力资源和质量的风险，需综合考虑。</p>
<p>案例示范：<br/>在该项目的Project甘特图进度安排中</p>
<p>6、 人力资源安排</p>
<p>资源计划涉及到决定什么样的资源，以及多少资源将用于项目的每一工作的执行过程之中。这里的资源包括人、设备和材料等。象我们的设备分解单也是属于资源</p>
<table cellpadding="0" cellspacing="0" align="left" border="0">
<tbody>
<tr>
<td>
<div name="embedAd">
<table cellpadding="0" cellspacing="0" style="MARGIN: 5px 8px 3px 7px" border="0">
<tbody>
<tr>
<td/>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
源计划中的设备和材料资源，也是项目经理必须考虑的。另外还有更重要的一个就是人力资源计划。也就是我们要计划好每项任务由谁来完成，我们计划的资源能否满足要求。以及我们可以获得哪些人力资源，对各种资源的需求及需求计划加以描述。
<p>人力资源计划：<br/>* 分析出人力资源需求<br/>* 人力资源获取<br/>* 人力资源培训</p>
<p>在Project2000中，先需建立资源库，具体操作是：工具－》资源－》分配资源。将项目所需人力资源录入，人力资源包括本部门、协作部门、用户和第三方厂商等。资源库建立完后，就可采用拖放的方式来对每条任务分配资源。<br/>资源分配完毕后，项目计划编制者需调整和优化资源，如资源过度分配或资源剩余等。</p>
<p>说明：1、这里所指的资源，均指人力资源，其它如设备资源没有包括在此中。<br/>2、在第四步工期估计时，尚未分配资源，所以按平均资源能力估计，但资源分配后，对工期估计要做相应一些调整。</p>
<p>案例示范：<br/><img width="553" height="265" src="http://www.mypm.net/articles/pictures/2004715160958.jpg"/></p>
<p>7、 费用估计</p>
<p>费用估计指的是预估完成项目各工作所需资源的费用的近似值。目前我们考虑的资源<br/>主要是人力资源和差旅费用。而设备和材料资源暂未考虑。费用估计应该与工作质量的结果相联系。费用估计过程中亦应该考虑各种形式的费用交换。</p>
<p>费用估计的常用方法：<br/>* 类比估计法。依赖于历史数据的积累。<br/>* 从上而下估计法。<br/>* 从下到上估计法。</p>
<p>在Project2000中，采用的方法是"从下到上估计法"，这种技术通常首先估计各个独立工作的费用，然后再汇总从下往上估计出整个项目的总费用。估计相对会比较准确。</p>
<p>在Project2000预算中，我们首先要输入人力资源的单位价格，在Project工具中，人力资源基本单位为：工时。在数据录入时要进行换算，需将每天标价除以8，转换为工时单价。人力单价估计完后，还要对差旅、招待、活动、通信费、办公等其它费用进行单价估计，如差旅费平均每趟多少，招待费平均每次多少，活动费平均每次多少等，这些单价要依据项目的规模、复杂度和地域等因素来确定，有的还要参照公司财务制度的标准（如通信费用报销规定、差旅补贴规定等）。在Proejct2000的差旅、招待费等的单价录入中，类型选择为"材料"。</p>
<p>案例示范：<br/><img width="553" height="168" src="http://www.mypm.net/articles/pictures/2004715161146.jpg"/></p>
<p>8、 费用预算</p>
<p>费用的预算包括给每一项独立工作分配全部费用，以获取度量项目执行的费用基线。<br/>费用预算可以分为三部分，即人工费用预算、辅助服务费用预算和采购物品费用预算。但我们目前费用预算主要考虑的是人工费用预算和差旅等其它费用。</p>
<p>在Project2000中，当费用估计完成后，一般来说人力成本便自动计算出来了。但对于差旅等其它费用还需按里程碑或或主体任务进行分配，对于较小的项目也可就在总项目中分配（本例就是在总项目中分配）。分配方法与第六步的人力资源分配方法一样。</p>
<p>案例示范：<br/><img width="553" height="277" src="http://www.mypm.net/articles/pictures/2004715161316.jpg"/></p>
<p><strong>四、 计划的应用</strong></p>
<p>计划的编制，不是单独由项目经理来做，应该是要求项目成员或项目主要成员一起参与。<br/>项目计划制定完后，还要组织计划的评审。计划评审通过后，就形成了项目的基准计划，这个基准计划是日后项目控制的杠杆，也是项目绩效考核的重要基础数据。</p>
<p>应用一：里程碑计划</p>
<p>里程碑，一般都是项目的关健控制点，里程碑的设置应满足阶段成果和易测量两种属性。对项目高层经理或项目主管来说，他们进度控制的焦点往往就是里程碑计划。</p>
<p>操作方法是，选中菜单的项目－》筛选－》里程碑。并插入列备注（输出成果）。<br/>案例示范：（蓝色字体就是我们的里程碑点，共4个）<br/><img width="553" height="207" src="http://www.mypm.net/articles/pictures/2004715161410.jpg"/></p>
<p>应用二：关健任务</p>
<p>关健任务，也即机动时间为0的工作，只在关健任务上的工期延期一天，则总工期必将延期一天。所以关健任务对总工期的控制有关至关重要的作用。对项目经理来说，进度控制的侧重点应在关健路径的任务上。</p>
<p>关健路径显示有两种方法：一是在菜单的格式－》甘特图向导－》关健路径；另一种是在菜单的项目－》筛选－》关健路径。第一种情况在前面计划编制的第6步进度安排时有体现。下面以第二种为例。<br/>案例示范：<br/><img width="553" height="217" src="http://www.mypm.net/articles/pictures/2004715161443.jpg"/></p>
<p>应用三：任务责任分配</p>
<p>基准计划形成后，项目经理需将各任务分配给个每个项目成员。并要求每个项目成员签署任务责任书或任务承诺书，一般在正式开工前的开工会议上进行。任务分派完后，这样我们的计划就开始正式进入执行阶段了。</p>
<p>在Project2000中的任务分配，操作过程是：资源使用状况－》在列中加入开始时间、完成时间、完成百分比、备注（即输出成果）等列，使得任务分配的信息更全面。<br/>案</p>
<table bgcolor="#CCCCCC" cellspacing="0" align="center" height="25" width="96%" cellpadding="0" border="0">
<tbody>
<tr>
<td width="96%" class="neirong" bgcolor="#FFFFFF">
<p>应用四：资源负荷分析</p>
<p>计划完成后，还要检查资源分配是否超负荷，如资源超负荷过多，则该计划很难执行。检查资源超负荷的方法如下：<br/>首先，检查哪些资源已超负荷分配了。操作方法：击点左边栏中的"资源工作表"，红色并且标志列中有感叹号的，则为该资源超负荷分配了。<br/>案例示范：<br/><img width="554" height="92" src="http://www.mypm.net/articles/pictures/2004715161553.jpg"/></p>
<p>接着，超负荷资源找出来后，我们接着要将该资源超负荷分配的任务要找出来。操作方法：选中菜单的项目－》筛选－》使用资源，然后根据弹出的提示框，选择资源"王五"。则可看出超负荷分配的任务。<br/>案例示范：<br/><img width="554" height="110" src="http://www.mypm.net/articles/pictures/2004715161628.jpg"/></p>
<p>对于人力资源分配时，必须掌握一个均衡分配的原则，不能某一段时间人力资源需求量骤增，某一段时间骤减。这样对人力资源的调配和获取带来困难。项目经理可以通过"人力资源工时曲线图"帮助进行分析。</p>
<p>操作方法：选择 视图－》工具栏－》分析，则这是在Project2000工具中会出现："在EXCEL中分析时间刻度数据"，点击该快捷图标－》选择完整项目－》选择导出的域为"工时"－》选择时间单位为"周"－》导出数据<br/>案例示范：（人力资源工时曲线图）<br/><img width="447" height="253" src="http://www.mypm.net/articles/pictures/2004715161706.jpg"/></p>
<p>应用五：费用预算曲线图</p>
<p>在费用预算，如按时间坐标来分析，有两种表现方式，一是费用预算曲线图，二是费用预算累计曲线图。<br/>操作方法：同上面的"人力资源工时曲线图"基本一致，只是需在导出域中选为"成本"便可。<br/>案例示范：（费用预算曲线图）<br/><img width="418" height="240" src="http://www.mypm.net/articles/pictures/2004715161753.jpg"/></p>
<p>对于费用预算累计曲线图，同上述操作方法基本一致，就是在选择导出的域为"累计成本"便可。<br/>案例示范：（费用预算累计成本曲线图）<br/><img width="513" height="236" src="http://www.mypm.net/articles/pictures/2004715161830.jpg"/></p>
<p>另外，在费用预算中，如从资源坐标来分析，费用来源分为两大类，一是人力成本费用，二是差旅、交通、招待、会议、等费用。费用从资源角度显示如下。（当然也可将人力资源成本倒出到EXCEL中进行小计。）<br/>案例示范：<br/><img width="554" height="175" src="http://www.mypm.net/articles/pictures/2004715161910.jpg"/></p>
<p><strong>五、 如何使用Project 2000来控制计划</strong></p>
<p>1、 进度跟踪<br/>在控制项目之前，必须将Project计划保存成基准计划，操作方法：工具－》跟踪－》<br/>保存比较基准（注：在Project2002当中，可以保存为多个比较基准）。<br/>项目在执行过程中，项目经理需定时（如每三天或一周一次），对项目的基准计划进行<br/>REVIEW，检查实际进度与计划进度之间的偏差。操作方法：工具－》跟踪－》更新任务。则会弹出如下窗口。</p>
<p>案例示范：<br/><img width="438" height="162" src="http://www.mypm.net/articles/pictures/2004715162009.jpg"/></p>
<p>假如，实际工期花费了11工作日，则在实际工期中输入11便可，完成百分比，则会自动计算，在下面进度控制中，便会体现实际工期比计划工期多用了1天。<br/>注：也可采用直接双击任务栏，填写完成百分比、实际开始时间和实际完成时间。在填写完成百分比时，可建立快捷键，更方便操作。操作方法：视图－》工具栏－》跟踪。如图所示：<br/><img width="291" height="25" src="http://www.mypm.net/articles/pictures/2004715162046.jpg"/></p>
<p>2、 未完成任务的查看<br/>在项目跟踪过程中，重点会对未完成任务进行跟踪，那么如何显示出这些未完成任务的<br/>信息呢？操作方法是：工具－》筛选－》未完成的任务。<br/>案例示范：<br/><img width="553" height="203" src="http://www.mypm.net/articles/pictures/2004715162223.jpg"/></p>
<p>3、 进度和费用偏差<br/>由于保存了基准计划，所以就有了与实际情况的比较的基准。假如，在"用户需求调研"<br/>任务实际多花了一天，需求分析双增加了"李四"来帮忙。这样，计划与实际便产生了偏差。<br/>操作方法：在列中按鼠标右键，插入"比较基准工期"、"工期差异"、"成本"、"比较基准成本"、"成本差异"等列。这样就构成了实际与计划的对比表。<br/>案例示范：<br/><img width="553" height="151" src="http://www.mypm.net/articles/pictures/2004715162256.jpg"/></p>
<p>4、 项目跟踪甘特图<br/>项目实际进度与计划进度的偏差，通过跟踪甘特图可以比较直观的看出来。优点就是<br/>视觉上比较直观。缺点是偏差范围没有像第3点那样准确。两者各有所长。</p>
<p>操作方法：选中"跟踪甘特图"便可。在下图中，下面灰色部分表示原比较基准进度条，上面的蓝色部分表示实际进度条。从该图中可看出实际进度有后延。</p>
<p>案例示范：<br/><img width="553" height="252" src="http://www.mypm.net/articles/pictures/2004715162411.jpg"/></p>
<p>5、 项目总体进展情况统计<br/>从项目进度控制层次来看，进度控制可分为三层：总体进度控制、里程碑进度控制、详细进度控制。对于总体进度控制，一般针对项目分管领导或总经理这一层次。</p>
</td>
</tr>
</tbody>
</table>
他们通过关注的是项目总体情况。在Project2000中，将能很方便的提供出这些信息供高层管理者查看。<br/><p>操作方法：选中菜单 项目－》项目信息－》在对话框中点击"统计信息"。例如从下图中可以看出：该项目在当前状态下，已完成总任务的28%，费用花了¥112,034.81元，总工期延期了1天，费用超支了¥3904.00元。</p>
<p>案例示范：<br/><img width="479" height="185" src="http://www.mypm.net/articles/pictures/2004715162452.jpg"/></p>
<p>6、 挣得值法分析<br/>挣得值法实际上是一种分析目标实施与目标期望之间差异的方法，又称偏差分析法。它控制的原理就是利用已完成工作的实际成本（ACWP）、计划完成工作的预算成本（BCWS）、实际完成工作量的预算成本（BCWP）三个基础数据，来计算得出进度偏差（SV）和费用偏差（CV）。</p>
<p>假如，以第一个里程碑点200年1月21日作为检查点，来计算该项目的进度和费用偏差值。<br/>操作方法：选择，项目－》项目信息－》在弹出的"项目信息"框中，将状态日期选择为："2002年1月21日"。然后分别插入列"BCWS"、"ACWP"、"BCWP"、"SV"、"CV"等，从计算结果可得SV&lt;0、CV&lt;0，说明该项目在第一个里程碑点进度延期了，费用也超去了，必须采取控制措施或计划变更。</p>
<p>案例示范：<br/>说明：由于检查点为2002年1月21日，而"需求分析"任务工期为5天，实际完成日期为2002年1月22日，所以的计划工作量的实际成本为8000*4/5＝6400；已完成工作量的预算成本为4000*4/5＝3200。图示如下：<br/><img width="553" height="157" src="http://www.mypm.net/articles/pictures/2004715162748.jpg"/></p>
<p><strong>六、 结束语</strong><br/>以上是本人根据对Project2000的一些粗略理解，并结合近5年来的项目管理实践经验总结而成。谨以把此文献给各项目经理，以供参考。希望我们的项目经理能掌握一些工具，来帮助我们更好的管理项目。另外，在后一段时间，我们将继续推出基于WEB的团队项目管理工具－"Project Central工具"的应用与实例</p>
</div>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.blogjava.net/yaominxi/aggbug/116026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-08 19:24 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/08/116026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人常用的JAVA资源网站</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Tue, 08 May 2007 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/116025.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/116025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/116025.html</trackback:ping><description><![CDATA[
<p>个人常用的JAVA资源网站</p>
<p>一.JAVA电子书</p>
<p><a href="http://www.java-cn.com/book/">http://www.java-cn.com/book/</a>　</p>
<p>优点：书籍量大，经常更新，教育网下载速度超快</p>
<p>不足：每天只能下载4本</p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/116025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-08 19:23 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/08/116025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）孙卫琴感动了我！-张孝详老师写的</title><link>http://www.blogjava.net/yaominxi/archive/2007/05/03/115115.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Thu, 03 May 2007 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2007/05/03/115115.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/115115.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2007/05/03/115115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/115115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/115115.html</trackback:ping><description><![CDATA[
<table cellpadding="0" width="100%" cellspacing="0" border="0">
<tbody>
<tr>
<td>
<table cellpadding="0" bgcolor="#FFFFFF" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
<td bgcolor="#EEEEEE" colspan="3" align="middle" height="40" width="100%" class="title1"><strong>孙卫琴感动了我！(我--张孝祥)</strong></td>
</tr>
<tr>
<td width="100%" align="middle" bgcolor="#EEEEEE"><a href="mailto:thinking-org@email.com">thinking_org</a> 转贴 更新：2006-08-02 09:09:55 版本: 1.0</td>
</tr>
</tbody>
</table>
</td>
</tr>
<!-- end of article title -->
<tr>
<td width="100%" align="middle" valign="top"><!--start of article content -->
<table width="98%" border="0" class="rtable">
<tbody>
<tr>
<td width="100%" align="left" class="text"><br/>今天听了孙卫琴的讲座，颇受感动。本来觉得孙卫琴的成功是走了一些窍门，无非是综合了国外多本书籍的成果，再用自己的语言描述出来而已，少有她自己摸索和实践的东西。即便这般认为，但孙卫琴也是令我非常尊敬和佩服的，因为有过类似写作的经历，我深知只要不是攒书，只要是抱着对读者负责、对自己的作品负责的心态来写作，那么整个创作过程就会非常艰辛，需要毅力来坚持，何况孙卫琴在短短几年内写出了这么多受人喜欢的书籍，那写书的效率和付出的辛劳是不言而喻的。对于孙卫琴，我只能是佩服和尊敬，我没有资格去挑剔人家书中的缺陷，因为在写书效率上我不如人家，至少我不能在这么短的写作周期内写出好过她的书。<br/><br/>前些天因为培训合作事宜，与孙卫琴通过电话，知道了她和我有一样的忧患，那就是老了谁来养，我们都是自由职业，没有国家皇粮，没有养老保险，所以，现在只能比别人付出更多的努力，以便让自己的未来有一定的安全感。她说有人指责她抄袭老外的作品，我跟她谈到，不要理会那些人的言论，她把国外作者的经验按中国人的阅读方式引入了中国，这作出的贡献是值得肯定的，是有历史意义的，不象国内某些作者直接抄取其他国内作者的书，重复别人的工作，那就谈不上对社会有什么历史贡献和价值了，无非是给自己谋取了一些名利而已。我作为一个被人赞扬过的、也被人讥笑和嘲骂过的作者，我的感受是很深的，一些人看到别人的成果后，然后对别人的成果进行挑刺，这是一件很简单的事情，大家都能做，但这不能说一个能挑刺的人水平就怎样，这往往是那些自己找不到成就，而只能靠给被人挑刺来满足自己虚荣心的人所为。如果那些人果真有本事的话，就先别急着给别人挑刺，而是自己也做点类似的东西出来，做完后就知道自己还不如人家的好呢！我有一个很大的创作计划，本来如果我的脸皮厚，我也可以在孙卫琴那几本书的基础上修修改改，稍作完善，然后再从别的书上整点资源进来，到时候还可以对大家说，我的书比孙卫琴的好，因为站在孙卫琴的基础上创作，我想应该比她的好点吧！但我没必要那么做，我不是为了经济效益和名声而不择手段的人！我把写作当作了一种艺术，我希望完全用自己的方式来写作，写出我想写的那些东西，我希望做出对社会有历史价值的贡献，所以，我是不可能抄袭别人的，对我来说，即使在出版社多出了几本书，只要不是我自己用心写出来的，而是与别人写得差不多，那我从中也根本就找不到任何成就感，基于这种写作心态，我自身写作周期很漫长，所以，我希望孙卫琴能够结合培训的特点，重新调整一下她的那些书籍内容，以便我们作为全国范围内的培训教材使用。<br/><br/>上次的电话仅仅是简单问了一下她目前的情况和想法，并不知道她创作的经历。可是，我今天听完别人对孙卫琴的介绍，我是真的感动了，孙卫琴在怀孕4个月后开始写struts，在小孩出生3月后就把孩子托付给了江苏常州的父母，又只身一人回到上海，开始把自己封闭在一小屋里写hibernate，最长时间是12天没见到过一个人，可敬！我等有人洗衣做饭的大老爷们，在她面前还有什么苦可叫！<br/><br/>注：为了创作，我估计也能够忍受12天不与外界接触的寂寞， 但现在身体素质跟不上了，每天只要在电脑前连续工作8个小时以上，就会头晕、恶心，浑身乏力，胃病复发，所以，我原来靠个人英雄主义的写作思想开始逐步转向了团对协作，我佩服孙卫琴哪来这么好的体力！<br/><br/>看了下面一些人的评论，想想这个世间还真好笑，看来还是有许多对我没有好感的人在经常关注我的blog啊，不知这些人是一种什么样的看客心态，在满篇文章中揪人家的小辫子，然后就开始发挥自己无限的遐想了，为了让这些人明白自己是多么"聪明"，特作如下解释：<br/><br/>1.孙卫琴老师的书中确实很多代码都是直接来自一些现有外版书籍，已有数人亲自给我这么说过，但我并没有私下向别人说过，因为我理解孙卫琴老师，能做成这样已经非常不容易，不能要求别人十全十美。我亲自与孙卫琴交流时就是这么说的。<br/><br/>2.这些发表评论的人谁写过书，谁想坚持不懈地好好写本书过，没有！那就不要站着说话不腰疼，我一直在努力写书，我写的内容到底有多大价值，以后会有人给出恰当评价的。正因为我太想写成一系列的好书了，所以，花费的功夫非常之多，加上这么多年的身体透支，感觉写书就是心有余而力不足，这个力不足不是学不会知识，而是没有体力去钻研和细化每个知识细节，所以，发出了"我佩服孙卫琴哪来这么好的体力！"的慨叹。我就是认为struts,hibernate,spring从学习的角度来说，一点也不难，但要扣细，确实要花费大量的时间和体力，如果你的java基础和java web不是很好，觉得struts,hibernate,spring很难，那是情理之中的事，但不要以己度人，对你难的事，对别人来说未必就难！<br/><br/>3.我从来不怕解剖我自己，我就是一个非常非常普通的人，只是我有理想，有目标，我为了理想一直在奋斗。我根本不在意别人的评论，只是叹息那些自以为是的人，怎么对在别人的字里行间挑话题这么有兴趣，真不知道这些人平常的工作是什么。（完）<br/><br/>我(张孝祥)的技术学习观念：<br/><br/>我一直认为基础知识最重要,无论是对国家,还是对个人的后期发展,都是最重要的.有些人自以为是,以为会玩玩struts,hibernate之类的工具,就觉得自己不得了,其实,那算什么,一个用高级工具的用户而已,如果中国全是这样的高级用户,中国软件永远不会有出头之日,永远只能用别人做好的工具!非常遗憾的是,我搞这些基础知识的"研究",常常引来一些讥讽声和嘲笑声,不过,这些讥讽声和嘲笑声并不能左右我的思想!我没必要为去迎合那些无知和没有远见的人(不是攻击别人,而我就是这么想的)而改变自己的立场和理念!<br/>我现在不算精通struts,hibernate,spring,但是,还算学得明白,照着一些现有的书籍和别人的思路讲讲课,应该不会有什么问题.我并不觉得这样就有什么资本,我从未钦佩过那些使用struts,hibernate,spring的大虾们,而是只佩服当初开发struts,hibernate,spring这些框架的大侠们.佩服那些对这些框架的内部原理有深入研究的技术牛人们!我在学习struts和spring时,发现这些框架的设计师们对html,css,javascript,http协议,servlet,jsp,java等基础性知识掌握得都非常全面,并且细节都非常清楚,敢问国内那些看不上这些基础知识的人们,为何struts和spring设计师们都觉得这些知识重要,而你却认为不重要,说句不客气的话,因为你还连一点概念都没有,你永远到不了struts和spring设计师们的水平,我虽达不到他们的水平,至少我可以追随他们的思想,读懂他们的源码,知道他们为何要这么做!<br/><br/>每个人都可以有自己的想法,但没必要把自己的想法强加给其他人!<br/></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.blogjava.net/yaominxi/aggbug/115115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2007-05-03 11:01 <a href="http://www.blogjava.net/yaominxi/archive/2007/05/03/115115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts深度体验之概述</title><link>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Sat, 20 May 2006 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47173.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47173.html</trackback:ping><description><![CDATA[
		<a class="bluekey" href="http://www.yesky.com/key/395/395.html" target="_blank">Struts</a>是基于Model 2实现的技术框架，Model 2是经典的MVC（Model，<a class="bluekey" href="http://www.yesky.com/key/1638/206638.html" target="_blank">View</a>，Control）模型的Web应用变体，这个改变主要由于HTTP协议的无状态性引起的。Model 2的目的和MVC一样，也是利用控制器来分离模型和视图，达到不同层间松散耦合的效果，提高系统灵活性、复用性和可维护性。在多数情况下，你可以将Model 2与MVC等同起来。<br /><br />　　图 1表示一个基于Java技术典型的MVC网络应用，从中可以看出M<a class="bluekey" href="http://www.yesky.com/key/1744/206744.html" target="_blank">VC中</a>的各个部分对应于J2EE哪些实现技术。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/9n2f35z6mivd.jpg" border="0" /><br />图 1 MVC和J2EE技术</div></td></tr></tbody></table><br />　　在利用Model 2之前，我们把所有的表示逻辑和业务逻辑都集中在一起（如我们前两个专题中的<a class="bluekey" href="http://www.yesky.com/key/832/160832.html" target="_blank">login</a>.jsp），有时也称这种应用模式为Model 1，Model 1的主要缺点就是紧耦合，复用性差，维护成本高。<br /><br />　　由于Struts就是基于Model2实现的框架，所以它底层的机制也是MVC，我们通过图 2描述Struts的具体实现：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/rz5ob9gcgy18.jpg" border="0" /><br />图 2 Struts MVC实现</div></td></tr></tbody></table><br />　　1．框架初始化<br /><br />　　Struts框架总控制器（ActionServlet）完成所有初始化工作。总控制器是一个<a class="bluekey" href="http://www.yesky.com/key/47/170047.html" target="_blank">Servlet</a>，它通过web.xml配置成<a class="bluekey" href="http://www.yesky.com/key/3331/188331.html" target="_blank">自动启动</a>的<a class="bluekey" href="http://www.yesky.com/key/778/778.html" target="_blank">Servlet</a>，读取配置文件（struts-config.xml）的配置信息，为不同的Struts模块初始化相应的ModuleConfig对象。配置文件中的Action映射定义都保存在ActionConfig集合中，配置文件中其他配置信息分别保存在ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig等集合中。<br /><br />　　要特别指出的是，初始化动作在Web容器启动时自动完成，初始化完成后，它将通过URL匹配映射截获所有以.do结尾的URL请求。<br /><br />　　2．客户端发送一个HTTP请求<br /><br />　　用户通过提交表单或调用URL向Web应用程序器提交一个请求，请求的数据用HTTP协议上传给Web服务器。<br /><br />　　3．总控制器接截获这个请求并实例化Form Bean<br /><br />　　控制器接收HTTP请求，并从ActionConfig中找出对应该请求的Action子类，如果没有对应的Action，控制器直接将请求转发给JSP或者静态页面。如果有对应的Action且这个Action有一个相应的Action Form，ActionForm被实例化并用HTTP请求的数据填充其属性，然后保存在Servlet Context中（request或<a class="bluekey" href="http://www.yesky.com/key/1637/1637.html" target="_blank">session</a>中），这样它们就可以被其它Action对象或者JSP调用。<br /><br />　　此外，还可以在ActionForm填充数据后还可以调用validate()进行数据有效性自检，并且可以返回一个包含所有<a class="bluekey" href="http://www.yesky.com/key/4182/159182.html" target="_blank">错误信息</a>的ActionErrors对象，如果ActionErrors不空，总控制器直接将请求返回到入口页面。<br /><br />　　4．控制器将请求转交给具体的Action处理<br /><br />　　控制器根据配置信息将请求切换到具体的Action，这个Form Bean也一并传给这个Action的<a class="bluekey" href="http://www.yesky.com/key/2481/212481.html" target="_blank">execute</a>()方法。<br /><br />　　5．Action完成具体的业务逻辑操作<br /><br />　　Action很简单，一般只包含一个execute方法，它负责执行相应的业务逻辑，如果需要，它也可能进行相应的数据检查。执行完成之后，返回一个ActionForward对象，控制器通过该ActionForward对象来进行转发工作。<br /><br />　　6．Action返回目标响应对象给总控制器<br /><br />　　Action根据业务处理的不同结果返回一个目标响应对象给总控制器，这个目标响应对象对应一个具体的JSP页面或另外一个Action。<br />　 <br />　　7．总控制器将HTTP请求转换到目标响应对象中。<br /><br />　　总控制器根据业务功能Action返回的目标响应对象，将HTTP请求转换到这个目标响应对象中，一般情况下，它是一个具体的JSP页面。<br /><br />　　8．目标响应对象将结果展现给用户<br />　 <br />　　目标响应对象（JSP）将结果页面展现给用户。<br /><br />　　客户端发送一个HTTP请求，通过Struts框架最后获得一个HTTP响应，这一过程非常重要，它是理解Struts框架的重点。图 2描述了Struts框架的结构，而图 3通过一个活动图更具体描述接受请求直至返回响应的整个过程：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/u9a67hlx63bg.gif" border="0" /><br />图 3 Struts接受并返回响应的中间过程<br /><strong>Struts1.1新增功能<br /><br /></strong>　　1、多模块的支持<br /><br />　　我们知道，在Struts 1.0中，只能在web.xml中为ActionServlet指定一个Struts配置文件(struts-config.xml)，这对一个只需一两个人开发的小系统当然没有任何问题，但如果一个多人开发的大中型应用程序，问题就产生了。因为许多开发人员可能同时都需要修改Struts配置文件，这样肯定会造成一定程度的资源争夺，可能会出现彼此覆盖的情况，这样势必会影响开发效率并引起开发人员的抱怨。<br /><br />　　在Struts 1.1中，为了解决这个并行开发的问题，提出了两种解决方案：<br /><br />　　·多个配置文件<br /><br />　　支持多个配置文件，是指你能够为ActionServlet同时指定多个xml配置文件，文件之间以逗号分隔，请看下面web.xml中关于多个struts配置文件的声明示例：<br /><br />　　 代码清单 1 多个struts配置文件<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. ＜servlet＞<br />2. ＜servlet-name＞action＜/servlet-name＞<br />3. ＜servlet-class＞org.apache.struts.action.ActionServlet＜/servlet-class＞<br />4. ＜init-param＞<br />5. ＜param-name＞config＜/param-name＞<br />6. ＜param-value＞<br />7. <b>/WEB-INF/struts-config.xml, /WEB-INF/book-struts-config.xml</b><br />8. ＜/param-value＞<br />9. ＜/init-param＞ <br />10. ＜load-on-startup＞1＜/load-on-startup＞<br />11. ＜/servlet＞</td></tr></tbody></table><br />　　通过这种方法，你可以为每一个模块定义一个配置文件，由于项目一般按模块划分工作，这样就大大地减小了冲突的概率。<br /><br />　　·独立的模块<br /><br />　　但是，多个配置文件存在一个潜在的问题：不同的配置文件之间会产生冲突，因为在ActionServlet初始化的时候多个配置文件还是要合并到一起。比如，在struts-config.xml中配置了一个名为errorDbAccess的＜exception＞，而在book-struts-config.xml中也配置了一个同样的＜exception＞，这样就产生冲突了。<br /><br />　　为了彻底解决这种冲突，Struts 1.1中引进了模块（Module）的概念。一个模块就是一个独立的子系统，对应一个独立的配置文件，ActionServlet将不同模块的配置文件保存在各自独立的ModuleConfig对象中的。<br /><br />　　下面是两个独立模块的配置方式：<br /><br />　　代码清单 2 多模块配置方式<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. …<br />2. ＜init-param＞<br />3. ＜param-name＞config＜/param-name＞<br />4. ＜param-value＞/WEB-INF/struts-config.xml＜/param-value＞<br />5. ＜/init-param＞<br />6. ＜init-param＞<br />7. ＜param-name＞config/book＜/param-name＞ <br />8. ＜param-value＞/WEB-INF/book-struts-config.xml＜/param-value＞<br />9. ＜/init-param＞<br />10. …</td></tr></tbody></table><br />　　通过这种方式，我们配置了两个模块，一个模块名为config，而另一个名为config/book。 <br /><br />　　·动态ActionForm支持<br /><br />　　ActionForm表示HTTP页面表单的数据，可以将其看成视图页面数据的服务器映射，它负责保存视图中的数据供控制器或者其他视图使用。此外，它还负责数据有效性的验证，所以Struts 1.1文档把它比作HTTP和Action之间的防火墙，这足以体现ActionForm在视图和控制器之间的过滤器作用。 <br /><br />　　由于ActionForm对应于HTTP页面表单，所以随着页面的增多，你的ActionForm将会急聚增加。动态ActionForm（DynaActionForm）即为减少ActionForm的数目被设计出来，利用它你不必创建一个个具体的ActionForm类，只需要在配置文件中配置出所需的虚拟ActionForm，而由Struts框架通过配置文件动态创建这个ActionForm。例如，代码清单 3通过指定＜form-bean＞的type为"org.apache.struts.action.DynaActionForm"来创建一个动态的ActionForm--loginForm。<br /><br />　　代码清单 3 配置一个动态ActionForm<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. ＜form-beans＞<br />2. ＜form-bean name="bookForm" type="<b>org.apache.struts.action.DynaActionForm</b>"＞ <br />3. ＜form-property name="bookId" type="java.lang.String"/＞<br />4. ＜form-property name="isbn" type="java.lang.String"/＞ <br />5. ＜form-property name="bookName" type="java.lang.String"/＞<br />6. ＜form-property name="author" type="java.lang.String"/＞<br />7. ＜/form-bean＞ <br />8. ＜/form-beans＞</td></tr></tbody></table><br />　　DynaActionForm将属性保存在一个Map对象中，同时提供相应的get(name)和set(name,value)方法，其中参数name是要访问的属性名，而value是一个Object。例如要访问DynaActionForm中bookName的值，可以采用String bookName = (String)get("bookName")方法，由于bookName存储在Map中，所以要进行强制转换。<br /><br />　　由于DynaActionForm通过配置文件产生，并没有一个实体对象类，如果要对动态ActionForm对象进行校验需要使用DynaValidatorForm，它是DynaActionForm的子类，它能够提供动态ActionForm和动态表单输入验证的功能。检验规则在validation.xml配置文件中定义，而这些规则的所对应的实现函数在validator-rules.xml文件中定义。<br /><br />　　·通过配置方式实现异常处理<br /><br />　　Struts1.1允许以配置方式进行异常处理，配置方式可以避免在Action中通过硬编码来处理异常，从而提高应用程序异常处理的灵活性和可维护性。一般情况下，一个异常处理对象可以通过以下步骤实现：<br /><br />　　1．实现org.apache.struts.action.ExceptionHandler的子类，覆盖execute()方法，在该方法中处理异常并且返回一个ActionForward对象。<br /><br />　　2．在配置文件中配置异常处理对象，你可以配置一个全局的处理类或者单独为每个Action配置处理类。<br /><br />　　代码清单 4定义了一个全局的处理类TestExceptionHandler，它被用来处理所有的异常。<br /><br />　　代码清单 4 一个全局宣告式异常处理的配置<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. …<br />2. ＜global-exceptions＞ <br />3. ＜exception <br />4. handler="com.superAbc.TestExceptionHandler" <br />5. key="error.message" <br />6. path="/fail.jsp" <br />7. scope="request" <br />8. type="java.lang.Exception"/＞<br />9. ＜/global-exceptions＞<br />10. …</td></tr></tbody></table><br />　　type属性定义了匹配的异常，path定义了异常发生后转发的地址，而handler指定在转发前对异常的特殊处理，如果没有提供handler，默认的处理类org.apache.struts.action.ExceptionHandler。<br /></div></td></tr></tbody></table><img src ="http://www.blogjava.net/yaominxi/aggbug/47173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-20 14:49 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring framework 10分钟入门 </title><link>http://www.blogjava.net/yaominxi/archive/2006/05/20/47172.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Sat, 20 May 2006 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/20/47172.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47172.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/20/47172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47172.html</trackback:ping><description><![CDATA[
		<table class="border2" cellspacing="0" cellpadding="0" width="760" align="center" bgcolor="#ffffff" border="0">
				<tbody>
						<tr>
								<td align="middle" height="25">
										<table width="95%">
												<tbody>
														<tr>
																<td>
																		<table align="left" border="0">
																				<tbody>
																						<tr>
																								<td>
																										<script language="javascript" src="httP://www.myfaq.com.cn/images/ad.js" charset="utf-8">
																										</script>
																								</td>
																						</tr>
																				</tbody>
																		</table>Yanger(y-ge@263.net) <br /><br /><br />开发环境: <br /><br />Java SDK (I am currently using version 1.4.1) <br /><br /><br />Ant (using version 1.5.3)<br /><br /><br />Apache Tomcat (using version 4.1.24)<br /><br />您可以用功能相同的任何容器或者<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>运行环境 <br /><br />第1步:开发路径 <br />为了保留我们的开发中每一步的流程，我们将保存所有的源码和<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>。 <br />首先，我们创建一个springapp的目录（你可以将这个目录建在任何地方）,然后，在springapp目录下创建子目录src,用来保存<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>资源<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>。然后我们建立另一个子目录war，这个目录将保存生成的war<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>。 <br />建立WEB-INF子目录，和它的classes，lib子目录。 <br />OK,你的目录应该这个样子： <br />代码: <br /><br />-spirngapp <br />  -WEB-INF <br />      -classes <br />      -lib <br />  -src <br />  -war <br /><br /><br />第2步:创建jsp <br />我们创建一个jsp<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>-index.jsp在springapp目录下,这将是我们应用<a href="http://www.myfaq.com.cn/Dev/index.html" target="_blank">程序</a>的入口. <br /><br />代码: <br />springapp/index.jsp <br /><br />&lt;html&gt; <br />&lt;head&gt;&lt;title&gt;Example :: Spring Application&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt; <br />&lt;h1&gt;Example - Spring Application&lt;/h1&gt; <br />&lt;p&gt;This is my test.&lt;/p&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;      <br /><br /><br />现在，我们来完成这个web应用,在WEB-INF下建立web.xml<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a> <br />代码: <br /><br />springapp/WEB-INF/web.xml <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>.sun.com/dtd/web-app_2_3.dtd'&gt; <br /><br />&lt;web-app&gt; <br /><br /><br />  &lt;welcome-file-list&gt; <br />    &lt;welcome-file&gt; <br />      index.jsp <br />    &lt;/welcome-file&gt; <br />  &lt;/welcome-file-list&gt; <br /><br />&lt;/web-app&gt; <br /><br /><br />第3步:部署这个应用到Tomcat <br />现在我们来写Ant脚本<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>，用于建立，部署，控制这个应用. <br />代码: <br /><br />springapp/build.xml <br />&lt;?xml version="1.0" encoding="gb2312"?&gt; <br /><br />&lt;project name="springapp" basedir="." default="usage"&gt; <br />    &lt;property file="build.properties"/&gt; <br /><br />    &lt;property name="src.dir" value="src"/&gt; <br />    &lt;property name="web.dir" value="war"/&gt; <br />    &lt;property name="build.dir" value="${web.dir}/WEB-INF/classes"/&gt; <br />    &lt;property name="name" value="springapp"/&gt; <br /><br />    &lt;path id="master-classpath"&gt; <br />        &lt;fileset dir="${web.dir}/WEB-INF/lib"&gt; <br />            &lt;include name="*.jar"/&gt; <br />        &lt;/fileset&gt; <br />        &lt;fileset dir="${tomcat.home}/common/lib"&gt; <br />            &lt;include name="servlet.jar"/&gt; <br />        &lt;/fileset&gt; <br />    &lt;/path&gt; <br /><br />    &lt;target name="usage"&gt; <br />        &lt;echo message=""/&gt; <br />        &lt;echo message="${name} build file"/&gt; <br />        &lt;echo message="-----------------------------------"/&gt; <br />        &lt;echo message=""/&gt; <br />        &lt;echo message="Available targets are:"/&gt; <br />        &lt;echo message=""/&gt; <br />        &lt;echo message="build       --&gt; 建立应用"/&gt; <br />        &lt;echo message="deploy     --&gt; 部署应用"/&gt; <br />        &lt;echo message="deploywar --&gt; 部署war<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>"/&gt; <br />        &lt;echo message="install   --&gt; 安装应用"/&gt; <br />        &lt;echo message="reload   --&gt; 重载应用"/&gt; <br />        &lt;echo message="start      --&gt; 启动Tomcat application"/&gt; <br />        &lt;echo message="stop      --&gt; 停止 Tomcat application"/&gt; <br />        &lt;echo message="list        --&gt;  列表 Tomcat applications"/&gt; <br />        &lt;echo message=""/&gt; <br />    &lt;/target&gt; <br /><br />&lt;!-- =========================================================== --&gt; <br />&lt;!-- spring tasks by yanger 2003-11 --&gt; <br />&lt;!-- =========================================================== --&gt; <br />    &lt;target name="build" description="Compile main source tree <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a> files"&gt; <br />        &lt;mkdir dir="${build.dir}"/&gt; <br />        &lt;<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>c destdir="${build.dir}" target="1.3" debug="true" <br />               deprecation="false" optimize="false" failonerror="true"&gt; <br />            &lt;src path="${src.dir}"/&gt; <br />            &lt;classpath refid="master-classpath"/&gt; <br />        &lt;/<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>c&gt; <br />    &lt;/target&gt; <br /><br />    &lt;target name="deploy" depends="build" description="Deploy application"&gt; <br />        &lt;copy todir="${tomcat.home}/webapps/${name}" preservelastmodified="true"&gt; <br />            &lt;fileset dir="${web.dir}"&gt; <br />                &lt;include name="**/*.*"/&gt; <br />            &lt;/fileset&gt; <br />        &lt;/copy&gt; <br />    &lt;/target&gt; <br /><br />    &lt;target name="deploywar" depends="build" description="Deploy application as a WAR file"&gt; <br />        &lt;war destfile="${name}.war" <br />             webxml="${web.dir}/WEB-INF/web.xml"&gt; <br />            &lt;fileset dir="${web.dir}"&gt; <br />                &lt;include name="**/*.*"/&gt; <br />            &lt;/fileset&gt; <br />        &lt;/war&gt; <br />        &lt;copy todir="${deploy.path}" preservelastmodified="true"&gt; <br />            &lt;fileset dir="."&gt; <br />                &lt;include name="*.war"/&gt; <br />            &lt;/fileset&gt; <br />        &lt;/copy&gt; <br />    &lt;/target&gt; <br /><br /><br />&lt;!-- ============================================================ --&gt; <br />&lt;!-- Tomcat tasks - remove these if you don't have Tomcat installed --&gt; <br />&lt;!-- ============================================================ --&gt; <br /><br />    &lt;taskdef name="install" classname="org.apache.catalina.ant.InstallTask"&gt; <br />        &lt;classpath&gt; <br />            &lt;path location="${tomcat.home}/server/lib/catalina-ant.jar"/&gt; <br />        &lt;/classpath&gt; <br />    &lt;/taskdef&gt; <br />    &lt;taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask"&gt; <br />        &lt;classpath&gt; <br />            &lt;path location="${tomcat.home}/server/lib/catalina-ant.jar"/&gt; <br />        &lt;/classpath&gt; <br />    &lt;/taskdef&gt; <br />    &lt;taskdef name="list" classname="org.apache.catalina.ant.ListTask"&gt; <br />        &lt;classpath&gt; <br />            &lt;path location="${tomcat.home}/server/lib/catalina-ant.jar"/&gt; <br />        &lt;/classpath&gt; <br />    &lt;/taskdef&gt; <br />    &lt;taskdef name="start" classname="org.apache.catalina.ant.StartTask"&gt; <br />        &lt;classpath&gt; <br />            &lt;path location="${tomcat.home}/server/lib/catalina-ant.jar"/&gt; <br />        &lt;/classpath&gt; <br />    &lt;/taskdef&gt; <br />    &lt;taskdef name="stop" classname="org.apache.catalina.ant.StopTask"&gt; <br />        &lt;classpath&gt; <br />            &lt;path location="${tomcat.home}/server/lib/catalina-ant.jar"/&gt; <br />        &lt;/classpath&gt; <br />    &lt;/taskdef&gt; <br /><br />    &lt;target name="install" description="Install application in Tomcat"&gt; <br />        &lt;install url="${tomcat.manager.url}" <br />                 username="${tomcat.manager.username}" <br />                 password="${tomcat.manager.password}" <br />                 path="/${name}" <br />                 war="${name}"/&gt; <br />    &lt;/target&gt; <br /><br />    &lt;target name="reload" description="Reload application in Tomcat"&gt; <br />        &lt;reload url="${tomcat.manager.url}" <br />                 username="${tomcat.manager.username}" <br />                 password="${tomcat.manager.password}" <br />                 path="/${name}"/&gt; <br />    &lt;/target&gt; <br />&lt;target name="start" description="Start Tomcat application"&gt; <br />        &lt;start url="${tomcat.manager.url}" <br />                 username="${tomcat.manager.username}" <br />                 password="${tomcat.manager.password}" <br />                 path="/${name}"/&gt; <br />    &lt;/target&gt; <br /><br />    &lt;target name="stop" description="Stop Tomcat application"&gt; <br />        &lt;stop url="${tomcat.manager.url}" <br />                 username="${tomcat.manager.username}" <br />                 password="${tomcat.manager.password}" <br />                 path="/${name}"/&gt; <br />    &lt;/target&gt; <br /><br />    &lt;target name="list" description="List Tomcat applications"&gt; <br />        &lt;list url="${tomcat.manager.url}" <br />                 username="${tomcat.manager.username}" <br />                 password="${tomcat.manager.password}"/&gt; <br />    &lt;/target&gt; <br /><br />&lt;!-- End Tomcat tasks --&gt; <br /><br />&lt;/project&gt; <br /><br /><br />这个Ant脚本包含了建立应用主要的工具命令,但是，这个脚本要配合build.properties使用. <br />代码: <br /><br />springapp/build.properties <br /># Ant properties for building the springapp <br /><br />deploy.path=/home/trisberg/jakarta-tomcat-4.1.24/webapps <br />#deploy.path=c:/Tomcat 4.1/webapps <br />#deploy.path=c:/bea/user_projects/domains/mydomain/applications <br /><br />tomcat.home=/home/trisberg/jakarta-tomcat-4.1.24 <br />#tomcat.home= c:/Tomcat 4.1 <br />tomcat.manager.url=http://localhost:8080/manager <br />tomcat.manager.username=admin <br />tomcat.manager.password=tomcat <br /><br /><br />deploy.path 是tomcat的应用目录 <br />tomcat.path 是tomcat的主目录 <br />tomcat.manager.url是管理访问路径，注意你的端口是否正确 <br />tomcat.manager.username,tomcat.manager.password 我就不用说了吧 <br /><br />如果你执行install命令，将在tomcat webapps目录下建立springapp目录。 <br />如果你用其他的web应用<a href="http://www.myfaq.com.cn/System/Server/index.html" target="_blank">服务器</a>,那么你可以删除tomcat指定的命令集,你可以用server提供的热部署进行启动和停止你的应用. <br /><br />现在我们来看一下ant提供的每个命令，在你的springapp目录下执行ant <br /><br />代码: <br />C:\projects\springapp&gt;ant <br />Buildfile: build.xml <br /><br />usage: <br /><br />     [echo] springapp build file <br />     [echo] ----------------------------------- <br /><br />     [echo] Available targets are: <br /><br />     [echo] build                 --&gt; 建立应用 <br />     [echo] deploy               --&gt; 部署应用 <br />     [echo] deploywar         --&gt; 部署war<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a> <br />     [echo] install                --&gt; 安装应用 <br />     [echo] reload                --&gt; 重载应用 <br />     [echo] start                   --&gt; 启动 springapp <br />     [echo] stop                   --&gt; 停止 springapp <br />     [echo] list                     --&gt; 列表 Tomcat applications <br /><br /><br />BUILD SUCCESSFUL <br />Total time: 5 seconds <br /><br /><br />现在，我们来部署应用,执行ant deploy <br /><br />代码: <br />Ant deploy <br />e:\projects\springapp&gt;ant deploy <br />Buildfile: build.xml <br />  <br />deploy: <br />     [copy] Copying 1 file to C:\Tomcat 4.1\webapps\springapp <br />  <br />BUILD SUCCESSFUL <br />Total time: 1 seconds <br /><br /><br />第4步：测试应用 <br />先看一下我们是否把应用部署成功 <br /><br />代码: <br />Ant list <br />E:\projects\springapp&gt;ant list <br />Buildfile: build.xml <br /><br />list: <br />     [list] OK - Listed applications for virtual host localhost <br /><br />     [list] /admin:running:0:../server/webapps/admin <br /><br />     [list] /webdav:running:0:C:\Tomcat 4.1\webapps\webdav <br /><br />     [list] /springapp:running:1:C:\Tomcat 4.1\webapps\springapp <br /><br />     [list] /examples:running:0:examples <br /><br />     [list] /ofproject:running:0:C:\Tomcat 4.1\webapps\ofproject <br /><br />     [list] /tomcat-docs:running:0:C:\Tomcat 4.1\webapps\tomcat-docs <br /><br />     [list] /:running:0:C:\Tomcat 4.1\webapps\ROOT <br /><br />     [list] /manager:running:0:../server/webapps/manager <br /><br /><br />BUILD SUCCESSFUL <br />Total time: 5 seconds <br /><br /><br />如果你还没有安装,请执行ant install <br /><br />代码: <br />Ant install <br />E:\projects\springapp&gt;ant install <br />Buildfile: build.xml <br />  <br />install: <br />  [install] OK - Installed application at context path /springapp <br />  <br />  <br />BUILD SUCCESSFUL <br />Total time: 2 seconds <br /><br /><br /><br />现在，让我们打开浏览器看一下结果http://localhost:8080/springapp/index.jsp <br /><br /><br />第5步：下载spring framework package <br />如果你还没有下在spring，请到www.springframework.org/download.html. 寻找最新版本. <br /><br />下面我们将完成利用spring framework 进行开发M<a href="http://www.myfaq.com.cn/Dev/Programme/VC/index.html" target="_blank">VC</a> 应用<a href="http://www.myfaq.com.cn/Dev/index.html" target="_blank">程序</a>. <br /><br /><br />第6步:修改web.xml <br /><br />进入WEB-INF目录编辑web.xml <br /><br /><br />代码: <br />WEB-INF/web.xml <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>.sun.com/dtd/web-app_2_3.dtd'&gt; <br /><br />&lt;web-app&gt; <br /><br /> &lt;servlet&gt; <br />    &lt;servlet-name&gt;springapp&lt;/servlet-name&gt; <br />    &lt;servlet-class&gt; <br />       org.springframework.web.servlet.DispatcherServlet <br />    &lt;/servlet-class&gt; <br />    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />  &lt;/servlet&gt; <br /><br />  &lt;servlet-mapping&gt; <br />    &lt;servlet-name&gt;springapp&lt;/servlet-name&gt; <br />    &lt;url-pattern&gt;*.htm&lt;/url-pattern&gt; <br />  &lt;/servlet-mapping&gt; <br /><br />  &lt;welcome-file-list&gt; <br />    &lt;welcome-file&gt; <br />      index.jsp <br />    &lt;/welcome-file&gt; <br />  &lt;/welcome-file-list&gt; <br /><br />&lt;/web-app&gt; <br /><br /><br /><br />在WEB-INF目录下创建一个springapp-servlet.xml<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>，它的命名规则是web.xml中的servlet-name 加上'-servlet'后缀,这是在springframework中的标准命名法则. <br />现在，我们声明一个bean :springappController 他对应的类是SpringappController.class <br />这个定义用于我们控制业务逻辑。我们还需要定义一个url mapping作为http调用的路径. <br /><br /><br /><br />代码: <br />springapp/WEB-INF/springapp-servlet.xml <br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; <br /><br />&lt;!-- <br />  - Application context definition for "springapp" DispatcherServlet. <br />  --&gt; <br /><br />&lt;beans&gt; <br />    &lt;bean id="springappController" class="SpringappController"/&gt; <br /><br />    &lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; <br />        &lt;property name="mappings"&gt; <br />            &lt;props&gt; <br />                &lt;prop key="/hello.htm"&gt;springappController&lt;/prop&gt; <br />            &lt;/props&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; <br />&lt;/beans&gt; <br /><br /><br /><br />第7步：添加支持包 <br /><br />从spring的下载<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>包中找到,spring.jar (spring-framework-1.0-m1/dist/spring.jar) 拷贝到WEB-INF/lib下面。 <br />拷贝spring-framework-1.0-m1/lib/log4j/log4j-1.2.8.jar 和 spring-framework-1.0-m1/lib/jakarta-commons/commons-logging.jar到WEB-INF/lib下面。 <br /><br />第8步：创建springappController <br /><br />代码: <br /><br />springapp/src/SpringappController.<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a> <br />import org.springframework.web.servlet.mvc.Controller; <br />import org.springframework.web.servlet.ModelAndView; <br /><br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.ServletException; <br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.http.HttpServletRequest; <br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.http.HttpServletResponse; <br /><br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>.io.IOException; <br /><br />public class SpringappController implements Controller { <br /><br />    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) <br />            throws ServletException, IOException { <br />        return new ModelAndView(""); <br />    } <br />} <br /><br /><br />这只是一个基础控制框架，稍候我们完成它. <br /><br /><br />第9步:建立应用 <br /><br />代码: <br />Ant build <br />E:\projects\springapp&gt;ant build <br />Buildfile: build.xml <br /><br />build: <br />    [<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>c] Compiling 1 source file to E:\projects\springapp\WEB-INF\classes <br /><br />BUILD SUCCESSFUL <br />Total time: 2 seconds <br /><br /><br />第10步:建立日志<a href="http://www.myfaq.com.cn/System/index.html" target="_blank">系统</a> <br />spring利用log4j来管理日志，在classes目录下建立log4j.properties <br /><br />代码: <br />springapp/war/WEB-INF/classes/log4j.properties <br />log4j.rootCategory=INFO, stdout, logfile <br /><br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender <br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout <br />log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - &lt;%m&gt;%n <br /><br />log4j.appender.logfile=org.apache.log4j.RollingFileAppender <br />log4j.appender.logfile.File=e:/projects/springapp/springapp.log <br />log4j.appender.logfile.MaxFileSize=512KB <br /># Keep three backup files <br />log4j.appender.logfile.MaxBackupIndex=3 <br />log4j.appender.logfile.layout=org.apache.log4j.PatternLayout <br />#Pattern to output : date priority [category] - &lt;message&gt;line_separator <br />log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - &lt;%m&gt;%n <br /><br /><br />第11步：部署应用 <br />运行ant deploy <br /><br />第12步：创建视图 <br /><br />代码: <br />springapp/war/hello.jsp <br />&lt;html&gt; <br />&lt;head&gt;&lt;title&gt;Example :: Spring Application&lt;/title&gt;&lt;/head&gt; <br />&lt;body&gt; <br />&lt;h1&gt;Hello - Spring Application&lt;/h1&gt; <br />&lt;p&gt;Greetings.&lt;/p&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br /><br />下面我们修改SpringappController.<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a> <br /><br />代码: <br /><br />springapp/src/SpringappController.<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a> <br />import org.springframework.web.servlet.mvc.Controller; <br />import org.springframework.web.servlet.ModelAndView; <br /><br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.ServletException; <br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.http.HttpServletRequest; <br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>x.servlet.http.HttpServletResponse; <br /><br />import <a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>.io.IOException; <br /><br />import org.apache.commons.logging.Log; <br />import org.apache.commons.logging.LogFactory; <br /><br />public class SpringappController implements Controller { <br /><br />   /** Logger for this class and subclasses */ <br />    protected final Log logger = LogFactory.getLog(getClass()); <br /><br />    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) <br />            throws ServletException, IOException { <br /><br />       logger.info("SpringappController - returning hello view"); <br /><br />        return new ModelAndView("hello.jsp"); <br />    } <br />} <br /><br /><br />现在我们运行build, deploy, stop, start 命令. <br />这样我们就成功地建立了一个mvc应用，访问http://loaclhost:8080/springapp/hello.htm <br /><br /><br />小结 <br />以上，我们快速地利用spring framework建立了M<a href="http://www.myfaq.com.cn/Dev/Programme/VC/index.html" target="_blank">VC</a>应用<a href="http://www.myfaq.com.cn/Dev/index.html" target="_blank">程序</a>, <br />1、建立index.jsp,测试管理工具和开发环境 <br />2、编写springapp-servlet.xml配置<a href="http://www.myfaq.com.cn/Soft/Tools/File/index.html" target="_blank">文件</a>。 <br />3、编写控制器代码,SpringappController.<a href="http://www.myfaq.com.cn/Dev/Programme/Java/index.html" target="_blank">java</a>结合springapp-servlet中的定义进行工作. <br />4、编写、展示hello.jsp,完成M<a href="http://www.myfaq.com.cn/Dev/Programme/VC/index.html" target="_blank">VC</a>的应用<a href="http://www.myfaq.com.cn/Dev/index.html" target="_blank">程序</a>. <br /></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/yaominxi/aggbug/47172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-20 14:47 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/20/47172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为公司 java 面试题</title><link>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Fri, 19 May 2006 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47096.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47096.html</trackback:ping><description><![CDATA[
<div class="postTitle"><a href="http://blog.csdn.net/shuidisha/archive/2006/05/18/744313.aspx"><img width="15" height="13" border="0" src="http://blog.csdn.net/images/zhuan.gif"/> 华为公司 java 面试题</a> <script xml:space="preserve" type="text/javascript" language="javascript">
//
ocument.title="华为公司 java 面试题 - "+document.title
//
</script></div>
<div class="postText">
<p>第一部分：选择题<br/>QUESTION NO: 1<br/>1、public class Test {<br/>public static void changeStr(String str){<br/>str="welcome";<br/>}<br/>public static void main(String[] args) {<br/>String str="1234";<br/>changeStr(str);<br/>System.out.println(str);<br/>}<br/>}<br/>Please write the output result ：</p>
<p>QUESTION NO:2<br/>1. public class Test {<br/>2. static boolean foo(char c) {<br/>3. System.out.print(c);<br/>4. return true;<br/>5. }<br/>6. public static void main( String[] argv ) {<br/>7. int i =0;<br/>8. for ( foo('A'); foo('B')&amp;&amp;(i&lt;2); foo('C')){<br/>9. i++ ;<br/>10. foo('D');<br/>12. }<br/>13. }<br/>14. }<br/>What is the result?<br/>A. ABDCBDCB<br/>B. ABCDABCD<br/>C. Compilation fails.<br/>D. An exception is thrown at runtime.</p>
<p>QUESTION NO: 3<br/>1. class A {<br/>2. protected int method1(int a, int b) { return 0; }<br/>3. }<br/>Which two are valid in a class that extends class A? (Choose two)<br/>A. public int method1(int a, int b) { return 0; }<br/>B. private int method1(int a, int b) { return 0; }<br/>C. private int method1(int a, long b) { return 0; }<br/>D. public short method1(int a, int b) { return 0; }<br/>E. static protected int method1(int a, int b) { return 0; }</p>
<p>QUESTION NO: 4<br/>1. public class Outer{<br/>2. public void someOuterMethod() {<br/>3. // Line 3<br/>4. }<br/>5. public class Inner{}<br/>6. public static void main( String[]argv ) {<br/>7. Outer o = new Outer();<br/>8. // Line 8<br/>9. }<br/>10. }<br/>Which instantiates an instance of Inner?<br/>A. new Inner(); // At line 3<br/>B. new Inner(); // At line 8<br/>C. new o.Inner(); // At line 8<br/>D. new Outer.Inner(); // At line 8//new Outer().new Inner()</p>
<p>QUESTION NO: 5<br/>Which method is used by a servlet to place its session ID in a URL that is written to the servlet's response output stream?<br/>A. The encodeURL method of the HttpServletRequest interface.<br/>B. The encodeURL method of the HttpServletResponse interface.<br/>C. The rewriteURL method of the HttpServletRequest interface.<br/>D. The rewriteURL method of the HttpServletResponse interface.</p>
<p>QUESTION NO: 6<br/>Which two are equivalent? (Choose two)<br/>A. &lt;%= YoshiBean.size%&gt;<br/>B. &lt;%= YoshiBean.getSize()%&gt;<br/>C. &lt;%= YoshiBean.getProperty("size")%&gt;<br/>D. &lt;jsp:getProperty id="YoshiBean" param="size"/&gt;<br/>E. &lt;jsp:getProperty name="YoshiBean" param="size"/&gt;<br/>F. &lt;jsp:getProperty id="YoshiBean" property="size"/&gt;<br/>G. &lt;jsp:getProperty name="YoshiBean" property="size"/&gt;</p>
<p>QUESTION NO: 7<br/>Which of the following statements regarding the lifecycle of a session bean are correct?<br/>1. java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.<br/>2. SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.<br/>3. An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.<br/>4. JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.<br/>5. Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.</p>
<p><br/>第二部分：概念题<br/>1． 描述Struts体系结构？对应各个部分的开发工作主要包括哪些？</p>
<br/><br/><br/><br/><br/><br/><p>2． XML包括哪些解释技术，区别是什么？</p>
<br/><br/><p><br/>3． JSP有哪些内置对象和动作？它们的作用分别是什么？</p>
<br/><br/><br/><br/><br/><br/><p><br/>4、SQL问答题<br/>SELECT * FROM TABLE<br/>和<br/>SELECT * FROM TABLE<br/>WHERE NAME LIKE '%%' AND ADDR LIKE '%%'<br/>AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'<br/>OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )<br/>的检索结果为何不同？</p>
<br/><p>5、SQL问答题<br/>表结构：<br/>1、 表名：g_cardapply<br/>字段(字段名/类型/长度)：<br/>g_applyno varchar 8；//申请单号（关键字）<br/>g_applydate bigint 8；//申请日期<br/>g_state varchar 2；//申请状态<br/>2、 表名：g_cardapplydetail<br/>字段(字段名/类型/长度)：<br/>g_applyno varchar 8；//申请单号（关键字）<br/>g_name varchar 30；//申请人姓名<br/>g_idcard varchar 18；//申请人身份证号<br/>g_state varchar 2；//申请状态<br/>其中，两个表的关联字段为申请单号。<br/>题目：<br/>1、 查询身份证号码为440401430103082的申请日期<br/>2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数<br/>3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07<br/>4、 删除g_cardapplydetail表中所有姓李的记录</p>
</div>
<img src ="http://www.blogjava.net/yaominxi/aggbug/47096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-19 18:10 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/19/47096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Log4j进行日志操作</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39351.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39351.html</trackback:ping><description><![CDATA[
<p><a name="1"><span class="atitle2">1. 概述</span></a></p>
<p><a name="1_1"><span class="atitle3">1.1. 背景</span></a></p>
<p>在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。</p>
<p>最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。</p>
<p><a name="1_2"><span class="atitle3">1.2. Log4j简介</span></a></p>
<p>在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。</p>
<p>Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。</p>
<p>此外，通过Log4j其他语言接口，您可以在C、C++、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。</p>
<p>本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别，并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天，相信Log4j将会给广大的设计开发人员带来方便。加入到Log4j的队伍来吧！</p>
<p><a name="2"><span class="atitle2">2. 一个简单的例子</span></a></p>
<p>我们先来看一个简单的例子，它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j，而是使用了一系列的打印语句，然后我们将使用Log4j来实现它的日志功能。这样，大家就可以清楚地比较出前后两个代码的差别。</p>
<p><a name="2_1"><span class="atitle3">2.1. 不使用Log4j</span></a></p>
<p><strong>2.1.1. 客户程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Client Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ClientWithoutLog4j {

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {

        String welcome = null;
        String response = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        InputStream in = null;
        OutputStream out = null;
        Socket client = null;

        try {
            client = new Socket ( "localhost", 8001 ) ;
            System.out.println ( "info: Client socket: " + client ) ;
            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {
            System.out.println ( "error: IOException : " + e ) ;
            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;
            System.out.println ( "debug: Server says: '" + welcome + "'" ) ;

            System.out.println ( "debug: HELLO" ) ;
            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'") ;

            System.out.println ( "debug: HELP" ) ;
            writer.println ( "HELP" ) ;
            response = reader.readLine () ;
            System.out.println ( "debug: Server responds: '" + response + "'" ) ;

            System.out.println ( "debug: QUIT" ) ;
            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {
            System.out.println ( "warn: IOException in client.in.readln()" ) ;
            System.out.println ( e ) ;
        }
        try{
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}
</code>
</pre>
<p><strong>2.1.2. 服务器程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.util.* ;
import java.io.* ;
import java.net.* ;

/**
 *
 * &lt;p&gt; Server Without Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ServerWithoutLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {
        String clientRequest = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        ServerSocket server = null;
        Socket socket = null;
        InputStream in = null;
        OutputStream out = null;

        try {
            server = new ServerSocket ( SERVER_PORT ) ;
            System.out.println ( "info: ServerSocket before accept: " + server ) ;
            System.out.println ( "info: Java server without log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept () ;
            System.out.println ( "info: ServerSocket after accept: " + server )  ;

            in = socket.getInputStream () ;
            out = socket.getOutputStream () ;

        } catch ( IOException e ) {
            System.out.println( "error: Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ) , true ) ;

        // send welcome string to client
        writer.println ( "Java server without log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;
                System.out.println ( "debug: Client says: " + clientRequest ) ;
                if ( clientRequest.startsWith ( "HELP" ) ) {
                    System.out.println ( "debug: OK!" ) ;
                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {
                        System.out.println ( "debug: OK!" ) ;
                        System.exit ( 0 ) ;
                    }
                    else{
                        System.out.println ( "warn: Command '" + 
      clientRequest + "' not understood." ) ;
                        writer.println ( "Command '" + clientRequest 
      + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {
                System.out.println ( "error: IOException in Server " + e ) ;
                System.exit ( 0 ) ;
            }
        }
    }
}
</code>
</pre>
<p><a name="2_2"><span class="atitle3">2.2. 迁移到Log4j</span></a></p>
<p><strong>2.2.1. 客户程序</strong></p>
<pre xml:space="preserve">
<code>package log4j ;

import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * &lt;p&gt; Client With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ClientWithLog4j {

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ClientWithLog4j.class.getName () ) ;

    /**
     *
     * @param args : configuration file name
     */
    public static void main ( String args [] ) {

        String welcome = null ;
        String response = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        InputStream in = null ;
        OutputStream out = null ;
        Socket client = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ClientWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            client = new Socket( "localhost" , 8001 ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Client socket: " + client ) ;

            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "IOException : " + e ) ;

            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
            writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

            welcome = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server says: '" + welcome + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELLO" ) ;

            writer.println ( "HELLO" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'" ) ;

            // add for log4j: log a message with the debug level
            logger.debug ( "HELP" ) ;

            writer.println ( "HELP" ) ;
            response = reader.readLine () ;

            // add for log4j: log a message with the debug level
            logger.debug ( "Server responds: '" + response + "'") ;

            // add for log4j: log a message with the debug level
            logger.debug ( "QUIT" ) ;

            writer.println ( "QUIT" ) ;
        } catch ( IOException e ) {

            // add for log4j: log a message with the warn level
            logger.warn ( "IOException in client.in.readln()" ) ;

            System.out.println ( e ) ;
        }
        try {
            Thread.sleep ( 2000 ) ;
        } catch ( Exception ignored ) {}
    }
}
</code>
</pre>
<p><strong>2.2.2. 服务器程序</strong></p>
<pre xml:space="preserve">
<code>package log4j;

import java.util.* ;
import java.io.* ;
import java.net.* ;

// add for log4j: import some package
import org.apache.log4j.PropertyConfigurator ;
import org.apache.log4j.Logger ;
import org.apache.log4j.Level ;

/**
 *
 * &lt;p&gt; Server With Log4j &lt;/p&gt;
 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;
 * @version 1.0
 */
public class ServerWithLog4j {

    final static int SERVER_PORT = 8001 ; // this server's port

    /*
    add for log4j: class Logger is the central class in the log4j package.
    we can do most logging operations by Logger except configuration.
    getLogger(...): retrieve a logger by name, if not then create for it.
    */
    static Logger logger = Logger.getLogger 
 ( ServerWithLog4j.class.getName () ) ;

    /**
     *
     * @param args
     */
    public static void main ( String args[]) {
        String clientRequest = null ;
        BufferedReader reader = null ;
        PrintWriter writer = null ;
        ServerSocket server = null ;
        Socket socket = null ;

        InputStream in = null ;
        OutputStream out = null ;

        /*
        add for log4j: class BasicConfigurator can quickly configure the package.
        print the information to console.
        */
        PropertyConfigurator.configure ( "ServerWithLog4j.properties" ) ;

        // add for log4j: set the level
//        logger.setLevel ( ( Level ) Level.DEBUG ) ;

        try{
            server = new ServerSocket ( SERVER_PORT ) ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket before accept: " + server ) ;

            // add for log4j: log a message with the info level
            logger.info ( "Java server with log4j, on-line!" ) ;

            // wait for client's connection
            socket = server.accept() ;

            // add for log4j: log a message with the info level
            logger.info ( "ServerSocket after accept: " + server ) ;

            in = socket.getInputStream() ;
            out = socket.getOutputStream() ;

        } catch ( IOException e ) {

            // add for log4j: log a message with the error level
            logger.error ( "Server constructor IOException: " + e ) ;
            System.exit ( 0 ) ;
        }
        reader = new BufferedReader ( new InputStreamReader ( in ) ) ;
        writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;

        // send welcome string to client
        writer.println ( "Java server with log4j, " + new Date () ) ;

        while ( true ) {
            try {
                // read from client
                clientRequest = reader.readLine () ;

                // add for log4j: log a message with the debug level
                logger.debug ( "Client says: " + clientRequest ) ;

                if ( clientRequest.startsWith ( "HELP" ) ) {

                    // add for log4j: log a message with the debug level
                    logger.debug ( "OK!" ) ;

                    writer.println ( "Vocabulary: HELP QUIT" ) ;
                }
                else {
                    if ( clientRequest.startsWith ( "QUIT" ) ) {

                        // add for log4j: log a message with the debug level
                        logger.debug ( "OK!" ) ;

                        System.exit ( 0 ) ;
                    }
                    else {

                        // add for log4j: log a message with the warn level
                        logger.warn ( "Command '" 
      + clientRequest + "' not understood." ) ;

                        writer.println ( "Command '"
      + clientRequest + "' not understood." ) ;
                    }
                }
            } catch ( IOException e ) {

                // add for log4j: log a message with the error level
                logger.error( "IOException in Server " + e ) ;

                System.exit ( 0 ) ;
            }
        }
    }
}
</code>
</pre>
<p><strong>2.2.3. 配置文件</strong></p>
<p>2.2.3.1. 客户程序配置文件</p>
<pre xml:space="preserve">
<code>log4j.rootLogger=INFO, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
</code>
</pre>
<p>2.2.3.2. 服务器程序配置文件</p>
<pre xml:space="preserve">
<code>log4j.rootLogger=INFO, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
</code>
</pre>
<p><a name="2_3"><span class="atitle3">2.3. 比较</span></a></p>
<p>比较这两个应用可以看出，采用Log4j进行日志操作的整个过程相当简单明了，与直接使用System.out.println语句进行日志信息输出的方式相比，基本上没有增加代码量，同时能够清楚地理解每一条日志信息的重要程度。通过控制配置文件，我们还可以灵活地修改日志信息的格式，输出目的地等等方面，而单纯依靠System.out.println语句，显然需要做更多的工作。</p>
<p>下面我们将以前面使用Log4j的应用作为例子，详细讲解使用Log4j的主要步骤。</p>
<p><a name="3"><span class="atitle2">3. Log4j基本使用方法</span></a></p>
<p>Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。</p>
<p><a name="3_1"><span class="atitle3">3.1.定义配置文件</span></a></p>
<p>其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。</p>
<p>Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：</p>
<ol class="n01">
<li>配置根Logger，其语法为：<br/><pre xml:space="preserve">
log4j.rootLogger = [ level ] , appenderName, appenderName, …
</pre>
其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br/>appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br/></li>
<li>配置日志信息输出目的地Appender，其语法为<br/><pre xml:space="preserve">
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
</pre>
其中，Log4j提供的appender有以下几种：<br/>org.apache.log4j.ConsoleAppender（控制台），<br/>org.apache.log4j.FileAppender（文件），<br/>org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br/>org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br/></li>
<li>配置日志信息的格式（布局），其语法为：<br/><pre xml:space="preserve">
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
</pre>
其中，Log4j提供的layout有以下几种：<br/>org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br/>org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br/>org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br/>org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br/></li>
</ol>
<p><a name="3_2"><span class="atitle3">3.2.在代码中使用Log4j</span></a></p>
<p>下面将讲述在程序代码中怎样使用Log4j。</p>
<p><strong>3.2.1.得到记录器</strong></p>
<p>使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：<br/></p>
<pre xml:space="preserve">
public static Logger getLogger( String name)，
</pre>
通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br/><pre xml:space="preserve">
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;
</pre>
<p><strong>3.2.2.读取配置文件</strong></p>
<p>当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br/>BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br/>PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br/>DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。</p>
<p><strong>3.2.3.插入记录信息（格式化日志信息）</strong></p>
<p>当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：</p>
<pre xml:space="preserve">
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
</pre>
<p><a name="resources" id="resources"><span class="atitle2">4. 参考资料</span></a></p>
<p>如果您想更深入地了解Log4j，请经常访问下面提及的相关链接。<br/>Log4j项目主页------------------------------------------------------<a href="http://www.log4j.org/"><span style="COLOR: #003399">http://www.log4j.org/</span></a><br/>Log4j FAQ -------------------------------------------------------<a href="http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html"><span style="COLOR: #003399">http://www-900.ibm.com/developerWorks/cn/java/l-log4j/www.log4j.org/log4j/faq.html</span></a></p>
<!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
<img src ="http://www.blogjava.net/yaominxi/aggbug/39351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:38 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork 和 spring 的整合</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39349.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39349.html</trackback:ping><description><![CDATA[
<br/><p><br/></p>
<p><br/>1 适合读者<br/>本文针对有一定的web基础，webwork基础，对spring有一定的了解。</p>
<p><a href="http://www.springframework.org/"><span style="COLOR: #003399">http://www.springframework.org/</span></a> 站点可以了解更多关于spring的详细信息. Spring是一个很好的AOP框架，能提供自动的事务管理。</p>
<p><a href="http://www.opensymphony.com/webwork/"><span style="COLOR: #003399">http://www.opensymphony.com/webwork/</span></a> 站点可以了解更多的webwork . Webwork是一个很好的 MVC 框架，以下简单介绍，webwork 和 spring 的融合，以用户注册为例。</p>
<p>2 整合步骤<br/>2 .1使用 SpringObjectFactory<br/>dev.java.net上的 xwork-optional 包括了对 xwork-spring 的支持，可以下载些包。包中只有4个类，可以根据具体情况使用。我在例子中使用了SpringObjectFactory类和SpringObjectFactoryListener 类，并安照webwork的文件在web.xml加入了，以下节点</p>
<p>&lt;!-- This needs to be after Spring ContextLoaderListener --&gt;</p>
<p>&lt;listener&gt;</p>
<p>&lt;listener-class&gt;com.opensymphony.xwork.spring.SpringObjectFactoryListener&lt;/listener-class&gt;</p>
<p>&lt;/listener&gt;</p>
<p>但在实际工作中不能使用，回为在SpringObjectFactoryListener类中写的，加载些类必须要先加载org.springframework.web.context.ContextLoaderListener类，由于些类在web.xml配置如下，后于listener的执行。</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;spring&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;</p>
<p>&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>ContextLoaderServlet 的作用是加载 spring配置信息（在int方法中），SpringObjectFactoryListener 的作用是设置 XWork 和 Webwork 的环境，使这能从spring 中加载数据和信息（在contextInitialized(ServletContextEvent event)方法中，当启动web应用程序是调用）.</p>
<p>要使ContextLoaderServlet比SpringObjectFactoryListener类更早执行，我使用的方法是重载ContextLoaderServlet，在中子类的int方法中设置XWork 和 Webwork 的环境，去掉SpringObjectFactoryListener 监听器，并整改web.xml中的spring配置，如下：</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;spring&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;spring.server.ContextLoaderServletServer&lt;/servlet-class&gt;</p>
<p>&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>2 .2 配置webwork<br/>在webwork.xml中增加如下节点</p>
<p>&lt;action name="registerSupport-spring" class="registerSupportBean" &gt;</p>
<p>&lt;result name="success" type="dispatcher"&gt;</p>
<p>&lt;param name="location"&gt;/register-result.jsp&lt;/param&gt;</p>
<p>&lt;/result&gt;</p>
<p>&lt;result name="input" type="dispatcher"&gt;</p>
<p>&lt;param name="location"&gt;/registerSupport.jsp&lt;/param&gt;</p>
<p>&lt;/result&gt;</p>
<p>&lt;interceptor-ref name="validationWorkflowStack"/&gt;</p>
<p>&lt;/action&gt;</p>
<p>其中的registerSupportBean在spring中配置</p>
<p>2 .3 配置spring<br/>在spring中加入action 配置如下</p>
<p>&lt;!-- action --&gt;</p>
<p>&lt;bean name="registerSupportBean" class="spring.action.RegisterActionSupport"</p>
<p>singleton="false" &gt;</p>
<p>&lt;property name="userBean"&gt;</p>
<p>&lt;ref bean="userBean"/&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p>些处的registerSupportBean 即为在webwork中要调用的类名。<br/></p>
Copyright 2003-2005 www.sohozu.com All Rights Reserved<br/><img src ="http://www.blogjava.net/yaominxi/aggbug/39349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:35 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Myeclipse快速开发struts应用程序</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39344.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39344.html</trackback:ping><description><![CDATA[
<p>开发环境：<br/>　　jdk5.0<br/>　　eclipse3.1M7 (观众问：为啥还在用eclipse3.1M7呢？答曰：没办法，偶奶奶家还是拨号上网。^*^)<br/>　　myeclipse3.84<br/>　　tomcat5.0.28<br/>　　<br/>　　简介：<br/>　　文本主要介绍用myeclipse的struts designer（图形化开发环境）开发一个简单的用户登录程序片段。<br/>　　主要包括2个jsp文件、一个ActionForm、一个Action等其它<br/>　　userLogin.jsp(用户登录及错误提示页面) userLoginSuccess.jsp(提示登录成功页面)<br/>　　UserLoginForm.java(ActionForm,存放用户提交信息)<br/>　　UserLoginAction.java(Action,简单的处理用户登录事件)<br/>　　<br/>　　开始吧<br/>　　首先我们先建立一个j2ee的web project.如图1:<br/>　<br/></p>
<center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.35.42.1.gif"/></center>
<br/>　　点击next,Project name输入LoginDemo,其余保持默认,点击finish.<br/>　　在package explorer下,就可以看到我们的项目了,然后给这个项目添加Struts框架必要的文件.在我们项目名上点击右键,选择MyEclipes --&gt; Add Struts Capabilities...弹出对话框图2：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.35.58.2.gif"/></center>
<br/>　　其中Struts config path就是我们的struts配置文件，URL pattern我们选择*.do，Default application resource为我们默认的资源文件地方，你可以选择它的存储位置，我们在这里保持默认。点击Finish后，项目结构类似于图3：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.15.3.jpg"/></center>
<br/>　　现在就来开始我们的例子吧。首先修改/WEB-INF/web.xml文件,为其添加标签库(在使用中发现，不添加也能成功。但为了保持书上一致，还是添加安全些。hoho~~)将下面代码添加至 &lt;/webapp&gt; 上面：<br/>　　<br/>　　&lt;taglib&gt;<br/>　　&lt;taglib-uri&gt;/tags/struts-html&lt;/taglib-uri&gt;<br/>　　&lt;taglib-location&gt;/WEB-INF/struts-html.tld&lt;/taglib-location&gt;<br/>　　&lt;/taglib&gt;<br/>　　<br/>　　&lt;taglib&gt;<br/>　　&lt;taglib-uri&gt;/tags/struts-bean&lt;/taglib-uri&gt;<br/>　　&lt;taglib-location&gt;/WEB-INF/struts-bean.tld&lt;/taglib-location&gt;<br/>　　&lt;/taglib&gt;<br/>　　<br/>　　&lt;taglib&gt;<br/>　　&lt;taglib-uri&gt;/tags/struts-logic&lt;/taglib-uri&gt;<br/>　　&lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt;<br/>　　&lt;/taglib&gt;<br/>　　完成后，打开struts-config.xml文件，点击这个界面左下角的Design进入可视化设计界面。有没有注意右边的Palette :) 点击它，让我们来开始我们的jsp页面设计。我们先建立userLoginSuccess.jsp文件，为啥先建这一个呢？等下就知道了，在myeclipse中可以一次性把我们的Action,ActionForm,Jsp文件一次建好（将三个有关联的文件等下创建）。<br/>　　点击Palette面版上的创建JSP文件图标,弹出创建JSP文件面板。图4：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.29.4.gif"/></center>
<br/>　　在File Name里输入userLoginSuccess.jsp，Template to use选择2] Standard JSP using Struts 1.1,点击Finish完成。<br/>　　完成后，struts-config.xml文件自动被更新，可视化界在上也出现了刚新建的JSP模块。新建的jsp文件也被打开了。<br/>　　覆盖所有的&lt;%@ taglib ...... 为我们开始在/WEB-INF/web.xml中定义的：<br/>　　<br/>　　&lt;%@ taglib uri="/tags/struts-html" prefix="html"%&gt;<br/>　　&lt;%@ taglib uri="/tags/struts-bean" prefix="bean"%&gt;<br/>　　&lt;%@ taglib uri="/tags/struts-logic" prefix="logic"%&gt;<br/>　　<br/>　　然后在&lt;body&gt;&lt;/body&gt;中添加:<br/>　　Hello &lt;bean:write name="userName" scope="request" /&gt; .<br/>　　这里将request中的属性userName输出在页面上，所以等下我们在UserLoginAction中，登录成功后要设置一个相关属性。<br/>　　<br/>　　OK,下面来开始我们最后三个文件的设计吧。在Struts-config.xml的Design模式中，在画版的空白区域点右键，选择New --&gt; New Form, Action and JSP 弹出ActionForm的选项面板，我们按图上输入相关值，图5：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.36.45.5.gif"/></center>
<br/>　　在Optional Details的Form Properties选项卡，点add为这个ActionForm添加相关值，在这个登录示例中，将添加两个属性userName和password，图6：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.1.6.jpg"/></center>
<br/>　　在添加password时，注意将JSP input type 下拉框选择password.<br/>　　完成这步后，我们就将ActionForm设计完成。<br/>　　接下来选择 Optional Details的JSP选项卡,我们选中Create JSP form? 这一步myeclipse将为我们创建一个简单的与用户交互的登录页面。保持内容和图7一样。图7：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.14.7.gif"/></center>
<br/>　　因为我们这只是简单的演示一个登录片段，所以不用验证用户信息是否合法，所以将 Option Details的method选项卡的新建方法去掉，如图8：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.31.8.gif"/></center>
<br/>　　点Next，进入Action选项面板.将Option Details的Form选项卡中Validate Form取消选择，如图9：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.37.50.9.gif"/></center>
<br/>　　然后在Forwards选项卡中点add添加成功和失败返回的页面.如图10：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.4.10.jpg"/></center>
<br/>　　点击Finish完成。在Struts-config.xml的Design中，可以看到图11所示：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.18.11.gif"/></center>
<br/>　　最后，简单的修改一下userLogin.jsp,将所有&lt;%@ taglib ...%&gt;替换为：<br/>　　&lt;%@ taglib uri="/tags/struts-html" prefix="html"%&gt;<br/>　　&lt;%@ taglib uri="/tags/struts-bean" prefix="bean"%&gt;<br/>　　修改UserLoginAction中的execute片段为如下所示，图12：<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.32.12.gif"/></center>
<br/>　　OK，完成。。。下面就部暑项目，测试。。。<br/>　　<br/>　　像为项目添加Struts框架一样，在项目名上右击，选择MyEclipse --&gt; Add and Remove Project development.<br/>　　在弹出对话框上，单击add ，在弹出的 New Deployment 对话框上，Server选Tomcat5，点击Finish完成部署，如图13:<br/>　<br/><center>　<img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.38.48.13.gif"/></center>
<br/>　　在用浏览器上打开：http://127.0.0.1:8080/LoginDemo/userLogin.jsp<br/>　　输入密码123456,用户名EricHe。显示成功：<br/>　<br/><center><img src="http://java.chinaitlab.com/imgfiles/2005.7.12.11.39.1.14.jpg"/></center>
<br/>　　如果输错，或不输入，则无反映又回到当前登录页面（因为我们没有设置错误信息）。<br/><img src ="http://www.blogjava.net/yaominxi/aggbug/39344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:32 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Spring 编程入门十大问题解答 </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39343.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39343.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39343.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39343.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1				、如何学习				Spring				？																		　　你可以通过下列途径学习				spring				：																		　　				(1) spring				下载包中				doc				目录下的				MVC-step-by-step				和				sam...&nbsp;&nbsp;<a href='http://www.blogjava.net/yaominxi/archive/2006/04/05/39343.html'>阅读全文</a><img src ="http://www.blogjava.net/yaominxi/aggbug/39343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:29 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式大全</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:24:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39340.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39340.html</trackback:ping><description><![CDATA[
<p>正则表达式用于字符串处理，表单验证等场合，实用高效，但用到时总是不太把握，以致往往要上网查一番。我将一些常用的表达式收藏在这里，作备忘之用。本贴随时会更新。</p>
<p><span style="COLOR: #800080">匹配中文字符的正则表达式： [\u4e00-\u9fa5]</span></p>
<p><span style="COLOR: #000080">匹配双字节字符(包括汉字在内)：[^\x00-\xff]</span></p>
<p><span style="COLOR: #000080">应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</span></p>
<p><span style="COLOR: #000080">String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}</span></p>
<p><span style="COLOR: #800080">匹配空行的正则表达式：\n[\s| ]*\r</span></p>
<p><span style="COLOR: #000080">匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/</span></p>
<p><span style="COLOR: #000080"><span style="COLOR: #800080">匹配首尾空格的正则表达式：(^\s*)|(\s*$)</span></span></p>
<p><span style="COLOR: #800080">应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：</span></p>
<span style="COLOR: #800080">应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：</span>
<p><span style="COLOR: #800080">String.prototype.trim = function()<br/>{<br/>return this.replace(/(^\s*)|(\s*$)/g, "");<br/>}</span></p>
<p><span style="COLOR: #000080">利用正则表达式分解和转换IP地址：</span></p>
<p><span style="COLOR: #000080">下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：</span></p>
<p><span style="COLOR: #000080">function IP2V(ip)<br/>{<br/>re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式<br/>if(re.test(ip))<br/>{<br/>return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br/>}<br/>else<br/>{<br/>throw new Error("Not a valid IP address!")<br/>}<br/>}</span></p>
<p><span style="COLOR: #000080">不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：</span></p>
<p><span style="COLOR: #000080">var ip="10.100.20.168"<br/>ip=ip.split(".")<br/>alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))</span></p>
<p><span style="COLOR: #800080">匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</span></p>
<p><span style="COLOR: #000080">匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?</span></p>
<p><span style="COLOR: #800080">利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]</span></p>
<p><span style="COLOR: #800080">var s="abacabefgeeii"<br/>var s1=s.replace(/(.).*\1/g,"$1")<br/>var re=new RegExp("["+s1+"]","g")<br/>var s2=s.replace(re,"")<br/>alert(s1+s2) //结果为：abcefgi<br/></span><span style="COLOR: #800080"><br/>我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。</span></p>
<p><span style="COLOR: #000080">得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1</span></p>
<p><span style="COLOR: #800080"><span style="COLOR: #000080">s="http://www.9499.net/page1.htm"<br/>s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br/>alert(s)</span></span></p>
<p><span style="COLOR: #800080">利用正则表达式限制网页表单里的文本框输入内容：</span></p>
<p><span style="COLOR: #800080">用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"</span></p>
<p><span style="COLOR: #800080">用正则表达式限制只能输入全角字符：</span> <span style="COLOR: #800080">onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"</span></p>
<p><span style="COLOR: #800080">用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</span></p>
<p><span style="COLOR: #800080">用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</span></p>
<p>正则表达式，正规表达式，正则表达式匹配，正则表达式语法，模式匹配，正规表达式匹配 javascript正则表达式 ASP正则表达式 ASP.NET正则表达式 C#正则表达式 JSP正则表达式 PHP正则表达式 VB.NET正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript <a id="Comments.ascx_CommentList__ctl0_EditLink" name="Comments.ascx_CommentList__ctl0_EditLink"/></p>
<p>正则表达式 regular expression<br/>正则表达式 RegExp<br/>模式 pattern<br/>匹配 Match<br/>.NET命名空间： System.Text.RegularExpression<br/><br/><a id="Comments.ascx_CommentList__ctl1_EditLink" name="Comments.ascx_CommentList__ctl1_EditLink"/></p>
<p>补充：<br/>^\d+$　　//匹配非负整数（正整数 + 0）<br/>^[0-9]*[1-9][0-9]*$　　//匹配正整数<br/>^((-\d+)|(0+))$　　//匹配非正整数（负整数 + 0）<br/>^-[0-9]*[1-9][0-9]*$　　//匹配负整数<br/>^-?\d+$　　　　//匹配整数<br/>^\d+(\.\d+)?$　　//匹配非负浮点数（正浮点数 + 0）<br/>^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$　　//匹配正浮点数<br/>^((-\d+(\.\d+)?)|(0+(\.0+)?))$　　//匹配非正浮点数（负浮点数 + 0）<br/>^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$　　//匹配负浮点数<br/>^(-?\d+)(\.\d+)?$　　//匹配浮点数<br/>^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br/>^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br/>^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br/>^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br/>^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br/>^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$　　　　//匹配email地址<br/>^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$　　//匹配url <a id="Comments.ascx_CommentList__ctl2_EditLink" name="Comments.ascx_CommentList__ctl2_EditLink"/></p>
<p>利用正则表达式去除字串中重复的字符的算法程序：<br/><br/>var s="abacabefgeeii"<br/>var s1=s.replace(/(.).*\1/g,"$1")<br/>var re=new RegExp("["+s1+"]","g")<br/>var s2=s.replace(re,"")<br/>alert(s1+s2) //结果为：abcefgi<br/>===============================<br/>如果var s = "abacabefggeeii"<br/>结果就不对了，结果为：abeicfgg<br/>正则表达式的能力有限 <a id="Comments.ascx_CommentList__ctl3_EditLink" name="Comments.ascx_CommentList__ctl3_EditLink"/></p>
<p>RE: totoro<br/>谢谢你的指点，这个javascript正则表达式程序算法确实有问题，我会试着找更好的办法!!! <a id="Comments.ascx_CommentList__ctl4_EditLink" name="Comments.ascx_CommentList__ctl4_EditLink"/></p>
<p>1.确认有效电子邮件格式<br/>下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址，则 IsValidEmail 方法返回 true，否则返回 false，但不采取其他任何操作。您可以使用 IsValidEmail，在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前，筛选出包含无效字符的电子邮件地址。<br/><br/>[Visual Basic]<br/>Function IsValidEmail(strIn As String) As Boolean<br/>' Return true if strIn is in valid e-mail format.<br/>Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")<br/>End Function<br/>[C#]<br/>bool IsValidEmail(string strIn)<br/>{<br/>// Return true if strIn is in valid e-mail format.<br/>return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");<br/>}<br/><br/><br/>2.清理输入字符串<br/>下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法，清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-（连字符）和 .（句点）以外的所有非字母数字字符后返回一个字符串。<br/><br/>[Visual Basic]<br/>Function CleanInput(strIn As String) As String<br/>' Replace invalid characters with empty strings.<br/>Return Regex.Replace(strIn, "[^\w\.@-]", "")<br/>End Function<br/>[C#]<br/>String CleanInput(string strIn)<br/>{<br/>// Replace invalid characters with empty strings.<br/>return Regex.Replace(strIn, @"[^\w\.@-]", "");<br/>}<br/><br/><br/>3.更改日期格式<br/>以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。<br/><br/>[Visual Basic]<br/>Function MDYToDMY(input As String) As String<br/>Return Regex.Replace(input, _<br/>"\b(?&lt;month&gt;\d{1,2})/(?&lt;day&gt;\d{1,2})/(?&lt;year&gt;\d{2,4})\b", _<br/>"${day}-${month}-${year}")<br/>End Function<br/>[C#]<br/>String MDYToDMY(String input)<br/>{<br/>return Regex.Replace(input,<br/>"\\b(?&lt;month&gt;\\d{1,2})/(?&lt;day&gt;\\d{1,2})/(?&lt;year&gt;\\d{2,4})\\b",<br/>"${day}-${month}-${year}");<br/>}<br/>Regex 替换模式<br/>本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中，替换表达式 ${day} 插入由 (?&lt;day&gt;...) 组捕获的子字符串。<br/><br/>有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象，而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式，这将给您带来方便<br/><br/><br/>4.提取 URL 信息<br/>以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如，"http://www.contoso.com:8080/letters/readme.html"将返回"http:8080"。<br/><br/>[Visual Basic]<br/>Function Extension(url As String) As String<br/>Dim r As New Regex("^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/", _<br/>RegexOptions.Compiled)<br/>Return r.Match(url).Result("${proto}${port}")<br/>End Function<br/>[C#]<br/>String Extension(String url)<br/>{<br/>Regex r = new Regex(@"^(?&lt;proto&gt;\w+)://[^/]+?(?&lt;port&gt;:\d+)?/",<br/>RegexOptions.Compiled);<br/>return r.Match(url).Result("${proto}${port}");<br/>}</p>
<div class="postText">
<h2><a name="reconordinarycharacters" id="reconordinarycharacters"/><span style="FONT-SIZE: 0.9em">普通字符</span></h2>
<p>普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。</p>
<p>最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例：</p>
<pre xml:space="preserve">
<code>/a/ /7/ /M/</code>
</pre>
<p>等价的 VBScript 单字符正则表达式为：</p>
<pre xml:space="preserve">
<code>"a" "7" "M"</code>
</pre>
<p>可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 JScript 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。</p>
<pre xml:space="preserve">
<code>/a7M/</code>
</pre>
<p>等价的 VBScript 表达式为：</p>
<pre xml:space="preserve">
<code>"a7M"</code>
</pre>
<p>请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。</p>
<h2><a name="reconspecialcharacters" id="reconspecialcharacters"/><span style="FONT-SIZE: 0.9em">特殊字符</span></h2>
<p>有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符，必须首先将这些字符转义，也就是在前面使用一个反斜杠 (\)。下表给出了这些特殊字符及其含义：</p>
<br/><table rules="all" cellspacing="0" frame="box" border="1" cols="2">
<tbody>
<tr valign="top">
<th width="16%">特殊字符</th>
<th width="84%">说明</th>
</tr>
<tr valign="top">
<td width="16%">$</td>
<td width="84%">匹配输入字符串的结尾位置。如果设置了 <strong>RegExp</strong> 对象的 <strong>Multiline</strong> 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</td>
</tr>
<tr valign="top">
<td width="16%">( )</td>
<td width="84%">标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。</td>
</tr>
<tr valign="top">
<td width="16%"><strong>*</strong></td>
<td width="84%">匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</td>
</tr>
<tr valign="top">
<td width="16%"><strong>+</strong></td>
<td width="84%">匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。</td>
</tr>
<tr valign="top">
<td width="16%"><strong>.</strong></td>
<td width="84%">匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</td>
</tr>
<tr valign="top">
<td width="16%">[</td>
<td width="84%">标记一个中括号表达式的开始。要匹配 [，请使用 \[。</td>
</tr>
<tr valign="top">
<td width="16%">?</td>
<td width="84%">匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</td>
</tr>
<tr valign="top">
<td width="16%">\</td>
<td width="84%">将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</td>
</tr>
<tr valign="top">
<td width="16%">^</td>
<td width="84%">匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。</td>
</tr>
<tr valign="top">
<td width="16%">{</td>
<td width="84%">标记限定符表达式的开始。要匹配 {，请使用 \{。</td>
</tr>
<tr valign="top">
<td width="16%">|</td>
<td width="84%">指明两项之间的一个选择。要匹配 |，请使用 \|。</td>
</tr>
</tbody>
</table>
<br/><!--Copyright_START-->
<h2><a name="reconnon" id="reconnon"/><span style="FONT-SIZE: 0.9em">非打印字符</span></h2>
<p>有不少很有用的非打印字符，偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列：</p>
<br/><table rules="all" cellspacing="0" frame="box" border="1" cols="2">
<tbody>
<tr valign="top">
<th width="16%">字符</th>
<th width="84%">含义</th>
</tr>
<tr valign="top">
<td width="16%">\c<em>x</em></td>
<td width="84%">匹配由<em>x</em>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 <em>x</em> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</td>
</tr>
<tr valign="top">
<td width="16%">\f</td>
<td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td>
</tr>
<tr valign="top">
<td width="16%">\n</td>
<td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td>
</tr>
<tr valign="top">
<td width="16%">\r</td>
<td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td>
</tr>
<tr valign="top">
<td width="16%">\s</td>
<td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td>
</tr>
<tr valign="top">
<td width="16%">\S</td>
<td width="84%">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td>
</tr>
<tr valign="top">
<td width="16%">\t</td>
<td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td>
</tr>
<tr valign="top">
<td width="16%">\v</td>
<td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td>
</tr>
</tbody>
</table>
<br/><!--Copyright_START-->
<h2>字符匹配</h2>
<p>句点 (.) 匹配一个字符串中任何单个的打印或非打印字符，除了换行符 (\n) 之外。下面的 JScript 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等，同样也可以匹配 'a1c'、'a2c'、a-c'以及 a#c'：</p>
<pre xml:space="preserve">
<code>/a.c/</code>
</pre>
<p>等价的 VBScript 正则表达式为：</p>
<pre xml:space="preserve">
<code>"a.c"</code>
</pre>
<p>如果试图匹配一个包含文件名的字符串，其中句点 (.) 是输入字符串的一部分，则可以在正则表达式中的句点前面加上一个反斜杠 (\) 字符来实现这一要求。举例来说，下面的 JScript 正则表达式就能匹配 'filename.ext'：</p>
<pre xml:space="preserve">
<code>/filename\.ext/</code>
</pre>
<p>对 VBScript 而言，等价的表达式如下所示：</p>
<pre xml:space="preserve">
<code>"filename\.ext"</code>
</pre>
<p>这些表达式仍然是相当有限的。它们只允许匹配<em>任何</em>单字符。很多情况下，对从列表中匹配特殊字符十分有用。例如，如果输入文字中包含用数字表示为Chapter 1, Chapter 2诸如此类的章节标题，你可能需要找到这些章节标题。</p>
<h3>括号表达式</h3>
<p>可以在一个方括号 ([ 和 ]) 中放入一个或多个单字符，来创建一个待匹配的列表。如果字符被放入括号中括起来，则该列表称为<em>括号表达式</em>。括号内和其他任何地方一样，普通字符代表其本身，也就是说，它们匹配输入文字中出现的一处自己。大多数特殊字符在位于括号表达式中时都将失去其含义。这里有一些例外：</p>
<ul type="disc">
<li>']' 字符如果不是第一项，则将结束一个列表。要在列表中匹配 ']' 字符，请将其放在第一项，紧跟在开始的 '[' 后面。</li>
<li>'\' 仍然作为转义符。要匹配 '\' 字符，请使用 '\\'。</li>
</ul>
<p>括号表达式中所包含的字符只匹配该括号表达式在正则表达式中所处位置的一个单字符。下面的 JScript 正则表达式可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 以及 'Chapter 5'：</p>
<pre xml:space="preserve">
<code>/Chapter [12345]/</code>
</pre>
<p>在 VBScript 中要匹配同样的章节标题，请使用下面的表达式：</p>
<pre xml:space="preserve">
<code>"Chapter [12345]"</code>
</pre>
<p>请注意单词 'Chapter' 及后面的空格与括号内的字符的位置关系是固定的。因此，括号表达式只用来指定满足紧跟在单词 'Chapter' 和一个空格之后的单字符位置的字符集合。这里是第九个字符位置。</p>
<p>如果希望使用范围而不是字符本身来表示待匹配的字符，则可以使用连字符将该范围的开始和结束字符分开。每个字符的字符值将决定其在一个范围内的相对顺序。下面的 JScript 正则表达式包含了一个等价于上面所示的括号列表的范围表达式。</p>
<pre xml:space="preserve">
<code>/Chapter [1-5]/</code>
</pre>
<p>VBScipt 中相同功能的表达式如下所示：</p>
<pre xml:space="preserve">
<code>"Chapter [1-5]"</code>
</pre>
<p>如果以这种方式指定范围，则开始和结束值都包括在该范围内。有一点特别需要注意的是，在 Unicode 排序中起始值一定要在结束值之前。</p>
<p>如果想在括号表达式中包括连字符，则必须使用下述方法之一：</p>
<ul type="disc">
<li>使用反斜杠将其转义：
<pre xml:space="preserve">
<code>[\-]</code>
</pre></li>
<li>将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符：
<pre xml:space="preserve">
<code>[-a-z] [a-z-]</code>
</pre></li>
<li>创建一个范围，其中开始字符的值小于连字符，而结束字符的值等于或大于连字符。下面两个正则表达式都满足这一要求：
<pre xml:space="preserve">
<code>[!--] [!-~]</code>
</pre></li>
</ul>
<p>同样，通过在列表开始处放置一个插入符(^)，就可以查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置，则匹配其本身，没有任何特殊含义。下面的 JScript 正则表达式匹配章节号大于 5 的章节标题：</p>
<pre xml:space="preserve">
<code>/Chapter [^12345]/</code>
</pre>
<p>对 VBScript 则使用：</p>
<pre xml:space="preserve">
<code>"Chapter [^12345]"</code>
</pre>
<p>在上面所示的示例中，表达式将匹配第九个位置处除1, 2, 3, 4, or 5 之外的任何数字字符。因此， 'Chapter 7' 为一个匹配，同样 'Chapter 9' 也是如此。</p>
<p>上面的表达式可以使用连字符 (-) 表示。对 JScript 为：</p>
<pre xml:space="preserve">
<code>/Chapter [^1-5]/</code>
</pre>
<p>或者，对 VBScript 为：</p>
<pre xml:space="preserve">
<code>"Chapter [^1-5]"</code>
</pre>
<p>括号表达式的典型用法是指定对任何大写或小写字母字符或任何数字的匹配。下面的 JScript 表达式给出了这一匹配：</p>
<pre xml:space="preserve">
<code>/[A-Za-z0-9]/</code>
</pre>
<p>等价的 VBScript 表达式为：</p>
<pre xml:space="preserve">
<code>"[A-Za-z0-9]"</code>
</pre>
<!--Copyright_START--></div>
<br/><img src ="http://www.blogjava.net/yaominxi/aggbug/39340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:24 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse+struts+Hibernate配置开发</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39339.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39339.html</trackback:ping><description><![CDATA[
　这个手册只是为初学者制作的环境配置和快速开发的一些基本方法，为的是广大爱好者能快速上手，少走我走过的弯路，里面没有任何关于java模式和其他相关的说明。本人水平有限，也没有能力去讨论关于模式设计和开发细节的一些内容。
<p>　　建议：<br/><br/>　　如果你还不清楚struts和hibernate的一些基本原理，希望能先去了解一下这方面的相关内容。</p>
<p>　　推荐：<br/><br/>　　Hibernate中文手册》作者认为要学Hibernate看这个就足够了，里面几乎包括了所有的细节，不过可能不太适合快速入门。<br/><br/>　　地址：<a href="http://www.hibernate.org/hib_docs/v3/reference/zh-%20cn/html_single/">http://www.hibernate.org/hib_docs/v3/reference/zh-%20cn/html_single/</a><br/><br/>　　关于struts的资料就很多了，这里推荐一个可以下载一些入门教程的网站。<br/><br/>　　地址：<a href="http://www.wnetw.com/jclub/index.jsp">http://www.wnetw.com/jclub/index.jsp</a><br/><br/>　　强烈建议入门的朋友先了解一下基本的原理！否则本文可能对你没有任何帮助。</p>
<p>　　相关工具下载：（注意版本）<br/><br/>　　mysql5.0 <a href="http://www.mysql.org/">http://www.mysql.org/</a><br/>　　eclipse 3.1.1 <a href="http://www.eclipse.org/" target="_blank">http://www.eclipse.org/</a><br/>　　myeclipse4.0.3 <a href="http://www.myeclipseide.com/">http://www.myeclipseide.com/</a><br/>　　tomcat5.5</p>
<p>　　安装：<br/><br/>　　关于tomcat和mysql的安装就不多说了，需要注意的是最好保证你的 jdk是1.5的版本，并配置好你的环境变量，不然可能会遇到一些问题。<br/><br/>　　把eclipse解开，再去安装刚下载的myeclipse，在安装的时候需要把路径指定到刚才解开的eclipse上，由于myeclipse是个收费软件，所以需要注册。不过一般按照Chinese的习惯，去google一个注册码就可以了:}</p>
<p>　　开发环境部署：<br/><br/>　　好了，现在保证你的mysql和tomcat服务能够正常启动，myeclipse能够正常打开（如果不能，可以去找一下相关的说明或者给作者留言）。下面我们就要开始真正的开始部署一个传说中的tomcat+struts+hibernate+mysql结构的工程了！（faint!前言就写的我好累）<br/><br/>　　首先，在myeclipse里新建一个工程。在左边的Package Exporler面版里点右键选择new-&gt;project…<br/><br/>　　在跳出菜单里选择MyEclipse-&gt;J2EE Projects-&gt;Web Project。<br/><br/>　　点击next后进入如下画面：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/3dv4s4cjwa2l.cn/pic/3fa10d830200006m"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/1.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/1.JPG" target="_blank"/></p>
<p><br/>　　工程名为：test<br/><br/>　　结束后点击Finish。<br/><br/>　　好了，如果成功的话你就会在 Package Exporler里看到一个新的test工程！现在我们先配置一下数据库方面的东西。首先在你的mysql 里建立一个数据库webases，再在里面新建一个表admin，里面三个字段分别为id,<a href="http://www.yesky.com/key/99/160099.html" class="bluekey" target="_blank">name</a>,password其中id为自动取值的主键（mysql具体的操作可以自己找资料，不是本文涉及范围）。<br/><br/>　　再回到myeclipse ，选中window-&gt;Open Perspective-&gt;Other…<br/><br/>　　可以看到现在跳出一个名为Select Perspective的菜单，在里面选中MyEclipse Databases Exporler，可以看到现在到了下面的页面。</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/2s5d31zdm346.cn/pic/3fa10d830200006n"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/2.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/2.JPG" target="_blank"/></p>
<p>　　按以上图示输入相关字段后点击Finish便建立了一个数据库连接，在新出现的JDBC for Mysql上点右键，选择Open connection…，确认用户名和密码正确后点OK，如果一切顺利的话你会看到下面的画面：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/0g601v5hykhy.cn/pic/3fa10d830200006o"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/3.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/3.JPG" target="_blank"/></p>
<p>　　这说明你已经和数据库建立了正确的连接。现在我们再回到window-&gt;Open Perspective- &gt;Other…里的MyEclipse，也就是我们刚进来的时候看到的画面。<br/><br/>　　右键点击你刚建立的工程 test并选择MyEclipse-&gt;Add struts Capabilities…在跳出的菜单里按照如下输入并确定：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/r8rfzry4u70v.cn/pic/3fa10d830200006p"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/4.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/4.JPG" target="_blank"/></p>
<p>　　好了，现在你已经为你的工程增加了struts，接下来和上面一样在右键工程后选择MyEclipse- &gt;Add Hibernate Capabilities…一路确定下来为你的工程添加Hibernate。（为方便起见我们在选择路径时把HibernateSessionFactory.java放在了src/com下面，其实最好建立个单独的目录如 src/com/hibernate）<br/><br/>　　为了更好的演示我们不建立通常的登陆页面而是建立个注册页面。选择 src目录下的hibernate.cfg.xml文件。照如下填写并保存。这样hibernate就为你建立了数据库的连接池。</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/w9r22908kj35.cn/pic/3fa10d830200006q"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/5.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/5.JPG" target="_blank"/></p>
<p>　　下面我们再选择WebRoot/WEB-INF/struts-config.xml文件，在画面中点击右键选择new- &gt;Form, Action and JSP。如下填写</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/w0cu77s737rz.cn/pic/3fa10d830200006r"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/6.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/6.JPG" target="_blank"/><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/5.JPG" target="_blank"/></p>
<p>　　再选择JSP选项，如下</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/1x6mi889p265.cn/pic/3fa10d830200006s"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/7.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/7.JPG" target="_blank"/><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/6.JPG" target="_blank"/></p>
<p>　　最后选择Finish。<br/><br/>　　再新建一个一个success.jsp的页面，<br/><br/>　　在刚才struts- config.xml文件里右键<a href="http://www.yesky.com/key/1712/156712.html" class="bluekey" target="_blank">选择a</a>ddAdmin选择Properties，在菜单里选择Forwords，再点add，如下图填写</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/55rct6wh32c3.cn/pic/3fa10d830200006t"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/8.JPG" target="_blank"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/8.JPG" target="_blank"/><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/7.JPG" target="_blank"/></p>
<p>　　最后你的struts-config.xml就是下面这个样子：</p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/9.JPG" target="_blank"/><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/8.JPG" target="_blank"/></p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/17nf5q9p44y5.cn/pic/3fa10d830200006u"/></p>
<p><br/>　　下面我们转到hibernate。换到刚才我们建立数据库的页面，选择你的admin的表点右键选择Create Hibernate Mapping。选择好打包路径后选择Finish。如图：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/k8h07y72ok59.cn/pic/3fa10d830200006v"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/10.JPG" target="_blank"/></p>
<p>　　在你刚才选择的路径下（我为方便是src/com/yourcompanyname/）下新建立的文件 AdminDAOFactory.java文件并输入以下内容：</p>
<p>package com.yourcompanyname;</p>
<p>import java.util.Iterator;</p>
<p>import org.hibernate.HibernateException;<br/>import org.hibernate.Query;<br/>import org.hibernate.Session;<br/>import org.hibernate.Transaction;</p>
<p>import com.hibernate.SessionFactory;</p>
<p>public class AdminDAOFactory {<br/>Session session;<br/>Transaction tx;<br/>public void add(Admin admin) throws HibernateException {<br/>/**<br/>* Creation Date: 11-17-2005<br/>* TODO Add a new admin user.<br/>* @param An object of Admin<br/>* @return void<br/>* @author Coder Guo<br/>*/<br/>try {<br/>session = SessionFactory.currentSession();<br/>tx = session.beginTransaction();<br/>//Add a new admin<br/>session.save(admin);<br/>tx.commit ();<br/>}catch(HibernateException e){<br/>throw e;<br/>}finally{<br/>if (tx!=null) {<br/>tx.rollback();<br/>}<br/>SessionFactory.closeSession();<br/>}<br/>}<br/>}</p>
<p>再打开com.yourcompany.struts.action下的AddAdminAction.java添加（其中如果有错误选中好按ctrl+shift+o自动添加包）</p>
<p>public class AddAdminAction extends Action {</p>
<p>// --------------------------------------------------------- Instance Variables</p>
<p>// --------------------------------------------------------- Methods</p>
<p>/**<br/>* Method execute<br/>* @param mapping<br/>* @param form<br/>* @param request<br/>* @param response<br/>* @return ActionForward<br/>* @author Coder Guo<br/>*/<br/>public ActionForward execute(<br/>ActionMapping mapping,<br/>ActionForm form,<br/>HttpServletRequest request,<br/>HttpServletResponse response) {<br/>AddAdminForm addAdminForm = (AddAdminForm) form;<br/><br/>// TODO Add a new admin<br/>Admin admin = new Admin();<br/>admin.setName(addAdminForm.getName ());<br/>admin.setPassword(addAdminForm.getPassword ());<br/>AdminDAOFactory adminDAO = new AdminDAOFactory ();<br/>adminDAO.add(admin);<br/><br/>return mapping.findForward("success");<br/>}</p>
<p>}</p>
<p>再打开com.yourcompanyname.struts.form下的AddAdminForm.java，修改（如果有错误按照上面说的方法导入包）<br/>public ActionErrors validate(<br/>ActionMapping mapping,<br/>HttpServletRequest request) {</p>
<p>// TODO Auto-generated method stub<br/>ActionErrors errors = new ActionErrors();<br/><br/>Session session = SessionFactory.currentSession();<br/>Transaction tx = session.beginTransaction ();<br/>Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");<br/>Iterator it = query.iterate ();<br/>if (it.hasNext()){<br/>errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));<br/>}<br/>tx.commit();<br/>SessionFactory.closeSession ();<br/>return errors;<br/>}</p>
<p>public void reset(ActionMapping mapping, HttpServletRequest request) {</p>
<p>// TODO Auto-generated method stub<br/>this.name=null;<br/>this.password=null;<br/>}</p>
<p>　　再打开com\yourcompanyname\struts下的ApplicationResource.properties在这里面添加错误信息：<br/><br/>Form.addAdmin.err.name=err</p>
<p>　　最后，（汗，好累啊-_-!）打开addAdmin.jsp修改成如下：<br/><br/>&lt;%@ page contentType="text/html; charset=utf-8"%&gt;<br/>&lt;%@ page language="java"%&gt;<br/>&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-bean">http://jakarta.apache.org/struts/tags-bean</a>" prefix="bean"%&gt;<br/>&lt;%@ taglib uri="<a href="http://jakarta.apache.org/struts/tags-html">http://jakarta.apache.org/struts/tags-html</a>" prefix="html"%&gt;</p>
<p>&lt;script language = "javascript"&gt;<br/>&lt;!--<br/>function <a href="http://www.yesky.com/key/4908/159908.html" class="bluekey" target="_blank">check</a>(){<br/>if (loginForm.userName.value == "" || loginForm.password.value == ""){<br/>alert("请输入完整的信息！");<br/>loginForm.userName.focus();<br/>return false;<br/>}<br/>}<br/>//--&gt;<br/>&lt;/script&gt;<br/><br/>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br/>&lt;html:html&gt;<br/>&lt;head&gt;<br/>&lt;html:base /&gt;<br/><br/>&lt;title&gt;login.jsp&lt;/title&gt;<br/>&lt;link href="css/webcss.css" rel="stylesheet" type="text/css"&gt;<br/><br/>&lt;<a href="http://www.yesky.com/key/4816/159816.html" class="bluekey" target="_blank">meta</a> http-equiv="pragma" content="no- cache"&gt;<br/>&lt;meta http-equiv="cache-control" content="no- cache"&gt;<br/>&lt;meta http-equiv="expires" content="0"&gt;<br/>&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br/>&lt;meta http- equiv="description" content="This is my page"&gt;<br/>&lt;/head&gt;<br/></p>
<p>&lt;body&gt;<br/>&lt;center&gt;<br/>&lt;p&gt;&amp;nbsp;&lt;/p&gt;<br/>&lt;p&gt;&amp;nbsp;&lt;/p&gt;<br/>&lt;table width="<a href="http://www.yesky.com/key/636/160636.html" class="bluekey" target="_blank">30</a>0" border="0" cellpadding="0" cellspacing="0"&gt;<br/>&lt;html:form action="/addAdmin" focus="name" method="GET"&gt;<br/>&lt;tr align="center" valign="middle"&gt;<br/>&lt;td colspan="2" class="typt_normal"&gt;新增管理员&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;td width="100" align="center" valign="middle" class="typt_normal"&gt;名称： &lt;/td&gt;<br/>&lt;td width="200" align="left"&gt;&lt;html:text property="name" styleClass="text_s"/&gt;&lt;html:errors property="addAdmin.err.name"/&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;td width="100" align="center" valign="middle" class="typt_normal"&gt;密码： &lt;/td&gt;<br/>&lt;td width="200" align="left"&gt;&lt;html:password property="password" styleClass="text_s"/&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;td colspan="2" align="center" valign="middle"&gt;&lt;html:submit value="提交" onclick="return check ();"/&gt;&lt;html:reset value="重置"&gt;&lt;/html:reset&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;/html:form&gt;<br/>&lt;/table&gt;<br/>&lt;/center&gt;<br/>&lt;/body&gt;</p>
<p>&lt;/html:html&gt;<br/><br/>　　其中可以看到如何在struts的标签中使用javascript的方法。<br/><br/>　　配置好myeclipse于tomcat的连接。在window-&gt;Preferences做如下设定：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/rfe9mz6n6877.cn/pic/3fa10d830200006w"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/11.JPG" target="_blank"/></p>
<p>　　在项目文件点右键－&gt;"myeclipse"－&gt;"Add and remove project deployment"，如下图：</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/4el6k0a08339.cn/pic/3fa10d830200006x"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/12.JPG" target="_blank"/></p>
<p>　　好了，我们的配置工作基本结束了,在myeclipse上开启tomcat服务</p>
<p align="center"><img src="http://dev.yesky.com/imagelist/05/12/a597a7j21uhi.cn/pic/3fa10d830200006y"/></p>
<p><a href="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E7%AB%A0/MyEclipse+TomCat+struts+Hibernate+Mysql%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%AE%9E%E4%BE%8B/pic/13.JPG" target="_blank"/></p>
<p>　　现在打开浏览器，输入<br/><br/>　　<a href="http://127.0.0.1:8080/test/addAdmin.jsp">http://127.0.0.1:8080/test/addAdmin.jsp</a><strong r="">就可以看到你的jsp页面了！</strong></p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:21 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Hibernate入门实例（Eclipse版） </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39338.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39338.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39338.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39338.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39338.html</trackback:ping><description><![CDATA[
		<p>一、前言<br />二、相关概念与工具介绍<br />三、实例需求与总体设计<br />四、持久化层与业务层实践（Hibernate实践）<br />五、控制层与表示层实践（Struts实践）<br />六、发布与运行<br />七、写在最后</p>
		<p>
				<span style="FONT-SIZE: 9pt">
						<font size="4">
								<span style="FONT-SIZE: 9pt">
										<strong>
												<font size="4">一、前言</font>
												<br />
												<br />
										</strong>J2EE和.NET是目前企业级运用的两大阵营，谁优谁劣各有说法。笔者是做J2EE方向的，觉得J2EE比起.NET最大的优势就是其经过长实践发展总结出来的大量模式和大量先进的框架。这些框架许多都是开源的——开源也是J2EE阵营的另一优势。本篇文章的主角就是目前J2EE web应用中最流行的两大开源框架——Hibernate和Struts。</span>
						</font>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 9pt">
						<strong>
								<font size="4">二、相关概念与工具介绍</font>
						</strong>
						<br />
						<br />下面我将分别对本文“三大主角”所涉及到相关概念进行说明。<br /><br /><strong>Hibernate及相关知识介绍</strong><br />Hibernate：<br />中文意思是"冬眠“，呵呵，不知道设计者为何用这个名字。它是一个开源的ORM框架（关于ORM下文还会讲解），它是通过对JDBC API进行封装从而实现对java对象持久化的。有人可能要问：JDBC其实不难操作，为什么还要封装它哪？其实答案很简单，因为现在通用的数据库都是关系数据库，我们通过JDBC操作无法做到OOP，所以Hibernate将JDBC封装起来，并且提供了一套OO化的Hibernate API供顶层操作。Hibernate现在几乎已经成为ORM的公认标准了（刚推出的EJB 3.0标准中使用的ORM事实上就是Hibernate）<br /><br />ORM：<br />这里解释下ORM。ORM是一种模式（关于模式，笔者之前在这里发表过一篇介绍工厂模式的文章，读者可以看看），它的英文是Object-Relation Mapping，中译为对象-关系映射，它指的是“在单个组建中负责所有实体域对象的持久化，封装数据访问细节”（注：此定义来自《精通Hibernate：java对象持久化技术详解》，孙卫琴，电子工业出版社）。笔者的觉得很容易理解：把关系数据库对象化。<br /><br /><br /><strong>Struts及相关知识介绍</strong><br />Struts：<br />Struts是由著名的Apache基金会开发的开源项目。中译为“框架”，顾名思义，它就是一种MVC框架。众所周知，MVC是一种业务逻辑与表示分离的模式，在java web上的应用十分广泛。以前MVC的主要表现形式是JSP Model2，也就是JSP+Servlet+Javabean的应用，而近年来Struts的应用越来越广泛，目前已经是最流行的MVC框架了。<br /><br />MVC：<br />Model-View-Controller，中译为模型-视图-控制器。MVC不是真正意义上的软件设计模式，而更是一种解决方案，它把软件系统的所有业务逻辑方面的编程交给了Model，把所有UI视图的设计和编程交给了View，再用Controller控制器控制Model并生成相应的View，从而真正实现了业务逻辑与用户界面的分离。<br /><br /><br /><strong>Eclipse介绍</strong><br />Eclipse是由IBM公司开发出来，后来又免费捐献出来的开源工具，是一套主要用于Java开发的IDE（Eclipse通过添加某些插件可以实现对UML、C++等的开发）。Eclipse具有强大的扩展功能，加上其开源的特性，导致许多爱好者和公司为其开发了非常优秀的插件，Myeclipse就是其中之一。Myeclipse是面向J2EE开发者的Eclipse插件，功能强大，好用。本文的实例就是基于Eclipse+Myeclipse环境下开发出来的。<br /><br />创建/运行本文实例除了安装以上工具和插件外还需要安装一个Web容器，本文使用的是Jboss，笔者可以自行选择使用Tomcat或Weblogic等，这些对运行本文实例影响不大。<br /><br />本文选择的数据库是SQLServer2000，关于Mysql、Oracle等其他数据库的操作方法类似。<br /><br />关于Eclipse下载和安装方法本文不做介绍，请读者自行在网上查找相关方法。</span>
		</p>
		<p>
				<span style="FONT-SIZE: 9pt">
						<span style="FONT-SIZE: 9pt">
								<strong>
										<font size="4">三、实例需求与总体设计</font>
								</strong>
								<br />1、需求定义<br />由于本文的目的是介绍在Eclipse IDE下开发Struts+Hibernate的具体方法，而不是介绍项目开发/软件设计的技巧，所以本文实例需求非常简单。<br /><br />本文实例是一个web留言簿，可以让匿名用户发表一些留言信息，并保存至数据库。做过web开发的朋友肯定做过这类实例，非常经典。由于实例简单并且容易理解，所以笔者也省去画用例图说明的步骤。<br /><br />2、总体设计<br />本实例按传统J2EE web项目的设计方法，分为5层架构，自底向上分别是：数据库层 -&gt; ORM层（Hibernate层） -&gt; 业务逻辑层 -&gt; 控制层（Struts Action） -&gt; 视图表示层。<br /><br />数据库的DDL语句如下：<br /><br /></span>
						<br />
						<span style="FONT-SIZE: 9pt">
								<font size="4">
										<strong>四、持久化层与业务层实践（Hibernate实践）</strong>
								</font>
								<br />好，戏肉开始。<br /><br />1、先打开Eclipse。点击“新建项目”－&gt;“Web Project”，出现如下窗口，在窗口中Project Name填入“Memo”作为项目名：<br /></span>
				</span>
		</p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code0'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code0" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">create database memotest<br />create table Memo<br />(<br />ID int not null identity(1,1),<br />topic varchar(255),<br />content text,<br />guest varchar(50),<br />primary key(ID)<br />)</div>
		<p> </p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/1.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/1.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />2、点击“窗口”－&gt;“打开透视图”－&gt;“其他”，出现如下窗口，双击“Myeclipse Database Explorer”，切换到如下视图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/2.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/2.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />3、在“DB Browser”控制面板点击“new”，新建一个数据库连接。在弹出的窗口中点击“new driver”新建一个数据库连接驱动。如下图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/3.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/3.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />4、上一步后回到以下视图，在列表中选择上一步创建的驱动，填入相关数据库资料，点击确定即可。（此步骤前必须已经打开数据库，最后已经按照本实例的DDL创建了库和表）<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/4.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/4.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />5、完成上一步后出现以下视图。点击“memo”的右键，点击“open connetion”－&gt;“确定”。如果上述步骤成功的话这里会连接到数据库，并显示相关的数据库结构。<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/5.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/5.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />成功后如下图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/5a.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/5a.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />6、点击“窗口”－&gt;“打开透视图”－&gt;“其他”－&gt;“Myeclipse”切换到项目控制视图。在项目名上点击右键－&gt;“myeclipse”－&gt;“Add Hibernate capabilites”，出现以下视图，并按下图填入相关信息：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/6.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/6.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>点下一步后出现如下框图，按图片上内容填写：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/6a.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/6a.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />提交后出现以下视图，按图片内容填写：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/6b.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/6b.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />7、在项目名上点击右键－&gt;“myeclipse”－&gt;“Add Struts capabilites”，出现下面视图，按图中内容天下：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" style="CURSOR: hand" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/7.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/7.jpg" width="716" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" pop="Click here to open new window&#xD;&#xA;CTRL+Mouse wheel to zoom in/out" resized="true" />
		</p>
		<p>
				<br />
				<br />8、点击“窗口”－&gt;“打开透视图”－&gt;“其他”，出现如下窗口，双击“Myeclipse Database Explorer”，切换到数据库管理视图，找到我们为本次实例创建的表格，点右键－&gt;“create hibernate mapping”后出现下图，按图上内容填写：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/8.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/8.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />9、至此Hibernate的创建工作已经完成，如下图，接下来我们写个DAO工厂类来操作Hibernate API。<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/9.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/9.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />点击com.woden包，新建个类，如下图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/9a.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/9a.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />输入以下代码：<br /><br /></p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code1'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code1" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">package com.woden;<br /><br />import net.sf.hibernate.HibernateException;<br />import net.sf.hibernate.Session;<br />import net.sf.hibernate.Transaction;<br /><br /><br /><br />public class MemoDAOFactory {<br />        Session session;<br />    Transaction tx;<br />    <br />    public void add(Memo memo) throws HibernateException{<br />            try{<br />                    session = SessionFactory.currentSession();<br />                    tx = session.beginTransaction();<br />                    session.save(memo);<br />                    tx.commit();<br />            }catch(HibernateException e){<br />                    System.out.println(e.toString());<br />            }finally{<br />                    if(tx!=null){<br />                            tx.rollback();<br />                    }<br />                    SessionFactory.closeSession();<br />            }<br />    }<br /><br />}</div>
		<p>以上只有一个插入方法，如果读者需要更多方法可以在DAO中自行添加。<br /><br />至此，数据库层、ORM层和业务层的代码已经完成。<br /><br /><span style="FONT-SIZE: 9pt"><strong><font size="4">五、控制层与表示层实践（Struts实践）</font></strong><br /><br />1、新建一个welcome.jsp文件，作为实例的首页。具体方法是在“webroot”文件夹图标点右键－&gt;new－&gt;“jsp”，接下来填写的东西很简单就不用介绍了吧。<br /><br />2、在上一步骤的第7步中已经在myeclipse中导入了struts，我们下面就可以开始编辑设置我们的struts实例。打开webboot目录下WEB-INF中的struts配置文件“struts-config.xml”，如下图：<br /></span></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s1.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s1.jpg" width="716" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" pop="Click here to open new window&#xD;&#xA;CTRL+Mouse wheel to zoom in/out" resized="true" />
		</p>
		<p>
				<br />
				<br />3、在屏幕空白处点右键－&gt;“new”－&gt;“new form,action and jsp”，会出现如下视图，按下图提示填写内容：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s2.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s2.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>这里记得点击“jsp”标签条，出现以下界面，按下图设置：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s2a.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s2a.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />4、上一步骤设置了form，点击下一步看到如下视图，按下图设置，具体步骤是：点击“foward”标签－&gt;“add”－&gt;name填“success”，path选择“welcome.jsp”，其他不用填－&gt;确定。<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s3.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s3.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />5、上一步骤点击了“完成”后出现下图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" style="CURSOR: hand" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s4.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s4.jpg" width="716" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" pop="Click here to open new window&#xD;&#xA;CTRL+Mouse wheel to zoom in/out" resized="true" />
		</p>
		<p>
				<br />
				<br />6、这一步骤是设置资源文件，为了struts的国际化和错误提示做准备。找到项目文件夹中src（源文件夹），找到ApplicationResourse.properties，双击打开，如下图所示配置：（注：这里笔者安装了一个免费的ascii转unicode的插件）<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" style="CURSOR: hand" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s5.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s5.jpg" width="716" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" pop="Click here to open new window&#xD;&#xA;CTRL+Mouse wheel to zoom in/out" resized="true" />
		</p>
		<p>
				<br />如果读者没有安装ascii自动转unicode组建，可以直接copy我转换后的资源文件内容：<br /><br /></p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code2'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code2" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">form.addmemo.err.content=\u7559\u8a00\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\u3002<br /><br />form.addmemo.err.guest=\u7559\u8a00\u8005\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002<br /><br />form.addmemo.err.topic=\u7559\u8a00\u6807\u9898\u4e0d\u80fd\u4e3a\u7a7a\u3002<br /><br />jsp.addmemo.content=\u8bf7\u8f93\u5165\u5185\u5bb9\uff1a<br /><br />jsp.addmemo.guest=\u60a8\u7684\u59d3\u540d\uff1a<br /><br />jsp.addmemo.pagetitle=\u7559\u8a00\u6dfb\u52a0<br /><br />jsp.addmemo.reset=\u91cd\u8bbe<br /><br />jsp.addmemo.submit=\u63d0\u4ea4<br /><br />jsp.addmemo.topic=\u6807\u9898\uff1a<br /><br />jsp.welcome.content=\u6b22\u8fce\u4f7f\u7528Hibernate+Struts\u5b9e\u4f8b\u3002<br /><br />jsp.welcome.title=\u4f60\u597d\u3002\u3002\u3002</div>
		<p>7、下面打开com.woden.form.MemoForm.java文件，输入以下代码：<br /><br /></p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code3'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code3" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">package com.woden.form;<br /><br />import javax.servlet.http.HttpServletRequest;<br /><br />import org.apache.struts.action.ActionErrors;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.action.ActionMessage;<br /><br />public class MemoForm extends ActionForm {<br /><br />        private String topic;<br />        private String content;<br />        private String guest;<br /><br />        public ActionErrors validate(<br />                ActionMapping mapping,<br />                HttpServletRequest request) {<br />                ActionErrors errors = new ActionErrors();<br />                <br />                if(getGuest()==null||"".equals(getGuest()))<br />                {<br />                        errors.add("memoform.err.guest",new ActionMessage("form.addmemo.err.guest"));<br />                }<br />                <br />                if(getTopic()==null||"".equals(getTopic()))<br />                {<br />                        errors.add("memoform.err.topic",new ActionMessage("form.addmemo.err.topic"));<br />                }<br />                <br />                if(getContent()==null||"".equals(getContent()))<br />                {<br />                        errors.add("memoform.err.content",new ActionMessage("form.addmemo.err.content"));<br />                }<br />                <br />                return errors;<br />        }<br /><br /><br />        public void reset(ActionMapping mapping, HttpServletRequest request) {<br />                this.topic=null;<br />                this.content=null;<br />                this.guest=null;<br />        }<br /><br />        public String getTopic() {<br />                return topic;<br />        }<br /><br />        public void setTopic(String topic) {<br />                this.topic = topic;<br />        }<br /><br />        public String getContent() {<br />                return content;<br />        }<br /><br />        public void setContent(String content) {<br />                this.content = content;<br />        }<br /><br />        public String getGuest() {<br />                return guest;<br />        }<br /><br />        public void setGuest(String guest) {<br />                this.guest = guest;<br />        }<br />}</div>
		<p>8、上面已经写出了ActionForm的代码，具体代码笔者在这里不解释，我想看过struts基础的朋友都应该很清楚了，下面贴处Action的代码：<br /><br /></p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code4'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code4" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">package com.woden.action;<br /><br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br /><br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br /><br />import com.woden.Memo;<br />import com.woden.MemoDAOFactory;<br />import com.woden.form.MemoForm;<br /><br />public class MemoAction extends Action {<br /><br />        public ActionForward execute(<br />                ActionMapping mapping,<br />                ActionForm form,<br />                HttpServletRequest request,<br />                HttpServletResponse response) {<br />                MemoForm memoForm = (MemoForm) form;<br />                <br />                MemoDAOFactory memoDAO = new MemoDAOFactory();<br />                Memo memo = new Memo();<br />                memo.setTopic(memoForm.getTopic());<br />                memo.setContent(memoForm.getContent());<br />                memo.setGuest(memoForm.getGuest());<br />                <br />                try{<br />                        memoDAO.add(memo);                <br />                }catch(Exception e)<br />                {<br />                        System.out.print(e.toString());<br />                }<br />                <br />                return mapping.findForward("success");<br />        }<br />}</div>
		<p>9、最后编辑下几个相关jsp文件的内容，分别如下：<br /><br /></p>
		<div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em">
				<div style="FLOAT: left">代码:</div>
				<div style="FLOAT: right; TEXT-ALIGN: right">
						<a class="smalltxt" onclick="copycode(findobj('code5'));" href="http://www.gdutbbs.com/viewthread.php?tid=53053&amp;page=1&amp;extra=#">
								<font color="#000000">[复制]</font>
						</a>
				</div>
		</div>
		<div class="altbg2" id="code5" style="CLEAR: both; BORDER-RIGHT: #a3c861 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: #a3c861 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #a3c861 1px dotted; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #a3c861 1px dotted">welcome.jsp<br />&lt;%@ page contentType="text/html; charset=utf-8" %&gt;<br />&lt;%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %&gt;<br />&lt;%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html:html&gt;<br />  &lt;head&gt;<br />    &lt;html:base /&gt; <br />    &lt;title&gt;&lt;bean:message key="jsp.welcome.title"/&gt;&lt;/title&gt;<br />  &lt;/head&gt;<br />  <br />  &lt;body&gt;<br />    &lt;bean:message key="jsp.welcome.content"/&gt;<br />  &lt;/body&gt;<br />&lt;/html:html&gt;<br /><br /><br />addmemo.jsp<br />&lt;%@ page contentType="text/html; charset=utf-8"%&gt;<br />&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%&gt; <br />&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%&gt;<br /><br />&lt;html&gt; <br />        &lt;head&gt;<br />                &lt;title&gt;&lt;bean:message key="jsp.addmemo.pagetitle"/&gt;&lt;/title&gt;<br />        &lt;/head&gt;<br />        &lt;body&gt;<br />                &lt;html:form action="/memo"&gt;<br />                        &lt;bean:message key="jsp.addmemo.guest"/&gt;&lt;html:text property="guest"/&gt;&lt;html:errors property="memoform.err.guest"/&gt;&lt;br/&gt;<br />                        &lt;bean:message key="jsp.addmemo.topic"/&gt;&lt;html:text property="topic"/&gt;&lt;html:errors property="memoform.err.topic"/&gt;&lt;br/&gt;<br />                        &lt;bean:message key="jsp.addmemo.content"/&gt;&lt;html:textarea property="content"/&gt;&lt;html:errors property="memoform.err.content"/&gt;&lt;br/&gt;<br />                        &lt;html:submit&gt;&lt;bean:message key="jsp.addmemo.submit"/&gt;&lt;/html:submit&gt;<br />                        &lt;html:reset&gt;&lt;bean:message key="jsp.addmemo.reset"/&gt;&lt;/html:reset&gt;<br />                &lt;/html:form&gt;<br />        &lt;/body&gt;<br />&lt;/html&gt;</div>
		<p>至此，本实例完成。<br /><br /><span style="FONT-SIZE: 9pt"><font size="4"><strong>六、发布与运行</strong></font><br />1、在项目文件点右键－&gt;“myeclipse”－&gt;“Add and remove project deployment”，如下图：<br /></span></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s6.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s6.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />2、点击<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s6a.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s6a.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />图标，选择“Jboss”－&gt;“start”（注：这里如果用的是tomcat也类似操作，关于服务器配置的方法这里不祥谈，请读者自行在网上查找相关资料），会发现控制台会输出类似如下信息：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s6b.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s6b.jpg" width="716" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" pop="Click here to open new window&#xD;&#xA;CTRL+Mouse wheel to zoom in/out" resized="true" />
		</p>
		<p>打开浏览器，输入：<a href="http://localhost:8080/" target="_blank"><font color="#000000">http://localhost:8080/</font></a> 后如果出现下图证明启动成功：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s6c.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s6c.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />3、输入网址：<a href="http://localhost:8080/Memo/addmemo.jsp" target="_blank"><font color="#000000">http://localhost:8080/Memo/addmemo.jsp</font></a> ，会看到效果图如下图：<br /></p>
		<p align="center">
				<img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://blog.csdn.net/images/blog_csdn_net/woolceo/s7.jpg');}" alt="" src="http://blog.csdn.net/images/blog_csdn_net/woolceo/s7.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" />
		</p>
		<p>
				<br />
				<br />4、按照正常流程和非正常流程分别留言一次，呵呵，效果出来没有？如果没有出现预期效果请检查前面步骤。<br /></p>
		<p>
				<span style="FONT-SIZE: 9pt">
						<font size="4">
								<strong>七、写在最后</strong>
						</font>
						<br />
						<br />在本文最后，笔者再次强调，本文的目的是介绍Eclipse IDE关于创建Struts+Hibernate应用的方法，而不是介绍j2ee框架的概念和运用，更不是介绍java设计与模式。本文对IDE的配置、服务器配置的方法也没做详细介绍，因为这都不是本文重点。对以上知识想了解多点的读者可以google一下。<br /><br />本文的实例只是一个入门，强调的是一种方法，而不是强调功能，所以本文的实例只有一个简单的录入功能。在看完本文后读者可以添加更多的功能（我想，当这一架构搭建起来后，添加功能已经是相当容易的事情了）。<br /></span>
		</p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:18 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT学习指南</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39336.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39336.html</trackback:ping><description><![CDATA[
<table width="95%" align="center" cellspacing="3" border="0" class="chs">
<tbody>
<tr>
<td>
<h4><strong><span style="FONT-SIZE: 0.75em">内容摘要：</span></strong></h4>
<span style="FONT-SIZE: 0.75em">ANT是一个基于Java的自动化脚本引擎，脚本格式为XML。除了做Java编译相关任务外，ANT还可以通过插件实现很多应用的调用。 1)ANT的基本概念：<br/>2)ANT的安装：解包，设置路径<br/>3)ANT的使用：最好的学习只不过是一个简单实用的例子起步……</span>
<p><strong><span style="FONT-SIZE: 0.75em">作者：</span></strong> <span style="FONT-SIZE: 0.75em"><a href="mailto:chedong@chedong.com"><span style="COLOR: #002c99">车东</span></a> <a href="http://www.chedong.com/tech/default.html"><span style="COLOR: #002c99">http://www.chedong.com/tech/default.html</span></a></span></p>
</td>
</tr>
</tbody>
</table>
<span style="FONT-SIZE: 0.75em"><br/></span>
<hr width="95%" noshade="noshade"/>
<h2><span style="FONT-SIZE: 0.75em">ANT的基本概念：Java的Makefile</span></h2>
<p><span style="FONT-SIZE: 0.75em">当一个代码项目大了以后，每次重新编译，打包，测试等都会变得非常复杂而且重复，因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的，当然不会用平台相关的make脚本来完成这些批处理任务了，ANT本身就是这样一个流程脚本引擎，用于自动化调用程序完成项目的编译，打包，测试等。除了基于JAVA是平台无关的外，脚本的格式是基于XML的，比make脚本来说还要好维护一些。<br/></span></p>
<p><span style="FONT-SIZE: 0.75em">每个ant脚本（缺省叫build.xml）中设置了一系列任务(target)：比如对于一个一般的项目可能需要有以下任务。</span></p>
<ul>
<li><span style="FONT-SIZE: 0.75em">任务1：usage 打印本脚本的帮助信息（缺省）</span></li>
<li><span style="FONT-SIZE: 0.75em">任务2：clean &lt;-- init 清空初始化环境</span></li>
<li><span style="FONT-SIZE: 0.75em">任务3：javadoc &lt;-- build &lt;-- init 生成JAVADOC</span></li>
<li><span style="FONT-SIZE: 0.75em">任务4：jar &lt;-- build &lt;-- init 生成JAR</span></li>
<li><span style="FONT-SIZE: 0.75em">任务5：all &lt;-- jar + javadoc &lt;-- build &lt;-- init 完成以上所有任务：jar javadoc</span></li>
</ul>
<span style="FONT-SIZE: 0.75em">而多个任务之间往往又包含了一定了依赖关系：比如把整个应用打包任务(jar)的这个依赖于编译任务(build)，而编译任务又依赖于整个环境初始化任务(init)等。<br/><br/>注：我看到很多项目的ant脚本中的命名基本上都是一致的，比如：编译一般叫build或者compile；打包一般叫jar或war；生成文档一般命名为javadoc或javadocs；执行全部任务all。在每个任务的中，ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富，但其实最常用的就2，3个：比如javac javadoc jar等。</span>
<h2><span style="FONT-SIZE: 0.75em">ANT的安装</span></h2>
<span style="FONT-SIZE: 0.75em">解包后在系统可执行路径中加入指向ant的bin的路径就可以了，比如可以在GNU/Linux上把以下配置加入/etc/profile中：<br/>export ANT_HOME=/home/ant<br/>export JAVA_HOME=/usr/java/j2sdk1.4.1<br/>export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin<br/><br/>这样执行ant 后，如果不指定配置文件ant会缺省找build.xml这个配置文件，并根据配置文件执行任务，缺省的任务设置可以指向最常用的任务，比如：build，或指向打印帮助信息：usage，告诉用户有那些脚本选项可以使用。<br/><br/></span>
<h2><span style="FONT-SIZE: 0.75em">ANT的使用</span></h2>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">最好的学习过程就是看懂那些open source项目中的build.xml脚本，然后根据自己的需要简化成一个更简单的，ANT和APACHE上很多非常工程派的项目：简单易用，而且适应性非常强，因为这些项目的建立往往来源于开发人员日常最直接的需求。<br/>以下是的一个<a href="http://sourceforge.net/projects/weblucene/"><span style="COLOR: #002c99">WebLucene</span></a>应用的例子：修改自<a href="http://www.jdom.org/"><span style="COLOR: #002c99">JDOM</span></a>的build.xml：<br/><br/></span>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;project default="usage" basedir="."&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Initialization target --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="init"&gt;<br/>&lt;tstamp/&gt;<br/>&lt;property file="${basedir}/build.properties" /&gt;<br/>&lt;property name="Name" value="ProjectFullName"/&gt;<br/>&lt;property name="name" value="project_name"/&gt;<br/>&lt;property name="version" value="0.2"/&gt;<br/>&lt;property name="year" value="2003"/&gt;<br/><br/>&lt;echo message="----------- ${Name} ${version} [${year}] ------------"/&gt;<br/><br/>&lt;property name="debug" value="off"/&gt;<br/>&lt;property name="optimize" value="on"/&gt;<br/>&lt;property name="deprecation" value="on"/&gt;<br/><br/>&lt;property name="src.dir" value="./src/WEB-INF/src"/&gt;<br/>&lt;property name="lib.dir" value="./src/WEB-INF/lib"/&gt;<br/>&lt;property name="packages" value="com.chedong.*,org.apache.lucene.*"/&gt;<br/><br/>&lt;property name="build.src" value="./src/WEB-INF/build"/&gt;<br/>&lt;property name="build.dest" value="./src/WEB-INF/classes"/&gt;<br/>&lt;property name="build.javadocs" value="./src/doc"/&gt;<br/><br/>&lt;path id="classpath"&gt;<br/>&lt;pathelement path="${jsdk_jar}"/&gt;<br/>&lt;fileset dir="${lib.dir}"&gt;<br/>&lt;include name="**/*.jar"/&gt;<br/>&lt;/fileset&gt;<br/>&lt;/path&gt;<br/><br/>&lt;filter token="year" value="${year}"/&gt;<br/>&lt;filter token="version" value="${version}"/&gt;<br/>&lt;filter token="date" value="${TODAY}"/&gt;<br/>&lt;filter token="log" value="true"/&gt;<br/>&lt;filter token="verbose" value="true"/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Help on usage --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="usage" depends="init"&gt;<br/>&lt;echo message="${Name} Build file"/&gt;<br/>&lt;echo message="-------------------------------------------------------------"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" available targets are:"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" jar --&gt; generates the ${name}.jar file"/&gt;<br/>&lt;echo message=" build --&gt; compiles the source code"/&gt;<br/>&lt;echo message=" javadoc --&gt; generates the API documentation"/&gt;<br/>&lt;echo message=" clean --&gt; cleans up the directory"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" Please rename build.properties.default to build.properties"/&gt;<br/>&lt;echo message=" and edit build.properties to specify JSDK 2.3 classpath."/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=" See the comments inside the build.xml file for more details."/&gt;<br/>&lt;echo message="-------------------------------------------------------------"/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;echo message=""/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Prepares the source code --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="prepare-src" depends="init"&gt;<br/>&lt;!-- create directories --&gt;<br/>&lt;mkdir dir="${build.src}"/&gt;<br/>&lt;mkdir dir="${build.dest}"/&gt;<br/><br/>&lt;!-- copy src files --&gt;<br/>&lt;copy todir="${build.src}"&gt;<br/>&lt;fileset dir="${src.dir}"/&gt;<br/>&lt;/copy&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Compiles the source directory --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="build" depends="prepare-src"&gt;<br/>&lt;javac srcdir="${build.src}"<br/>destdir="${build.dest}"<br/>debug="${debug}"<br/>optimize="${optimize}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javac&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the class package --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="jar" depends="build"&gt;<br/>&lt;jar jarfile="${lib.dir}/${name}.jar"<br/>basedir="${build.dest}"<br/>includes="**"/&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the API documentation --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="javadoc" depends="build"&gt;<br/>&lt;mkdir dir="${build.javadocs}"/&gt;<br/>&lt;javadoc packagenames="${packages}"<br/>sourcepath="${build.src}"<br/>destdir="${build.javadocs}"<br/>author="true"<br/>version="true"<br/>use="true"<br/>splitindex="true"<br/>windowtitle="${Name} API"<br/>doctitle="${Name}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javadoc&gt;<br/>&lt;/target&gt;<br/><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Clean targets --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="clean" depends="init"&gt;<br/>&lt;delete dir="${build.src}"/&gt;<br/>&lt;delete dir="${build.dest}/org"/&gt;<br/>&lt;delete dir="${build.dest}/com"/&gt;<br/>&lt;delete&gt;<br/>&lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br/>&lt;/delete&gt;<br/>&lt;/target&gt;<br/>&lt;/project&gt;<br/>&lt;!-- End of file --&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em"><br/><br/>缺省任务：usage 打印帮助文档，告诉有那些任务选项：可用的有build, jar, javadoc和clean.<br/><br/>初始化环境变量：init<br/>所有任务都基于一些基本环境变量的设置初始化完成，是后续其他任务的基础，在环境初始化过程中，有2点比较可以方便设置：<br/><br/>1 除了使用却缺省的property设置了JAVA源路径和输出路径外，引用了一个外部的build.properties文件中的设置，<br/>&lt;property file="${basedir}/build.properties" /&gt;<br/>这样大部分简单配置用户只要会看懂build.properties就可以了，毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。<br/><br/>2 CLASSPATH设置：使用了其中的：</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;path id="classpath"&gt;<br/>&lt;pathelement path="${jsdk_jar}"/&gt;<br/>&lt;fileset dir="${lib.dir}"&gt;<br/>&lt;include name="**/*.jar"/&gt;<br/>&lt;/fileset&gt;<br/>&lt;/path&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">则相当于设置了：CLASSPATH=/path/to/resin/lib/jsdk23.jar;/path/to/project/lib/*.jar;<br/><br/>文件复制：prepare-src<br/>创建临时SRC存放目录和输出目录。</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em">&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Prepares the source code --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="prepare-src" depends="init"&gt;<br/>&lt;!-- create directories --&gt;<br/>&lt;mkdir dir="${build.src}"/&gt;<br/>&lt;mkdir dir="${build.dest}"/&gt;<br/><br/>&lt;!-- copy src files --&gt;<br/>&lt;copy todir="${build.src}"&gt;<br/>&lt;fileset dir="${src.dir}"/&gt;<br/>&lt;/copy&gt;<br/>&lt;/target&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">编译任务：build<br/>编译时的CLASSPATH环境通过一下方式找到引用一个path对象</span></p>
<table width="90%" cellspacing="1" border="1" class="en" bgcolor="#EBEBEB">
<tbody>
<tr>
<td class="c"><span style="FONT-SIZE: 0.75em">&lt;classpath refid="classpath"/&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">打包任务：jar<br/>对应用打包生成项目所写名的.jar文件</span></p>
<table width="90%" cellspacing="1" border="1" class="c" bgcolor="#EBEBEB">
<tbody>
<tr>
<td><span style="FONT-SIZE: 0.75em"><br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the class package --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="jar" depends="build"&gt;<br/>&lt;jar jarfile="${lib.dir}/${name}.jar"<br/>basedir="${build.dest}"<br/>includes="**"/&gt;<br/>&lt;/target&gt;<br/><br/>生成JAVADOC文档任务: javadoc<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Creates the API documentation --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="javadoc" depends="build"&gt;<br/>&lt;mkdir dir="${build.javadocs}"/&gt;<br/>&lt;javadoc packagenames="${packages}"<br/>sourcepath="${build.src}"<br/>destdir="${build.javadocs}"<br/>author="true"<br/>version="true"<br/>use="true"<br/>splitindex="true"<br/>windowtitle="${Name} API"<br/>doctitle="${Name}"&gt;<br/>&lt;classpath refid="classpath"/&gt;<br/>&lt;/javadoc&gt;<br/>&lt;/target&gt;<br/><br/>清空临时编译文件：clean<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;!-- Clean targets --&gt;<br/>&lt;!-- =================================================================== --&gt;<br/>&lt;target name="clean" depends="init"&gt;<br/>&lt;delete dir="${build.src}"/&gt;<br/>&lt;delete dir="${build.dest}/org"/&gt;<br/>&lt;delete dir="${build.dest}/com"/&gt;<br/>&lt;delete&gt;<br/>&lt;fileset dir="${build.dest}" includes="**/*.class"/&gt;<br/>&lt;/delete&gt;<br/>&lt;/target&gt;</span></td>
</tr>
</tbody>
</table>
<p><span style="FONT-SIZE: 0.75em">TODO：<br/>更多任务/扩展：（样例）<br/></span></p>
</div>
<ul>
<li><span style="FONT-SIZE: 0.75em">测试任务：JUnit测试</span></li>
<li><span style="FONT-SIZE: 0.75em">代码风格检查任务：CheckStyle，Jalopy等</span></li>
<li><span style="FONT-SIZE: 0.75em">邮件警报任务：可以把以上这些任务的输出警告发送到制定的用户列表中，这个任务可以设置每天自动运行。</span></li>
</ul>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:14 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+Spring+Hibernate练习(完整)</title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39331.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39331.html</trackback:ping><description><![CDATA[
<br/><p><strong><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">public interface UserDAO {</span></strong></p>
<p><strong><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US"> public abstract boolean isValidUser(String username, String password);</span></strong></p>
<p><strong><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">}</span></strong></p>
<p><strong><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">UserDAOImp.java</span></strong></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">import java.util.List;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">import org.springframework.orm.hibernate3.support.HibernateDaoSupport;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">import com.test.Hibernate.SessionFactory;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">public class UserDAOImp extends HibernateDaoSupport implements UserDAO {</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">private SessionFactory sessionFactory;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">private static String hql = "from User u where u.username=? ";</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">public boolean isValidUser(String username, String password) {</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">List userList = this.getHibernateTemplate().find(hql, username);</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">if (userList.size() &gt; 0) {</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">return true;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">}</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">return false;</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">}</span></p>
<p><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" xml:lang="EN-US">}</span></p>
<br/><br/><p><strong>修改LoginAction.java文件</strong>，使用userDao的方法来进行用户验证</p>
<p>package com.test.struts.action;</p>
<br/><p>import javax.servlet.http.HttpServletRequest;<br/>import javax.servlet.http.HttpServletResponse;</p>
<br/><p>import org.apache.struts.action.Action;<br/>import org.apache.struts.action.ActionForm;<br/>import org.apache.struts.action.ActionForward;<br/>import org.apache.struts.action.ActionMapping;<br/>import org.apache.struts.validator.DynaValidatorForm;</p>
<br/><p><span style="COLOR: #008000">import com.test.UserDAO;</span></p>
<p><br/>public class LoginAction extends Action {</p>
<p><br/><span style="COLOR: #008000">private UserDAO userDAO</span>;</p>
<br/><p><span style="COLOR: #008000">public UserDAO getUserDAO() {<br/>return userDAO;<br/>}</span></p>
<p><span style="COLOR: #008000">public void setUserDAO(UserDAO userDAO) {<br/>this.userDAO = userDAO;<br/>}</span></p>
<br/><p>public ActionForward execute(ActionMapping mapping, ActionForm form,<br/>HttpServletRequest request, HttpServletResponse response) {<br/>DynaValidatorForm loginForm = (DynaValidatorForm) form;<br/>// TODO Auto-generated method stub<br/>String username = (String) loginForm.get("username");<br/>String password = (String) loginForm.get("password");<br/>loginForm.set("password", null);<br/><span style="COLOR: #008000">if (userDAO.isValidUser(username,password)) {<br/>return mapping.findForward("indexGo");<br/>} else {<br/>return mapping.getInputForward();<br/>}<br/></span> }</p>
<p>}<br/>绿色字体为修改部份</p>
<br/><p>现在剩下最后的spring配置了</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd"><span style="COLOR: #8d8c8c">http://www.springframework.org/dtd/spring-beans.dtd</span></a>"&gt;</p>
<br/><p>&lt;beans&gt;<br/>&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br/>&lt;property name="driverClassName"&gt;<br/>&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br/>&lt;/property&gt;<br/>&lt;property name="url"&gt;<br/>&lt;value&gt;jdbc:mysql://localhost/test&lt;/value&gt;<br/>&lt;/property&gt;<br/>&lt;property name="username"&gt;<br/>&lt;value&gt;root&lt;/value&gt;<br/>&lt;/property&gt;<br/>&lt;property name="password"&gt;<br/>&lt;value&gt;root&lt;/value&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</p>
<br/><p>&lt;!-- 配置sessionFactory, 注意这里引入的包的不同 --&gt;<br/>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br/>&lt;property name="dataSource"&gt;<br/>&lt;ref local="dataSource" /&gt;<br/>&lt;/property&gt;<br/>&lt;property name="mappingResources"&gt;<br/>&lt;list&gt;<br/>&lt;value&gt;com/test/Hibernate/User.hbm.xml&lt;/value&gt;<br/>&lt;/list&gt;<br/>&lt;/property&gt;<br/>&lt;property name="hibernateProperties"&gt;<br/>&lt;props&gt;<br/>&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br/>&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br/>&lt;/props&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</p>
<br/><p>&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br/>&lt;property name="sessionFactory"&gt;<br/>&lt;ref local="sessionFactory" /&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</p>
<br/><p>&lt;bean id="userDAO" class="com.test.UserDAOImp"&gt;<br/>&lt;property name="sessionFactory"&gt;<br/>&lt;ref local="sessionFactory" /&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</p>
<br/><p>&lt;bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br/>&lt;property name="transactionManager"&gt;<br/>&lt;ref bean="transactionManager" /&gt;<br/>&lt;/property&gt;<br/>&lt;property name="target"&gt;<br/>&lt;ref local="userDAO" /&gt;<br/>&lt;/property&gt;<br/>&lt;property name="transactionAttributes"&gt;<br/>&lt;props&gt;<br/>&lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br/>&lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br/>&lt;prop key="is*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br/>&lt;/props&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</p>
<br/><p>&lt;bean name="/login" class="com.test.struts.action.LoginAction" singleton="false"&gt;<br/>&lt;property name="userDAO"&gt;<br/>&lt;ref bean="userDAOProxy" /&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;<br/>&lt;/beans&gt;</p>
<br/><p>现在可以进行测试了！</p>
<br/><p>在编写代码有配置内容时一定要注意 hibernate 和 hibernate3 ，这两个包的名字就只差一个字，千万不要有错，否则找错误可是很难的。</p>
<br/><br/><img src ="http://www.blogjava.net/yaominxi/aggbug/39331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:05 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>