﻿<?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-jier的博客-文章分类-Java基础研究</title><link>http://www.blogjava.net/jier/category/24971.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 06 Sep 2007 13:04:23 GMT</lastBuildDate><pubDate>Thu, 06 Sep 2007 13:04:23 GMT</pubDate><ttl>60</ttl><item><title>java中获得系统路径</title><link>http://www.blogjava.net/jier/articles/142391.html</link><dc:creator>夏雪</dc:creator><author>夏雪</author><pubDate>Mon, 03 Sep 2007 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/jier/articles/142391.html</guid><wfw:comment>http://www.blogjava.net/jier/comments/142391.html</wfw:comment><comments>http://www.blogjava.net/jier/articles/142391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jier/comments/commentRss/142391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jier/services/trackbacks/142391.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent"><span class="postbody"><font size="2"><span style="font-family: Comic Sans MS"><span id="ArticleContent1_ArticleContent1_lblContent" style="font-family: "><span class="postbody" style="font-family: "><font style="font-family: Lucida Console" size="2">在Application中: <br style="font-family: " />
System.getProperty("user.dir") <br />
<br style="font-family: " />
在Servlet中: <br style="font-family: " />
ServletContext servletContext = config.getServletContext(); <br style="font-family: " />
String rootPath = servletContext.getRealPath("/"); <br />
<br />
在自定义标签中，分布式环境下，用<br />
((HttpServletRequest) this.pageContext.getRequest()).getContextPath();获取web的路径，<br />
如&#8220;\web&#8221;<br />
<br style="font-family: " />
在jsp中:<br style="font-family: " />
application.getRealPath("") </font></span></span><br style="font-family: " />
</span></font></span></span>
<img src ="http://www.blogjava.net/jier/aggbug/142391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jier/" target="_blank">夏雪</a> 2007-09-03 17:24 <a href="http://www.blogjava.net/jier/articles/142391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaBean编程应用技术</title><link>http://www.blogjava.net/jier/articles/141418.html</link><dc:creator>夏雪</dc:creator><author>夏雪</author><pubDate>Thu, 30 Aug 2007 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/jier/articles/141418.html</guid><wfw:comment>http://www.blogjava.net/jier/comments/141418.html</wfw:comment><comments>http://www.blogjava.net/jier/articles/141418.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jier/comments/commentRss/141418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jier/services/trackbacks/141418.html</trackback:ping><description><![CDATA[<p style="COLOR: #000000" align=left><strong>Java语言的组件技术&nbsp;；<br>JavaBean设计目标及其实现手段；<br>JavaBean中的属性；<br>JavaBean的事件及自定义事件；&nbsp;<br>JavaBean持久化&nbsp;<br>JavaBean的自检<br>JavaBean的</strong><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff><strong style="COLOR: #000000">编程</strong></font></a><font face="Times New Roman"><strong>实例&nbsp;</strong></font><font size=3><strong> </strong></p>
<p style="COLOR: #000000" align=left><br><font face="Times New Roman">一、Java语言的组件技术&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">1、JavaBean是什么？<br>（1）Bean是一个特殊的类，这个类必须符合JavaBean规范（是一个非常简单的遵循某种严格协议的Java类）。<br>（2）JavaBean是用Java语言编写的可重用</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">组件。<br>2、Bean的种类：<br>可视化</font><a class=channel_keylink href="http://www.hur.cn/program/"><font style="COLOR: #000000" face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">组件：可以是简单的GUI元素，如按钮或滚动条；也可以是复杂的，如</font><a class=channel_keylink href="http://www.hur.cn/db/Index.html"><font face="Times New Roman" color=#0000ff>数据库</font></a><font face="Times New Roman">视图<br>非可视化</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">组件：没有GUI表现形式，用于封装业务逻辑、</font><a class=channel_keylink href="http://www.hur.cn/db/Index.html"><font face="Times New Roman" color=#0000ff>数据库</font></a><font face="Times New Roman">操作等<br>3、JavaBean与微软的ActiveX的不一样<br>JavaBean是与平台无关的<br>ActiveX是基于Windows系统平台的&nbsp;<br>4、JavaBean组件与EJB的不同：<br>JavaBean组件存储状态信息<br>EJB组件存储业务逻辑&nbsp;<br>5、Bean的应用场合：<br>在使用Java</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">时，并不是所有</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">模块都需要转换成Bean。<br>Bean比较适合于那些具有可视化操作和定制特性的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">组件。<br>6、JavaBean的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">方法：<br>采用可视化</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">工具---主要有：<br>Borlands公司的JBuilder<br>SunSoft的Java&nbsp;Studio<br>Symantec的Visual&nbsp;Caf&#233;<br>IBM的Visual&nbsp;Age&nbsp;for&nbsp;Java等；<br>当然也可以手写代码。<br>7、JavaBean的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">要点：<br>一个Bean不必非要继承特定的基类或接口；<br>可视化的Bean必须继承的类是Component类，这样它们才能添加到可视化容器中去；<br>非可视化Bean则不需要继承这个类。<br>一个Bean本质上就是一个Java类的代码，只是添加了所谓的自检和序列化，因此Bean实际就是一个普通的Java类。&nbsp;&nbsp;</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">二、JavaBean设计目标及其实现手段&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">&nbsp;（1）紧凑而方便的创建和使用&nbsp;<br>因为Bean组件常常用于分布式计算环境中，这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。<br>显然，为了适应传送的效率和速度，JavaBean组件必须是越紧凑越好。<br>（2）完全的可移植性<br>JavaBean&nbsp;API与独立于平台的Java系统相结合，提供了独立于平台的组件解决方案。因此，组件</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">者就可以不必再为带有JavaBean平台特有的类库而担心了。<br>最终的结果都将是计算机界共享可重复使用的组件，并在任何支持Java的系统中无需修改地执行<br>（3）继承Java的强大功能<br>现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能，它可以使得对象在运行时彼此动态地交互作用，这样对象就可以从</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">系统或其</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">历史中独立出来。&nbsp;<br>JavaBean继承在现有Java功能中还有一个重要的方面，就是持久性，它保存对象并获得对象的内部状态。&nbsp;<br>通过Java提供的序列化(serialization)机制，持久性可以由JavaBean自动进行处理。&nbsp;<br>当然，在需要的时候，</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">者也可以自己建立定制的持久性方案。&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">三、一个简单的JavaBean程序代码</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">import&nbsp;java.awt.*;<br>import&nbsp;java.io.Serializable;<br>public&nbsp;class&nbsp;JavaBeanButton&nbsp;extends&nbsp;Canvas&nbsp;implements&nbsp;Serializable&nbsp;<br>{&nbsp;//任何实现了Serializable接口的Java类都可以成为一个JavaBean类。<br>&nbsp;public&nbsp;JavaBeanButton()<br>&nbsp;{&nbsp;this.setSize(50,50);<br>&nbsp;}<br>&nbsp;public&nbsp;void&nbsp;paint(Graphics&nbsp;g)<br>&nbsp;{&nbsp;g.setColor(Color.LIGHT_GRAY);<br>&nbsp;&nbsp;g.fillOval(0,0,50,50);<br>&nbsp;}<br>}&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">JavaBean程序结构要点</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">1、可视化的Bean应该从Component或者Canvas类来继承&nbsp;<br>2、每个Bean应该实现Serializable接口&nbsp;<br>3、JavaBean中的构造函数<br>&nbsp;&nbsp;&nbsp;每个JavaBean的类中应该提供一个不带参数的默认构造函数，以便构造工具能够实例化其对象。当然还应该有带参数的构造函数以便能够对它进行初始化。&nbsp;<br>4、其它则与一般的Java类的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">规则相同&nbsp;</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">四、JavaBean的存储格式&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">Jar文件：<br>&nbsp;&nbsp;&nbsp;JavaBean组件被设计出来后，一般是以扩展名为jar的格式文件存储，在jar中包含与JavaBean有关的信息，并以MANIFEST文件指定其中的哪些类是JavaBean。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">Jar文件中的manifest文件的内容如下：<br>&nbsp;Name:&nbsp;JavaBean.class<br>&nbsp;Java-Bean:&nbsp;True</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">利用Jar命令产生*.jar文件。命令格式如下<br>C&gt;&nbsp;jar&nbsp;cfm&nbsp;JavaBean.jar&nbsp;&nbsp;JavaBeanManifest.txt&nbsp;JavaBean.class<br>参考JavaBeanStepbyStep中的step1&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">五、JavaBean中的属性&nbsp;&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">JavaBean的属性与一般Java程序中所指的属性，或者说与所有面向对象的程序设计语言中对象的属性是一个概念，在程序中的具体体现就是类中的变量。在JavaBean的设计中，按照属性的不同作用又细分为四类：&nbsp;<br>&nbsp;&nbsp;单值属性<br>&nbsp;&nbsp;索引属性<br>&nbsp;&nbsp;关联属性<br>&nbsp;&nbsp;限制属性</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">&nbsp;属性一、JavaBean中的单值属性<br>（1）含义：它表示一个伴随有一对get/set方法的变量。属性名与和该属性相关的get/set方法名对应。&nbsp;<br>（2）编码规则<br>属性声明为私有，没有公有的属性<br>通过访问方法而不是直接存储实例变量<br>属性值xxx对应有getXxx和setXxx方法<br>对于布尔型的属性，可以用isXxx方法查值<br>Bean的普通方法不适合上面的命名规则，但它们是公有的。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">JavaBean中的单值属性示例代码</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">public&nbsp;class&nbsp;myCanvas&nbsp;extends&nbsp;Canvas&nbsp;implements&nbsp;Serializable<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp;String&nbsp;ourString=&nbsp;"Hello";&nbsp;//属性名为ourString，类型为字符串<br>&nbsp;&nbsp;boolean&nbsp;editable;&nbsp;&nbsp;public&nbsp;myCanvas()&nbsp;<br>&nbsp;&nbsp;{&nbsp;setBackground(Color.red);<br>&nbsp;&nbsp;&nbsp;setForeground(Color.blue);&nbsp;&nbsp;}<br>&nbsp;&nbsp;public&nbsp;void&nbsp;setOurString(String&nbsp;newString)&nbsp;<br>&nbsp;&nbsp;{&nbsp;&nbsp;/*&nbsp;&#8220;set&#8221;属性*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ourString=newString;&nbsp;&nbsp;}&nbsp;&nbsp;public&nbsp;String&nbsp;getOurString()&nbsp;<br>&nbsp;&nbsp;{&nbsp;/*&nbsp;"get"属性&nbsp;*/<br>&nbsp;&nbsp;&nbsp;return&nbsp;ourString;&nbsp;&nbsp;}<br>&nbsp;&nbsp;public&nbsp;boolean&nbsp;isEditable()&nbsp;<br>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;"布尔"属性&nbsp;*/<br>&nbsp;&nbsp;&nbsp;return&nbsp;editable;&nbsp;&nbsp;}<br>}</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">属性二、JavaBean中的索引属性&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">含义：<br>它表示一个数组值。使用与该属性对应的set/get方法可取得数组中的成员数据值（需要有一个整数索引参数）或者一次设置或取得整个数组的值。<br>索引属性的设计模式如下：<br>（1）访问整个索引属性数组的方法<br>public
<propertytype></propertytype>
[]get
<propertyname></propertyname>
();<br>public&nbsp;void&nbsp;set
<propertyname></propertyname>
([]value);<br>（2）访问整个索引属性中的单个值的方法<br>public
<propertytype></propertytype>
get
<propertyname></propertyname>
(int&nbsp;index);<br>public&nbsp;void&nbsp;set
<propertyname></propertyname>
(int&nbsp;index,int&nbsp;value);&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">JavaBean中的索引属性示例代码<br>public&nbsp;class&nbsp;myCanvas&nbsp;extends&nbsp;Canvas&nbsp;implements&nbsp;Serializable<br>{&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;dataSet={1,2,3,4,5,6};&nbsp;//dataSet是一个索引属性&nbsp;&nbsp;public&nbsp;myCanvas()&nbsp;<br>&nbsp;&nbsp;{&nbsp;setBackground(Color.red);<br>&nbsp;&nbsp;&nbsp;setForeground(Color.blue);&nbsp;&nbsp;}&nbsp;<br>&nbsp;public&nbsp;void&nbsp;setDataSet(int[]&nbsp;newdataSet)//设置整个数组<br>&nbsp;&nbsp;{&nbsp;dataSet=&nbsp;newdataSet;&nbsp;&nbsp;}&nbsp;&nbsp;/*&nbsp;设置数组中的单个元素值&nbsp;*/&nbsp;<br>&nbsp;&nbsp;public&nbsp;int[]&nbsp;getDataSet()&nbsp;&nbsp;/*&nbsp;取得整个数组值&nbsp;*/<br>&nbsp;&nbsp;{&nbsp;return&nbsp;dataSet;&nbsp;&nbsp;}<br>&nbsp;&nbsp;public&nbsp;void&nbsp;setDataSet(int&nbsp;index,&nbsp;int&nbsp;x)&nbsp;<br>&nbsp;&nbsp;{&nbsp;dataSet[index]=x;&nbsp;&nbsp;}&nbsp;&nbsp;public&nbsp;int&nbsp;getDataSet(int&nbsp;index)&nbsp;<br>&nbsp;&nbsp;{&nbsp;&nbsp;/*&nbsp;取得数组中的指定元素值&nbsp;*/&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dataSet[index];&nbsp;&nbsp;}<br>}</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">属性三、JavaBean中的关联属性</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">含义：<br>它是指当该种属性的值发生变化时，要通知其它的对象。<br>每次的属性值改变时，这种属性就点火一个PropertyChange事件。<br>事件中封装了属性名、属性的原值、属性变化后的新值。<br>至于接收事件的Bean应做什么动作由其自己定义。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">包含关联属性的Bean必须具有以下的功能：<br>允许事件监听器注册和注销与其有关的属性修改事件；<br>当修改一个关联属性时，可以在相关的监听器上触发属性修改事件。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">在java.beans包中利用PropertyChangeSupport类创建出该类的对象，从而可以用于管理注册的监听器列表和属性修改事件通知的发送。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">关联属性的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">要点<br>1、由于当关联属性被改变时，将使用PropertyChangeSupport类中的firePropertyChange方法来点火属性改变事件。&nbsp;<br>2、应该存储关联属性的原始属性值，因为属性值和新的属性值都要传给firePropertyChange()方法，而且它们都是Object类型。因此如果为基本的数据，则应该转换为对应的类类型。&nbsp;<br>3、属性修改事件是在属性被修改后触发。<br>changes.firePropertyChange("ourString",oldString,newString);&nbsp;&nbsp;<br>4、Bean要预留出一些接口给</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">工具，</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">工具使用这些接口，把其它的JavaBean对象与该Bean相挂接。&nbsp;<br>public&nbsp;void&nbsp;addPropertyChangeListener(PropertyChangeListener&nbsp;listener)<br>{changes.addPropertyChangeListener(listener);}<br>public&nbsp;void&nbsp;removePropertyChangeListener(PropertyChangeListener&nbsp;listener)<br>{changes.removePropertyChangeListener(listener);}</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">属性四、JavaBean中的限制属性</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">含义：<br>它指当这个属性的值要发生变化时，与这个属性已建立了某种连接的其它外部Java对象可否决该属性值的改变；<br>当然Bean&nbsp;本身也可以否决该Bean属性值的改变。<br>如何限制属性：&nbsp;限制属性的监听者通过抛出PropertyVetoException来阻止该属性值的改变。<br>监听者：限制属性一般有两种监听者<br>属性变化监听者<br>否决属性改变的监听者&nbsp;<br>否决属性改变的监听者在自己的对象代码中有相应的控制语句，在监听到有限制属性要发生变化时，在控制语句中判断是否应否决这个属性值的改变</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">限制属性的</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">要点</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">1、分别声明PropertyChangeSupport和VetoableChangeSupport类的对象（限制属性值可否改变&nbsp;）&nbsp;<br>2、当属性被改变时，然后点火属性改变否决事件。&nbsp;<br>vetos.fireVetoableChange(&#8230;);&nbsp;<br>3、若有其它对象否决属性的改变，则程序抛出异常，不再继续执行下面的语句，方法结束。若无其它对象否决属性的改变，则把该属性赋予新值，并点火属性改变事件。<br>4、与属性改变事件相同，也要为限制属性预留接口，使其它对象可注册入限制属性的否决改变监听者队列中，或把该对象从中注销。&nbsp;&nbsp;&nbsp;<br>5、限制属性实际上是一种特殊的关联属性，只是它的值的变化可以被监听者否决掉。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">public&nbsp;void&nbsp;addVetoableChangeListener(VetoableChangeListener&nbsp;listener)<br>{&nbsp;<br>&nbsp;&nbsp;vetos.addVetoableChangeListener(listener);&nbsp;}&nbsp;public&nbsp;void&nbsp;removeVetoableChangeListener(VetoableChangeListener&nbsp;listener)<br>{<br>vetos.removeVetoableChangeListener(listener);&nbsp;}&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">六、JavaBean的事件</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">1、通过事件处理机制&nbsp;<br>可让一些组件作为事件源，发出可被描述环境或其它组件接收的事件。<br>这样，不同的组件就可在构造工具内组合在一起，组件与组件、组件与外界之间通过事件的传递进行通信，构成一个应用。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">2、JavaBean事件模型的总体结构（略）&nbsp;<br>3、事件监听者的注册与注销&nbsp;<br>为了各种可能的事件监听者把自己注册入合适的事件源中，建立源与事件监听者间的事件流，事件源必须为事件监听者提供注册和注销的方法。&nbsp;<br>public&nbsp;void&nbsp;add&lt;&nbsp;ListenerType&gt;&nbsp;&nbsp;(&lt;&nbsp;ListenerType&gt;&nbsp;listener)；<br>public&nbsp;void&nbsp;remove&lt;&nbsp;ListenerType&gt;&nbsp;&nbsp;(&lt;&nbsp;ListenerType&gt;&nbsp;listener)；&nbsp;<br>4、事件</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">的步骤&nbsp;<br>声明指定的事件接口对象</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">允许触发该类型的事件&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">实现维护该事件的监听器列表的方法（应该包含有添加和删除）&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">向所有注册该类型的事件组件分发该事件&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">七、JavaBean&nbsp;的自检&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">（1）含义：<br>&nbsp;&nbsp;&nbsp;&nbsp;使外部组件能够寻找到关于JavaBean的结构和功能的内部信息。&nbsp;<br>（2）方法：<br>利用设计模式来隐含地提供自检信息。<br>由于Bean中的属性、方法、事件等的命名有一定的规则，外部系统可以利用这些规则来获得Bean的结构和功能的内部信息。<br>属性设计模式<br>事件设计模式<br>方法设计模式&nbsp;<br>利用BeanInfo提供显示信息</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">1、利用属性设计模式提供自检信息</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">属性设计模式：&nbsp;<br>用于标识Bean&nbsp;中的公有的可访问的属性，即依赖getXXX()、setXXX()、isXXX()等访问者方法来决定可访问的属性。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">2、利用事件设计模式提供自检信息</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">事件设计模式：<br>Bean将事件通知发送给需要接收这些通知并已经在这个Bean上注册了的事件监听器。<br>因为事件监听器必须在Bean上进行注册，所以需要Bean提供适当的方法来实现注册过程。<br>因为在JavaBean的自检机制中，可以从注册方法的名字以及方法的参数类型检测到事件源会产生什么事件。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">事件设计模式</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">要点<br>事件注册方法常常是成对出现（添加和删除）。<br>JavaBean的自检器正是使用这些方法访问Bean可以发送的事件。&nbsp;<br>事件注册必须遵循如下的事件设计模式，以便自动自检服务可以正确地进行&nbsp;&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">public&nbsp;void&nbsp;add<eventlistenertype></eventlistenertype>&nbsp;&nbsp;(<eventlistenertype></eventlistenertype>&nbsp;e);<br>public&nbsp;void&nbsp;remove<eventlistenertype></eventlistenertype>(<eventlistenertype></eventlistenertype>&nbsp;e);&nbsp;</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">3、利用方法设计模式提供自检信息</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">由于这些public方法是完全由Bean的设计者定义的，它们在各个Bean中没有固定的使用特征，因此对这些方法没有特定的设计模式要遵循。&nbsp;</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">要求：<br>Bean可以在一个单独的相关类中显示地表现它的特征，这个类应该实现BeanInfo接口或是继承SimpleBeanInfo类来显示地表现可以被构造器工具获取的Bean的设计环境信息。&nbsp;<br></font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">的方法：<br>将Bean的相关信息类的名称后加&#8220;BeanInfo&#8221;<br>继承SimpleBeanInfo类（它实现了BeanInfo接口）<br>在Bean的相关信息类中实现所需要的BeanInfo接口中的方法以显式地提供Bean的信息。&nbsp;<br>import&nbsp;java.beans.*;<br>&nbsp;public&nbsp;class&nbsp;JavaBeanButtonBeanInfo&nbsp;extends&nbsp;SimpleBeanInfo<br>&nbsp;{&nbsp;&nbsp;public&nbsp;Image&nbsp;getIcon(int&nbsp;iconKind)<br>&nbsp;&nbsp;{//以下代码为JavaBean提供16*16和32*32的图标<br>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;public&nbsp;BeanDescriptor&nbsp;getBeanDescriptor()<br>&nbsp;&nbsp;{//以下代码为JavaeBean提供在应用程序的构造工具中的显示名称字串<br>&nbsp;&nbsp;&nbsp;}<br>public&nbsp;PropertyDescriptor[]&nbsp;getPropertyDescriptors()<br>&nbsp;&nbsp;{&nbsp;//以下代码显式地声明属性&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;public&nbsp;int&nbsp;getDefaultPropertyIndex()<br>&nbsp;&nbsp;{&nbsp;return&nbsp;5;//将某个属性作为缺省的属性<br>&nbsp;&nbsp;}<br>public&nbsp;EventSetDescriptor[]&nbsp;getEventSetDescriptors()<br>&nbsp;&nbsp;{&nbsp;//为Bean显式地注册事件接口&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">八、JavaBean持久化&nbsp;</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">含义：&nbsp;&nbsp;通过持久化，可以将Bean的内部状态（某些字段的信息）保存下来并备以后使用。&nbsp;<br>实现机制：<br>&nbsp;Bean的持久化是基于Java的对象序列化机制的。因此在定义Bean时要使它实现Serializable接口。&nbsp;<br>存储位置：可以存储在文件中。&nbsp;要点：<br>&nbsp;任何实现了Serializable接口的Java类都可以成为一个JavaBean类。&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">JavaBean持久化的形式&nbsp;</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">（一）默认的序列化：<br>实现了Serializable序列化接口的Bean中字段的信息将被自动保存。&nbsp;<br>若不想保存某些字段的信息则可在这些字段前冠以transient或static关键字&nbsp;<br>transient和static变量的信息是不可被保存的。因为transient代表Bean在某次特定会话期间的信息，是临时变量，没有必要永久保存。</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">默认的序列化</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>编程</font></a><font face="Times New Roman">要点</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">（1）一个Bean中所有public属性都应当是被保存的，也可有选择地保存内部状态。&nbsp;<br>（2）Bean</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>开发</font></a><font face="Times New Roman">者在修改</font><a class=channel_keylink href="http://www.hur.cn/program/"><font face="Times New Roman" color=#0000ff>软件</font></a><font face="Times New Roman">时，可以添加字段、移走对其它类的引用，改变一个字段的private/protected/public状态，这些都不影响类的存储结构关系。&nbsp;<br>（3）实现了Serializable序列化接口的类必须有一个无参数的构造函数，重建对象时需要调用它。<br>（4）当从类中删除一个字段，改变一个变量在类体系中的位置，把某个字段改成transient/static，或原来是transient/static，现改为别的特性时，都将引起存储关系的变化。&nbsp;<br>（5）如果Bean的基类已经实现了序列化接口，则该Bean可以不必再实现它。</font></p>
<p style="COLOR: #000000"><br><font face="Times New Roman">（二）对默认的序列化进行定制，在Bean类中重写readObject()与writeObject()方法定制序列化的数据。&nbsp;<br>如果在可序列化的Bean中包含有上面两个方法，则可以实现定制序列化</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">应用场合：<br>希望对序列化的过程执行更多的控制（选择性地进行序列化）。&nbsp;<br>序列化不能由默认的序列化完成的数据如static数据&nbsp;<br>或者需要向序列化数据中添加不是对象数据成员的数据时（附加的数据）。&nbsp;<br>但要求它们为private方法。<br>定制序列化的示例代码<br>private&nbsp;void&nbsp;writeObject(ObjectOutputStream&nbsp;out)&nbsp;&nbsp;throws&nbsp;IOException<br>{&nbsp;out.defaultWriteObject();<br>&nbsp;//先进行默认的序列化写操作<br>&nbsp;out.writeInt(JavaBeanButtonVersion&nbsp;);<br>&nbsp;//再写入static&nbsp;的JavaBeanButtonVersion数据<br>}</font></p>
<p style="COLOR: #000000"><font face="Times New Roman">private&nbsp;void&nbsp;readObject(ObjectInputStream&nbsp;in)&nbsp;&nbsp;&nbsp;throws&nbsp;IOException,ClassNotFoundException<br>{&nbsp;&nbsp;in.defaultReadObject();&nbsp;<br>&nbsp;&nbsp;&nbsp;//先进行默认的序列化读操作<br>&nbsp;JavaBeanButtonVersion&nbsp;=in.readInt();<br>&nbsp;//再读出static&nbsp;的JavaBeanButtonVersion数据<br>}</font></p>
<img height=19 src="http://www.blogjava.net/Emoticons/QQ/22.gif" width=19 border=0></font>
<img src ="http://www.blogjava.net/jier/aggbug/141418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jier/" target="_blank">夏雪</a> 2007-08-30 16:10 <a href="http://www.blogjava.net/jier/articles/141418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IO流</title><link>http://www.blogjava.net/jier/articles/138061.html</link><dc:creator>夏雪</dc:creator><author>夏雪</author><pubDate>Mon, 20 Aug 2007 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/jier/articles/138061.html</guid><wfw:comment>http://www.blogjava.net/jier/comments/138061.html</wfw:comment><comments>http://www.blogjava.net/jier/articles/138061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jier/comments/commentRss/138061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jier/services/trackbacks/138061.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 14pt">流的概念<br>&nbsp;&nbsp;&nbsp;&nbsp;流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中，管道是一条不间断的字节流，用来实现程序或进程间的通信，或读写外围设备、外部文件等。<br>&nbsp;&nbsp;&nbsp;&nbsp;一个流，必有源端和目的端，它们可以是计算机内存的某些区域，也可以是磁盘文件，甚至可以是Internet上的某个URL。<br>&nbsp;&nbsp;&nbsp;&nbsp;流的方向是重要的，根据流的方向，流可分为两类：输入流和输出流。用户可以从输入流中读取信息，但不能写它。相反，对输出流，只能往输入流写，而不能读它。<br>&nbsp;&nbsp;&nbsp;&nbsp;实际上，流的源端和目的端可简单地看成是字节的生产者和消费者，对输入流，可不必关心它的源端是什么，只要简单地从流中读数据，而对输出流，也可不知道它的目的端，只是简单地往流中写数据。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;java.io包中的类对应两类流，一类流直接从指定的位置（如磁盘文件或内存区域）读或写，这类流称为结点流(node&nbsp;stream)，其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源，经过过滤或处理后再以新的输入流的形式提供给用户，过滤器输出流的原理也类似。&nbsp;<br><br>Java的常用输入、输出流<br>&nbsp;&nbsp;&nbsp;&nbsp;在java中，程序可以打开一个输入流，输入流的信息源可以位于文件，内存或网络套接字(socket)等地方,&nbsp;信息源的类型可以是包括对象，字符，图象，声音在内的任何类型。<br>一旦打开输入流后，程序就可从输入流串行地读数据。&nbsp;<br>从输入流读数据的过程一般如下：&nbsp;<br>open&nbsp;a&nbsp;stream<br>while&nbsp;more&nbsp;information<br>&nbsp;&nbsp;&nbsp;&nbsp;read&nbsp;information<br>close&nbsp;the&nbsp;stream<br><br>类似地，程序也能通过打开一个输出流并顺序地写入数据来将信息送至目的端。&nbsp;<br>&nbsp;<br>往输出流写数据的过程一般如下：&nbsp;<br>open&nbsp;a&nbsp;stream<br>while&nbsp;more&nbsp;information<br>&nbsp;&nbsp;&nbsp;&nbsp;write&nbsp;information<br>close&nbsp;the&nbsp;stream<br>java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类：&nbsp;字符流和字节流。<br><br>Java的字节流&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;可以看出，InputStream是所有字节输入流的祖先，而OutputStream是所有字节输出流的祖先。&nbsp;<br>InputStream<br>该类是一个抽象类，其方法包括：&nbsp;<br>int&nbsp;read()<br>int&nbsp;read(byte[])<br>int&nbsp;read(byte[],int,int)<br>&nbsp;&nbsp;&nbsp;&nbsp;这三个方法可从输入流读入字节或字节数组。要注意的是无参数的read()方法返回一个0至255之间的整数或-1,&nbsp;-1代表遇到了流的结束，其它对应读入的字节。<br>后两种方法则将字节读入参数给定的字节数组，返回值是实际读入的字节数或-1(遇到了流结束)。第三个read方法的后两个参数分别给出读入的起始位置和读入的最大字节数。<br>InputStream还有一些其它方法，如：&nbsp;<br>void&nbsp;close()&nbsp;&nbsp;&nbsp;&nbsp;//关闭流<br>int&nbsp;available()&nbsp;&nbsp;&nbsp;//报告流中直接可读的字节数<br>skip(long)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//跳过流中指定的字节<br>OutputStream<br>OutputStream也是一个抽象类。它的主要方法包括：&nbsp;<br>void&nbsp;write(int)<br>void&nbsp;write(byte[])<br>void&nbsp;write(byte[],int,int)<br>其中第一个方法的int型的参数对应要写入的字节，后两个方法的参数与InputStream类似。&nbsp;<br>void&nbsp;close()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭输出流<br>void&nbsp;flush()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//强行将写入缓冲区中剩余的数据写入<br>FileInputStream和FileOutputStream<br>这两个类属于结点流，第一个类的源端和第二个类的目的端都是磁盘文件，它们的构造方法允许通过文件的路径名来构造相应的流。如：&nbsp;<br>FileInputStream&nbsp;infile&nbsp;=&nbsp;new&nbsp;FileInputStream("myfile.dat");<br>FileOutputStream&nbsp;outfile&nbsp;=&nbsp;new&nbsp;FileOutputStream("results.dat");<br>要注意的是，构造FileInputStream,&nbsp;对应的文件必须存在并且是可读的，而构造FileOutputStream时，如输出文件已存在，则必须是可覆盖的。&nbsp;<br><br>BufferedInputStream和BufferedOutputStream<br>它们是过滤器流，其作用是提高输入输出的效率。&nbsp;<br><br>DataInputStream和DataOutputStream<br>这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流，它们允许程序按与机器无关的风格读写Java数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流，常以其它流如InputStream或OutputStream作为它们的输入或输出。<br><br>Java的字符流&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符，对应的字符流按输入和输出分别称为readers和writers。&nbsp;<br>InputStreamReader和OutputStreamWriter<br>在构造这两个类对应的流时，它们会自动进行转换，将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境，其缺省的编码集一般为ISO8859-1。&nbsp;<br><br>BufferedReader和BufferedWriter<br>这两个类对应的流使用了缓冲，能大大提高输入输出的效率。这两个也是过滤器流，常用来对InputStreamReader和OutputStreamWriter进行处理。如：&nbsp;<br>import&nbsp;java.io.*;<br>public&nbsp;class&nbsp;Echo&nbsp;{<br>&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;BufferedReader(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;InputStreamReader(System.in));<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s;<br>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((s&nbsp;=&nbsp;in.readLine()).length()&nbsp;!=&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;An&nbsp;empty&nbsp;line&nbsp;terminates&nbsp;the&nbsp;program<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch(IOException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>}&nbsp;<br>该程序接受键盘输入并回显。<br>对BufferedReader类，该类的readLine()方法能一次从流中读入一行，但对于BufferedWriter类，就没有一次写一行的方法，所以若要向流中一次写一行，可用PrintWriter类将原来的流改造成新的打印流，PrintWriter类有一个方法println()，能一次输出一行。如：&nbsp;<br>............<br>PrintWriter&nbsp;out&nbsp;=&nbsp;new&nbsp;PrintWriter(new&nbsp;BufferedWriter(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileWriter("D:\javacode\test.txt");<br>out.println("Hello&nbsp;World!");<br>out.close(); </p>
<img src ="http://www.blogjava.net/jier/aggbug/138061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jier/" target="_blank">夏雪</a> 2007-08-20 10:30 <a href="http://www.blogjava.net/jier/articles/138061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>