仓酷云

标题: JAVA网页编程之JavaBeans教程 [打印本页]

作者: 冷月葬花魂    时间: 2015-1-18 11:43
标题: JAVA网页编程之JavaBeans教程
ruby里有这些工具吗?又要简单多少?我没有用过这两门语言,我估计在这些语言力没有很统一的这种标准,或者根本就没有提供。教程JavaBean的属性

JavaBean的属性与一样平常Java程序中所指的属性,大概说与一切面向对象的程序计划言语中对象的属性是一个观点,在程序中的详细表现就是类中的变量。在JavaBean计划中,依照属性的分歧感化又细分为四类:Simple,Index,Bound与Constrained属性。

3.1.1Simple属性

一个复杂属性暗示一个陪伴有一对get/set办法(C言语的历程或函数在Java程序中称为"办法")的变量。属性名与和该属性相干的get/set办法名对应。比方:假如有setX和getX办法,则暗指有一个名为"X"的属性。假如有一个办法名为isX,则一般暗指"X"是一个布尔属性(即X的值为true或false)。比方鄙人面这个程序中:


publicclassalden1extendsCanvas{
stringourString="Hello";//属性名为ourString,范例为字符串
publicalden1(){    //alden1()是alden1的机关函数,与C++中机关函数的意义不异
setBackground(Color.red);
setForeground(Color.blue);
}
/*"set"属性*/
publicvoidsetString(StringnewString){
ourString=newString;
}
/*"get"属性*/
publicStringgetString(){
returnourString;
}
}

3.1.2Indexed属性

一个Indexed属性暗示一个数组值。利用与该属性对应的set/get办法可获得数组中的数值。该属性也可一次设置或获得全部数组的值。例:


publicclassalden2extendsCanvas{
int[]dataSet={1,2,3,4,5,6};//dataSet是一个indexed属性
publicalden2(){
setBackground(Color.red);
setForeground(Color.blue);
}
/*设置全部数组 */
publicvoidsetDataSet(int[]x){
dataSet=x;
}
/*设置数组中的单个元素值*/
publicvoidsetDataSet(intindex,intx){
dataSet[index]=x;
}
/*获得全部数组值*/
publicint[]getDataSet(){
returndataSet;
}
/*获得数组中的指定元素值*/
publicintgetDataSet(intx){
returndataSet[x];
}
}

3.1.3Bound属性

一个Bound属性是指当该种属性的值产生变更时,要关照别的的对象。每次属性值改动时,这类属性就焚烧一个PropertyChange事务(在Java程序中,事务也是一个对象)。事务中封装了属性名、属性的原值、属性变更后的新值。这类事务是传送到别的的Bean,至于吸收事务的Bean应做甚么举措由其本人界说。



.1是一个复杂Bound属性表示图,当PushButton的background属性与Dialog的background属性bind时,若PushButton的background属性产生变更时,Dialog的background属性也产生一样的变更。例:


publicclassalden3extendsCanvas{
StringourString="Hello";//ourString是一个bound属性
privatePropertyChangeSupportchanges=newPropertyChangeSupport(this);
/**注:Java是纯面向对象的言语,假如要利用某种办法则必需指明是要利用哪一个对象的办法,鄙人面的程序中要举行焚烧事务的操纵,这类操纵所利用的办法是在PropertyChangeSupport类中的。以是下面声明并实例化了一个changes对象,鄙人面将利用changes的firePropertyChange办法来焚烧ourString的属性改动事务。*/

publicvoidsetString(stringnewString){
StringoldString=ourString;
ourString=newString;
/*ourString的属性值已产生变更,因而接着焚烧属性改动事务*/
changes.firePropertyChange("ourString",oldString,newString);
}
publicStringgetString(){
returnourString;
}
/**以下代码是为开辟工具所利用的。我们不克不及预知alden3将与哪些别的的Bean组分解为一个使用,没法预知若alden3的ourString属性产生变更时有哪些别的的组件与此变更有关,因此alden3这个Bean要预留出一些接口给开辟工具,开辟工具利用这些接口,把别的的JavaBean对象与alden3挂接。*/

publicvoidaddPropertyChangeListener(PropertyChangeLisenerl){
changes.addPropertyChangeListener(l);
}
publicvoidremovePropertyChangeListener(PropertyChangeListenerl){
changes.removePropertyChangeListener(l);
}

经由过程下面的代码,开辟工具挪用changes的addPropertyChangeListener办法把别的JavaBean注册进ourString属性的监听者行列l中,l是一个Vector数组,可存储任何Java对象。开辟工具也可以使用changes的removePropertyChangeListener办法,从l中刊出指定的对象,使alden3的ourString属性的改动不再与这个对象有关。固然,当程序员手写代码体例程序时,也可间接挪用这两个办法,把别的Java对象与alden3挂接。
3.1.4Constrained属性

一个JavaBean的constrained属性,是指当这个属性的值要产生变更时,与这个属性已创建了某种毗连的别的Java对象能否决属性值的改动。constrained属性的监听者经由过程抛出PropertyVetoException来制止该属性值的改动。历程如.2



例:上面程序中的constrained属性是PriceInCents。


publicclassJellyBeanextendsCanvas{
privatePropertyChangeSupportchanges=newPropertyChangeSupport(this);
privateVetoableChangeSupportVetos=newVetoableChangeSupport(this);
/*与前述changes不异,可以使用VetoableChangeSupport对象的实例Vetos中的办法,在特定前提上去制止PriceInCents值的改动。*/


......
publicvoidsetPriceInCents(intnewPriceInCents)throwsPropertyVetoException{
/* 办法名中throwsPropertyVetoException的感化是当有别的Java对象反对PriceInCents的改动时,要抛出破例。*//*先保留本来的属性值*/

intoldPriceInCents=ourPriceInCents;
/**焚烧属性改动反对事务*/
vetos.fireVetoableChange("priceInCents",newInteger(OldPriceInCents),newInteger(newPriceInCents));

/**如有别的对象反对priceInCents的改动,则程序抛出破例,不再持续实行上面的两条语句,办法停止。若无别的对象反对priceInCents的改动,则鄙人面的代码中把ourPriceIncents付与新值,并焚烧属性改动事务*/

ourPriceInCents=newPriceInCents;
changes.firePropertyChange("priceInCents",newInteger(oldPriceInCents),newInteger(newPriceInCents));
}

/**与前述changes不异,也要为PriceInCents属性预留接口,使别的对象可注册进PriceInCents反对改动监听者行列中,或把该对象从中刊出

publicvoidaddVetoableChangeListener(VetoableChangeListenerl)
{vetos.addVetoableChangeListener(l);
}
publicvoidremoveVetoableChangeListener(VetoableChangeListenerl){
vetos.removeVetoableChangeListener(l);
}
......
}
从下面的例子中可看到,一个constrained属性有两种监听者:属性变更监听者和反对属性改动的监听者。反对属性改动的监听者在本人的对象代码中有响应的把持语句,在监听到有constrained属性要产生变更时,在把持语句中判别是不是应反对这个属性值的改动。
总之,某个Bean的constrained属性值能否改动取决于别的的Bean大概是Java对象是不是同意这类改动。同意与否的前提由别的的Bean或Java对象在本人的类中举行界说。



JavaBean的事务
事务处置是JavaBean系统布局的中心之一。经由过程事务处置机制,可以让一些组件作为事务源,收回可被形貌情况或别的组件吸收的事务。如许,分歧的组件便可在机关工具内组合在一同,组件之间经由过程事务的传送举行通讯,组成一个使用。从观点上讲,事务是一种在"源对象"和"监听者对象"之间,某种形态产生变更的传送机制。事务有很多分歧的用处,比方在Windows体系中常要处置的鼠标事务、窗口界限改动事务、键盘事务等。在Java和JavaBean中则是界说了一个一样平常的、可扩大的事务机制,这类机制可以:

对事务范例和传送的模子的界说和扩大供应一个大众框架,并合适于普遍的使用。
与Java言语和情况有较高的集成度。
事务能被形貌情况捕捉和焚烧。
能使别的机关工具接纳某种手艺在计划时间接把持事务,和事务源和事务监听者之间的接洽。
事务机制自己不依附于庞大的开辟工具。

出格地,还应该:
可以发明指定的对象类能够天生的事务。
可以发明指定的对象类能够察看(监听)到的事务。
供应一个惯例的注册机制,同意静态利用事务源与事务监听者之间的干系。
不必要别的的假造机和言语便可完成。
事务源与监听者之间可举行高效的事务传送。
能完成JavaBean事务模子与相干的别的组件系统布局事务模子的中立映照。

3.2.1概述

JavaBean事务模子的整体布局图见.3,





次要组成有:事务处置件源到监听者的传送是经由过程对方针监听者对象的Java办法挪用举行的。对每一个明白的事务的产生,都响应地界说一个明白的Java办法。这些办法都会合界说在事务监听者(EventListener)接口中,这个接口要承继java.util.EventListener。完成了事务监听者接口中一些或全体办法的类就是事务监听者。陪伴着事务的产生,响应的形态一般都封装在事务形态对象中,该对象必需承继自java.util.EventObject。事务形态对象作为单参传送给应呼应该事务的监听者办法中。收回某种特定事务的事务源的标识是:服从划定的计划格局为事务监听者界说注册办法,并承受对指定事务监听者接话柄例的援用。偶然,事务监听者不克不及间接完成事务监听者接口,大概另有别的的分外举措时,就要在一个源与别的一个或多个监听者之间拔出一个事务适配器类的实例,来创建它们之间的接洽。

3.2.2事务形态对象(EventStateObject)

与事务产生有关的形态信息一样平常都封装在一个事务形态对象中,这类对象是java.util.EventObject的子类。按计划习气,这类事务形态对象类的名应以Event开头。比方:


publicclassMouseMovedExampleEventextendsjava.util.EventObject

{protectedintx,y;
/* 创立一个鼠标挪动事务MouseMovedExampleEvent*/
 MouseMovedExampleEvent(java.awt.Componentsource,Pointlocation){
super(source);
x=location.x;
y=location.y;
}
/*猎取鼠标地位*/
publicPointgetLocation(){
returnnewPoint(x,y);
}}

3.2.3事务监听者接口(EventListenerInterface)与事务监听者

因为Java事务模子是基于办法挪用,因此必要一个界说并构造事务利用办法的体例。JavaBean中,事务利用办法都被界说在承继了java.util.EventListener类的EventListener接口中,按划定,EventListener接口的定名要以Listener开头。任何一个类假如想利用在EventListener接口中界说的办法都必需以完成这个接口体例举行。这个类也就是事务监听者。比方:


/*先界说了一个鼠标挪动事务对象*/
  publicclassMouseMovedExampleEventextendsjava.util.EventObject{
  //在此类中包括了与鼠标挪动事务有关的形态信息
    ...
  }
  /*界说了鼠标挪动事务的监听者接口*/
  interfaceMouseMovedExampleListenerextendsjava.util.EventListener{
/*在这个接口中界说了鼠标挪动事务监听者所应撑持的办法*/
voidmouseMoved(MouseMovedExampleEventmme);
}

在接口中只界说办法名,办法的参数和前往值范例。如:下面接口中的mouseMoved办法的详细完成是鄙人面的ArbitraryObject类中界说的。

classArbitraryObjectimplementsMouseMovedExampleListener{
   publicvoidmouseMoved(MouseMovedExampleEventmme)
 {...}

ArbitraryObject就是MouseMovedExampleEvent事务的监听者。
3.2.4事务监听者的注册与刊出

为了各类大概的事务监听者把本人注册进符合的事务源中,创建源与事务监听者间的事务流,事务源必需为事务监听者供应注册和刊出的办法。在后面的bound属性先容中已看到了这类利用历程,在实践中,事务监听者的注册和刊出要利用尺度的计划格局:


publicvoidadd<ListenerType>(<ListenerType>listener);
publicvoidremove<ListenerType>(<ListenerType>listener);

比方:
  起首界说了一个事务监听者接口:
publicinterfaceModelChangedListenerextendsjava.util.EventListener{
voidmodelChanged(EventObjecte);
}

接着界说事务源类:
publicabstractclassModel{
privateVectorlisteners=newVector();//界说了一个贮存事务监听者的数组

/*下面计划格局中的<ListenerType>在此处便是上面的ModelChangedListener*/

publicsynchronizedvoidaddModelChangedListener(ModelChangedListenermcl)
  {listeners.addElement(mcl);}//把监听者注册进listeners数组中
publicsynchronizedvoidremoveModelChangedListener(ModelChangedListenermcl)
    {listeners.removeElement(mcl);//把监听者从listeners中刊出
    }
  /*以上两个办法的后面均冠以synchronized,是由于运转在多线程情况时,大概同时有几个对象同时要举行注册和刊出操纵,利用synchronized来确保它们之间的同步。开辟工具或程序员利用这两个办法创建源与监听者之间的事务流*/

  protectedvoidnotifyModelChanged(){/**事务源利用本办法关照监听者产生了modelChanged事务*/
   Vectorl;
    EventObjecte=newEventObject(this);
    /*起首要把监听者拷贝到l数组中,解冻EventListeners的形态以传送事务。如许来确保在事务传送到一切监听者之前,已吸收了事务的方针监听者的对应办法暂不失效。*/
    synchronized(this){
      l=(Vector)listeners.clone();
    }
    for(inti=0;i<l.size();i++){
    /*顺次关照注册在监听者行列中的每一个监听者产生了modelChanged事务,
    并把事务形态对象e作为参数传送给监听者行列中的每一个监听者*/
((ModelChangedListener)l.elementAt(i)).modelChanged(e);
    }
   }
   }

在程序中可见事务源Model类显式地挪用了接口中的modelChanged办法,实践是把事务形态对象e作为参数,传送给了监听者类中的modelChanged办法。
3.2.5适配类

适配类是Java事务模子中极为主要的一部分。在一些使用场所,事务从源到监听者之间的传送要经由过程适配类来"转发"。比方:当事务源收回一个事务,而有几个事务监听者对象都可吸收该事务,但只要指定对象做出反响时,就要在事务源与事务监听者之间拔出一个事务适配器类,由适配器类来指定事务应当是由哪些监听者来呼应。
.4是适配类模子的框架:从上图中可见,适配类成了事务监听者,事务源实践是把适配类作为监听者注册进监听者行列中,而真实的事务呼应者并未在监听者行列中,事务呼应者应做的举措由适配类决意。今朝尽年夜多半的开辟工具在天生代码时,事务处置都是经由过程适配类来举行的。

JavaBean用户化

JavaBean开辟者能够给一个Bean增加用户化器(Customizer)、属性编纂器(PropertyEditor)和BeanInfo接口来形貌一个Bean的内容,Bean的利用者可在机关情况中经由过程与Bean附带在一同的这些信息来用户化Bean的表面和应做的举措。一个Bean不用都有BeanCustomizer、PrpertyEditor和BeanInfo,依据实践情形,这些是可选的,当有些Bean较庞大时,就要供应这些信息,以Wizard的体例使Bean的利用者可以用户化一个Bean。有些复杂的Bean大概这些信息都没有,则机关工具可以使用自带的透视安装,透视出Bean的内容,并把信息显现到尺度的属性表或事务表中供利用者用户化Bean,前几节提到的Bean的属性、办法和事务名要以必定的格局定名,次要的感化就是供开辟工具对Bean举行透视。固然也是给程序员在手写程序中利用Bean供应便利,使他能不雅其名、知其意。
3.3.1用户化器接口(CustomizerInterface)

当一个Bean有了本人的用户化器时,在机关工具内便可展示出本人的属性表。在界说用户化器时必需要完成java.beans.Customizer接口。比方,上面是一个"按钮"Bean的用户化一器:


publicclassOurButtonCustomizerextendsPanelimplementsCustomizer{
......
/*当完成象OurButtonCustomizer如许的惯例属性表时,必定要在个中完成addProperChangeListener
和removePropertyChangeListener,如许,机关工具可用这些功效代码为属性事务增加监听者。*/
......
privatePropertyChangeSupportchanges=newPropertyChangeSupport(this);
publicvoidaddPropertyChangeListener(PropertyChangeListenerl){
changes.addPropertyChangeListener(l);
publicvoidremovePropertyChangeListener(PropertyChangeListenerl){
changes.removePropertyChangeListener(l);
}
......

3.3.2属性编纂器接口(PropertyEditorInterface)

一个JavaBean可供应PropertyEditor类,为指定的属性创立一个编纂器。这个类必需承继自java.beans.PropertyEditorSupport类。机关工具与手写代码的程序员不间接利用这个类,而是鄙人一大节的BeanInfo中实例化并挪用这个类。例:


publicclassMoleculeNameEditorextendsjava.beans.PropertyEditorSupport{
publicString[]getTags(){
Stringresule[]={
"HyaluronicAcid","Benzene","buckmisterfullerine",
"cyclohexane","ethane","water"};
returnresule;}
}

上例中是为Tags属性创立了属性编纂器,在机关工具内,可从下拉表格当选择MoleculeName的属性应是"HyaluronicAid"或是"water"。
3.3.3BeanInfo接口

每一个Bean类也大概有与之相干的BeanInfo类,在个中形貌了这个Bean在机关工具内呈现时的表面。BeanInfo中可界说属性、办法、事务,显现它们的称号,供应复杂的匡助申明。比方:


publicclassMoleculeBeanInfoextendsSimpleBeanInfo{
publicPropertyDescriptor[]getPropertyDescriptors(){
try{
PropertyDescriptorpd=newPropertyDescriptor("moleculeName",Molecule.class);
/*经由过程pd援用了上一节的MoleculeNameEditor类,获得并前往moleculeName属性*/
pd.setPropertyEditorClass(MoleculeNameEditor.class);
PropertyDescriptorresult[]={pd};
returnresult;
}catch(Exceptionex){
System.err.println("MoleculeBeanInfo:unexpectedexeption:"+ex);
returnnull;
}
}
}


JavaBean耐久化
当一个JavaBean在机关工具内被用户化,并与别的Bean创建毗连以后,它的一切形态都应该可被保留,下一次被load进机关工具内或在运转时,就应该是上一次修正完的信息。为了能做到这一点,要把Bean的某些字段的信息保留上去,在界说Bean时要使它完成java.io.Serializable接口。比方:

publicclassButtonimplementsjava.io.Serializable{
}

完成了序列化接口的Bean中字段的信息将被主动保留。若不想保留某些字段的信息则可在这些字段前冠以transient或static关头字,transient和static变量的信息是不成被保留的。一般,一个Bean一切公然出来的属性都应该是被保留的,也可有选择地保留外部形态。Bean开辟者在修正软件时,能够增加字段,移走对别的类的援用,改动一个字段的private/protected/public形态,这些都不影响类的存储布局干系。但是,当从类中删除一个字段,改动一个变量在类系统中的地位,把某个字段改成transient/static,或本来是transient/static,现改成其余特征时,都将引发存储干系的变更。
5JavaBean的存储格局

JavaBean组件被计划出来后,通常为以扩大名为jar的Zip格局文件存储,在jar中包括与JavaBean有关的信息,并以MANIFEST文件指定个中的哪些类是JavaBean。以jar文件存储的JavaBean在收集中传送时极年夜地削减了数据的传输数目,并把JavaBean运转时所必要的一些资本绑缚在一同本章次要叙述了JavaBeans的一些外部特征及其惯例计划办法,参考的是JavaBeans标准1.0A版本。跟着天下各年夜ISV对JavaBeans愈来愈多的撑持,标准在一些细节上还在不休演变,但基础框架不会再有年夜的变化。
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。
作者: 再见西城    时间: 2015-1-21 13:21
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 第二个灵魂    时间: 2015-1-22 13:52
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 只想知道    时间: 2015-1-29 12:47
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 冷月葬花魂    时间: 2015-1-30 18:18
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 分手快乐    时间: 2015-2-1 12:10
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 小魔女    时间: 2015-2-7 04:44
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 精灵巫婆    时间: 2015-3-4 23:50
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 海妖    时间: 2015-3-11 00:22
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 蒙在股里    时间: 2015-3-11 17:37
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 不帅    时间: 2015-3-13 02:09
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 因胸联盟    时间: 2015-3-13 23:09
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 乐观    时间: 2015-3-20 21:20
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 谁可相欹    时间: 2015-3-31 15:13
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 老尸    时间: 2015-4-6 00:31
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 灵魂腐蚀    时间: 2015-4-10 17:54
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 莫相离    时间: 2015-4-12 14:05
是一种突破用户端机器环境和CPU
作者: 小女巫    时间: 2015-4-16 17:10
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 飘飘悠悠    时间: 2015-4-19 16:51
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2