2006年12月30日星期六

2006-12-29 星期五

刚刚搞定一个从昨天就搞不定的问题,都已经疯了,闹了半天,该了个名字就好了,我要做一个一对多的映射,一个出版社对应多本书,在Publish类里面定义了一个Set的eBook,就是这个eBook这个名字,换了个叫someBook就好了,想想,我的书类叫EBook,难道和这个有关系?纳了闷了,总是报Could not find getter for eBook in Publish类。

关于Hibernate的延时加载,如果出现

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.hwebmapping.pojo.Person.cats, no session or session was closed

的异常,就是Hibernate要读取数据的时候,Session已经关闭,可以用监听器的方法来在页面加载完成后关闭session.(implements javax.servlet.Filter).

       出现下面这样的错误:

java.lang.NoClassDefFoundError

    at com.hwebmapping.hibernate.HibernateDAOBean.doInsertCardDataToDB(HibernateDAOBean.java:337)

337行是下面finally中的语句

 

finally

{

    HibernateUtil.closeSession();

}

经查原来是因为,在Card.hbm.xml中的类名写错了,找不到,但是报上面的错误让人有点摸不着头脑了,为什么是在closeSession的时候出现的异常呢,按理说应该在加载xml的时候就应该有异常了阿。费解。

 

<hibernate-mapping>

    <class name="com.hwebmapping.pojo.Card" table="Card">

2006-12-28 星期四

转眼,几个月过去了,要找工作了,有些郁闷,没有底气阿,为什么?没好好学么?觉得还可以,呵呵,不知道人家是什么胃口,娘的。

       花了这么多钱,不知道值不值,想想,我们这些参加什么培训的,都是些急于求成的东西,跑这来想速成,呵呵,天下没有什么速成,我要多长时间把这钱挣回来?半年?要是净赚还行,呵呵,不了解外界什么行情,想想,人家因为什么理由要我呢?呵呵,要学的还很多,也是,总不能等万事俱备再出山不是,那就出不了山了,怎么现在还没有在学校找工作那时候有自信了呢?那时候可能我还比周围人还有一些竞争力吧,现在?不知道自己在什么层面上,不知道自己有什么优势了。怎么越过越倒退呢,一晚上心烦,狗日的。

       要元旦了,呵呵,日子怎么是这样的呢,我讨厌过节,昔日的好兄弟说我小子越来越孤僻了,得好好教育教育了,唉,确实如此,我倒想,没有人认识我,没有人找我,来无影去无踪,呵呵,不是我不想和人来来往往,热热气气,就像罗桑实说的,暖暖的都不想离开了。可是。今年下半年,我好想误入了一个大口袋一样的包围圈,进去了,口袋被慢慢扎紧,无法呼吸,我在努力挣脱,想出去,可是,又不想互相残杀,不想弄坏袋子,想和解,我还抱有希望,呵呵,希望有一天,我杀出重围。

       讨厌过节。

2006-12-27 星期三

Hibernate第二天,没有抽出时间来写日志,呵呵,这两天过的有些没有规律。

涉及到Hibenate的核心api,SessionFactory,Session,Query,Transaction。刚开始搞得有点晕头转向,呵呵,hibernate比spring复杂,的确不用写什么sql语句,配配配还是配,就这配,非得仔细不可,就因为一个字母写错,就得找半天,报的错还声东击西。呵呵。

2006年12月27日星期三

2006-12-26 星期二

昨晚上在网上闲逛,看到了一篇文章,忘了记下来网址了,说学java的三个境界,哈哈,同志尚需努力啊。

------------------------------------------------

第一个层次:精通掌握Java语法、能调试基本的程序错误,精通掌握JSP+Java Bean写一些N年前ASP、PHP翻版的Java Web应用程序(如论坛、网站新闻发布系统、OA、网上商城等),精通JDBC使用、精通SQL语句、精通XML等。

  第二个层次:掌握设计模式原理及应用,掌握基于OO的分析及设计方法,并能精通熟练使用几种Java专业设计及开发工具,精通掌握流行的J2EE框架如Hibernate、EJB、Webwork、Spring的原理及应用,精通J2EE中一两个组成部分(如Servlet、EJB等)的工作原理及细节。

  第三个层次:少林的高僧有两种,禅僧及武僧。J2EE程序员的第三个层次也同样有禅、武两个分支,这里我们重点分析一下:

  第一个分支属于走的禅僧线路。在练完第二个层次中的各种武功基础上,结合实际项目中的千奇百怪的用户需求,游刃有余的选择适合的技术方案为客户解决问题,并形成自己的一套解决方案。达到这一个层次的J2EE程序员已经不在乎使用任何工具、任何框架了,而是根据不同的对手,使用不同的武器或招式来应对。好比小李飞刀一样,只有达到了“手中无刀、心中有刀”的境界,才能达到“出手一刀,例不虚发”的效果。这一层次的武功属于一个熟练度问题,刀练得多了、遇到的对手多了,再加上前面的武功修为,就算做不到例不虚发,也可达到十发九中。

  第二个分支属于走的武僧线路,在撑握熟悉第一二个层次中涉及到的内容后,进一步专研并撑握J2EE底层开发,J2EE规范制订、规范实现、Java虚拟机的工作原理、各种常见的J2EE服务器内核工作机制、内存管理、进程机制、源代码等。因为涉及的很多东西都比较抽象,代码也很多,练这一层的武功需要有很好的资质及耐性、并具还得有一定的环境及条件。好比神雕大侠杨过拿起“玄铁剑”,并练成“暗然销魂掌”的成长过程,需要前面的武功修为作基础,更需那只威力神武神雕的帮助指点及他处处为民、惩奸除恶的侠之心态。
  
  胡侃了这么多,现在来根据自己情况测算一下自己的份量,结果如下:

第一层 练到8成;
  第二层 练到5成;
  第三层 准备走禅僧线路,当前算是练到1成;
  
  唉,后面的武功提升越来越难,真不知道要到何年何月才能达到10成啊。你的武功练到哪一个层次了,不防亮出来大家切磋切磋。嘿嘿,要是有一天,咱们中国的Java程序员人手一把“玄铁剑”、人人会使“暗然销魂掌”,那还了得!汗...,写着写着居然做起白日梦了,不好意思,就此打住。

    今天开始讲Hibernate了,搞得有点晕,其中涉及到一些线程并发的只是,还有集合,真是应了先前基础课老师说的,以后学web开发很多地方要用到集合,多线程虽然框架已经做了封装,但是要想很好的理解它们的运行机理,还是要明白的,好好研究编程思想去。

    还有就是今天看到了一个用到静态语句块的地方。在HibernateUtil类里,用来初始化SessionFactory.

    对Hibernate的初步理解,它通过配置xml将持久化类与数据库的一条记录连接了起来。Hibernate也是轻量型框架,所谓轻量型,必须有两个特点,一是非侵入性,而是与容器无关性(不依赖于容器,也就是可在J2EE中运行,也可以在J2SE中运行)。Hibernate对JDBC做了很高的封装,让我们看不到任何涉及到数据库的代码,完全面向对象编程。

    第一天,还得好好学。

2006年12月26日星期二

2006-12-25 星期一

今天讲spring的DAO组件的事务处理和spring和struts结合的三种方法。

       Jdbc的事务处理分为全局事务和局部事务,全局事务是基于应用服务器实现的事务,局部事务是程序实现的,Spring的事务处理是局部事务。

       Spring 的事务处理又分为代码控制和声明控制,代码控制又分为实现PlatformTransactionManager接口方式和继承TransactionTemplate方式(需要用到匿名内部类,这里涉及到了一个回调的概念,回去研究研究编程思想,以前看到过没仔细看,好像回调只能用内部类实现,在java中)。

       Spring 与Struts 结合有三种方法,一种让Action继承一个ActionSupport类,这个类是由Spring 提供的,这是最傻瓜的方法,我觉得,呵呵,然后就是替代Struts中的RequestProcessor类,Spring在替代类里面做了些手脚,使Action类能够基于IoC容器来动态加载业务类对象,第三种方法,是在struts-config.xml中,将所有指定Action的Path属性设成spring的一个接口,然后在spring配置文件中配置action类。这是推荐的方法。

       一天下来头疼,明天开始讲Hibernate了,这样struts+spring+hibernate架构就学完了,要学的东西真是太多了,都跟不上新版本出来的速度,呵呵,要开始着手找工作了,郁闷,自己水平不够好。

2006年12月23日星期六

2006-12-22 星期五

      今天接着spring的SimpleFormController,使用spring框架如何提交表单,处理表单。

      同Struts相似之处的也是在web.xml中设置一个servlet控制器,然后有个xml文件来配置业务类,感觉比Struts还简单些,呵呵,都是做的简单的例子,还后涉及到事件,在发生某个响应后可以出发一个事件处理另一个并发的业务,比如用户注册成功后给用户邮箱发送一封邮件,这需要用到spring的两个类,一个ApplicationListener监听器,还有个事件类ApplicationEvent,一个implement 一个extends,ApplicationEvent是一个抽象类,必须实现它,在事件触发类中创建一个ApplicationEvent实现类的对象,构造器中以ApplicationListener的实现类的对象为参数,然后将ApplicationEvent实现类的对象作为参数调用ApplicationContext的publishEvent();方法。

       最后,简单介绍了spring的dao组件,经过封装后的jdbc确实好用,本来十几行的代码两行就搞定了。其中spring的dao组件不依赖于ioc,但是也可以用ioc注入,还有事务处理,还没有学到,这两天作bbs的例子。

2006年12月22日星期五

弄两幅图片玩玩

大自然"绝地大反攻",呵呵,不错,特别喜欢最后一幅,设成桌面了。
试一试baidu的上传图片,还不错,挺方便。

2006-12-21 星期四

试着实现了一下Struts和spring结合,在Struts的Action类中,使用spring得到业务类对象,结果开始启动Tomcat的时候报下面这个错误:

严重: Error listenerStart

2006-12-21 16:32:49 org.apache.catalina.core.StandardContext start

严重: Context [/BookShop] startup failed due to previous errors

其中在web.xml中配置spring的启动方式,是用的监听器模式:

<listener>

<listener-class> org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

在网上查了一下相关帖子,说把监听器模式换成servlet启动模式就没有问题了,但是是为什么还不知道,按照此说法把spring的启动方式在web.xml中配置成了servlet启动模式。

<servlet>

    <servlet-name>context</servlet-name>

    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

</servlet>

结果就好了,更加奇怪的是在设回成监听器,也没有问题了,我晕。

<listener>

<listener-class> org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

。。。。。。。。

       今天来了个老师讲一些人生规划、职业规划、工作、面试。讲的我有些郁闷,大道理谁都懂,但是…,哈哈,但是就很多了,要不谁都成伟人了呵呵,不是我消极,这些问题都是没有确切说法的,不想编程,true就是true,false就是false,这么写就能通过,那么写就是编不过,人活着,有很多可以选择,也可以不选择,这或许是为什么人活着很辛苦,呵呵,关于什么以诚待人啊什么的,谁都知道,谁都有一个评判,但是,做与不做,是不一样的人与人之间,都知道,付出就有回报,这都懂,甚至还做过试验,呵呵,可是,现在,我好像,没资格说这些了。我不知道还能不能回来。

补充: Error listenerStart的错误原因也可能是因为lib中有重复的jar包,将重复的jar包删除,问题解决

2006-12-21 星期四

因为在Struts中配置一个数据库连接池,折腾了一晚上,按照书上写的就是出问题,就在网上搜啊搜,还真是不好找,倒是有很多提出这样问题的帖子,但是都没回答到点子上,结果还是在网上找到了一篇文章,讨论是用Tomcat的连接池好还是用Struts的连接池好,结论是用哪个也不好,哈哈,其中有一段在Struts中配置连接池的实例,正好对我这个症状,哈哈,问题解决,甚是高兴。

下面是摘自这篇文章关于配置Struts数据源的内容:

 

Struts DataSource管理器在Struts配置文件(Struts-config.xml)里定义。这个管理器可以用来分发和配置任何实现了javax.sql.DataSource接口的数据库连接池(connection pool)。如果你的DBMS或者容器内置了符合这些要求的连接池,你可以优先选用它。


Jakarta的公共连接池实现 - BasicDataSource

  如果你的手头没有连接池的本地(native)实现,你可以使用Jakarta提供的公共连接池实现[org.apache.commons.dbcp.BasicDataSource],它可以和DataSource管理器"合作"的很好。另外,Struts还在它的util包里包含了一个GenericDataSource类,这也是一个连接池实现。但是这只是一个非常简单的实现方案,不推荐使用,因为它可能在Struts的以后版本中被BasicDataSource或其它的数据源实现替换掉。

  下面是一段Struts-config.xml配置文件中的数据源配置(使用GenericDataSource数据源实现),你可以更改相应的设置以适合你自己的系统。


<!-- configuration for GenericDataSource wrapper -->
  <set-property="autoCommit" value="false"/>
  <set-property="description" value="Example Data Source Configuration"/>
  <set-property="driverClass" value="org.postgresql.Driver"/>
  <set-property="maxCount" value="4"/>
  <set-property="minCount" value="2"/>
  <set-property="password" value="mypassword"/>
  <set-property="url" value="jdbc:postgresql://localhost/mydatabase"/>
  <set-property="user" value="myusername"/>
        

使用BasicDataSource数据源实现的配置方案如下:


<!-- configuration for commons BasicDataSource --> 
<set-property="driverClassName" value="org.postgresql.Driver" />
<set-property="url" value="jdbc:postgresql://localhost/mydatabase" />
<set-property="username" value="me" />
<set-property="password" value="test" />
<set-property="maxActive"  value="10" />
<set-property="maxWait" value="5000" />
<set-property="defaultAutoCommit"  value="false" />
<set-property="defaultReadOnly" value="false" />
<set-property="validationQuery" value="select COUNT(*) FROM market" />

 

出处:http://wenson.javaeye.com/blog/33316

值得注意的是上面两个数据源的配置中的property属性的值有些不一样,就是这个问题困扰了我一晚上。涨经验了呵呵,以后也很可能不会用Struts配置连接池。

    另外,还查得了如何查看sqlserver2000的版本的方法,如下:

SELECT @@VERSION

 

SQL Server 2000 版本和级别 @@VERSION 产品级别
SQL Server 2000 原始版本 8.00.194 RTM
Database Components SP1 8.00.384 SP1
Database Components SP2 8.00.534 SP2
Database Components SP3、SP3a 或 MSDE 2000 Release A 8.00.760 SP3
Database Components SP4 8.00.2039 SP4

原来以为是数据库没有装sp3的原因,通过上面的方法排出了这个猜测。

2006-12-20 星期三

昨天晚上装jbuilder2006遇上安装好后不能启动的问题,从网上找的解决问题的办法。

安装 JBuilder 后第一次可以成功运行,可是机器重新启动之后再次运行 JBuilder 时却每次只是看到 Logo 闪了一下就没有任何反应了。

        这种情况主要是由于 VM 的内存分配设置出了问题。可以在 X:\JBuilder2006\bin 目录下找到一个名为 jbuilder.config 的文件,打开该文件,其中有如下一行设置:

# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 75%
vmparam -XX:MaxPermSize=128m

将其改为:

# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 512m
vmparam -XX:MaxPermSize=128m

          即可解决上述问题。

 

       今天讲spring的MVC实现,理论上跟Struts差不多,只是换汤不换药,目前只是接触到了Spring的控制器和模型之间是如何联系的,Spring利用IoC实现了松耦合。这是比Struts先进的地方。

2006-12-19 星期二

继续学习Spring,在web上面的应用,spring的关键,是将业务类在spring框架中注册,也就是在xml文件中,其中包括类的属性的初始化,这有个属性注入的概念,常用的有构造方法注入,和set方法注入,还有一种不常用的接口注入,Class.forName();,注册以后,在控制器中使用的时候,通过spring框架来创建对象,然后我们来使用这个对象,其中这里有个很重要的要求就是,面向接口编程,要实现一个业务类,必须先定义一个该业务类的接口,然后让实现类实现它,这样做的好处可以隐藏实现类的内部实现,将想让客户见到的方法放到接口中,这样实现隐藏其他不想公开的方法。另外从客户的角度来看,客户只是得到了一个实现类的接口类型,并没有得到具体的实现类,甚至不知道实现类的名字,面向接口编程。

       另外,IoR是一种设计思想,将类的创建,管理,销毁,还有单一模式,这一档子事全部交给别人来负责,客户只拿来使用创建好的对象,为客户带来了简便,使更多的精力放到业务放到业务处理上,另外,也带来了代码的松耦合。

       一天下来还是头疼,不知怎么搞得,感冒还是没好利索,今天抽时间将编程思想的对象初始化看完了,接下来计划复习Struts。

2006年12月20日星期三

2006-12-18 星期一

今天接触到了Spring,我喜欢的名字,呵呵,Spring应用框架是应用于业务层的框架,要求面向接口编程,将类与类之间的关系进行解耦,Spring最基本的就是IoR(Inversion of Control)翻译过来是控制反转,是一种设计模式,使应用程序逻辑外在化,将创建对象,初始化,销毁交给spring来管理,通过动态加载来使用对象。

       好久没有打代码了,今天问起strues的东西,都有点陌生了,不行,得好好复习不行。今天一天下来头疼,不知为什么,精力太集中了?呵呵。

       今天发现有个人去工作了,哦天,呆两天不会来再哦天。

       头疼,回家。

2006年12月17日星期日

小试了一下baidu的blog

无意中发现baidu的blog可以从别的地方搬家,哈哈,拉拢我们的好办法,决定试一下,哈哈转过来了,还不错,除了因为我原来的页面有背景,字体设成白色的了,在这边显示不出来,让我甚是不爽,改了半天,这下终于行了,还不错。

感觉baidu的速度还是相当快的。/

偷来的学习

类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。

类与类之间存在以下关系:

(1)泛化(Generalization)

(2)关联(Association)

(3)依赖(Dependency)

(4)聚合(Aggregation)

UML图与应用代码例子:

1.泛化(Generalization)

[泛化]

表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。

[具体表现]

父类 父类实例=new 子类()

[UML图](图1.1)



图1.1 Animal类与Tiger类,Dog类的泛化关系



[代码表现]



  1. class Animal{}
  2. class Tiger extends Animal{}
  3. public class Test
  4. {
  5. public void test()
  6. {
  7. Animal a=new Tiger();
  8. }
  9. }


2.依赖(Dependency)

[依赖]

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

[具体表现]

依赖关系表现在局部变量,方法的参数,以及对静态方法的调用

[现实例子]

比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作

[UML表现](图1.2)



图1.2 Person类与Screwdriver类的依赖关系



[代码表现]

  1. public class Person{
  2. /** 拧螺丝 */
  3. public void screw(Screwdriver screwdriver){
  4. screwdriver.screw();
  5. }
  6. }


3.关联(Association)

[关联]

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

[具体表现]

关联关系是使用实例变量来实现

[现实例子]

比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司

[UML图] (图1.3)



图1.3 公司和员工的关联关系



[代码表现]
  1. public class Company{
  2. private Employee employee;
  3. public Employee getEmployee(){
  4. return employee;
  5. }
  6. public void setEmployee(Employee employee){
  7. this.employee=employee;
  8. }
  9. //公司运作
  10. public void run(){
  11. employee.startWorking();
  12. }
  13. }
(4)聚合(Aggregation)

[聚合]

当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

[具体表现]

与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

[关联与聚合的区别]

(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。

聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。

(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。

[UML图](图1.4)



图1.3 电脑和组件的聚合关系



[代码表现]
  1. public class Computer{
  2. private CPU cpu;
  3. public CPU getCPU(){
  4. return cpu;
  5. }
  6. public void setCPU(CPU cpu){
  7. this.cpu=cpu;
  8. }
  9. //开启电脑
  10. public void start(){
  11. //cpu运作
  12. cpu.run();
  13. }
  14. }




[参考资料]

1.《Java与模式》(阎宏 编著) 第2章 统一建模语言UML简介
作者写的很好,偷来了就,希望不会被追究,原始链接:http://www.javaeye.com/topic/37302

2006-12-17 星期日

突然感觉自己是个木讷的人,还矫情的写写心情,呵呵,女不女人。时间过的真快,天气已经很冷了,开始越来越担心,这个年该怎么过,话虽说,车到山前必有路,但还是免不了不知如何是好。想想,我想要的,其实我也不想太奢侈,自己的路真想自己走,就应该自己走,可是...哪有那么多可是,男人一点。我该表明我的观点,我的立场,唉,头晕/跟着感觉走吧。

2006-12-14 星期五

Oracle数据库课结束了,老师上完课坐晚上的火成回沈阳,专业Oracle数据库老师,当老师还是不错的嘛,呵呵。

下周就是Spring/冬眠了呵呵,接着Struts继续研究代码的阶段,也不能单纯的研究代码不是,MVC,设计模式,面向对象,这是最基本的,好好研究编程思想吧。

自己好好学吧,靠别人是不行的,也不要多管闲事。

2006-12-13 星期三

数据库,存储过程,游标

没什么具体写的,心情不好,身体也不好,狗日的,回家。

今天的自讲因为机子连接的问题取消了。

2006-12-11 星期一

这周接着讲Oracle,

今天脖子特别疼,还比较困,老师一讲就犯困了,

晚上还好,郭斌斌讲了继承,还不错,蛮有收获。哎呦脖子疼,刚刚发现手机欠费了,买了张充值卡充上了,还是说我欠费不让我打电话,真是气死我,狗日的移动。

2006-12-12 星期二

脖子疼好些了,嗓子又肿了,昨晚一晚上没睡好,还挺厉害,中午买了点消炎药,昨晚开玩笑说,以后我挣的钱还供不上吃药的,呵呵,还活着干啥。

数据库讲了一些如何配置,然后是一些sql语句oracle独有的,老师的水平还是厉害的,看得出来,就是有些腼腆哈哈,感到oracle还是很强大的,有很多它独有的东西。要想学好它可是要费一段功夫的。

昨晚的讲课进行的不好,感觉的在糊弄我们,也没说什么,唉0能说什么呢,今天邓讲内部类,挺麻烦的东西。

2006-12-8 星期五

最后一天uml,行为模式,Chain of Responsibility (COR)职责链模式,Command模式,Iterator迭代器模式,Mediator模式,Memento备忘录模式,Visitor访问者模式,Strategy策略模式,State状态模式。

COR模式,职责链模式,定义一个接口,有一个处理方法,有一个该接口类型的字段,并且有一个该字段的set设置方法,不同的职责分别实现该接口,处理方法判断是否是自己的方法,如果是,处理,如果不是,利用接口里定义的字段访问下一个职责的处理方法,在客户端,建立各个职责的对象,并用set方法设置下一个职责是哪一个,最后调用第一个职责的处理方法。

Command模式,国王发好施令,定义一个命令接口,用于发布命令,实现该接口,有一个士兵类属性,构造器负责传入士兵对象,用于让那个士兵去执行该命令,士兵类,士兵类里面有具体执行命令的方法,国王类,有发布命令的方法,在客户端,实例化一个士兵,实例化一个发布命令类,将士兵对象作为参数传给命令类,实例化一个国王对象,将命令对象作为参数传给国王,国王发号施令。

Iterator迭代器,就像集合里面有个方法可以得到Iterator对象,用于遍历、排序。

Mediator媒体模式,由多个类需要调用,将这几个类组合到一个类,在这个类里面有每个类类型的属性,让客户端实例化这个类,不需关心其他类。

Memento模式,建立一个跟已有的类一模一样的类,用于保存在某个时刻的值,防止后悔,呵呵!已有类里面有个memento类的对象。

Visitor访问者模式,解决了泛型要解决的问题,利用多态,多态真是太有用了,哈哈,我觉得很多设计模式都用了多态特性。

Strategy策略模式

State状态模式

今天下课给大家讲了讲第三章,比较简单,但是不够自信,怕自己说错了,呵呵,还好,大家都分了一章,下星期都安排好了,安排好后几个人又开始玩cs了,怎么能这样呢,还不好意思说他们,唉…

2006-12-6 星期三

设计模式,创建型模式,工厂方法,Builder模式

工厂方法就是建一个工厂类,这个工厂类负责生产对象,生产需要的对象,生成什么样的对象由调用工厂方法的对象决定,也可以由xml文件配置,就像在struts里面配置action。随着工厂类的增多,可以将工厂类抽象,然后由子类继承。

Builder模式,可以单独有一个类负责另一个类的对象的创建。我的理解,可以

Interface Car{};

class BuildCar

{

class RedCar implements Car

{}

Public Car getCar()

{

return new RedCar();

}

}

就像10-12日的那个例子,我想这就用了Builder模式。另外,Builder模式还可以有一个叫导向器的类Director,它负责怎样创建这个对象,适用于几个类的属性基本相同,只有少许不同,这样用到导向器,实现Builder类的重用。

基础太重要了,高楼大厦的基石,好好看java编程思想。老师建议我们每个人一人一章,然后负责给每个人讲解,这样的学习效率是很高的,再有,看明白了跟讲明白了是两个层次,可是没人相应,下课我问大家觉得老师的提议怎么样?没人理我,呜呜。大家不想学好么。

2006-12-7 星期四

设计模式,构建型模式最后一个:Singleton单件模式

保证一个类只有一个实例存在,方法是隐藏构造方法,在类的内部构造一个静态的实例,然后建一个静态方法返回这个实例,其中一个知识点是,静态变量是在main方法执行前初始化的,也就是在程序运行前初始化的。

结构性模式:适配器模式Adapter,桥接模式Bridge,组合模式Composite,装饰模式Dectorator,外观模式Fa ade,享元模式FlyWeight,代理模式Proxy。

Adapter模式,是多重继承的一种替代方法,通过继承一个类,组合一个类,来实现。

Bridge模式,将要执行的业务方法抽象出来,建立一个桥接接口,通过实现该接口用于不同的业务,然后使用该实现类。

Composite模式,多个相同的对象要调用它们的一个方法,单独写一个类,里面有个该对象的类的类型的集合,里面装有许多对象,有个方法,利用循环依次调用每个对象的方法,宗旨是让类的使用者更方便。

Dectorator模式,避免过深继承的一种方式,目前有一个类,但业务需求改变导致这个类有少许变化,如果继承这个类,将导致无限制继承,办法是建立一个这个类的兄弟,实现新的业务需求,然后调用兄弟的方法。

Fa ade模式,用于业务操作十分复杂,为了实现对复杂性的封装,建立一个类,建立一个面向外界的接口,类的使用者只需调用该接口就搞定了,而背后复杂的逻辑不必去关心。

FlyWeight模式,跟单件模式有类似之处,都是为了减少重复对象的创建,这个模式是,建立一个缓存,将已建立的对象放入缓存,当再次需要的时候在缓存中查找是不是已经存在了该对象,如果存在,直接返回,否则创建,这样节省了内存空间,这样的适用于有许多的小型对象的适用。

Proxy模式,用于不同用户有不同操作权限的类似情况,有一个类负责业务逻辑的执行并不负责用户是否具有权限的判断,这件任务由另一个类负责。

以上设计模式的理解,用自己的话写了一下,希望加深理解。

明天可能要给大家讲第三章,得好好准备准备,争取完美,嘻嘻。

2006-12-4 星期一

今天开始上uml课,老师还是很厉害的。

其中一个很容易混淆的关系就是一个依赖关系,一个关联关系,依赖关系就是参数关系,一个类的对象作为一个参数在另一个类里被使用,而关联关系,是一个类的对象作为另一个类的一个属性或者集合属性来使用。

另外,在实际设计开发中,应尽可能少的使用继承,完全符合继承逻辑关系的才使用继承,以免造成代码的混乱,关于多重继承在java中不直接被支持,采用内部类或者关联关系来实现。

在C++ 中有个名词叫友元,一般情况下,子类继承父类,子类是不能访问父类的私有成员的,而如果一定要访问,就在父类中将子类声明为父类的一个朋友,这样子类就可以使用父类的私有成员,这就是友元,在java中没有这样的概念。

Java基础知识很重要,要注意复习,进一步掌握。

2006-12-5 星期二

接着uml,接下来就应该是设计模式了,这部分都是些理论的东西,基本不用写代码,一些画uml图的含义,感觉记不住,只能到时候用到的时候,再来查查资料了,uml很重要/

感觉自己掌握的知识太欠缺了,要好好掌握基础才行。

面向对象程序设计实际上进行的是创建新的数据类型。也可以认为,类型决定了接口,而类是该接口的一个特定实现。值得好好理解。

类描述了具有相同特性(数据元素)和行为的对象集合。

2006年12月4日星期一

2006-12-3 星期日

呵呵,时间,时间过的真快,7月,8月,9月,10月,11月,12月。一天一天,稀里糊涂过来了,真快,为什么总是感叹快呢。大家都这样,呵呵。/盼望着,有一天,我的blog重新开放,到时候,我就应该解脱了,应该恢复以前的那样,应该......做梦,梦见一切都雨过天晴了,美好了,大家都很高兴了,我就也高兴,可是......睁开眼发现,头顶的天花板,一切还是现实,痛.....做梦,梦见战火又起,天啊, 梦着梦着,痛得惊醒,再也睡不着......昨天,她和朋友短信聊天又哭了,真不知道怎么去安慰,有什么办法呢,谁能告诉我,我这个无耻懦夫有时候甚至极端的想,羡慕电影里没有父母亲人自己一个人,自己努力,也蛮快乐的。唉...也许真的家家有本难念的经。人说像这样的家庭真是不好找了,而我这样的也不好找,呵呵,逃避,想法设法的逃避,可这不是办法,你逃能逃到哪去呢,出走了,你狠的下心么/常常说自己冷血,却狠不下心,煎熬着......我不想这么活着,我想抬起头!!!

2006-12-1 星期五

今天因为老谢有事,决定uml换老师了,说是博士,呵呵呵,博士不博士无所谓的,只是个头衔嘛,中国的博士就是这样,呵呵,下周见,今天上自习,哈哈上自习好,这两天完善了一下我的bookshop,丑陋无比,五脏俱全,哈哈,还是得实践,像老谢说的,得自己做,不自己做永远变不成自己的。

2006-11-30 星期四

转眼又到月底了,过的真快

今天老谢发威,问oracle老师到底怎么回事,问我们干嘛嘛,既然培训中心做了换老师的决定,肯定有为什么换的足够理由阿,因为下午有事,今天的课没上,上自习,上自习挺好,自己做做东西,复习以前的内容。

2006年12月3日星期日

2006-11-29 星期三

上uml,令人惊奇的是竟然是老谢给我们讲,应该说是走运,学校就那么两个牛老师,能不能碰上他们给讲算是运气了,首先先训了我们一顿,我们这个班换老师不止一次了,其中老师是有问题,换个角度讲,我们同学有没有问题,是有问题的,没有用上十二个劲儿的去投入到学习中,再好的老师,自己不努力也是没有用的,so我们首先得努力。

讲uml的语法,用例图的画法,做了道题目,这部分内容跟编程不一样,需要思考,想周全,明天老师看看怎么做这个练习。

2006-11-28 星期二

今天没老师,数据库的老师没来,还比较嫩,回去再修练修练。

自己上自习,下午答了个j2ee的测试,感觉有点陌生,一是本来课程目标就是给我们一个总体性了介绍,二是这些天私下里也没看j2ee方面的东西。测试还没有涉及到web services,这部分知识应该是高端的了。

Oracle数据库先搁置,明天开始,uml在j2ee平台中的具体应用,这个是很重要的,涉及到开发软件的流程,如何设计、规划,要好好学。

2006-11-27 星期一

PL/SQL、procdure

最简单的块结构定义、循环loop…if…then exit end loop\while …loop…end loop\for i in low_bound..high_bound loop …end loop三种方式

Create procdure p_proc_name(……)

as

begin

……

End;

里面的参数分为in和out两种,老师就因为这个折腾了一个下午,到最后还是没讲清楚,我的理解,如果是out,即为输出参数,既然是输出参数就要指定输出给谁呢,比如我定义个varchar型的v_name ,执行存储过程的时候告诉它我用v_name来接收参数,如果是in out,则这个v_name 可以有初值作为传入参数传入,总之,既然是输出参数,就必须有一个变量来接收这个参数,所以不能以’abc’这样的常量传入。

不知道是这个理儿不,呵呵,下午,老师好像也蒙了,哈哈。

老师自己搞不通,排错的过程浪费了大部分时间。

还是要问,培训中心是怎样衡量一个老师的。

这部分数据库的知识,基本上跟以前的知识没有联系,可不能因为没了联系,而把前面的丢了,熊瞎子掰苞米,掰一个丢一个可不行,一定要注意学习安排。

自己弄个例子做做。