??xml version="1.0" encoding="utf-8" standalone="yes"?>精品亚洲综合久久中文字幕,久久亚洲AV午夜福利精品一区,亚洲码在线中文在线观看http://m.tkk7.com/SongJunke/要学得东西很多,但我们的旉却不是很多!zh-cnMon, 12 May 2025 16:09:42 GMTMon, 12 May 2025 16:09:42 GMT60点点滴滴http://m.tkk7.com/SongJunke/archive/2007/08/08/135185.htmlBill111Bill111Wed, 08 Aug 2007 03:03:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/08/08/135185.htmlhttp://m.tkk7.com/SongJunke/comments/135185.htmlhttp://m.tkk7.com/SongJunke/archive/2007/08/08/135185.html#Feedback0http://m.tkk7.com/SongJunke/comments/commentRss/135185.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/135185.html     忙中偷闲Q整理点代码?br>     /** 
     *  复制单个文g 
     *  @param  oldPath  String  原文件\?nbsp; 如:c:/fqf.txt 
     *  @param  newPath  String  复制后\?nbsp; 如:f:/fqf.txt 
     *  @return  boolean 
     */ 
   public  void  copyFile(String  oldPath,  String  newPath) 
   { 
       try  { 
           int  bytesum  =  0; 
           int  byteread  =  0; 
           File  oldfile  =  new  File(oldPath); 
           if  (oldfile.exists())  {  //文g存在?nbsp;
               InputStream  inStream  =  new  FileInputStream(oldPath);  //d原文?nbsp;
               FileOutputStream  fs  =  new  FileOutputStream(newPath); 
               byte[]  buffer  =  new  byte[1444]; 
               int  length; 
               while  (  (byteread  =  inStream.read(buffer))  !=  -1)  { 
                   bytesum  +=  byteread;  //字节?nbsp; 文g大小 
                   System.out.println(bytesum); 
                   fs.write(buffer,  0,  byteread); 
               } 
               inStream.close(); 
           } 
       } 
       catch  (Exception  e)  { 
           System.out.println("复制单个文g操作出错"); 
           e.printStackTrace();  
       }  
   }  

//保存文g的方?br>public String Savefiles(FormFile file,String path)
 {  
  String fileName= file.getFileName();
  String contentType = file.getContentType();
  String size = (file.getFileSize() + " bytes");
  try
  {
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   InputStream stream = file.getInputStream();
   OutputStream bos = new FileOutputStream(path+fileName);
   int bytesRead = 0;
   byte[] buffer = new byte[8192];
   while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
    bos.write(buffer, 0, bytesRead);
   }
   bos.close();      
   stream.close();  
  }
  catch (IOException e) {
   return e.getMessage();
  }
  return "1";
 }

//生成15位的字符?br>public String GenTradeId()
 {
  String tradeId = "";
  RandomStrg.setCharset("a-zA-Z0-9");  
  RandomStrg.setLength("15");  
  try
  {
   RandomStrg.generateRandomObject();
   tradeId=RandomStrg.getRandom();   
  }
  catch (Exception e)
  {    
  }
  return tradeId;  
 }

/**
  * 删除字符串中的空?臛_只保留一个空?br>  * 
  * @String txt:输入需要处理的字符?br>  * @return String :q回处理后的字符?br>  * 
  */
 public String deleteWhitespace(String txt){
  if((txt!=null)&&(txt.trim().length()>1)){
   
  }
  else{
   return "";
  }
  
  txt = txt.replaceAll("\n"," ").replaceAll("\t"," ");
  String temp="";
  try{
   int flag =0,num=0;
   char c = 'x';
   StringBuffer sb = new StringBuffer("");
   for(int x=0;x<txt.length();x++){
    c = txt.charAt(x);
    if((c==' ')&&(flag==0)){
     sb.append(c);
     flag =1;
    }
    else if((c!=' ')){
     sb.append(c);
     flag =0;
    }
   }
   temp = sb.toString().trim();
  }
  catch(Exception e){
   ;
  }
  return temp;
 }

Bill111 2007-08-08 11:03 发表评论
]]>
JavaScript Examplehttp://m.tkk7.com/SongJunke/archive/2007/03/27/106719.htmlBill111Bill111Tue, 27 Mar 2007 09:18:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/03/27/106719.htmlhttp://m.tkk7.com/SongJunke/comments/106719.htmlhttp://m.tkk7.com/SongJunke/archive/2007/03/27/106719.html#Feedback0http://m.tkk7.com/SongJunke/comments/commentRss/106719.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/106719.html阅读全文

Bill111 2007-03-27 17:18 发表评论
]]>
SQL执行效率http://m.tkk7.com/SongJunke/archive/2007/03/23/105818.htmlBill111Bill111Fri, 23 Mar 2007 05:50:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/03/23/105818.htmlhttp://m.tkk7.com/SongJunke/comments/105818.htmlhttp://m.tkk7.com/SongJunke/archive/2007/03/23/105818.html#Feedback2http://m.tkk7.com/SongJunke/comments/commentRss/105818.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/105818.html SQL语句中,IN、EXISTS、NOT IN、NOT EXISTS的效率较低,其是后两种语句Q当数据量较大时Q更常给ZU死的感觉。本文提供一U用连接的Ҏ代替以上的四U语句,可大副提高SQL语句的运行效率。以NOT INZQ当数据量达C万时Q效率可提高20倍,数据量越大,效率提高的幅度也p大?/font>

本文所丄例子在Oracle 7.0下运行通过Q但本文所推荐的方法在各种大型数据库上皆适用?br /> Z能够更好的说明问题,我们采用CZ的方式来说明问题。下面,我们创Z些数据库表和数据Q用于在举例时用?br />
下面的语句将创徏我们CZ中将使用的表Qƈ分别在表1QTAB1Q中存入10000条数据,?QTAB2Q中存入5000条数据?br />
SQL语句如下Q?/p>

CREATE TABLE TAB1
(
COL1 VARCHAR(20) NOT NULL,
COL2 INTEGERQ?br /> PRIMARY KEY(COL1)
);
CREATE TABLE TAB2
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE TABLE TAB3
(
COL1 VARCHAR(20) NOT NULL,
PRIMARY KEY(COL1)
);
CREATE OR REPLACE TRIGGER T_TAB3 BEFORE INSERT ON TAB3 FOR EACH ROW
DECLARE
NUM1 NUMBER;
BEGIN
NUM1:=1;
LOOP
EXIT WHEN NUM1>10000;
INSERT INTO TAB1 VALUES (NUM1,NUM1);
IF NUM1<=5000 THEN INSERT INTO TAB2 VALUES (NUM1);
END IF;
NUM1:=NUM1+1;
END LOOP;
END;
INSERT INTO TAB3 VALUES('1');

下面Q我们将?个例子来具体说明使用q接替换IN、NOT IN、EXISTS、NOT EXISTS的方法?br />
 d?中第2列(COL2Q数据的dQ且其第1列数据存在于?的第1列中?br />
1. 使用IN的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE COL1 IN(SELECT COL1 FROM TAB2)

2. 使用EXISTS的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE EXISTS(SELECT * FROM TAB2 WHERE TAB1.COL1=TAB2.COL1)

3. 使用q接的SQL语句Q?br />
SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B

WHERE A.COL1=B.COL1

 d?中第2列(COL2Q数据的dQ且其第1列数据不存在于表2的第1列中?br />

1. 使用NOT IN的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE COL1 NOT IN(SELECT COL1 FROM TAB2)

2. 使用NOT EXISTS的SQL语句Q?br />
SELECT SUM(COL2) FROM TAB1 WHERE NOT EXISTS(SELECT * FROM TAB2 WHERE
TAB1.COL1=TAB2.COL1)

3. 使用外连接的SQL语句Q?br />
SELECT SUM(A.COL2) FROM TAB1 A,TAB2 B WHERE A.COL1=B.COL1(+) AND B.COL1 IS NULL

下面介绍IN、NOT IN、EXIST、NOT EXIST在DELETE和UPDATE语句中的效率提高Ҏ?br />
下面所丄例子在Microsoft SQL Server 7.0下运行通过Q但所推荐的方法在各种大型数据库上皆适用。下面,我们创Z些数据库表和数据Q用于D例说明。我们将分别在表AQTAQ中存入 10000条数据,表BQTBQ中存入5000条数据?

SQL语句如下Q?

CREATE TABLE TA
(
CA INT
)
CREATE TABLE TB
(
CA INT
)
CREATE TABLE TC
(
CA INT
)
CREATE TRIGGER TRA ON TC
FOR INSERT
AS
DECLARE @MINT INT
BEGIN
SELECT @MINT=1
WHILE (@MINT<=5000)
BEGIN
INSERT INTO TA VALUES(@MINT)
INSERT INTO TB VALUES(@MINT)
SELECT @MINT=@MINT+1
END
WHILE (@MINT<=10000)
BEGIN
INSERT INTO TA VALUES(@MINT)
SELECT @MINT=@MINT+1
END
END
GO
INSERT INTO TC VALUES(1)
GO

 删除表A中表A和表B相同的数?br />
1Q?用IN的SQL语句Q?br /> DELETE FROM TA WHERE TA.CA IN (SELECT CA FROM TB)

2Q?用EXISTS的SQL语句Q?br /> DELETE FROM TA WHERE EXISTS (SELECT * FROM TB WHERE TB.CA=TA.CA)

3Q?使用q接的SQL语句Q?br /> DELETE TA FROM TA,TB WHERE TA.CA=TB.CA

 删除表A中表A存在但表B中不存在的数?br />
1. 使用IN的SQL语句Q?br /> DELETE FROM TA WHERE TA.CA NOT IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句Q?br /> DELETE FROM TA WHERE NOT EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用q接的SQL语句Q?br /> DELETE TA FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA WHERE TB.CA IS NULL


 更新表A中表A和表B相同的数?br /> 1. 使用IN的SQL语句Q?br /> UPDATE TA SET CA=CA+10000 WHERE CA IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句Q?br /> UPDATE TA SET CA=CA+10000 WHERE EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用q接的SQL语句Q?br /> UPDATE TA SET TA.CA=TA.CA+10000 FROM TA,TB WHERE TA.CA=TB.CA


 更新表A中表A存在但表B中不存在的数?br />
1. 使用IN的SQL语句Q?br /> UPDATE TA SET CA=CA+10000 WHERE CA NOT IN (SELECT CA FROM TB)

2. 使用EXISTS的SQL语句Q?br /> UPDATE TA SET CA=CA+10000 WHERE NOT EXISTS (SELECT CA FROM TB WHERE TB.CA=TA.CA)

3. 使用q接的SQL语句Q?br /> UPDATE TA SET TA.CA=TA.CA+10000 FROM TA LEFT OUTER JOIN TB ON TA.CA=TB.CA WHERE TB.CA IS NULL



Bill111 2007-03-23 13:50 发表评论
]]>
java基础知识回顾http://m.tkk7.com/SongJunke/archive/2007/03/16/104258.htmlBill111Bill111Fri, 16 Mar 2007 07:19:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/03/16/104258.htmlhttp://m.tkk7.com/SongJunke/comments/104258.htmlhttp://m.tkk7.com/SongJunke/archive/2007/03/16/104258.html#Feedback0http://m.tkk7.com/SongJunke/comments/commentRss/104258.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/104258.html
String s = "Hello world!";

许多人都做过q样的事情,但是Q我们到底声明了什么?回答通常是:一个StringQ内Ҏ“Hello world!”。这hp的回答通常是概念不清的Ҏ。如果要准确的回{,一半的人大概会回答错误?br />q个语句声明的是一个指向对象的引用Q名为“s”,可以指向cd为String的Q何对象,目前指向"Hello world!"q个Stringcd的对象。这是真正发生的事情。我们ƈ没有声明一个String对象Q我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名ؓstringQƈ没有W二个对象生,stringq是指向原来那个对象Q也是Q和s指向同一个对象?br />
问题二:"=="和equalsҎI竟有什么区别?

==操作W专门用来比较变量的值是否相{。比较好理解的一ҎQ?br />int a=10;
int b=10;
则a==b是true?br />但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b返回false?br />
Ҏ前一帖说q,对象变量其实是一个引用,它们的值是指向对象所在的内存地址Q而不是对象本w。a和b都用了new操作W,意味着在内存中生两个内容ؓ"foo"的字W串Q既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的|所以?=="操作W,l果会是 false。诚Ӟa和b所指的对象Q它们的内容都是"foo"Q应该是“相{”,但是==操作Wƈ不涉及到对象内容的比较?br />对象内容的比较,正是equalsҎ做的事?br />
看一下Object对象的equalsҎ是如何实现的Q?br />boolean equals(Object o){

return this==o;

}
Object 对象默认使用?=操作W。所以如果你自创的类没有覆盖equalsҎQ那你的cM用equals和?=会得到同Ll果。同样也可以看出Q?Object的equalsҎ没有辑ֈequalsҎ应该辑ֈ的目标:比较两个对象内容是否相等。因为答案应该由cȝ创徏者决定,所以Object把这个Q务留l了cȝ创徏者?br />
看一下一个极端的c:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equalsҎ。这个实CD无论Monster实例内容如何Q它们之间的比较永远q回true?br />
所以当你是用equalsҎ判断对象的内Ҏ否相{,请不要想当然。因为可能你认ؓ相等Q而这个类的作者不q样认ؓQ而类的equalsҎ的实现是׃掌握的。如果你需要用equalsҎQ或者用Q何基于散列码的集合(HashSet,HashMap,HashTableQ,请察看一下java doc以确认这个类的equals逻辑是如何实现的?br />
问题三:String到底变了没有Q?br />
没有。因为String被设计成不可?immutable)c,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s 所指向的对象是否改变了呢?从本pdW一的l论很容易导个结论。我们来看看发生了什么事情。在q段代码中,s原先指向一个String对象Q内Ҏ "Hello"Q然后我们对sq行?操作Q那么s所指向的那个对象是否发生了改变呢?{案是没有。这Ӟs不指向原来那个对象了Q而指向了另一?String对象Q内容ؓ"Hello world!"Q原来那个对象还存在于内存之中,只是sq个引用变量不再指向它了?br />通过上面的说明,我们很容易导出另一个结论,如果l常对字W串q行各种各样的修改,或者说Q不可预见的修改Q那么用String来代表字W串的话会引起很大的内存开销。因?String对象建立之后不能再改变,所以对于每一个不同的字符Ԍ都需要一个String对象来表C。这Ӟ应该考虑使用StringBufferc,它允怿改,而不是每个不同的字符串都要生成一个新的对象。ƈ且,q两U类的对象{换十分容易?br />同时Q我们还可以知道Q如果要使用内容相同的字W串Q不必每ơ都new一个String。例如我们要在构造器中对一个名叫s的String引用变量q行初始化,把它讄为初始|应当q样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每ơ都会调用构造器Q生成新对象Q性能低下且内存开销大,q且没有意义Q因为String对象不可改变Q所以对于内容相同的字符Ԍ只要一个String对象来表C就可以了。也pQ多ơ调用上面的构造器创徏多个对象Q他们的Stringcd属性s都指向同一个对象?br />上面的结Zq样一个事实:对于字符串常量,如果内容相同QJava认ؓ它们代表同一个String对象。而用关键字new调用构造器QL会创Z个新的对象,无论内容是否相同?br />至于Z么要把Stringc设计成不可变类Q是它的用途决定的。其实不只StringQ很多Java标准cd中的c都是不可变的。在开发一个系l的时候,我们有时候也需要设计不可变c,来传递一l相关的|q也是面向对象思想的体现。不可变cL一些优点,比如因ؓ它的对象是只ȝQ所以多U程q发讉K也不会有M问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表Q可能会造成性能上的问题。所以Java标准cdq提供了一个可变版本,?StringBuffer?br />
问题四:final关键字到底修C什么?

final使得被修饰的变量"不变"Q但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义Q引用本w的不变Q和引用指向的对象不变?br />
引用本n的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//~译期错?br />
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //~译通过

可见Qfinal只对引用的“值?也即它所指向的那个对象的内存地址)有效Q它q引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化Qfinal是不负责的。这很类?=操作W:==操作W只负责引用的“值”相{,至于q个地址所指向的对象内Ҏ否相{,==操作W是不管的?br />
理解final问题有很重要的含义。许多程序漏z都Z?---final只能保证引用永远指向固定对象Q不能保证那个对象的状态不变。在多线E的操作?一个对象会被多个线E共享或修改Q一个线E对对象无意识的修改可能会导致另一个用此对象的线E崩溃。一个错误的解决Ҏ是在此对象新徏的时候把它声明ؓfinalQ意图得它“永q不变”。其实那是徒劳的?br />
问题五:到底要怎么样初始化Q?br />
本问题讨论变量的初始化,所以先来看一下Java中有哪些U类的变量?br />1. cȝ属性,或者叫值域
2. Ҏ里的局部变?br />3. Ҏ的参?br />
对于W一U变量,Java虚拟Z自动q行初始化。如果给Z初始|则初始化初始倹{如果没有给出,则把它初始化cd变量的默认初始倹{?br />
intcd变量默认初始gؓ0
floatcd变量默认初始gؓ0.0f
doublecd变量默认初始gؓ0.0
booleancd变量默认初始gؓfalse
charcd变量默认初始gؓ0(ASCII?
longcd变量默认初始gؓ0
所有对象引用类型变量默认初始gؓnullQ即不指向Q何对象。注意数l本w也是对象,所以没有初始化的数l引用在自动初始化后其g是null?br />
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创徏实例的时候初始化Qstatic属性在cd载,也就是第一ơ用到这个类的时候初始化Q对于后来的实例的创建,不再ơ进行初始化。这个问题会在以后的pd中进行详l讨论?br />
对于W二U变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,~译器会抗议。如果初始化的语句在try块中或if块中Q也必须要让它在W一ơ用前一定能够得到赋倹{也是_把初始化语句攑֜只有if块的条g判断语句中编译器也会抗议Q因为执行的时候可能不W合if后面的判断条Ӟ如此一来初始化语句׃会被执行了,q就q反了局部变量用前必须初始化的规定。但如果在else块中也有初始化语句,可以通过~译Q因为无论如何,L臛_一条初始化语句会被执行Q不会发生用前未被初始化的事情。对于try-catch也是一P如果只有在try块里才有初始化语句,~译部通过。如果在 catch或finally里也有,则可以通过~译。MQ要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要Z化成什么值好Q就用上面的默认值吧Q?br />
其实W三U变量和W二U本质上是一LQ都是方法中的局部变量。只不过作ؓ参数Q肯定是被初始化q的Q传入的值就是初始|所以不需要初始化?br />
问题六:instanceof是什么东东?

instanceof是Java的一个二元操作符Q和==Q?gt;Q?lt;是同一cM东。由于它是由字母l成的,所以也是Java的保留关键字。它的作用是试它左边的对象是否是它双的类的实例,q回booleancd的数据。D个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用Q指向一个String对象Q然后用instancof来测试它所指向的对象是否是Objectcȝ一个实例,昄Q这是真的,所以返回trueQ也是isObject的gؓTrue?br />instanceof有一些用处。比如我们写了一个处理̎单的pȝQ其中有q样三个c:

public class Bill {//省略l节}
public class PhoneBill extends Bill {//省略l节}
public class GasBill extends Bill {//省略l节}

在处理程序里有一个方法,接受一个Billcd的对象,计算金额。假设两U̎单计方法不同,而传入的Bill对象可能是两U中的Q何一U,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
q样可以用一个方法处理两U子cR?br />
然而,q种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实玎ͼq是面向对象变成应有的做法,避免回到l构化编E模式。只要提供两个名字和q回值都相同Q接受参数类型不同的Ҏ可以了Q?br />
public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下q不是推荐的做法Q应当好好利用多态?img src ="http://m.tkk7.com/SongJunke/aggbug/104258.html" width = "1" height = "1" />

Bill111 2007-03-16 15:19 发表评论
]]>
何ؓJ2ee?http://m.tkk7.com/SongJunke/archive/2007/03/14/103825.htmlBill111Bill111Wed, 14 Mar 2007 08:58:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/03/14/103825.htmlhttp://m.tkk7.com/SongJunke/comments/103825.htmlhttp://m.tkk7.com/SongJunke/archive/2007/03/14/103825.html#Feedback0http://m.tkk7.com/SongJunke/comments/commentRss/103825.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/103825.html
J2eeQJava 2 Enterprise EditionQ是建立在Java 2q_上的企业U应用的解决Ҏ。J2EE技术的基础便是Java 2q_Q不但有J2SEq_的所有功能,同时q提供了?a target="_new">EJBQ?a target="_new">ServletQJSPQ?a target="_new">XML{技术的全面支持Q其最l目标是成ؓ一个支持企业应用开发的体系l构Q简化企业解x案的开发,部v和管理等复杂问题。事实上QJ2EE已经成ؓ企业U开发的工业标准和首选^台?/font>

  J2EEq一个品,而是一pd的标准。市Z可以看到很多实现了J2EE的品,如BEA WebLogicQIBM WebSphere以及开?/a>?a target="_new">JBoss{等?/font>

      J2EEQ是sun公司提出的一个标准,W合q个标准的品叫"实现"Q其中你下蝲的sun公司的j2ee开发包中就有一个这L"实现"Q? jbossQweblogicQwebsphere都是j2ee标准的一?实现"。由于jbossQweblogicQwebsphere自n带有 j2ee?a target="_new">apiQ所以可以不使用sun的j2ee实现?/font>

一. J2EE的概?/strong>

      目前QJava 2q_?个版本,它们是适用于小型设备和卡的Java 2q_Micro版(Java 2 Platform Micro EditionQ?a target="_new">J2MEQ、适用于桌面系l的Java 2q_标准版(Java 2 Platform Standard EditionQJ2SEQ、适用于创建服务器应用E序和服务的Java2q_企业版(Java 2 Platform Enterprise EditionQJ2EEQ?/font>

      J2EE是一U利用Java 2q_来简化企业解x案的开发、部|和理相关的复杂问题的体系l构。J2EE技术的基础是核心Javaq_或Java 2q_的标准版QJ2EE不仅巩固了标准版中的许多优点Q例?~写一ơ、随处运?的特性、方便存?a target="_new">数据?/a>?a target="_new">JDBC API?a target="_new">CORBA技术以及能够在Internet应用中保护数据的安全模式{等Q同时还提供了对 EJBQ?a target="_new">Enterprise JavaBeansQ、Java Servlets API、JSPQJava Server PagesQ以及XML技术的全面支持。其最l目的就是成Z个能够企业开发者大q羃短投攑ָ场时间的体系l构?

      J2EE体系l构提供中间?/a>集成框架用来满无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用?a target="_new">需?/a>。通过提供l一的开发^収ͼJ2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持Q完全支持Enterprise JavaBeansQ有良好的向导支持打包和部v应用Q添加目录支持,增强了安全机Ӟ提高了性能?/font>

? J2EE的优?/strong>

     J2EE为搭建具有可伸羃性、灵zL、易l护性的商务pȝ提供了良好的机制:
      保留现存的IT资: ׃企业必须适应新的商业需求,利用已有的企?a target="_new">信息pȝ斚w的投资,而不是重新制定全盘方案就变得很重要。这P一个以渐进的(而不是激q的Q全盘否定的Q方式徏立在已有pȝ之上的服务器端^台机制是公司所需求的。J2EE架构? 以充分利用用户原有的投资Q如一些公怋用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。这之所以成为可能是因ؓJ2EE拥有q泛的业界支持和一些重要的'企业计算'领域供应商的参与。每一个供应商都对现有的客h供了不用废弃 已有投资Q进入可UL的J2EE领域的升U途径。由于基于J2EEq_的品几乎能够在M操作pȝ和硬仉|上q行Q现有的操作pȝ和硬件也能被保留使用?/font>

      高效的开? J2EE允许公司把一些通用的、很J琐的服务端d交给中间?/a>供应商去完成。这样开发h员可以集中精力在如何创徏商业逻辑上,相应地羃短了开发时间。高U中间g供应商提供以下这些复杂的中间件服?

      状态管理服?-- 让开发h员写更少的代码,不用兛_如何理状态,q样能够更快地完成程序开发?br />      持箋性服?-- 让开发h员不用对数据讉K逻辑q行~码p~写应用E序Q能生成更轻巧,与数据库无关的应用程序,q种应用E序更易于开发与l护?br />      分布式共享数?a target="_new">对象CACHE服务 -- 让开发h员编刉性能的系l,极大提高整体部v的׾~性?br />      支持异构环境: J2EE能够开发部|在异构环境中的可移植程序。基于J2EE的应用程序不依赖M特定操作pȝ、中间g、硬件。因此设计合理的ZJ2EE的程序只需开 发一ơ就可部|到各种q_。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客戯购与J2EE兼容的第三方的现成的lgQ把他们部v到异构环境中Q节省了p己制订整个方案所需的费用?br />      可׾~? 企业必须要选择一U服务器端^収ͼq种q_应能提供极佳的可伸羃性去满那些在他们系l上q行商业q作的大Ҏ客户。基于J2EEq_的应用程序可被部|? 到各U操作系l上。例如可被部|到高端UNIX与大型机pȝQ这U系l单机可支持64?56个处理器。(q是NT服务器所望尘莫及的)J2EE领域的供 应商提供了更为广泛的负蝲q{略。能消除pȝ中的瓉Q允许多台服务器集成部v。这U部|可达数千个处理器,实现可高度׾~的pȝQ满x来商业应用的 需要?br />      E_的可用? 一个服务器端^台必能全天候运转以满公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的Q即使在夜间按计划停Z可能造成严重? 失。若是意外停机,那会有灾难性后果。J2EE部v到可靠的操作环境中,他们支持长期的可用性。一些J2EE部v在WINDOWS环境中,客户也可选择? 壮性能更好的操作系l如Sun Solaris、IBM OS/390。最健壮的操作系l可辑ֈ99.999%的可用性或每年只需5分钟停机旉。这是实时性很强商业系l理想的选择?/font>

? J2EE 的四层模?/strong>

      J2EE使用多层的分布式应用模型Q应用逻辑按功能划分ؓlgQ各个应用组件根据他们所在的层分布在不同的机器上。事实上Qsun设计J2EE的初h是ؓ了解决两层模?client/server)的弊端,在传l模式中Q?a target="_new">客户?/a>? 当了q多的角色而显得臃肿,在这U模式中Q第一ơ部|的时候比较容易,但难于升U或改进Q可伸展性也不理惻I而且l常Z某种专有的协议――通常是某U数 据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业应用模型两层化模型中的不同层面切分成许多层。一个多层化应用能够Z同的每种服务提供一个独立的层,以下?J2EE 典型的四层结?

      q行在客L机器上的客户层组?br />      q行在J2EE服务器上的Web层组?br />      q行在J2EE服务器上的业务逻辑层组?br />      q行?a target="_new">EIS服务器上的企业信息系l?Enterprise information system)?a target="_new">软g

      J2EE应用E序lg
      J2EE应用E序是由lg构成?J2EElg是具有独立功能的软g单元Q它们通过相关?a target="_new">c?/a>?a target="_new">文gl装成J2EE应用E序Qƈ与其他组件交互。J2EE说明书中定义了以下的J2EElg:
      应用客户端程序和applets是客户层lg.
      Java Servlet和JavaServer Pages(JSP)是web层组?
      Enterprise JavaBeans(EJB)是业务层lg.

      客户层组?br />      J2EE应用E序可以是基于web方式?也可以是Z传统方式?
      web 层组件J2EE web层组件可以是JSP 面或Servlets.按照J2EE规范Q静态的HTML面和Applets不算是web层组件?/font>

      正如下图所C的客户层那Pweb层可能包含某?JavaBean 对象来处理用戯入,q把
输入发送给q行在业务层上的enterprise bean 来进行处理?/font>

      业务层组?br />      业务层代码的逻辑用来满银行Q零售,金融{特D商务领域的需?p行在业务层上的enterprise bean q行处理. 下图表明了一个enterprise bean 是如何从客户端程序接收数据,q行处理(如果必要的话), q发送到EIS 层储存的Q这个过E也可以逆向q行?/font>

      有三U企业的bean: 会话(session) beans, 实体(entity) beans, ?消息? ?message-driven) beans. 会话bean 表示与客LE序的时交? 当客LE序执行完后, 会话bean 和相x据就会消? 相反, 实体bean 表示数据库的表中一行永久的记录. 当客LE序中止或服务器关闭? ׃有潜在的服务保证实体bean 的数据得以保?消息驱动 bean l合了会话bean ?JMS的消息监听器的特? 允许一个业务层lg异步接收JMS 消息.

      企业信息pȝ?br />      企业信息pȝ层处理企业信息系l?a target="_new">软g?/a>括企业基pȝ例如企业资源计划 (ERP), 大型Z务处? 数据库系l?/a>,和其它的遗留信息pȝ. 例如QJ2EE 应用lg可能Z数据库连接需要访问企业信息系l?/font>

      我们J2EE的各U组件、服务和APIQ进行更加详l的阐述Q看看在开发不?a target="_new">cd的企业应用ӞҎ各自需求和目标的不同,应当如何灉|使用q组合不同的lg和服务?/font>

· Servlet

      Servlet是Javaq_上的CGI技术。Servlet在服务器端运行,动态地生成Web面。与传统的CGI和许多其它类似CGI的技术相比, Java Servleth更高的效率ƈ更容易用。对于ServletQ重复的h不会D同一E序的多ơ{载,它是依靠U程的方式来支持q发讉K的?/font>

· JSP

      JSP(Java Server Page)是一U实现普通静态HTML和动态页面输出؜合编码的技术。从q一Ҏ看,非常cMMicrosoft ASP?a target="_new">PHP{? 技术。借助形式上的内容和外观表现的分离QWeb面制作的Q务可以比较方便地划分l页面设计h员和E序员,q方便地通过JSP来合成。在q行时态, JSP会被首先{换成ServletQƈ以Servlet的Ş态编译运行,因此它的效率和功能与Servlet相比没有差别Q一样具有很高的效率?/font>

· EJB

      EJB定义了一l可重用的组ӞEnterprise Beans。开发h员可以利用这些组Ӟ像搭U木一样徏立分布式应用。在装配lgӞ所有的Enterprise Beans都需要配|到EJB服务?一般的Weblogic、WebSphere{?a target="_new">J2EE应用服务?/a>? 是EJB服务?中。EJB服务器作为容器和低层q_的桥梁管理着EJB容器Qƈ向该容器提供讉Kpȝ服务的能力。所有的EJB实例都运行在EJB容器 中。EJB容器提供了系l的服务,控制了EJB的生命周期。EJB容器为它的开发h员代了诸如安全性、远E连接、生命周期管理及事务理{技术环节, 化了商业逻辑的开发。EJB中定义了三种Enterprise BeansQ?/font>

?Session Beans

?Entity Beans

?Message-driven Beans

· JDBC

      JDBC(Java Database ConnectivityQ?a target="_new">Java数据库连?/a>)API是一个标?a target="_new">SQL(Structured Query LanguageQ? l构化查询语a)数据库访问接口,它数据库开发h员能够用标准Java API~写数据库应用程序。JDBC API主要用来q接数据库和直接调用SQL命o执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句及带IN和OUT参数的存储过E。Java中的JDBC相当与Microsoftq_中的ODBC(Open Database Connectivity)?/font>

· JMS

      JMS(Java Message ServiceQ?a target="_new">Java消息服务) 是一lJava应用接口Q它提供创徏、发送、接收、读取消息的服务。JMS API定义了一l公q应用E序接口和相应语法,使得Java应用能够和各U消息中间gq行通信Q这些消息中间g包括IBM MQ-Series、Microsoft MSMQ及纯Java的SonicMQ。通过使用JMS APIQ开发h员无需掌握不同消息产品的用方法,也可以用统一的JMS API来操U各U消息中间g。通过使用JMSQ能够最大限度地提升消息应用的可UL性?JMS既支持点对点的消息通信Q也支持发布/订阅式的消息通信?/font>

· JNDI

      ׃J2EE应用E序lg一般分布在不同的机器上Q所以需要一U机制以便于lg客户使用者查扑֒引用lg及资源。在J2EE体系中,使用JNDI (Java Naming and Directory Interface)定位各种对象Q这些对象包括EJB、数据库驱动、JDBC数据源及消息q接{。JNDI API为应用程序提供了一个统一的接口来完成标准的目录操作,如通过对象属性来查找和定位该对象。由于JNDI是独立于目录协议的,应用q可以? JNDI讉K各种特定的目录服务,如LDAP、NDS和DNS{?/font>

· JTA

      JTA(Java Transaction API)提供了J2EE中处理事务的标准接口Q它支持事务的开始、回滚和提交。同时在一般的J2EEq_上,L供一个JTS(Java Transaction Service)作ؓ标准的事务处理服务,开发h员可以用JTA来用JTS?/font>

· JCA

      JCA(J2EE Connector Architecture)是J2EE体系架构的一部分Qؓ开发h员提供了一套连接各U企业信息系l?EISQ包括ERP?a target="_new">SCM、CRM{?的体pL构,对于EIS开发商而言Q它们只需要开发一套基于JCA的EISq接适配器,开发h员就能够在Q何的J2EE应用服务器中q接q用它。基于JCA的连接适配器的实现Q需要涉及J2EE中的事务理、安全管理及q接理{服务组件?/font>

· JMX

      JMX(Java Management Extensions)的前w是JMAPI。JMX致力于解军_布式pȝ理的问题。JMX是一U?a target="_new">应用~程接口? 可扩展对象和Ҏ的集合体Q可以跨各U异构操作系l^台、系l体pȝ构和|络传输协议Q开发无~集成的面向pȝ、网l和服务的管理应用。JMX是一个完 整的|络理应用E序开发环境,它同时提供了厂商需要收集的完整的特性清单、可生成资源清单表格、图形化的用h口;讉KSNMP的网lAPIQ主机间q程q程调用Q数据库讉KҎ{?/font>

· JAAS

      JAAS(Java Authentication and Authorization Service)实现了一个Java版本的标准Pluggable Authentication Module(PAM)的框架。JAAS可用来进行用戯n份的鉴定Q从而能够可靠ƈ安全地确定谁在执行Java代码。同时JAASq能通过对用戯行授 权,实现Z用户的访问控制?/font>

· JACC

      JACC(Java Authorization Service Provider Contract for Containers)在J2EE应用服务器和特定的授权认证服务器之间定义了一个连接的协约Q以便将各种授权认证服务器插入到J2EE产品中去?/font>

· JAX-RPC

      通过使用JAX-RPC(Java API for XML-based RPC)Q已有的JavacLJava应用都能够被重新包装Qƈ以Web Services的Ş式发布。JAX-RPC提供了将RPC参数(in/out)~码和解码的APIQ开发h员可以方便地使用SOAP消息来完成RPC 调用。同P对于那些使用EJB(Enterprise JavaBeans)的商业应用而言Q同样可以用JAX-RPC来包装成Web服务Q而这个Web Servoce的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部|和实现Q对Web服务的开发h员而言Q? SOAP/WSDL变得透明Q这有利于加速Web服务的开发周期?/font>

· JAXR

      JAXRQJava API for XML RegistriesQ提供了与多U类型注册服务进行交互的API。JAXRq行客户端访问与JAXR规范相兼容的Web ServcicesQ这里的Web Services即ؓ注册服务。一般来_注册服务L以Web Services的Ş式运行的。JAXR支持三种注册服务cdQJAXR Pluggable Provider、Registry-specific JAXR Provider、JAXR Bridge Provider(支持UDDI Registry和ebXML Registry/Repository{??/font>

· SAAJ

      SAAJ(SOAP with Attachemnts API for Java)是JAX-RPC的一个增强,行低层次的SOAP消息操纵提供了支持?/font>

? J2EE 的结?/strong>

      q种ZlgQ具有^台无x的J2EE l构使得J2EE E序的编写十分简单,因ؓ业务逻辑被封装成可复用的lgQƈ且J2EE 服务器以容器的Ş式ؓ所有的lgcd提供后台服务. 因ؓ你不用自己开发这U服? 所以你可以集中_֊解决手头的业务问?

      容器和服?/font>

      容器讄定制了J2EE服务器所提供得内在支持,包括安全Q事务管理,JNDI(Java Naming and Directory Interface)d,q程q接{服务,以下列出最重要的几U服务:

      J2EE安全(Security)模型可以让你配置 web lg或enterprise bean ,q样只有被授权的用户才能讉Kpȝ资源. 每一客户属于一个特别的角色Q而每个角色只允许Ȁzȝ定的Ҏ。你应在enterprise bean的布|描qC声明角色和可被激zȝҎ。由于这U声明性的ҎQ你不必~写加强安全性的规则?/font>

      J2EE 事务理QTransaction ManagementQ模型让你指定组成一个事务中所有方法间的关p,q样一个事务中的所有方法被当成一个单一的单? 当客LȀzM个enterprise bean中的ҎQ容器介入一理事务。因有容器管理事务,在enterprise bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布|描q文件中声明enterprise bean的事务属性,而不用编写ƈ调试复杂的代码。容器将L文gqؓ你处理此enterprise bean的事务?/font>

      JNDI d(JNDI Lookup)服务向企业内的多重名字和目录服务提供了一个统一的接?q样应用E序lg可以讉K名字和目录服?

      J2EEq程q接QRemote Client ConnectivityQ模型管理客L和enterprise bean间的低层交互. 当一个enterprise bean创徏? 一个客L可以调用它的Ҏp它和客户端位于同一虚拟Z一?

      生存周期理QLife Cycle ManagementQ模型管理enterprise bean的创建和U除,一个enterprise bean在其生存周期中将会历l几U状态。容器创建enterprise beanQƈ在可用实例池与活动状态中Ud他,而最l将其从容器中移除。即使可以调用enterprisebean的create及removeҎQ容 器也会在后台执行这些Q务?/font>

五、企业应用CZ

      下面我们通过假设一个企业应用的J2EE实现Q来了解各种lg和服务的应用。假讑ֺ用对象是计算?/a>产品的生产商/零售商的销售系l,q个销售系l能够通过自己的网站发布品信息,同时也能品目录传送给计算Z品交易市场。销售系l能够在U接受订?来自自己的Web|站或者来自计机产品交易市场)Qƈ随后转入内部企业理pȝq行相关的后l处理?/font>

      参见?Q这个企业应用可以这U方式架构。该企业应用的核心是产品目录理和品定购管理这两个业务逻辑Q用EJB加以实现Qƈ部v在EJB容器中。由于品目录和定购信息都需要持久化Q因此用JDBCq接数据库,q用JTA来完成数据库存取事务?/font>


? J2EE应用CZ

      然后使用JSP/Servlet来实现应用的Web表现Q在U品目录浏览和在线定购。ؓ了将产品目录发送给特定的交易市场,使用JMS实现异步的基于消 息的产品目录传输。ؓ了得更多的其它外部交易市场能够集成产品目录和定购业务,需要用Web Services技术包装商业逻辑的实现。由于品定购管理需要由公司内部雇员q行处理Q因此需要集成公司内部的用户pȝ和访问控制服务以方便雇员的 用,使用JACC集成内部的访问控制服务,使用JNDI集成内部的用L录,q用JAASq行讉K控制。由于品订购事务会触发后箋的企业ERPpȝ? 相关操作(包括仓储、胦务、生产等)Q需要用JCAq接企业ERP?/font>

      最后ؓ了将q个应用U_C业整体的pȝ理体系中去Q用Application Client架构了一个管理客L(与其它企业应用管理应用部|在一台机器上)Qƈ通过JMX理q个企业应用?/font>

                                                                                    ( 摘自中科永联 高技术培训中?/font> )



Bill111 2007-03-14 16:58 发表评论
]]>JUnit试的理?/title><link>http://m.tkk7.com/SongJunke/archive/2007/03/13/103525.html</link><dc:creator>Bill111</dc:creator><author>Bill111</author><pubDate>Tue, 13 Mar 2007 06:18:00 GMT</pubDate><guid>http://m.tkk7.com/SongJunke/archive/2007/03/13/103525.html</guid><wfw:comment>http://m.tkk7.com/SongJunke/comments/103525.html</wfw:comment><comments>http://m.tkk7.com/SongJunke/archive/2007/03/13/103525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/SongJunke/comments/commentRss/103525.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/SongJunke/services/trackbacks/103525.html</trackback:ping><description><![CDATA[ <table id="table105" style="border-collapse: collapse;" cellpadding="3" width="100%"> <tbody> <tr> <th style="padding: 5px;"> <div align="left"> <span id="cq0myuw" class="zi18"> <strong> <font color="#445cbb" size="5">~写JUnit试的理由和几条试习惯</font> </strong> </span> </div> </th> </tr> <tr> <th style="padding: 5px;" bordercolor="#808080" bgcolor="#f0f0f0"> <p align="left"> <font style="font-size: 9pt;"> <span style="font-weight: 400;"> <font color="#666666"> <strong> moneyice</strong> </font> <strong style="font-weight: 400;"> 发表?</strong> <font color="#666666"> <strong> 2006 q?06 ?19 ? </strong> </font> </span> </font> </p> </th> </tr> <tr> <th style="padding: 5px;"> <div align="left"> <span style="font-weight: 400;"> <span id="s0m00u8" class="unnamed4"> <p> <font style="font-size: 9pt;">~写JUnit试的理?/font> </p> <p> <font style="font-size: 9pt;">·JUnit在保证质量的同时提高代码~写速度 <br />看v来不可思议Q但是事实。用JUnit后,花在调试的时间就会更,在改变代码的时候更有信心。有了这U信心,你可以在重构代码Q添加新Ҏ的时候更有闯劌Ӏ?<br />? 果没有测试,那么重构或者添加新Ҏ很Ҏ成ؓ妄想Q因Z无法知晓什么地方会被破坏掉。如果拥有完善的试套,在改变代码后Q立卌行测试,q样可? 得到信心Q你的改变没有破坏Q何东ѝ当q行试Ӟ如果出bugQ因Z码在脑v里还很清楚,所以bug很容易被解决。用JUnit~写试Q可? 使你的代码编写达到极限速度Q而且快速定位bug?<br />·JUnit 及其?br />试应该很简单,q一点很关键。如果测试太复杂Q花费太多时_~写试׃太值得了。用JUnitQ你可以快速的写出试代码来验证程序。随着软g的增长相应的增加试代码?br />使用JUnitQ运行测试也变得很简单而且很快速?br />·JUnit 验证它们自己的结果,而且能够立即反馈<br />JUnit试能够自动q行Q它们检查自w的l果。运行测试后Q你会立卛_到可视化的反馈,试通过或者失败。不需要手工来输出试l果报告?br />·JUnit 试可以被组合ؓ不同层次的测试套<br />JUnit试可以被整合到试套中Q测试套可以包含试用例或者其他的试套。JUnit试的组合行Z你可以聚集一l测试用例ؓ一个测试套Q也可以多个测试套l合C个测试套中。你可以q行M一个层ơ的试套?br />·~写 JUnit 试代h很小 <br />使用JUnit试框架Q你可以代h很小的编写测试,而且享受着试框架提供的便利。写试单到Q就是编写一个方法,使用一下要试的代码,定义一个期望的l果?<br />·JUnit 试增强了Y件的E_性。测试越,代码的稳定性就差。测试验证了软g的稳定性,保证了更Ҏ有在目中引hLUҎ应?/font> </p> <p> <font style="font-size: 9pt;">JUnit 试是程序员的测试。JUnit试是用来提高程序员的效率和代码质量。与功能试不同Q功能测试是整个系l视作黑盒,从整体保证Y件有效。单元测试是 用来试实现基本功能的代码块。程序员~写q维护JUnit试代码。当一ơ开发P代完成,试代码也要同步的更斎ͼ作ؓҎơP代的质量验证?</font> </p> <p> <font style="font-size: 9pt;">试习惯</font> </p> <p> <font style="font-size: 9pt;">~写JUnit试Ӟ保以下牢记在心: <br />·只用试到的地方才会q行的很好?br />·一?写一? 一?写一?.. <br />·取保所有的试都要执行?br />·最每天一ơ运行所有的试用例 (或一??br />·为最有破坏可能性的代码~写完善的测试?br />·Z最有可能获得回报的地方~写试?br />·如果你L在调试某个地方,~写JUnit试自动验证l果来代替调试?br />·如果有bug被报告,~写试来暴露这个bug?br />·有h让你帮助调试的时候,帮助他写试用例?br />·在编写代码之前编写单元测试代码,只有试p|的时候才写新代码。写最单的C码让试通过?br /></font> </p> <p> <font style="font-size: 9pt;"> </font> </p> </span> </span> </div> </th> </tr> </tbody> </table> <img src ="http://m.tkk7.com/SongJunke/aggbug/103525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/SongJunke/" target="_blank">Bill111</a> 2007-03-13 14:18 <a href="http://m.tkk7.com/SongJunke/archive/2007/03/13/103525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序片段http://m.tkk7.com/SongJunke/archive/2007/03/09/102854.htmlBill111Bill111Fri, 09 Mar 2007 08:07:00 GMThttp://m.tkk7.com/SongJunke/archive/2007/03/09/102854.htmlhttp://m.tkk7.com/SongJunke/comments/102854.htmlhttp://m.tkk7.com/SongJunke/archive/2007/03/09/102854.html#Feedback0http://m.tkk7.com/SongJunke/comments/commentRss/102854.htmlhttp://m.tkk7.com/SongJunke/services/trackbacks/102854.htmlpublic static String getDateSql(Date sDate, String dateType) {
        String start = sDate.getYear() + 1900 + "-" + (sDate.getMonth() + 1)
                + "-" + sDate.getDate() + " 00:00:00";
        String end = sDate.getYear() + 1900 + "-" + (sDate.getMonth() + 1)
                + "-" + sDate.getDate() + " 23:59:59";
        String sql = " and " + dateType + " >= TO_DATE('" + start
                + "','YYYY-MM-DD HH24:MI:SS') and " + dateType
                + " <= TO_DATE('" + end
                + "','YYYY-MM-DD HH24:MI:SS') order by " + dateType;
        return sql;
    }

//Java SWT中对于文本框只能输入数字的限?br />/**
     * 数字校验
     *
     * @param text
     */
    private void checkNumber(Text text) {
        text.addVerifyListener(new VerifyListener() {
            public void verifyText(VerifyEvent e) {
                e.doit = ("0123456789.".indexOf(e.text) >= 0);
                if (e.keyCode == SWT.BS || e.keyCode == SWT.DEL
                        || e.keyCode == SWT.HOME || e.keyCode == SWT.END)
                    e.doit = true;
            }
        });
    }

//对于一些复杂的查询时可以用HashMap来处?br />private String getHql(List<Long> respList,List<Long> customerList, Map<String, Object> map){
        String hql = " from CrmFeedBack t where 1=1";
        Object key, value;
        if (respList != null && respList.size() > 0) {
            hql += " and t.resp_Idx in (";
            for (Long id : respList) {
                hql += id + ",".trim();
            }
            hql += ")";
            hql = hql.replace(",)", ")");
        }
        if (customerList != null && customerList.size() > 0) {
            hql += " and t.client_Name in (";
            for (Long id : customerList) {
                hql += id + ",".trim();
            }
            hql += ")";
            hql = hql.replace(",)", ")");
        }
        if (map != null && map.size() > 0) {
            Iterator it = map.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry entry = (Map.Entry) it.next();
                key = entry.getKey();
                value = entry.getValue();
                if (key.equals("resp_Idx") || key.equals("priority")) {
                    hql += " and t." + key + "= " + value;
                } else {
                    hql += " and t." + key + " like '%" + value + "%'";
                }
            }
        }
        return hql;
}

///////////////
   /**
     * Creates the initial layout for a page.
     */
    public void createInitialLayout(IPageLayout layout) {
        String editorArea = layout.getEditorArea();
        layout.setEditorAreaVisible(false);
        IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT,
                0.2f, editorArea);
        left.addView(MyTreeView.ID);
        left.addView(NavigationView.ID);
        IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT,
                0.8f, editorArea);
        right.addView(MyTableView.ID);
        addFastViews(layout);
        addViewShortcuts(layout);
        addPerspectiveShortcuts(layout);
    }
//得到pȝ文g夹的Ҏ
    Image image=PlatformUI.getWorkbench().getSharedImages().getImage(
                ISharedImages.IMG_OBJ_FOLDER);

private bool IsNumeric(string str) 
{  
   System.Text.RegularExpressions.Regex reg
       = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");  
   return reg.IsMatch(str); 
}

MarQuee的用?br />
基本语法
<marquee> ... </marquee>
Ud属性的讄 ,q种Ud不仅仅局限于文字Q也可以应用于图片,表格{等
方向
<direction=#> #=left, right ,up ,down <marquee
direction=left>从右向左U!</marquee>
方式
<bihavior=#> #=scroll, slide, alternate <marquee
behavior=scroll>一圈一圈绕着赎ͼ</marquee>
<marquee behavior=slide>只走一ơ就歇了Q?lt;/marquee>
<marquee behavior=alternate>来回?lt;/marquee>
循环
<loop=#> #=ơ数Q若未指定则循环不止(infinite) <marquee loop=3 width=50%
behavior=scroll>只走 3 ?lt;/marquee> <P>
<marquee loop=3 width=50% behavior=slide>只走 3 ?lt;/marquee>
<marquee loop=3 width=50% behavior=alternate>只走 3 !</marquee>
速度
<scrollamount=#> <marquee scrollamount=20>啦啦啦,我走得好快哟Q?lt;/marquee>
延时
<scrolldelay=#> <marquee scrolldelay=500
scrollamount=100>啦啦啦,我走一步,停一停!</marquee>
外观(Layout)讄
寚w方式(Align)
<align=#> #=top, middle, bottom <font size=6>
<marquee align=# width=400>啦啦啦,我会UdӞ</marquee>
</font>
底色
<bgcolor=#> #=rrggbb 16 q制数码Q或者是下列预定义色彩:
Black, Olive, Teal, Red, Blue, Maroon, Navy, Gray, Lime,
Fuchsia, White, Green, Purple, Silver, Yellow, Aqua <marquee
bgcolor=aaaaee>颜色Q?lt;/marquee>
面积
<height=# width=#> <marquee height=40 width=50%
bgcolor=aaeeaa>面积Q?lt;/marquee>
I白
(Margins)<hspace=# vspace=#>
<marquee hspace=20 vspace=20 width=150 bgcolor=ffaaaa
align=middle>面积Q?lt;/marquee>


Bill111 2007-03-09 16:07 发表评论
]]>
վ֩ģ壺 ƷƵѹۿ| ޾Ʒ| ߹ۿѳ| ձ˳Ƶ߹ۿ| žƵƵѹۿ| 츾V߲| Ƶ߹ۿ| ޾ƷþþӰԺӰƬ| ø߹ۿ| žžžƷƵ| ĻƵ| ߵƵ߹ۿ| caopormѹƵ| ۺ| պav| ˾Ʒձר| Ů18ëƬˮ| ѿav뾫Ʒɫҹ| ޳AVƬ| ޾ƷŮþþ| ۺպþóAV| ձ| һƬѿ| 91Ʒһ鶹| ѹƵ| ˾Ʒֱ| ƷҹѸ| ƷŮ߹ۿ| ѱ̬Ƶַվ| avһ| | ĻӰѿ| ƷɫҹƵѿ| Av߲| ޸ľƷԭ| ޹aƵ| avרavý | avպavۺ| avƬ߹ۿ| 츾avvrӰ| av뾫ƷϼӰ|