JAVA日志

JAVA日志

 

2007年5月8日

请大家帮忙 关于异常:org.springframework.transaction.TransactionSystemException

     摘要: 最近在项目中间遇到一个棘手的问题,希望有经验的朋友能帮帮小弟,感激不尽。 具体问题是:在工程部署到tomcat,然后启动tamcat,登录工程,无任何问题,但是问题出在大概一个小时以后,重新访问工程,登录时抛出如下异常:  1Exception Type: org.springframework.transaction.TransactionSystemExc...  阅读全文

posted @ 2007-12-15 11:54 小木 阅读(19204) | 评论 (4)编辑 收藏

JS之OOP

在写面向对象的WEB应用程序方面JavaSciprt是一种很好的选择.它能支持OOP.因为它通过原型支持继承的方式和通过属性和方法的方式一样好.很多开发者试图抛弃JS,试着用C#或JAVA仅是因为JS不是他认为合适的面向对象的语言.许多人还没有认识到javascript支持继承.当你写面向对象的代码时.它能给你很强大的能量.你也可以使用它写出可复用,可封装的代码.

对象为何如此伟大?
    面向对象思想的成功是由于它仿照了现实中的事物和事物的联系.事物有属性和方法.如果我们描述一个台灯.我们会说它的高度和宽度,比如12CM."开灯"这个动作是它的方法.当它是处于开着的状态时.它可以被调亮一点或暗一点(也就是亮度这个属性值变大或变小).
   
javascript 给予了为WEB应用程序创建对象的能力.对象在需要的时候相应的事件会被触发,代码封装后,它能被实例化很多次.在javascript里有几种创建对象的方法,在不同的场合可用不同的方法

1.1JS创建对象方式之一用 new Object() 来创建对象

.最简单的就是用new 操作符,例如:
<script language="javascript" type="text/javascript">
person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"
person.run = function() {
       this.state = "running"
       this.speed = "4ms^-1"
}
</script>
我们在这个例子里定义了person这个对象,然后加入了它的属性和方法.在这个例子里,自定义的方法里有两个属性.

1.2.用文字记号Literal Notation创建对象
用文字记号也可以创建对象,但要javascript 1.2以上版本.它的创建形式是多样的.
<script language="javascript" type="text/javascript">
// Object Literals
timObject = {
      property1 : "Hello",
      property2 : "MmmMMm",
      property3 : ["mmm", 2, 3, 6, "kkk"],
      method1 : function(){
         alert("Method had been called" + this.property1)
       }
};
timObject.method1();
alert(timObject.property3[2]) // 结果为3

var circle = { x : 0, y : 0, radius: 2 } // another example
// 嵌套也是允许的哦.
var rectangle = {
          upperLeft : { x : 2, y : 2 },
         lowerRight : { x : 4, y : 4}
}
alert(rectangle.upperLeft.x) // 结果为2
</script>
文字记号可是是数组,也可以是任意的javascript表达式或值.
用 new 操作符或文字记号创建一个自定义对象都是简单的,也是符合逻辑的.但它最大的缺点就是结果不可复用.也不能很容易的用不同的版本初始化创建对象.例如上面的第一个例子,如果 person 的 name 不是 "Tim Scarfe",那样我们不得不重新定义整个对象,仅仅为了适应它的一点点改变.

1.3.对象的构造和原型
   在OOP的世界里,用先前的方法定义对象在许多场合都有限制.我们需要一种创建对象的方法,类型可以被多次使用而不用重新定义.对象在实例化时每次都可以按需分配不同的值.实现这个目标的标准方法是用对象构造器函数.

   一个对象构造器只不过是个有规则的javascript函数,它就象一个容器(定义参数,调用其他函数等等).它们两者所不同的是构造器函数是由 new 操作符调用的.(你将在下面的例子中看到).基于函数语法形式的对象定义,我们可以使它工作得最好.

让我们用现实世界中的猫来举个例子.猫的 name 和 color 是猫的属性.meeyow(猫叫)是它的一个方法.重要的是任何不同的猫都可能有不同的 name 和 meeyow 的叫声.为了建立适应这些特征的对象类,我们将使用对象构造器.
<script language="javascript" type="text/javascript">
function cat(name) {
       this.name = name; 
       this.talk = function() {
              alert( this.name + " say meeow!" )
       }
}
cat1 = new cat("felix")
cat1.talk() //alerts "felix says meeow!"
cat2 = new cat("ginger")
cat2.talk() //alerts "ginger says meeow!"
</script>
在这里,函数 cat() 是一个对象构造器,它的属性和方法在函数体里用this来定义,用对象构造器定义的对象用 new 来实例化.主意我们如何非常容易的定义多个cat 的实例.每一个都有自己的名字,这就是对象构造器带给我们的灵活性.
构造器建立了对象的蓝图.并不是对象本身.

在原型里增加方法.
在上面我们看到的例子里,对象的方法是在构造器里定义好的了.另外一种实现的途径是通过原型(prototype).xxx
原型是javascript继承的一种形式.我们可以为对象定义好后,再创造一个方法.原来所有对象的实例都将共享.
让我们来扩展最初的 cat 对象.增加一个改名的方法.用 prototype 的方式.
<script language="javascript" type="text/javascript">

cat.prototype.changeName = function(name) {
          this.name = name;
}
firstCat = new cat("pursur")
firstCat.changeName("Bill")
firstCat.talk() //alerts "Bill says meeow!"
</script>
就象你所看到的.我们仅只用了 关键字 prototype 实现了在对象定义后马上增加了changeName方法.这个方法被所有的实例共享.

用原型(prototype) 重载 javascript 对象
原型 在自定义对象和有选择性的重载对象上都可以工作.比如 Date() 或 String .这可能是无止境的.

1.4.子类和超类
下面一个例子演示了如何继承
<script language="javascript" type="text/javascript">
function superClass() {
         this.supertest = superTestMethod; //attach method superTest
}

function superTestMethod() {
         return "superTest";
}

function subClass() {
         this.inheritFrom = superClass;
         this.inheritFrom();
         this.subtest = subTestMethod; //attach method subTest
}

function subTestMethod() {
        return "subTest";
}

var newClass = new subClass();
alert(newClass.subtest()); // 弹出"subTest"
alert(newClass.supertest()); // 弹出 "superTest"
</script>
1.5.访问对象属性
正如你所知, (.)操作符能够用来操作对象属性和方法,而([]) 操作符用来操作数组.
<script language="javascript" type="text/javascript">
// 这两种用法是相同的
object.property
object["property"]
</script>
<script language="javascript">
function Circle (xPoint, yPoint, radius) {
       this.x = xPoint;
       this.y = yPoint;
       this.r = radius;
}
var aCircle = new Circle(5, 11, 99);
alert(aCircle.x);
alert(aCircle["x"]);
</script>
我们可以通过for in循环来遍历对象的属性。
<script language="javascript" type="text/javascript">
var testObj = {
      prop1 : "hello",
      prop2 : "hello2",
      prop3 : new Array("hello",1,2)
}
for(x in testObj) {
     alert( x + "-" + testObj[ x ] )
}
</script>
<script language="javascript">
var Circle = { // another example
       x : 0,
       y : 1,
      radius: 2
}

for(p in Circle) {
       alert( p + "-" + Circle[ p ] )
}
</script>

posted @ 2007-09-18 11:02 小木 阅读(1684) | 评论 (1)编辑 收藏

在使用displaytag出现的错误! 忘大家帮忙解决!

在使用displaytag出现这个异常  很久都没有解决!

Failed to load or instantiate TagExtraInfo class: org.displaytag.tags.TableTagExtraInfo 

posted @ 2007-08-29 22:12 小木 阅读(906) | 评论 (0)编辑 收藏

求助高手

 请问哪位大侠做过一个Web IM,如果有例子务必给小弟借鉴一下,谢谢!

posted @ 2007-06-05 11:13 小木 阅读(766) | 评论 (1)编辑 收藏

请教高手

为什么我在使用SSH(struts+spring+hibernate)构建一个J2EE时为什么会时常出现这种错误:


请哪位知道的高手务必指导一下小弟,谢谢!

posted @ 2007-05-21 16:04 小木 阅读(977) | 评论 (12)编辑 收藏

Hibernate中实体对象的生命周期

实体对象的生命周期在Hibernate应用中是一个很关键的概念,正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用.而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程.在这过程中我们需要理解的就是实体对象生命周期中的三种状态.

1.自由状态(Transient)
所谓的Transient状态,即实体对象在内存中自由存在,与数据库中的记录无关,通常是我们的J2EE中VO,并没有被纳入Hibernate的实体管理容器.

1    Test test = new Test();
2        test.setName("energykk");
3        //此时的test对象处于Transient(自由状态)并没有被Hibernate框架所管理
4        

2.持久状态(Persistent)
何谓 Persistent? 即实体对象已经处于被Hibernate实体管理容器容器所管理的状态.这种状态下这个实体对象的引用将被纳入Hibernate实体管理容器容器所管理.
处于Persistent状态的实体对象,对它的变更也将被固化到数据库中.
在J2EE中通常指的是一个PO.
Transaction tr = session.beginTransaction();
        session.save(test);
        
//此时的test对象已经处于Persistent(持久状态)它被Hibernate纳入实体管理容器
        tr.commit();
        Transaction tr2 
= session.beginTransaction();
        test.setName(
"xukai");
        
//在这个事务中我们并没有显示的调用save()方法但是由于Persistent状态的对象将会自动的固化到
        
//数据库中,因此此时正处在Persistent状态的test对象的变化也将自动被同步到数据库中
        tr2.commit();

处于Persistent状态的实体可以简单的理解为:如果一个实体对象与session发生了关联,并且处于session的有效期内,那么这个实体对象就处于Persistent状态.

3.游离状态(Detached)
处于Persistent状态的实体对象,其对应的session关闭以后,那么这个实体就处于Detached状态.
我们可以认为session对象就是一个Persistent的宿主,一旦这个宿主失效,那么这个实体就处于Detached状态.

session.close();
        
//与test对象关联的session被关闭,因此此时的test对象进入Detached(游离状态)
        
        session2 
= HibernateSessionFactory.getSession();
        Transaction tr3 
= session2.beginTransaction();
        session2.update(test);
        
//此时正处于Detached状态的test对象由于再次借助与session2被纳入到Hibernate的实体管理容器所以此时的
        
//test对象恢复到Persistent状态
        test.setName("jjjj");
        tr3.commit();
        
        session2.close();

既然Transient状态的实体与Detached状态的实体都与Hibernate的实体管理容器没有关系,那他们到底存在哪些差异?
差异就在于处于Transient状态的只有一个Name的属性.此时的test对象所包含的数据信息仅限于此,他与数据库中的记录没有任何瓜葛.
但是处于Detached状态的实体已经不止包含Name这个属性,还被赋予了主键也就是通常POJO里的id属性,由于id是主键,他可以确定数据库表中的一条
唯一的记录,那么自然的处于Detached状态的实体就能与数据库表中拥有相同id的记录相关联.
这就是他们之间所存在的差异,简而言之,Transient状态的实体缺乏与数据库表记录之间的联系,而Detached状态的试题恰恰相反.只不过是脱离了session这个数据库操作平台而已.

posted @ 2007-05-08 14:02 小木 阅读(3194) | 评论 (0)编辑 收藏

导航

统计

常用链接

留言簿(1)

随笔档案

相册

搜索

最新评论

阅读排行榜

评论排行榜