﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-苹果的成长日记</title><link>http://www.blogjava.net/Apple/</link><description>我还是个青苹果呀！</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 16:36:41 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 16:36:41 GMT</pubDate><ttl>60</ttl><item><title>[zz]初学者如何开发出一个高质量的J2EE系统</title><link>http://www.blogjava.net/Apple/archive/2005/08/16/10186.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Tue, 16 Aug 2005 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/08/16/10186.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/10186.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/08/16/10186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/10186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/10186.html</trackback:ping><description><![CDATA[<H3 align=left><FONT size=3>这篇文章对于J2EE整体上做了一个很好的概括</FONT>：</H3>
<H3 align=center>初学者如何开发出一个高质量的J2EE系统</H3>
<P align=center><A href="http://www.jdon.com/aboutme.htm">板桥里人</A> http://www.jdon.com 2005/06/20</P>
<P>　　J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。</P>
<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></P><img src ="http://www.blogjava.net/Apple/aggbug/10186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-08-16 09:00 <a href="http://www.blogjava.net/Apple/archive/2005/08/16/10186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也说说超级女生,喜欢张靓颖</title><link>http://www.blogjava.net/Apple/archive/2005/08/07/9515.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Sun, 07 Aug 2005 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/08/07/9515.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/9515.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/08/07/9515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/9515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/9515.html</trackback:ping><description><![CDATA[&nbsp; 非常喜欢靓颖,今天看到她的一个宣传片,很喜欢:<BR><A href="http://paopaotang.yculblog.com/post.806618.html">http://paopaotang.yculblog.com/post.806618.html</A><A href="http://www.yculblog.com/trackback/806618.html"></A><img src ="http://www.blogjava.net/Apple/aggbug/9515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-08-07 16:59 <a href="http://www.blogjava.net/Apple/archive/2005/08/07/9515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Swing的一点体会</title><link>http://www.blogjava.net/Apple/archive/2005/08/07/9505.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Sun, 07 Aug 2005 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/08/07/9505.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/9505.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/08/07/9505.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/9505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/9505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 从7月14日开始来上海实习已经3个星期了,项目还没正式开始,前期工作准备了很多,而我主要是负责GUI这块,工具是Swing,所以陪伴Swing也已经快一个月的日子了.项目下个星期正式启动,所以对前面的体会作个小小的总结.<BR>&nbsp;&nbsp;&nbsp; 以前在inforsense公司的KDE平台上已经有一个Table Editor,点击主界面上含有表格数据的节点,可以打开表格,然后可以对各种表格进行编辑,增删等简单操作,而同时这些操作也会反映到主界面上的工作流模型中.现在的目标是对这个工具进一步扩展其功能,不仅融如Excel spreadsheet的功能(过滤,对cell进行编辑等),还有将树图与表格视图连接起来,可以进行两种视图之间的拖拽(dnd),切换等.现在更要与化学专业结合起来,本来这款软件是为化学家设计的,目的使他们操作起来更方便.所以还要把扩展后的表格编辑器和Interactive Browser结合起来,做到对同一组数据的多种视图,而且它们是同步的.比如表格中会有Structure(化学分子结构),分子量这样的特定的域,而点击后可启动特定的编辑化学分子结构的软件进行编辑,同时变化反映在表格数据中.<BR>&nbsp;&nbsp;&nbsp; 而我接触的都是Swing,它给我的感觉虽然好象仅仅是在AWT的类前面都加上了个J,但仔细研究,里面有各种设计模式的存在,这一点让我兴奋不已,正好借这个机会学习设计模式.我大部分时间接触的都是JTable和JTree.所以主要谈谈他们.Swing基本是就是个MVC的设计架构,就拿JTable来说,JTable就是View的部分,而TableModel就是M的部分.下面一点点讲讲实现的细节:<BR>1.Filter(过滤器):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要在表格中实现过滤的功能,而实际上不影响原来的模型,可以考虑在原来的模型增加一个过滤器.它其实上也是一个TableModel(可以子类化TableModel的实现框架AbstractTableModel.),它把原来的TM作为自己的成员,任何实际的操作如getColumnCount(),getRowCount(),getColumnName()等都交给原来的TM来完成(调用TM的相应方法),只是在应该控制的地方控制一下,比如,getValueAt(i,j)就通过控制i,j来只返回过滤器想显示的行或列的数据,而具体的返回数据的操作还是由TM来完成.对setValueAt(),isCellEditable()也是同样的道理.我具体的做法就是用一个List把我想显示的行(列)号保存下来,在getValueAt(i,j)中,i的取值范围就是这个List了.这其实是一种Adapter模式的思想.同样,实现Sort也可以用这种方式.<BR>2)Selection:<BR>&nbsp;&nbsp;&nbsp; JTable中的选择都是由ListSelectionModel来完成的,行列都有默认的选择模型,访问行的SelectionModel的方式是getSelectionModel(),访问列的SelectionModel的方式是getColumnModel().getSelectionModel().你也可以实现自己的选择模型.可以通过<BR>getRowSelectionAllowed()和getColumnSelectionAllowed()获取现在行列是否可选的信息,如果都可选,则在Cell级别是可选的.这就是为什么在行列都可选的情况下,设置i行被选中setRowSelectionInterval(i),同时设置j列被选中setColumnSelectionInterval(j),这样只有(i,j)的Cell单元被选中得到原因.但是反过来,如果我只想使(i,j)的Cell不被选中,而仅仅靠removeColumnSelectionInterval(j)和removeRowSelectionInterval(i)是实现不了的.这难道是Swing的漏洞?<BR>&nbsp;&nbsp;&nbsp; 前面已经讲到,设置改变选择状态主要是通过行列SelectionModel的setSelectionInterval(),addSelectionInterval(),removeSelectionInterval()三个方式实现的.<BR>3)header<BR>&nbsp;&nbsp;&nbsp; 表的行,列的表头着实让我头痛了一阵.尤其是row header.我的row header是用一个JTable实现的,关键是要和表格同步起来.可以考虑与表格共用一个Filter,关键是改写getValueAt()和getRowCount()这两个方法.这样表格过滤留下的行也是表头这个JTable中所需要留下的行.而选择的同步则是覆盖changeSelection()这个方法实现的.而操作的方法就是在2)中提到的那几个方法.设置rowHeader为表头只需要在JScrollPane中用setRowHeaderView()指定即可,而表格最左上角的单元(行表头的表头)用setCorner()指定.<BR>&nbsp;&nbsp;&nbsp; ColumnHeader其实在JTable中已有实现,如果要通过单击列头来选择全列的话,实现的方法可通过在列头上添加一个MouseListener,然后在它的MouseClicked方法中进行选择的同步,其余步骤与行在changeSelection()中的类似,有一点值得注意,要获取单击的列的索引是通过getTableHeader()后得到的tableHeader.columnAtPoint(e.getPoint())得到的,这里e是MouseEvent,也就是这个单击的动作事件.<BR>具体的控制代码如下:<BR>/**<BR>&nbsp; * once click on the header, that column should be selected<BR>&nbsp; */<BR>&nbsp;public void mouseClicked(MouseEvent e) {<BR>&nbsp;&nbsp;JTableHeader header = table.getTableHeader();<BR>&nbsp;&nbsp;TableColumnModel columns = header.getColumnModel();<BR>&nbsp;&nbsp;if(!columns.getColumnSelectionAllowed())<BR>&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;//get the column index being clicked<BR>&nbsp;&nbsp;int column = header.columnAtPoint(e.getPoint());<BR>&nbsp;&nbsp;if(column == -1)<BR>&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;int count = table.getRowCount();<BR>&nbsp;&nbsp;//set the entire column to be selected<BR>&nbsp;&nbsp;if(count != 0)<BR>&nbsp;&nbsp;&nbsp;table.setRowSelectionInterval(0,count-1);<BR>&nbsp;&nbsp;ListSelectionModel selection = columns.getSelectionModel();<BR>&nbsp;&nbsp;//if the shift modifier is pushed down, need to select multiple columns<BR>&nbsp;&nbsp;if(e.isShiftDown()) {<BR>&nbsp;&nbsp;&nbsp;int anchor = selection.getAnchorSelectionIndex();// the first index<BR>&nbsp;&nbsp;&nbsp;int lead = selection.getLeadSelectionIndex();//the last index<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(anchor != -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;boolean old = selection.getValueIsAdjusting();<BR>&nbsp;&nbsp;&nbsp;&nbsp;selection.setValueIsAdjusting(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;boolean anchorSelected = selection.isSelectedIndex(anchor);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(lead != -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(anchorSelected)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.removeSelectionInterval(anchor,lead);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.addSelectionInterval(anchor,lead);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(anchorSelected)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.addSelectionInterval(anchor,column);<BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.removeSelectionInterval(anchor,column);<BR>&nbsp;&nbsp;&nbsp;&nbsp;selection.setValueIsAdjusting(old);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;//select single column<BR>&nbsp;&nbsp;&nbsp;&nbsp;selection.setSelectionInterval(column,column);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;else if(e.isControlDown()) {<BR>&nbsp;&nbsp;&nbsp;if(selection.isSelectedIndex(column))<BR>&nbsp;&nbsp;&nbsp;&nbsp;selection.removeSelectionInterval(column,column);//unselect this column<BR>&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;selection.setSelectionInterval(column,column);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else {<BR>&nbsp;&nbsp;&nbsp; selection.setSelectionInterval(column,column);<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>4)dnd:<BR>&nbsp;&nbsp; 构造一个Transferable对象,保存传送的数据.而两方分别实现自己的TransferHandler即可.<BR>5)表示器和编辑器.<BR>&nbsp;&nbsp; 如果想在JTree中添加JCheckbox,其实只需要实现自己的CellRenderer和CellEditor,在getTreeCellRendererComponent(Object value)和setTreeCellRendererComponent(Object value)中返回或设置一个JCheckBox(value.toString())即可.value就是Tree中节点node的UserObject.如果你想更改树中显示的文字,比如在父节点中显示子节点的数量,只需要在TreeNode类中(子类化DefaultMutableTreeNode)改写toString()方法即可.<BR>&nbsp;&nbsp; 目前的代码可以在"文件"中下载.<img src ="http://www.blogjava.net/Apple/aggbug/9505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-08-07 12:08 <a href="http://www.blogjava.net/Apple/archive/2005/08/07/9505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz至八进制]国际化你的应用程序（上）</title><link>http://www.blogjava.net/Apple/archive/2005/08/04/9166.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Thu, 04 Aug 2005 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/08/04/9166.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/9166.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/08/04/9166.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/9166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/9166.html</trackback:ping><description><![CDATA[<DIV class=postText>
<P>原文地址：<A href="http://www.cnblogs.com/bjzhanghao/archive/2004/08/08/31262.aspx">http://www.cnblogs.com/bjzhanghao/archive/2004/08/08/31262.aspx</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记得几年前汉化软件一般是用二进制编辑工具在编译后的文件中查找和替换英文单词，这个过程需要使用很多技巧，非常的麻烦。而现在，在开发时对应用程序进行国际化处理已经越来越成为一个必不可少的步骤了。例如这次我参与的<A href="http://www.cnblogs.com/bjzhanghao/category/7075.aspx"><FONT color=#000080>项目</FONT></A>是给台湾客户做的，他们要求英文和繁体中文两个版本，幸好我们使用的开发工具是Eclipse，利用它的国际化功能可以很方便的将写在代码里的字符串提出到独立的资源文件中，这里用一个简单的例子说明一下这个过程。</P>
<P>在Eclipse里建立一个名为nls-test的工程（也可以国际化已有工程），新建一个类NLSTest，内容如下：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">public&nbsp;class&nbsp;NLSTest&nbsp;{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;public&nbsp;NLSTest()&nbsp;{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;String&nbsp;str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;world!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;System.out.println(str1);<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;}<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;public&nbsp;static&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;NLSTest();<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;}<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>}</SPAN></DIV></DIV>
<P>现在，这个类的输出是在代码里写死的，如果要改变就必须修改代码然后重新编译。下面我们利用Eclipse解决这个问题。在导航器（Package Explorer）里右键单击这个文件，选择Source -&gt; Externalize Strings，就会打开一个对话框，在这里列出了该类中尚未国际化的字符串，见下图。</P>
<P align=center><IMG height=488 src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/eclipse-nls1.gif" width=636 border=0><BR><BR><FONT size=2>图1 国际化向导第一步</FONT></P>
<P>单击每个字符串前面的小方块可以选择对该串1、进行国际化处理2、永不进行国际化处理3、这次不处理。我们选择要对这个字符串进行国际化处理，并把它的Key修改为比较好理解的名称hello，注意在对话框最上方可以指定一个通用的前缀，这个值会加在每个Key前面作为最终写在资源文件（扩展名是.properties）里的Key名称。好，按下一步继续。</P>
<P>在这里要指定properties文件的名称，如果需要的话要指定一个用于从properties文件中取资源的类，一般是XXXMessages的格式，再按下一步，会显示一个所作更改的确认列表，确认后按Finish按钮完成向导。</P>
<P>可以看到Eclipse为我们生成了NLSTestMessages.java和NLSTest.properties，打开后者会看到里面只有这么一句：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">NLSTest.hello</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;world</SPAN><SPAN style="COLOR: #000000">!</SPAN></DIV></DIV>
<P>而前者NLSTestMessages的作用是根据参数Key从后者取对应的字符串值，看一看现在的NLSTest.java就知道了，它的内容现在是这样的（只列出构造方法，main方法同上）：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;public&nbsp;NLSTest()&nbsp;{<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;String&nbsp;str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">NLSTestMessages.getString(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">NLSTest.hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">$NON-NLS-1$</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;System.out.println(str1);<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;}</SPAN></DIV></DIV>
<P>后面的注释是Eclipse自己用的，标有这个注释的字符串在国际化将被忽略。注释中的数字1表示要忽略的是该行中第一个字符串，如果一行语句里有多个字符串被忽略，将会有多个这样的注释，但数字会各不相同，像这样：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/Images/dot.gif">&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">$NON-NLS-1$&nbsp;//$NON-NLS-2$&nbsp;//$NON-NLS-3$&nbsp;<IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN></DIV></DIV>
<P>好了，现在这个类的国际化处理就算完成了。要想让这个类可以根据用户所在地区输出不同语言的结果，可以在NLSTest.properties同一目录下创建名为NLSTest_XX.properties的文件，其中XX表示国家名称，例如中国是zh_CN或tw_CN，法国是FR等等。新创建的文件里也要有和原来文件相同的名值对，但值是不同语言的，NLSTestMessages类会根据用户机器的地区设置值自动从不同的资源文件里取值，这样就达到了国际化的目的。要在自己的机器上测试运行结果，可以在Eclipse的运行设置里面加上这样的参数：-nl tw_CN，这样就不用费力气设置区域了。</P>
<P>国际化的原理很简单，Eclipse提供的这个功能使国际化变得更容易了。不过关于国际化还有一些细节问题，包括对含参数资源的处理，字符编码处理等等，下篇将对它们进行讨论。</P></DIV><img src ="http://www.blogjava.net/Apple/aggbug/9166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-08-04 10:11 <a href="http://www.blogjava.net/Apple/archive/2005/08/04/9166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载至竹笋炒肉]log4j学习笔记(1)</title><link>http://www.blogjava.net/Apple/archive/2005/07/29/8751.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Fri, 29 Jul 2005 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/07/29/8751.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/8751.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/07/29/8751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/8751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/8751.html</trackback:ping><description><![CDATA[<P><A href="http://www.infomall.cn/cgi-bin/mallgate/20031008/http://hedong.3322.org/archives/pics/log4jlogo.jpg"><IMG height=66 alt=log4jlogo.jpg src="http://hedong.3322.org/archives/pics/log4jlogo-thumb.jpg" width=98 align=left border=0></A>原文地址:http://www.infomall.cn/cgi-bin/mallgate/20031008/http://hedong.3322.org/archives/000193.html<BR>说实话，除了log4j的功能外，我更喜欢它的logo.<BR>　　下面的这篇笔记，主要是"borrow from"Log4J的随机文档"Short introduction to log4j"，由Ceki Gülcü 写于March 2002，其它参考文档见文后。<BR></P><A name=more></A>
<P>1、log4j已经被移植到C, C++, C#, Perl, Python, Ruby, Eiffel 几种语言。<BR>2、log4j有三种主要的<ACRONYM title=component>组件</ACRONYM>：<ACRONYM title=logger>记录器</ACRONYM>,<ACRONYM title=appender>存放器</ACRONYM>,<ACRONYM title=layout>布局</ACRONYM><BR>3、记录器（记录器可不关心log数据存放的事哟）<BR>　　log4j允许程序员定义多个记录器，每个记录器有自己的名字，记录器之间通过名字来表明隶属关系（或家族关系）。列如，记录器a.b,与记录器a.b.c之间是父子关系，而记录器a与a.b.c之间是祖先与后代的关系，父子关系是祖先与后代关系的特例。通过这种关系，可以描述不同记录器之间的逻辑关系。<BR>　　有一个记录器叫根记录器，它永远存在，且不能通过名字检索或引用，可以通过Logger.getRootLogger()方法取得它，而一般记录器通过Logger.getLogger(String name)方法。下面是Logger类的基本方法。 
<DIV class=code>package org.apache.log4j; 
<P></P>
<P>public class Logger {</P>
<P>// Creation &amp; retrieval methods:<BR>public static Logger getRootLogger();<BR>public static Logger getLogger(String name);</P>
<P>// printing methods:<BR>public void debug(Object message);<BR>public void info(Object message);<BR>public void warn(Object message);<BR>public void error(Object message);<BR>public void fatal(Object message);</P>
<P>// generic printing method:<BR>public void log(Level l, Object message);<BR>}</P></DIV><BR>　　记录器还有一个重要的属性，就是级别。（这好理解，就象一个家庭中，成员间存在辈份关系，但不同的成员的身高可能不一样，且身高与辈份无关）程序员可以给不同的记录器赋以不同的级别，如果某个成员没有被明确值，就自动继承最近的一个有级别长辈的级别值。根记录器总有级别值。例如：<BR>
<DIV class=code>
<TABLE border=1>
<TBODY>
<TR>
<TD>记录器名</TD>
<TD>赋予的级别值</TD>
<TD>继承的级别值</TD></TR>
<TR>
<TD>root</TD>
<TD>Proot</TD>
<TD>Proot</TD></TR>
<TR>
<TD>X </TD>
<TD>Px </TD>
<TD>Px </TD></TR>
<TR>
<TD>X.Y </TD>
<TD>none </TD>
<TD>Px </TD></TR>
<TR>
<TD>X.Y.Z</TD>
<TD>none </TD>
<TD>Px </TD></TR></TBODY></TABLE></DIV><BR>　　程序员可以自由定义级别。级别值之间存在偏序关系，如上面几种级别就有关系DEBUG<INFO<WARN<ERROR<FATAL.<BR /> 　　每一条要输出的log信息，也有一个级别值。<BR>　　前面的Logger类中，就预定义了 DEBUG, INFO, WARN, ERROR ，FATAL几种级别，由于与方法绑定，让人易产生误解，其实这几个方法只不过表明了要记录的log信息的级别。当调用log()方法时，log信息的级别就需要在通过参数明确指定。<BR>　　如果一条log信息的级别，大于等于记录器的级别值，那么记录器就会记录它。如果你觉得难以理解，可参考下例。 
<DIV class=code>&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;a&nbsp;logger&nbsp;instance&nbsp;named&nbsp;"com.foo"<BR>&nbsp;&nbsp;&nbsp;Logger&nbsp;&nbsp;logger&nbsp;=&nbsp;Logger.getLogger("com.foo"); 
<P></P>
<P>&nbsp;&nbsp;&nbsp;//&nbsp;Now&nbsp;set&nbsp;its&nbsp;level.&nbsp;Normally&nbsp;you&nbsp;do&nbsp;not&nbsp;need&nbsp;to&nbsp;set&nbsp;the<BR>&nbsp;&nbsp;&nbsp;//&nbsp;level&nbsp;of&nbsp;a&nbsp;logger&nbsp;programmatically.&nbsp;This&nbsp;is&nbsp;usually&nbsp;done<BR>&nbsp;&nbsp;&nbsp;//&nbsp;in&nbsp;configuration&nbsp;files.<BR>&nbsp;&nbsp;&nbsp;logger.setLevel(Level.INFO);</P>
<P>&nbsp;&nbsp;&nbsp;Logger&nbsp;barlogger&nbsp;=&nbsp;Logger.getLogger("com.foo.Bar");</P>
<P>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;enabled,&nbsp;because&nbsp;WARN&nbsp;&gt;=&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;logger.warn("Low&nbsp;fuel&nbsp;level.");</P>
<P>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;disabled,&nbsp;because&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;logger.debug("Starting&nbsp;search&nbsp;for&nbsp;nearest&nbsp;gas&nbsp;station.");</P>
<P>&nbsp;&nbsp;&nbsp;//&nbsp;The&nbsp;logger&nbsp;instance&nbsp;barlogger,&nbsp;named&nbsp;"com.foo.Bar",<BR>&nbsp;&nbsp;&nbsp;//&nbsp;will&nbsp;inherit&nbsp;its&nbsp;level&nbsp;from&nbsp;the&nbsp;logger&nbsp;named<BR>&nbsp;&nbsp;&nbsp;//&nbsp;"com.foo"&nbsp;Thus,&nbsp;the&nbsp;following&nbsp;request&nbsp;is&nbsp;enabled<BR>&nbsp;&nbsp;&nbsp;//&nbsp;because&nbsp;INFO&nbsp;&gt;=&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;barlogger.info("Located&nbsp;nearest&nbsp;gas&nbsp;station.");</P>
<P>&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;request&nbsp;is&nbsp;disabled,&nbsp;because&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO.<BR>&nbsp;&nbsp;&nbsp;barlogger.debug("Exiting&nbsp;gas&nbsp;station&nbsp;search");</P></DIV><BR>　　有几个有趣的情况，一是当一个记录器实例化后，再一次用相同的名字调用getLogger()会返回对它的引用，这非常有利于用同一个记录器在不同代码或类中记录log信息，另一个是与自然界中祖先先于后代出现不同，一个记录器的祖先可以比后代记录出现的晚，但会自动根据名字之间的关系建立这种家族关系。 
<P></P>
<P>4、存放器<BR>　　在log4j中，log信息通过存放器输出到目的地。支持的存放器有console, files, GUI components, remote socket servers, JMS, NT Event Loggers, remote UNIX Syslog daemons。通过file存放器，log信息可以被输出到不同的文件中（即不同的目的地）。log信息可被异步存放。<BR>　　一个记录器可以有多个存放器，可以通过方法addAppender来增加存放器。一条blog信息如果可被这个记录器处理，则记录器会把这条信息送往每个它所拥有的存放器。<BR>　　每个记录器有一个<ACRONYM title="additivity flag ">继承开关</ACRONYM>,其开关决定记录器是/否继承其父记录器的存放器，注意，如果继承则只继承其父记录器，而不考虑更远的祖先的情况。参考下表：<BR>
<TABLE border=1>
<TBODY>
<TR>
<TD>记录器</TD>
<TD>增加的存放器</TD>
<TD>继承的存放器</TD>
<TD>输出的目的地</TD>
<TD>备注</TD></TR>
<TR>
<TD>root</TD>
<TD>A1</TD>
<TD>not applicable</TD>
<TD>A1</TD>
<TD>The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.</TD></TR>
<TR>
<TD>x</TD>
<TD>A-x1, A-x2</TD>
<TD>TRUE</TD>
<TD>A1, A-x1, A-x2</TD>
<TD>Appenders of "x" and root.</TD></TR>
<TR>
<TD>x.y</TD>
<TD>none</TD>
<TD>TRUE</TD>
<TD>A1, A-x1, A-x2</TD>
<TD>Appenders of "x" and root.</TD></TR>
<TR>
<TD>x.y.z</TD>
<TD>A-xyz1</TD>
<TD>TRUE</TD>
<TD>A1, A-x1, A-x2, A-xyz1</TD>
<TD>Appenders in "x.y.z", "x" and root.</TD></TR>
<TR>
<TD>security</TD>
<TD>A-sec</TD>
<TD>FALSE</TD>
<TD>A-sec</TD>
<TD>No appender accumulation since the additivity flag is set to false.</TD></TR>
<TR>
<TD>security.access</TD>
<TD>none</TD>
<TD>TRUE</TD>
<TD>A-sec</TD>
<TD>Only appenders of "security" because the additivity flag in "security" is set to false.</TD></TR></TBODY></TABLE>　　<BR>　　<BR>5、布局<BR>　　布局负责格式化输出的log信息。log4j的PatternLayout可以让程序以类似C语言printf的格式化模板来定义格式。</P>
<P>6、log4j可据程序员制定的标准自动提供一些log信息，这对那类需要频繁log的对象的情况很帮助。对象的自动log，具有继承性.</P><BR>参考文献：<BR>1、log4j--新的日志操作方法，scriptskychen ，http://www.cn-java.com/target/news.php?news_id=2590<img src ="http://www.blogjava.net/Apple/aggbug/8751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-07-29 17:05 <a href="http://www.blogjava.net/Apple/archive/2005/07/29/8751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz至八进制]国际化Eclipse插件</title><link>http://www.blogjava.net/Apple/archive/2005/07/26/8472.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Tue, 26 Jul 2005 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/07/26/8472.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/8472.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/07/26/8472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/8472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/8472.html</trackback:ping><description><![CDATA[<FONT size=2>转载地址：</FONT><A href="http://www.cnblogs.com/bjzhanghao/archive/2004/08/23/36011.html"><FONT size=2>http://www.cnblogs.com/bjzhanghao/archive/2004/08/23/36011.html</FONT></A><BR>
<P>在本文的<A href="http://www.cnblogs.com/bjzhanghao/archive/2004/08/08/31262.aspx"><FONT color=#000080>上篇</FONT></A>里，介绍了使用Eclipse的国际化工具对程序中的字符串进行外向化处理（Extenalize），可以看出步骤是十分简单的。实在是很喜欢Eclipse这样的工具，它可以为你做很多事情，干净漂亮，但绝不会在未经你同意的情况下做任何动作，所谓“利器”也！</P>
<P>现在说说在资源中含有参数的情况怎样处理。比如在对话框中要显示信息：“帐户目前还有 900 元，截止日期为 2004-9-1，谢谢！”，因为中间的数字和日期是动态的，所以不能直接放在资源文件中。但是请放心，大可不必为这条信息指定三个资源（被数字和日期分开的三个字符串），可以在资源文件（.properties）中指定资源为这个样子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">my.resource.key=帐户目前还有&nbsp;{0}&nbsp;元，截止日期为&nbsp;{1}，谢谢！</SPAN></DIV></DIV>
<P>其中{0}和{1}表示将替换为动态的值，然后在程序里写：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Float&nbsp;amount</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/Images/dot.gif">;<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>Date&nbsp;dt</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/Images/dot.gif">;<BR><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>String&nbsp;msg</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">MessageFormat.format(Messages.getString(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">my.resource.key</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">),&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Object[]{amount,dt});</SPAN></DIV></DIV>
<P>这样，msg变量里就是动态生成的提示信息了。你很可能希望对日期进行格式化处理，要实现这个功能也很简单，只要稍微修改一下资源，如下：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">帐户目前还有&nbsp;{0}&nbsp;元，截止日期为&nbsp;{1,date,yyyy-MM-dd}，谢谢！</SPAN></DIV></DIV>
<P>确实简单吧，不知道你用没用过这个写法，我是在PPP项目中才第一次使用的，所以赶紧介绍一下了，呵呵。</P>
<P>接下来的问题是编码，资源文件写为英文是没有问题的，可以正常显示，但汉字是不能直接写在资源文件里的，要转换为unicode才可以。jdk本身提供了native2ascii工具，可以实现这个功能，但用命令行总是不太方便，虽然也有人很喜欢使用命令行的感觉……如果你愿意Eclipse为你服务，大可以使用我下面介绍的两个插件，利用它们，你根本不需要显式转换编码这一步了。</P>
<P>第一个是<A href="http://propedit.sourceforge.jp/index_en.html"><FONT color=#000080>Properties Editor</FONT></A>，好象是日本人写的，安装后它会与扩展名为.properties的文件相关联，使用它打开资源文件，可以在本地语言与unicode视图之间切换，一般情况下编辑本地语言就可以了，保存时会自动转换为unicode。当需要查找某个资源（值）并修改时这个编辑器非常方便，例如想把资源里所有“你好”改为“您好”，如果面对的是一堆unicode码还真是头疼。安装这个插件需要2.1.1版本以上的Eclipse。</P>
<P>另一个我们在项目中经常使用的插件叫……我还真不知道它全名叫什么，在我这里的打包文件名是“29 Localization Editor”，它是一个非常方便的国际化翻译工具。用它打开扩展名为.properties的文件后，可以新建key，或者新建语言，你要做的只是在表格中把尚未翻译成新语言的资源值填下而已，可以选择只显示未翻译的条目或是全部条目。不过很对不起，我还没找到网上的下载地址，如果需要请和我<A href="mailto:bjzhanghao@21cn.com"><FONT color=#000080>联系</FONT></A>吧。</P>
<P align=center><IMG height=417 src="http://www.cnblogs.com/images/cnblogs_com/bjzhanghao/LocalizationEditor.gif" width=631 border=0><BR><BR><FONT size=2>图1 Localization Editor使用界面</FONT></P>
<P align=justify>好了，关于Eclipse的国际化先介绍到这里了。如果你的应用程序是Eclipse插件，还可以更进一步：把资源文件打成语言包。关于这种方式（Fragment）的介绍，以后有时间再写吧。</P><img src ="http://www.blogjava.net/Apple/aggbug/8472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-07-26 13:38 <a href="http://www.blogjava.net/Apple/archive/2005/07/26/8472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】语义万维网服务的自动发现</title><link>http://www.blogjava.net/Apple/archive/2005/06/29/6879.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Wed, 29 Jun 2005 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/06/29/6879.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/6879.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/06/29/6879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/6879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/6879.html</trackback:ping><description><![CDATA[<H2 class=diaryTitle>语义万维网服务的自动发现- -</H2>
<P>&nbsp;&nbsp;&nbsp;&nbsp;原文地址：<A href="http://meta.blogchina.com/812188.html">http://meta.blogchina.com/812188.html</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>
<P>我感兴趣的问题实际上就是<FONT size=+0>Ontology based metadata services for information retrieval. </FONT>实际上是开发一个或一组智能代理，利用<FONT size=+0>Semantic Web services</FONT>架构解决异构系统的情报检索互操作问题。前提条件是一定的<FONT size=+0>Semantic Web services</FONT>架构。首先必须对这个概念解释清楚。这是个很热门的话题了实际上，一篇经典的文章见（<FONT size=+0>2001</FONT>年的文章，稍早一些，还没有<FONT size=+0>DAML-S</FONT>）：<A href="http://www.daml.org/services/ieee01-KSL.pdf"><FONT size=+0>http://www.daml.org/services/ieee01-KSL.pdf</FONT></A>，一个作者是越南人，第三作者是个中国留学生，都很年轻啊！</P>
<P>以下主要来自（<FONT size=+0>Katia Sycara, Massimo Paolucci</FONT><FONT size=+0>, Anupriya Ankolekar, Naveen Srinivasan, "Automated discovery, interaction and composition of Semantic Web services"</FONT>）</P>
<P><FONT size=+0>Web services </FONT>利用自主的代理在分布的环境中实现自动的"按需"服务，<FONT size=+0>Semantic Web</FONT>提供服务描述和服务接口的语义支持，目前这方面的标准正在逐步建立起来，然而多个<FONT size=+0>Web service</FONT>之间的协调和语义一致性是一个关键问题，目前<FONT size=+0>BPEL4WS </FONT>和<FONT size=+0>WSCI</FONT>在这方面作了一些探索，然而最可能的途径是通过<FONT size=+0>DAML-S</FONT>提供解决框架。</P><BR>
<P>组合多个<FONT size=+0>Web services</FONT>可以分为三方面的问题：</P>
<OL>
<LI>"计划"<FONT size=+0>Web</FONT>服务之间的交互以及其提供的功能如何整合； 
<LI>
<DIV>"发现"<FONT size=+0>Web</FONT>服务实现的的任务；</DIV>
<LI>
<DIV>对<FONT size=+0>Web</FONT>服务之间的"交互"进行有效的管理。</DIV></LI></OL>
<P>这三个方面是交织在一起的，计划决定了如何去发现<FONT size=+0>Web</FONT>服务的类型，却依赖于<FONT size=+0>Web</FONT>服务的实现。同样，<FONT size=+0>Web</FONT>服务的交互过程依赖于计划的实施，计划本身又依赖于对交互的需求。</P>
<P>揭示一个<FONT size=+0>Web</FONT>服务，系统必须提供对于<FONT size=+0>Web</FONT>服务所能实现功能和能力的描述机制，并且能够识别和比较不同<FONT size=+0>Web</FONT>服务的功能和能力的异同。另一个挑战是系统还必须支持对不同<FONT size=+0>Web</FONT>服务的交互的支持。</P>
<P align=left>也就是说需要从语义和语法两个方面提供互操作性，而不是仅仅是目前考虑的重点——从语法上制定协议标准（例如<FONT size=+0>SOAP</FONT>和<FONT size=+0>WSDL</FONT>，利用<FONT size=+0>XSD</FONT>展现消息数据的结构）。语法的互操作性仅仅提供了消息交换的结构，没有提供消息内容的解释。<FONT size=+0>UDDI</FONT>仅仅是关于<FONT size=+0>Web</FONT>服务的信息库，并不包含<FONT size=+0>Web</FONT>服务能力的揭示。<FONT size=+0>WSCI</FONT>和<FONT size=+0>BPEL4WS</FONT>描述了多个<FONT size=+0>Web</FONT>服务可以组合在一起成为一个更复杂的<FONT size=+0>Web</FONT>服务，但是其重点放在语法的规定上，因此并不支持自动的<FONT size=+0>Web</FONT>服务的组合。</P>
<P align=left>语义互操作因此成为<FONT size=+0>Web</FONT>服务协同组合的关键问题。它必须：</P>
<OL>
<LI>
<DIV align=left>表达和支持<FONT size=+0>Web</FONT>服务的任务实现（例如网上卖书或者信用卡认证等），以便通过对于<FONT size=+0>Web</FONT>服务功能清楚的描述和广告而实现自动发现；</DIV>
<LI>
<DIV align=left>表达和支持业务关系和规则（<FONT size=+0>Business relations and rules</FONT>）；</DIV>
<LI>
<DIV align=left>表达和支持消息排序（<FONT size=+0>message ordering</FONT>）；</DIV>
<LI>
<DIV align=left>理解消息的语义；</DIV>
<LI>
<DIV align=left>表达和支持使用特定<FONT size=+0>Web</FONT>服务的前提条件以及激活服务的效果；</DIV>
<LI>
<DIV align=left>允许<FONT size=+0>Web</FONT>服务组合成为更为复杂的服务。</DIV></LI></OL>
<P><FONT size=+0>Web</FONT>服务可以直接在语义<FONT size=+0>Web</FONT>基础上直接建立，后者为<FONT size=+0>Web</FONT>提供了内容语义，能够被代理或者其他服务获取，代理能够通过严格定义的语义内容和规则进行推理，由本体提供的概念模型能够很好地解释<FONT size=+0>Web</FONT>网页的内容。从这一点来看，语义<FONT size=+0>Web</FONT>为<FONT size=+0>Web</FONT>服务提供了其所需得的语义互操作的基础，提供了形式化的语言和本体，用以支持服务描述、消息内容的理解、业务规则，并提供了不同本体之间的联系。语义<FONT size=+0>Web</FONT>和<FONT size=+0>Web</FONT>服务互相促进：前者使<FONT size=+0>Web</FONT>成为一个庞大的机读数据库，后者提供机器自动使用这些数据的工具。</P>
<P align=left>由此可以认为，"语义<FONT size=+0>Web</FONT>服务"是语义元数据、本体、形式化工具和<FONT size=+0>Web</FONT>服务架构的集成，是基于良好定义的语言进行语义描述的<FONT size=+0>Web</FONT>服务<FONT size=+0>(A Semantic Web service is a Web Service whose description is in a language that has well-defined semantics)</FONT>。</P>
<P align=left>因此，网络计算的不确定性得到了最大程度的消除，<FONT size=+0>Web</FONT>服务的发现、选择、组合、沟通、激活、监测、管理、恢复和补偿都得到了最大程度的自动化和实现。特别低，语义<FONT size=+0>Web</FONT>服务依赖语义<FONT size=+0>Web</FONT>描述：</P>
<OL>
<LI>
<DIV align=left>消息交换的内容；</DIV>
<LI>
<DIV align=left>消息交换的顺序；</DIV>
<LI>
<DIV align=left>消息交换的状态变化。</DIV></LI></OL>
<P align=left>结果为不同服务的无缝互操作提供了基础。</P>
<P>利用语义<FONT size=+0>Web</FONT>描述<FONT size=+0>Web</FONT>服务有很多具体内容，包括描述<FONT size=+0>Web</FONT>服务的许多附加属性，例如服务质量、安全性约束等，可能最重要的是在<FONT size=+0>Web</FONT>服务的运行过程中的状态描述，包括其输入和前提条件，以及输出和结果等，这些是对于其功能和能力描述所必需的。</P>
<P style="MARGIN: 0cm 0cm 0pt">文章的第二部分讨论了<FONT size=+0>DAML-S</FONT>对于发现和激活语义<FONT size=+0>Web</FONT>服务的作用，并进一步讨论了<FONT size=+0>Web</FONT>服务发现的不同方法和<FONT size=+0>DAML-S</FONT>处理模型的形式语义。第三部分集中讨论<FONT size=+0>DAML-S</FONT>怎样用于<FONT size=+0>Web</FONT>服务能力的发现，怎样在<FONT size=+0>UDDI</FONT>注册系统的基础上更进一步。在第四部分介绍了<FONT size=+0>DAML-S</FONT>虚拟机，主要用于第二部分介绍的"<FONT size=+0>DAML-S</FONT>处理模型"形式语义的处理。第五部分提供了<FONT size=+0>DAML-S</FONT>虚拟机运行效果的评价，我们可以看到其运行并不频繁。第六部分描述了一个具体的利用<FONT size=+0>DAML-S</FONT>组合服务的应用。第七部分是结论。</P>
<P>（语义<FONT size=+0>Web</FONT>服务图示及说明）。</P>
<P>服务描述一般包括三方面内容：服务能力描述；非功能性静态参数（元数据）；对该项服务负责的服务实体的描述。</P>
<P style="MARGIN: 0cm 0cm 0pt">服务能力描述：对于符合一定前提条件的<FONT size=+0>Web</FONT>服务输入产生一定的输出（返回消息），以及其间的副产品。例如一个付费新闻服务需要一个日期和信用卡帐号的输入，然后判断是否符合日期和信用卡的有效性以及信用卡没有被过度使用（超出信用额度的透支）的前提条件，所产生的输出是提交用户一个满足其日期请求的新闻网址，以及从信用卡中扣除相应的服务费用，其中可能会有非功能性静态参数（元数据）参与整个过程，例如对于新闻质量、收费标准以及新闻类别的选者和控制等。</P>
<P style="MARGIN: 0cm 0cm 0pt">处理过程和服务概要提供了描述<FONT size=+0>Web</FONT>服务的两个方面：服务概要描述服务内容和能力，而处理过程描述如何实现服务。例如<FONT size=+0>Amazon</FONT>的<FONT size=+0>Web</FONT>服务的概要描述了该网站的售书功能，而服务过程则必须详细描述为了实现卖书的过程，请求者必须首先查到他所需要的书，提供支付信息，并提供发货地址等。</P><img src ="http://www.blogjava.net/Apple/aggbug/6879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-06-29 14:52 <a href="http://www.blogjava.net/Apple/archive/2005/06/29/6879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象和集合</title><link>http://www.blogjava.net/Apple/archive/2005/06/26/6720.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Sun, 26 Jun 2005 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/06/26/6720.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/6720.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/06/26/6720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/6720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/6720.html</trackback:ping><description><![CDATA[&nbsp; 主要有以下几个方面需要注意：<BR>1.重写equals()和hashCode()<BR>&nbsp; 当真正需要了解两个引用是否完全相同时，使用＝＝。但是，当需要了解对象本身是否相等时，使用equals()。实际上是要比较两个不同对象的<STRONG>内容</STRONG>在意义上是否等价，除了String类和封装器类（已重写了equals()），需要重写equals().Object内的equals()的方法只使用==运算符进行比较，因此，除非重写equals()，否则只有当两个引用引用相同的对象时，这两个对象才被看做是相等的。另外，如果要使类对象能够用作散列表的键（或者任何数据结构中用于搜索和/或检索对象的元素)，则必须重写equals()，使两个不同实例能够被看做是相同的。<BR>&nbsp; 我们一般这样重写：<BR><FONT color=#ff0000>&nbsp; public</FONT> boolean equals(<FONT color=#ff0000>Object o</FONT>) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(<FONT color=#ff0000>o instanceof&nbsp; Moof</FONT>) &amp;&amp; ((Moof)o).getMoofValue() ==&nbsp; this.moofValue)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<BR>&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>&nbsp; }<BR>}<BR>上面执行了两个操作：<BR>&nbsp;1）确保所测试对象的类型是正确的！用instanceof<BR>&nbsp;2）比较我们关心的属性<BR>注意： equals()、hashCode()和toString()方法都是公有的。下面这种重写是无效的，<BR>&nbsp;&nbsp;&nbsp; class Foo {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean equals(Object o) { }<BR>}<BR>&nbsp;一定还要注意参数类型。下面方法是对equals()方法的重载，而不是重写。<BR>&nbsp;&nbsp;&nbsp; class Foo {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean equals(Foo b) { }<BR>}<BR>一定要非常熟悉重写规则，要能够识别类中对Object方法的重写、重载还是非法重新声明。在Foo类中，equals()方法把参数从Object修改为Foo，因此，它是一个重载方法，除非从你自己的代码（它知道这个新的不同方法，而且碰巧被命名为equals)中调用，否则，它不会被调用。<BR>java API中，在equals()方法内定义了一种约定。java约定是一套应该遵守的规则，或者说是想提供其他人所期望的“正确”设计时必须要遵守的内容。有5点：<BR>&nbsp;1.自反性： x.equals(x)应该返回true；<BR>&nbsp;2.对称性：当且仅当y.equals(x)返回true时，x.equals(y）才返回true。<BR>3.可传递性<BR>4.一致性<BR>5.任何非空引用值x，x.equals(null）应该返回false.<BR>如果使用equals(）方法，两个对象被认为是相等的，则它们必须具有相同的散列码值。因为Object类的默认散列码总是为每个对象产生一个唯一号，即使重写的equals()方法认为两个或多个对象是相等的，也是这样。所以，为了安全起见，<STRONG><FONT color=#ff0000>如果重写equals(),一定也要重写<BR>hashCode().</FONT></STRONG><img src ="http://www.blogjava.net/Apple/aggbug/6720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-06-26 15:07 <a href="http://www.blogjava.net/Apple/archive/2005/06/26/6720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书笔记：java数据结构与面向对象编程基础】抽象数据类容器</title><link>http://www.blogjava.net/Apple/archive/2005/06/25/6706.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Sat, 25 Jun 2005 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/06/25/6706.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/6706.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/06/25/6706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/6706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/6706.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容器(Container)在生活中处处可见。每种容器的类型都有各自定制、访问实体的一系列规则。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 区别容器对象本身和该容器包含的对象是很重要的。从某种意义上说，研究数据结构也就是研究容器。这里，将给出容器这种抽象数据类型的行为框架，并且创建实现这种抽象数据类型的基本原型。根据一下的特性可以区别不同类型的容器：<BR>&nbsp;&nbsp;&nbsp; <STRONG>（1）容器中的对象是否可排序。</STRONG>比如：按容器的一个继承属性排序，或按容器中的对象的一个属性排序。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>（2）是否允许对象的复制（是否允许重复）。<BR>&nbsp;&nbsp;&nbsp;&nbsp;（3）容器中的对象可被限制为一个特定的类型。<BR>&nbsp;&nbsp;&nbsp;&nbsp;（4）容器中的对象可基于索引来访问。<BR>&nbsp;&nbsp;&nbsp;&nbsp;（5）容器中的对象可基于相对位置来访问。<BR>&nbsp;&nbsp;&nbsp;&nbsp;（6）容器中的对象可基于值访问。<BR>&nbsp;&nbsp;&nbsp; （7）容器可根据其连通性（线性、非线性）来区别。</STRONG><BR>这里以Container接口为根接口来表示所有容器最一般的形式。<BR><BR>1.1 顶层的Container接口<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在开发新的java类时，我们应该先考虑是否需要可串行化。一个可串行化的对象可以很容易的从作为对象的文件流中来读/写的。最一般的容器具有一下特性：<BR>&nbsp;&nbsp;&nbsp; 1）不考虑它所包含的对象的类型；<BR>&nbsp;&nbsp;&nbsp; <FONT color=#800080>2）所包含的对象没有排序的要求；<BR></FONT>&nbsp;&nbsp; 3）接受复制的对象；<BR>&nbsp;&nbsp; 4）支持可串行化；<BR>&nbsp;&nbsp; 5）接受使本身为空的命令；<BR>&nbsp;&nbsp; 6）接受一下查询：返回所包含的对象的个数、返回容器是否为空。<BR>我们所定义的Container接口如下：<BR>&nbsp; /** Interface Container - top level container*/<BR>&nbsp;package foundations;<BR>&nbsp;import java.io.serializable;<BR><STRONG>&nbsp;public interface Container extends Serializable {<BR></STRONG>// Commands - see subinferfaces<BR>/** Remove all objects from the container if found<BR>*/<BR><STRONG>public void makeEmpty ();<BR></STRONG>//Queries<BR>/** Return true if the container is empty<BR>*/<BR><STRONG>public boolean isEmpty();<BR></STRONG>/** Return the number of objects in the container<BR>*/<BR><STRONG>public int size();<BR></STRONG>}<BR><BR>1.2 最简单的容器－－堆栈和队列<BR>&nbsp;&nbsp;&nbsp; 这里定义最简单的容器：堆栈（Stack）和队列（Queue）<BR>&nbsp;&nbsp;&nbsp; 堆栈使一个容器，并具有以下特性：<BR>&nbsp;1) 堆栈是有次序的，这也是堆栈的一个属性，与堆栈所包含的对象无关。堆栈中对象的次序依赖于其插入、删除的顺序。后进先出。<BR>&nbsp;2）对堆栈的操作只能在一个名为top的位置上。用Push方法在堆栈顶部增加新的对象,用pop方法删除堆栈顶部的对象，用top方法查询堆栈顶部的对象。<BR>&nbsp;3）用MakeEmpty方法可以清除堆栈的对象，也可用isEmpty来查询该堆栈是否为空，以及查询堆栈的大小（size()）。<BR>&nbsp;&nbsp;&nbsp; 接口Stack是对Container的扩展，因此它继承了Container所有的方法，并增加了新的方法:push、pop、以及查询顶部对象的方法。<BR>&nbsp;&nbsp;/** Interface Stack - a first-in last-out container<BR>&nbsp;*/<BR>package foundations;<BR><STRONG>public interface Stack extends Container {<BR></STRONG>//Commands<BR>/** Add an object onto the top of the stack<BR>*/<BR><STRONG>public void push(object obj);</STRONG><BR><BR>/** Remove an object form the top of the stack<BR>* Throw NoSuchElementException if stack is empty<BR>*/<BR><STRONG>public void pop();<BR></STRONG>//Queries<BR><BR>/** Return without removing, the top object on the stack<BR>* Throw NoSuchElementException if stack is empty<BR>*/<BR><STRONG>public object top();<BR></STRONG>}<BR>队列也是一个容器，并具有以下特性：<BR>1）队列有次序，这也是它的一个属性，与队列所包含的对象无关。队列中对象的次序依赖于其插入、删除的顺序。队列中的次序关系的主要特点是先进先出。<BR>2）对队列的操作限制在两个位置上，即front（对头）、rear（队尾）。我们可以在尾部增加对象，在头部删除对象，或查询头部的对象。<BR>3）可以用MakeEmpty方法可以清除队列的对象，也可用isEmpty来查询该队列是否为空，以及查询队列的大小（size()）。<BR>接口Queue是对Container的扩展，因此它继承了Container所有的方法，并增加了新的方法:add、remove、以及查询头部对象的方法。<BR>/** Interface Queue<BR>*/<BR><STRONG>public interface Queue extends Container {<BR></STRONG>//Commands<BR>/** Add an object at the rear of the queue<BR>*/<BR><STRONG>public void add(Object obj);<BR></STRONG><BR>/** Remove an object from the front of the queue<BR>* Throws NoSuchElementException if queue is empty<BR>*/<BR><STRONG>public void remove();<BR></STRONG><BR>//Queries<BR>/** Return without removing, the front object in the queue<BR>* Throws NoSuchElementException if queue is empty<BR>*/<BR><STRONG>public object front();<BR></STRONG>}<BR><BR>1.3 辅助性接口和类－－<EM><FONT color=#006400>Comparable</FONT></EM>（可比性）和<EM><FONT color=#006400>Association</FONT></EM>（关联性）<BR>&nbsp;&nbsp; 有序容器包含了一些对象，这些对象在容器中的位置（或次序）是根据它的某个属性的重要性来决定的，更确切的说，有序容器中的对象是可比较的，这个属性可以通过要求对象类来实现Comparable接口来获得。Comparable接口包含唯一一个查询方法CompareTo。<BR>&nbsp; 查询CompareTo返回一个整数值。<BR>/** Interface Comparable<BR>*/<BR><STRONG>public Interface Comparable {<BR></STRONG>//Queries<BR><BR>/** Return -1 if the receiver is less than obj,<BR>* 0 if the receiver equals obj and<BR>* 1 if the receiver is greater than obj<BR>*/<BR><STRONG>public int compareTo (Object obj);<BR></STRONG>}<BR><BR>&nbsp;&nbsp; 类Association允许将值和键(Key)组合起来，即在键和其值之间有一个关联。类Association在研究一个需要键－值（key－value）对的容器数据结构时起到什么重要的作用。<BR>&nbsp;&nbsp; 在字典类容器中就包含Association类的实例，字典是由键组成的，也就是说，我们查找字典中的对象时，只是查找它的键。如果字典按某种顺序（根据所包含的键的相对大小）排列的，那么我们必须保证任何输入到OrderdDictionary（有序字典）中的关联对的键也是可以比较的（Comparable）。同时，我们要求关联也必须是可串行化的，这样才能保证前面所提到的所有容器都要求是可串行化的。Association是一个类，而不是接口。<BR>/** Class Assocation<BR>* An instance must initialize a key on creation.<BR>* If used as a comparable Assocation,keys must be comparable and comparions is based on keys only.<BR>* Note that equals() does not enforce the comparable feature and requires equality of both key and value.<BR>*/<BR>package foundations;<BR>import java.io.serializable;<BR><BR>public class Association extends Object implements Comparable,Serializable {<BR>//Fields<BR>private Object key;<BR>private Object value;<BR><BR>/** Create an instance with specified key and null value<BR>*/<BR>public Assocation (Object key) {<BR>&nbsp;this(key,null);<BR>}<BR><BR>/** Create an instance with specified key and value<BR>*/<BR>public Association(Object key,Object value) {<BR>&nbsp; this.key=key;<BR>&nbsp; this.value=value;<BR>}<BR><BR>/** Set the value<BR>*/<BR>public void setValue(Object value) {<BR>&nbsp; this.value = value;<BR>}<BR><BR>/** return key<BR>*/<BR>public Object key() {<BR>&nbsp; return key;<BR>}<BR><BR>/** return value<BR>*/<BR>public Object value() {<BR>return value;<BR>}<BR><BR>/**Return a string representation.<BR>* Return a String of the form &lt;key:value&gt;<BR>*/<BR>public String toString() {<BR>&nbsp;return "&lt;"+key+":"+value+"&gt;";<BR>}<BR><BR>/** Override inherited object method equals()<BR>*/<BR>public boolean&nbsp;&nbsp;&nbsp;equals (Object obj) {<BR>&nbsp; if(obj instanceof Assocation)]<BR>&nbsp;&nbsp;&nbsp; return (key.equals((Assocation)obj).key) &amp;&amp; value.equals((Assocation)obj).value));<BR>&nbsp; else return false;<BR>}<BR><BR>/**Implement Comparable method compareTo<BR>* Compare based only on key; key must be comparable<BR>*/<BR>public int compareTo (Object obj) {<BR>&nbsp;return ((Comparable)key).compareTo((Association)obj.key());<BR>}<BR><BR>/** Override inherited Object method hashCode().<BR>*Return a unique int representing this object<BR>*/<BR>public int hashCode () {<BR>&nbsp; int bits1 = key.hashCode();<BR>&nbsp; int bits2 = value.hashCode();<BR>&nbsp;return (bits1 &lt;&lt;8)^(bits2&gt;&gt;8);<BR>&nbsp;}<BR>}<BR><BR>未完，待续....<BR><img src ="http://www.blogjava.net/Apple/aggbug/6706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-06-25 16:31 <a href="http://www.blogjava.net/Apple/archive/2005/06/25/6706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【zz至键行天下】java编程100例</title><link>http://www.blogjava.net/Apple/archive/2005/06/24/6695.html</link><dc:creator>苹果</dc:creator><author>苹果</author><pubDate>Fri, 24 Jun 2005 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/Apple/archive/2005/06/24/6695.html</guid><wfw:comment>http://www.blogjava.net/Apple/comments/6695.html</wfw:comment><comments>http://www.blogjava.net/Apple/archive/2005/06/24/6695.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/Apple/comments/commentRss/6695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Apple/services/trackbacks/6695.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]001、Hello,你好Java</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>public class HelloWorld {<BR>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp; System.out.println("Hello Java World!");<BR>&nbsp; }<BR>&nbsp;}</FONT></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]002、Java流程控制</STRONG></FONT></TD></TR>
<TR>
<TD><FONT color=#000000>public class flowDemo{<BR>&nbsp;&nbsp; public static void main(String[] arges){<BR>&nbsp;&nbsp;&nbsp;&nbsp; int iPara1,iPara2,iEnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(arges.length!=3)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("USE :java flowDome parameter1 parameter2 circle");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("parameter1 : 比较条件1，数字类型");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("parameter2 : 比较条件2，数字类型");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("circle ：循环次数");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ego:java flowDome 1 2 5");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPara1 = Integer.parseInt(arges[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPara2 = Integer.parseInt(arges[1]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iEnd = Integer.parseInt(arges[2]);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; //if语句<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(iPara2&gt;iPara1)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("if 条件满足！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("第2个数比第1个数大！");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("if 条件不满足！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("第2个数比第1个数小！");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; //for循环操作<BR>&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;iEnd;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("这是for 第"+i+"次循环");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; //while循环操作<BR>&nbsp;&nbsp;&nbsp;&nbsp; int i=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; while(i&lt;iEnd)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("这是while 第"+i+"次循环");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; //do-while循环操作<BR>&nbsp;&nbsp;&nbsp;&nbsp; int j=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; do<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("这是do-while 第"+j+"次循环");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }while(j&lt;iEnd);<BR>&nbsp;&nbsp; }<BR>&nbsp;}</FONT></TD></TR></TBODY></TABLE></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]003、数组数据操作</STRONG></FONT></TD></TR>
<TR>
<TD><FONT color=#000000>public class&nbsp; myArray{<BR>&nbsp;&nbsp; //初始化数组变量<BR>&nbsp;&nbsp; char[] cNum = {'1','2','3','4','5','6','7','8','9','0'};<BR>&nbsp;&nbsp; char[] cStr = {'a','b','c','d','e','f','g','h',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'i','j','k','l','m','n','o','p',<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'q','r','s','t','u','v','w','x','y','z'};<BR>&nbsp;&nbsp; int[] iMonth = {31,28,31,30,31,30,31,31,30,31,30,31};<BR>&nbsp;&nbsp; String[] sMail = {"@","."};<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：校验电子邮件<BR>&nbsp;*&lt;br&gt;输入参数：String sPara 被校验的电子邮件字符<BR>&nbsp;*&lt;br&gt;返回类型：boolean 如果校验的格式符合电子邮件格式返回true；否则返回false<BR>&nbsp;*/&nbsp;&nbsp; <BR>&nbsp;&nbsp; public boolean isMail(String sPara){<BR>&nbsp;&nbsp; &nbsp;for(int i=0;i&lt;sMail.length;i++){<BR>&nbsp;&nbsp; &nbsp;&nbsp; if(sPara.indexOf(sMail[i])==-1)<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp; &nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp; &nbsp;return true;<BR>&nbsp;&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：判断是否是数字<BR>&nbsp;*&lt;br&gt;输入参数：String sPara。 需要判断的字符串<BR>&nbsp;*&lt;br&gt;返回类型：boolean。如果都是数字类型，返回true；否则返回false<BR>&nbsp;*/&nbsp;&nbsp; <BR>&nbsp;&nbsp; public boolean isNumber(String sPara){<BR>&nbsp;&nbsp; &nbsp; int iPLength = sPara.length();<BR>&nbsp;&nbsp; &nbsp; for(int i=0;i&lt;iPLength;i++){<BR>&nbsp;&nbsp; &nbsp;&nbsp; char cTemp = sPara.charAt(i);<BR>&nbsp;&nbsp; &nbsp;&nbsp; boolean bTemp = false;<BR>&nbsp;&nbsp; &nbsp;&nbsp; for(int j=0;j&lt;cNum.length;j++){<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(cTemp==cNum[j]){<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bTemp = true;<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; &nbsp;&nbsp; }<BR>&nbsp;&nbsp; &nbsp;&nbsp; if(!bTemp) return false; <BR>&nbsp;&nbsp; &nbsp; }<BR>&nbsp;&nbsp;&nbsp; return true;<BR>&nbsp;&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：判断是否都是英文字符<BR>&nbsp;*&lt;br&gt;输入参数：String sPara。要检查的字符<BR>&nbsp;*&lt;br&gt;返回类型：boolean。如果都是字符返回true；反之为false<BR>&nbsp;*/&nbsp;&nbsp; <BR>&nbsp;&nbsp; public boolean isString(String sPara){<BR>&nbsp;&nbsp; &nbsp; int iPLength = sPara.length();<BR>&nbsp;&nbsp; &nbsp; for(int i=0;i&lt;iPLength;i++){<BR>&nbsp;&nbsp; &nbsp;&nbsp; char cTemp = sPara.charAt(i);<BR>&nbsp;&nbsp; &nbsp;&nbsp; boolean bTemp = false;<BR>&nbsp;&nbsp; &nbsp;&nbsp; for(int j=0;j&lt;cStr.length;j++){<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(cTemp==cStr[j]){<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bTemp = true;<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; &nbsp;&nbsp; }<BR>&nbsp;&nbsp; &nbsp;&nbsp; if(!bTemp) return false; <BR>&nbsp;&nbsp; &nbsp; }<BR>&nbsp;&nbsp;&nbsp; return true;<BR>&nbsp;&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：判断是否是闰年<BR>&nbsp;*&lt;br&gt;输入参数：int iPara。要判断的年份<BR>&nbsp;*&lt;br&gt;返回类型：boolean。如果是闰年返回true，否则返回false<BR>&nbsp;*/&nbsp;&nbsp; <BR>&nbsp;&nbsp; public boolean chickDay(int iPara){<BR>&nbsp;&nbsp;&nbsp;&nbsp; return iPara%100==0&amp;&amp;iPara%4==0;<BR>&nbsp;&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：检查日期格式是否正确<BR>&nbsp;*&lt;br&gt;输入参数：String sPara。要检查的日期字符<BR>&nbsp;*&lt;br&gt;返回类型：int。0 日期格式正确，-1 月或这日不合要求， -2 年月日格式不正确 <BR>&nbsp;*/<BR>&nbsp;&nbsp; public int chickData(String sPara){<BR>&nbsp;&nbsp; &nbsp;boolean bTemp = false;<BR>&nbsp;&nbsp; &nbsp;//所输入日期长度不正确<BR>&nbsp;&nbsp; &nbsp;if(sPara.length()!=10) return -2;<BR>&nbsp;&nbsp; &nbsp;//获取年<BR>&nbsp;&nbsp; &nbsp;String sYear = sPara.substring(0,4);<BR>&nbsp;&nbsp; &nbsp;//判断年是否为数字<BR>&nbsp;&nbsp; &nbsp;if(!isNumber(sYear)) return -2;<BR>&nbsp;&nbsp; &nbsp;//获取月份<BR>&nbsp;&nbsp; &nbsp;String sMonth = sPara.substring(5,7);<BR>&nbsp;&nbsp; &nbsp;//判断月份是否为数字<BR>&nbsp;&nbsp; &nbsp;if(!isNumber(sMonth)) return -2;<BR>&nbsp;&nbsp; &nbsp;//获取日<BR>&nbsp;&nbsp; &nbsp;String sDay = sPara.substring(8,10);<BR>&nbsp;&nbsp; &nbsp;//判断日是否为数字<BR>&nbsp;&nbsp; &nbsp;if(!isNumber(sDay)) return -2;<BR>&nbsp;&nbsp; &nbsp;//将年、月、日转换为数字<BR>&nbsp;&nbsp; &nbsp;int iYear = Integer.parseInt(sYear);<BR>&nbsp;&nbsp; &nbsp;int iMon = Integer.parseInt(sMonth);<BR>&nbsp;&nbsp; &nbsp;int iDay = Integer.parseInt(sDay);<BR>&nbsp;&nbsp; &nbsp;if(iMon&gt;12) return -1;<BR>&nbsp;&nbsp; &nbsp;//闰年二月处理<BR>&nbsp;&nbsp; &nbsp;if(iMon==2&amp;&amp;chickDay(iYear)){<BR>&nbsp;&nbsp; &nbsp;&nbsp; if(iDay&gt;29) return 2;<BR>&nbsp;&nbsp; &nbsp;}else{<BR>&nbsp;&nbsp; &nbsp;&nbsp; if(iDay&gt;iMonth[iMon-1]) return -1;<BR>&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp; &nbsp;return 0;<BR>&nbsp;&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法，测试用<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/ <BR>&nbsp;&nbsp; public static void main(String[] arges){<BR>&nbsp;&nbsp;&nbsp;&nbsp; myArray mA = new myArray();<BR>&nbsp;&nbsp;&nbsp;&nbsp; //校验邮件地址<BR>&nbsp;&nbsp;&nbsp;&nbsp; boolean bMail = mA.isMail("</FONT><A href="mailto:tom@163.com"><FONT color=#000000>tom@163.com</FONT></A><FONT color=#000000>");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("1 bMail is "+bMail);<BR>&nbsp;&nbsp;&nbsp;&nbsp; bMail = mA.isMail("</FONT><A href="mailto:tom@163com"><FONT color=#000000>tom@163com</FONT></A><FONT color=#000000>");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("2 bMail is "+bMail);<BR>&nbsp;&nbsp;&nbsp;&nbsp; //演示是否是数字<BR>&nbsp;&nbsp;&nbsp;&nbsp; boolean bIsNum = mA.isNumber("1234");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("1：bIsNum="+bIsNum);<BR>&nbsp;&nbsp;&nbsp;&nbsp; bIsNum = mA.isNumber("123r4");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("2：bIsNum="+bIsNum);<BR>&nbsp;&nbsp;&nbsp;&nbsp; //演示是否是英文字符<BR>&nbsp;&nbsp;&nbsp;&nbsp; boolean bIsStr = mA.isString("wer");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("1：bIsStr="+bIsStr);<BR>&nbsp;&nbsp;&nbsp;&nbsp; bIsStr = mA.isString("wer3");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("2：bIsStr="+bIsStr);<BR>&nbsp;&nbsp;&nbsp;&nbsp; //演示检查日期<BR>&nbsp;&nbsp;&nbsp;&nbsp; int iIsTime = mA.chickData("2003-12-98");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("1：iIsTime="+iIsTime);<BR>&nbsp;&nbsp;&nbsp;&nbsp; iIsTime = mA.chickData("2003-111-08");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("2：iIsTime="+iIsTime);<BR>&nbsp;&nbsp;&nbsp;&nbsp; iIsTime = mA.chickData("2003-10-08");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("3：iIsTime="+iIsTime);<BR>&nbsp;&nbsp;&nbsp;&nbsp; iIsTime = mA.chickData("2000-02-30");<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("4：iIsTime="+iIsTime);<BR>&nbsp;&nbsp; }<BR>&nbsp;}</FONT></TD></TR></TBODY></TABLE></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]004、矢量(Vector)对象的操作</STRONG></FONT></TD></TR>
<TR>
<TD><FONT color=#000000>public class operateVector <BR>{<BR>/*<BR>*&lt;br&gt;方法说明：生成一个4*4的二维Vector，供使用。<BR>*&lt;br&gt;输入参数：<BR>*&lt;br&gt;输出变量：Vector<BR>*&lt;br&gt;其它说明：<BR>*/<BR>&nbsp;public Vector buildVector(){<BR>&nbsp;&nbsp;&nbsp; Vector vTemps = new Vector();<BR>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;4;i++){<BR>&nbsp;&nbsp;&nbsp; Vector vTemp = new Vector();<BR>&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;4;j++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vTemp.addElement("Vector("+i+")("+j+")");<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; vTemps.addElement(vTemp);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return vTemps;<BR>&nbsp;}<BR>/*<BR>*&lt;br&gt;方法说明：插入数据<BR>*&lt;br&gt;输入参数：Vector vTemp 待插入的数据对象<BR>*&lt;br&gt;输入参数：int iTemp 插入数据的位置<BR>*&lt;br&gt;输入参数：Object oTemp 插入数据值<BR>*&lt;br&gt;输出变量：Vector 结果<BR>*&lt;br&gt;其它说明：如果插入位置超出实例实际的位置将返回null<BR>*/<BR>&nbsp;public Vector insert(Vector vTemp,int iTemp,Object oTemp){<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(iTemp&gt;vTemp.size()){<BR>&nbsp;&nbsp;&nbsp;print("数据超界!");<BR>&nbsp;&nbsp;&nbsp;return null;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp; vTemp.insertElementAt(oTemp,iTemp);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return vTemp;<BR>&nbsp;}<BR>/*<BR>*&lt;br&gt;方法说明：移除数据<BR>*&lt;br&gt;输入参数：Vector vTemp 待删除矢量对象<BR>*&lt;br&gt;输入参数：int iTemp 删除数据的位置<BR>*&lt;br&gt;输出变量：Vector<BR>*&lt;br&gt;其它说明：如果删除超界的数据，将返回null<BR>*/<BR>&nbsp;public Vector delete(Vector vTemp,int iTemp){<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(iTemp&gt;vTemp.size()){<BR>&nbsp;&nbsp;&nbsp;print("数据超界!");<BR>&nbsp;&nbsp;&nbsp;return null;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp; vTemp.removeElementAt(iTemp);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return vTemp;<BR>&nbsp;}<BR>/*<BR>*&lt;br&gt;方法说明：修改数据<BR>*&lt;br&gt;输入参数：Vector vTemp 待修改矢量对象<BR>*&lt;br&gt;输入参数：int iTemp 修改数据的位置<BR>*&lt;br&gt;输入参数：Object oTemp 修改数据值<BR>*&lt;br&gt;输出变量：Vector<BR>*&lt;br&gt;其它说明：如果修改位置超界的数据，将返回null<BR>*/<BR>&nbsp;public Vector updata(Vector vTemp,int iTemp,Object oTemp){<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(iTemp&gt;vTemp.size()){<BR>&nbsp;&nbsp;&nbsp;print("数据超界!");<BR>&nbsp;&nbsp;&nbsp;return null;<BR>&nbsp;&nbsp;}else{<BR>&nbsp;&nbsp;&nbsp; vTemp.setElementAt(oTemp,iTemp);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return vTemp;<BR>&nbsp;}<BR>/*<BR>*&lt;br&gt;方法说明：输出信息<BR>*&lt;br&gt;输入参数：String sTemp 输出信息名称<BR>*&lt;br&gt;输入参数：Object oTemp 输出信息值<BR>*&lt;br&gt;返回变量：无<BR>*/<BR>&nbsp;public void print(String sTemp,Vector oTemp){<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(sTemp+"数据：");<BR>&nbsp;&nbsp;&nbsp;&nbsp; this.print(oTemp);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印输出（过载）<BR>&nbsp;*&lt;br&gt;输入参数：Object oPara 输出的对象<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print(Object oPara){<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(oPara);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印输出（过载）<BR>&nbsp;*&lt;br&gt;输入参数：Vector vPara 显示输出矢量对象<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print(Vector vPara){<BR>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;vPara.size();i++){<BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(vPara.elementAt(i));<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法，程序入口<BR>&nbsp;*&lt;br&gt;输入参数：String[] args<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public static void main(String[] args) <BR>&nbsp;{<BR>&nbsp;&nbsp;operateVector ov = new operateVector();<BR>&nbsp;&nbsp;Vector vTemp = ov.buildVector();<BR>&nbsp;&nbsp;ov.print("vTemp0",vTemp);<BR>&nbsp;&nbsp;Vector vResult = ov.insert(vTemp,2,"添加的数据");<BR>&nbsp;&nbsp;ov.print("vResult",vResult);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector vResultup = ov.updata(vResult,2,"修改的数据");<BR>&nbsp;&nbsp;ov.print("vResultmp",vResultup);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector vResultnow = ov.delete(vResultup,2);<BR>&nbsp;&nbsp;ov.print("vResultnow",vResultnow);<BR>&nbsp;}<BR>}<BR></FONT></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]005、哈希表(Hashtable)和枚举器</STRONG></FONT></TD></TR>
<TR>
<TD><FONT color=#000000>public class RoleRight<BR>&nbsp;{<BR>&nbsp;private static Hashtable rightList = new Hashtable();<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：初始化数据<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp;public void init()<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp; String[] accRoleList = {"admin","satrap","manager","user","guest"};<BR>&nbsp;&nbsp;&nbsp; String[] rightCodeList = {"10001","10011","10021","20011","24011"};<BR>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;accRoleList.length;i++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightList.put(accRoleList[i],rightCodeList[i]);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：获取角色权限代码<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;返回类型：String 权限代码<BR>&nbsp;*/<BR>&nbsp;public String getRight(String accRole)<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp; if(rightList.containsKey(accRole))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String)rightList.get(accRole);<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：添加角色和代码信息<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;输入参数：String rightCode 角色权限代码 <BR>&nbsp;*&lt;br&gt;返回类型：void （无）<BR>&nbsp;*/<BR>&nbsp;public void insert(String accRole,String rightCode)<BR>&nbsp;{<BR>&nbsp;&nbsp; rightList.put(accRole,rightCode);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：删除角色权限<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;返回类型：void（无）<BR>&nbsp;*/<BR>&nbsp;public void delete(String accRole)<BR>&nbsp;{<BR>&nbsp;&nbsp; if(rightList.containsKey(accRole))<BR>&nbsp;&nbsp;&nbsp;&nbsp; rightList.remove(accRole);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：修改角色权限代码<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;输入参数：String rightCode 角色权限代码 <BR>&nbsp;*&lt;br&gt;返回类型：void（无）<BR>&nbsp;*/<BR>&nbsp;public void update(String accRole,String rightCode)<BR>&nbsp;{<BR>&nbsp;&nbsp; //this.delete(accRole);<BR>&nbsp;&nbsp; this.insert(accRole,rightCode);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印哈希表中角色和代码对应表<BR>&nbsp;*&lt;br&gt;输入参数：无<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print()<BR>&nbsp;{<BR>&nbsp;&nbsp;Enumeration RLKey = rightList.keys();<BR>&nbsp;&nbsp;while(RLKey.hasMoreElements())<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;String accRole = RLKey.nextElement().toString();<BR>&nbsp;&nbsp;&nbsp;print(accRole+"="+this.getRight(accRole));<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印信息（过载）<BR>&nbsp;*&lt;br&gt;输入参数：Object oPara 打印的信息内容<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print(Object oPara)<BR>&nbsp;{<BR>&nbsp;&nbsp;System.out.println(oPara);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法，<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp;public static void main(String[] args)<BR>&nbsp;{<BR>&nbsp;&nbsp;RoleRight RR = new RoleRight();<BR>&nbsp;&nbsp;RR.init();<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.insert("presider","10110");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.update("presider","10100");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.delete("presider");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;} <BR>&nbsp;}//end:)~</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#000000>public class RoleRight<BR>&nbsp;{<BR>&nbsp;private static Hashtable rightList = new Hashtable();<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：初始化数据<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp;public void init()<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp; String[] accRoleList = {"admin","satrap","manager","user","guest"};<BR>&nbsp;&nbsp;&nbsp; String[] rightCodeList = {"10001","10011","10021","20011","24011"};<BR>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;accRoleList.length;i++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightList.put(accRoleList[i],rightCodeList[i]);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：获取角色权限代码<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;返回类型：String 权限代码<BR>&nbsp;*/<BR>&nbsp;public String getRight(String accRole)<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp; if(rightList.containsKey(accRole))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String)rightList.get(accRole);<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：添加角色和代码信息<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;输入参数：String rightCode 角色权限代码 <BR>&nbsp;*&lt;br&gt;返回类型：void （无）<BR>&nbsp;*/<BR>&nbsp;public void insert(String accRole,String rightCode)<BR>&nbsp;{<BR>&nbsp;&nbsp; rightList.put(accRole,rightCode);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：删除角色权限<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;返回类型：void（无）<BR>&nbsp;*/<BR>&nbsp;public void delete(String accRole)<BR>&nbsp;{<BR>&nbsp;&nbsp; if(rightList.containsKey(accRole))<BR>&nbsp;&nbsp;&nbsp;&nbsp; rightList.remove(accRole);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：修改角色权限代码<BR>&nbsp;*&lt;br&gt;输入参数：String accRole 角色名称<BR>&nbsp;*&lt;br&gt;输入参数：String rightCode 角色权限代码 <BR>&nbsp;*&lt;br&gt;返回类型：void（无）<BR>&nbsp;*/<BR>&nbsp;public void update(String accRole,String rightCode)<BR>&nbsp;{<BR>&nbsp;&nbsp; //this.delete(accRole);<BR>&nbsp;&nbsp; this.insert(accRole,rightCode);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印哈希表中角色和代码对应表<BR>&nbsp;*&lt;br&gt;输入参数：无<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print()<BR>&nbsp;{<BR>&nbsp;&nbsp;Enumeration RLKey = rightList.keys();<BR>&nbsp;&nbsp;while(RLKey.hasMoreElements())<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;String accRole = RLKey.nextElement().toString();<BR>&nbsp;&nbsp;&nbsp;print(accRole+"="+this.getRight(accRole));<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：打印信息（过载）<BR>&nbsp;*&lt;br&gt;输入参数：Object oPara 打印的信息内容<BR>&nbsp;*&lt;br&gt;返回类型：无<BR>&nbsp;*/<BR>&nbsp;public void print(Object oPara)<BR>&nbsp;{<BR>&nbsp;&nbsp;System.out.println(oPara);<BR>&nbsp;}<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法，<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp;public static void main(String[] args)<BR>&nbsp;{<BR>&nbsp;&nbsp;RoleRight RR = new RoleRight();<BR>&nbsp;&nbsp;RR.init();<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.insert("presider","10110");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.update("presider","10100");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;&nbsp;RR.print("___________________________");<BR>&nbsp;&nbsp;RR.delete("presider");<BR>&nbsp;&nbsp;RR.print();<BR>&nbsp;} <BR>&nbsp;}//end:)~</FONT></P></TD></TR></TBODY></TABLE>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]006、类的继承（java100例）</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>class tree<BR>{<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：树的树根<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void root()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String sSite = "土壤中";<BR>&nbsp;&nbsp;&nbsp; String sFunction = "吸收养份";<BR>&nbsp;&nbsp;&nbsp; print("位置："+sSite);<BR>&nbsp;&nbsp;&nbsp; print("功能："+sFunction);<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：树的树干<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void bolo()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String sSite = "地面";<BR>&nbsp;&nbsp;&nbsp; String sFunction = "传递养份";<BR>&nbsp;&nbsp;&nbsp; print("位置："+sSite);<BR>&nbsp;&nbsp;&nbsp; print("功能："+sFunction);<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：树的树枝<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void branch()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String sSite = "树干上";<BR>&nbsp;&nbsp;&nbsp; String sFunction = "传递养份";<BR>&nbsp;&nbsp;&nbsp; print("位置："+sSite);<BR>&nbsp;&nbsp;&nbsp; print("功能："+sFunction);<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：树的叶子<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void leaf()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; String sSite = "树梢";<BR>&nbsp;&nbsp;&nbsp; String sFunction = "光合作用";<BR>&nbsp;&nbsp;&nbsp; String sColor = "绿色";<BR>&nbsp;&nbsp;&nbsp; print("位置："+sSite);<BR>&nbsp;&nbsp;&nbsp; print("功能："+sFunction);<BR>&nbsp;&nbsp;&nbsp; print("颜色："+sColor);<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：显示信息<BR>&nbsp;*&lt;br&gt;输入参数：Object oPara 显示的信息<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void print(Object oPara)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; System.out.println(oPara);<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public static void&nbsp; main(String[] arges)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; tree t = new tree();<BR>&nbsp;&nbsp;&nbsp; t.print("描述一棵树：");<BR>&nbsp;&nbsp;&nbsp; t.print("树根：");<BR>&nbsp;&nbsp;&nbsp; t.root();<BR>&nbsp;&nbsp;&nbsp; t.print("树干：");<BR>&nbsp;&nbsp;&nbsp; t.bolo();<BR>&nbsp;&nbsp;&nbsp; t.print("树枝：");<BR>&nbsp;&nbsp;&nbsp; t.branch();<BR>&nbsp;&nbsp;&nbsp; t.print("树叶：");<BR>&nbsp;&nbsp;&nbsp; t.leaf();<BR>&nbsp; }<BR>}<BR>/**<BR>&nbsp;* &lt;p&gt;Title: 柳树参数&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: 描述柳树的参数&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: &lt;/p&gt;<BR>&nbsp;* @author 杜江<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>class osier extends tree<BR>{<BR>&nbsp;/**<BR>&nbsp;*&lt;br&gt;方法说明：过载树的树叶<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void leaf()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; super.leaf();<BR>&nbsp;&nbsp;&nbsp; String sShape = "长形";<BR>&nbsp;&nbsp;&nbsp; super.print("形状："+sShape);<BR>&nbsp; }<BR>&nbsp; /**<BR>&nbsp;*&lt;br&gt;方法说明：扩展树的花<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public void flower()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; print("哈哈，柳树没有花！！");<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：主方法<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public static void&nbsp; main(String[] args)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; osier o = new osier();<BR>&nbsp;&nbsp;&nbsp; o.print("柳树树根：");<BR>&nbsp;&nbsp;&nbsp; o.root();<BR>&nbsp;&nbsp;&nbsp; o.print("柳树树干：");<BR>&nbsp;&nbsp;&nbsp; o.bolo();<BR>&nbsp;&nbsp;&nbsp; o.print("柳树树枝：");<BR>&nbsp;&nbsp;&nbsp; o.branch();<BR>&nbsp;&nbsp;&nbsp; o.print("柳树树叶：");<BR>&nbsp;&nbsp;&nbsp; o.leaf();<BR>&nbsp;&nbsp;&nbsp; o.print("柳树花：");<BR>&nbsp;&nbsp;&nbsp; o.flower();<BR>&nbsp; }<BR>}</FONT></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]007、接口和抽象类（java100例）</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>//接口 <BR>interface player<BR>{<BR>&nbsp;int flag = 1;<BR>&nbsp;void play();//播放<BR>&nbsp;void pause();//暂停<BR>&nbsp;void stop();//停止<BR>}//end :)</FONT></P>
<P><FONT color=#000000>//抽象类<BR>abstract class playing<BR>{<BR>&nbsp;public void display(Object oPara)<BR>&nbsp;{<BR>&nbsp;&nbsp; System.out.println(oPara);&nbsp; <BR>&nbsp;}<BR>&nbsp;abstract void winRun();<BR>}//end :)</FONT></P>
<P><FONT color=#000000>//继承了playing抽象类和实现类player接口<BR>public class newPlay extends playing implements player<BR>{<BR>&nbsp; public void play()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; display("newPlay.play()");//这里只是演示，去掉了代码。<BR>&nbsp; }<BR>&nbsp; public void pause()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; display("newPlay.pause()");//这里只是演示，去掉了代码。<BR>&nbsp; }<BR>&nbsp; public void stop()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; display("newPlay.stop()");//这里只是演示，去掉了代码。<BR>&nbsp; }<BR>&nbsp; void winRun()<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; display("newPlay.winRun()");//这里只是演示，去掉了代码。<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; newPlay p = new newPlay();<BR>&nbsp;&nbsp;&nbsp; p.play();<BR>&nbsp;&nbsp;&nbsp; p.pause();<BR>&nbsp;&nbsp;&nbsp; p.stop();<BR>&nbsp;&nbsp;&nbsp; p.winRun();<BR>&nbsp; }<BR>}//end </FONT></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]008、类的标识和访问控制（java100例）</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>package e8.com;<BR>/**<BR>&nbsp;* &lt;p&gt;Title: 标识符&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: 演示标识符对类的访问控制&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: &lt;/p&gt;<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>public class classDemo1<BR>{<BR>//公有方法<BR>&nbsp;public void mechod1()<BR>&nbsp;{<BR>&nbsp;&nbsp; System.out.println("这是一个公有的方法！任何类都可以访问。");<BR>&nbsp;}<BR>//授保护的方法<BR>&nbsp;protected void mechod2()<BR>&nbsp;{<BR>&nbsp;&nbsp; System.out.println("这是一个受到保护的方法！只有子类可以访问。");<BR>&nbsp;}<BR>//私有的方法<BR>&nbsp;private void mechod3()<BR>&nbsp;{<BR>&nbsp;&nbsp; System.out.println("这是一个私有的方法！只有类本身才可以访问。");<BR>&nbsp;}<BR>&nbsp;public static void main(String[] args){<BR>&nbsp;&nbsp; classDemo1 d = new classDemo1();<BR>&nbsp;&nbsp; d.mechod1();<BR>&nbsp;&nbsp; d.mechod2();<BR>&nbsp;&nbsp; d.mechod3();<BR>&nbsp;}&nbsp; <BR>}//end&nbsp;</FONT></P>
<P><FONT color=#000000>package e8.com;<BR>/**<BR>&nbsp;* &lt;p&gt;Title: 标识符&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: 演示标识符对类的访问控制&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: &lt;/p&gt;<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>public class classPlay<BR>{<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; classDemo1 d = new classDemo1();<BR>&nbsp;&nbsp;&nbsp; d.mechod1();<BR>&nbsp;&nbsp;&nbsp; d.mechod2();<BR>&nbsp;&nbsp;&nbsp; d.mechod3();<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT color=#000000>&nbsp;package e8.net;</FONT></P>
<P><FONT color=#000000>import e8.com.*;<BR>/**<BR>&nbsp;* &lt;p&gt;Title: 标识符&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: 演示标识符对类的访问控制&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: &lt;/p&gt;<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>public class classPlay<BR>{<BR>&nbsp; public static void main(String[] args){<BR>&nbsp;&nbsp;&nbsp; classDemo1 d = new classDemo1();<BR>&nbsp;&nbsp;&nbsp; d.mechod1();<BR>&nbsp;&nbsp;&nbsp; d.mechod2();<BR>&nbsp;&nbsp;&nbsp; d.mechod3();<BR>&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]009、异常的捕获和实现自己的异常类（java100例）</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>/**<BR>&nbsp;* &lt;p&gt;Title: 捕获异常和实现自己的异常类&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: 通过继承Exception类来实现自己的异常类。并使用try－catch来捕获这个异常。&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: &lt;/p&gt;<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>class MyException extends Exception {<BR>&nbsp; public MyException() {}<BR>&nbsp; public MyException(String msg) {<BR>&nbsp;&nbsp;&nbsp; super(msg);<BR>&nbsp; }<BR>&nbsp; public MyException(String msg, int x) {<BR>&nbsp;&nbsp;&nbsp; super(msg);<BR>&nbsp;&nbsp;&nbsp; i = x;<BR>&nbsp; }<BR>&nbsp; public int val() { return i; }<BR>&nbsp; private int i;<BR>}</FONT></P>
<P><FONT color=#000000>public class DemoException {<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：使用MyException类中默认的构造器<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public static void a() throws MyException {<BR>&nbsp;&nbsp;&nbsp; System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Throwing MyException from a()");<BR>&nbsp;&nbsp;&nbsp; throw new MyException();<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：使用MyException类中带信息的构造器<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public static void b() throws MyException {<BR>&nbsp;&nbsp;&nbsp; System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Throwing MyException from b()");<BR>&nbsp;&nbsp;&nbsp; throw new MyException("Originated in b()");<BR>&nbsp; }<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：使用了MyException中有编码的构造器<BR>&nbsp;*&lt;br&gt;输入参数：<BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public static void c() throws MyException {<BR>&nbsp;&nbsp;&nbsp; System.out.println(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Throwing MyException from c()");<BR>&nbsp;&nbsp;&nbsp; throw new MyException(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Originated in c()", 47);<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a();<BR>&nbsp;&nbsp;&nbsp; } catch(MyException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b();<BR>&nbsp;&nbsp;&nbsp; } catch(MyException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.toString();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c();<BR>&nbsp;&nbsp;&nbsp; } catch(MyException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("error code: " + e.val());<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }<BR>} //end :)</FONT></P></TD></TR></TBODY></TABLE></P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD><FONT color=#000000><STRONG>[JAVA100例]010、创建一个窗体（java100例）</STRONG></FONT></TD></TR>
<TR>
<TD>
<P><FONT color=#000000>import javax.swing.*;<BR>import java.awt.*;</FONT></P>
<P><FONT color=#000000>/**<BR>&nbsp;* &lt;p&gt;Title: 创建自己的窗体&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Description: &lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2003&lt;/p&gt;<BR>&nbsp;* &lt;p&gt;Filename: mainFrame.java&lt;/p&gt;<BR>&nbsp;* @version 1.0<BR>&nbsp;*/<BR>public class mainFrame extends JFrame<BR>{<BR>/**<BR>&nbsp;*&lt;br&gt;方法说明：构造器，通过传递参数来完成窗体的绘制。<BR>&nbsp;*&lt;br&gt;输入参数：String sTitle 窗体标题<BR>&nbsp;*&lt;br&gt;输入参数：int iWidth 窗体的宽度<BR>&nbsp;*&lt;br&gt;输入参数：int iHeight 窗体的高度 <BR>&nbsp;*&lt;br&gt;返回类型：<BR>&nbsp;*/<BR>&nbsp; public mainFrame(String sTitle,int iWidth,int iHeight)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕尺寸<BR>&nbsp;&nbsp;&nbsp; ImageIcon ii = new ImageIcon("images/middle.gif");<BR>&nbsp;&nbsp;&nbsp; setTitle(sTitle);//设置窗体标题<BR>&nbsp;&nbsp;&nbsp; setIconImage(ii.getImage());//设置窗体的图标<BR>&nbsp;&nbsp;&nbsp; setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置但关闭窗体时退出程序<BR>&nbsp;&nbsp;&nbsp; setSize(iWidth,iHeight);//设置窗体大小<BR>&nbsp;&nbsp;&nbsp; int w = getSize().width;//获取窗体宽度<BR>&nbsp;&nbsp;&nbsp; int h = getSize().height;//获取窗体高度<BR>&nbsp;&nbsp;&nbsp; System.out.println("窗体宽："+w+" 窗体高："+h);<BR>&nbsp;&nbsp;&nbsp; int x = (dim.width-w)/2;<BR>&nbsp;&nbsp;&nbsp; int y = (dim.height-h)/2;<BR>&nbsp;&nbsp;&nbsp; setLocation(x,y);//将窗体移到屏幕中间<BR>&nbsp;&nbsp;&nbsp; setVisible(true);//显示窗体<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; JFrame.setDefaultLookAndFeelDecorated(true);//使用最新的SWING外观<BR>&nbsp;&nbsp;&nbsp; mainFrame mF = new mainFrame("main Frame Demo",400,300);<BR>&nbsp; }<BR>}</FONT></P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P><img src ="http://www.blogjava.net/Apple/aggbug/6695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Apple/" target="_blank">苹果</a> 2005-06-24 21:10 <a href="http://www.blogjava.net/Apple/archive/2005/06/24/6695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>