??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲中文无码咪咪爱,亚洲精品av无码喷奶水糖心,亚洲成av人在线观看网站http://m.tkk7.com/Apple/archive/2005/08/16/10186.htmlҎҎTue, 16 Aug 2005 01:00:00 GMThttp://m.tkk7.com/Apple/archive/2005/08/16/10186.htmlhttp://m.tkk7.com/Apple/comments/10186.htmlhttp://m.tkk7.com/Apple/archive/2005/08/16/10186.html#Feedback0http://m.tkk7.com/Apple/comments/commentRss/10186.htmlhttp://m.tkk7.com/Apple/services/trackbacks/10186.htmlq篇文章对于J2EE整体上做了一个很好的概括Q?/H3>

初学者如何开发出一个高质量的J2EEpȝ

板桥里h http://www.jdon.com 2005/06/20

  J2EE学习者越来越多,J2EE本n技术不断在发展Q涌现出各种概念Q本文章试图从一U容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向?/P>

  首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一U语aQ已l代表与微Y不同的另外一个巨大阵营,所以Java有时是指一UY件系l的派Q当然目前主要是.NET和Java两大L体系?/P>

  J2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期的dBase、到Delphi/VB{C/Sl构Q发展到B/SQBrowser览?Server服务器)l构Q而J2EE主要是指B/Sl构的实现?/P>

  J2EE又是一U框架和标准Q框架类似API、库的概念,但是要超出它们。如果需要详l了解框Ӟ可先?A target=_blank>设计模式开始学习?/P>

  J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术、EJB技术和JMSQ谈到J2EE应该说最l要落实到这三个子概念上?/P>

  q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分QWeb容器也是指Jsp/Servlet容器Q你如果要开发一个Web应用Q无论是~译或运行,都必要有Jsp/Servlet库或API支持Q除了JDK/J2SE以外Q?/P>

  Web技术中除了Jsp/Servlet技术外Q还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简UCؓJsp/Servlet+JavaBeanspȝ?/P>

  谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?/P>

  JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/ServletQ调用,那么JavaBeansp行在J2EE的Web容器中;如果它被EJB调用Q它p行在EJB容器中?/P>

  EJBQ企业JavaBeansQ是普通JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?/P>

  xQJavaBeanslg发展到EJB后,q不是说以前的那UJavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB和POJOQPOJO完全不同于EJB概念Q指的是普通JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这个JavaBeans是你个应用程序单独开发创建的?/P>

  J2EE应用pȝ开发工h很多Q如JBuilder、Eclipse{,q些IDE首先是Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans或Java classQ但是如果要开发出J2EEpȝQ就要落实到要么是Web技术或EJB技术,那么有可能要一些专门模块功?如eclipse需要lomboz插g)Q最重要的是Q因为J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开发J2EE都需要指定J2EE容器?/P>

  J2EE容器分ؓWEB容器和EJB容器QTomcat/Resin是Web容器QJBoss是EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上q行Q商业品Websphere/Weblogic{和JBoss属于同一U性质?/P>

  J2EE容器也称为J2EE服务器,大部分时它们概念是一致的?/P>

  如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你的J2EE应用pȝ基本与数据库无关Q如果你在你的J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?/P>

  衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?/P>

  Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB和EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?/P>

  因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以用EJB规范实现服务层和持久层,Web技术实现表现层Q?/P>

  EJBZ么能服务层从Jsp/Servlet手中分离出来Q因为它对JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是是Jiveq样开源论坛设计原理之一?/P>

  由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普通JavaBeansQPOJOQ框?如Spring?A target=_blank>JdonFramework)以及理EJB的EJB框架Q因为EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了。 但是Q个为:标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?/P>

  q两U架构分歧也曄诞生一个新名词Q完全POJO的系l也UCؓ轻量U系l?lightweight)Q其实这个名词本w就没有一个严格定义,更多是一个吸引h的招牌,轻量是指Ҏ学习Ҏ使用吗?按照q个定义Q其实轻量Spring{系lƈ不容易学习;而且EJB 3.0Q依然叫EJBQ以后的pȝ是否可称量了呢Q?/P>

  前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans从Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?/P>

  q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q写JDBC{SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate和JDO技术;当然q有EJB中的实体Bean技术?/P>

  持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一个JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?/P>

  在所有这些J2EE技术中Q虽然SUN公司发挥了很大的作用Q不qM来说Q网l上有这样一个评PSUN的理论天下无敌;SUN的品用h撞墙Q对于初学者,特别是那些试N过或已l通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自q应用pȝ?/P>

  最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?/P>

  q要注意的是: 开发出一个高质量的J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可从UML角度l合理解?/P>

  当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单元JavaBean或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?/P>

  以上理念可以ȝZ句话Q?BR>J2EE开发三件宝: Domain ModelQ域建模Q、patternsQ模式)和frameworkQ框Ӟ?/P>

  推荐一套高质量的J2EE开源系l: JPestore



Ҏ 2005-08-16 09:00 发表评论
]]>
也说说超U女?喜欢张靓?/title><link>http://m.tkk7.com/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://m.tkk7.com/Apple/archive/2005/08/07/9515.html</guid><wfw:comment>http://m.tkk7.com/Apple/comments/9515.html</wfw:comment><comments>http://m.tkk7.com/Apple/archive/2005/08/07/9515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/Apple/comments/commentRss/9515.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/Apple/services/trackbacks/9515.html</trackback:ping><description><![CDATA[  非常喜欢靓颖,今天看到她的一个宣传片,很喜?<BR><A >http://paopaotang.yculblog.com/post.806618.html</A><A ></A><img src ="http://m.tkk7.com/Apple/aggbug/9515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Apple/" target="_blank">Ҏ</a> 2005-08-07 16:59 <a href="http://m.tkk7.com/Apple/archive/2005/08/07/9515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Swing的一点体?/title><link>http://m.tkk7.com/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://m.tkk7.com/Apple/archive/2005/08/07/9505.html</guid><wfw:comment>http://m.tkk7.com/Apple/comments/9505.html</wfw:comment><comments>http://m.tkk7.com/Apple/archive/2005/08/07/9505.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://m.tkk7.com/Apple/comments/commentRss/9505.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/Apple/services/trackbacks/9505.html</trackback:ping><description><![CDATA[     ??4日开始来上v实习已经3个星期了,目q没正式开?前期工作准备了很?而我主要是负责GUIq块,工具是Swing,所以陪伴Swing也已l快一个月的日子了.目下个星期正式启动,所以对前面的体会作个小的ȝ.<BR>    以前在inforsense公司的KDEq_上已l有一个Table Editor,点击ȝ面上含有表格数据的节?可以打开表格,然后可以对各U表D行编?增删{简单操?而同时这些操作也会反映到ȝ面上的工作流模型?现在的目标是对这个工兯一步扩展其功能,不仅融如Excel spreadsheet的功?qo,对cellq行~辑{?,q有树图与表格视图q接h,可以q行两种视图之间的拖?dnd),切换{?现在更要与化学专业结合v?本来q款软g是ؓ化学家设计的,目的使他们操作v来更方便.所以还要把扩展后的表格~辑器和Interactive Browserl合h,做到对同一l数据的多种视图,而且它们是同步的.比如表格中会有Structure(化学分子l构),分子量这L特定的域,而点d可启动特定的~辑化学分子l构的Y件进行编?同时变化反映在表格数据中.<BR>    而我接触的都是Swing,它给我的感觉虽然好象仅仅是在AWT的类前面都加上了个J,但仔l研I?里面有各U设计模式的存在,q一点让我兴奋不?正好借这个机会学习设计模?我大部分旉接触的都是JTable和JTree.所以主要谈谈他?Swing基本是就是个MVC的设计架?拿JTable来说,JTable是View的部?而TableModel是M的部?下面一点点讲讲实现的细?<BR>1.Filter(qo?:<BR>          要在表格中实现过滤的功能,而实际上不媄响原来的模型,可以考虑在原来的模型增加一个过滤器.它其实上也是一个TableModel(可以子类化TableModel的实现框架AbstractTableModel.),它把原来的TM作ؓ自己的成?M实际的操作如getColumnCount(),getRowCount(),getColumnName(){都交给原来的TM来完?调用TM的相应方?,只是在应该控制的地方控制一?比如,getValueAt(i,j)通过控制i,j来只q回qo器想昄的行或列的数?而具体的q回数据的操作还是由TM来完?对setValueAt(),isCellEditable()也是同样的道?我具体的做法是用一个List把我xC的??号保存下?在getValueAt(i,j)?i的取D围就是这个List?q其实是一UAdapter模式的思想.同样,实现Sort也可以用q种方式.<BR>2)Selection:<BR>    JTable中的选择都是由ListSelectionModel来完成的,行列都有默认的选择模型,讉K行的SelectionModel的方式是getSelectionModel(),讉K列的SelectionModel的方式是getColumnModel().getSelectionModel().你也可以实现自己的选择模型.可以通过<BR>getRowSelectionAllowed()和getColumnSelectionAllowed()获取现在行列是否可选的信息,如果都可?则在CellU别是可选的.q就是ؓ什么在行列都可选的情况?讄i行被选中setRowSelectionInterval(i),同时讄j列被选中setColumnSelectionInterval(j),q样只有(i,j)的Cell单元被选中得到原因.但是反过?如果我只想(i,j)的Cell不被选中,而仅仅靠removeColumnSelectionInterval(j)和removeRowSelectionInterval(i)是实C了的.q难道是Swing的漏z?<BR>    前面已经讲到,讄改变选择状态主要是通过行列SelectionModel的setSelectionInterval(),addSelectionInterval(),removeSelectionInterval()三个方式实现?<BR>3)header<BR>    表的?列的表头着实让我头痛了一?其是row header.我的row header是用一个JTable实现?关键是要和表格同步v?可以考虑与表格共用一个Filter,关键是改写getValueAt()和getRowCount()q两个方?q样表格qo留下的行也是表头q个JTable中所需要留下的?而选择的同步则是覆盖changeSelection()q个Ҏ实现?而操作的Ҏ是?)中提到的那几个方?讄rowHeader头只需要在JScrollPane中用setRowHeaderView()指定卛_,而表格最左上角的单元(行表头的表头)用setCorner()指定.<BR>    ColumnHeader其实在JTable中已有实?如果要通过单击列头来选择全列的话,实现的方法可通过在列头上d一个MouseListener,然后在它的MouseClickedҎ中进行选择的同?其余步骤与行在changeSelection()中的cM,有一点值得注意,要获取单ȝ列的索引是通过getTableHeader()后得到的tableHeader.columnAtPoint(e.getPoint())得到?q里e是MouseEvent,也就是这个单ȝ动作事g.<BR>具体的控制代码如?<BR>/**<BR>  * once click on the header, that column should be selected<BR>  */<BR> public void mouseClicked(MouseEvent e) {<BR>  JTableHeader header = table.getTableHeader();<BR>  TableColumnModel columns = header.getColumnModel();<BR>  if(!columns.getColumnSelectionAllowed())<BR>   return;<BR>  //get the column index being clicked<BR>  int column = header.columnAtPoint(e.getPoint());<BR>  if(column == -1)<BR>   return;<BR>  int count = table.getRowCount();<BR>  //set the entire column to be selected<BR>  if(count != 0)<BR>   table.setRowSelectionInterval(0,count-1);<BR>  ListSelectionModel selection = columns.getSelectionModel();<BR>  //if the shift modifier is pushed down, need to select multiple columns<BR>  if(e.isShiftDown()) {<BR>   int anchor = selection.getAnchorSelectionIndex();// the first index<BR>   int lead = selection.getLeadSelectionIndex();//the last index<BR>   <BR>   if(anchor != -1) {<BR>    boolean old = selection.getValueIsAdjusting();<BR>    selection.setValueIsAdjusting(true);<BR>    <BR>    boolean anchorSelected = selection.isSelectedIndex(anchor);<BR>    <BR>    if(lead != -1) {<BR>     if(anchorSelected)<BR>      selection.removeSelectionInterval(anchor,lead);<BR>     else<BR>      selection.addSelectionInterval(anchor,lead);<BR>    }<BR>    <BR>    if(anchorSelected)<BR>     selection.addSelectionInterval(anchor,column);<BR>    else <BR>     selection.removeSelectionInterval(anchor,column);<BR>    selection.setValueIsAdjusting(old);<BR>   }<BR>   else <BR>    //select single column<BR>    selection.setSelectionInterval(column,column);<BR>   }<BR>  else if(e.isControlDown()) {<BR>   if(selection.isSelectedIndex(column))<BR>    selection.removeSelectionInterval(column,column);//unselect this column<BR>   else<BR>    selection.setSelectionInterval(column,column);<BR>  }<BR>  else {<BR>    selection.setSelectionInterval(column,column);<BR>  }<BR> }<BR>4)dnd:<BR>   构造一个Transferable对象,保存传送的数据.而两方分别实现自qTransferHandler卛_.<BR>5)表示器和~辑?<BR>   如果惛_JTree中添加JCheckbox,其实只需要实现自qCellRenderer和CellEditor,在getTreeCellRendererComponent(Object value)和setTreeCellRendererComponent(Object value)中返回或讄一个JCheckBox(value.toString())卛_.value是Tree中节点node的UserObject.如果你想更改树中昄的文?比如在父节点中显C子节点的数?只需要在TreeNodecM(子类化DefaultMutableTreeNode)改写toString()Ҏ卛_.<BR>   目前的代码可以在"文g"中下?<img src ="http://m.tkk7.com/Apple/aggbug/9505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Apple/" target="_blank">Ҏ</a> 2005-08-07 12:08 <a href="http://m.tkk7.com/Apple/archive/2005/08/07/9505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz臛_q制]国际化你的应用程序(上)http://m.tkk7.com/Apple/archive/2005/08/04/9166.htmlҎҎThu, 04 Aug 2005 02:11:00 GMThttp://m.tkk7.com/Apple/archive/2005/08/04/9166.htmlhttp://m.tkk7.com/Apple/comments/9166.htmlhttp://m.tkk7.com/Apple/archive/2005/08/04/9166.html#Feedback1http://m.tkk7.com/Apple/comments/commentRss/9166.htmlhttp://m.tkk7.com/Apple/services/trackbacks/9166.html

原文地址Q?A >http://www.cnblogs.com/bjzhanghao/archive/2004/08/08/31262.aspx
        记得几年前汉化Y件一般是用二q制~辑工具在编译后的文件中查找和替换英文单词,q个q程需要用很多技巧,非常的麻烦。而现在,在开发时对应用程序进行国际化处理已经来成Z个必不可的步骤了。例如这ơ我参与?A >是给台湾客户做的Q他们要求英文和J体中文两个版本Q幸好我们用的开发工hEclipseQ利用它的国际化功能可以很方便的写在代码里的字W串提出到独立的资源文g中,q里用一个简单的例子说明一下这个过E?/P>

在Eclipse里徏立一个名为nls-test的工E(也可以国际化已有工程Q,新徏一个类NLSTestQ内容如下:

public class NLSTest {
 public NLSTest() {
  String str1
="Hello world!";
  System.out.println(str1);
 }
 public static 
void main(String[] args) {
  
new NLSTest();
 }
}

现在Q这个类的输出是在代码里写死的,如果要改变就必须修改代码然后重新~译。下面我们利用Eclipse解决q个问题。在D器(Package ExplorerQ里右键单击q个文gQ选择Source -> Externalize StringsQ就会打开一个对话框Q在q里列出了该cM未国际化的字符Ԍ见下图?/P>



? 国际化向导第一?/FONT>

单击每个字符串前面的方块可以选择对该?、进行国际化处理2、永不进行国际化处理3、这ơ不处理。我们选择要对q个字符串进行国际化处理Qƈ把它的Key修改为比较好理解的名UhelloQ注意在对话框最上方可以指定一个通用的前~Q这个g加在每个Key前面作ؓ最l写在资源文Ӟ扩展名是.propertiesQ里的Key名称。好Q按下一步l?/P>

在这里要指定properties文g的名Uͼ如果需要的话要指定一个用于从properties文g中取资源的类Q一般是XXXMessages的格式,再按下一步,会显CZ个所作更改的认列表Q确认后按Finish按钮完成向导?/P>

可以看到Eclipse为我们生成了NLSTestMessages.java和NLSTest.propertiesQ打开后者会看到里面只有q么一句:

NLSTest.hello=Hello world!

而前者NLSTestMessages的作用是Ҏ参数Key从后者取对应的字W串|看一看现在的NLSTest.javaq道了Q它的内容现在是q样的(只列出构造方法,mainҎ同上Q:

 public NLSTest() {
  String str1
=NLSTestMessages.getString("NLSTest.hello"); //$NON-NLS-1$
  System.out.println(str1);
 }

后面的注释是Eclipse自己用的Q标有这个注释的字符串在国际化将被忽略。注释中的数?表示要忽略的是该行中W一个字W串Q如果一行语句里有多个字W串被忽略,会有多个这L注释Q但数字会各不相同,像这P

 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 

好了Q现在这个类的国际化处理q完成了。要惌q个cd以根据用h在地Z同语a的结果,可以在NLSTest.properties同一目录下创建名为NLSTest_XX.properties的文Ӟ其中XX表示国家名称Q例如中国是zh_CN或tw_CNQ法国是FR{等。新创徏的文仉也要有和原来文g相同的名值对Q但值是不同语言的,NLSTestMessagescMҎ用户机器的地|D动从不同的资源文仉取|q样pC国际化的目的。要在自q机器上测试运行结果,可以在Eclipse的运行设|里面加上这L参数Q?nl tw_CNQ这样就不用费力气设|区域了?/P>

国际化的原理很简单,Eclipse提供的这个功能国际化变得更Ҏ了。不q关于国际化q有一些细节问题,包括对含参数资源的处理,字符~码处理{等Q下将对它们进行讨论?/P>

Ҏ 2005-08-04 10:11 发表评论
]]>
[转蝲至竹W炒肉]log4j学习W记(1)http://m.tkk7.com/Apple/archive/2005/07/29/8751.htmlҎҎFri, 29 Jul 2005 09:05:00 GMThttp://m.tkk7.com/Apple/archive/2005/07/29/8751.htmlhttp://m.tkk7.com/Apple/comments/8751.htmlhttp://m.tkk7.com/Apple/archive/2005/07/29/8751.html#Feedback0http://m.tkk7.com/Apple/comments/commentRss/8751.htmlhttp://m.tkk7.com/Apple/services/trackbacks/8751.htmllog4jlogo.jpg原文地址:http://www.infomall.cn/cgi-bin/mallgate/20031008/http://hedong.3322.org/archives/000193.html
说实话,除了log4j的功能外Q我更喜Ƣ它的logo.
  下面的这笔讎ͼ主要?borrow from"Log4J的随机文?Short introduction to log4j"Q由Ceki Gülcü 写于March 2002Q其它参考文档见文后?BR>

1、log4j已经被移植到C, C++, C#, Perl, Python, Ruby, Eiffel 几种语言?BR>2、log4j有三U主要的lgQ?ACRONYM title=logger>记录?/ACRONYM>,存放?/ACRONYM>,布局
3、记录器Q记录器可不兛_log数据存放的事哟)
  log4j允许E序员定义多个记录器Q每个记录器有自q名字Q记录器之间通过名字来表明隶属关p(或家族关p)。列如,记录器a.b,与记录器a.b.c之间是父子关p,而记录器a与a.b.c之间是祖先与后代的关p,父子关系是祖先与后代关系的特例。通过q种关系Q可以描qC同记录器之间的逻辑关系?BR>  有一个记录器叫根记录器,它永q存在,且不能通过名字索或引用Q可以通过Logger.getRootLogger()Ҏ取得它,而一般记录器通过Logger.getLogger(String name)Ҏ。下面是Loggercȝ基本Ҏ?

package org.apache.log4j;

public class Logger {

// Creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);

// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
public void fatal(Object message);

// generic printing method:
public void log(Level l, Object message);
}


  记录器还有一个重要的属性,是U别。(q好理解Q就象一个家庭中Q成员间存在辈䆾关系Q但不同的成员的w高可能不一P且n高与辈䆾无关Q程序员可以l不同的记录器赋以不同的U别Q如果某个成员没有被明确|p动承最q的一个有U别长辈的别倹{根记录器LU别倹{例如:
记录器名 赋予的别?/TD> l承的别?/TD>
root Proot Proot
X Px Px
X.Y none Px
X.Y.Z none Px

  E序员可以自由定义别。别g间存在偏序关p,如上面几U别就有关pDEBUG   每一条要输出的log信息Q也有一个别倹{?BR>  前面的LoggercMQ就预定义了 DEBUG, INFO, WARN, ERROR QFATAL几种U别Q由于与Ҏl定Q让人易产生误解Q其实这几个Ҏ只不q表明了要记录的log信息的别。当调用log()ҎӞlog信息的别就需要在通过参数明确指定?BR>  如果一条log信息的别,大于{于记录器的U别|那么记录器就会记录它。如果你觉得难以理解Q可参考下例?
   // get a logger instance named "com.foo"
   Logger  logger = Logger.getLogger("com.foo");

   // Now set its level. Normally you do not need to set the
   // level of a logger programmatically. This is usually done
   // in configuration files.
   logger.setLevel(Level.INFO);

   Logger barlogger = Logger.getLogger("com.foo.Bar");

   // This request is enabled, because WARN >= INFO.
   logger.warn("Low fuel level.");

   // This request is disabled, because DEBUG < INFO.
   logger.debug("Starting search for nearest gas station.");

   // The logger instance barlogger, named "com.foo.Bar",
   // will inherit its level from the logger named
   // "com.foo" Thus, the following request is enabled
   // because INFO >= INFO.
   barlogger.info("Located nearest gas station.");

   // This request is disabled, because DEBUG < INFO.
   barlogger.debug("Exiting gas station search");


  有几个有的情况Q一是当一个记录器实例化后Q再一ơ用相同的名字调用getLogger()会返回对它的引用Q这非常有利于用同一个记录器在不同代码或cM记录log信息Q另一个是与自然界中祖先先于后代出C同,一个记录器的祖先可以比后代记录出现的晚Q但会自动根据名字之间的关系建立q种家族关系?

4、存攑֙
  在log4j中,log信息通过存放器输出到目的地。支持的存放器有console, files, GUI components, remote socket servers, JMS, NT Event Loggers, remote UNIX Syslog daemons。通过file存放器,log信息可以被输出到不同的文件中Q即不同的目的地Q。log信息可被异步存放?BR>  一个记录器可以有多个存攑֙Q可以通过ҎaddAppender来增加存攑֙。一条blog信息如果可被q个记录器处理,则记录器会把q条信息送往每个它所拥有的存攑֙?BR>  每个记录器有一?ACRONYM title="additivity flag ">l承开?/ACRONYM>,其开兛_定记录器?否承其父记录器的存攑֙Q注意,如果l承则只l承其父记录器,而不考虑更远的祖先的情况。参考下表:
记录?/TD> 增加的存攑֙ l承的存攑֙ 输出的目的地 备注
root A1 not applicable A1 The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.
x A-x1, A-x2 TRUE A1, A-x1, A-x2 Appenders of "x" and root.
x.y none TRUE A1, A-x1, A-x2 Appenders of "x" and root.
x.y.z A-xyz1 TRUE A1, A-x1, A-x2, A-xyz1 Appenders in "x.y.z", "x" and root.
security A-sec FALSE A-sec No appender accumulation since the additivity flag is set to false.
security.access none TRUE A-sec Only appenders of "security" because the additivity flag in "security" is set to false.
  
  
5、布局
  布局负责格式化输出的log信息。log4j的PatternLayout可以让程序以cMC语言printf的格式化模板来定义格式?/P>

6、log4j可据E序员制定的标准自动提供一些log信息Q这寚wc需要频Jlog的对象的情况很帮助。对象的自动logQ具有承?


参考文献:
1、log4j--新的日志操作ҎQscriptskychen Qhttp://www.cn-java.com/target/news.php?news_id=2590

Ҏ 2005-07-29 17:05 发表评论
]]>
[zz臛_q制]国际化Eclipse插ghttp://m.tkk7.com/Apple/archive/2005/07/26/8472.htmlҎҎTue, 26 Jul 2005 05:38:00 GMThttp://m.tkk7.com/Apple/archive/2005/07/26/8472.htmlhttp://m.tkk7.com/Apple/comments/8472.htmlhttp://m.tkk7.com/Apple/archive/2005/07/26/8472.html#Feedback0http://m.tkk7.com/Apple/comments/commentRss/8472.htmlhttp://m.tkk7.com/Apple/services/trackbacks/8472.html转蝲地址Q?/FONT>http://www.cnblogs.com/bjzhanghao/archive/2004/08/23/36011.html

在本文的上篇里,介绍了用Eclipse的国际化工具对程序中的字W串q行外向化处理(ExtenalizeQ,可以看出步骤是十分简单的。实在是很喜ƢEclipseq样的工P它可以ؓ你做很多事情Q干净漂亮Q但l不会在未经你同意的情况下做M动作Q所谓“利器”也Q?/P>

现在说说在资源中含有参数的情冉|样处理。比如在对话框中要显CZ息:“帐L前还?900 元,截止日期?2004-9-1Q谢谢!”,因ؓ中间的数字和日期是动态的Q所以不能直接放在资源文件中。但是请攑ֿQ大可不必ؓq条信息指定三个资源Q被数字和日期分开的三个字W串Q,可以在资源文Ӟ.propertiesQ中指定资源个样子:

my.resource.key=帐户目前q有 {0} 元,截止日期?nbsp;{1}Q谢谢!

其中{0}和{1}表示替换ؓ动态的|然后在程序里写:

Float amount=;
Date dt
=;
String msg
=MessageFormat.format(Messages.getString("my.resource.key"), new Object[]{amount,dt});

q样Qmsg变量里就是动态生成的提示信息了。你很可能希望对日期q行格式化处理,要实现这个功能也很简单,只要E微修改一下资源,如下Q?/P>

帐户目前q有 {0} 元,截止日期?nbsp;{1,date,yyyy-MM-dd}Q谢谢!

实单吧Q不知道你用没用q这个写法,我是在PPP目中才W一ơ用的Q所以赶紧介l一下了Q呵c?/P>

接下来的问题是编码,资源文g写ؓ英文是没有问题的Q可以正常显C,但汉字是不能直接写在资源文g里的Q要转换为unicode才可以。jdk本n提供了native2ascii工具Q可以实现这个功能,但用命o行L不太方便Q虽然也有h很喜Ƣ用命令行的感觉……如果你愿意EclipseZ服务Q大可以使用我下面介l的两个插gQ利用它们,你根本不需要显式{换编码这一步了?/P>

W一个是Properties EditorQ好象是日本人写的,安装后它会与扩展名ؓ.properties的文件相兌Q用它打开资源文gQ可以在本地语言与unicode视图之间切换Q一般情况下~辑本地语言可以了Q保存时会自动{换ؓunicode。当需要查找某个资源(|q修Ҏq个~辑器非常方便,例如x资源里所有“你好”改为“您好”,如果面对的是一堆unicode码还真是头疼。安装这个插仉?.1.1版本以上的Eclipse?/P>

另一个我们在目中经怋用的插g叫……我q真不知道它全名叫什么,在我q里的打包文件名是?9 Localization Editor”,它是一个非常方便的国际化翻译工兗用它打开扩展名ؓ.properties的文件后Q可以新建keyQ或者新aQ你要做的只是在表格中把未译成新语言的资源值填下而已Q可以选择只显C未译的条目或是全部条目。不q很对不P我还没找到网上的下蝲地址Q如果需要请和我联系吧?/P>



? Localization Editor使用界面

好了Q关于Eclipse的国际化先介l到q里了。如果你的应用程序是Eclipse插gQ还可以更进一步:把资源文件打成语a包。关于这U方式(FragmentQ的介绍Q以后有旉再写吧?/P>

Ҏ 2005-07-26 13:38 发表评论
]]>
【{载】语义万l网服务的自动发?/title><link>http://m.tkk7.com/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://m.tkk7.com/Apple/archive/2005/06/29/6879.html</guid><wfw:comment>http://m.tkk7.com/Apple/comments/6879.html</wfw:comment><comments>http://m.tkk7.com/Apple/archive/2005/06/29/6879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/Apple/comments/commentRss/6879.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/Apple/services/trackbacks/6879.html</trackback:ping><description><![CDATA[<H2 class=diaryTitle>语义万维|服务的自动发现- -</H2> <P>    原文地址Q?A >http://meta.blogchina.com/812188.html</A>                                   <P> <P>我感兴趣的问题实际上是<FONT size=+0>Ontology based metadata services for information retrieval. </FONT>实际上是开发一个或一l智能代理,利用<FONT size=+0>Semantic Web services</FONT>架构解决异构pȝ的情报检索互操作问题。前提条件是一定的<FONT size=+0>Semantic Web services</FONT>架构。首先必dq个概念解释清楚。这是个很热门的话题了实际上Q一经典的文章见(<FONT size=+0>2001</FONT>q的文章Q稍早一些,q没?FONT size=+0>DAML-S</FONT>Q:<A ><FONT size=+0>http://www.daml.org/services/ieee01-KSL.pdf</FONT></A>Q一个作者是南人,W三作者是个中国留学生Q都很年dQ?/P> <P>以下主要来自Q?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>Q?/P> <P><FONT size=+0>Web services </FONT>利用自主的代理在分布的环境中实现自动?按需"服务Q?FONT size=+0>Semantic Web</FONT>提供服务描述和服务接口的语义支持Q目前这斚w的标准正在逐步建立hQ然而多?FONT size=+0>Web service</FONT>之间的协调和语义一致性是一个关键问题,目前<FONT size=+0>BPEL4WS </FONT>?FONT size=+0>WSCI</FONT>在这斚w作了一些探索,然而最可能的途径是通过<FONT size=+0>DAML-S</FONT>提供解决框架?/P><BR> <P>l合多个<FONT size=+0>Web services</FONT>可以分ؓ三方面的问题Q?/P> <OL> <LI>"计划"<FONT size=+0>Web</FONT>服务之间的交互以及其提供的功能如何整合; <LI> <DIV>"发现"<FONT size=+0>Web</FONT>服务实现的的dQ?/DIV> <LI> <DIV>?FONT size=+0>Web</FONT>服务之间?交互"q行有效的管理?/DIV></LI></OL> <P>q三个方面是交织在一LQ计划决定了如何d?FONT size=+0>Web</FONT>服务的类型,却依赖于<FONT size=+0>Web</FONT>服务的实现。同P<FONT size=+0>Web</FONT>服务的交互过E依赖于计划的实施,计划本n又依赖于对交互的需求?/P> <P>揭示一?FONT size=+0>Web</FONT>服务Q系l必L供对?FONT size=+0>Web</FONT>服务所能实现功能和能力的描q机Ӟq且能够识别和比较不?FONT size=+0>Web</FONT>服务的功能和能力的异同。另一个挑战是pȝq必L持对不同<FONT size=+0>Web</FONT>服务的交互的支持?/P> <P align=left>也就是说需要从语义和语法两个方面提供互操作性,而不是仅仅是目前考虑的重点——从语法上制定协议标准(例如<FONT size=+0>SOAP</FONT>?FONT size=+0>WSDL</FONT>Q利?FONT size=+0>XSD</FONT>展现消息数据的结构)。语法的互操作性仅仅提供了消息交换的结构,没有提供消息内容的解释?FONT size=+0>UDDI</FONT>仅仅是关?FONT size=+0>Web</FONT>服务的信息库Qƈ不包?FONT size=+0>Web</FONT>服务能力的揭C?FONT size=+0>WSCI</FONT>?FONT size=+0>BPEL4WS</FONT>描述了多?FONT size=+0>Web</FONT>服务可以l合在一hZ个更复杂?FONT size=+0>Web</FONT>服务Q但是其重点攑֜语法的规定上Q因此ƈ不支持自动的<FONT size=+0>Web</FONT>服务的组合?/P> <P align=left>语义互操作因此成?FONT size=+0>Web</FONT>服务协同l合的关键问题。它必须Q?/P> <OL> <LI> <DIV align=left>表达和支?FONT size=+0>Web</FONT>服务的Q务实玎ͼ例如|上卖书或者信用卡认证{)Q以侉K过对于<FONT size=+0>Web</FONT>服务功能清楚的描q和q告而实现自动发玎ͼ</DIV> <LI> <DIV align=left>表达和支持业务关pd规则Q?FONT size=+0>Business relations and rules</FONT>Q;</DIV> <LI> <DIV align=left>表达和支持消息排序(<FONT size=+0>message ordering</FONT>Q;</DIV> <LI> <DIV align=left>理解消息的语义;</DIV> <LI> <DIV align=left>表达和支持用特?FONT size=+0>Web</FONT>服务的前提条件以及激zL务的效果Q?/DIV> <LI> <DIV align=left>允许<FONT size=+0>Web</FONT>服务l合成ؓ更ؓ复杂的服务?/DIV></LI></OL> <P><FONT size=+0>Web</FONT>服务可以直接在语?FONT size=+0>Web</FONT>基础上直接徏立,后者ؓ<FONT size=+0>Web</FONT>提供了内容语义,能够被代理或者其他服务获取,代理能够通过严格定义的语义内容和规则q行推理Q由本体提供的概忉|型能够很好地解释<FONT size=+0>Web</FONT>|页的内宏V从q一Ҏ看,语义<FONT size=+0>Web</FONT>?FONT size=+0>Web</FONT>服务提供了其所需得的语义互操作的基础Q提供了形式化的语言和本体,用以支持服务描述、消息内容的理解、业务规则,q提供了不同本体之间的联pR语?FONT size=+0>Web</FONT>?FONT size=+0>Web</FONT>服务互相促进Q前者<FONT size=+0>Web</FONT>成ؓ一个庞大的数据库,后者提供机器自动用这些数据的工具?/P> <P align=left>由此可以认ؓQ?语义<FONT size=+0>Web</FONT>服务"是语义元数据、本体、Ş式化工具?FONT size=+0>Web</FONT>服务架构的集成,是基于良好定义的语言q行语义描述?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>因此Q网l计的不确定性得C最大程度的消除Q?FONT size=+0>Web</FONT>服务的发现、选择、组合、沟通、激zR监、管理、恢复和补偿都得C最大程度的自动化和实现。特别低Q语?FONT size=+0>Web</FONT>服务依赖语义<FONT size=+0>Web</FONT>描述Q?/P> <OL> <LI> <DIV align=left>消息交换的内容;</DIV> <LI> <DIV align=left>消息交换的顺序;</DIV> <LI> <DIV align=left>消息交换的状态变化?/DIV></LI></OL> <P align=left>l果Z同服务的无缝互操作提供了基础?/P> <P>利用语义<FONT size=+0>Web</FONT>描述<FONT size=+0>Web</FONT>服务有很多具体内容,包括描述<FONT size=+0>Web</FONT>服务的许多附加属性,例如服务质量、安全性约束等Q可能最重要的是?FONT size=+0>Web</FONT>服务的运行过E中的状态描qͼ包括其输入和前提条gQ以及输出和l果{,q些是对于其功能和能力描q所必需的?/P> <P style="MARGIN: 0cm 0cm 0pt">文章的第二部分讨Z<FONT size=+0>DAML-S</FONT>对于发现和激z语?FONT size=+0>Web</FONT>服务的作用,q进一步讨Z<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>注册pȝ的基上更q一步。在W四部分介绍?FONT size=+0>DAML-S</FONT>虚拟机,主要用于W二部分介绍?<FONT size=+0>DAML-S</FONT>处理模型"形式语义的处理。第五部分提供了<FONT size=+0>DAML-S</FONT>虚拟行效果的评hQ我们可以看到其q行q不频繁。第六部分描qC一个具体的利用<FONT size=+0>DAML-S</FONT>l合服务的应用。第七部分是l论?/P> <P>Q语?FONT size=+0>Web</FONT>服务囄及说明)?/P> <P>服务描述一般包括三斚w内容Q服务能力描qͼ非功能性静态参敎ͼ元数据)Q对该项服务负责的服务实体的描述?/P> <P style="MARGIN: 0cm 0cm 0pt">服务能力描述Q对于符合一定前提条件的<FONT size=+0>Web</FONT>服务输入产生一定的输出Q返回消息)Q以及其间的副品。例如一个付ҎL务需要一个日期和信用卡帐L输入Q然后判断是否符合日期和信用卡的有效性以及信用卡没有被过度用(出信用额度的透支Q的前提条gQ所产生的输出是提交用户一个满_日期h的新ȝ址Q以及从信用卡中扣除相应的服务费用,其中可能会有非功能性静态参敎ͼ元数据)参与整个q程Q例如对于新闻质量、收Ҏ准以及新ȝ别的选者和控制{?/P> <P style="MARGIN: 0cm 0cm 0pt">处理q程和服务概要提供了描述<FONT size=+0>Web</FONT>服务的两个方面:服务概要描述服务内容和能力,而处理过E描q如何实现服务。例?FONT size=+0>Amazon</FONT>?FONT size=+0>Web</FONT>服务的概要描qC该网站的售书功能Q而服务过E则必须详细描述Z实现卖书的过E,h者必首先查C所需要的书,提供支付信息Qƈ提供发货地址{?/P><img src ="http://m.tkk7.com/Apple/aggbug/6879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Apple/" target="_blank">Ҏ</a> 2005-06-29 14:52 <a href="http://m.tkk7.com/Apple/archive/2005/06/29/6879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象和集?/title><link>http://m.tkk7.com/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://m.tkk7.com/Apple/archive/2005/06/26/6720.html</guid><wfw:comment>http://m.tkk7.com/Apple/comments/6720.html</wfw:comment><comments>http://m.tkk7.com/Apple/archive/2005/06/26/6720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/Apple/comments/commentRss/6720.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/Apple/services/trackbacks/6720.html</trackback:ping><description><![CDATA[  主要有以下几个方面需要注意:<BR>1.重写equals()和hashCode()<BR>  当真正需要了解两个引用是否完全相同时Q用=Q。但是,当需要了解对象本w是否相{时Q用equals()。实际上是要比较两个不同对象?STRONG>内容</STRONG>在意义上是否{hQ除了Stringcd装器类Q已重写了equals()Q,需要重写equals().Object内的equals()的方法只使用==q算W进行比较,因此Q除非重写equals()Q否则只有当两个引用引用相同的对象时Q这两个对象才被看做是相{的。另外,如果要ɾcd象能够用作散列表的键Q或者Q何数据结构中用于搜烦?或检索对象的元素)Q则必须重写equals()Q两个不同实例能够被看做是相同的?BR>  我们一般这样重写:<BR><FONT color=#ff0000>  public</FONT> boolean equals(<FONT color=#ff0000>Object o</FONT>) {<BR>     if(<FONT color=#ff0000>o instanceof  Moof</FONT>) && ((Moof)o).getMoofValue() ==  this.moofValue)) {<BR>        return true;<BR>   } else {<BR>       return false;<BR>  }<BR>}<BR>上面执行了两个操作:<BR> 1Q确保所试对象的类型是正确的!用instanceof<BR> 2Q比较我们关心的属?BR>注意Q?equals()、hashCode()和toString()Ҏ都是公有的。下面这U重写是无效的,<BR>    class Foo {<BR>          boolean equals(Object o) { }<BR>}<BR> 一定还要注意参数类型。下面方法是对equals()Ҏ的重载,而不是重写?BR>    class Foo {<BR>       public boolean equals(Foo b) { }<BR>}<BR>一定要非常熟悉重写规则Q要能够识别cM对ObjectҎ的重写、重载还是非法重新声明。在FoocMQequals()Ҏ把参CObject修改为FooQ因此,它是一个重载方法,除非从你自己的代码(它知道这个新的不同方法,而且y被命名ؓequals)中调用,否则Q它不会被调用?BR>java API中,在equals()Ҏ内定义了一U约定。javaU定是一套应该遵守的规则Q或者说是想提供其他人所期望的“正”设计时必须要遵守的内容。有5点:<BR> 1.自反性: x.equals(x)应该q回trueQ?BR> 2.对称性:当且仅当y.equals(x)q回trueӞx.equals(yQ才q回true?BR>3.可传递?BR>4.一致?BR>5.M非空引用值xQx.equals(nullQ应该返回false.<BR>如果使用equals(Q方法,两个对象被认为是相等的,则它们必d有相同的散列码倹{因为Objectcȝ默认散列码L为每个对象生一个唯一P即重写的equals()Ҏ认ؓ两个或多个对象是相等的,也是q样。所以,Z安全赯Q?STRONG><FONT color=#ff0000>如果重写equals(),一定也要重?BR>hashCode().</FONT></STRONG><img src ="http://m.tkk7.com/Apple/aggbug/6720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Apple/" target="_blank">Ҏ</a> 2005-06-26 15:07 <a href="http://m.tkk7.com/Apple/archive/2005/06/26/6720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书笔讎ͼjava数据l构与面向对象编E基】抽象数据类容器http://m.tkk7.com/Apple/archive/2005/06/25/6706.htmlҎҎSat, 25 Jun 2005 08:31:00 GMThttp://m.tkk7.com/Apple/archive/2005/06/25/6706.htmlhttp://m.tkk7.com/Apple/comments/6706.htmlhttp://m.tkk7.com/Apple/archive/2005/06/25/6706.html#Feedback0http://m.tkk7.com/Apple/comments/commentRss/6706.htmlhttp://m.tkk7.com/Apple/services/trackbacks/6706.html        区别容器对象本n和该容器包含的对象是很重要的。从某种意义上说Q研I数据结构也是研究容器。这里,给出容器这U抽象数据类型的行ؓ框架Qƈ且创建实现这U抽象数据类型的基本原型。根据一下的Ҏ可以区别不同类型的容器Q?BR>    Q?Q容器中的对象是否可排序?/STRONG>比如Q按容器的一个承属性排序,或按容器中的对象的一个属性排序?BR>    Q?Q是否允许对象的复制Q是否允讔R复)?BR>    Q?Q容器中的对象可被限制ؓ一个特定的cd?BR>    Q?Q容器中的对象可Z索引来访问?BR>    Q?Q容器中的对象可Z相对位置来访问?BR>    Q?Q容器中的对象可ZD问?BR>    Q?Q容器可Ҏ其连通性(U性、非U性)来区别?/STRONG>
q里以Container接口为根接口来表C所有容器最一般的形式?BR>
1.1 层的Container接口
      在开发新的javacLQ我们应该先考虑是否需要可串行化。一个可串行化的对象可以很容易的从作为对象的文g中来读/写的。最一般的容器h一下特性:
    1Q不考虑它所包含的对象的cdQ?BR>    2Q所包含的对象没有排序的要求Q?BR>   3Q接受复制的对象Q?BR>   4Q支持可串行化;
   5Q接受本n为空的命令;
   6Q接受一下查询:q回所包含的对象的个数、返回容器是否ؓI?BR>我们所定义的Container接口如下Q?BR>  /** Interface Container - top level container*/
 package foundations;
 import java.io.serializable;
 public interface Container extends Serializable {
// Commands - see subinferfaces
/** Remove all objects from the container if found
*/
public void makeEmpty ();
//Queries
/** Return true if the container is empty
*/
public boolean isEmpty();
/** Return the number of objects in the container
*/
public int size();
}

1.2 最单的容器Q-堆栈和队?BR>    q里定义最单的容器Q堆栈(StackQ和队列QQueueQ?BR>    堆栈使一个容器,q具有以下特性:
 1) 堆栈是有ơ序的,q也是堆栈的一个属性,与堆栈所包含的对象无兟뀂堆栈中对象的次序依赖于其插入、删除的序。后q先出?BR> 2Q对堆栈的操作只能在一个名为top的位|上。用PushҎ在堆栈顶部增加新的对?用popҎ删除堆栈剙的对象,用topҎ查询堆栈剙的对象?BR> 3Q用MakeEmptyҎ可以清除堆栈的对象,也可用isEmpty来查询该堆栈是否为空Q以及查询堆栈的大小Qsize()Q?BR>    接口Stack是对Container的扩展,因此它承了Container所有的ҎQƈ增加了新的方?push、pop、以及查询顶部对象的Ҏ?BR>  /** Interface Stack - a first-in last-out container
 */
package foundations;
public interface Stack extends Container {
//Commands
/** Add an object onto the top of the stack
*/
public void push(object obj);

/** Remove an object form the top of the stack
* Throw NoSuchElementException if stack is empty
*/
public void pop();
//Queries

/** Return without removing, the top object on the stack
* Throw NoSuchElementException if stack is empty
*/
public object top();
}
队列也是一个容器,q具有以下特性:
1Q队列有ơ序Q这也是它的一个属性,与队列所包含的对象无兟뀂队列中对象的次序依赖于其插入、删除的序。队列中的次序关pȝ主要特点是先q先出?BR>2Q对队列的操作限制在两个位置上,即frontQ对_、rearQ队)。我们可以在N增加对象Q在头部删除对象Q或查询头部的对象?BR>3Q可以用MakeEmptyҎ可以清除队列的对象,也可用isEmpty来查询该队列是否为空Q以及查询队列的大小Qsize()Q?BR>接口Queue是对Container的扩展,因此它承了Container所有的ҎQƈ增加了新的方?add、remove、以及查询头部对象的Ҏ?BR>/** Interface Queue
*/
public interface Queue extends Container {
//Commands
/** Add an object at the rear of the queue
*/
public void add(Object obj);

/** Remove an object from the front of the queue
* Throws NoSuchElementException if queue is empty
*/
public void remove();

//Queries
/** Return without removing, the front object in the queue
* Throws NoSuchElementException if queue is empty
*/
public object front();
}

1.3 辅助性接口和c-Q?EM>ComparableQ可比性)?EM>AssociationQ关联性)
   有序容器包含了一些对象,q些对象在容器中的位|(或次序)是根据它的某个属性的重要性来军_的,更确切的_有序容器中的对象是可比较的,q个属性可以通过要求对象cL实现Comparable接口来获得。Comparable接口包含唯一一个查询方法CompareTo?BR>  查询CompareToq回一个整数倹{?BR>/** Interface Comparable
*/
public Interface Comparable {
//Queries

/** Return -1 if the receiver is less than obj,
* 0 if the receiver equals obj and
* 1 if the receiver is greater than obj
*/
public int compareTo (Object obj);
}

   cAssociation允许值和?Key)l合hQ即在键和其g间有一个关联。类Association在研I一个需要键Q|keyQvalueQ对的容器数据结构时起到什么重要的作用?BR>   在字典类容器中就包含Associationcȝ实例Q字典是由键l成的,也就是说Q我们查扑֭怸的对象时Q只是查扑֮的键。如果字典按某种序Q根据所包含的键的相对大)排列的,那么我们必须保证M输入到OrderdDictionaryQ有序字典)中的兌对的键也是可以比较的QComparableQ。同Ӟ我们要求兌也必L可串行化的,q样才能保证前面所提到的所有容器都要求是可串行化的。Association是一个类Q而不是接口?BR>/** Class Assocation
* An instance must initialize a key on creation.
* If used as a comparable Assocation,keys must be comparable and comparions is based on keys only.
* Note that equals() does not enforce the comparable feature and requires equality of both key and value.
*/
package foundations;
import java.io.serializable;

public class Association extends Object implements Comparable,Serializable {
//Fields
private Object key;
private Object value;

/** Create an instance with specified key and null value
*/
public Assocation (Object key) {
 this(key,null);
}

/** Create an instance with specified key and value
*/
public Association(Object key,Object value) {
  this.key=key;
  this.value=value;
}

/** Set the value
*/
public void setValue(Object value) {
  this.value = value;
}

/** return key
*/
public Object key() {
  return key;
}

/** return value
*/
public Object value() {
return value;
}

/**Return a string representation.
* Return a String of the form <key:value>
*/
public String toString() {
 return "<"+key+":"+value+">";
}

/** Override inherited object method equals()
*/
public boolean   equals (Object obj) {
  if(obj instanceof Assocation)]
    return (key.equals((Assocation)obj).key) && value.equals((Assocation)obj).value));
  else return false;
}

/**Implement Comparable method compareTo
* Compare based only on key; key must be comparable
*/
public int compareTo (Object obj) {
 return ((Comparable)key).compareTo((Association)obj.key());
}

/** Override inherited Object method hashCode().
*Return a unique int representing this object
*/
public int hashCode () {
  int bits1 = key.hashCode();
  int bits2 = value.hashCode();
 return (bits1 <<8)^(bits2>>8);
 }
}

未完Q待l?...


Ҏ 2005-06-25 16:31 发表评论
]]>
【zz至键行天下】java~程100?/title><link>http://m.tkk7.com/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://m.tkk7.com/Apple/archive/2005/06/24/6695.html</guid><wfw:comment>http://m.tkk7.com/Apple/comments/6695.html</wfw:comment><comments>http://m.tkk7.com/Apple/archive/2005/06/24/6695.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.tkk7.com/Apple/comments/commentRss/6695.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/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>  public static void main(String[] args) {<BR>    System.out.println("Hello Java World!");<BR>  }<BR> }</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>   public static void main(String[] arges){<BR>     int iPara1,iPara2,iEnd;<BR>     if(arges.length!=3)<BR>     {<BR>       System.out.println("USE :java flowDome parameter1 parameter2 circle");<BR>       System.out.println("parameter1 : 比较条g1Q数字类?);<BR>       System.out.println("parameter2 : 比较条g2Q数字类?);<BR>       System.out.println("circle Q@环次?);<BR>       System.out.println("ego:java flowDome 1 2 5");<BR>       return;<BR>     }else{<BR>       iPara1 = Integer.parseInt(arges[0]);<BR>       iPara2 = Integer.parseInt(arges[1]);<BR>       iEnd = Integer.parseInt(arges[2]);<BR>     }<BR>     //if语句<BR>     if(iPara2>iPara1)<BR>     {<BR>      System.out.println("if 条g满Q?);<BR>      System.out.println("W?个数比第1个数大!");<BR>     }<BR>     else<BR>     {<BR>      System.out.println("if 条g不满I");<BR>      System.out.println("W?个数比第1个数!");<BR>     }<BR>     //for循环操作<BR>     for(int i=0;i<iEnd;i++)<BR>     {<BR>       System.out.println("q是for W?+i+"ơ@?);<BR>     }<BR>     //while循环操作<BR>     int i=0;<BR>     while(i<iEnd)<BR>     {<BR>      System.out.println("q是while W?+i+"ơ@?);<BR>      i++;<BR>     }<BR>     //do-while循环操作<BR>     int j=0;<BR>     do<BR>     {<BR>      System.out.println("q是do-while W?+j+"ơ@?);<BR>      j++;<BR>     }while(j<iEnd);<BR>   }<BR> }</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、数l数据操?/STRONG></FONT></TD></TR> <TR> <TD><FONT color=#000000>public class  myArray{<BR>   //初始化数l变?BR>   char[] cNum = {'1','2','3','4','5','6','7','8','9','0'};<BR>   char[] cStr = {'a','b','c','d','e','f','g','h',<BR>                  'i','j','k','l','m','n','o','p',<BR>                  'q','r','s','t','u','v','w','x','y','z'};<BR>   int[] iMonth = {31,28,31,30,31,30,31,31,30,31,30,31};<BR>   String[] sMail = {"@","."};<BR>/**<BR> *<br>Ҏ说明Q校验电子邮?BR> *<br>输入参数QString sPara 被校验的电子邮g字符<BR> *<br>q回cdQboolean 如果校验的格式符合电子邮件格式返回trueQ否则返回false<BR> */   <BR>   public boolean isMail(String sPara){<BR>    for(int i=0;i<sMail.length;i++){<BR>      if(sPara.indexOf(sMail[i])==-1)<BR>        return false;      <BR>    }<BR>    return true;<BR>   }<BR>/**<BR> *<br>Ҏ说明Q判断是否是数字<BR> *<br>输入参数QString sPara?需要判断的字符?BR> *<br>q回cdQboolean。如果都是数字类型,q回trueQ否则返回false<BR> */   <BR>   public boolean isNumber(String sPara){<BR>     int iPLength = sPara.length();<BR>     for(int i=0;i<iPLength;i++){<BR>      char cTemp = sPara.charAt(i);<BR>      boolean bTemp = false;<BR>      for(int j=0;j<cNum.length;j++){<BR>        if(cTemp==cNum[j]){<BR>          bTemp = true;<BR>          break;<BR>        }<BR>      }<BR>      if(!bTemp) return false; <BR>     }<BR>    return true;<BR>   }<BR>/**<BR> *<br>Ҏ说明Q判断是否都是英文字W?BR> *<br>输入参数QString sPara。要查的字符<BR> *<br>q回cdQboolean。如果都是字W返回trueQ反之ؓfalse<BR> */   <BR>   public boolean isString(String sPara){<BR>     int iPLength = sPara.length();<BR>     for(int i=0;i<iPLength;i++){<BR>      char cTemp = sPara.charAt(i);<BR>      boolean bTemp = false;<BR>      for(int j=0;j<cStr.length;j++){<BR>        if(cTemp==cStr[j]){<BR>          bTemp = true;<BR>          break;<BR>        }<BR>      }<BR>      if(!bTemp) return false; <BR>     }<BR>    return true;<BR>   }<BR>/**<BR> *<br>Ҏ说明Q判断是否是闰年<BR> *<br>输入参数Qint iPara。要判断的年?BR> *<br>q回cdQboolean。如果是闰年q回trueQ否则返回false<BR> */   <BR>   public boolean chickDay(int iPara){<BR>     return iPara%100==0&&iPara%4==0;<BR>   }<BR>/**<BR> *<br>Ҏ说明Q检查日期格式是否正?BR> *<br>输入参数QString sPara。要查的日期字符<BR> *<br>q回cdQint? 日期格式正确Q?1 月或q日不合要求Q?-2 q月日格式不正确 <BR> */<BR>   public int chickData(String sPara){<BR>    boolean bTemp = false;<BR>    //所输入日期长度不正?BR>    if(sPara.length()!=10) return -2;<BR>    //获取q?BR>    String sYear = sPara.substring(0,4);<BR>    //判断q是否ؓ数字<BR>    if(!isNumber(sYear)) return -2;<BR>    //获取月䆾<BR>    String sMonth = sPara.substring(5,7);<BR>    //判断月䆾是否为数?BR>    if(!isNumber(sMonth)) return -2;<BR>    //获取?BR>    String sDay = sPara.substring(8,10);<BR>    //判断日是否ؓ数字<BR>    if(!isNumber(sDay)) return -2;<BR>    //年、月、日转换为数?BR>    int iYear = Integer.parseInt(sYear);<BR>    int iMon = Integer.parseInt(sMonth);<BR>    int iDay = Integer.parseInt(sDay);<BR>    if(iMon>12) return -1;<BR>    //闰年二月处理<BR>    if(iMon==2&&chickDay(iYear)){<BR>      if(iDay>29) return 2;<BR>    }else{<BR>      if(iDay>iMonth[iMon-1]) return -1;<BR>    }<BR>    return 0;<BR>   }<BR>/**<BR> *<br>Ҏ说明Q主ҎQ测试用<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */ <BR>   public static void main(String[] arges){<BR>     myArray mA = new myArray();<BR>     //校验邮g地址<BR>     boolean bMail = mA.isMail("</FONT><A href="mailto:tom@163.com"><FONT color=#000000>tom@163.com</FONT></A><FONT color=#000000>");<BR>     System.out.println("1 bMail is "+bMail);<BR>     bMail = mA.isMail("</FONT><A href="mailto:tom@163com"><FONT color=#000000>tom@163com</FONT></A><FONT color=#000000>");<BR>     System.out.println("2 bMail is "+bMail);<BR>     //演示是否是数?BR>     boolean bIsNum = mA.isNumber("1234");<BR>     System.out.println("1QbIsNum="+bIsNum);<BR>     bIsNum = mA.isNumber("123r4");<BR>     System.out.println("2QbIsNum="+bIsNum);<BR>     //演示是否是英文字W?BR>     boolean bIsStr = mA.isString("wer");<BR>     System.out.println("1QbIsStr="+bIsStr);<BR>     bIsStr = mA.isString("wer3");<BR>     System.out.println("2QbIsStr="+bIsStr);<BR>     //演示查日?BR>     int iIsTime = mA.chickData("2003-12-98");<BR>     System.out.println("1QiIsTime="+iIsTime);<BR>     iIsTime = mA.chickData("2003-111-08");<BR>     System.out.println("2QiIsTime="+iIsTime);<BR>     iIsTime = mA.chickData("2003-10-08");<BR>     System.out.println("3QiIsTime="+iIsTime);<BR>     iIsTime = mA.chickData("2000-02-30");<BR>     System.out.println("4QiIsTime="+iIsTime);<BR>   }<BR> }</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>*<br>Ҏ说明Q生成一?*4的二lVectorQ供使用?BR>*<br>输入参数Q?BR>*<br>输出变量QVector<BR>*<br>其它说明Q?BR>*/<BR> public Vector buildVector(){<BR>    Vector vTemps = new Vector();<BR>    for(int i=0;i<4;i++){<BR>    Vector vTemp = new Vector();<BR>    for (int j=0;j<4;j++){<BR>         vTemp.addElement("Vector("+i+")("+j+")");<BR>    }<BR>    vTemps.addElement(vTemp);<BR>    }<BR>    return vTemps;<BR> }<BR>/*<BR>*<br>Ҏ说明Q插入数?BR>*<br>输入参数QVector vTemp 待插入的数据对象<BR>*<br>输入参数Qint iTemp 插入数据的位|?BR>*<br>输入参数QObject oTemp 插入数据?BR>*<br>输出变量QVector l果<BR>*<br>其它说明Q如果插入位|超出实例实际的位置返回null<BR>*/<BR> public Vector insert(Vector vTemp,int iTemp,Object oTemp){<BR>     if(iTemp>vTemp.size()){<BR>   print("数据界!");<BR>   return null;<BR>  }else{<BR>    vTemp.insertElementAt(oTemp,iTemp);<BR>  }<BR>  return vTemp;<BR> }<BR>/*<BR>*<br>Ҏ说明Q移除数?BR>*<br>输入参数QVector vTemp 待删除矢量对?BR>*<br>输入参数Qint iTemp 删除数据的位|?BR>*<br>输出变量QVector<BR>*<br>其它说明Q如果删除超界的数据Q将q回null<BR>*/<BR> public Vector delete(Vector vTemp,int iTemp){<BR>     if(iTemp>vTemp.size()){<BR>   print("数据界!");<BR>   return null;<BR>  }else{<BR>    vTemp.removeElementAt(iTemp);<BR>  }<BR>  return vTemp;<BR> }<BR>/*<BR>*<br>Ҏ说明Q修Ҏ?BR>*<br>输入参数QVector vTemp 待修改矢量对?BR>*<br>输入参数Qint iTemp 修改数据的位|?BR>*<br>输入参数QObject oTemp 修改数据?BR>*<br>输出变量QVector<BR>*<br>其它说明Q如果修改位|超界的数据Q将q回null<BR>*/<BR> public Vector updata(Vector vTemp,int iTemp,Object oTemp){<BR>     if(iTemp>vTemp.size()){<BR>   print("数据界!");<BR>   return null;<BR>  }else{<BR>    vTemp.setElementAt(oTemp,iTemp);<BR>  }<BR>  return vTemp;<BR> }<BR>/*<BR>*<br>Ҏ说明Q输Z?BR>*<br>输入参数QString sTemp 输出信息名称<BR>*<br>输入参数QObject oTemp 输出信息?BR>*<br>q回变量Q无<BR>*/<BR> public void print(String sTemp,Vector oTemp){<BR>     System.out.println(sTemp+"数据Q?);<BR>     this.print(oTemp);<BR> }<BR>/**<BR> *<br>Ҏ说明Q打印输出(q蝲Q?BR> *<br>输入参数QObject oPara 输出的对?BR> *<br>q回cdQ无<BR> */<BR> public void print(Object oPara){<BR>     System.out.println(oPara);<BR> }<BR>/**<BR> *<br>Ҏ说明Q打印输出(q蝲Q?BR> *<br>输入参数QVector vPara 昄输出矢量对象<BR> *<br>q回cdQ无<BR> */<BR> public void print(Vector vPara){<BR>    for(int i=0;i<vPara.size();i++){<BR>     System.out.println(vPara.elementAt(i));<BR>    }<BR> }<BR>/**<BR> *<br>Ҏ说明Q主ҎQ程序入?BR> *<br>输入参数QString[] args<BR> *<br>q回cdQ无<BR> */<BR> public static void main(String[] args) <BR> {<BR>  operateVector ov = new operateVector();<BR>  Vector vTemp = ov.buildVector();<BR>  ov.print("vTemp0",vTemp);<BR>  Vector vResult = ov.insert(vTemp,2,"d的数?);<BR>  ov.print("vResult",vResult);<BR>        Vector vResultup = ov.updata(vResult,2,"修改的数?);<BR>  ov.print("vResultmp",vResultup);<BR>        Vector vResultnow = ov.delete(vResultup,2);<BR>  ov.print("vResultnow",vResultnow);<BR> }<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> {<BR> private static Hashtable rightList = new Hashtable();<BR>/**<BR> *<br>Ҏ说明Q初始化数据<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR> public void init()<BR> {<BR>    String[] accRoleList = {"admin","satrap","manager","user","guest"};<BR>    String[] rightCodeList = {"10001","10011","10021","20011","24011"};<BR>    for(int i=0;i<accRoleList.length;i++)<BR>    {<BR>      rightList.put(accRoleList[i],rightCodeList[i]);<BR>    }<BR> }<BR>/**<BR> *<br>Ҏ说明Q获取角色权限代?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>q回cdQString 权限代码<BR> */<BR> public String getRight(String accRole)<BR> {<BR>    if(rightList.containsKey(accRole))<BR>      return (String)rightList.get(accRole);<BR>    else<BR>      return null;<BR> }<BR>/**<BR> *<br>Ҏ说明Q添加角色和代码信息<BR> *<br>输入参数QString accRole 角色名称<BR> *<br>输入参数QString rightCode 角色权限代码 <BR> *<br>q回cdQvoid Q无Q?BR> */<BR> public void insert(String accRole,String rightCode)<BR> {<BR>   rightList.put(accRole,rightCode);<BR> }<BR>/**<BR> *<br>Ҏ说明Q删除角色权?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>q回cdQvoidQ无Q?BR> */<BR> public void delete(String accRole)<BR> {<BR>   if(rightList.containsKey(accRole))<BR>     rightList.remove(accRole);<BR> }<BR>/**<BR> *<br>Ҏ说明Q修改角色权限代?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>输入参数QString rightCode 角色权限代码 <BR> *<br>q回cdQvoidQ无Q?BR> */<BR> public void update(String accRole,String rightCode)<BR> {<BR>   //this.delete(accRole);<BR>   this.insert(accRole,rightCode);<BR> }<BR>/**<BR> *<br>Ҏ说明Q打印哈希表中角色和代码对应?BR> *<br>输入参数Q无<BR> *<br>q回cdQ无<BR> */<BR> public void print()<BR> {<BR>  Enumeration RLKey = rightList.keys();<BR>  while(RLKey.hasMoreElements())<BR>  {<BR>   String accRole = RLKey.nextElement().toString();<BR>   print(accRole+"="+this.getRight(accRole));<BR>  }<BR> }<BR>/**<BR> *<br>Ҏ说明Q打C息(q蝲Q?BR> *<br>输入参数QObject oPara 打印的信息内?BR> *<br>q回cdQ无<BR> */<BR> public void print(Object oPara)<BR> {<BR>  System.out.println(oPara);<BR> }<BR>/**<BR> *<br>Ҏ说明Q主ҎQ?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR> public static void main(String[] args)<BR> {<BR>  RoleRight RR = new RoleRight();<BR>  RR.init();<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.insert("presider","10110");<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.update("presider","10100");<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.delete("presider");<BR>  RR.print();<BR> } <BR> }//end:)~</FONT></TD></TR></TBODY></TABLE><BR><FONT color=#000000>public class RoleRight<BR> {<BR> private static Hashtable rightList = new Hashtable();<BR>/**<BR> *<br>Ҏ说明Q初始化数据<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR> public void init()<BR> {<BR>    String[] accRoleList = {"admin","satrap","manager","user","guest"};<BR>    String[] rightCodeList = {"10001","10011","10021","20011","24011"};<BR>    for(int i=0;i<accRoleList.length;i++)<BR>    {<BR>      rightList.put(accRoleList[i],rightCodeList[i]);<BR>    }<BR> }<BR>/**<BR> *<br>Ҏ说明Q获取角色权限代?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>q回cdQString 权限代码<BR> */<BR> public String getRight(String accRole)<BR> {<BR>    if(rightList.containsKey(accRole))<BR>      return (String)rightList.get(accRole);<BR>    else<BR>      return null;<BR> }<BR>/**<BR> *<br>Ҏ说明Q添加角色和代码信息<BR> *<br>输入参数QString accRole 角色名称<BR> *<br>输入参数QString rightCode 角色权限代码 <BR> *<br>q回cdQvoid Q无Q?BR> */<BR> public void insert(String accRole,String rightCode)<BR> {<BR>   rightList.put(accRole,rightCode);<BR> }<BR>/**<BR> *<br>Ҏ说明Q删除角色权?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>q回cdQvoidQ无Q?BR> */<BR> public void delete(String accRole)<BR> {<BR>   if(rightList.containsKey(accRole))<BR>     rightList.remove(accRole);<BR> }<BR>/**<BR> *<br>Ҏ说明Q修改角色权限代?BR> *<br>输入参数QString accRole 角色名称<BR> *<br>输入参数QString rightCode 角色权限代码 <BR> *<br>q回cdQvoidQ无Q?BR> */<BR> public void update(String accRole,String rightCode)<BR> {<BR>   //this.delete(accRole);<BR>   this.insert(accRole,rightCode);<BR> }<BR>/**<BR> *<br>Ҏ说明Q打印哈希表中角色和代码对应?BR> *<br>输入参数Q无<BR> *<br>q回cdQ无<BR> */<BR> public void print()<BR> {<BR>  Enumeration RLKey = rightList.keys();<BR>  while(RLKey.hasMoreElements())<BR>  {<BR>   String accRole = RLKey.nextElement().toString();<BR>   print(accRole+"="+this.getRight(accRole));<BR>  }<BR> }<BR>/**<BR> *<br>Ҏ说明Q打C息(q蝲Q?BR> *<br>输入参数QObject oPara 打印的信息内?BR> *<br>q回cdQ无<BR> */<BR> public void print(Object oPara)<BR> {<BR>  System.out.println(oPara);<BR> }<BR>/**<BR> *<br>Ҏ说明Q主ҎQ?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR> public static void main(String[] args)<BR> {<BR>  RoleRight RR = new RoleRight();<BR>  RR.init();<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.insert("presider","10110");<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.update("presider","10100");<BR>  RR.print();<BR>  RR.print("___________________________");<BR>  RR.delete("presider");<BR>  RR.print();<BR> } <BR> }//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> *<br>Ҏ说明Q树的树?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void root()<BR>  {<BR>    String sSite = "土壤?;<BR>    String sFunction = "吸收M";<BR>    print("位置Q?+sSite);<BR>    print("功能Q?+sFunction);<BR>  }<BR>/**<BR> *<br>Ҏ说明Q树的树q?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void bolo()<BR>  {<BR>    String sSite = "地面";<BR>    String sFunction = "传递养?;<BR>    print("位置Q?+sSite);<BR>    print("功能Q?+sFunction);<BR>  }<BR>/**<BR> *<br>Ҏ说明Q树的树?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void branch()<BR>  {<BR>    String sSite = "树干?;<BR>    String sFunction = "传递养?;<BR>    print("位置Q?+sSite);<BR>    print("功能Q?+sFunction);<BR>  }<BR>/**<BR> *<br>Ҏ说明Q树的叶?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void leaf()<BR>  {<BR>    String sSite = "树梢";<BR>    String sFunction = "光合作用";<BR>    String sColor = "l色";<BR>    print("位置Q?+sSite);<BR>    print("功能Q?+sFunction);<BR>    print("颜色Q?+sColor);<BR>  }<BR>/**<BR> *<br>Ҏ说明Q显CZ?BR> *<br>输入参数QObject oPara 昄的信?BR> *<br>q回cdQ?BR> */<BR>  public void print(Object oPara)<BR>  {<BR>    System.out.println(oPara);<BR>  }<BR>/**<BR> *<br>Ҏ说明Q主Ҏ<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public static void  main(String[] arges)<BR>  {<BR>    tree t = new tree();<BR>    t.print("描述一|Q?);<BR>    t.print("树根Q?);<BR>    t.root();<BR>    t.print("树干Q?);<BR>    t.bolo();<BR>    t.print("树枝Q?);<BR>    t.branch();<BR>    t.print("树叶Q?);<BR>    t.leaf();<BR>  }<BR>}<BR>/**<BR> * <p>Title: x参数</p><BR> * <p>Description: 描述x的参?lt;/p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: </p><BR> * @author 杜江<BR> * @version 1.0<BR> */<BR>class osier extends tree<BR>{<BR> /**<BR> *<br>Ҏ说明Q过载树的树?BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void leaf()<BR>  {<BR>    super.leaf();<BR>    String sShape = "长Ş";<BR>    super.print("形状Q?+sShape);<BR>  }<BR>  /**<BR> *<br>Ҏ说明Q扩展树的花<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public void flower()<BR>  {<BR>    print("哈哈Q柳树没有花Q!");<BR>  }<BR>/**<BR> *<br>Ҏ说明Q主Ҏ<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public static void  main(String[] args)<BR>  {<BR>    osier o = new osier();<BR>    o.print("x树根Q?);<BR>    o.root();<BR>    o.print("x树干Q?);<BR>    o.bolo();<BR>    o.print("x树枝Q?);<BR>    o.branch();<BR>    o.print("x树叶Q?);<BR>    o.leaf();<BR>    o.print("x花:");<BR>    o.flower();<BR>  }<BR>}</FONT></P> <P> <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> <TBODY> <TR> <TD><FONT color=#000000><STRONG>[JAVA100例]007、接口和抽象c(java100例)</STRONG></FONT></TD></TR> <TR> <TD> <P><FONT color=#000000>//接口 <BR>interface player<BR>{<BR> int flag = 1;<BR> void play();//播放<BR> void pause();//暂停<BR> void stop();//停止<BR>}//end :)</FONT></P> <P><FONT color=#000000>//抽象c?BR>abstract class playing<BR>{<BR> public void display(Object oPara)<BR> {<BR>   System.out.println(oPara);  <BR> }<BR> abstract void winRun();<BR>}//end :)</FONT></P> <P><FONT color=#000000>//l承了playing抽象cd实现cplayer接口<BR>public class newPlay extends playing implements player<BR>{<BR>  public void play()<BR>  {<BR>    display("newPlay.play()");//q里只是演示Q去掉了代码?BR>  }<BR>  public void pause()<BR>  {<BR>     display("newPlay.pause()");//q里只是演示Q去掉了代码?BR>  }<BR>  public void stop()<BR>  {<BR>    display("newPlay.stop()");//q里只是演示Q去掉了代码?BR>  }<BR>  void winRun()<BR>  {<BR>    display("newPlay.winRun()");//q里只是演示Q去掉了代码?BR>  }<BR>  public static void main(String[] args)<BR>  {<BR>    newPlay p = new newPlay();<BR>    p.play();<BR>    p.pause();<BR>    p.stop();<BR>    p.winRun();<BR>  }<BR>}//end </FONT></P> <P> <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> <TBODY> <TR> <TD><FONT color=#000000><STRONG>[JAVA100例]008、类的标识和讉K控制Qjava100例)</STRONG></FONT></TD></TR> <TR> <TD> <P><FONT color=#000000>package e8.com;<BR>/**<BR> * <p>Title: 标识W?lt;/p><BR> * <p>Description: 演示标识W对cȝ讉K控制</p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: </p><BR> * @version 1.0<BR> */<BR>public class classDemo1<BR>{<BR>//公有Ҏ<BR> public void mechod1()<BR> {<BR>   System.out.println("q是一个公有的ҎQQ何类都可以访问?);<BR> }<BR>//授保护的Ҏ<BR> protected void mechod2()<BR> {<BR>   System.out.println("q是一个受C护的ҎQ只有子cd以访问?);<BR> }<BR>//U有的方?BR> private void mechod3()<BR> {<BR>   System.out.println("q是一个私有的ҎQ只有类本n才可以访问?);<BR> }<BR> public static void main(String[] args){<BR>   classDemo1 d = new classDemo1();<BR>   d.mechod1();<BR>   d.mechod2();<BR>   d.mechod3();<BR> }  <BR>}//end </FONT></P> <P><FONT color=#000000>package e8.com;<BR>/**<BR> * <p>Title: 标识W?lt;/p><BR> * <p>Description: 演示标识W对cȝ讉K控制</p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: </p><BR> * @version 1.0<BR> */<BR>public class classPlay<BR>{<BR>  public static void main(String[] args){<BR>    classDemo1 d = new classDemo1();<BR>    d.mechod1();<BR>    d.mechod2();<BR>    d.mechod3();<BR>  }<BR>}</FONT></P> <P><FONT color=#000000> package e8.net;</FONT></P> <P><FONT color=#000000>import e8.com.*;<BR>/**<BR> * <p>Title: 标识W?lt;/p><BR> * <p>Description: 演示标识W对cȝ讉K控制</p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: </p><BR> * @version 1.0<BR> */<BR>public class classPlay<BR>{<BR>  public static void main(String[] args){<BR>    classDemo1 d = new classDemo1();<BR>    d.mechod1();<BR>    d.mechod2();<BR>    d.mechod3();<BR>  }<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、异常的捕获和实现自q异常c(java100例)</STRONG></FONT></TD></TR> <TR> <TD> <P><FONT color=#000000>/**<BR> * <p>Title: 捕获异常和实现自q异常c?lt;/p><BR> * <p>Description: 通过l承ExceptioncL实现自己的异常类。ƈ使用tryQcatch来捕莯个异常?lt;/p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: </p><BR> * @version 1.0<BR> */<BR>class MyException extends Exception {<BR>  public MyException() {}<BR>  public MyException(String msg) {<BR>    super(msg);<BR>  }<BR>  public MyException(String msg, int x) {<BR>    super(msg);<BR>    i = x;<BR>  }<BR>  public int val() { return i; }<BR>  private int i;<BR>}</FONT></P> <P><FONT color=#000000>public class DemoException {<BR>/**<BR> *<br>Ҏ说明Q用MyExceptioncM默认的构造器<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public static void a() throws MyException {<BR>    System.out.println(<BR>      "Throwing MyException from a()");<BR>    throw new MyException();<BR>  }<BR>/**<BR> *<br>Ҏ说明Q用MyExceptioncM带信息的构造器<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public static void b() throws MyException {<BR>    System.out.println(<BR>      "Throwing MyException from b()");<BR>    throw new MyException("Originated in b()");<BR>  }<BR>/**<BR> *<br>Ҏ说明Q用了MyException中有~码的构造器<BR> *<br>输入参数Q?BR> *<br>q回cdQ?BR> */<BR>  public static void c() throws MyException {<BR>    System.out.println(<BR>      "Throwing MyException from c()");<BR>    throw new MyException(<BR>      "Originated in c()", 47);<BR>  }<BR>  public static void main(String[] args) {<BR>    try {<BR>      a();<BR>    } catch(MyException e) {<BR>      e.getMessage();<BR>    }<BR>    try {<BR>      b();<BR>    } catch(MyException e) {<BR>      e.toString();<BR>    }<BR>    try {<BR>      c();<BR>    } catch(MyException e) {<BR>      e.printStackTrace();<BR>      System.out.println("error code: " + e.val());<BR>    }<BR>  }<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、创Z个窗体(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> * <p>Title: 创徏自己的窗?lt;/p><BR> * <p>Description: </p><BR> * <p>Copyright: Copyright (c) 2003</p><BR> * <p>Filename: mainFrame.java</p><BR> * @version 1.0<BR> */<BR>public class mainFrame extends JFrame<BR>{<BR>/**<BR> *<br>Ҏ说明Q构造器Q通过传递参数来完成H体的绘制?BR> *<br>输入参数QString sTitle H体标题<BR> *<br>输入参数Qint iWidth H体的宽?BR> *<br>输入参数Qint iHeight H体的高?<BR> *<br>q回cdQ?BR> */<BR>  public mainFrame(String sTitle,int iWidth,int iHeight)<BR>  {<BR>    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕寸<BR>    ImageIcon ii = new ImageIcon("images/middle.gif");<BR>    setTitle(sTitle);//讄H体标题<BR>    setIconImage(ii.getImage());//讄H体的图?BR>    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//讄但关闭窗体时退出程?BR>    setSize(iWidth,iHeight);//讄H体大小<BR>    int w = getSize().width;//获取H体宽度<BR>    int h = getSize().height;//获取H体高度<BR>    System.out.println("H体宽:"+w+" H体高:"+h);<BR>    int x = (dim.width-w)/2;<BR>    int y = (dim.height-h)/2;<BR>    setLocation(x,y);//窗体移到屏q中?BR>    setVisible(true);//昄H体<BR>  }<BR>  public static void main(String[] args)<BR>  {<BR>    JFrame.setDefaultLookAndFeelDecorated(true);//使用最新的SWING外观<BR>    mainFrame mF = new mainFrame("main Frame Demo",400,300);<BR>  }<BR>}</FONT></P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P><img src ="http://m.tkk7.com/Apple/aggbug/6695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/Apple/" target="_blank">Ҏ</a> 2005-06-24 21:10 <a href="http://m.tkk7.com/Apple/archive/2005/06/24/6695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://sdsupuchem.com" target="_blank">Ƶ˻վƵ</a>| <a href="http://thinkchating.com" target="_blank">ѨƬ߹ۿͬѧ </a>| <a href="http://xsdggzs.com" target="_blank">Ʒ鶹123</a>| <a href="http://600c20.com" target="_blank">ȫƵ߹ۿ</a>| <a href="http://gg596gg.com" target="_blank">޾ƷһƷƷƷ</a>| <a href="http://onisterwines.com" target="_blank">޳AVƬþ</a>| <a href="http://bdgxhome.com" target="_blank">ƷŮٸavѾþ</a>| <a href="http://www16am8.com" target="_blank">޹ۺ91Ʒ鶹</a>| <a href="http://666za.com" target="_blank">ŮպѲ</a>| <a href="http://831055.com" target="_blank">޾ƷҳĻ</a>| <a href="http://h47h.com" target="_blank">Ƭѿڵ</a>| <a href="http://k67m.com" target="_blank">츾͵ŷ</a>| <a href="http://tlyihong.com" target="_blank">˳ƵƵ</a>| <a href="http://4466n.com" target="_blank">޾ƷĻ</a>| <a href="http://szgreater.com" target="_blank">Ʒһģʽ </a>| <a href="http://xiaomaomi8.com" target="_blank">Ƶѹۿ97 </a>| <a href="http://cswsfz.com" target="_blank">Ұ߹ۿƵ </a>| <a href="http://jsjumei.com" target="_blank">ƬվAëƬ</a>| <a href="http://dstbxg.com" target="_blank">޹Ʒþ</a>| <a href="http://xyjxnhcl.com" target="_blank">AVƬ߲</a>| <a href="http://nnlxl.com" target="_blank">þþþþþþ뾫Ʒպ</a>| <a href="http://9ytx.com" target="_blank">AëƬ</a>| <a href="http://yw756.com" target="_blank">2018av</a>| <a href="http://gkhnf.com" target="_blank">ƷŮ߹ۿ</a>| <a href="http://ttvv77.com" target="_blank">˳߹ۿվ</a>| <a href="http://wanguoshan.com" target="_blank">ѲƵ</a>| <a href="http://2255325.com" target="_blank">ĻþþƷVA</a>| <a href="http://zhnetbar.com" target="_blank">ø߹ۿ</a>| <a href="http://zp0533.com" target="_blank">þø߳һëƬ</a>| <a href="http://www003924.com" target="_blank">ѿ߾Ʒһ</a>| <a href="http://xiamenwave.com" target="_blank">һѹ</a>| <a href="http://www827556.com" target="_blank">þ޾ƷƷ</a>| <a href="http://wkk3.com" target="_blank">ɫƷһ234</a>| <a href="http://www282pp.com" target="_blank">˾޾ƷӰԺ߹ۿ</a>| <a href="http://worldbiao.com" target="_blank">þþþavӰ</a>| <a href="http://grjeans.com" target="_blank">ŮպѲ</a>| <a href="http://www999973.com" target="_blank">޹ҹƷƬ߲</a>| <a href="http://ryhjled.com" target="_blank">߹ۿһ</a>| <a href="http://by9277.com" target="_blank">99þþùƷ޿</a>| <a href="http://4001120002.com" target="_blank">ƴƬ30ѿ</a>| <a href="http://www-92109.com" target="_blank">ղһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>