2007年12月15日
摘要: 最近在项目中间遇到一个棘手的问题,希望有经验的朋友能帮帮小弟,感激不尽。
具体问题是:在工程部署到tomcat,然后启动tamcat,登录工程,无任何问题,但是问题出在大概一个小时以后,重新访问工程,登录时抛出如下异常:
1Exception Type: org.springframework.transaction.TransactionSystemExc...
阅读全文
2007年9月18日
在写面向对象的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>
2007年8月29日
在使用displaytag出现这个异常 很久都没有解决!
Failed to load or instantiate TagExtraInfo class: org.displaytag.tags.TableTagExtraInfo
2007年6月5日
请问哪位大侠做过一个Web IM,如果有例子务必给小弟借鉴一下,谢谢!
2007年5月21日
为什么我在使用SSH(struts+spring+hibernate)构建一个J2EE时为什么会时常出现这种错误:
请哪位知道的高手务必指导一下小弟,谢谢!
2007年5月8日
实体对象的生命周期在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这个数据库操作平台而已.
2007年2月8日
1. JavaMail实现邮件收发
2. Filter过滤器、Listener监听器原理和代码实现
3. SCJP考题训练(两套)
4. Tomcat配置包括Tomcat电脑开机自动启动、连接池各项参数含义
5. JDBC实现10万,50万,100万数据查询性能对比和调优方案
6. 编写java程序调用mysql存储过程
7. 用jsp+struts+dao实现用户登陆
8. 用jsp+struts+dao实现数据库crud操作,并在页面展示效果
9. Jdbc批量数据插入代码实现(至少插入10万条记录)
10. 多线程实现生产者/消费者工作过程
11. Socket实现点对点聊天对话
12. Hibernate上c3p0,proxool,及服务器上连接池配置(可选)
13. Hibernate实现数据的crud操作(可选)
14. Struts+Hibernate+Sping实现crud操作并在页面显示效果(可选)
2006年11月9日
在Orcale中使用视图和存储过程
一.视图
1.为什么要引入视图这个概念?
试想如果我们要使用计算列调整数据的结构,或者基于列值比较从多个表中抽取数据,我们就不得不采取相对很复杂的SQL语句.但是,如果我们要多次按照
这种方式获取数据,那岂不是要一遍又一遍的重复写这些复杂的SQL语句,那是一件多么令人头痛的事啊,但是,有了视图,我们就可以完全避免这些不必要
多做这些无用功了,SQL允许我们在数据库中创建视图.视图提供了一种半持久性的改造方式,这样我们就可以通过访问视图来代替直接访问表,换句话说就是
视图就相当于一个抽象层,这样就能是我们以一种更一致的方式格式数据.同时这样也大大提高了数据的安全性,用户仅可以访问到视图,而不能访问到下层的
数据.
2.视图有那些优点?
1.将用户的注意力集中在特定的数据上,从而提高数据的安全性
2.简化了数据的查询和处理操作,DBA可以把大量的相关的内容设计到一个视图中,使用户在查询和处理数据时就像处理表那么简单,而不用编写复杂的
select语句
3.有利于数据的交换
4.有利于简化对用户权限的管理
3.在SQL如何创建和使用视图?
创建视图:
->create view 视图名称 as Query(任意的select语句)
Example:CREATE VIEW selectstudent
AS select name from student;(该例子就提高了数据的按全性,在用户调用这个视图时,就只能看到学生名字)
使用视图:
->select 字段名 from 视图名 where 过滤条件
Example(接上):select name from selectstudent where name = '张三';
4.怎样更改视图?
->CREATE OR REPLACE VIEW 视图名 AS Query
5.怎样删除视图?
->DROP VIEW 视图名
二.存储过程
1.什么是储存过程?
我们在使用SQL进行编程时,可以使用两种方法储存和执行程序.可以在本地储存程序,创建并向数据库发送命令并处理结果的应用程序,最好的方法当然是将程序在数据库储存为
储存过程,创建执行储存过程并处理结果的应用程序.
2.存储过程有什么作用?
->接受输入参数并以输出参数的形式将多个值返回至调用过程或进行批处理
->执行数据库操作的编程语句
->向调用过程或批处理返回状态值表明成功或失败以及失败的原因
3.使用存储过程有那些优势?
->允许模块化程序设计.只需创建过程一次并将其保存在数据库中,以后就能在程序中调用该过程任意次
->允许更快的执行.如果某项操作需要大量的SQL代码或需要重复执行,存储过程将比SQL代码执行的要快
->减少网络流量.一个需要数百行的SQL代码操作由一条执行过程代码的单独语句就可以实现,而不需要在网络中发送数百行代码.
->可作为安全机制使用
4.如何创建存储过程?
->CREATE [OR REPLACE] 存储过程名 (参数列表)
AS
BEGIN
存储过程主体
END;
->Orcale中参数的模式:参数名 IN 或 OUT 数据类型
Example:
create or replace insertstudent(i_studentid in int,i_studentname in vachar);
as
begin
insert student(studentid,name)values(i_studentid,i_studentname);
end;
使用该存储过程
call insertstudent(1,'张三');
->使用输出参数:
Example:
create or replace getstudentname(i_studentid in int,o_studentname out vachar);
as
begin
select name into o_studentname from student where studentid = i_studentid;
end;
使用该存储过程
set severout on --单独执行
declare
studentname vachar(50);--变量声明
begin
getstudentname(1,studentname);
dbms_output.put_line(studentname);
end;
着输出结果为:张三
2006年11月7日
对关系型数据库管理系统Orcale9i体系结构的初步认识
首先我们在要了解Orcale9i之前必须要清楚以下几点:
就Oracle9i本身而言主要可以区分为两个部分:
1.cale Instance(Orcale实例).
2.cale9i Databases Files(Orcale数据库文件).
Orcale Instance是指数据库服务器的内存以及相关处理程序
Orcale Instance又包括SGA(系统全局区)以及Background Processes(后台处理程序)
SGA又包括几个重要的区域(在内存中划分)
1.Database Buffer Cache(块缓冲区高速缓存):用来存放读取自数据文件的副本或者简而理解为用户曾经处理过的数据,这样就能大大的提高数据存取的效率因为他有效的减少了数据在硬盘上的I\O操作.
2.Redo Log Buffer(重做日志缓冲区):记录数据库内所有的数据修改区简而言之就是对数据库的任何修改都会他记录,这样以便数据库被损坏时可以进行必要的修复同时因为他是内存到内存的操作所以又加快
了数据库的操作速度.
3.Shared Pool(共享池):为什么叫他共享池而不叫他共享区呢?我这样认为:因为他其中还包括了两个缓冲区:
->Library Cache(SQL语句缓冲区):当用户向Orcale提交一个SQL语句时,该缓冲区就将这条SQL语句进行分析,这个过程类似于编译,这会消耗较多的时间,当Orcale完成对这条SQL语句分析过后,Orcale
自动将其分析结果保存到Library Cache中,这样当Orcale第二次执行该SQL时,Orcale将自动跳过这个分析过程,从而降低了系统运行的时间.
->Data Dictionary(数据字典缓冲区):是Orcale特地为数据字典准备的一块缓冲区,紧供Orcale内部使用储存Orcale系统信息,我们用对他进行太多的细究.
注:Shared Pool是Orcale Instance最关键的内存片段.
4.其他的缓冲区.
Background Processes(后台处理程序)其中主要的几个进程:
1.DBWR(数据写进程):将Database Buffer Cache内改动过的数据块写入到硬盘内的数据文件.
2.LGWR(日志写进程):将重做日志缓冲区内的更改写入到硬盘中的重做日志文件.
3.SMON(系统监控):在因为各种原因造成Orcale数据库不正常的被关闭,下一次激活数据库时SMON将尽行必要的修复.
4.PMON(进程监控):在一个Orcale进程失败时PMON将对资源进行清理.
5.CKPT(检查点进程):在每当Database Buffer Cache中的更改永久性的记录在硬盘中时,更新控制文件和数据文件中的数据库状态信息.
6.ARCH(归档进程):在每次日志切换时把已满的日志组进行备份或归档.
..................
Orcale9i Databases Files是指主要放在计算机硬盘上的各种Orcale9i数据库文件其中包括:
1.数据文件
2.控制文件
3.日志文件
以上三个文件是由进程DBWR与LGWR对他们进行操作
4.归档日志文件
5.参数文件
6.口令文件,用户的应用权限
Orcale 数据库结构:
1.逻辑结构:
构成的主要由以下几个逻辑部件:
->的储存单位块(data block).
->区(extends).需要注意的是Oracle9i在配置储存空间时是以区为单位的而不是最小的储存单位块!
->段(segement),由许多区构成
->表空间(Tablespace),Orcale9i数据库最大的储存空间,许多段构成.
Orcale9i各逻辑部件存在一种阶层关系:
->数据存在每个数据块内,数据读写以块为单位
->空间配置是以区为单位,一个区由一连串数据块所构成
->依实际数据量的多少,数据由多个区组成
->数据表空间可以划分为不同的区段,每个段又包括了许多区
->在每个Orcale9i数据库内可划分不同的表空间,用以存放不同类型的数据
2.物理结构:
由各种Orcale9i数据库文件构成.
注意:一个实例最多只能安装和打开在一个数据库上,而一个数据库能对应多个实例,所以在建立数据库之前,必须先指定Orcale实例的系统表示符(System Identifier),即Orcale SID 因为用来区分不同数据库所以SID必须是唯一的.
实例主要负责数据库的相应操作并与用户交互.