﻿<?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-Java Stop Here-随笔分类-Tec Article</title><link>http://www.blogjava.net/faithwind/category/7034.html</link><description>Love Java ,because you are my first lady !^_^</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 20:17:33 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 20:17:33 GMT</pubDate><ttl>60</ttl><item><title>【摘】敏捷软件开发图书概览</title><link>http://www.blogjava.net/faithwind/archive/2006/12/14/87721.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 14 Dec 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/12/14/87721.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/87721.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/12/14/87721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/87721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/87721.html</trackback:ping><description><![CDATA[
		<br />本文发表于程序员杂志2006年第5期 <br />“ 敏捷软件开发宣言：我们正在通过亲身实践和帮助其他人实践，揭示更好的软件开发方法，通过这项工作，我们认为： <br />人和交流胜过过程和工具 <br />可工作的软件胜过面面俱到的文档 <br />客户协作胜过合同谈判 <br />响应变化胜过遵循计划 <br />虽然右项也有价值，但是我们认为左项更重要。 ” <br />—— Kent Beck ， Mike Beedle ， Arie van Bennekum ， Alistair Cockburn ， Ward Cunningham ， Martin Fowler ， James Grenning ， Jim Highsmith ， Andrew Hunt ， Ron Jeffries ， Jon Kern ， Brian Marick ， Robert C. Martin ， Steve Mellor ， Ken Schwaber ， Jeff Sutherland ， Dave Thomas <br />  <br />敏捷软件开发这个词在 2006 年的中国软件界听起来仍然显得有些陌生。自 2001 年敏捷联盟被发起以来，敏捷方法的实践经验和理论研究都在不断的更新。而我国的大多数程序员还是只能在书本上读到敏捷的好处，很难在项目中进行实践。这其中的原因，主要是缺乏拥有实际敏捷项目经验的人来带领实施敏捷。虽然敏捷开发是种实践行为，很难从书本上直接学习，不过多数程序员了解敏捷，却都是先从书本开始的。无论结果怎样，从认识到实践的过程是免不了的。 <br />  <br />敏捷软件开发之方法论篇 <br />大家都知道敏捷软件开发方法包括了多种方法论，主要有： SCRUM ， Crystal, 特征驱动软件开发（ FDD ），自适应软件开发（ ASD ），以及最著名的极限编程 (XP) 。这些方法论分别在不同的著作上专门论述过： <br />SCRUM ：《 Agile Software Development with Scrum 》 by Ken Schwaber, Mike Beedle ，《 Agile Project Management With Scrum 》 by Ken Schwaber <br />FDD: 《 Java Modeling in Color with UML 》 by Peter Coad, 《 A Practical Guide to Feature-Driven Development 》 ( 特征驱动开发 ) by Stephen R Palmer, John M. Felsing, <br />Crystal: 《 Crystal Clear 》 by Alistair Cockburn <br />ASD: 《 Adaptive Software Development 》（自适应软件开发） by James A. Highsmith <br />  <br />其中尤以 XP 系列的书籍居多。人民邮电出版社的一系列极限编程系列丛书，在国内引进较早。在还没有统一敏捷词汇的情况下，引发了一批敏捷先锋人士的热情，是我国程序员的敏捷启蒙教材。这些书包括《 Extreme Programming Explained 》（解析极限编程），《 Extreme Programming Examined 》（极限编程研究），《 Extreme Programming Installed 》 ( 极限编程实施 ) ，《 Extreme Programming Explored 》（探索极限编程），《 Extreme Programming Applied 》（应用极限编程）《 Extreme Programming in Practice 》（极限编程实践），《 Planning Extreme Programming 》（规划极限编程）等，这些书有的是作者的 XP 实践论文，有些是对 XP 项目的介绍，其中，值得推荐的是下面两部著作。 <br />  <br />《 Extreme Programming Explained: Embrace Change 》 by Kent Beck <br />第一版中译版：《解析极限编程：拥抱变化》， 唐东铭， 人民邮电出版社 <br />第二版中译版： 雷剑文，电子工业出版社 <br />作为 XP 的开山之作，目前已经出版了第二版。在第一版中， Kent Beck 对 XP 作了详细的描述。从当前软件开发的现状和问题谈起，从需求的变化到如何拥抱变化，给出了 XP 的四项价值观和十二项实践。对于想了解敏捷的来龙去脉的人，此书属于必读之类。在第二版， Kent 根据几年来的实践，为 XP 增加了一项价值观：尊重，并增加了原则的概念，同时增加和删改了一些实践。 <br />该书第一版是程序员的宣言，这和 Kent 的背景很有关系。随后 XP 经历了五六年的发展和实践， Kent 自己也逐渐意识到，这样的观点太狭隘了。因此就有了第二版，与其说这是技术书籍，到更像是纯粹意义的软工书籍。期间也可以看出 XP 的体系更加完备。这其中尤为突出的是把人放到了更为重要的地位。 <br />  <br />《 Extreme Programming in Practice 》 by James Newkirk, Robert C. Martin <br />中译版：《极限编程实践》， 王钧， 人民邮电出版社 <br />读过了一些列的 XP 书籍，程序员们都会觉得 XP 非常好，但到底如何才能开始实施 XP 呢？还不是太清楚。本系列中的这本书用一个完整的小项目作例子，从头到尾教给人如何敏捷开发，是一本不可多得的实践教材。如果想直接实施 XP 开发，这本书可以给你很大启示。 <br />  <br />  <br />敏捷软件开发之实践篇 <br />一、极限编程最佳实践 <br />由于极限编程是如此的流行，多数敏捷团队都会或多或少的借鉴一些 XP 中的敏捷实践，而 XP 的每一个敏捷实践也确实值得大书特书，而其中最著名的是测试驱动开发和重构实践： <br />  <br />《 Test-Driven Development 》 by Kent Beck <br />中译版：《测试驱动开发》， 崔凯，中国电力出版社 <br />测试驱动开发是 Kent Beck 另一部力作。 “Clean Code That Works” 是敏捷开发的目标之一，那么如何达到这个目标？ TDD 给出了一种方式。测试实质上是需求。由需求产生出的代码肯定是能够工作的功能代码，而要实现 Class 本身的可测试性，就不得不写出高度解耦合的 Clean 的代码。本书从一个 Money 的例子入手，从最初的一点需求开始，逐步增加需求，完成整个货币系统的代码。后面又给出了 Unit Test 中的一些最佳实践和模式供参考。 <br />然而，本书的教导意义比其实践意义更突出。作为一本 TDD 的教程或入门教材，这本书无疑是最佳的，其中提出的一些最佳实践更是值得经常阅读来温习。本书面向的是单元测试，而实际开发中面对的数据库测试， Web 测试等问题并不属于单元测试的范畴。因此读者并不能从中直接进入到实战。 <br />另一本同名书《 Test Driven Development: A Practical Guide 》由 Davis Astels 撰写，他将该书看作是 Kent 著作的补充，重点阐述利用 TDD 开发所必要的技术和工具上，因此对实际开发更具实用性。 <br />  <br />《 Refactoring: Improving the Design of Existing Code 》 by Martin Fowler <br />中译版：《重构：改善既有代码的设计》，侯捷，熊节，中国电力出版社 <br />重构这本书的意义在于，他提供了一种让你写出更加优美代码的能力。在测试的保证下，重构能够发挥强大的威力。敏捷团队中，不断的重构出简单且高效的代码才能够保持拥抱不断变化的需求。后来的一本书《 Refactoring to Patterns 》（从重构到模式） by Joshua Kerievsky ，更是将重构的威力发挥到极限。 <br />重构曾被称为软件开发图书的双璧，另一本书是《 Design Patterns 》 ( 设计模式 ) by GoF 。当然，对现在的软件开发这二者已经不是最重要的。 Thought Works 的首席科学家 Martin Fowler 总结了朋友们的各种实践心得，写出了这本书。从几年后的目光来看，这本书中的多数实践都被各种 IDE 做到了操作菜单中。虽然 IDE 提供了大量重构功能，但仅靠 IDE 是无法写出简洁美妙代码的，多数的敏捷团队重构工作做得还是不够。 <br />  <br />另外有一本专门介绍结对编程的书，《 Pair Programming Illuminated 》（结对编程技术） by by Laurie Williams and Robert Kessler ，指出了为什么要结对？并从各种不同水平不同性格的程序员结对情况来讨论该实践的优劣。对此有兴趣的程序员不妨一读。 <br />  <br />二、敏捷软件开发实践 <br />自从 2001 年敏捷联盟成立以来，单独推广极限编程的书变少了，而统一口径推广敏捷的书变得越来越多。两本同名的敏捷软件开发都是不可多得的好书， <br />  <br />《 Agile Software Development ： Principles, Patterns, and Practices 》 by Robert C. Martin <br />中译版：《敏捷软件开发：原则，模式与实践》，邓辉， 清华大学出版社 <br />被业内人士称为 Uncle Bob 的 Robert C Martin 在沉寂几年后写出了这部书。该书可以算是从软件开发角度对敏捷方法阐述的最详细和全面的一本。之前的敏捷书籍多是关注于过程改进，而对如何从技术角度实施讲的比较少。本书一开始先介绍了敏捷联盟和敏捷开发过程。之后详细论述了面向对象设计的原则，这些原则是本书的精华之一。后面通过几个项目介绍了如何将设计模式应用于项目中。 <br />Uncle Bob 不愧是实践的大师，写出来的书也是拥有很强的实践意义。在敏捷团队的办公桌上，应当常备此书，一来可作为参考查询，二来可以作为新成员的必读书目。 <br />  <br />《 Agile Software Development 》 by Alistair Cockburn <br />中译版：《敏捷软件开发》，俞涓，人民邮电出版社 <br />这本书更加适合管理者来阅读。 Alistair 从项目人数和交流难易程度，将敏捷的各种方法划分了其适用范围。人数多的或分布式项目就需要靠其他手段来加强交流，人数少的就可以靠 pair programming 等进行面对面的交流。交流和反馈是敏捷的核心。同时 Alistair 也介绍了一下他提出的 Crystal 方法族。 <br />  <br />三 . 敏捷项目管理和敏捷需求分析 <br />在推广敏捷一段时间后，敏捷社群也意识到，多数书籍更像是面向开发人员，过于技术化，难以吸引项目经理或主管。因此，一批面向管理者视角的书也开始浮出水面，这些书包括： <br />《 Agile and Iterative Development 》（敏捷迭代开发） by Craig Larman <br />《 Lean Software Development 》（ 敏捷 软件开发工具 — 精益开发方法 ） by Mary Poppendieck <br />《 Agile Software Development Ecosystems 》（敏捷软件开发生态系统） by Jim Highsmith <br />书中从各种角度比较和分析各种敏捷方法的优劣，异同，起源，适用范围等。这些书对于一个项目主管决策使用何种过程来在自己的团队中实践敏捷有很好的参考作用。 <br />  <br />近两年，人们开始逐渐意识到敏捷开发的侧重点不仅仅是开发过程和开发实践，还包括对需求和项目管理等其他相关方面的实践。一些相关的书籍也悄然出现在人们的视野： <br />《 Agile Project Management 》（敏捷项目管理） by Jim Highsmith <br />《 User Stories Applied 》 by Mike Cohn <br />《 Agile Estimating and Planning 》 by Mike Cohn <br />《 Agile Requirements &amp; User Stories 》 by Louis Molnar <br />这些书不同于以往强调新方法，新过程的书目。敏捷项目管理类的书主要介绍如何管理敏捷团队，如何计划要开发的需求，如何为客户提供最大的价值。介绍敏捷需求分析的书主要帮助商务分析师或项目经理挖掘和分析用户需求，写出用户故事，评估和计划用户故事等。人们已经意识到，各种方法论的实质是相同的，都是提供商业价值，减少浪费，增加交流，快速反馈。因此不需要着重于区分是使用了那种方法。对项目经理来说，不同的项目或团队应当采用适应其特殊情况的方法，而这些方法的基本原则是相同的。 <br />  <br />四 . 敏捷软件开发新方向 <br />对架构师或程序员来说，近年来的技术进展，也使得敏捷开发有了新的研究方向： <br />《 Agile Web Development with Rails 》 by Dave Thomas, David Hansson, Leon Breedt, and Mike Clark <br />该书是获得 2006JOLT 奖的书，讲得是采用 Ruby on Rails 这个 Web 开发工具新贵来快速开发 Web 项目，从而达到快速反馈拥抱变化的目的。 <br />《 Refactoring Databases 》 by Scott W Ambler <br />此书是 Scott 的新作，延续和继承了《 Agile Modeling 》（敏捷建模）和《 Agile Database Techniques 》（敏捷数据）的思想。在敏捷开发过程中，作为持久化最常见技术的数据库如果不能够敏捷，怎么能够适应一次次迭代和一次次发布的修改呢？书中介绍了如何进行数据库演化，如何保证升级后数据库数据的正确性，以及最佳实践。 <img src ="http://www.blogjava.net/faithwind/aggbug/87721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-12-14 15:10 <a href="http://www.blogjava.net/faithwind/archive/2006/12/14/87721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【摘】java中读取资源文件</title><link>http://www.blogjava.net/faithwind/archive/2006/12/08/86412.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 08 Dec 2006 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/12/08/86412.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/86412.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/12/08/86412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/86412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/86412.html</trackback:ping><description><![CDATA[
		<div>  1 <em><em>public   class  DrpToOAInfo  <em>{<br />  2 <em> @PersistenceContext<br />  3 <em> EntityManager entityManager;<br />  4 <em> <br />  5 <em>  private   final   static  String CONFIGURETION_FILE  =   " send_message_zh.properties " ;<br />  6 <em>  private   static  Properties properties  =   null ;<br />  7 <em> <br />  8 <em>  public   static  Properties readConfiguretion()<br />  9 <em><em>  <em>{<br /> 10 <em>   if  (properties  ==   null )<br /> 11 <em><em>   <em>{<br /> 12 <em>    try <br /> 13 <em><em>    <em>{<br /> 14 <em>    properties  =   new  Properties();<br /> 15 <em>    ClassLoader cl  =  Thread.currentThread().getContextClassLoader();<br /> 16 <em>    InputStream inputStream  =   null ;<br /> 17 <em>     if  (cl  !=   null )<br /> 18 <em><em>     <em>{<br /> 19 <em>     inputStream  =  cl.getResourceAsStream(CONFIGURETION_FILE);<br /> 20 <em>    } <br /> 21 <em>     if  (inputStream  !=   null )<br /> 22 <em><em>     <em>{<br /> 23 <em>     properties.load(inputStream);<br /> 24 <em>     inputStream.close();<br /> 25 <em>    } <br /> 26 <em>   } <br /> 27 <em>    catch  (Exception e)<br /> 28 <em><em>    <em>{<br /> 29 <em>    e.printStackTrace();<br /> 30 <em>   } <br /> 31 <em>  } <br /> 32 <em>   return  properties;<br /> 33 <em> } <br /> 34 <em> <br /> 35 <em> <br /> 36 <em><em>  /** */ /** <br /> 37 <em>  * <br /> 38 <em>  *  @param  type  接收者类型<br /> 39 <em>  *  @param  id    接收者id<br /> 40 <em>  *  @param  name  接收者名称<br /> 41 <em>  *  @param  contentVariable  内容中的变动部分<br /> 42 <em>  *  @param  url IP地址、端口号、项目<br /> 43 <em>  *  @param  value 生产计划单号<br /> 44 <em>  *  @param  configureInformType 通知类型<br /> 45 <em>   */ <br /> 46 <em>  public   static   void  sendMessage( int  type, <br /> 47 <em>                   String id, <br /> 48 <em>                   String name, <br /> 49 <em>                   Object[] contentVariable, <br /> 50 <em>                   String url,<br /> 51 <em>                   Object[] value,<br /> 52 <em>                   String configureInformType)<br /> 53 <em><em>  <em>{<br /> 54 <em>  String applictionName  =   "" ;<br /> 55 <em>  String content  =   "" ;<br /> 56 <em>  String URL  =   "" ;<br /> 57 <em>  ReceiveType rt  =  ReceiveType.DEPARTMENT;<br /> 58 <em>  <br /> 59 <em>   // 读取资源文件 <br /> 60 <em>  Properties properties  =  readConfiguretion();<br /> 61 <em>  applictionName  =  properties.getProperty( " system.module.appliction.name " );<br /> 62 <em>  content  =  MessageFormat.format(properties.getProperty(configureInformType), contentVariable);<br /> 63 <em><br /> 64 <em>  URL  =  url  +  MessageFormat.format(properties.getProperty(configureInformType  +   " .url " ), value);;<br /> 65 <em>  <br /> 66 <em>  <br /> 67 <em>   if (type  ==   0 )<br /> 68 <em><em>   <em>{<br /> 69 <em>   rt  =  ReceiveType.PEOPLE;<br /> 70 <em>  } <br /> 71 <em>   if (type  ==   1 )<br /> 72 <em><em>   <em>{<br /> 73 <em>   rt  =  ReceiveType.DEPARTMENT;<br /> 74 <em>  } <br /> 75 <em>   if (type  ==   2 )<br /> 76 <em><em>   <em>{<br /> 77 <em>   rt  =  ReceiveType.ROLE;<br /> 78 <em>  } <br /> 79 <em><br /> 80 <em>  System.out.println( " ****************************************** " );<br /> 81 <em>  System.out.println( " * 类型： " + rt);<br /> 82 <em>  System.out.println( " * ID： " + id);<br /> 83 <em>  System.out.println( " * 接收者名称： " + name);<br /> 84 <em>  System.out.println( " * 内容： " + content);<br /> 85 <em>  System.out.println( " * url： " + URL);<br /> 86 <em>  System.out.println( " ****************************************** " );<br /> 87 <em>        StartupMessage sm  =   new  StartupMessage(applictionName, rt, " 117 " ,  " tonywu " , id, name, content, URL);<br /> 88 <em><br /> 89 <em>  SendMessage s  =   new  SendMessage(); <br /> 90 <em>  s.sendMessage(sm);<br /> 91 <em> } <br /> 92 <em> <br /> 93 <em><em>  /** */ /** <br /> 94 <em>  * 从request中得到地址中的参数，<br /> 95 <em>  *  @param  taskID  接收者类型<br /> 96 <em>  *  @param  processorID    处理者ID<br /> 97 <em>  *  @param  processorName  处理者名称<br /> 98 <em>  *  @param  processorTime  处理时间<br /> 99 <em>   */ <br />100 <em>  public   static   void  overMessage(String[] processorInfo)<br />101 <em><em>  <em>{<br />102 <em>//   读取资源文件 <br />103 <em>  Properties properties  =  readConfiguretion();<br />104 <em>  String applictionName  =  properties.getProperty( " system.module.appliction.name " );<br />105 <em>//   Calendar date = Calendar.getInstance();<br />106 <em>//   String t = date.get(Calendar.YEAR)+"-"+date.get(Calendar.MONTH)+"-"+date.get(Calendar.DATE); <br />107 <em>  BeOverMessage bm  =   new  BeOverMessage(applictionName, processorInfo[ 1 ],<br />108 <em>                                   " 117 " ,  " tonywu " , new  Date());<br />109 <em><br />110 <em>  System.out.println( " ****************************************** " );<br />111 <em>  System.out.println( " * taskID类型： " + processorInfo[ 1 ]);<br />112 <em>  System.out.println( " * processorIDID： " + processorInfo[ 2 ]);<br />113 <em>  System.out.println( " * processorName接收者名称： " + processorInfo[ 3 ]);<br />114 <em>  System.out.println( " * 时间： " + new  Date());<br />115 <em>  System.out.println( " ****************************************** " );<br />116 <em><br />117 <em>  SendMessage s  =   new  SendMessage(); <br />118 <em>  s.sendMessage(bm);<br />119 <em> } <br />120 <em>} <br />121 <em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></div>
		<br />
		<br />几乎所有的系统都需要通过获取配置/资源文件来方便配置系统 <br />但怎样获取资源文件呢 <br />java的应用通常把配置文件和工程中的其他class放在一起（如log4j)，原因是可以方便的使用classLoader的 getResourceAsStream（）方法获取资源（其实java内部就是这样来 <br />load class的），下面是一个简单例子： <br />比如你把文件(abc.properties)放到com.yourcompany.common包里面，在确保classpath包括该包的情况 <br />下就可以按下面的方法获取资源 <br />ClassLoader cl = this.getClass().getClassLoader(); <br />InputStream is = cl.getResourceAsStream("com/yourcompany/"+abc.properties) <br />进一不，如果abc.properties是一个标准的properties文件的话，比如其内容如下 <br />messageA = Ok! <br />还可以这样获取配置信息 <br />Properties props = new Properties(); <br />props.load(is); <br />String messageA = props.getProperty("messageA "); <br />则messageA== "Ok" <br />当然properties也可以是XML格式，只要他符合http://java.sun.com/dtd/properties.dtd的规范并且包含 <br />&lt;!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"&gt;的DOCTYPE declaration，就可以用props.loadFromXML(InputSteam in)方法载入property <br />ps:property 也提供store()和storeToXML方法保存属性 <br />关于classLoader也可以看看 <br /><br />classloader相关基础知识<br /><ul><b>JVM</b><br />jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序. <br />JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了 <br /><br />当一台机器上有多个jvm可选择的时候,jvm的选择步骤: <br />1)当前目录有没有jre目录(不准确), <br />2)父目录下的jre子目录 <br />3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\ <br />所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\ <br />运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误</ul><br /><br /><ul>java -verbose:class Main 显示调用的详细信息</ul><br /><br /><ul>classloader的两种载入方式:1)pre-loading预先载入,载入基础类 2)load-on-demand按需求载入 <br />只有实例化一个类才会被classloader载入,仅仅申明并不会载入</ul><br /><br /><ul><b>java动态载入class的两种方式:</b><br />1)implicit隐式,即利用实例化才载入的特性来动态载入class <br />2)explicit显式方式,又分两种方式: <br />1)java.lang.Class的forName()方法 <br />2)java.lang.ClassLoader的loadClass()方法</ul><br /><br /><ul><b>static块在什么时候执行?</b><br />1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行. <br />2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作 <br />3)static块仅执行一次</ul><br /><br /><ul><br /><b>Class类的实例.</b><br />&gt;&gt;Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例, <br />&gt;&gt;某个类的所有实例内部都有一个栏位记录着该类对应的Class的实例的位置., <br />&gt;&gt;每个java类对应的Class实例可以当作是类在内存中的代理人.所以当要获得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现 <br />&gt;&gt;每个java类都是由某个classLoader(ClassLoader的实例)来载入的,因此Class类别的实例中都会有栏位记录他的ClassLoader的实例,如果该栏位为null,则表示该类别是由bootstrap loader载入的(也称root laoder),bootstrap loader不是java所写成,所以没有实例. <br /><br />原生方法:forName0()等方法,native修饰符</ul><br /><br /><ul><b>自定义ClassLoader:</b><br />如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader优先找当前目录,再在url中找.class加载.URL中别忘在最后加"/"表示目录</ul><br /><br /><ul><b>各个java类由哪些classLoader加载?</b><br />1)java类可以通过实例.getClass.getClassLoader()得知 <br />2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入 <br />3)ClassLoader类由bootstrap loader载入</ul><br /><br /><ul><b>ClassLoader hierachy:</b><br />jvm建立-&gt;初始化动作-&gt;产生第一个ClassLoader,即bootstrap loader-&gt;bootstrap loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null-&gt;bootstrap loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入的)-&gt;AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入. <br />&gt;&gt;自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系 <br />&gt;&gt;ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定 <br />&gt;&gt;ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext <br />&gt;&gt;Bootstrap loader的查找url是sun.boot.class.path <br />&gt;&gt;在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改 <br /><br />委派模型 <br />当classloader有类需要载入时先让其parent搜寻其搜寻路径帮忙载入,如果parent找不到,在由自己搜寻自己的搜寻路径载入,ClassLoader hierachy本来就有这种性质</ul><br /><br /><ul><br /><b>NoClassDefFoundError和ClassNotFoundException</b><br />NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错 <br />ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常</ul><img src ="http://www.blogjava.net/faithwind/aggbug/86412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-12-08 17:25 <a href="http://www.blogjava.net/faithwind/archive/2006/12/08/86412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【摘】MIME大全</title><link>http://www.blogjava.net/faithwind/archive/2006/12/04/85396.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Mon, 04 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/12/04/85396.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/85396.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/12/04/85396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/85396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/85396.html</trackback:ping><description><![CDATA[123 application/vnd.lotus-1-2-3<br />3gp video/3gpp<br />aab application/x-authoware-bin<br />aam application/x-authoware-map<br />aas application/x-authoware-seg<br />ai application/postscript<br />aif audio/x-aiff<br />aifc audio/x-aiff<br />aiff audio/x-aiff<br />als audio/X-Alpha5<br />amc application/x-mpeg<br />ani application/octet-stream<br />asc text/plain<br />asd application/astound<br />asf video/x-ms-asf<br />asn application/astound<br />asp application/x-asap<br />asx video/x-ms-asf<br />au audio/basic<br />avb application/octet-stream<br />avi video/x-msvideo<br />awb audio/amr-wb<br />bcpio application/x-bcpio<br />bin application/octet-stream<br />bld application/bld<br />bld2 application/bld2<br />bmp application/x-MS-bmp<br />bpk application/octet-stream<br />bz2 application/x-bzip2<br />cal image/x-cals<br />ccn application/x-cnc<br />cco application/x-cocoa<br />cdf application/x-netcdf<br />cgi magnus-internal/cgi<br />chat application/x-chat<br />class application/octet-stream<br />clp application/x-msclip<br />cmx application/x-cmx<br />co application/x-cult3d-object<br />cod image/cis-cod<br />cpio application/x-cpio<br />cpt application/mac-compactpro<br />crd application/x-mscardfile<br />csh application/x-csh<br />csm chemical/x-csml<br />csml chemical/x-csml<br />css text/css<br />cur application/octet-stream<br />dcm x-lml/x-evm<br />dcr application/x-director<br />dcx image/x-dcx<br />dhtml text/html<br />dir application/x-director<br />dll application/octet-stream<br />dmg application/octet-stream<br />dms application/octet-stream<br />doc application/msword<br />dot application/x-dot<br />dvi application/x-dvi<br />dwf drawing/x-dwf<br />dwg application/x-autocad<br />dxf application/x-autocad<br />dxr application/x-director<br />ebk application/x-expandedbook<br />emb chemical/x-embl-dl-nucleotide<br />embl chemical/x-embl-dl-nucleotide<br />eps application/postscript<br />eri image/x-eri<br />es audio/echospeech<br />esl audio/echospeech<br />etc application/x-earthtime<br />etx text/x-setext<br />evm x-lml/x-evm<br />evy application/x-envoy<br />exe application/octet-stream<br />fh4 image/x-freehand<br />fh5 image/x-freehand<br />fhc image/x-freehand<br />fif image/fif<br />fm application/x-maker<br />fpx image/x-fpx<br />fvi video/isivideo<br />gau chemical/x-gaussian-input<br />gca application/x-gca-compressed<br />gdb x-lml/x-gdb<br />gif image/gif<br />gps application/x-gps<br />gtar application/x-gtar<br />gz application/x-gzip<br />hdf application/x-hdf<br />hdm text/x-hdml<br />hdml text/x-hdml<br />hlp application/winhlp<br />hqx application/mac-binhex40<br />htm text/html<br />html text/html<br />hts text/html<br />ice x-conference/x-cooltalk<br />ico application/octet-stream<br />ief image/ief<br />ifm image/gif<br />ifs image/ifs<br />imy audio/melody<br />ins application/x-NET-Install<br />ips application/x-ipscript<br />ipx application/x-ipix<br />it audio/x-mod<br />itz audio/x-mod<br />ivr i-world/i-vrml<br />j2k image/j2k<br />jad text/vnd.sun.j2me.app-descriptor<br />jam application/x-jam<br />jar application/java-archive<br />jnlp application/x-java-jnlp-file<br />jpe image/jpeg<br />jpeg image/jpeg<br />jpg image/jpeg<br />jpz image/jpeg<br />js application/x-javascript<br />jwc application/jwc<br />kjx application/x-kjx<br />lak x-lml/x-lak<br />latex application/x-latex<br />lcc application/fastman<br />lcl application/x-digitalloca<br />lcr application/x-digitalloca<br />lgh application/lgh<br />lha application/octet-stream<br />lml x-lml/x-lml<br />lmlpack x-lml/x-lmlpack<br />lsf video/x-ms-asf<br />lsx video/x-ms-asf<br />lzh application/x-lzh<br />m13 application/x-msmediaview<br />m14 application/x-msmediaview<br />m15 audio/x-mod<br />m3u audio/x-mpegurl<br />m3url audio/x-mpegurl<br />ma1 audio/ma1<br />ma2 audio/ma2<br />ma3 audio/ma3<br />ma5 audio/ma5<br />man application/x-troff-man<br />map magnus-internal/imagemap<br />mbd application/mbedlet<br />mct application/x-mascot<br />mdb application/x-msaccess<br />mdz audio/x-mod<br />me application/x-troff-me<br />mel text/x-vmel<br />mi application/x-mif<br />mid audio/midi<br />midi audio/midi<br />mif application/x-mif<br />mil image/x-cals<br />mio audio/x-mio<br />mmf application/x-skt-lbs<br />mng video/x-mng<br />mny application/x-msmoney<br />moc application/x-mocha<br />mocha application/x-mocha<br />mod audio/x-mod<br />mof application/x-yumekara<br />mol chemical/x-mdl-molfile<br />mop chemical/x-mopac-input<br />mov video/quicktime<br />movie video/x-sgi-movie<br />mp2 audio/x-mpeg<br />mp3 audio/x-mpeg<br />mp4 video/mp4<br />mpc application/vnd.mpohun.certificate<br />mpe video/mpeg<br />mpeg video/mpeg<br />mpg video/mpeg<br />mpg4 video/mp4<br />mpga audio/mpeg<br />mpn application/vnd.mophun.application<br />mpp application/vnd.ms-project<br />mps application/x-mapserver<br />mrl text/x-mrml<br />mrm application/x-mrm<br />ms application/x-troff-ms<br />mts application/metastream<br />mtx application/metastream<br />mtz application/metastream<br />mzv application/metastream<br />nar application/zip<br />nbmp image/nbmp<br />nc application/x-netcdf<br />ndb x-lml/x-ndb<br />ndwn application/ndwn<br />nif application/x-nif<br />nmz application/x-scream<br />nokia-op-logo image/vnd.nok-oplogo-color<br />npx application/x-netfpx<br />nsnd audio/nsnd<br />nva application/x-neva1<br />oda application/oda<br />oom application/x-AtlasMate-Plugin<br />pac audio/x-pac<br />pae audio/x-epac<br />pan application/x-pan<br />pbm image/x-portable-bitmap<br />pcx image/x-pcx<br />pda image/x-pda<br />pdb chemical/x-pdb<br />pdf application/pdf<br />pfr application/font-tdpfr<br />pgm image/x-portable-graymap<br />pict image/x-pict<br />pm application/x-perl<br />pmd application/x-pmd<br />png image/png<br />pnm image/x-portable-anymap<br />pnz image/png<br />pot application/vnd.ms-powerpoint<br />ppm image/x-portable-pixmap<br />pps application/vnd.ms-powerpoint<br />ppt application/vnd.ms-powerpoint<br />pqf application/x-cprplayer<br />pqi application/cprplayer<br />prc application/x-prc<br />proxy application/x-ns-proxy-autoconfig<br />ps application/postscript<br />ptlk application/listenup<br />pub application/x-mspublisher<br />pvx video/x-pv-pvx<br />qcp audio/vnd.qcelp<br />qt video/quicktime<br />qti image/x-quicktime<br />qtif image/x-quicktime<br />r3t text/vnd.rn-realtext3d<br />ra audio/x-pn-realaudio<br />ram audio/x-pn-realaudio<br />rar application/x-rar-compressed<br />ras image/x-cmu-raster<br />rdf application/rdf+xml<br />rf image/vnd.rn-realflash<br />rgb image/x-rgb<br />rlf application/x-richlink<br />rm audio/x-pn-realaudio<br />rmf audio/x-rmf<br />rmm audio/x-pn-realaudio<br />rmvb audio/x-pn-realaudio<br />rnx application/vnd.rn-realplayer<br />roff application/x-troff<br />rp image/vnd.rn-realpix<br />rpm audio/x-pn-realaudio-plugin<br />rt text/vnd.rn-realtext<br />rte x-lml/x-gps<br />rtf application/rtf<br />rtg application/metastream<br />rtx text/richtext<br />rv video/vnd.rn-realvideo<br />rwc application/x-rogerwilco<br />s3m audio/x-mod<br />s3z audio/x-mod<br />sca application/x-supercard<br />scd application/x-msschedule<br />sdf application/e-score<br />sea application/x-stuffit<br />sgm text/x-sgml<br />sgml text/x-sgml<br />sh application/x-sh<br />shar application/x-shar<br />shtml magnus-internal/parsed-html<br />shw application/presentations<br />si6 image/si6<br />si7 image/vnd.stiwap.sis<br />si9 image/vnd.lgtwap.sis<br />sis application/vnd.symbian.install<br />sit application/x-stuffit<br />skd application/x-Koan<br />skm application/x-Koan<br />skp application/x-Koan<br />skt application/x-Koan<br />slc application/x-salsa<br />smd audio/x-smd<br />smi application/smil<br />smil application/smil<br />smp application/studiom<br />smz audio/x-smd<br />snd audio/basic<br />spc text/x-speech<br />spl application/futuresplash<br />spr application/x-sprite<br />sprite application/x-sprite<br />spt application/x-spt<br />src application/x-wais-source<br />stk application/hyperstudio<br />stm audio/x-mod<br />sv4cpio application/x-sv4cpio<br />sv4crc application/x-sv4crc<br />svf image/vnd<br />svg image/svg-xml<br />svh image/svh<br />svr x-world/x-svr<br />swf application/x-shockwave-flash<br />swfl application/x-shockwave-flash<br />t application/x-troff<br />tad application/octet-stream<br />talk text/x-speech<br />tar application/x-tar<br />taz application/x-tar<br />tbp application/x-timbuktu<br />tbt application/x-timbuktu<br />tcl application/x-tcl<br />tex application/x-tex<br />texi application/x-texinfo<br />texinfo application/x-texinfo<br />tgz application/x-tar<br />thm application/vnd.eri.thm<br />tif image/tiff<br />tiff image/tiff<br />tki application/x-tkined<br />tkined application/x-tkined<br />toc application/toc<br />toy image/toy<br />tr application/x-troff<br />trk x-lml/x-gps<br />trm application/x-msterminal<br />tsi audio/tsplayer<br />tsp application/dsptype<br />tsv text/tab-separated-values<br />tsv text/tab-separated-values<br />ttf application/octet-stream<br />ttz application/t-time<br />txt text/plain<br />ult audio/x-mod<br />ustar application/x-ustar<br />uu application/x-uuencode<br />uue application/x-uuencode<br />vcd application/x-cdlink<br />vcf text/x-vcard<br />vdo video/vdo<br />vib audio/vib<br />viv video/vivo<br />vivo video/vivo<br />vmd application/vocaltec-media-desc<br />vmf application/vocaltec-media-file<br />vmi application/x-dreamcast-vms-info<br />vms application/x-dreamcast-vms<br />vox audio/voxware<br />vqe audio/x-twinvq-plugin<br />vqf audio/x-twinvq<br />vql audio/x-twinvq<br />vre x-world/x-vream<br />vrml x-world/x-vrml<br />vrt x-world/x-vrt<br />vrw x-world/x-vream<br />vts workbook/formulaone<br />wav audio/x-wav<br />wax audio/x-ms-wax<br />wbmp image/vnd.wap.wbmp<br />web application/vnd.xara<br />wi image/wavelet<br />wis application/x-InstallShield<br />wm video/x-ms-wm<br />wma audio/x-ms-wma<br />wmd application/x-ms-wmd<br />wmf application/x-msmetafile<br />wml text/vnd.wap.wml<br />wmlc application/vnd.wap.wmlc<br />wmls text/vnd.wap.wmlscript<br />wmlsc application/vnd.wap.wmlscriptc<br />wmlscript text/vnd.wap.wmlscript<br />wmv audio/x-ms-wmv<br />wmx video/x-ms-wmx<br />wmz application/x-ms-wmz<br />wpng image/x-up-wpng<br />wpt x-lml/x-gps<br />wri application/x-mswrite<br />wrl x-world/x-vrml<br />wrz x-world/x-vrml<br />ws text/vnd.wap.wmlscript<br />wsc application/vnd.wap.wmlscriptc<br />wv video/wavelet<br />wvx video/x-ms-wvx<br />wxl application/x-wxl<br />x-gzip application/x-gzip<br />xar application/vnd.xara<br />xbm image/x-xbitmap<br />xdm application/x-xdma<br />xdma application/x-xdma<br />xdw application/vnd.fujixerox.docuworks<br />xht application/xhtml+xml<br />xhtm application/xhtml+xml<br />xhtml application/xhtml+xml<br />xla application/vnd.ms-excel<br />xlc application/vnd.ms-excel<br />xll application/x-excel<br />xlm application/vnd.ms-excel<br />xls application/vnd.ms-excel<br />xlt application/vnd.ms-excel<br />xlw application/vnd.ms-excel<br />xm audio/x-mod<br />xml text/xml<br />xmz audio/x-mod<br />xpi application/x-xpinstall<br />xpm image/x-xpixmap<br />xsit text/xml<br />xsl text/xml<br />xul text/xul<br />xwd image/x-xwindowdump<br />xyz chemical/x-pdb<br />yz1 application/x-yz1<br />z application/x-compress<br />zac application/x-zaurus-zac<br />zip application/zip <br /> <img src ="http://www.blogjava.net/faithwind/aggbug/85396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-12-04 16:40 <a href="http://www.blogjava.net/faithwind/archive/2006/12/04/85396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC+Hibernate将Blob数据写入Oracle[摘]</title><link>http://www.blogjava.net/faithwind/archive/2006/11/10/80360.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 10 Nov 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/11/10/80360.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/80360.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/11/10/80360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/80360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/80360.html</trackback:ping><description><![CDATA[Oracle的Blob字段比较特殊，他比long字段的性能要好很多，可以用来保存例如图片之类的二进制数据。 <br /><br />　　写入Blob字段和写入其它类型字段的方式非常不同，因为Blob自身有一个cursor，你必须使用cursor对blob进行操作，因而你在写入Blob之前，必须获得cursor才能进行写入，那么如何获得Blob的cursor呢？ <br /><br />　　这需要你先插入一个empty的blob，这将创建一个blob的cursor，然后你再把这个empty的blob的cursor用select查询出来，这样通过两步操作，你就获得了blob的cursor，可以真正的写入blob数据了。 <br /><br />　　看下面的JDBC的demo，把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段) <br /><br />　　import java.sql.*; <br />　　import java.io.*; <br />　　import oracle.sql.*; <br />　　public class WriteBlob { <br /><br />　　public static void main(String[] args) { <br /><br />　　try { <br />　　DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); <br />　　Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai"); <br />　　conn.setAutoCommit(false); <br /><br />　　BLOB blob = null; <br /><br />　　PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())"); <br />　　pstmt.setString(1,"fankai"); <br />　　pstmt.executeUpdate(); <br />　　pstmt.close(); <br /><br />　　pstmt = conn.prepareStatement("select content from javatest where <br />　　}<br /><img src ="http://www.blogjava.net/faithwind/aggbug/80360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-11-10 11:45 <a href="http://www.blogjava.net/faithwind/archive/2006/11/10/80360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建Tree的js集合</title><link>http://www.blogjava.net/faithwind/archive/2006/11/09/80190.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 09 Nov 2006 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/11/09/80190.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/80190.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/11/09/80190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/80190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/80190.html</trackback:ping><description><![CDATA[
		<p>我用过的2个：</p>
		<p>1.<a href="http://webfx.eae.net/dhtml/xtree/"><font color="#223355">xtree</font></a>和<a href="http://webfx.eae.net/dhtml/xloadtree/xloadtree.html" target="_blank"><font color="#223355">xloadtree</font></a>,总体来说,实现还不错,提供了一次性构建树,和动态加载树(生成指定格式的XML才可以),改变Style,功能中等,用法中等.</p>
		<p>2.<a href="http://developer.yahoo.com/yui" target="_blank"><font color="#223355">yui</font></a>的<a href="http://developer.yahoo.com/yui/treeview/" target="_blank"><font color="#223355">treeview</font></a>,这也是不错的实现,是Yahoo提供的,支持一次性构建,动态构建,改变Style,Menu样式等等,功能很多,但用法比较复杂<br /><br /><br />没用过，只是听说的<br /></p>
		<p>3.<a href="http://www.destroydrop.com/javascripts/tree/" target="_blank"><font color="#223355">dtree</font></a>,比较中规中矩的一个实现,用法简单,不支持动态加载。</p>
		<p>
				<br />
				<br />还有其他的好的js，大家可以补充。<br /></p>
<img src ="http://www.blogjava.net/faithwind/aggbug/80190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-11-09 16:13 <a href="http://www.blogjava.net/faithwind/archive/2006/11/09/80190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle8i中使用Java语言来开发存储过程</title><link>http://www.blogjava.net/faithwind/archive/2006/08/16/63908.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Wed, 16 Aug 2006 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/08/16/63908.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/63908.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/08/16/63908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/63908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/63908.html</trackback:ping><description><![CDATA[    
<div class="Section1"><br />  <br />Oracle8i中使用Java语言来开发存储过程 <br />本篇文章来源与时代朝阳数据库（原晓通数据库）培训部Oracle 资料库。 <br />在Oracle8i之前，开发人员只能使用PL/SQL来开发存储过程。而在Oracle8i之中，不仅可以使用原有的PL/SQL开发存储过程，而且也可以使用Java语言来开发存储过程。本篇文章将简单介绍关于这方面的知识，包括以下内容： <br />  <br />l         存储过程简介； <br />l         Java存储过程 <br />l         Java存储过程的开发步骤 <br />l         使用Java开发过程； <br />l         使用Java开发函数； <br />l         使用Java开发包； <br />l         使用Java开发触发器； <br />l         使用Java开发对象方法； <br />l         使用JDeveloper开发JSP。 <b>存储过程简介</b><br />存储过程是存储在数据库中的一段存储程序。当创建存储过程时，系统会对其进行编译，并将执行代码存储到数据库中。 <br />  <br />1.         设计存储过程的方针 <br />  <br />l         在定义存储过程时，要使用其完成单一、相对集中的任务。 <br />l         在定义存储过程时，不要定义已经由其它特征所提供功能的过程。例如，不要定义强制数据完整性的过程（使用完整性约束）。 <br />  <br />2.         存储过程的优点 <br />1)        安全性 <br />  <br />当创建了存储过程之后，可以将执行该过程的权限授予其它用户，从而使得他可以执行特定的数据库操作，而不能访问其它模式对象（例如表）。例如，你可以将执行过程（更新表）的权限授予其它用户，但不授予它们直接访问该表的权限。 <br />  <br />2)        性能 <br />  <br />l         存储过程只被发送到数据库一次，相对于SQL语句或PL/SQL块而言，其网络通信量更小。 <br />l         当调用存储过程时，数据库会直接运行该存储过程，无需进行编译。相对于SQL语句或PL/SQL块而言，其执行速度更快。 <br />  <br />3)        内存分配 <br />  <br />存储过程充分利用了Oracle共享内存的能力。在将存储过程装载到内存中后，多个用户可以同时调用该存储过程，从而降低了应用对Oracle的实际内存需求。 <br />  <br />4)        生产力 <br />  <br />存储过程提高了开发生产力。通过将公共集合编写为存储过程，避免了冗余代码，从而提高了开发生产力。例如，我们可以编写用于插入、更新、删除AUTHS表的过程，此后应用可以直接调用这些过程，而无需重写SQL语句。当管理数据的方法发生变化时，只需要修改过程，而不需要对应用进行任何修改。 <b>Java</b><b>存储过程</b><br />在以前的Oracle版本中，开发存储过程是通过PL/SQL来完成的。而在Oracle8i版本中，我们不仅可以使用PL/SQL开发存储过程，而且还可以使用Java语言来开发存储过程。 <br />  <br />1.         PL/SQL与Java存储过程比较 <br />  <br />与PL/SQL相比，使用Java语言开发存储过程有以下优点： <br />  <br />l         Java语言具有更强大的运算能力，提供了更多的运算方法。当要完成进行复杂运算的存储过程时，使用JSP将是你最好的选择。 <br />l         PL/SQL只能用于Oracle数据库，而Java语言可以应用于更多的数据库系统（如Sybase、DB2、Informix等等），所以Java存储过程将具有更好的兼容性、可移植性。 <br />  <br />2.         JSP分类 <br />Java存储过程包括过程、函数、触发器以及对象方法四种类型。 <br />  <br />3.         调用JSP的四种方法 <br />  <br />l         CALL语法； <br />l         DML语句； <br />l         PL/SQL块、子程序、包； <br />l         由触发器隐含调用。 <b>Java</b><b>存储过程的开发步骤</b><b></b><br />1.         编写Java源代码 <br />  <br />当开发Java存储过程时，首先应该编写Java源代码。如下图所示：<em><br />注意事项： <br />  <br />l          当以public方式声明类时，类名必须与其文件名完全一致。 <br />l          只有public static方法可以作为Java存储过程。 <br />  <br />2.         装载Java代码及类到Oracle8i数据库中 <br />在编写了Java源代码之后，接下来应该将Java代码及相应的Java类装载到Oracle8i数据库中。如下图所示：<em><br />装载Java代码及类到RDBMS有以下两种方法： <br />  <br />l         使用loadjava工具，通过该工具可以快速装载Java源代码（.java）、Java二进制代码（.class）以及Java打包文件（.jar）。 <br />l         使用CREATE Java、ALTER Java装载Java代码。 <br />  <br />其中，前一种方法相对简单，并且我们推荐你使用这种方法。 <br />  <br />3.         生成调用说明 <br />  <br />在装载了Java类之后，接下来应该生成对public static方法的调用说明，最终完成Java存储过程的开发工作。如下图所示：<em><br />  <br />完成上述步骤之后，就完成了Java存储过程的开发工作，然后就可以调用并执行该Java存储过程了。 <b>使用</b><b>Java</b><b>开发过程</b><br />过程用于执行某种操作。需要注意的是，过程所对应的Java方法返回值必须为空（void）。本节以创建用于插入、修改和删除AUTHS表的JSP为例，说明使用Java开发过程的方法。如下图所示：<em><br />下面讲述完成上述任务的方法及过程： <br />  <br />1.         编写Java源代码 <br />  <br />程序清单如下（manipulate_auths.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.jdbc.driver.*; <br />  <br />/* 主类 */ <br />public class manipulate_auths { <br />  <br />  public static void insert_auths <br />    (String code,String name,int sex,String birthdate,String entry_date_time) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />String sql = "INSERT INTO auths <br /> (author_code,name,sex,birthdate,entry_date_time) " + <br />                 "VALUES (?,?,?,?,?)"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      pstmt.setString(2, name); <br />      pstmt.setInt(3, sex); <br />      pstmt.setString(4, birthdate); <br />      pstmt.setString(5, entry_date_time); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) { } <br />  } <br />  <br />  public static void delete_auths (String code) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "DELETE FROM auths  WHERE author_code = ?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) { } <br />  } <br />  <br />  public static void modify_salary (String code,float salary) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "UPDATE auths SET salary = ? WHERE author_code = ?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setFloat(1, salary); <br />      pstmt.setString(2, code); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) { } <br />  } <br />} <br />2.         装载Java代码及类到Oracle8i数据库中 <br />  <br />在编写了Java源代码之后，就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法： <br /> <em><br /><em><br />  <br />3.         发行Java，生成调用说明 <br />  <br />在装载了Java类后，就可以发行该Java类，并生成调用其方法的过程说明了。下面是完成该项任务的方法： <br /> <em><br /><em><br /><em><br /><em><br /><br />  <br />4.         调用JSP <br />在生成了调用Java方法的过程说明之后，我们就可以调用JSP了。例如： <br /> <em><br /><em><br /><em><b>使用</b><b>Java</b><b>开发函数</b><br />函数用于返回特定数据。本节将通过创建用于返回作者的文章标题，以及某种类型的文章个数为例，说明使用Java开发函数的方法。如下图所示： <br /> <em><br />  <br />下面讲述完成上述任务的方法和过程。 <br />  <br />1.         编写Java源代码 <br />  <br />程序清单如下（query_article.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.jdbc.driver.*; <br />  <br />/* 主类 */ <br />public class query_article { <br />  <br />  public static String auths_article(String code) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql1 = "SELECT name FROM auths WHERE author_code=?"; <br />    String sql2 = "SELECT title FROM article WHERE author_code=?"; <br />    /* 声明并初始化auths_article变量 */ <br />    String auths_article = new String(); <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql1); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      /* 执行查询，并将结果保存到结果集中 */ <br />      ResultSet rset = pstmt.executeQuery(); <br />      /* 循环获取并处理结果集数据 */ <br />      while(rset.next()) <br />        auths_article =auths_article + rset.getString(1); <br />      /* 关闭结果集 */ <br />      rset.close(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />    auths_article = auths_article + "所编写文章的标题如下：\n"; <br />  <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql2); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      /* 执行查询，并将结果保存到结果集中 */ <br />      ResultSet rset = pstmt.executeQuery(); <br />      /* 循环获取并处理结果集数据 */ <br />      while(rset.next()) { <br />        auths_article =auths_article + "    " + rset.getString(1) + "\n"; <br />      } <br />      /* 关闭结果集 */ <br />      rset.close(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />    return auths_article; <br />  } <br />  <br />  public static String query_type_article_number(String code) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "SELECT count(*) FROM article WHERE article_code IN " <br />       + "(SELECT article_code FROM article_type WHERE type_code=?)"; <br />    String article_number = new String("类型为" + code + "的文章共有 "); <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      /* 执行查询，并将结果保存到结果集中 */ <br />      ResultSet rset = pstmt.executeQuery(); <br />      /* 循环获取并处理结果集数据 */ <br />      while(rset.next()) <br />        article_number = article_number + rset.getString(1) + "篇"; <br />      /* 关闭结果集 */ <br />      rset.close(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />    return article_number; <br />  } <br />} <br />  <br />2.         装载Java代码及类到Oracle8i数据库中 <br />  <br />在编写了Java源代码之后，就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法：<em><br /><em><br />  <br />3.         发行Java，生成调用说明 <br />  <br />在装载了Java类后，就可以发行该Java类，并生成调用其方法的函数说明了。下面是完成该项任务的方法： <br /> <em><br /><em><br /><em><br />  <br />4.         调用JSP <br />  <br />在生成了调用Java方法的函数说明之后，就可以调用这些函数了。例如： <br /> <em><br /><em><b>使用</b><b>Java</b><b>开发</b><b>包</b><br />Java类用于封装Java方法，与此类似，包用于封装过程和函数等。本节将通过创建用于管理表subject的包为例，说明使用Java开发包的方法。如下图所示： <br /> <em><br /><br />  <br />下面讲述完成上述任务的方法和过程。 <br />  <br />1.         编写Java源代码 <br />  <br />程序清单如下（manage_subject.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.jdbc.driver.*; <br />  <br />/* 主类 */ <br />public class manage_subject { <br />  <br />  public static String query_subject() <br />  throws SQLException { <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造SQL语句 */ <br />    String sql = "SELECT * FROM subject"; <br />    /* 声明并初始化subject变量 */ <br />    String subject = new String(); <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 创建Statement对象 */ <br />      Statement stmt = conn.createStatement(); <br />      /* 执行SQL语句，并将查询结果赋给结果集 */ <br />      ResultSet rset = stmt.executeQuery(sql); <br />      /* 循环获取并处理结果集变量 */ <br />      while(rset.next()) <br />        subject = subject + rset.getString(1) + "\n"; <br />      /* 关闭结果集 */ <br />      rset.close(); <br />    } catch (SQLException e) {} <br />    return subject; <br />  } <br />  <br />  public static void insert_subject(String subject) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "INSERT INTO subject VALUES(?)"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, subject); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />  <br />  public static void delete_subject(String subject) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "DELETE FROM subject WHERE subject=?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, subject); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />  <br />  public static void update_subject(String old_subject,String new_subject) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "UPDATE subject SET subject=? WHERE subject=?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, new_subject); <br />      pstmt.setString(2, old_subject); <br />      /* 执行动态SQL语句 */ <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />} <br />  <br />2.         装载Java代码及类到Oracle8i数据库中 <br />  <br />在编写了Java源代码之后，就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法： <br /> <em><br /><em><br /><br />  <br />3.         发行Java，生成调用说明 <br />  <br />在装载了Java类后，就可以发行该Java类，并生成调用其方法的包了。下面是完成该项任务的方法：<em><br /><em><br /><em><br /><br />4.         调用JSP <br />  <br />在生成了调用Java方法的包后，就可以调用这些方法所对应的函数和过程了。例如： <br /> <br /><em><br /><em><br /><em><br /><em><br /><b>使用</b><b>Java</b><b>开发</b><b>触发器</b><br />触发器是一段存储程序，当执行特定修改操作时，会触发它，并执行其中的存储程序。下面以记载表AUTHS作者工资更新情况的触发器为例，说明使用Java开发触发器的方法。如下图所示： <br /> <em><br /><br /><br />  <br />下面讲述完成上述任务的方法和过程。 <br />  <br />1.         编写Java源代码 <br />  <br />程序清单如下（trigger.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.jdbc.driver.*; <br />/* 主类 */ <br />public class trigger { <br />  <br />  public static void log_salary(String name,float old_sal,float new_sal) <br />  throws SQLException { <br />  <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    String sql = "INSERT INTO salary_audit VALUES(?,?,?)"; <br />  <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      pstmt.setString(1, name); <br />      pstmt.setFloat(2, old_sal); <br />      pstmt.setFloat(3, new_sal); <br />      pstmt.executeUpdate(); <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />} <br />  <br />2.         装载Java代码及类到Oracle8i数据库中 <br />  <br />在编写了Java源代码之后，就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法： <br /> <em><br /><em><br /><br />3.         发行Java，生成调用说明 <br />  <br />在装载了Java类后，就可以发行该Java类，并生成调用其方法的过程说明及触发器了。下面是完成该项任务的方法：<em><br /><em><br /><em><br /><em><br /><br />  <br />4.         调用JSP <br />  <br />在创建了触发器之后，当修改作者工资时会自动调用其中的存储程序。例如： <br /> <em><br /><em><br /><b>使用</b><b>Java</b><b>开发对象方法</b><br />对象类型是一种用户自定义的数据结构，它可以将数据类型、函数以及过程封装到该数据结构中。对象方法是指对象类型中的函数和过程，本节将以获取和增加对象工资信息为例，说明使用Java开发对象方法的方法。如下图所示：<em><br /><br />  <br />下面讲述完成上述任务的方法及过程： <br />  <br />1.         编写Java源代码 <br />  <br />程序清单如下（object_type.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.sql.*; <br />import oracle.jdbc.driver.*; <br />import oracle.oracore.*; <br />import oracle.jdbc2.*; <br />import java.math.*; <br />  <br />/* 主类，实现了SQLData接口 */ <br />public class object_type implements SQLData { <br />  <br />  /* 声明private变量，它们对应于对象类型的属性 */ <br />  private String code; <br />  private String name; <br />  private BigDecimal sex; <br />  private BigDecimal salary; <br />  <br />  /* 方法get_name()：对象类型的方法，用于获取对象姓名 */ <br />  public String get_name() { <br />    return name; <br />  } <br />  <br />  /* 方法get_salary()：对象类型的方法，用于获取对象工资 */ <br />  public BigDecimal get_salary() { <br />    BigDecimal sal = salary; <br />    return sal; <br />  } <br />  /* 方法raise_salary()：对象类型的方法，用于增加对象工资 */ <br />  public void raise_salary(BigDecimal raise) { <br />    salary = salary.add(raise); <br />  } <br />  <br />  /* 以下程序段实现了接口SQLData */ <br />  String sql_type; <br />  public String getSQLTypeName() throws SQLException { <br />    return sql_type; <br />  } <br />  <br />  public void readSQL(SQLInput stream, String typeName) throws SQLException { <br />    sql_type = typeName; <br />    code = stream.readString(); <br />    name = stream.readString(); <br />    sex = stream.readBigDecimal(); <br />    salary = stream.readBigDecimal(); <br />  } <br />  <br />  public void writeSQL(SQLOutput stream) throws SQLException { <br />    stream.writeString(code); <br />    stream.writeString(name); <br />    stream.writeBigDecimal(sex); <br />    stream.writeBigDecimal(salary); <br />  } <br />} <br />  <br />2.         装载Java代码及类到Oracle8i数据库中 <br />  <br />在编写了Java源代码之后，就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法： <br /> <em><br /><em><br /><br />  <br />3.         发行Java，生成调用说明 <br />  <br />在装载了Java类后，就可以发行该Java类，并生成调用其方法的相应对象方法了。下面是完成该项任务的方法： <br /> <em><br /><em><br /><em><br /><br />  <br />4.         调用JSP <br />  <br />在创建了对象类型及对象方法之后，就可以调用这些对象方法了。例如： <br /> <em><br /><b>使用</b><b>JDeveloper</b><b>开发</b><b>JSP</b><br />本节以创建用于操纵ARTICLE表的JSP为例，说明使用JDeveloper 2.0开发JSP的方法。如下图所示：<em><br /><br />这里只简单介绍使用JDeveloper开发JSP的过程和步骤，而关于如何使用JDeveloper请读者参见相关手册。 <br />  <br />1.         准备工作 <br />  <br />1)        选择“File—&gt; New Workspace”，创建名称为jsp.jws的工作组。如下图所示： <br /> <em><br /><br />  <br />2)        选择“File—&gt;New Project”，此时会启动新项目创建向导，并显示如下对话框： <br /> <em><br /><br />  <br />3)        选中“Create an &lt;Empty Project&gt;”，然后单击“Next”，此时会显示如下对话框：<em><br /><br />  <br />4)        如上图所示，在“Project Name”框中键入“article”，项目路径框中键入“d:\jsp”，然后单击“Next”，此时会显示如下对话框： <br /> <em><br /><br />  <br />5)        在上图的对话框中键入你所需要的信息，然后单击“Next”，此时会显示如下对话框： <br /> <em><br /><br />  <br />6)        单击“Finish”，完成项目的创建过程，此时的图形界面如下： <br /> <em><br /><br />  <br />2.         编写Java源代码 <br />  <br />在完成了准备工作之后，我们就可以编写Java源代码了。步骤如下： <br />  <br />1)        选择“File—&gt;New”，此时会弹出如下对话框： <br />  <br /><em><br /><br />  <br />2)        如上图所示，选中“Class”，然后单击“OK”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />3)        如上图所示，在“Class Name”框中键入“article”，选中“Style”中的“Public”，然后单击“OK”，此时会增加名称为“article.java”的节点。如下图所示： <br /> <em><br /><br />  <br />4)        双击“article.java”节点，会显示编辑工作区。如下图所示： <br /> <em><br /><br />  <br />5)        然后，在编辑工作区中编写如下的Java源代码（article.java）： <br />  <br />/* 导入Java类 */ <br />import java.sql.*; <br />import java.io.*; <br />import oracle.jdbc.driver.*; <br />  <br />/* 主类 */ <br />public class article { <br />  <br />  public static String query_article(String code) <br />  throws SQLException { <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句*/ <br />    String sql = "SELECT author_code,title FROM article " + <br />                  "WHERE article_code = ?"; <br />    /* 声明String变量article_info，该变量将用于存储文章信息 */ <br />    String article_info = new String(); <br />  <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      ResultSet rset = pstmt.executeQuery(); <br />      /* 循环获取并处理结果 */ <br />      while(rset.next()) { <br />        article_info = "作者代码：  " + rset.getString(1) + "\n"; <br />        article_info = article_info + "文章标题：  " + <br />                          rset.getString(2); <br />      } <br />      /* 关闭结果集 */ <br />      rset.close(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />    return article_info; <br />  } <br />  <br />  public static void insert_article(String article_code, <br />      String author_code,String secrate_level,String pub_date) <br />  throws SQLException { <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "INSERT INTO article (article_code,author_code," + <br />                    "secrate_level,pub_date) VALUES (?,?,?,?)"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, article_code); <br />      pstmt.setString(2, author_code); <br />      pstmt.setString(3, secrate_level); <br />      pstmt.setString(4, pub_date); <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />  <br />  public static void delete_article (String code) <br />  throws SQLException { <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造SQL语句 */ <br />    String sql = "DELETE FROM article  WHERE article_code = ?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, code); <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />  <br />  public static void update_article (String code,String secrate_level) <br />  throws SQLException { <br />    /* 建立到数据库的缺省连接 */ <br />    Connection conn = new OracleDriver().defaultConnection(); <br />    /* 构造动态SQL语句 */ <br />    String sql = "UPDATE article SET secrate_level = ?" + <br />                  " WHERE article_code = ?"; <br />    /* 使用try ... catch语句抓取并抛出例外 */ <br />    try { <br />      /* 准备动态SQL语句 */ <br />      PreparedStatement pstmt = conn.prepareStatement(sql); <br />      /* 设置动态SQL参数值 */ <br />      pstmt.setString(1, secrate_level); <br />      pstmt.setString(2, code); <br />      pstmt.executeUpdate(); <br />      /* 关闭动态SQL语句 */ <br />      pstmt.close(); <br />    } catch (SQLException e) {} <br />  } <br />} <br />  <br />3.         配置并发行JSP <br />  <br />步骤如下： <br />  <br />1)        选择“Project—&gt;Deploy—&gt;New Profile”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />2)        如上图所示，选中“Deploy Java Classes and Stored Procedure to Oracle8i”，然后单击“Next”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />3)        单击“Next”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />4)        单击“Next”，此时会显示如下对话框： <br /> <em><br /><br />  <br />5)        单击“Next”，此时会显示如下对话框： <br /> <em><br /><br />  <br />6)        清除“Default Database Package”框，然后单击“Next”，此时会显示如下对话框： <br /> <em><br /><br />  <br />7)        单击“New”创建数据库连接，此时会弹出如下对话框： <br /> <em><br /><br />  <br />该对话框用于配置数据库连接信息，按照你的数据库设置来配置相应参数。完成数据库连接的配置后，单击“Test Connection”测试配置是否正确。如果配置不正确，则修改配置参数。 <br />  <br />8)        单击“OK”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />在该对话框中显示了相应的数据库连接信息。 <br />  <br />9)        单击“Next”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />10)     单击“Finish”，此时会弹出如下对话框： <br /> <em><br /><br />  <br />11)     单击“No”退出配置，然后在主窗口中选中配置文件“Profile1.prf”，单击鼠标右键，此时会显示如下弹出菜单： <br /> <em><br /><br />  <br />12)     从弹出菜单中选择“Properties”，此时会显示如下对话框： <br /> <em><br /><br />  <br />13)     选择“Methods”页，此时的对话框如下所示： <br /> <em><br /><br />  <br />14)     如上图所示，选中Publish下的所有单选框，然后单击“Done”，此时会显示如下对话框： <br /> <em><br /><br />  <br />15)     单击“Yes”，会开始配置和发行JSP，并最终显示如下界面： <br /> <em><br /><br />  <br />16)     单击“Done”，此时会显示如下信息框： <br /> <em><br /><br />  <br />17)     单击“OK”，这样我们就完成了配置和发行JSP的全部过程了。然后，我们就可以调用JSP完成相应任务了。 <br />  <br />4.         调用JSP <br />  <br />在创建了基于Java的函数和过程之后，就可以调用这些函数和过程了。方法如下： <br />  <br /><em><br /><em><br /><br /><em><br /><em><em><br /></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></div><img src ="http://www.blogjava.net/faithwind/aggbug/63908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-08-16 15:18 <a href="http://www.blogjava.net/faithwind/archive/2006/08/16/63908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发人员 JAVA存储过程</title><link>http://www.blogjava.net/faithwind/archive/2006/08/16/63859.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Wed, 16 Aug 2006 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/08/16/63859.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/63859.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/08/16/63859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/63859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/63859.html</trackback:ping><description><![CDATA[Oracle开发人员 JAVA存储过程 <br />利用Java存储过程简化数据库操作 
<p>作者：Kuassi Mensah </p><p>利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。 </p><p>存储过程（stored procedure）允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来。这种分离可以降低整个应用程序的复杂性，并提供其重用性、安全性、性能和可伸缩性。 </p><p>但是，妨碍存储过程广泛采用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。使用基于Java的存储过程可以解决这一问题。Oracle已经实现了ANSI标准，这些标准规定了从SQL中将静态Java方法作为过程或函数进行调用的能力。这种实现被简单地称作"Java存储过程"。</p><p>在本文中，你将了解基于Java的存储过程如何帮助简化商务逻辑、提高其性能，并扩展数据库的功能。本文将介绍Oracle如何在数据库内启用基于Java的存储过程。还会介绍Java存储过程如何访问数据，以及如何创建基本Java存储过程。 </p><p>选择PL/SQL还是Java</p><p>在考虑Oracle存储过程时，你可能会想到PL/SQL。不过，从Oracle8i开始，Oracle已经在数据库中支持Java，从而为存储过程提供了不同于PL/SQL的开放式和可移植的方法。我可以听到"$64 000问题"："我如何在PL/SQL和Java之间做出选择？我是否应当忘记已经学习的所有PL/SQL相关知识，而变为一个Java天地的新手？" </p><p>两种语言都适用于数据库编程，都有自己的优点和弱点。在决定选择哪一种语言时，可以参考下面根据经验得出的通用规则： </p><p><br />对于要求与SQL进行无缝集成的数据库中心来说则逻辑使用PL/SQL，从而完成对数据库对象、类型和特性的访问。 </p><p><br />出于与数据库的无关性考虑时，可以选择Java作为开放式的语言来取代PL/SQL，同时也为了集成和沟通SQL、XML、J2EE和Web服务等各个领域。 <br />OralceJVM使得Java可以运行在数据库中</p><p>从Oracle8i版本1（Oralce8.1.5）开始，Oracle便提供紧密集成的Java虚拟机（JVM），JVM支持Oralce的数据库会话期结构。任何数据库对话期都可以在第一Java代码调用时启动一个虚拟上专用的JVM，后续的用户可以使用这一已经存在的支持Java的会话期。事实上，所有会话共享同一JVM代码并保持"仅静态"的私有状态，而垃圾则收集在单个对话期空间内，从而为各个Java对话期提供了和SQL操作相同的对话期隔离和数据完整性能力。这里，不需要为了数据完整性而进行单独的Java支持的过程。这一基于对话期的结构提供了较小的内存占用率，并使OracleJVM具有与Oracle数据库一样的线性SMP可伸缩性。 </p><p>创建Java存储过程 </p><p>要将Java方法转换为Java存储过程需要几个步骤，包括：用loadjava实用程序将Java类加载到数据库中，利用调用规范（Call Spec）发布Java方法，将Java方法、参数类型和返回类型映射到其SQL的对应部分。下面部分说明如何完成这些步骤。 </p><p>我将使用一个简单的Hello类，它有一个方法Hello.world()，返回字符串"Hello world"：</p><p><br />public class Hello { public static String world () { return "Hello world"; } } <br />Loadjava 实用程序</p><p>Loadjava是加载Java源文件、Java类文件和Java资源文件的实用程序，它可以用来验证字节码，并将Java类和JAR文件布置到数据库中。它既可以通过命令行调用，也可以通过包含于DBMS_JAVA类中的loadjava()方法调用。为了加载我们的Hello.class示例，输入：</p><p><br />loadjava -user scott/tiger Hello.class </p><p>从Oracle9i版本2开始，loadjava允许通过为包含在被处理的类中的方法创建相应的Call Specs来自动将Java类发布为存储过程。Oracle为开发、测试、调试和布置Java存储过程提供了Oracle9i JDeveloper。</p><p>The Resolver Spec </p><p>基于JDK的JVM在列于CLASSPATH中的目录中查找类引用，并对其进行解析。因为Oracle数据库类存在于数据库模式中，所以OracleJVM利用数据库解析器（resolver）通过列于Resolver Spec中的模式查找并解析类引用。与CLASSPATH不同（CLASSPATH可以应用于所有的类），Resover Spec根据每类的情况进行应用。缺省解析器首先在加载类的模式中搜寻类，然后在公共同义词（public synonyms）中搜索。 </p><p><br /> loadjava -resolve &lt;myclass&gt; <br />你可能需要指定不同的解析器，也可以在使用loadjava时强制进行解析，从而在布置时确定可能在以后运行时发生的任何问题。 </p><p><br />loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))" <br />Call Spec和存储过程调用 </p><p>为了从SQL中调用Java方法（以及从PL/SQl和JDBC中调用），必须首先通过Call Spec发布公共静态方法，它为SQL定义方法采用的参数以及返回的SQL类型。</p><p>在我们的例子中，我们将利用SQL＊Plus连接到数据库，并为Hello.world()定义一个顶级Call Spec： </p><p><br />SQL&gt; connect scott/tiger SQL&gt; create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created. <br />可以像下面这样调用Java存储过程：</p><p><br />SQL&gt; variable myString varchar2[20]; SQL&gt; call helloworld() into :myString; Call completed. SQL&gt; print myString; MYSTRING --------------------- Hello world <br />Java存储过程可以通过其Call Spec从以下各项中进行调用：SQL DML语句（INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE）、PL/SQL块、子程序、程序包以及数据库触发器。Call Spec的美妙之处在于存储过程实现可以从PL/SQL转换为Java，反之亦可，这一点对于请求者是透明的。</p><p>Call Spec从实现语言中（PL/SQL或Java）中抽象出调用界面，因而使之能够在原有应用程序和新的基于Java／J2EE的应用程序之间共享商务逻辑。但是，在从Java客户程序调用在数据库驻留的Java类时，你可能不希望通过PL/SQL包装器(wrapper)。在以后的版本中，Oracle计划提供一种机制，它可以使开发人员略过Call Spec。</p><p>高级数据访问控制 </p><p>Java存储过程可用于控制和限制对Oracle数据的访问，其方法是只允许用户通过存储过程管理数据，而存储过程在其调用者的权限内执行，而不能对表本身进行访问。例如，你可以在特定时间内禁止更新数据，或者使管理者只具有查询工资数据的权利，而不能进行更新，或者记录所有的访问并通知某一安全机构。</p><p>原有应用程序与J2EE应用程序之间的数据逻辑共享</p><p>因为原有应用程序与J2EE应用程序都通过Call Spec调用存储过程，所以J2EE和非J2EE应用程序可以共享相同的数据逻辑。由于有了Call Spec，所以不用考虑所用的是何种实现语言（无论是PL/SQL还是Java），该数据逻辑都可以共享。 </p><p>为BMP实体Bean自动生成主关键字</p><p>在对EJB实体bean应用BMP时，一个bean实例可以由自动生成的与新插入的数据相关联的主关键字惟一确定，它是ejbCreate()的返回值。可以利用一个插入相应数据的存储过程在一个数据库操作中检索ejbCeater()中的该值，并检索或计算主关键字。作为另一种方法，也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性，以一个SQL语句插入该数据并检索相应的关键字（或ROWID）。但是，存储过程方法在各个JDBC驱动器版本和数据库之间更具可移植性。</p><p>可以用以下三个步骤实现这一模式：<br />&gt;<br />创建一个Java存储过程，在公共GenPk类中定义一个公共静态Java方法insertAccount()。此方法将插入数据、计算惟一的关键字（通过发出一个序列号），并返回计算出的关键字作为主关键字。 </p><p></p><p><br />定义Call Spec </p><p><br />CREATE OR REPLACE PROCEDURE insertAccount(owner IN varchar, bal IN number, newid OUT number) AS LANGUAGE JAVA NAME 'GenPK.insertAccount( java.lang.String [])'; / </p><p><br />在ejbCreate()内调用存储过程 </p><p><br />Public AccountPK ejbCreate(String ownerName, int balance) throws CreateException { try { CallableStatement call = conn.prepareCall{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } } <br />为CMP实体Bean定制主关键字查找器 </p><p>查找器方法（Finder methods）用于检索已存在的EJB实体bean实例。主关键字查找器使你能够检索惟一标识的EJB实例。对于CMP实体bean，EJB容器根据声明描述，自动生成主关键字查找器findByPrimaryKey()方法。但是，在某些情况下，可能需要更多的控制，例如可能需要专门的查找器，如findByStoredProcKey()。在这些情况下，你可以结合使用Java存储过程和对象关系框架（如Oracle9i应用服务器[Oracle9iAS] TopLink）来实现定制的主关键字查找器方法。在将EJB查找器定义为REDIRECT或NAMED查找器后，TopLink将生成一个SQL查询用于检索bean实例。</p><p>数据驱动的EJB调用 </p><p>在数据驱动体系结构中，商务逻辑调用可以作为数据库操作（如插入、更新或删除）的结果来触发。实现该数据逻辑的Java存储过程可以被声明为数据库触发器，用以调用运行于中间层J2EE应用服务器的EJB。EJB的调用既可以采用J2EE1.3兼容的服务器通过Interoperable Inter-ORB Protocol（IIOP）标准远程方法调用（remote method invocation，RMI）实现，也可以通过销售商特定的传输协议（如Oracle9iAS/Oc4J的ORMI，或者通过BEA WebLogic的T3）用RMI来实现。每个应用服务器提供商在提供基于IIOP的RMI，以提供互操作性的同时，都有其自己优化的协议。Oracle9iAS同时支持基于IIOP的RMI调用和基于ORMI协议的RMI调用。 </p><p>数据驱动的消息传送 </p><p>Oracle9i数据库嵌入了Advanced Queuing（AQ，高级排队），它是一种集成的、稳定、可靠、安全、可扩展和事务处理式的消息排队框架。Oracle通过标准的Java消息传送系统（Java Messaging System，JMS）API为Java开发人员提供AQ功能。Java存储过程可以通过JMS接口调用AQ操作，从而能够实现快速、在会话期内、可扩展的、数据驱动的消息传送。 </p><p>Java存储过程可以利用JMS调用AQ操作。可以用以下4个步骤实现这一模式：</p><p><br />创建并启动JMS Queue（为此，可以将以下一些操作嵌入SQL脚本内）： </p><p><br />execute dbms_aqadm.create_queue_table(queue_table =&gt; 'queue1', queue_payload_type =&gt; 'SYS.AQ$_JMS_TEXT_MESSAGE', comment =&gt; 'a test queue', multiple_consumers =&gt; false, compatible =&gt; '8.1.0'); execute dbms_aqadm.create_queue( queue_name =&gt; 'queue1', queue_table =&gt; 'queue1' ); execute dbms_aqadm.start_queue(queue_name =&gt; 'queue1'); </p><p><br />创建Java存储过程（代码摘录如下）： </p><p><br />public static void runTest(String msgBody) { try { // get database connection ora_drv = new OracleDriver(); db_conn = ora_drv.defaultConnection(); // setup sender (cf online code sample) .. // create message s_msg = s_session.createTextMessage(msgBody); // send message sender.send(s_msg); s_session.commit(); // receive message r_msg = (TextMessage) receiver.receive(); r_session.commit(); // output message text String body = r_msg.getText(); System.out.println("message was '"+body+"'"); ..} } </p><p><br />创建Call Spec： </p><p><br />create or replace procedure jmsproc (t1 IN VARCHAR) as language java name 'jmsSample.main (java.lang.String[])'; / </p><p><br />调用存储过程： </p><p><br />call jmsproc('hello'); <br />数据库辅助的Web发布（缓冲失效）</p><p>各应用程序结构必须面对的一个共同问题是如果可靠地将数据库信息进行缓存，以提高整个系统的性能。JCACHE是一种即将公布的标准规范（JSR 107），它可以解决这一问题。它说明了一种对Java对象临时在内存中进行缓存的方法，包括对象的创建、共享访问、假脱机（spooling）、失效、各JVM的一致性等。它可被用于缓存JSP内最经常读取的数据，如产品目录和价格列表。利用JCACHE，多数查询的反应时间会因为有缓存的数据而加快（内部测试表明反应时间大约快15倍）。 </p><p>为了跟踪原始数据的所有变化，并刷新已缓存的数据，Java存储过程会作为一个触发器被附加在一个表上。这个表的任何变化都会自动调用该存储过程，后者再调出一个已定义的JSP使JCACHE对象失效，该对象将其状态映射到该数据库表。在失效时，紧跟其后的查询将强制缓存器根据数据库的数据进行更新。 下面的步骤 <br />阅读关于Java存储过程的更多信息<br />本文摘自白皮书"释放Java存储过程的能量（Unleash the Power of Java Stored Procedures）"，可以在以下位置找到该白皮书：<br />otn.oracle.com/tech/java/java_db/pdf/<br />OW_30820_JAVA_STORED_PROC_paper.PDF </p><p>Oracle9i数据库第2版中的新PL/SQL特性<br />otn.oracle.com/tech/pl_sql/pdf/<br />Paper_30720_Doc.pdf </p><p>Resolver Spec<br />otn.oracle.com/docs/products/oracle9i/<br />doc_library/release2/java.920/a96659.pdf </p><p>OracleJVM and Java 2 Security<br />otn.oracle.com/docs/products/oracle9i/<br />doc_library/release2/java.920/a96656.pdf </p><p>下载代码<br />练习本文中的代码示例： <br />otn.oracle.com/sample_code/tech/<br />java/jsp/Oracle9iJSPSamples.html </p><p>了解作为Web服务的存储过程<br />otn.oracle.com/tech/webservices <br /> </p><p><br />扩展数据库的功能 </p><p>在数据库中直接运行Java代码的一个妙处就在于要实现新的功能，只需要简单地加载代码或库，并利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的进入点（公共静态方法）。Oracle9i数据库用户可以很容易地扩展数据库<br /><br />功能。Oracle自己利用这种能力来获得新的应用程序和工具包，如XML Developer Kits（XDKs）。 </p><p></p><p>沟通SQL、PL/SQL、Java、J2EE、.NET和XML </p><p>Oracle XDK是用Java编写的，并将其公共方法可用作Java存储过程，从而扩展了数据库的XML可编程能力。SQL、PL/SQL、Java、J2EE和非Java（.NET）商务逻辑都能够访问XML分析器、XSLT处理器、XPath引擎和XML SQL Utility（XSU）。 </p><p>XML分析器可以通过xmlparser和xmldom包进行访问。XSU是一种Java实用程序，它可以由SQL查询结果或JDBC ResultSet生成XML文档，并将XML文档中的数据写入数据库表或视图中。利用XSU，XML输出可以输出为文本、Dom树或DTS。通过dbms_xmlquery和dbms_xmlsave包，XSU即可用于PL/SQL。 </p><p>结论</p><p>Oracle数据库与Java VM的集成可以创建可移植、功能强大和与数据库无关的数据逻辑和持续性逻辑（persistence logic）。运行于中间层的商务逻辑和运行于数据库层的数据逻辑之间的分离提高了应用程序的可扩展性、灵活性和可维护性。</p><p></p><p></p><img src ="http://www.blogjava.net/faithwind/aggbug/63859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-08-16 11:55 <a href="http://www.blogjava.net/faithwind/archive/2006/08/16/63859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程</title><link>http://www.blogjava.net/faithwind/archive/2006/08/16/63858.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Wed, 16 Aug 2006 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/08/16/63858.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/63858.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/08/16/63858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/63858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/63858.html</trackback:ping><description><![CDATA[
		<p>什么是存储过程呢？</p>
		<p>定义：</p>
		<p>      将常用的或很复杂的工作，预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫<a href="http://www.knowsky.com/sql.asp">数据库</a>提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。</p>
		<p>讲到这里,可能有人要问：这么说存储过程就是一堆SQL语句而已啊？</p>
		<p>Microsoft公司为什么还要添加这个技术呢?</p>
		<p>那么存储过程与一般的SQL语句有什么区别呢?</p>
		<p>存储过程的优点：</p>
		<p>1.存储过程只在创造时进行编译，以后每次执行存储过程都不需再重新编译，而一般SQL语句每执行一次  就编译一次,所以使用存储过程可提高数据库执行速度。</p>
		<p>2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时），可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。</p>
		<p>3.存储过程可以重复使用,可减少数据库开发人员的工作量</p>
		<p>4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权</p>
		<p>存储过程的种类：</p>
		<p>     1.系统存储过程：以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,</p>
		<p>                               如 sp_help就是取得指定对象的相关信息<br />  2.扩展存储过程   以XP_开头,用来调用操作系统提供的功能</p>
		<p>                              exec master..xp_cmdshell 'ping 10.8.16.1'</p>
		<p>   3.用户自定义的存储过程,这是我们所指的存储过程</p>
		<p>   常用格式</p>
		<p>   Create procedure procedue_name</p>
		<p>   [@parameter data_type][output]</p>
		<p>   [with]{recompile|encryption}</p>
		<p>   as</p>
		<p>        sql_statement</p>
		<p>解释:  </p>
		<p>output：表示此参数是可传回的</p>
		<p>with {recompile|encryption}</p>
		<p>recompile:表示每次执行此存储过程时都重新编译一次</p>
		<p>encryption:所创建的存储过程的内容会被加密</p>
		<p>如:</p>
		<p>   表book的内容如下</p>
		<p>   编号    书名                           价格</p>
		<p>   001      C语言入门                   $30</p>
		<p>   002      PowerBuilder报表开发  $52</p>
		<p> 实例1:查询表Book的内容的存储过程</p>
		<p>   create proc query_book</p>
		<p>      as </p>
		<p>      select * from book</p>
		<p>   go</p>
		<p>   exec query_book</p>
		<p> 实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额</p>
		<p>   Create proc insert_book</p>
		<p>   @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output</p>
		<p>   with encryption  ---------加密</p>
		<p>   as</p>
		<p>   insert book(编号,书名，价格） Values(@param1,@param2,@param3)<br />   select @param4=sum(价格) from book<br />  go</p>
		<p>  执行例子: <br />  declare @total_price money <br />  exec insert_book '003','Delphi 控件开发指南',$100,@total_price<br />  print '总金额为'+convert(varchar,@total_price)<br />  go<br />存储过程的3种传回值:<br />   1.以Return传回整数<br />   2.以output格式传回参数<br />   3.Recordset<br />传回值的区别:<br />       output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中  </p>
		<p>实例3：设有两个表为Product,Order,其表内容如下：<br />      Product<br />           产品编号       产品名称    客户订数     <br />            001             钢笔         30         <br />            002             毛笔         50         <br />            003             铅笔         100        <br />      Order  <br />           产品编号         客户名     客户订金<br />            001              南山区      $30<br />            002              罗湖区      $50<br />            003              宝安区      $4<br />请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,<br />总金额=订金*订数,临时表放在存储过程中</p>
		<p>代码如下:<br />     Create proc temp_sale<br />     as<br />       select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额<br />       into #temptable from Product a inner join Order b on a.产品编号=b.产品编号<br />    if  @@error=0 <br />       print 'Good'<br />    else<br />       print 'Fail'<br />     go</p>
<img src ="http://www.blogjava.net/faithwind/aggbug/63858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-08-16 11:53 <a href="http://www.blogjava.net/faithwind/archive/2006/08/16/63858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件操作代码</title><link>http://www.blogjava.net/faithwind/archive/2006/07/27/60313.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 27 Jul 2006 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/27/60313.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/60313.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/27/60313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/60313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/60313.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1												/**/										/*																										  2														 * Made In GamVan.com						  3														 * Created on 2005年3月18日, 下午8:37						  4									...&nbsp;&nbsp;<a href='http://www.blogjava.net/faithwind/archive/2006/07/27/60313.html'>阅读全文</a><img src ="http://www.blogjava.net/faithwind/aggbug/60313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-27 13:03 <a href="http://www.blogjava.net/faithwind/archive/2006/07/27/60313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java文件操作</title><link>http://www.blogjava.net/faithwind/archive/2006/07/27/60311.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 27 Jul 2006 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/27/60311.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/60311.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/27/60311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/60311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/60311.html</trackback:ping><description><![CDATA[文件的建立/检查与删除 
<p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件的建立、检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />//out.println(path); <br />File f=new File(path,"File.txt"); <br />//out.println(f); <br />//out.println(f.exists()); <br /><br />if(f.exists()){//检查File.txt是否存在 <br />f.delete();//删除File.txt文件 <br />out.println(path + "\\File.txt 存在，已删除。"); <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为File.txt的文件 <br />out.println(path + "\\File.txt 不存在，已建立。");//输出目前所在的目录路径 <br />} <br />%&gt; </p><h4>　　目录的建立/检查与删除 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;目录的建立/检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />path=path + "\\Sub";//将要建立的目录路径 <br />File d=new File(path);//建立代表Sub目录的File对象，并得到它的一个引用 <br />if(d.exists()){//检查Sub目录是否存在 <br />d.delete(); <br />out.println("Sub目录存在，已删除"); <br />}else{ <br />d.mkdir();//建立Sub目录 <br />out.println("Sub目录不存在，已建立"); <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　如何在JSP中处理虚拟目录 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;JSP中如何处理虚拟目录&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />取得虚拟目录对应的磁盘路径&lt;br&gt; <br />Web站点主目录的位置为&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("/")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在的目录位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("./")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在目录上一层目录的位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("../")%&gt;&lt;/font&gt;&lt;br&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />文件属性的取得 </p><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.util.Date,java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件属性的取得&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File f=new File(path,"ReadData.txt"); <br />if(f.exists()){ <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文件 <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　取出目录中文件的方法 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;取出目录中文件的方法--列出目录中的文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File d=new File(path);//建立当前目录中文件的File对象 <br />File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组 <br />out.println("&lt;font color=#ff0000&gt;" + path + "目录下的文件：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isFile()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />out.println("&lt;br&gt;&lt;font color=#ff0000&gt;" + path + "目录下的目录：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isDirectory()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />判断是否为空白文件 </p><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;判断是否为空白文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />out.println(path); <br />FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象，并实例化为fr <br />//对FileReader类生成的对象使用read()方法，可以从字符流中读取下一个字符。 <br />if(fr.read()==-1)//判断是否已读到文件的结尾 <br />{ <br />out.print("AtEnd.txt文件中没有数据&lt;br&gt;"); <br />}else{ <br />out.println("AtEnd.txt文件中有数据"); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />    &lt;B&gt;读取所有的文件数据&lt;/B&gt; <br />&lt;ccid_nobr&gt; <br />&lt;table width="400" border="1" cellspacing="0" cellpadding="2" <br />bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"&gt; <br />&lt;tr&gt; <br />&lt;td bgcolor="e6e6e6" class="code" style="font-size:9pt"&gt; <br />&lt;pre&gt;&lt;ccid_code&gt; &lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*,java.lang.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;读取所有的文件数据&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + "\\ReadData.txt"); <br />//关键在于读取过程中，要判断所读取的字符是否已经到了文件的末尾， <br />并且这个字符是不是文件中的断行符，即判断该字符值是否为13。 <br />int c=fr.read();//从文件中读取一个字符 <br />//判断是否已读到文件结尾 <br />while(c!=-1){ <br />out.print((char)c);//输出读到的数据 <br />c=fr.read();//从文件中继续读取数据 <br />if(c==13){//判断是否为断行字符 <br />out.print("&lt;br&gt;");//输出分行标签 <br />fr.skip(1);//略过一个字符 <br />//c=fr.read();//读取一个字符 <br />} <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　一行一行读取数据 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("");//取得当前目录的路径 <br />FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象，并实例化为fr <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine();//从文件读取一行字符串 <br />//判断读取到的字符串是否不为空 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;");//输出从文件中读取的数据 <br />Line=br.readLine();//从文件中继续读取一行数据 <br />} <br />br.close();//关闭BufferedReader对象 <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />略过文件中的字符不读取 </p><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;略过字节不读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + "\\ReadData.txt"); <br />fr.skip(2);//跳过2个字节 <br />int c=fr.read();//读取一个字节 <br />while(c!=-1){ <br />out.print((char)c); <br />c=fr.read(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　将数据写入文件 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将数据写入文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象，并实例化fw <br />//将字符串写入文件 <br />fw.write("大家好！"); <br />fw.write("本书是《JSP编程技巧》"); <br />fw.write("请多多指教！"); <br />fw.write("email:stride@sina.com"); <br />fw.close(); <br /><br />FileReader fr=new FileReader(path + "\\WriteData.txt"); <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine(); <br />//读取一行数据 <br />out.println(Line + "&lt;br&gt;"); <br />br.close();//关闭BufferedReader对象 <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　将写入文件的数据分行 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + "\\WriteData.txt"); <br />BufferedWriter bw=new BufferedWriter(fw); <br />bw.write("大家好！"); <br />bw.write("本书是《JSP编程技巧》。"); <br />bw.newLine();//断行 <br />bw.write("请多多指教！"); <br />bw.newLine();//断行 <br />bw.write("email: stride@sina.com"); <br />bw.flush();//将数据更新至文件 <br />fw.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + "\\WriteData.txt"); <br />BufferedReader br=new BufferedReader(fr); <br />String Line=br.readLine();//读取一行数据 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p><h4>　　如何将数据追加写入到文件 </h4><p class="code">&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw"); <br />//定义一个类RandomAccessFile的对象，并实例化 <br />rf.seek(rf.length());//将指针移动到文件末尾 <br />rf.writeBytes("\nAppend a line to the file!"); <br />rf.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + "\\WriteData.txt"); <br />BufferedReader br=new BufferedReader(fr);//读取文件的BufferedRead对象 <br />String Line=br.readLine(); <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;</p><img src ="http://www.blogjava.net/faithwind/aggbug/60311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-27 13:00 <a href="http://www.blogjava.net/faithwind/archive/2006/07/27/60311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获取虚拟目录</title><link>http://www.blogjava.net/faithwind/archive/2006/07/27/60309.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 27 Jul 2006 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/27/60309.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/60309.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/27/60309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/60309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/60309.html</trackback:ping><description><![CDATA[取得虚拟目录对应的磁盘路径：<br /><br />Web站点主目录的位置为&lt;%=request.getRealPath("/")%<br />JSP网页所在的目录位置&lt;%=request.getRealPath("./")%&gt;<br />JSP网页所在目录上一层目录的位置&lt;%=request.getRealPath("../")%&gt;<img src ="http://www.blogjava.net/faithwind/aggbug/60309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-27 12:58 <a href="http://www.blogjava.net/faithwind/archive/2006/07/27/60309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学者如何开发出一个高质量的J2EE系统</title><link>http://www.blogjava.net/faithwind/archive/2006/07/20/59244.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 20 Jul 2006 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/20/59244.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/59244.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/20/59244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/59244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/59244.html</trackback:ping><description><![CDATA[（Bloger注）自我感觉一个初学者，在经历了一段时间的编程实践以后，应该花时间整体了解一下我们开发中所用到的技术和相关领域的发展情况。开阔视野是进步的一个必不可少的功课。<br /><br />J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。
<p>　　首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。</p><p>　　J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。</p><p>　　J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从<a href="http://www.jdon.com/designpatterns/index.htm" target="_blank">设计模式</a>开始学习。</p><p>　　J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。</p><p>　　这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。</p><p>　　Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。</p><p>　　谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。</p><p>　　JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。</p><p>　　EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。</p><p>　　至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术：EJB和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个JavaBeans是你为这个应用程序单独开发创建的。</p><p>　　J2EE应用系统开发工具有很多：如JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。</p><p>　　J2EE容器分为WEB容器和EJB容器，Tomcat/Resin是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品Websphere/Weblogic等和JBoss属于同一种性质。</p><p>　　J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。</p><p>　　如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。</p><p>　　衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。</p><p>　　为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。</p><p>　　因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；</p><p>　　EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。</p><p>　　由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、<a href="http://www.jdon.com/jdonframework/index.htm" target="_blank">JdonFramework</a>)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。　但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。</p><p>　　这两种架构分歧也曾经诞生一个新名词：完全POJO的系统也称为轻量级系统(lightweight)，其实这个名词本身就没有一个严格定义，更多是一个吸引人的招牌，轻量是指容易学习容易使用吗？按照这个定义，其实轻量Spring等系统并不容易学习；而且EJB 3.0（依然叫EJB）以后的系统是否可称为轻量级了呢？</p><p>　　前面谈了服务层框架，使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库，Struts是应用比较广泛的一种表现层框架。</p><p>　　这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。</p><p>　　持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。</p><p>　　在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。</p><p>　　最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。</p><p>　　还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。</p><p>　　当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。</p><p>　　以上理念可以总结为一句话：<br />J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。</p><p>　　推荐一套高质量的J2EE开源系统： <a href="http://www.jdon.com/jdonframework/app.htm">JPestore</a><br />　　<br />　　如果初学者没有理解，欢迎<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=21031" target="_blank">继续讨论</a>，大胆提出你心中的疑问。</p><img src ="http://www.blogjava.net/faithwind/aggbug/59244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-20 17:23 <a href="http://www.blogjava.net/faithwind/archive/2006/07/20/59244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10</title><link>http://www.blogjava.net/faithwind/archive/2006/07/20/59219.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 20 Jul 2006 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/20/59219.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/59219.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/20/59219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/59219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/59219.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。 Jason Brittain 　　1． 配置系统管理（Admin Web Application）　　大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面...&nbsp;&nbsp;<a href='http://www.blogjava.net/faithwind/archive/2006/07/20/59219.html'>阅读全文</a><img src ="http://www.blogjava.net/faithwind/aggbug/59219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-20 16:09 <a href="http://www.blogjava.net/faithwind/archive/2006/07/20/59219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP连接Mysql数据库攻略</title><link>http://www.blogjava.net/faithwind/archive/2006/07/20/59187.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 20 Jul 2006 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/20/59187.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/59187.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/20/59187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/59187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/59187.html</trackback:ping><description><![CDATA[
		<p>连续几天安装配置和连接Mysql数据库，今天终于成功了，回想这几天，<br />真的是甜酸苦辣都有，单mysql就重装了不下10次，而在eclipse上编写的连接数据库的程序总是报错．我都已经down了oracal准备放弃mysql了，不过．．．<br />就象电视剧演的那样，转机总是在这个时候出现，先是看到了saulzy关于mysql4.1.11版本的安装介绍，接着又找到了一款不错的mysql 界面插件，<br />最后在网友的帮助下把mysql的JDBC驱动配好并连通了．一连5天，日子真不好过阿，不过这个过程中，<br />我也觉得自己学到不少东西，呵呵，反正都撑过来了，就要继续往前走．现在，就这几天弄的总结一下，希望对同是正在学习JAVA技术的同道中人能有帮助．</p>
		<p>我曾写过一篇叫&lt;&lt;配置Eclpise+tomcat并实现JSP的编写与部署&gt;&gt;，现在写的这些算是它的后续．</p>
		<p>一．    软件下载<br />Mysql<br />下载版本：4.1.11<br /><a href="http://dev.mysql.com/downloads/mysql/4.1.html">http://dev.mysql.com/downloads/mysql/4.1.html</a></p>
		<p>JDBC驱动<br />下载版本：3.1.8<br /><a href="http://dev.mysql.com/downloads/connector/j/3.1.html">http://dev.mysql.com/downloads/connector/j/3.1.html</a></p>
		<p>Mysql界面插件:mysql-front<br />下载版本镜像：HongKong（我下回来安装就是中文版了）<br /><a href="http://www.mysqlfront.de/download.html">http://www.mysqlfront.de/download.html</a></p>
		<p>二．    软件安装<br />1.安装mysql<br />    就如我上面所说的，我是参考了saulzy的文章，现在给出saulzy这篇文章的连接：<br /><a href="http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx">http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx</a><br />里面图文并茂，说得非常清楚<br />（在这里再一次感谢saulzy）</p>
		<p>2.JDBC驱动：mysql-connector-java-3.1.8<br />这只是一个压缩包，并不需要安装，只要将其解压，我么使用的是文件夹mysql-connector-java-3.1.8里的文件：mysql-connector-java-3.1.8-bin.jar．</p>
		<p>3. Mysql界面插件:mysql-front<br />这是一个安装程序，按照提示安装就可以了．</p>
		<p>三．    环境配置<br />　首先，我要说明的是我现在<br />tomcat的安装路径是: D:\Program Files\Java\Tomcat<br />  JDK的安装路径是：D:\Program Files\Java\j2sdk</p>
		<p>在这里，需要配置环境变量的是JDBC驱动．在配置前先要把刚才说到的mysql-connector-java-3.1.8-bin.jar本地硬盘某处（我放的地方：D:\Program Files\Java\mysqlforjdbc），然后根据你放的地方，配置classpath，我的配置是这样的：<br />.;D:\Program files\Java\j2sdk\lib\tools.jar;D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar<br />配置这个的目的是让你的java应用程序找到连接mysql的驱动．</p>
		<p>配置完环境变量后还有很重要一步就是为JSP连接数据库配置驱动，这个其实很简单，就是把mysql-connector-java-3.1.8-bin.jar拷到某些文件夹里就行了，我在网上看了很多资料问了很多人，各种说法都有，我综合了一下，为了保险，我都全做了，呵呵，反正就是拷一个400K的文件而已，现列出要把mysql-connector-java-3.1.8-bin.jar拷进去的文件夹，如下：<br />D:\Program Files\Java\Tomcat\common\lib<br />D:\Program Files\Java\Tomcat\shared\lib</p>
		<p>四．    数据库的使用</p>
		<p>Mysql安装完毕以后，还有一些要注意的地方，这里saulzy也写了篇文章，大家看看就清楚了，连接如下：<a href="http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx">http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx</a><br />就象在saulzy的文章力提到的，mysql安装好后最重要一样就是要看数据库有没有作为系统服务启动了，所以在大家进行数据库操作前，应要看看，在操作系统的<br />开始－＞运行－＞输入services.msc，确定你在安装时你设置的关于mysql的那个服务已经启动，这样你在操作数据库时不会报连接不上的错误．<br />上面提到了一个较方便的mysql界面插件，但是这个界面是我在已经开始使用mysql后才找到的，刚开始我是在dos下用命令行进行操作的．虽然那个界面也可以进行建库啊，设定权限等操作，但是，我觉得懂得在使用命令行也是一个很重要的技能，所以我先从命令行开始说，怎样简单使用mysql．到后面会谈及mysql－front的使用．</p>
		<p>现在我想在mysql里建一个数据库shujuku，以及在数据库里建一个表biao．具体的命令如下（假设mysql我是刚安装好的）</p>
		<p> </p>
		<p> </p>
		<p>
				<br />1.    进入dos状态（记住命令行的要运行在mysql的安装目录下的bin目录的）如下图一：<br /> <br />2.    连接mysql<br />输入：mysql ?h localhost ?u root ?p<br />出现要求输入密码的界面（如图二）<br /> </p>
		<p> </p>
		<p>
				<br />输入在安装时已设好的密码，就近入了mysql的命令编辑界面了，如图三：<br /> <br />3.    使用mysql的基本命令(在mysql命令行编辑每输入完命令后最后一定要有分号，不然会报错)<br />显示数据库：show databases;<br />使用数据库：use 数据库名；<br />例子如图四：<br /> </p>
		<p>
				<br />4．建库<br />命令：create database shujuku;<br />5.为数据库设置权限（用户和密码）<br />命令：grant all privileges on shujuku.* to <a href="mailto:test@localhost">test@localhost</a> identified by  “123456”;<br />当你执行完这个命令以后，只要你再以用户名：test,密码：123456登录时你就只可以对shujuku这个数据库操作，这样避开使用root，对数据库的安全有很大帮助．如图五<br /> </p>
		<p>6.建表<br />命令：create table biao(id int(8) primary key,name varchar(10));<br />如图六 </p>
		<p>剩下来的与标准sqsl命令基本上是一样的，具体操作略<br />值得一提的是，你在命令行上输入＂？＂，就会有mysql命令的简单帮助，如图八：<br /> </p>
		<p>呵呵，那样，我们还可以知道退出，就是＂exit＂，呵呵！</p>
		<p>五．    关于mysql-front的使用<br />我找了好几个mysql的界面工具，觉得最简洁方便还是mysql-front，可惜的是要收费，不过还好有试用期，呵呵，可以先感受感受一下，最重要一点是mysql-front有简体中文版的，英文不好的我用起来就舒服多了．下面简单说说使用吧．<br />首先，安装就不用说了，有向导，而且很简单．安装好后第一次运行时会跳出来一个要求添加对话的框，在这里你可以添加例如上面已经设定好的shujuku，过程如图九，十，十一:<br /> </p>
		<p> </p>
		<p> </p>
		<p>当你在注册的复选框里填上你在上面mysql设定好的用户名和密码后，在选择数据库框里就有shujuku 的数据库了，选上，按确定．进入mysql-fron后，你就会看到下面的界面，这是你就可以进行操作了．如图十二<br /> <br /> <br />要说明的是，你还可以把root用户也加进去，这要你在mysql-fron的界面上选<br />设置－＞对话－＞新建，再按上面进行就可以，出了root你还可以加入更多的用户，方法还是一样的，设置不同的用户，是方便对不同数据库进行管理，呵呵，root是权限最高的，可不要随便让别人使用你的root用户，保正你数据库的安全．</p>
		<p>六．    JSP连接mysql<br />现在就是尝试用jsp连接mysql了<br />我在eclipse里建了个test_mysql.jsp页面，代码如下：</p>
		<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page language="java" %&gt;<br />&lt;%@ page import="com.mysql.jdbc.Driver" %&gt;<br />&lt;%@ page import="java.sql.*" %&gt;<br />&lt;%<br />  //驱动程序名<br />  String driverName="com.mysql.jdbc.Driver";<br />  //数据库用户名<br />  String userName="cl41";<br />  //密码<br />  String userPasswd="123456";<br />  //数据库名<br />  String dbName="db";<br />  //表名<br />  String tableName="dbtest";<br />  //联结字符串<br />  String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&amp;password="+userPasswd;<br />  Class.forName("com.mysql.jdbc.Driver").newInstance();<br />  Connection connection=DriverManager.getConnection(url);<br />  Statement statement = connection.createStatement();<br />  String sql="SELECT * FROM "+tableName;<br />  ResultSet rs = statement.executeQuery(sql); <br />  //获得数据结果集合<br />   ResultSetMetaData rmeta = rs.getMetaData();<br />  //确定数据集的列数，亦字段数<br />   int numColumns=rmeta.getColumnCount();<br />  // 输出每一个数据值<br /> out.print("id"); <br /> out.print("|");<br /> out.print("num");<br /> out.print("&lt;br&gt;");<br />while(rs.next()) {<br />out.print(rs.getString(1)+" ");   <br />out.print("|");<br />out.print(rs.getString(2));<br />out.print("&lt;br&gt;");  <br />}   <br />out.print("&lt;br&gt;");<br />out.print("数据库操作成功，恭喜你"); <br />rs.close();   <br />statement.close();   <br />connection.close();   <br />%&gt;   </p>
		<p>然后把test¬_mysql.jsp部署到tomcat处，如何部署可参考我的另一篇文章&lt;&lt;配置Eclpise+tomcat并实现JSP的编写与部署&gt;&gt;</p>
		<p>在浏览器，你就可以看到如图十三的：<br /> </p>
		<p>呵呵，文章终于写完了，原来写篇简洁清晰，图文并茂的文章真的不容易．还是那句话，希望对度这篇文章的你有帮助吧！Good luck!<br />由于这里不能贴图片，我把我文章里面的图片都打包了，在附件处！<br />（如有转载，请注明原作者是cl41,谢谢合作！） <br /></p>
		<p> </p>
<img src ="http://www.blogjava.net/faithwind/aggbug/59187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-20 14:55 <a href="http://www.blogjava.net/faithwind/archive/2006/07/20/59187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL初学者使用指南</title><link>http://www.blogjava.net/faithwind/archive/2006/07/20/59176.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 20 Jul 2006 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/20/59176.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/59176.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/20/59176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/59176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/59176.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有很多朋友虽然安装好了				mysql				但却不知如何使用它。在这篇文章中我们就从连接				mysql				、																																		修改密码、增加用户等方面来学习一些				mysql				的常用命令。																												...&nbsp;&nbsp;<a href='http://www.blogjava.net/faithwind/archive/2006/07/20/59176.html'>阅读全文</a><img src ="http://www.blogjava.net/faithwind/aggbug/59176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-20 14:02 <a href="http://www.blogjava.net/faithwind/archive/2006/07/20/59176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smalltalk概述</title><link>http://www.blogjava.net/faithwind/archive/2006/07/06/56972.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 06 Jul 2006 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/06/56972.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/56972.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/06/56972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/56972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/56972.html</trackback:ping><description><![CDATA[完全oop的语言（ruby,smalltalk,...）中,smalltalk暂时是最优雅的了，看了它之后，才明白C#/vb/java的语法确实不能带来太多的效率。看看java和smalltalk的语言对比，就知道java可能采用了smalltalk的思想+c的外观了：<br /><a href="http://www.chimu.com/publications/JavaSmalltalkSyntax.html" target="_blank"><font color="#333333">http://www.chimu.com/publications/J...talkSyntax.html</font></a><br />它很small,而且像talk一样接近人的语言。<br /><br /><br /><br />---------------------以下是转载：<br />smalltalk<br />可是面向对象的程序设计语言的鼻祖阿，并且正在蓬勃的发展，没有过时。它是纯面向对象的语言，就连整数也是对象。开放环境也非常集成，如果感兴趣可以到一下网站下载，绝对有耳目一新的感觉。举个例子， <br /><br />循环语句在smalltalk中是向一个整数对象发送消息： <br /><br />10 timesRepeat: [ teresa moveRight: 10 ]. <br /><br />其中timesRepeat:为消息名称，10为接受消息的整数对象， <br />[ teresa moveRight: 10 ].是消息的参数， <br /><br /><br />这又是smalltalk强大的地方，它可以把一段程序作为参数传递给某个对象！！！ <br />Squeak Smalltalk <br /><a href="http://www.squeak.org/" target="_blank"><font color="#333333">http://www.squeak.org/</font></a> 这是一个非常有趣的smalltalk版本，看上去就像在你的电脑上模拟了另外一套完成的窗口系统，这里面的窗口更加利害，你甚至可以旋转它，不看不知道，看了才发现还有这么奇妙的语言，这么奇妙的开发环境。10M左右 <br /><br />Cincom Smalltalk <br /><a href="http://www.cincom.com/scripts/smalltalk.dll/home.ssp" target="_blank"><font color="#000000">http://www.cincom.com/scripts/smalltalk.dll/home.ssp</font></a> 这个版本比较实用，有详细的帮助，可以开发真正的windows程序。30M左右 <br /><br />Dolphin Smalltalk <br /><a href="http://www.object-arts.com/" target="_blank"><font color="#000000">http://www.object-arts.com/</font></a> 这里提供的免费smalltalk版本只有3M不到，如果你想先尝试一下这种语言的话，可以下载这个。<br /><br />这是一个支持unicode的smalltalk版本：<br /><a href="http://www.objectconnect.com/" target="_blank"><font color="#000000">http://www.objectconnect.com/</font></a><br />可以下载 限时版<img src ="http://www.blogjava.net/faithwind/aggbug/56972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-06 16:28 <a href="http://www.blogjava.net/faithwind/archive/2006/07/06/56972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA资源(感谢提供资料的朋友)</title><link>http://www.blogjava.net/faithwind/archive/2006/07/06/56904.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 06 Jul 2006 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/07/06/56904.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/56904.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/07/06/56904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/56904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/56904.html</trackback:ping><description><![CDATA[*********************JAVA资源收藏***********************<br /><br />A.书名：《Thinking in Java》2e中文版 侯捷 / 王建兴 合译<br />URL: http://jjhou.csdn.net/thinking-in-java-20010919.pdf<br />B.书名：JBuilder5中文帮助文件<br />URL: http://www.code-labs.com/manual/Jb5cn_help1.rar<br />http://www.code-labs.com/manual/Jb5cn_help2.rar<br />C.书名：Think in Java(中文版)---chm格式<br />URL: http://www.code-labs.com/manual/Think%20In%20Java.chm<br />D.书名：Jbuilder开发人员指南(完整版）<br />URL: http://www.java-cn.net/book/books-zip/JbuilderGuide.zip<br />E.书名：Java2编程详解(Special_Edition_Using_Java）<br />URL: http://www.java-cn.net/book/books-zip/Java2Xiangjie.zip<br />F.书名：Java2 轻松进阶<br />URL: http://www.java-cn.net/book/books-zip/java11.zip<br />G.书名： JavaBeans开发使用手册<br />URL: http://www.java-cn.net/book/books-zip/JavaBeansDevelop.zip<br />H.书名：Java1.3API手册<br />URL: http://www.java-cn.net/book/books-zip/api.zip<br /><br />java 教程与实例<br />http://download.pchome.net/php/download2.php?sid=10837&amp;url=/development/reference/Javateach0307.zip&amp;svr=3<br /><br />I.书名：SCJP认证笔记<br />URL: http://vanstone.myetang.com/scjp/scjpnotes.rar<br />J.书名：Sun培训教材中文稿<br />URL: http://vanstone.myetang.com/scjp/javabook/sl275cn.pdf<br />K.书名：SCJP认证Bible<br />URL: http://vanstone.myetang.com/scjp/scjpbible.rar<br />L.书名：java开发规范（html）<br />URL: http://www.cn-java.com/target/download.php?id=790&amp;downurl=../download/book/javaformat.zip<br />M.书名：EJB2.0 Entity bean(PDF)<br />URL: http://www.cn-java.com/target/download.php?id=708&amp;downurl=../download/book/EJB2.0.zip<br />N.书名：J2ME用户使用手册(PDF)<br />URL: http://www.cn-java.com/target/download.php?id=667&amp;downurl=../download/book/UserGuide.pdf<br />O.书名：JavaServerPages基础<br />URL: http://www.java-cn.net/book/books-zip/JSPIntro.zip<br />P.书名：RMI Enhancements<br />URL: http://www.cn-java.com/target/download.php?id=297&amp;downurl=/download/tools/rmispecjdk12.zip<br />Q.书名：无废话XML<br />URL: http://www.cn-java.com/target/download.php?id=222&amp;downurl=../download/tools/wfhxml_gb.zip<br /><br />R.书名:Design Pattens<br />注释：号称软件工程师的床头必备书籍，非常经典，对面向对象思想在实践应用中的模式做了经典性的总结<br />URL: http://automation.seu.edu.cn/auto/content/Design.zip<br /><br />S.书名:设计模式 可复用面向对象软件的基础<br />注释：南京大学翻译的Design Patterns的中译本，机械工业出版社出版，翻译质量较好<br />URL: http://automation.seu.edu.cn/auto/content/DesignCh.zip<br /><br />T.书名:Thinking in Java with Patten<br />注释：与Thinking in Java为同一作者所著，设计模式与Java的结合<br />URL: http://automation.seu.edu.cn/auto/content/TIPatterns[Thinking%20in%20Pattern%20with%20java].zi<br />p<br /><br />U.书名:The Design Pattens Java Companion<br />注释：另一本Design patten 与Java相结合的书 James w.Cooper著<br />URL: http://automation.seu.edu.cn/auto/content/DesignJava.zip<br /><br />V.书名:Java 2 平台安全技术－结构，API设计和实现<br />注释：来自china pub，PDF文档,中译本<br />URL: http://automation.seu.edu.cn/auto/content/Java2Safe.zip<br /><br />W.书名:Mastering Enterprise JavaBeans<br />注释：Ed Roman著，EJB的优秀书籍<br />URL: http://automation.seu.edu.cn/auto/content/EJB-book.zip<br /><br />X.书名:Pure JSP<br />注释：James Goodwill著 Sams, Macmillan Computer Publishing 2000.6.8出版<br />URL: http://automation.seu.edu.cn/auto/content/Pure%20jsp.zip<br /><br />Y.书名:Sun Tutorial 2001.5<br />注释：Sun公司的经典教程，入门必读<br />URL: http://automation.seu.edu.cn/auto/content/tutorial_2001.zip<br /><br />Z.书名:JDK1.3.1 document Winhelp 格式<br />注释：Winhelp格式的JDK文档，更易阅读和查找，很棒<br />URL: http://automation.seu.edu.cn/auto/content/jdk13doc_help.zip<br /><br /><br />1A.书名:The Java Virtual Machine Specification Second Edition<br />注释：Java 虚拟机规范，有助于理解Java的实现原理，Sun出版<br />URL:http://automation.seu.edu.cn/auto/content/vmspec.2nded.html.zip<br /><br />1B.书名:The Java Language Sepcification Second Edition<br />注释：Java 语言规范，Java编程语言的详细说明，Sun出版<br />URL: http://automation.seu.edu.cn/auto/content/langspec-2.0.zip<br /><br />1C.书名:Java programmer's FAQ<br />注释：Sun公司的FAQ，内容丰富，覆盖面广<br />URL: http://automation.seu.edu.cn/auto/content/faq.zip<br /><br />1D.书名:Cocoon 2 简介<br />注释：Cocoon 是一种 Java 服务器框架，它允许使用 XSLT转换动态发布 XML 内容。通过依靠 XML 描述内容，使用 XSLT 将内容转换成多种格式，Cocoon 提供了用于构建内容、<br />逻辑和表示在很大程度上彼此分离的应用程序的平台。 本教程将介绍 Cocoon 2，一个比原始 Cocoon 应用程序更有效和更可伸缩的平台。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/xml/x-cocoon/tutorial/x-cocoon.zip<br /><br />1E.书名:java事件传递技术<br />注释：Java 2 平台使程序员可以从事件的角度来思考系统，而不从是传统的调用-返回（call-return）体系结构风格的角度。在该平台本身内部，就有对多种事件通知模式的直接支持。思考事件的一种方<br />式是通过事件的粒度和所有权。一些事件模式适合在对象实例状态变化的粒度上表示事件。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-delivery/tutorial/j-delivery.zip<br /><br />1F.书名:使用 JDBC 构建基于 Web 的应用程序<br />注释：如果您对构建使用 JDBC 访问数据库的 Web 应用程序的各种方法感兴趣，那么本教程适合于您。在这一实践指南中，您将通过使用三项独立的技术来学习这一过程的基础知识，这三项技术是：servle<br />t 方法、JavaServer Pages（JSP）页面方法以及 JSP、JavaBeans 与 servlet 相结合的方法（也称为 Model Two）。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcweb/tutorial/j-jdbcweb.zip<br /><br />1G.书名:Java 3D 探奇<br />注释：本教程是为没有任何 3D 编程经验的 Java 程序员而编写的。我们将从一些基本的 3D 概念入手，探索如何构建一副场景图 — 用于描述我们想要渲染的场景的基本对象。然后，我们将接触 Java<br />3D 的一些更强大的功能。我们的重点将放在使用一些 Java 3D 实用类来开始您的编程。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-java3d/tutorial/j-java3d.zip<br />1Q.书名:Java 调试<br />注释：即使是最高级的开发人员所开发的最简单的应用程序也可能包含错误。如果要成为好的调试人员，不必象大侦探那样调查蛛丝马迹。您只需了解概念并熟悉正确的工具。在本教程中，我们提供了关于基本 Java 调<br />试概念和更高级调试类型的详细信息。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-debug/j-debug.zip<br /><br />1R.书名:构建定制的树型视图<br />注释：在这篇免费的 dW 专有的独家教程中，讲述了关于 Swing 树型视图的概念、它们所显示的内容、如何设置它们以及如何定制它们。它还讲述了使用线程来执行长时间运行任务的概念，这样用户界面就可以保<br />持迅速反应。研究 Java Swing 树的相关类，演示了如何定制基本数据模型和树节点的绘制。为说明这些概念，我们将生成一个增强型 JTree，JMagnitudeTree。这个增强型 JTree 可<br />以显示树节点的相对数量，以及标准节点名称和整个树型结构。例如，如果树显示的是文件目录结构，那么它可以指出所有文件和目录的相对大小。本教程并不试图充当编程参考，因此合适的 Swing 参考资料或在线文档<br />也许会有帮助。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-magnitudetree/MagnitudeTree.zip<br /><br />1S.书名:构建 Java 聊天服务器<br />注释：在这篇免费的 dW 专有的独家教程中，我们将构建一个简单聊天系统的服务器和客户机方。您将在这个过程中学到创建这样一个服务器时可以用到的基本框架，该框架使用在很多情况下都能很好工作的传统技术。我<br />们还将讨论框架的一些限制，并找到克服这些限制的方法。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-chat/tutorial/j-chat.zip<br /><br />1T.书名:构建带会话跟踪的 Servlet<br />注释：本教程讲授使用 Servlet 和 JSP 技术构建因特网应用的技巧。其关键是启用会话处理，那么 Servlet 就可以知道哪个用户在干什么。本教程显示了一个 URL 书签系统，在这个系统中，<br />多个用户访问一个系统以添加、除去和更新 HTML 书签列表。Servlet 使用 JSP 技术来处理用户交互。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-servlets2/tutorial/j-servlets2.zip<br /><br /><br />1H.书名:使用 JDBC 的高级数据库操作<br />注释：本教程旨在向您介绍几种高级数据库操作，包括存储过程和高级数据类型，它们可以通过使用 JDBC 的 Java 应用程序执行。教程中的示例代码是为 DB2 通用数据库 7.2 编写的，但因为使用了<br />DataSource 对象，修改这些代码以适用于其它数据库是不成问题的。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcadv/tutorial/j-jdbcadv.zip<br /><br />1I.书名:用 JDBC 管理数据库连接<br />注释：本教程介绍了使用“Java 数据库连接”（Java Database Connection（JDBC））从 Java 应用程序内部建立和管理数据库连接所涉及的不同概念。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbc/tutorial/j-jdbc.zip<br />1J.书名:Java 集合框架<br />注释：本教程将带您漫游 “Java 集合框架”（Java Collection Framework）。为了尽快开始学习“集合框架”，教程从一些面向初学者和专家等读者的简单编程示例入手。接着，教程继续<br />讨论集（set）和映射（map），它们的属性以及它们数学上的定义与“集合框架”中的 Set、 Map 和 Collection 定义有何不同。“Java 集合框架”的历史那一节澄清了集和映射相关类的一<br />些混淆。本教程彻底介绍了“集合框架”中所有的接口和实现这些接口的类。本教程不仅谈到了用线程安全和只读方式处理集合，还探讨了集合的算法支持。此外，教程还讨论了在 JDK 1.1 中使用“集合框架”的一个<br />子集。最后，教程以先于“Java 集合框架”的 ObjectSpace 中一种广泛使用的算法和数据结构库 JGL 的介绍作为结束。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-collections/tutorial/j-collections.z<br />ip<br /><br />1K.书名:Java 套接字（socket）101<br />注释：本教程将告诉您什么是套接字（socket）并教您如何在 Java 程序中使用它。通过实际分析几个示例，从单个客户机／服务器通讯到池中的一组客户机访问服务器，您将学到如何用套接字处理现实世界中碰<br />到的典型情形。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-sockets/tutorial/j-sockets.zip<br /><br />1L.书名:Java Message Service 基础教程<br />注释：本教程向您介绍了 Java 消息服务（Java Message Service，JMS）概述，并提供了使用它开发程序的基本知识。Sun Microsystems 开发 JMS 是为 Java<br />程序访问企业消息传递系统、也称面向消息的中间件（MOM）提供一种途径。通过中介这种间接方式来支持应用程序间数据的异步传递，MOM 提供了一种以松散组织的、灵活的风格来集成应用程序的机制。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jms/tutorial/j-jms.zip<br /><br />1M.书名:JavaMail API 基础教程<br />注释：想将邮件工具结合到您独立于平台的 Java 解决方案中吗？再没有比 JavaMail API 更合适的了，它提供了个独立于协议的模块，能用于 IMAP、POP、SMTP、MIME 和其它涉及因<br />特网的消息传递协议。现在，有了 JavaBeans Activation Framework (JAF）的支持，您的应用程序经由 JavaMail API 就能启用邮件功能啦。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-javamail/tutorial/j-javamail.zip<br /><br />1N.书名:J2ME 循序渐进<br />注释：本教程详细审查了袖珍版 Java 2 平台 (J2ME)，它主要面向在 Java 编程及面向对象设计与开发方面有深厚背景的中级开发者。 您可以首先了解 J2ME 的背景并研究 J2ME 的配置<br />和简表。随后，逐步建立您的开发环境，用于开发 J2ME 应用程序。<br />本教程将向您介绍一些课题如 K 虚拟机 (KVM)，和 KJava API -- 用于关联连接有限设备配置 (CLDC) 和使用 CLDC 的移动信息设备简表。之后您将构造一个简单的应用程序来看看您能<br />用 J2ME 做些什么。您将使用 CLDC 和 KJava 开发一个基本绘图应用程序以及一个小型 MIDP 应用程序。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j2me/tutorial.zip<br /><br />1O.书名:构建自己的 Java 库<br />注释：此篇教程主要教您怎样使用 Java 语言来构建自己的可重用的类库。内容包括设计良好类库的一些关键事项以及有效方法，为了更好的说明内容，教程还给出了一个简单的类库设计的例子。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-library/j-library.zip<br /><br />1P.书名:了解 Java ClassLoader<br />注释：Java ClassLoader 是一个重要的、但又常常被人忽略的 Java 运行时系统组件。它是负责在运行时查找和装入类文件的类。创建自己的 ClassLoader 可以以实用且有趣的方式定<br />制 JVM，这样可以让您彻底重新定义如何将类文件引入系统。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-classloader/j-classloader.zip<br /><br />1Q.书名:Java 调试<br />注释：即使是最高级的开发人员所开发的最简单的应用程序也可能包含错误。如果要成为好的调试人员，不必象大侦探那样调查蛛丝马迹。您只需了解概念并熟悉正确的工具。在本教程中，我们提供了关于基本 Java 调<br />试概念和更高级调试类型的详细信息。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-debug/j-debug.zip<br /><br /><br />1R.书名:构建定制的树型视图<br />注释：在这篇免费的 dW 专有的独家教程中，讲述了关于 Swing 树型视图的概念、它们所显示的内容、如何设置它们以及如何定制它们。它还讲述了使用线程来执行长时间运行任务的概念，这样用户界面就可以保<br />持迅速反应。研究 Java Swing 树的相关类，演示了如何定制基本数据模型和树节点的绘制。为说明这些概念，我们将生成一个增强型 JTree，JMagnitudeTree。这个增强型 JTree 可<br />以显示树节点的相对数量，以及标准节点名称和整个树型结构。例如，如果树显示的是文件目录结构，那么它可以指出所有文件和目录的相对大小。本教程并不试图充当编程参考，因此合适的 Swing 参考资料或在线文档<br />也许会有帮助。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-magnitudetree/MagnitudeTree.zip<br /><br />1S.书名:构建 Java 聊天服务器<br />注释：在这篇免费的 dW 专有的独家教程中，我们将构建一个简单聊天系统的服务器和客户机方。您将在这个过程中学到创建这样一个服务器时可以用到的基本框架，该框架使用在很多情况下都能很好工作的传统技术。我<br />们还将讨论框架的一些限制，并找到克服这些限制的方法。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-chat/tutorial/j-chat.zip<br /><br />1T.书名:构建带会话跟踪的 Servlet<br />注释：本教程讲授使用 Servlet 和 JSP 技术构建因特网应用的技巧。其关键是启用会话处理，那么 Servlet 就可以知道哪个用户在干什么。本教程显示了一个 URL 书签系统，在这个系统中，<br />多个用户访问一个系统以添加、除去和更新 HTML 书签列表。Servlet 使用 JSP 技术来处理用户交互。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-servlets2/tutorial/j-servlets2.zip<br /><br />1U.书名:Java 语言基础<br />注释：本教程介绍了 Java 编程语言，包括一些用来说明面向对象架构语言的语法的示例， 以及一些标准编程的练习，如定义实例方法，使用内嵌(built-in)类型，创建用户自定义类型， 使用引用变量(<br />reference variables)等。<br />URL: http://www-900.ibm.com/developerWorks/cn/education/java/javaintro/tutorial/javaintro.zip<br /><br /><br />1V.书名:JavaRMI入门实战(实在找不到页面下载，这是ftp下载的）<br />URL:ftp://218.242.4.185/pub/work/JAVA_JSP_J2EE/Articles/RMI/JavaRMI%C8%EB%C3%C5%CA%B5%D5%BD.pdf<br /><br />1W.书名:Java Xml 编程指南书籍源码<br />URL:ftp://202.115.39.65/--==Incoming==--/Documents/Tech/Java/J2EE/Java%20Xml%20编程指南书籍源码.rar<br /><br />1X.书名:XML解决方案开发实务<br />URL:<br />http://www.guxiang.com/epubcn/readings/diannaotushu/100/download/xmlsolution.zip<img src ="http://www.blogjava.net/faithwind/aggbug/56904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-07-06 10:34 <a href="http://www.blogjava.net/faithwind/archive/2006/07/06/56904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thread 的理解、使用</title><link>http://www.blogjava.net/faithwind/archive/2006/06/22/54524.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Thu, 22 Jun 2006 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/06/22/54524.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/54524.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/06/22/54524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/54524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/54524.html</trackback:ping><description><![CDATA[
		<p>try {<br />     new Thread(new Runnable() {<br />      public void run() {<br />       TaskService taskService = (TaskService)context.getBean(TaskService.SERVICE_NAME);<br />       List&lt;Task&gt; taskSharedList = taskService.getAllSharedTaskList();<br />       for (Task task : taskSharedList) {<br />        task.setOwner(mainFrame.getUserName());<br />       }<br />       try {<br />        ((LoginServiceProxyImpl) context.getBean(LoginServiceProxyImpl.SERVICE_NAME))<br />          .shareTask(taskSharedList);<br />       } catch (RemoteException e) {<br />        e.printStackTrace();<br />       } catch (ServiceException e) {<br />        e.printStackTrace();<br />       }<br />      }<br />     }).run();</p>
		<p>    } catch (Exception e) {<br />    }<br /></p>
<img src ="http://www.blogjava.net/faithwind/aggbug/54524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-06-22 16:54 <a href="http://www.blogjava.net/faithwind/archive/2006/06/22/54524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解UUID</title><link>http://www.blogjava.net/faithwind/archive/2006/05/26/48381.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 26 May 2006 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/05/26/48381.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/48381.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/05/26/48381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/48381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/48381.html</trackback:ping><description><![CDATA[
		<p>通用惟一标识符（UUID）是<a class="bluekey" href="http://www.yesky.com/key/4670/154670.html" target="_blank">128位</a>比特的数字，用来惟一地标识因特网上的某些对象或者实体。根据使用的特定<a class="bluekey" href="http://www.yesky.com/key/4302/154302.html" target="_blank">机制</a>，通用惟一标识符不仅需要保证是彼此不相同的，或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。通用惟一标识符依靠保证惟一性的部分的组合。有保证的通用惟一标识符包括一个指向生成通用惟一标识符的主机的网络地址，时间戳（用来记录事务的精确时间的记录），以及一个随机生成的组件。因为网络地址标识了惟一的一台计算机 ，并且时间戳对于某台主机上的生成的每个通用惟一标识符也是惟一的，那么这两个部分就完全可以保证惟一性了。然而，随机生成的通用惟一标识符的元素也可以作为保护措施来防止所有的不可预见的问题。　　 
</p>
		<p>通用惟一标识符是作为tModel 数据结构中的一部分，这种数据结构标识通用描述、发现，和整合（UDDI）注册中的一种服务的类型（注册服务的通用表示法）。这种机制可用来发现网络服务。　　 
</p>
		<p>通用惟一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球惟一标识符（<a class="bluekey" href="http://www.yesky.com/key/3470/118470.html" target="_blank">GUID</a>），这也是通用惟一标识符的一种类型，可用来指向<a class="bluekey" href="http://www.yesky.com/key/2172/42172.html" target="_blank">组建</a>对象模块对象和其他的软件组件。第一个通用惟一标识符是在网罗计算机系统（NCS）中创建，并且随后成为开放软件<a class="bluekey" href="http://www.yesky.com/key/3870/148870.html" target="_blank">基金</a>会（OSF）的分布式计算环境（DCE）的组件。<br /><br /></p>
		<div class="postbody">UUID，是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier)。<br /><br />UUID是指在一台机器上生成的数字，它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算，用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合：当前日期和时间(UUID的第一个部分与时间有关，如果你在生成一个UUID之后，过几秒又生成一个UUID，则第一个部分不同，其余相同)，时钟序列，全局唯一的IEEE机器识别号（如果有网卡，从网卡获得，没有网卡以其他方式获得），UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。<br />在ColdFusion中可以用CreateUUID()函数很简单的生成UUID，其格式为：xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)，其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为：xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)<br />，可以从<a href="http://www.cflib.org/">cflib</a> 下载<a href="http://www.cflib.org/udf.cfm?ID=54">CreateGUID() </a>UDF进行转换。<br />使用UUID的好处在分布式的软件系统中（比如：DCE/RPC, COM+,CORBA）就能体现出来，它能保证每个节点所生成的标识都不会重复，并且随着WEB服务等整合技术的发展，UUID的优势将更加明显。<br /><br />PS：在MMColdFusion技术支持中心找到<a href="http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_19007">一篇文章</a>，其中提到使用CreateUUID()会将WIN平台下的系统时间加快10毫秒，原因是JVM1.3.x 和1.4.x的bug，文章提到了解决方法。</div>
<img src ="http://www.blogjava.net/faithwind/aggbug/48381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-05-26 17:13 <a href="http://www.blogjava.net/faithwind/archive/2006/05/26/48381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>title中有回车的解决方案（只适合IE）</title><link>http://www.blogjava.net/faithwind/archive/2006/05/19/47029.html</link><dc:creator>黑咖啡</dc:creator><author>黑咖啡</author><pubDate>Fri, 19 May 2006 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/faithwind/archive/2006/05/19/47029.html</guid><wfw:comment>http://www.blogjava.net/faithwind/comments/47029.html</wfw:comment><comments>http://www.blogjava.net/faithwind/archive/2006/05/19/47029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/faithwind/comments/commentRss/47029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/faithwind/services/trackbacks/47029.html</trackback:ping><description><![CDATA[&lt;span title="第一行&amp;#13;&amp;#10;第二行"&gt;haha haha haha&lt;/span&gt;<br /><img src ="http://www.blogjava.net/faithwind/aggbug/47029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/faithwind/" target="_blank">黑咖啡</a> 2006-05-19 12:07 <a href="http://www.blogjava.net/faithwind/archive/2006/05/19/47029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>