??xml version="1.0" encoding="utf-8" standalone="yes"?>西西人体44rt高清亚洲,99人中文字幕亚洲区,国产精品亚洲w码日韩中文http://m.tkk7.com/libin2722/category/25647.html虚其心,可解天下之问Q专其心Q可d下之学;静其心,可悟天下之理Q恒其心Q可成天下之业?/description>zh-cnThu, 29 May 2008 11:27:59 GMTThu, 29 May 2008 11:27:59 GMT60JBoss启动做成Windows的系l服?/title><link>http://m.tkk7.com/libin2722/archive/2008/05/29/203794.html</link><dc:creator>C物</dc:creator><author>C物</author><pubDate>Thu, 29 May 2008 04:46:00 GMT</pubDate><guid>http://m.tkk7.com/libin2722/archive/2008/05/29/203794.html</guid><wfw:comment>http://m.tkk7.com/libin2722/comments/203794.html</wfw:comment><comments>http://m.tkk7.com/libin2722/archive/2008/05/29/203794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/libin2722/comments/commentRss/203794.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/libin2722/services/trackbacks/203794.html</trackback:ping><description><![CDATA[<font size="2">里将用到JavaService.exe q个E序JBoss启动做成Windows的系l服务?/font> <div><font size="2">W一?下蝲jboss-4.2.2,q安装到某一个目录下.</font></div> <div><font size="2">W二步: 复制 JavaService.exe 文g?JBOSS_HOME%\bin目录下;</font></div> <div><font size="2"><span>       </span>如果没有JavaService.exe 可以?/font><a ><font size="2">http://javaservice.objectweb.org/</font></a><font size="2"> |站上下载;</font></div> <div><font size="2">W三步: 讄环境变量Q?/font></div> <div><font size="2"><span>       </span>JAVA_HOME讄成jdk的目录,例如QD:\develop\java\jdk1.6.0</font></div> <div><font size="2"><span>       </span>JBOSS_HOME讄成JBOSS的目录,例如QD:\Develop\jboss-4.2.0.GA</font></div> <div><span style="color: red;"><font size="2">注意Q在环境变量中目录不能有I格Q否则会造成服务无法启动?/font></span></div> <div><font size="2">W三步: 通过Windows的运?#8220;cmd”或?#8220;command”打开dosq行H口Q进?#8220;%JBOSS_HOME%\bin”路径Q?/font></div> <div><font size="2"><font face="Arial">JavaService.exe -install JBoss %Java_Home%\jre\bin\server\jvm.dll -Djava.class.path="%JBOSS_HOME%\bin\run.jar;%JAVA_HOME%\lib\tools.jar" -Xms64M -Xmx128M -start org.jboss.Main -stop org.jboss.Main -method systemExit -out "%JBOSS_HOME%\server\default\log\out.log" -err "%JBOSS_HOME%\server\default\log\err.log" -current "%JBOSS_HOME%\bin" -overwrite -startup 6</font></font></div> <div><font size="2">q行后,会提示Q?#8220;The JBoss automatic service war successfully installed”Q提C服务安装完成,可以在Windows的服务管理列表中扑ֈ名称?#8220;JBoss”的服务。输入:“net start JBoss”启动服务Q服务启动可能需要一定时_打开新的IE览器在地址栏输入:</font><a href="http://localhost:8080/"><font size="2">http://localhost:8080</font></a><font size="2"> 会有提示面Q表C服务启动成功?/font></div> <div><font size="2">注意:如何卸蝲服务Q?/font></div> <div><font size="2"><span>       </span>在dos命oH口输入Q?#8220;JavaService.exe –uninstall 服务名称(一般是jboss)”</font></div> <div><font size="2">另外此方法也使用于其他的服务Q需要在W四步时更改相应的参数?/font></div> <img src ="http://m.tkk7.com/libin2722/aggbug/203794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/libin2722/" target="_blank">C物</a> 2008-05-29 12:46 <a href="http://m.tkk7.com/libin2722/archive/2008/05/29/203794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>smsql自动生成.http://m.tkk7.com/libin2722/archive/2008/02/28/182720.htmlC物C物Thu, 28 Feb 2008 08:20:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/28/182720.htmlhttp://m.tkk7.com/libin2722/comments/182720.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/28/182720.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/182720.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/182720.html

C物 2008-02-28 16:20 发表评论
]]>
JAVA与正则表辑ּhttp://m.tkk7.com/libin2722/archive/2008/02/13/179862.htmlC物C物Wed, 13 Feb 2008 15:09:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179862.htmlhttp://m.tkk7.com/libin2722/comments/179862.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179862.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179862.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179862.html1黑暗岁月

       有一?/a>StringQ如何查询其中是否有y?/a>f字符Q最黑暗的办法就是:

E序1Q我知道if?/a>for语句?/a>charAt()啊?/a>

class Test{

  public static void main(String args[]) {

         String str="For my money, the important thing "+

         "about the meeting was bridge-building";

         char x='y';

         char y='f';

         boolean result=false;

         for(int i=0;i

                char z=str.charAt(i); //System.out.println(z);

                if(x==z||y==z) {

                       result=true;

                       break;

                }

                else result=false;

        

         System.out.println(result);

       }

}

       好像很直观,但这U方式难以应付复杂的工作。如查询一D|字中Q是否有isQ是否有thing?/a>ting{。这是一个讨厌的工作?/a>

§2 Java?/span>java.util.regex?/span>

       按照面向对象的思\Q把希望查询的字W串?/a>is?/a>thing?/a>ting装成一个对象,以这个对象作为模板去匚w一D|字,更加自然了。作为模板的那个东西是下面要讨论的正则表达式。先不考虑那么复杂Q看一个例子:

E序2Q不懂。先看看可以吧?

import java.util.regex.*;

class Regex1{

  public static void main(String args[]) {

         String str="For my money, the important thing "+

         "about the meeting was bridge-building";

         String regEx="a|f";   //表示a?/a>f

         Pattern p=Pattern.compile(regEx);

         Matcher m=p.matcher(str);

         boolean result=m.find();

         System.out.println(result);

       }

}

       如果str匚wregExQ那?/a>result?/a>trueQ否则ؓflase。如果想在查找时忽略大小写,则可以写成:

Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

       虽然暂时不知?/a>PatternQ模ѝ模式)?/a>MatcherQ匹配器Q的l节Q程序的感觉比较爽Q如果先查询is、后来又要查?/a>thing?/a>tingQ我们只需要修改一下模?/a>PatternQ而不是考虑if语句?/a>for语句Q或者通过charAt()?/a>

1?/a>写一个特D的字符东y—正则表辑ּ?/a>a|f?/a>

2?/a>正则表辑ּ~译成一个模板:p

3?/a>用模?/a>pd配字W串str?/a>

       思\清楚了,现在?/a>Java是如何处理的Q?/a>JavaE序员直?/a>JDK1.4才能使用q些cR?/a>

§3 PatterncM查找

       ?/a>public final class java.util.regex.Pattern?/a>正则表达式编译后的表达法。下面的语句创Z?/a>Pattern对象q赋值给句柄pQ?/span>Pattern p=Pattern.compile(regEx);

       有趣的是Q?/a>PatterncLfinalc,而且它的构造器?/span>private。也许有人告诉你一些设计模式的东西Q或者你自己查有兌料。这里的l论是:PatterncM能被l承Q我们不能通过new创徏Patterncȝ对象?/span>

       因此?/a>PatterncMQ提供了2个重载的静态方法,其返回值是Pattern对象Q的引用Q。如Q?/span>

    public static Pattern compile(String regex) {

        return new Pattern(regex, 0);

    }

       当然Q我们可以声?/a>Patterncȝ句柄Q如Pattern p=nullQ?/span>

       ?/a>p.matcher(str)表示以用模板pȝ成一个字W串str的匹配器Q它的返回值是一?/a>Matchercȝ引用Qؓ什么要q个东西呢?按照自然的想法,q回一?/a>booleang行吗Q?/a>

       我们可以单的使用如下ҎQ?/a>

       boolean result=Pattern.compile(regEx).matcher(str).find();

       呵呵Q其实是三个语句合ƈ的无句柄方式。无句柄常常不是好方式。后面再学习Matchercd。先看看regEx——这个怪咚咚?/a>

§4 正则表达式之限定W?/span>

       正则表达式(Regular ExpressionQ?/a>是一U?span style="background: yellow none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">生成字符串的字符?/span>。晕吧。比如说Q?/a>String regEx="me+";q里字符?/a>me+能够生成的字W串是:me?/a>mee?/a>meee?/a>meeeeeeeeee{等Q一个正则表辑ּ可能生成无穷的字W串Q所以我们不可能Q有必要吗?Q输出正则表辑ּ产生的所有东ѝ?/a>

反过来考虑Q对于字W串Q?/a>me?/a>mee?/a>meee?/a>meeeeeeeeee{等Q我们能否有一U?strong>语言Lq它们呢Q显Ӟ正则表达式语a是这U语aQ它是一些字W串的模式——简z而深ȝ描述?/a>

我们使用正则表达式,用于字符串查找、匹配、指定字W串替换、字W串分割{等目的?/a>

       生成字符串的字符东y—正则表辑ּQ真有些复杂Q因为我们希?/a>由普通字W(例如字符 a ?/a> zQ以及特D字W(UCؓ元字W)描述L的字W串Q而且要准?/a>

       先搞几个正则表达?/a>例子Q?/a>

       E序3Q我们ȝq个E序试正则表达式?/a>

       import java.util.regex.*;

class Regex1{

  public static void main(String args[]) {

         String str="For my money, the important thing "Q?/a>

         String regEx="ab*";

         boolean result=Pattern.compile(regEx).matcher(str).find();

         System.out.println(result);

       }

}//ture

?/a>"ab*"——能匚wa?/a>ab?/a>abb?/a>abbb……。所以,*表示前面字符可以有零ơ或多次。如果仅仅考虑查找Q直接用"a"也一栗但x替换的情c?/a>问题regEx="abb*"l果如何Q?/a>

?/a>"ab+"——能匚wab?/a>abb?/a>abbb……。等价于"abb*"?/a>问题regEx="or+"l果如何Q?/a>

?/a>"or?"——能匚wo?/a>or?/a>? 表示前面字符可以有零ơ或一ơ?/a>

       q些限定W?/a>*?/a>+?/a>?方便地表CZ其前面字W?/a>(子串)出现的次敎ͼ我们?/a>{}来描qͼQ?/a>

x*

零次或多?/span>≡{0,}




C物 2008-02-13 23:09 发表评论
]]>
File Classhttp://m.tkk7.com/libin2722/archive/2008/02/13/179861.htmlC物C物Wed, 13 Feb 2008 15:08:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179861.htmlhttp://m.tkk7.com/libin2722/comments/179861.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179861.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179861.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179861.html 2.         class File的应?br /> 2.1          查看Q查询)某个路径下的文g信息?br /> 2.1.1          class File的构造函?br /> class File有两cL造函敎ͼ一cd有一个参敎ͼ用于产生一个描q参数所所指向的\径下的文件系l的对象Q另一cd有两敎ͼW一个参数表C\径,W二个参? 表示子目录,用来产生描述W一个参数所指向的\径下的某个子目录的文件信息,子目录名U由W二个参数指定。如Q?br /> File path = new File(“c:""”);产生一个描qc:"下的文g信息的对?br /> File path = new File(“c:""”, “test”);产生一个描qc:"的test子目录的文g信息的对象?br /> 2.1.2          list()和list(FilenameFilter filter)函数
1)        list()函数以String数组的Ş式返回一个File对象所描述的文件信息。返回的是\径下的所有文件和目录的文件名和目录名?br /> 2)        list(FilenameFilter filter)函数则提供了查询功能Q通过它可能查询出满特定条g的文件名和目录名?br /> 2.1.3          用FinenameFilter接口q行文g或目录的查询
2.1.3.1.   q个接口只包含一个函敎ͼboolean accept(File dir, String name)Q第二个参数代表一个文件或目录的名UͼW一个参C表文件或目录所在的目录的名U。当q回trueQ表C文件满x询条Ӟ要被攑օl果中; 否则Q表C文件不满要求?br /> 2.1.3.2.  工作原理
当调用某个File对象的list(FilenameFilter filter)函数Ӟ 会对File对象中的每一个文件或目录调用参数filter中的accept()Ҏ。在对一个文件或目录调用accept()函数时把它的名称以及一? 描述它所在的目录的File对象作ؓ参数传给accept()函数?br /> 2.1.4          一个简单的实例
import java.io.File;
import java.io.FilenameFilter;
class DirList{
    public void printFile(String dir, String filter){
        File path = new File(dir);
        String[] fileList;
        if(filter.length()==0){
            System.out.println(""nAll file:");
            fileList = path.list(); //取得所有文件信?br />        }
        else{
System.out.println(""nAll file including " + filter);
//取得满查询条g的文件信?br />             fileList = path.list(new DirFilter(filter));
        }
        for(int i=0; i<fileList.length; i++)
            System.out.println(fileList[i]);
    }
    public void printFile(String dir){
        printFile(dir, "");
    }
}
class DirFilter implements FilenameFilter{
    String afn; //存放查询条g
DirFilter(String afn) { this.afn = afn; }
//满查询条gQ返回true
    public boolean accept(File dir, String name){
        return name.indexOf(afn)!=-1;
    }
}
public class TestIO{
    public static void main(String[] args){
        DirList dirList = new DirList();
              //昄F:"test下的文g信息
        dirList.printFile("F:""test");
              //昄F:"test下名U包?#8220;.rar”文g信息
        dirList.printFile("F:""test", ".rar");
        //昄F:"test下名U包?#8220;r”文g信息
dirList.printFile("F:""test", "r");
    }
}
q个只是一个简单的例子Q只要完善accept()函数Q你也可以做Z个Java版的dir命o来?br /> 2.2          当然Q我们还能通过File来文件或目录q行创徏、删除和改名的操作?br /> import java.io.File;
import java.io.FilenameFilter;
import java.util.Date;
import java.text.SimpleDateFormat;
class DirFilter implements FilenameFilter{
    String afn;
    DirFilter(String afn) { this.afn = afn; }
    public boolean accept(File dir, String name){
        return name.indexOf(afn)!=-1;
    }
}
class OptFile{
    public static String getAbsolutePath(File f){
        return f.getAbsolutePath();
    }
    public static String getPath(File f){
        return f.getParent();
    }
    public static String getName(File f){
        return f.getName();
    }
    public static long getLength(File f){
        return f.length();
    }
    public static String getParent(File f){
       return f.getParent();
    }
    public static String getLastModified(File f, String format){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        if(format.equals("ymdh"))
            sdf = new SimpleDateFormat("yyyy-MM-dd hh");
        else if(format.equals("ymdhm"))
            sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        return sdf.format((new Date(f.lastModified())));
    }
    public static String getLastModified(File f){
        return getLastModified(f, "ymd");
    }
    public static boolean canRead(File f){
        return f.canRead();
    }
    public static boolean canWrite(File f){
        return f.canWrite();
    }
    public static boolean isFile(File f){
        return f.isFile();
    }
    public static boolean isDir(File f){
        return f.isDirectory();
    }
    public static boolean rename(File oldName, File newName){
        return oldName.renameTo(newName);
    }
    public static boolean delete(File f){
        return f.delete();
    }
    public static boolean mkdir(File f){
        return f.mkdirs();
    }
    /**
     * 从指定\径中查询文g
     */
    public static File[] findFile(String filePath, String fileName){
        File f = new File(filePath);
        File[] result = f.listFiles(new DirFilter(fileName));
        return result;
    }
    public static void printFileAtt(File f){       
        System.out.println(
            " Absolute path: " + getAbsolutePath(f) +
            ""n Can read: " + canRead(f) +
            ""n Can write: " + canWrite(f) + 
            ""n path: " + getPath(f) +
            ""n name: " + getName(f) +
            ""n parent: " + getParent(f) +
            ""n length: " + getLength(f) +
            ""n lastModified: " + getLastModified(f));
        if(isFile(f))
            System.out.println(" it's a file");
        else if(isDir(f))
            System.out.println(" it's a directory");
    }
}
public class TestIO{
    public static void main(String[] args){
        File f1 = new File("F:""nepalon""thinkinginjava""test");
        File f2 = new File("F:""nepalon""thinkinginjava""test""aa ");
        OptFile.printFileAtt(f1);
        OptFile.printFileAtt(f2);
        //当对文g或目录进行改名,且更新到一个不同的下时Q?br />         //会先把文件或整个目录剪切到新目录下,再重新命?br />         File nf2 = new File("F:""nepalon""thinkinginjava""使用log4j.files");
        if(OptFile.rename(f2, nf2)){
            System.out.println("after rename f2:");
            OptFile.printFileAtt(nf2);
        }
        else
            System.out.println("rename nf2 failly");
      //q行删除操作Ӟ只能删除文gQ如果删除的是目录,会返回false
        File df = new File("F:""nepalon""thinkinginjava""test""1001.doc");
        if(OptFile.delete(df))
            System.out.println("Delete df successfully");
        else
            System.out.println("Delete df failly");
        System.out.println("Find file with name ""1001""");
        OptFile.findFile("F:""nepalon""thinkinginjava""test", "1001");
        File mf = new File("F:""nepalon""thinkinginjava""test""1001");
        if(OptFile.mkdir(mf))
            System.out.println("create directory mf successfully");
        else
            System.out.println("create directory mf failly");
    }
}

C物 2008-02-13 23:08 发表评论
]]>
StringBuffercdhttp://m.tkk7.com/libin2722/archive/2008/02/13/179860.htmlC物C物Wed, 13 Feb 2008 15:07:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179860.htmlhttp://m.tkk7.com/libin2722/comments/179860.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179860.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179860.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179860.html描述Q在实际应用中,l常回遇到对字符串进行动态修攏V这时候,Stringcȝ功能受到限制Q而StringBuffercd以完成字W串的动态添加、插入和替换{操作?

Q、构造函数?/span>
    StringBuffer() Q构造一个没有Q何字W的StringBuffercR?
    StringBuffer(int length) Q?Q构造一个没有Q何字W的StringBufferc,q且Q其长度为length?
    StringBuffer(String str) Q以str为初始值构造一个StringBuffercR?/ul>

    Q、方法?/span>
    说明Q?
    1. 所有方法均为publicQ?
    2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;

    如:
    static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>

      1. StringBuffer append(boolean b)
      2. StringBuffer append(char c)
      3. StringBuffer append(char[] str)
      4. StringBuffer append(char[] str, int offset, int len)
      5. StringBuffer append(double d)
      6. StringBuffer append(float f)
      7. StringBuffer append(int i)
      8. StringBuffer append(long l)
      9. StringBuffer append(Object obj)
      10. StringBuffer append(String str)
      11. StringBuffer append(StringBuffer sb)
      以上的方法都是向字符串缓冲区“q加”元素Q但是,q个“元素”参数可以是布量、字W、字W数l、双_ֺ数、QҎ、整型数、长整型数对象类型的字符丌Ӏ字W串和StringBuffercȝ。如果添加的字符出了字W串~冲区的长度QJava自动进行扩充?/ul>
      代码:
            String question = new String("1+1=");
            int answer = 3;
            boolean result = (1+1==3);
            
            StringBuffer sb = new StringBuffer();
            sb.append(question);
            sb.append(answer);
            sb.append('"t');
            sb.append(result);
            
            System.out.println(sb);
      l果为:
      1+1=3   false

        12. int capacity() Q返回当前StringBuffer对象Q字W串~冲区)的ȝ_而非字符号串的长度?
        13. char charAt(int index) Q在当前StringBuffer对象中取索引号ؓindex的字W。第一个字W的索引?#8220;0”
        14. StringBuffer delete(int start, int end) Q删除当前StringBuffer对象中以索引号start开始,到endl束的子丌Ӏ?
        15. StringBuffer deleteCharAt(int index) Q删除当前StringBuffer对象中烦引号为index的字W?
        16. void ensureCapacity(int minimumCapacity) Q重新设|字W号串缓冲区的ȝ间。如果minimumCapacity大于当前的ȝ_则新的空间被讄Q一U结果是 minimumCapacityQ另一U结果是{“老空?#8221;??}?/ul>
        代码:
              StringBuffer sb1 = new StringBuffer(5);
              StringBuffer sb2 = new StringBuffer(5);
              
              sb1.ensureCapacity(6);
              sb2.ensureCapacity(100);
              
              System.out.println( "sb1.Capacity: " + sb1.capacity() );
              System.out.println( "sb2.Capacity: " + sb2.capacity() );
        l果为:
        sb1.Capacity: 12
        sb2.Capacity: 100

          17. void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Q从当前StringBuffer对象的烦引号srcBegin开始,到srcEndl束的子Ԍ赋值到字符数组dst中,q且从dst的烦引号 dstBegin开始?/ul>
          代码:
                StringBuffer sb = new StringBuffer("I love her!");
                char[] i = {'I',' ','l','o','v','e',' ','y','o','u'};
                
                sb.getChars(7,10,i,7);
                
                System.out.println( "sb: " + sb );
          l果为:sb: I love her!

            18. int indexOf(String str) Q返回当前StringBuffer对象中,W一个满str子串的位|?
            19. int indexOf(String str, int fromIndex) Q从当前StringBuffer对象的fromIndex开始查找,q回W一个满str子串的位|?
            20. StringBuffer insert(int offset, boolean b)
            21. StringBuffer insert(int offset, char c)
            22. StringBuffer insert(int offset, char[] str)
            23. StringBuffer insert(int index, char[] str, int offset, int len)
            24. StringBuffer insert(int offset, double d)
            25. StringBuffer insert(int offset, float f)
            26. StringBuffer insert(int offset, int i)
            27. StringBuffer insert(int offset, long l)
            28. StringBuffer insert(int offset, Object obj)
            29. StringBuffer insert(int offset, String str)
            以上的方法都是在当前StringBuffer对象中插入一个元素,在烦引号offset处插入相应的倹{?
            30. int lastIndexOf(String str) Q返回当前StringBuffer对象中,最后一个满str子串的位|?
            31. int lastIndexOf(String str, int fromIndex) Q从当前StringBuffer对象的fromIndex开始查找,q回最后一个满str子串的位|?
            32. int length() Q返回当前StringBuffer对象Q字W缓冲区Q中Q字W串的长度?span style="color: red;">注意Q此Ҏ与capacity() 不同?/span>
            33. StringBuffer replace(int start, int end, String str) Q替换当前StringBuffer对象的字W串。从start开始,到endl束的位|替换成str?
            34. StringBuffer reverse() Q将字符串翻转?/ul>
            代码:
                  StringBuffer sb = new StringBuffer("0123456789");
                  System.out.println( "sb.reverse(): " + sb.reverse() );
            l果为:sb.reverse(): 9876543210

              35. void setCharAt(int index, char ch) Q设|烦引号index的字Wؓch?
              36. void setLength(int newLength) Q重新设|字W串~冲Z字符串的长度Q如果newLength于当前的字W串长度Q将截去多余的字W?/ul>
              代码:
                    StringBuffer sb = new StringBuffer("0123456789");
                    sb.setLength(5);
                    System.out.println( "sb: " + sb );
              l果为:sb: 01234

                37. String substring(int start) Q取当前StringBuffer对象中,从start开始到l尾的子丌Ӏ?
                38. String substring(int start, int end) Q取当前StringBuffer对象中,从start开始到end的子丌Ӏ?
                39. String toString() Q将当前StringBuffer对象转换成String对象?/ul>

                C物 2008-02-13 23:07 发表评论
                ]]>StringTokenizerQ字W串分隔解析cdhttp://m.tkk7.com/libin2722/archive/2008/02/13/179859.htmlC物C物Wed, 13 Feb 2008 15:06:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179859.htmlhttp://m.tkk7.com/libin2722/comments/179859.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179859.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179859.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179859.html属于Qjava.util包?

                Q、构造函数?/span>

                  1. StringTokenizer(String str) Q构造一个用来解析str的StringTokenizer对象。java默认的分隔符?#8220;I格”?#8220;制表W?‘"t’)”?#8220;换行W?‘"n’)”?#8220;回RW?‘"r’)”?
                  2. StringTokenizer(String str, String delim) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W?
                  3. StringTokenizer(String str, String delim, boolean returnDelims) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W,同时Q指定是否返回分隔符?/ul>

                  Q、方法?/span>
                  说明Q?
                  1. 所有方法均为publicQ?
                  2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;

                  如:
                  static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>

                    1. int countTokens() Q返回nextTokenҎ被调用的ơ数。如果采用构造函??Q返回的是分隔W数??)?
                    2. boolean hasMoreTokens() Q返回是否还有分隔符?
                    3. boolean hasMoreElements() Q结果同2?
                    4. String nextToken() Q返回从当前位置C一个分隔符的字W串?
                    5. Object nextElement() Q结果同4?
                    6. String nextToken(String delim) Q与4cMQ以指定的分隔符q回l果?/ul>

                    例子Q?/span>
                    代码:
                          String s = new String("The Java platform is the ideal platform for network computing");
                          StringTokenizer st = new StringTokenizer(s);
                          System.out.println( "Token Total: " + st.countTokens() );
                          while( st.hasMoreElements() ){
                             System.out.println( st.nextToken() );
                    }
                    l果为:
                    Token Total: 10
                    The
                    Java
                    platform
                    is
                    the
                    ideal
                    platform
                    for
                    network
                    computing

                    ?:
                    代码:
                          String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");
                          StringTokenizer st = new StringTokenizer(s,"=",true);
                          System.out.println( "Token Total: " + st.countTokens() );
                          while( st.hasMoreElements() ){
                             System.out.println( st.nextToken() );
                          }
                    l果为:
                    Token Total: 19
                    The
                    =
                    Java
                    =
                    platform
                    =
                    is
                    =
                    the
                    =
                    ideal
                    =
                    platform
                    =
                    for
                    =
                    network
                    =
                    computing


                    C物 2008-02-13 23:06 发表评论
                    ]]>RandomQ随机类?/title><link>http://m.tkk7.com/libin2722/archive/2008/02/13/179858.html</link><dc:creator>C物</dc:creator><author>C物</author><pubDate>Wed, 13 Feb 2008 15:03:00 GMT</pubDate><guid>http://m.tkk7.com/libin2722/archive/2008/02/13/179858.html</guid><wfw:comment>http://m.tkk7.com/libin2722/comments/179858.html</wfw:comment><comments>http://m.tkk7.com/libin2722/archive/2008/02/13/179858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/libin2722/comments/commentRss/179858.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/libin2722/services/trackbacks/179858.html</trackback:ping><description><![CDATA[<span style="color: indigo;">属于包:java.util.Random</span> <br /> <br /> <br /> <br /> <span style="color: blue;">Q、属性?/span> <br /> <br /> 无?<br /> <br /> <span style="color: blue;">Q、构造函数?/span> <br /> <br /> <span style="color: green;">Random()</span> Q创Z个新的随机数发生器?<br /> <br /> <span style="color: green;">Random(long seed) </span>Q用一个种子(长整型)创徏一个随机数发生器?<br /> <br /> <span style="color: blue;">Q、方法?/span> <br /> <span style="color: red;">说明Q?<br /> 1. 所有方法均为publicQ?<br /> 2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;</span><span style="color: olive;"> <br /> 如: <br /> static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span> <br /> <br /> <br /> <ul>1. <span style="color: green;">protected int next(int bits) </span>Q生下一个伪随机数?<br /> <br /> 2. <span style="color: green;">boolean nextBoolean() </span>Q返回下一个从随机发生器的pd中得到的均匀分布的布倹{?<br /> <br /> 3. <span style="color: green;">void nextBytes(byte[] bytes) </span>Q生随机字节数l放到指定的数组中?<br /> <br /> 4. <span style="color: green;">double nextDouble() </span>Q返回下一个从随机发生器的pd中得到的均匀分布?.0?.0的双_ֺcd倹{?<br /> <br /> 5. <span style="color: green;">float nextFloat() </span>Q返回下一个从随机发生器的pd中得到的均匀分布?.0?.0的Q点类型倹{?<br /> <br /> 6. <span style="color: green;">double nextGaussian()</span> Q返回下一个从随机发生器的pd中得到的W合均匀分布?.0的^均数?.0方差的高斯分布双_ֺcd倹{?<br /> <br /> 7. <span style="color: green;">int nextInt() </span>Q返回下一个从随机发生器的pd中得到的均匀分布的整型倹{?<br /> <br /> 8. <span style="color: green;">int nextInt(int n) </span>Q返回下一个从随机发生器的pd中得到的均匀分布?到指定整型数QnQ之间的整型倹{?<br /> <br /> 9. <span style="color: green;">long nextLong() </span>Q返回下一个从随机发生器的pd中得到的均匀分布的长整型倹{?<br /> <br /> 10. <span style="color: green;">void setSeed(long seed) </span>Q设|随机数发生器的U子Z个长整型数?/ul> <br /> <br /> <span style="color: red;">关于U子的描qͼ</span> <br /> q个cȝ对象使用一?8位的U子Q?<br /> 如果q个cȝ两个实例是用同一个种子创建的Q?<br /> q且Q各自对它们以同L序调用ҎQ?<br /> 则它们会产生相同的数字序列?<br /> <br /> 下面对上面的介l做一个实验, <br /> 其注意相同U子时的l果Q?<br /> <span style="color: brown;">如果用默认的构造函数构造对象, <br /> 他们是属于同一个种子的?/span> <br /> <br /> <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"> <tbody> <tr> <td><strong>代码:</strong></td> </tr> <tr> <td>import java.util.Random; <br /> <br /> public class TestRandom{ <br />    public static void main(String[] args){ <br />       Random r1 = new Random(50); <br />       System.out.println("W一个种子ؓ50的Random对象"); <br />       System.out.println("r1.nextBoolean():"t" + r1.nextBoolean()); <br />       System.out.println("r1.nextInt():"t"t" + r1.nextInt()); <br />       System.out.println("r1.nextDouble():"t" + r1.nextDouble()); <br />       System.out.println("r1.nextGaussian():"t" + r1.nextGaussian()); <br />       System.out.println("---------------------------"); <br />        <br />       Random r2 = new Random(50); <br />       System.out.println("W二个种子ؓ50的Random对象"); <br />       System.out.println("r2.nextBoolean():"t" + r2.nextBoolean()); <br />       System.out.println("r2.nextInt():"t"t" + r2.nextInt()); <br />       System.out.println("r2.nextDouble():"t" + r2.nextDouble()); <br />       System.out.println("r2.nextGaussian():"t" + r2.nextGaussian()); <br />       System.out.println("---------------------------"); <br />        <br />       Random r3 = new Random(100); <br />       System.out.println("U子?00的Random对象"); <br />       System.out.println("r3.nextBoolean():"t" + r3.nextBoolean()); <br />       System.out.println("r3.nextInt():"t"t" + r3.nextInt()); <br />       System.out.println("r3.nextDouble():"t" + r3.nextDouble()); <br />       System.out.println("r3.nextGaussian():"t" + r3.nextGaussian()); <br />        <br />       System.out.println("l果一目了Ӟ"); <br />    } <br /> }</td> </tr> </tbody> </table> <br /> l果Q?<br /> <table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"> <tbody> <tr> <td><strong>代码:</strong></td> </tr> <tr> <td><br /> W一个种子ؓ50的Random对象 <br /> r1.nextBoolean():       true <br /> r1.nextInt():           -1727040520 <br /> r1.nextDouble():        0.6141579720626675 <br /> r1.nextGaussian():      2.377650302287946 <br /> --------------------------- <br /> W二个种子ؓ50的Random对象 <br /> r2.nextBoolean():       true <br /> r2.nextInt():           -1727040520 <br /> r2.nextDouble():        0.6141579720626675 <br /> r2.nextGaussian():      2.377650302287946 <br /> --------------------------- <br /> U子?00的Random对象 <br /> r3.nextBoolean():       true <br /> r3.nextInt():           -1139614796 <br /> r3.nextDouble():        0.19497605734770518 <br /> r3.nextGaussian():      0.6762208162903859 </td> </tr> </tbody> </table> <img src ="http://m.tkk7.com/libin2722/aggbug/179858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/libin2722/" target="_blank">C物</a> 2008-02-13 23:03 <a href="http://m.tkk7.com/libin2722/archive/2008/02/13/179858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DoubleQ双_ֺcdhttp://m.tkk7.com/libin2722/archive/2008/02/13/179857.htmlC物C物Wed, 13 Feb 2008 15:02:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179857.htmlhttp://m.tkk7.com/libin2722/comments/179857.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179857.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179857.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179857.htmlQ、属性?


                      1. static Double MAX_VALUE Q?q回最大双_ֺ敎ͼ在不同硬件^C由Double.longBitsToDouble(0x7fefffffffffffffL)计算得出?
                      2. static Double MIN_VALUE Q?q回最双_ֺ敎ͼ在不同硬件^C由Double.longBitsToDouble(0x1L)计算得出?
                      3. static Double NaN Q?表示非数值类型的双精度数Q在不同gq_中由Double.longBitsToDouble(0x7ff8000000000000L)计算得出?
                      4. static Double NEGATIVE_INFINITYQ返回负无穷双精度数Q在不同gq_中由Double.longBitsToDouble(0xfff0000000000000L)计算得出?
                      5. static Double POSITIVE_INFINITY Q返回正无穷双精度数Q在不同gq_中由Double.longBitsToDouble(0x7ff0000000000000L)计算得出?
                      6. static Class TYPE Q返回当前类型?/ul>
                      Q、构造函数?/span>

                        Double(double value) Q以doublecd为参数创建Double对象?
                        Double(String s) Q以Stringcd为参数创建String对象?/ul>
                        Q、方法?/span>
                        说明Q?
                        1. 所有方法均为publicQ?
                        2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;

                        如:
                        static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>


                          1. byte byteValue() Q返回以字节表示的双_ֺ数?
                          2. static int compare(double d1, double d2) Q此为类ҎQ比较d1和d2。相当于new Double(d1).compareTo(new Double(d2))。如果d1与d2相等Q返回0Q小于关p,q回负数Q大于关p,q回正数?
                          3. int compareTo(Double anotherDouble) Q此为对象方法,当前对象与anotherDouble比较。与2的比较规则相同?
                          4. int compareTo(Object o) Q当前对象与oq行比较Q如果o属于Doublec,那么Q相当于3Q如果是其他c,则抛出ClassCastException异常?
                          5. static long doubleToLongBits(double value) Q把value按照IEEE 754转化成longq输出它的十q制数倹{?
                          6. double doubleValue() Q返回该双精度数对象的双_ֺ数倹{?
                          7. boolean equals(Object obj) Q比较当前Double对象与obj的内Ҏ否相同。大多数情况是比较两个Double对象的值是否相{,相当于d1.doubleValue() == d2.doubleValue()的倹{?
                          8. float floatValue() Q返回该点数对象的点数倹{?
                          9. int hashCode() Q返回该Double对象的哈希表码?
                          10. int intValue() Q返回该Double对象的整数|整数部分Q?
                          11. boolean isInfinite() Q判断该Double对象是否是无I?
                          12. static boolean isInfinite(double v) Q与11cMQ不同的是:此ؓcL法,判断的是v?
                          13. boolean isNaN() Q判断该Double对象是否为非数倹{?
                          14. static boolean isNaN(double v) Q功能与13一P只不q判断v?
                          15. long longValue() Q返回该Double对象的长整数倹{?
                          16. static float parseFloat(String s) Q将字符串{换成双精度数?
                          17. short shortValue() Q返回该Double对象的短整数倹{?
                          18. String toString() Q将该Double对象转换成字W串?
                          19. static String toString(Double f) Q功能与18一P只是转换f?
                          20. static Double valueOf(String s) Q将字符串{换成双精度数?/ul>

                          C物 2008-02-13 23:02 发表评论
                          ]]>整理一个ANT在J2EE目中的应用http://m.tkk7.com/libin2722/archive/2008/02/13/179856.htmlC物C物Wed, 13 Feb 2008 14:59:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179856.htmlhttp://m.tkk7.com/libin2722/comments/179856.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179856.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179856.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179856.html首先Q假设我们的目的结构如?${project.root}
                            |
                            +-- build/           <-- WAR/EAR档的目录
                            +-- classes/         <-- ~译的输出目录,与JBuilder兼容
                            +-- src/             <-- Java源文件目?br />   +-- web/             <-- WEB Content 目录
                            |    |
                            |    +--pages/       <-- JSP 文g目录
                            |    +--WEB-INF/     <-- web.xml {配|文?br />   +-- ejb              <-- EJB Content 目录
                            |    |
                            |    +---INF/    <-- EJB 配置文g
                            +-- ear              <-- EAR Content 目录
                            |    |
                            |    +---INF/    <-- EAR 配置文g
                            |-- lib              <-- 目所要用到的library

                          接下来第一步,是要先定义好一些全局的参敎ͼ以便以后更改h方便Q风?br /> 大家自己选择好了Q我用的是如下的方式Q?/span>

                          (1) l出目的目录:
                            <!--// project directories //--><property name="dir.project" ="D:/Code/MyProject"/><property name="dir.project.lib" ="${dir.project}/lib"/><property name="dir.project.src" ="${dir.project}/src"/><property name="dir.project.web_module" ="${dir.project}/web"/><property name="dir.project.ejb_module" ="${dir.project}/ejb"/><property name="dir.project.ear_module" ="${dir.project}/ear"/><!--// compile, build and deploy directories //--><property name="dir.project.compile" ="${dir.project}/classes"/><property name="dir.project.compile.jspcache" ="${dir.project.compile}/jspcache"/><property name="dir.project.build" ="${dir.project}/build"/><!--// J2EE Container //--><property name="dir.appserver.tomcat.home" ="D:/J2EE_HOME/AppServer/Tomcat"/><property name="dir.appserver.oc4j.j2ee.home" ="D:/J2EE_HOME/AppServer/OC4J/j2ee/home"/>
                           

                          (2) 定义Java Source的编译选项
                          <!--// Java compiler options //--> <property name="opt.compile.source" ="1.4"/><property name="opt.compile.target" ="1.4"/><property name="opt.compile.encoding" ="UTF-8"/><property name="opt.compile.deprecation" ="on"/><property name="opt.compile.debug" ="on"/><property name="opt.compile.optimize" ="off"/>
                           

                          (3) 如果需?import EJB library 的话Q给Z面的定义Q后面会用到
                              <!--// EJB imported resource //--><property name="import.ejb.report.server" ="${dir.project.lib}/Appwork.jar"/>
                           

                          (4) l出部vWAR/EAR文g的名Uͼ
                            <!--// Deployment //--><property name="deploy.file.ejb_module" ="MyApp_EJB.jar" /><property name="deploy.file.web_module" ="MyApp_WEB.war" /><property name="deploy.file.ear_module" ="MyApp.ear" />
                           

                          (5) l出CLASSPATH的定义,引入相关的Library和项目编译生成的Java Classes
                            <path id="CLASSPATH"><!--// Tomcat Libraries //--><fileset dir="${dir.appserver.tomcat.home}/bin"> <include name="*.jar"/></fileset> <fileset dir="${dir.appserver.tomcat.home}/server/lib"> <include name="*.jar"/> </fileset> <fileset dir="${dir.appserver.tomcat.home}/common/lib"> <include name="*.jar"/> </fileset> <!--// Depended Libraries //--><pathelement location="${dir.project.lib}/abc.jar"/><pathelement location="${dir.project.lib}/AppServer.jar"/><pathelement location="${dir.project.lib}/AppServiceClient.jar"/><pathelement location="${dir.project.lib}/AppUtil.jar"/><pathelement location="${dir.project.lib}/xport.jar"/><pathelement location="${dir.project.lib}/jaxen-full.jar"/><pathelement location="${dir.project.lib}/jstl.jar"/><pathelement location="${dir.project.lib}/log4j-1.2.13.jar"/><pathelement location="${dir.project.lib}/ojdbc14.jar"/><pathelement location="${dir.project.lib}/saxpath.jar"/><pathelement location="${dir.project.lib}/standard.jar"/><pathelement location="${dir.project.lib}/taglibs-log.jar"/><!--// Project classes //--><pathelement location="${dir.project.compile}"/></path>
                           

                          (6) 基本的clean和init的task
                            <target name="clean"><delete dir="${dir.project.build}"/><delete dir="${dir.project.compile.jspcache}"/><delete dir="${dir.project.compile}"/><delete dir="${dir.project.web_module}/WEB-INF/classes"/><delete dir="${dir.project.web_module}/WEB-INF/lib"/></target><target name="init"><mkdir dir="${dir.project.compile}"/><mkdir dir="${dir.project.compile.jspcache}"/><mkdir dir="${dir.project.web_module}/WEB-INF/classes"/><mkdir dir="${dir.project.web_module}/WEB-INF/lib"/><mkdir dir="${dir.project.build}"/></target>
                           

                          (7) ~译Java Source
                          <target name="src_compile" depends="init"><!--// compile the Java source //--><javac srcdir="${dir.project.src}" destdir="${dir.project.compile}" encoding="${opt.compile.encoding}" source="${opt.compile.source}" target="${opt.compile.source}" deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}" optimize="{opt.compile.optimize}" ><classpath refid="CLASSPATH"/><include name="**/*.java"/></javac><!--// copy the classpath resources //--><copy todir="${dir.project.compile}"><fileset dir="${dir.project.src}"><exclude name="**/*.java"/></fileset></copy> </target>
                           

                          (8) 预编译JSP文gQ可选择ZTomcat或是Oracle Application Server
                            <!--// for Tomcat //--> <target name="jsp_src_generate" depends="src_compile"><taskdef classname="org.apache.jasper.JspC" name="jasper2"><classpath refid="CLASSPATH"/> </taskdef><jasper2 validateXml="false" verbose="9"uriroot="${dir.project.web_module}" outputDir="${dir.project.compile.jspcache}" webXmlFragment="${dir.project.compile.jspcache}/generated-web.xml" /> </target><target name="jsp_src_compile"><javac srcdir="${dir.project.compile.jspcache}" destdir="${dir.project.compile.jspcache}" encoding="${opt.compile.encoding}" source="${opt.compile.source}" target="${opt.compile.source}" deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}" optimize="{opt.compile.optimize}" ><classpath refid="CLASSPATH"/><include name="**"/></javac></target><target name="jsp_precompile" depends="src_compile, jsp_src_generate, jsp_src_compile" />
                           

                          (9) 开始进行compileQmake ?buildQƈ生成部v档案
                            <target name="compile" depends="src_compile, jsp_precompile" /><!--// Build WAR file //--><target name="make.web_module" depends="compile"><war destfile="${dir.project.build}/${deploy.file.web_module}" webxml="${dir.project.web_module}/WEB-INF/web.xml"><fileset dir="${dir.project.web_module}" ><include name="**"/><exclude name="WEB-INF/classes/**"/><exclude name="WEB-INF/lib/**"/></fileset><classes dir="${dir.project.compile}"><include name="**"/><exclude name="project/package/trx/**"/><exclude name="jspcache/**"/></classes><lib dir="${dir.project.lib}"><include name="AppUtil.jar"/><include name="AppClient.jar"/></lib></war></target><!--// Build EJB Jar file //--><target name="make.ejb_module" depends="src_compile"><jar destfile="${dir.project.build}/${deploy.file.ejb_module}"><zipgroupfileset dir="${dir.project.lib}"><include name="AppServer.jar"/></zipgroupfileset><fileset dir="${dir.project.ejb_module}"><include name="**"/></fileset><fileset dir="${dir.project.compile}"><include name="**"/><exclude name="project/package/controller/**"/><exclude name="jspcache/**"/></fileset></jar></target><!--// Build EAR file //--><target name="make.ear_module" depends="compile, make.web_module, make.ejb_module"><ear destfile="${dir.project.build}/${deploy.file.ear_module}" appxml="${dir.project.ear_module}/-INF/application.xml"><fileset dir="${dir.project.build}"><include name="${deploy.file.web_module}"/><include name="${deploy.file.ejb_module}"/></fileset></ear></target><target name="make" depends="init, compile, make.web_module, make.ejb_module, make.ear_module" /><target name="build" depends="clean, init, make" />


                          C物 2008-02-13 22:59 发表评论
                          ]]>
                          配合ant开发web目Q原创)http://m.tkk7.com/libin2722/archive/2008/02/13/179855.htmlC物C物Wed, 13 Feb 2008 14:58:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179855.htmlhttp://m.tkk7.com/libin2722/comments/179855.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179855.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179855.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179855.html引用地址Q?a >http://www.easydone.cn/014/200604110005145285.htm

                          配合ant开发web目
                          应用相关说明Q?br /> 1、ant版本Qapache-ant-1.6.1
                          2、eclipse版本Qeclipse-SDK-3.0.1-win32
                          3、j2sdk1.4.2_08
                          4、jakarta-tomcat-5.0.19
                          5、mysql
                          目录l构如下Q?br />


                          ant具体配|如?br /> 1?Easydone"project"demo"bin目录下新建build.xml
                          内容如下Q?br />
                          <?xml version="1.0"  encoding="GB2312" ?>
                          <project name="Demo-Home" basedir="." default="usage">

                           <property name="app.name" ="demo"/>
                           <property name="app.dir" location="../WebRoot"/>
                           <property name="webserver.home" location="../../../platform/jakarta-tomcat-5.0.19"/>
                           <property name="webserver.deploy" location="${webserver.home}/webapps/"/>
                           <property name="src.dir" location="../src"/>
                           <property name="build.dir" location="${app.dir}/WEB-INF/classes"/>
                           <property name="lib.dir" location="${app.dir}/WEB-INF/lib"/>
                           <property name="dist.dir" location="../dist"/>
                           <property name="properties.dir" location="${src.dir}/com/easydone/struts/ApplicationResources.properties"/>
                           <property name="properties_zh.dir" location="${build.dir}/com/easydone/struts/ApplicationResources_zh.properties"/>
                           <property name="doc.dir" ="../api"/>
                           <property name="packages" ="com.easydone.*"/>
                           
                           <echo>+--------------------------------------------------+</echo>
                           <echo>|                                                  |</echo>
                           <echo>|       R U N N I N G   A N T    REPOSITORY        |</echo>
                           <echo>|                                                  |</echo>
                           <echo>+--------------------------------------------------+</echo>
                           <!---Help Information-->
                           <target name="usage" >
                               <echo message=""/>
                               <echo message="-------------------------------------------------------------"/>
                               <echo message="操作说明Q?/>
                               <echo message="首先您~写的java文g拯?{src.dir}目录?按先后顺序执行以下命令既可?/>
                               <echo message="W一步:compile 命o~译*.java"/>
                               <echo message="W二步:deploy 命o生成${app.name}.jar文g"/>
                               <echo message="W三步:doc 命o生成详细javadoc文档"/>
                               <echo message="每一步操作都能看?BUILD SUCCESSFUL提示后,表示您操作成功!"/>
                               <echo message="-------------------------------------------------------------"/>
                               <echo message=""/>
                           </target>  
                            <!-- =================================================================== -->
                            <!-- 讄应用环境变量                           -->
                            <!-- =================================================================== --> 
                           <path id="compile.classpath">
                            <pathelement path ="${build.dir}"/>
                            <fileset dir="${lib.dir}">
                             <include name="**/*.jar"/>
                            </fileset>
                           </path>
                            <!-- =================================================================== -->
                            <!-- 格式化中文资源包Q解军_际化中文问题                     -->
                            <!-- =================================================================== --> 
                              <target name="checkToZh">
                                   <uptodate property="toZh.notRequired"
                                      srcfile="${properties.dir}"
                                      targetfile="${properties_zh.dir}"/>
                              </target>
                              <target name="toZh" depends="checkToZh" unless="toZh.notRequired">
                                  <delete file="${properties_zh.dir}"/>
                                  <!-- native2ascii struts.properties -->
                                  <exec executable="native2ascii">
                                    <arg line=" ${properties.dir}  ${properties_zh.dir}"/>
                                  </exec> 
                                  <echo message="toZh performed!"/>
                              </target>
                            <!-- =================================================================== -->
                            <!-- 初始化创建相兛_用目?nbsp;                            -->
                            <!-- =================================================================== -->
                              <target name="prepare" deion="create build,dist files">
                               <mkdir dir="${build.dir}"/>
                               <mkdir dir="${dist.dir}"/>    
                              </target>
                            <!-- =================================================================== -->
                            <!-- 初始化应用程序,删除相关目录                           -->
                            <!-- =================================================================== --> 
                           <target name="clean" deion="Delete build files">
                            <delete dir="${build.dir}"/>
                            <delete dir="${dist.dir}"/>
                           </target>
                           
                            <!-- =================================================================== -->
                            <!-- compile 命oQ执行javac~译命o                          -->
                            <!-- =================================================================== --> 
                           <target name="compile" depends="prepare">
                            <javac srcdir="${src.dir}" destdir="${build.dir}" debug="on">
                             <classpath refid="compile.classpath"/>
                            </javac>
                           </target>
                            <!-- =================================================================== -->
                            <!-- update命oQ编译及处理国际化中文资源文?                       -->
                            <!-- =================================================================== -->
                           <target name="update" depends="compile,toZh">
                            <!--copy classes-->
                            <copy todir="${webserver.deploy}/${app.name}/WEB-INF/classes" includeEmptyDirs="no">
                             <fileset dir="${build.dir}"/>
                            </copy>
                            <!--copy pages-->
                            <copy todir="${webserver.deploy}/${app.name}" includeEmptyDirs="no">
                             <fileset dir="${app.dir}"/>
                            </copy>
                            <!-- copy libs-->
                            <copy todir="${webserver.deploy}/${app.name}/WEB-INF/lib" includeEmptyDirs="no">
                             <fileset dir="${lib.dir}"/>
                            </copy>
                           </target>
                            <!-- =================================================================== -->
                            <!-- 部v应用E序Q依赖于 compile命oclean,prepare,compile,dist          -->
                            <!-- =================================================================== -->

                           <target name="deploy" depends="clean,prepare,compile,toZh,dist">
                            <delete dir="${webserver.deploy}/${app.name}.war"/>
                            <delete dir="${webserver.deploy}/${app.name}"/>  
                            <copy todir="${webserver.deploy}" includeEmptyDirs="no">
                             <fileset dir="${dist.dir}"/>
                            </copy>
                           </target> 
                            <!-- =================================================================== -->
                            <!-- 部v应用E序Q将其打为mshome.war包,依赖?compile命o              -->
                            <!-- =================================================================== --> 
                           <target name="dist" depends="compile">
                             <echo>building war...</echo>
                             <war warfile="${dist.dir}/${app.name}.war"
                                 webxml="${app.dir}/WEB-INF/web.xml">
                               <fileset dir="${app.dir}"/>
                               <classes dir="${build.dir}"/>
                               <classes dir="${lib.dir}">
                                <include name="*.propertries"/>
                             </classes>
                             <lib dir="${lib.dir}">
                              <include name="*.jar"/>
                             </lib>
                            </war>
                           </target> 
                            <!-- =================================================================== -->
                            <!-- 生成说明文档(api)                                                   -->
                            <!-- =================================================================== -->
                           <target name="javadoc" depends="usage,compile">
                              <delete dir="${doc.dir}"/>
                              <mkdir dir="${doc.dir}"/>
                               <javadoc packagenames="${packages}"
                                        sourcepath="${src.dir}"
                                        destdir="${doc.dir}"
                                        author="true"
                                        version="true"
                                        use="true"
                                        splitindex="true"
                                        windowtitle="${app.name} API"
                                        doctitle="${app.name}">
                                 <classpath refid="compile.classpath"/>
                               </javadoc>
                            </target>
                            <!-- =================================================================== -->
                            <!-- 执行一个数据库操作Q其中demo为您的数据库名,可测试相关jdbcq接
                                查询语句为bin目录下的db.sql                                -->
                            <!-- =================================================================== -->  
                           <target name = "mysqlInit">
                           <echo>ANT 操作数据库开?....</echo>
                           <sql
                            driver = "org.gjt.mm.mysql.Driver"
                            url = "jdbc:mysql://localhost:3306/demo"
                            userid = "root"
                            password = "*******"
                            src = "db.sql"
                            print="yes"
                            ="continue"
                           />
                           </target>
                           <!--END-->
                          </project>

                          2、在"Easydone"project"demo"bin目录下新建setEnv.bat
                          dos处理脚本Q主要ؓ讄环境变量Q这样做您无需手工配置环境变量Q将整个工程UdCQ何目录都可以使用Q,内容如下Q?br />
                          set ANT_HOME=../../../platform/apache-ant-1.6.1
                          set JAVA_HOME=../../../platform/j2sdk1.4.2_08
                          set CLASSPATH=%JAVA_HOME%/lib/toos.jar;%JAVA_HOME%/lib/dt.jar
                          set CATALINA_HOME=../../../platform/jakarta-tomcat-5.0.19
                          set PATH=%ANT_HOME%/bin;%CATALINA_HOME%/BIN;%JAVA_HOME%/bin;%CATALINA_HOME%/BIN
                          3、服务控制脚本:
                          tomcat启动服务Q?br /> ?Easydone"project"demo"bin目录下新建 run.cmdQ?/strong>

                          call setEnv.bat
                          startup

                          tomcat停止服务Q?br /> ?Easydone"project"demo"bin目录下新建 down.cmd

                          call setEnv.bat
                          shutdown

                          更新脚本Q?br /> ?Easydone"project"demo"bin目录下新建 update.cmd
                          call setEnv.bat
                          ant -buildfile build.xml  update

                          部v脚本Q?br /> ?Easydone"project"demo"bin目录下新建 deploy.cmd
                          call setEnv.bat
                          ant -buildfile build.xml  deploy

                          java doc 脚本Q?br /> ?Easydone"project"demo"bin目录下新建 doc.cmd
                          call setEnv.bat
                          ant -buildfile build.xml  javadoc

                          剩下的都在build.xml中,Ҏ你的需要自己定义脚本程序就可以?br /> 很简单,q样可控制你的应用?

                          C物 2008-02-13 22:58 发表评论
                          ]]>
                          SHTML 教程http://m.tkk7.com/libin2722/archive/2008/02/13/179853.htmlC物C物Wed, 13 Feb 2008 14:55:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179853.htmlhttp://m.tkk7.com/libin2722/comments/179853.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179853.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179853.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179853.html

                          什么是 SHTML

                          使用SSIQServer Side IncludeQ的html文g扩展名,SSIQServer Side IncludeQ,通常UCؓ“服务器端嵌入”或者叫“服务器端包含”Q是一U类gASP的基于服务器的网制作技术?/p>

                          SSI工作原理Q?/h4>

                          内容发送到览器之前,可以使用“服务器端包含 (SSI)”指o文本、图形或应用E序信息包含到网中。例如,可以使用 SSI 包含旉/日期戟뀁版权声明或供客户填写ƈq回的表单。对于在多个文g中重复出现的文本或图形,使用包含文g是一U简便的Ҏ。将内容存入一个包含文件中 卛_Q而不必将内容输入所有文件。通过一个非常简单的语句卛_调用包含文gQ此语句指示 Web 服务器将内容插入适当|页。而且Q用包含文件时Q对内容的所有更改只需在一个地方就能完成?/p>

                          因ؓ包含 SSI 指o的文件要求特D处理,所以必Mؓ所?SSI 文g赋予 SSI 文g扩展名。默认扩展名?.stm?shtm ?.shtml?/p>

                          Web 服务器在处理|页的同时处?SSI 指o。当 Web 服务器遇?SSI 指oӞ直接包含文件的内容插入 HTML |页。如?#8220;包含文g”中包?SSI 指oQ则同时插入此文件。除了用于包含文件的基本指o之外Q还可以使用 SSI 指o插入文g的相关信息(如文件的大小Q或者运行应用程序或 shell 命o?/p>

                          |站l护常常到的一个问题是Q网站的l构已经固定Q却Z更新一点内容而不得不重做一大批|页。SSI提供了一U简单、有效的Ҏ来解册一? 题,它将一个网站的基本l构攑֜几个单的HTML文g中(模板Q,以后我们要做的只是将文本传到服务器,让程序按照模板自动生成网,从而ɽ理大型|? 站变得容易?/p>

                          所以,利用SHTML格式的页面目的和 ASP 差不多,但是因ؓ?API 所以运转速度更快Q效率更高,比ASP快,比HTML慢,但由于可以用服务器端包含,因此佉K面更新容易(特别是批量更新bannerQ版权等Q,惌 一下吧Q你有一D?HTMLQ要在中间穿插一些特D的服务端脚本,比如插入其他 HTML D落Q你选择 ASP 来完成这个Q务,但是如果d更繁重,需要更多的旉Q比?5 sQ这个时候你不用 ASP 而用  SHTMLQ或许处理时间就只用 4s 了?/p>

                          SSI有什么用Q?/h4>

                          之所以要扯到 SSIQ是因爲 Shtml - Server-Parsed HTML 的首字母~略词。包含有嵌入式服务器方包含命令的 HTML 文本。在被传送给览器之前,服务器会?SHTML 文档q行完全地读取、分析以及修攏Vshtml和asp 有一些相|以shtml命名的文仉Q用了ssi的一些指令,像asp中的指oQ你可以在SHTML文g中写入SSI指oQ当客户端访问这? shtml文gӞ服务器端会把q些SHTML文gq行d和解释,把SHTML文g中包含的SSI指o解释出来比如Q你可以在SHTML文g中用SSI 指o引用其他的html文gQ#i nclude Q,服务器传送给客户端的文gQ是已经解释的SHTML不会有SSI指o。它实现了HTML所没有的功能,是可以实现了动态的SHTMLQ可以说? HTML的一U进化吧。像新浪的新ȝl就是这LQ新dҎ固定的但它上面的q告和菜单等是用#i nclude引用q来的?/p>

                          目前Q主要有以下几种用用途:

                          1. 昄服务器端环境变量<Qe cho>
                          2. 文本内容直接插入到文档?lt;Qi nclude>
                          3. 昄WEB文档相关信息<Qf lastmod Qf size> (如文件制作日?大小{?
                          4. 直接执行服务器上的各U程?lt;Qe xec>(如CGI或其他可执行E序)
                          5. 讄SSI信息昄格式<Qc onfig>(如文件制作日?大小昄方式)

                          高SSI<XSSI>可设|变量用if条g语句?/p>

                          使用SSI

                          SSI是ؓWEB服务器提供的一套命令,q些命o只要直接嵌入到HTML文档的注释内容之中即可。如Q?/p>

                          <!--Qi nclude file="info.htm"-->

                          是一条SSI指oQ其作用是将"info.htm"的内Ҏ贝到当前的页面中Q当讉K者来览Ӟ会看到其它HTML文档一hC? info.htm其中的内宏V其它的SSI指o使用形式基本同刚才的举例差不多,可见SSI使用只是插入一点代码而已Q用Ş式非常简单。当Ӟ如果 WEB服务器不支持SSIQ它׃只不q将它当作注释信息,直接跌其中的内容;览器也会忽略这些信息?/p>

                          如何在我的WEB服务器上配置SSI功能Q?/h4>

                          在一些WEB服务器上Q如IIS 4.0/SAMBAR 4.2Q,包含 Qi nclude 指o的文件必M用已被映到 SSI 解释E序的扩展名Q否则,Web 服务器将不会处理该SSI指oQ默认情况下Q扩展名 .stm?shtm ?.shtml 被映到解释E序QSsinc.dllQ?br /> Apache则是Ҏ你的讄情况而定Q修改srm.conf如:

                          AddType text/x-server-parsed-html .shtml 只?shtml扩展名的文g解析SSI指o
                          AddType text/x-server-parsed-html .html 对所有HTML文档解析SSI指o

                          Netscape WEB服务器直接?Administration Server(理服务?可打开SSI功能?br /> Website 使用 Server Admin E序中的 Mapping 标签Q扩展名d内容cd为:wwwserver/html-ssi
                          Cern 服务器不支持SSIQ可用SSI诈骗法,?http://sw.cse.bris.ac.uk/WebTools/fakessi.html 上下载一个PERL脚本Q即可你的CERN服务器用一些SSI指o。(不支持exec指o。)

                          SSI指o基本格式

                          E序代码Q?/p>

                          <!-- 指o名称="指o参数">

                          CZQ?/p>

                          <!--Qi nclude file="info.htm"-->

                          说明Q?/p>

                          1. <!-- -->是HTML语法中表C注释,当WEB服务器不支持SSIӞ会忽略这些信息?/div>
                          2. Qi nclude 为SSI指o之一?/div>
                          3. file 为include的参敎ͼ info.htm为参数|在本指o中指要包含的文档名?/div>

                          注意Q?/p>

                          1. <!--?号间无空|只有SSI指o与参数间存在I格?/div>
                          2. 上面的标?""Q一个也不能?/div>
                          3. SSI指o是大写敏感的,因此参数必须是小写才会v作用?/div>

                          SSI指o使用详解

                          Qe cho C

                          作用Q将环境变量插入到页面中?/p>

                          语法Q?/p>

                          <!--Qe cho var="变量名称"-->

                          CZQ?/p>

                          <!--Qe cho var="DOCUMENT_NAME"--> 本文档名U?br /> <!--Qe cho var="DATE_LOCAL"--> 现在旉
                          <!--Qe cho var="REMOTE_ADDR"--> 你的IP地址

                          Qi nclude C

                          作用Q将文本文g的内容直接插入到文档面中?/p>

                          语法Q?/p>

                          <!--Qi nclude file="文g名称"-->
                          <!--Qi nclude virtual="文g名称"-->

                          file 文g名是一个相对\径,该\径相对于使用 Qi nclude 指o的文档所在的目录。被包含文g可以在同一U目录或其子目录中,但不能在上一U目录中。如表示当前目录下的的nav_head.htm文档Q则为file="nav_head.htm"?br /> virtual 文g名是 Web 站点上的虚拟目录的完整\径。如表示相对于服务器文档根目录下hoyi目录下的nav_head.htm文gQ则为file="/hoyi/nav_head.htm"

                          参数Q?/p>

                          file 指定包含文g相对于本文档的位|?br /> virtual 指定相对于服务器文档根目录的位置

                          注意Q?/p>

                          1. 文g名称必须带有扩展名?
                          2. 被包含的文g可以hM文g扩展名,我觉得直接用htm扩展名最方便Q微软公司推荐?.inc 扩展名(q就看你的爱好了Q?/li>

                          CZQ?/p>

                          <!--Qi nclude file="nav_head.htm"--> 头文g插入到当前页?br /> <!--Qi nclude file="nav_foot.htm"--> 尾文g插入到当前页?/p>

                          Qf lastmod ?Qf size C

                          作用Q?/p>

                          Qf lastmod 文g最q更新日?br /> Qf size 文g的长?/p>

                          语法Q?/p>

                          <!--Qf lastmod file="文g名称"-->
                          <!--Qf size file="文g名称"-->

                          参数Q?/p>

                          file 指定包含文g相对于本文档的位|??info.txt 表示当前目录下的的info.txt文档
                          virtual 指定相对于服务器文档根目录的位置 ?/hoyi/info.txt 表示

                          注意Q文件名U必d有扩展名?/p>

                          CZQ?/p>

                          <!--Qf lastmod file="news.htm"--> 当前目录下news.htm文g的最q更新日期插插入到当前页?br /> <!--Qf size file="news.htm"--> 当前目录下news.htm的文件大入到当前页?/p>

                          Qe xec C

                          作用Q将某一外部E序的输出插入到面中。可插入CGIE序或者是常规应用E序的输入,q取决于使用的参数是cmdq是cgi?/p>

                          语法Q?/p>

                          <!--Qe xec cmd="文g名称"-->
                          <!--Qe xec cgi="文g名称"-->

                          参数Q?/p>

                          cmd 常规应用E序
                          cgi CGI脚本E序

                          CZQ?/p>

                          <!--Qe xec cmd="cat /etc/passwd"--> 会昄密码文g
                          <!--Qe xec cmd="dir /b"--> 会昄当前目录下文件列?br /> <!--Qe xec cgi="/cgi-bin/gb.cgi"--> 会执行CGIE序gb.cgi?br /> <!--Qe xec cgi="/cgi-bin/access_log.cgi"--> 会执行CGIE序access_log.cgi?/p>

                          注意Q从上面的示例可以看出,q个指o相当方便Q但是也存在安全问题?/p>

                          止ҎQ?/p>

                          1. ApacheQ将access.conf中的"Options Includes ExecCGI"q行代码删除Q?/div>
                          2. 在IIS中,要禁?Qe xec 命oQ可修改 SSIExecDisable 元数据库Q?/div>

                          Qc onfig

                          作用Q?指定q回l客L览器的错误信息、日期和文g大小的格式?/p>

                          语法Q?/p>

                          <!--Qc onfig errmsg="自定义错误信?-->
                          <!--Qc onfig sizefmt="昄单位"-->
                          <!--Qc onfig timefmt="昄格式"-->

                          参数Q?/p>

                          errmsg 自定义SSI执行错误信息Q可以ؓM你喜Ƣ的方式?br /> sizefmt 文g大小昄方式Q默认ؓ字节方式("bytes")可以改ؓ千字节方?"abbrev")
                          timefmt 旉昄方式Q最灉|的配|属性?/p>

                          CZQ显CZ个不存在文g的大?/p>

                          <!--Qc onfig errmsg="服务器执行错误,误pȝ理员 yiho@126.comQ谢谢!"-->
                          <!--Qf size file="不存在的文g.htm"-->

                          以千字节方式昄文g大小

                          语法Q?/p>

                          <!--Qc onfig sizefmt="abbrev"-->
                          <!--Qf sizefile="news.htm"-->

                          以特定的旉格式昄旉

                          <!--Qc onfig timefmt="%Yq?%m?d?星期%W 北京旉%H:%M:%sQ?Yq已q去?j?今天?Yq的W?U个星?-->
                          <!--Qe cho var="DATE_LOCAL"--> 昄今天是星期几Q几月,时区
                          <!--Qc onfig timefmt="今天%AQ?%B Q服务器时区?%zQ是"-->
                          <!--Qe cho var="DATE_LOCAL"-->

                          XSSI

                          XSSIQExtended SSIQ是一l高USSI指oQ内|于Apache 1.2或更高版本的mod-include模块之中。其中可利用的的指o有:

                          #printenv
                          #set
                          #if

                          #printenv

                          作用Q?昄当前存在于WEB服务器环境中的所有环境变量?/p>

                          语法Q?/p>

                          <!--#printenv-->

                          #set

                          作用Q可l变量赋|以用于后面的if语句?/p>

                          语法Q?/p>

                          <!--#set var="变量? ="变量?-->

                          CZQ?/p>

                          <!--#set var="color" ="U色"-->

                          #if

                          作用Q创建可以改变数据的面Q这些数据根据用if语句时计的要求予以昄?/p>

                          语法Q?/p>

                          <!--#if expr="$变量?""变量值A"""-->
                            昄内容
                          <!--#elif expr="$变量?""变量值B"""-->
                            昄内容
                          <!--#else-->
                            昄内容
                          <!--#endif"-->

                          CZQ?/p>

                          <!--#if expr="$SERVER_NAME=""hoyi.zb169.net"""-->
                            Ƣ迎光好易CGI工厂在淄博热U的分站 http://hoyi.zb169.net?br /> <!--#elif expr="$SERVER_NAME=""linux.cqi.com.cn""" -->
                            Ƣ迎光好易CGI工厂在太阛_的分?http://linux.cqi.com.cn/~hoyi?br /> <!--#else-->
                            Ƣ迎光好易CGI工厂Q?br /> <!--#endif"-->

                          注意Q用于前面指令中的反斜杠Q是用来代换内部的引P以便它们不会被解释ؓl束表达式。不可省略?/p>

                          1、Config 命o

                          Config 命o主要用于修改SSI的默认设|。其中:

                          ErrmsgQ设|默认错误信息。ؓ了能够正常的q回用户讑֮的错误信息,在HTML文g中Errmsg参数必须被放|在其它SSI命o的前面,否则客户端只能显C默认的错误信息Q而不是由用户讑֮的自定义信息?/p>

                          <!--Qc onfig errmsg="Error! Please email webmaster@mydomain.com" -->

                          TimefmtQ定义日期和旉的用格式。Timefmt参数必须在echo命o之前使用?/p>

                          <!--Qc onfig timefmt="%AQ?%B %dQ?%Y"-->
                          <!--Qe cho var="LAST_MODIFIED" -->

                          昄l果为:

                          WednesdayQ?April 12Q?2000

                          也许用户对上例中所使用?A %B %d感到很陌生,下面我们׃表格的Ş式ȝ一下SSI中较为常用的一些日期和旉格式?/p>

                          SizefmtQ决定文件大是以字节、千字节q是兆字节ؓ单位表示。如果以字节为单位,参数gؓ"bytes"Q对于千字节和兆字节可以使用~写形式。同Psizefmt参数必须攑֜fsize命o的前面才能用?/p>

                          <!--Qc onfig sizefmt="bytes" -->
                          <!--Qf size file="index.html" -->

                          2、Include 命o

                          Include 命o可以把其它文档中的文字或囄插入到当前被解析的文档中Q这是整个SSI的关键所在。通过Include命o只需要改动一个文件就可以瞬间更新整个站点Q?/p>

                          Include 命oh两个不同的参敎ͼ

                          VirtualQ给出到服务器端某个文档的虚拟\径?br /> FileQ给出到当前目录的相对\径,其中不能使用"../"Q也不能使用l对路径?/p>

                          <!--Qi nclude virtual="/includes/header.html" -->
                          <!--Qi nclude file="header.html" --> q就要求每一个目录中都包含一个header.html文g?/p>

                          3、Echo 命o

                          Echo 命o可以昄以下各环境变量:

                          DOCUMENT_NAMEQ显C当前文档的名称?br /> DOCUMENT_URIQ显C当前文档的虚拟路径。例如:

                          <!--Qe cho var="DOCUMENT_NAME" -->
                          <!--Qe cho var="DOCUMENT_URI" -->

                          随着|站的不断发展,那些来长的URL地址肯定会让人头疹{如果用SSIQ一切就会迎刃而解。因为我们可以把|站的域名和SSI命ol合在一hC完整的URLQ即Q?/p>

                          http://YourDomain<!--Qe cho var="DOCUMENT_URI" -->

                          QUERY_STRING_UNESCAPEDQ显C未l{义处理的由客L发送的查询字串Q其中所有的Ҏ字符前面都有转义W?""。例如:

                          <!--Qe cho var="QUERY_STRING_UNESCAPED" -->

                          DATE_LOCALQ显C服务器讑֮时区的日期和旉。用户可以结合config命o的timefmt参数Q定制输Z息。例如:

                          <!--Qc onfig timefmt="%AQ?the %d of %BQ?in the year %Y" -->
                          <!--Qe cho var="DATE_LOCAL" -->

                          昄l果为:

                          SaturdayQ?the 15 of AprilQ?in the year 2000

                          DATE_GMTQ功能与DATE_LOCAL一P只不q返回的是以格林治标准旉为基准的日期。例如:

                          <!--Qe cho var="DATE_GMT" -->

                          LAST_MODIFIEDQ显C当前文档的最后更新时间。同Pq是SSI中非常实用的一个功能,只要在HTML文档中加入以下这行简单的文字Q就可以在页面上动态的昄更新旉?/p>

                          <!--Qe cho var="LAST_MODIFIED" -->

                          CGI环境变量

                          除了SSI环境变量之外Qecho命oq可以显CZ下CGI环境变量Q?/p>

                          SERVER_SOFTWAREQ显C服务器软g的名U和版本。例如:
                          <!--Qe cho var="SERVER_SOFTWARE" -->
                          SERVER_NAMEQ?昄服务器的L名称QDNS别名或IP地址。例如:
                          <!--Qe cho var="SERVER_NAME" -->
                          SERVER_PROTOCOLQ显C客Lh所使用的协议名U和版本Q如HTTP/1.0。例如:
                          <!--Qe cho var="SERVER_PROTOCOL" -->
                          SERVER_PORTQ显C服务器的响应端口。例如:
                          <!--Qe cho var="SERVER_PORT" -->
                          REQUEST_METHODQ显C客L的文档请求方法,包括GETQ?HEADQ?和POST。例如:
                          <!--Qe cho var="REQUEST_METHOD" -->
                          REMOTE_HOSTQ显C发求信息的客户端主机名U?br /> <!--Qe cho var="REMOTE_HOST" -->
                          REMOTE_ADDRQ显C发求信息的客户端IP地址?br /> <!--Qe cho var="REMOTE_ADDR" -->
                          AUTH_TYPEQ显C用戯n份的验证Ҏ?br /> <!--Qe cho var="AUTH_TYPE" -->
                          REMOTE_USERQ显C问受保护面的用h使用的帐号名U?br /> <!--Qe cho var="REMOTE_USER" -->

                          4、FsizeQ显C指定文件的大小Q可以结合config命o的sizefmt参数定制输出格式?/p>

                          <!--Qf size file="index_working.html" -->

                          5、FlastmodQ显C指定文件的最后修Ҏ期,可以l合config 命o的timefmt参数控制输出格式?/p>

                          <!--Qc onfig timefmt="%AQ?the %d of %BQ?in the year %Y" -->
                          <!--Qf lastmod file="file.html" -->

                          q里Q我们可以利用flastmod参数昄Z个页面上所有链接页面的更新日期。方法如下:

                          <!--Qc onfig timefmt=" %B %dQ?%Y" -->
                          <A HREF="/directory/file.html">File</A>
                          <!--Qf lastmod virtual="/directory/file.html" -->
                          <A HREF="/another_directory/another_file.html">Another File</A>
                          <!--Qf lastmod virtual="/another_directory/another_file.html" -->

                          昄l果为:

                          File April 19Q?2000
                          Another File January 08Q?2000

                          6、Exec

                          Exec命o可以执行CGI脚本或者shell命o。用方法如下:

                          CmdQ?bin/sh执行指定的字丌Ӏ如果SSI使用了IncludesNOEXEC选项Q则该命令将被屏蔽?br /> CgiQ可以用来执行CGI脚本。例如,下面q个例子中用服务端cgi-bin目录下的counter.pl脚本E序在每个页面放|一个计数器Q?/p>

                          <!--Qe xec cgi="/cgi-bin/counter.pl" -->

                          关于SHTML和HTML的区?/h4>

                          让我们先来看看SHTML和HTML的区别,如果用一句话来解释就?SHTML 不是HTML而是一U服务器 APIQshtml是服务器动态成的html.

                          虽然两者都是超文本格式Q但shtml是一U用于SSI技术的文g。也是Server Side Include--SSI 服务器端包含指o。如果Web Server有SSI功能的话Q大多数Q尤其是ZUnixq_Q的WEB服务器,如Netscape Enterprise Server{均支持SSI命o?/p>

                          C物 2008-02-13 22:55 发表评论
                          ]]>利用 Ant ?JUnit q行增量开?/title><link>http://m.tkk7.com/libin2722/archive/2008/02/13/179852.html</link><dc:creator>C物</dc:creator><author>C物</author><pubDate>Wed, 13 Feb 2008 14:54:00 GMT</pubDate><guid>http://m.tkk7.com/libin2722/archive/2008/02/13/179852.html</guid><wfw:comment>http://m.tkk7.com/libin2722/comments/179852.html</wfw:comment><comments>http://m.tkk7.com/libin2722/archive/2008/02/13/179852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/libin2722/comments/commentRss/179852.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/libin2722/services/trackbacks/179852.html</trackback:ping><description><![CDATA[<p>要ɋ试自动化,您需要一个测试框架。您可以自己开发或购买Q也可以使用某些开放源代码工具Q例?JUnit。我选择 JUnit Z以下几个原因Q?</p> <ul> <li>不需要编写自q框架? </li> <li>它是开放源代码Q因此不需要购买框架? </li> <li>开放源代码C֌中的其他开发者会使用它,因此可以扑ֈ许多CZ? </li> <li>它可以让我将试代码与品代码分开? </li> <li>它易于集成到我的构徏q程中?</li> </ul> <p><strong>试布局</strong> <br /> ?1 昄了用样?TestSuite ?JUnit TestSuite 布局。每个测试都pq单独的试案例构成。每个测试案例都是一个单独的c,它扩展了 TestClass cdƈ包含了我的测试代码,即那些曾?<code><span style="font-family: 新宋?">main()</span></code> 中出现的代码。在该例中,我向 TestSuite d了两个测试:一个是 SkeletonTestQ我它用作所有新cd HelloWorld cȝL?</p> <br /> <a name="N10115"><strong>?1. TestSuite 布局</strong></a><br /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image001.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="319" width="500" alt="" /> <br /> <p><strong>试c?HelloWorldTest.java</strong> <br /> 按照U定Q测试类的名UC包含我所试的类的名Uͼ但将 <em>Test</em> 附加到结。在本例中,我们的测试类?<code><span style="font-family: 新宋?">HelloWorldTest.java</span></code> 。我复制?SkeletonTest 中的代码Qƈd?<code><span style="font-family: 新宋?">testSayHello()</span></code> 来测?<code><span style="font-family: 新宋?">sayHello()</span></code> 。请注意 HelloWorldTest 扩展?TestCase。JUnit 框架提供?<code><span style="font-family: 新宋?">assert</span></code> ?<code><span style="font-family: 新宋?">assertEquals</span></code> ҎQ我们可以用这些方法来q行验证?<code><span style="font-family: 新宋?">HelloWorldTest.java</span></code> 昄在清?2 中?</p> <br /> <a name="N10145"><strong>清单 2. HelloWorldTest.java</strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">package test.com.company;import com.company.HelloWorld; import junit.work.TestCase;import junit.work.AssertionFailedError;/** * JUnit 3.2 testcases for HelloWorld */ public class HelloWorldTest extends TestCase { public HelloWorldTest(String name) { super(name); } public static void main(String args[]) { junit.textui.TestRunner.run(HelloWorldTest.class); } public void testSayHello() { HelloWorld world = new HelloWorld(); assert( world!=null ); assertEquals("Hello World", world.sayHello() ); }}</span></code></pre> </td> </tr> </tbody> </table> <br /> <p><code><span style="font-family: 新宋?">testSayHello()</span></code> 看上d <code><span style="font-family: 新宋?">HelloWorld.java</span></code> 中原来的 main ҎcMQ但有一个主要的不同之处。它不是执行 <code><span style="font-family: 新宋?">System.out.println</span></code> q显C结果,而是d了一?<code><span style="font-family: 新宋?">assertEquals()</span></code> Ҏ。如果两个g同, <code><span style="font-family: 新宋?">assertEquals</span></code> 打印出两个输入的倹{您可能已经注意到这个方法不起作用!HelloWorld 中的 <code><span style="font-family: 新宋?">sayHello()</span></code> Ҏ不返回字W串。如果我先写q测试,׃捕捉到这一炏V我?"Hello World" 字符串与输出联lv来。这P按照清单 3 中显C的那样重写?HelloWorldQ去?<code><span style="font-family: 新宋?">main()</span></code> Qƈ更改?<code><span style="font-family: 新宋?">sayHello()</span></code> 的返回类型?</p> <br /> <a name="N10172"><strong>清单 3. Hello world 试案例?/strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">package com.company;public class HelloWorld { public String sayHello() { return "Hello World"; }}</span></code></pre> </td> </tr> </tbody> </table> <br /> <p>如果我保留了 <code><span style="font-family: 新宋?">main()</span></code> q修改了联系Q代码看上去如下Q? <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">public static void main( String[] args ) { HelloWorld world = new HelloWorld(); System.out.println(world.sayHello()); }</span></code></pre> </td> </tr> </tbody> </table> <br /> </p> <p>新的 <code><span style="font-family: 新宋?">main()</span></code> 与我试E序中的 <code><span style="font-family: 新宋?">testSayHello()</span></code> 非常怼。是的,它看上去不象是一个现实世界中的问题(q是ZؓCZ的问题)Q但它说明了问题。在单独的应用程序中~写 <code><span style="font-family: 新宋?">main()</span></code> 可以改进您的设计Q同时帮助您设计试。现在我们已l创Z一个测试类Q让我们使用 Ant 来将它集成到构徏中?</p> <br /> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> <img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> </td> <td align="right" valign="top"><a ><strong><span style="color: #996699;">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N10196"><span style="font-size: 14pt;">使用 Ant 测试集成到构徏?/span></a></p> <p>Jakarta Project ?Ant 工具说成“不带 make ~点?make”。Ant 正在成ؓ开放源代码世界中实际上的标准。原因很单:Ant 是?Java 语言~写的,q种语言可以让构E在多种q_上用。这U特性简化了在不?OS q_之间的程序员的合作,而合作是开放源代码C֌的一U需要。您可以在自己选择的^Cq行开?<em>?/em>构徏。Ant 的特性包括: </p> <ul> <li>cd扩展?Java cd用于扩展构徏Ҏ,而不必用基?shell 的命令? </li> <li>开放源代码 因ؓ Ant 是开放源代码Q因此类扩展CZ很充뀂我发现通过CZ来学习非常棒? </li> <li>XML 可配|?Ant 不仅是基?Java 的,它还使用 XML 文g配置构徏q程。假设构建实际上是分层的Q那么?XML 描述 make q程是光辑层。另外,如果您了?XMLQ要学习如何配置构徏更单一些?</li> </ul> <p>?2 要介l了一个配|文件。配|文件由目标树构成。每个目标都包含了要执行的Q务,其中d是可以执行的代码。在本例中, <em>mkdir</em>是目?<em>compile</em>的Q务?<em>mkdir</em>是徏立在 Ant 中的一个Q务,用于创徏目录?Ant 带有一套健全的内置d。您也可以通过扩展 Ant dcLd自己的功能?</p> <p>每个目标都有唯一的名U和可选的相关性。目标相x需要在执行目标d列表之前执行。例如图 2 所C,在执?compile 目标中的d之前需要先q行 JUNIT 目标。这U类型的配置可以让您在一个配|中有多个树?/p> <br /> <a name="N101BF"><strong>?2. Ant XML 构徏?/strong></a><br /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image002.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="198" width="500" alt="" /> <br /> <p>与经?make 实用E序的相似性是非常显著的。这是理所当然的,因ؓ make 是 make。但也要C有一些差异:通过 Java 实现的跨q_和可扩展性,通过 XML 实现的可配置Q还有开放源代码?/p> <p><strong>下蝲和安?Ant</strong> <br /> 首先下蝲 AntQ请参阅 <a ><span style="color: #996699;">参考资?/span></a> Q。将 Ant 解压~到 tools 目录Q再?Ant <code><span style="font-family: 新宋?">bin</span></code> 目录d到\径中。(在我的机器上?<code><span style="font-family: 新宋?">e:"tools"ant"bin</span></code> 。)讄 ANT_HOME 环境变量。在 NT 中,q意味着q入pȝ属性,然后以带有值的变量形式d ANT_HOME。ANT_HOME 应该讄?Ant 根目录,卛_?<code><span style="font-family: 新宋?">bin</span></code> ?<code><span style="font-family: 新宋?">lib</span></code> 目录的目录。(Ҏ来说Q是 <code><span style="font-family: 新宋?">e:"tools"ant</span></code> 。)保 JAVA_HOME 环境变量讄为安装了 JDK 的目录。Ant 文档有关于安装的详细信息?</p> <p><strong>下蝲和安?JUnit</strong> <br /> 下蝲 JUnit 3.2Q请参阅 <a ><span style="color: #996699;">参考资?/span></a> Q。解开 <code><span style="font-family: 新宋?">junit.zip</span></code> Qƈ?<code><span style="font-family: 新宋?">junit.jar</span></code> d?CLASSPATH。如果将 <code><span style="font-family: 新宋?">junit.zip</span></code> 解包到类路径中,可以通过q行以下命o来测试安装: <code><span style="font-family: 新宋?">java junit.textui.TestRunner junit.samples.AllTests</span></code> </p> <p><strong>定义目录l构</strong> <br /> 在开始我们的构徏和测试过E之前,需要一个项目布局。图 3 昄了我的样本项目的布局。下面描qC布局的目录结构: </p> <ul> <li><code><span style="font-family: 新宋?">build</span></code> -- cL件的临时构徏位置。构E将创徏q个目录? </li> <li><code><span style="font-family: 新宋?">src</span></code> -- 源代码的位置?<code><span style="font-family: 新宋?">Src</span></code> 被分?<code><span style="font-family: 新宋?">test</span></code> 文g夹和 <code><span style="font-family: 新宋?">main</span></code> 文g夹,前者用于所有的试代码Q而后者包含可交付的代码。将试代码与主要代码分L供了几点Ҏ。首先,使主要代码中的؜乱减。其ơ,它允许包? 齐。我q衷与类和与其相关的包放|在一赗测试就应该和测试在一赗它q有助于分发q程Q因Z不可能打将单元试分发l客戗?</li> </ul> <p>在实际中Q我们有多个目录Q例?<code><span style="font-family: 新宋?">distribution</span></code> ?<code><span style="font-family: 新宋?">documentation</span></code> 。我们还会在 <code><span style="font-family: 新宋?">main</span></code> 下有多个用于包的目录Q例?<code><span style="font-family: 新宋?">com.company.util</span></code> ?</p> <p>因ؓ目录l构l常变动Q所以在 <code><span style="font-family: 新宋?">build.xml</span></code> 中有q些变动的全局字符串常数是很重要的?</p> <br /> <a name="N1024C"><strong>?3. 目布局?/strong></a><br /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image003.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" height="250" width="500" alt="" /> <br /> <p><strong>Ant 构徏配置文gCZ</strong> <br /> 下一步,我们要创建配|文件。清?4 昄了一?Ant 构徏文gCZ。构建文件中的关键就是名?runtests 的目标。这个目标进行分支判断ƈq行外部E序Q其中外部程序是前面已安装的 <code><span style="font-family: 新宋?">junit.textui.TestRunner</span></code> 。我们指定要使用语句 <code><span style="font-family: 新宋?">test.com.company.AllJUnitTests</span></code> 来运行哪个测试套件?</p> <br /> <a name="N10269"><strong>清单 4. 构徏文gCZ</strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><br /> <span style="font-family: Lucida Console;"><property name="app.name" ="sample" /> <property name="build.dir" ="build/classes" /> <target name="JUNIT"> <available property="junit.present" classname="junit.work.TestCase" /> </target> <target name="compile" depends="JUNIT"> <mkdir dir="${build.dir}"/> <javac srcdir="src/main/" destdir="${build.dir}" > <include name="**/*.java"/> </javac> </target> <target name="jar" depends="compile"> <mkdir dir="build/lib"/> <jar jarfile="build/lib/${app.name}.jar" basedir="${build.dir}" includes="com/**"/> </target> <target name="compiletests" depends="jar"> <mkdir dir="build/testcases"/> <javac srcdir="src/test" destdir="build/testcases"> <classpath> <pathelement location="build/lib/${app.name}.jar" /> <pathelement path="" /> </classpath> <include name="**/*.java"/> </javac> </target> <target name="runtests" depends="compiletests" if="junit.present"> <java fork="yes" classname="junit.textui.TestRunner" taskname="junit" fail="true"> <arg ="test.com.company.AllJUnitTests"/> <classpath> <pathelement location="build/lib/${app.name}.jar" /> <pathelement location="build/testcases" /> <pathelement path="" /> <pathelement path="${java.class.path}" /> </classpath> </java> </target> </project></span></code></pre> </td> </tr> </tbody> </table> <br /> <p><strong>q行 Ant 构徏CZ</strong> <br /> 开发过E中的下一步是q行创建和试 HelloWorld cȝ构徏。清?5 昄了构建的l果Q其中包括了各个目标部分。最L那部分是 runtests 输出语句Q它告诉我们整个试套g都正运行了?</p> <p>我在?4 和图 5 中显CZ JUnit GUIQ其中所要做的就是将 runtest 目标?<code><span style="font-family: 新宋?">junit.textui.TestRunner</span></code> 改ؓ <code><span style="font-family: 新宋?">junit.ui.TestRunner</span></code> 。当您?JUnit ?GUI 部分Ӟ您必选择退出按钮来l箋构徏q程。如果?Junit GUI 构徏包,那么它将更难与大型的构徏q程盔R成。另外,文本输出也与构徏q程更一_q可以定向输出到一个用于主构徏记录的文本文件。这对于每天晚上都要q? 行的构徏非常合适?</p> <br /> <a name="N10286"><strong>清单 5. 构徏输出CZ</strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">E:"projects"sample>ant runtestsSearching for build.xml ... Build E:"projects"sample"build.xmlJUNIT:compile: [mkdir] Created dir: E:"projects"sample"build"classes [javac] Compiling 1 source file to E:"projects"sample"build"classesjar: [mkdir] Created dir: E:"projects"sample"build"lib [jar] Building jar: E:"projects"sample"build"lib"sample.jarcompiletests: [mkdir] Created dir: E:"projects"sample"build"testcases [javac] Compiling 3 source files to E:"projects"sample"build"testcases runtests: [junit] .. [junit] Time: 0.031 [junit] [junit] OK (2 tests) [junit]BUILD SUCCESSFULTotal time: 1 second </span></code></pre> </td> </tr> </tbody> </table> <br /> <br /> <a name="N10292"><strong>?4. JUnit GUI 试成功</strong></a><br /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image004.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /> <br /> <br /> <a name="6"><strong>?5. JUnit GUI 试p|</strong></a><br /> <img src="http://www-128.ibm.com/developerworks/cn/java/j-ant/image005.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /> <br /> <br /> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> <img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /></td> </tr> </tbody> </table> <table align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td><img src="http://www.ibm.com/i/c.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" onclick="javascript:window.open(this.src);" style="cursor: pointer;" onload="rsimg(this,500)" alt="" /><br /> </td> <td align="right" valign="top"><a ><strong><span style="color: #996699;">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="N102AE"><span style="font-size: 14pt;">了解试的工作原?/span></a></p> <p>让我们搞点破坏,然后看看会发生什么事。夜׃Q我们决定把 "Hello World" 变成一个静态字W串。在更改期间Q我?<em>不小?/em>打错了字母,?"o" 变成?"0"Q如清单 6 所C?<br /> <a name="N102BA"><strong>清单 6. Hello world cL?/strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">package com.company;public class HelloWorld { private final static String HELLO_WORLD = "Hell0 World"; public String sayHello() { return HELLO_WORLD; }}</span></code></pre> </td> </tr> </tbody> </table> <br /> </p> <p>在徏包时Q我们看C错误。清?7 昄?runtest 中的错误。它昄了失败的试cd试ҎQƈ说明了ؓ什么会p|。我们返回到代码中,Ҏ错误后离开?/p> <br /> <a name="N102C7"><strong>清单 7. 构徏错误CZ</strong></a><br /> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td> <pre><code><span style="font-family: Lucida Console;">E:"projects"sample>ant runtestsSearching for build.xml ... Build E:"projects"sample"build.xmlJUNIT:compile:jar:compiletests:runtests: [junit] ..F [junit] Time: 0 [junit] [junit] FAILURES!!! [junit] Test Results: [junit] Run: 2 Failures: 1 Errors: 0 [junit] There was 1 failure: [junit] 1) testSayHello(test.com.company.HelloWorldTest) "expected:<Hello World> but was:<Hell0 World>" [junit]BUILD FAILED E:"projects"sample"build.xml:35: Java returned: -1Total time: 0 seconds</span></code></pre> </td> </tr> </tbody> </table> <img src ="http://m.tkk7.com/libin2722/aggbug/179852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/libin2722/" target="_blank">C物</a> 2008-02-13 22:54 <a href="http://m.tkk7.com/libin2722/archive/2008/02/13/179852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对google个性主늚拖拽效果的js的完整注释-1http://m.tkk7.com/libin2722/archive/2008/02/13/179851.htmlC物C物Wed, 13 Feb 2008 14:51:00 GMThttp://m.tkk7.com/libin2722/archive/2008/02/13/179851.htmlhttp://m.tkk7.com/libin2722/comments/179851.htmlhttp://m.tkk7.com/libin2722/archive/2008/02/13/179851.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/179851.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/179851.html// 工具c,使用Util的命名空_方便理
                          var  Util  =   new  Object();
                          // 获取http header里面的UserAgentQ浏览器信息
                          Util.getUserAgent  =  navigator.userAgent;
                          // 是否是Gecko核心的BrowserQ比如Mozila、Firefox
                          Util.isGecko  =  Util.getUserAgent.indexOf( " Gecko " !=   - 1 ;
                          // 是否是Opera
                          Util.isOpera  =  Util.getUserAgent.indexOf( " Opera " !=   - 1 ;
                          // 获取一个element的offset信息Q其实就是相对于Body的padding以内的绝对坐?/span>
                          //
                          后面一个参数如果是true则获取offsetLeftQfalse则是offsetTop
                          //
                          关于offset、style、client{坐标的定义参考dindin的这个帖子:http://www.jroller.com/page/dindin/?anchor=pro_java_12
                          Util.getOffset  =    (el, isLeft) {
                              
                          var  ret  =   0 ;
                              
                          while  (el  !=   null ) {
                                  ret 
                          +=  el[ " offset "   +  (isLeft  ?   " Left "  :  " Top " )];
                                  el 
                          =  el.offsetParent;
                              }
                              
                          return  ret;
                          };
                          // 一个(参数中的funcName是这个fuction的名字)l定C个element上,q且以这个element的上下文q行Q其实是一U承,q个可以google些文章看?/span>
                          Util.bind  =    (el, fucName) {
                              
                          return    () {
                                  
                          return  el[fucName].apply(el, arguments);
                              };
                          };
                          // 重新计算所有的可以拖拽的element的坐标,对同一个column下面的可拖拽囑ֱ重新计算它们的高度而得出新的坐标,防止遮叠
                          //
                          计算出来的坐标记录在pagePosLeft和pagePosTop两个属性里?/span>
                          Util.re_calcOff  =    (el) {
                              
                          for  ( var  i  =   0 ; i  <  Util.dragArray.length; i ++ ) {
                                  
                          var  ele  =  Util.dragArray[i];
                                  ele.elm.pagePosLeft 
                          =  Util.getOffset(ele.elm,  true );
                                  ele.elm.pagePosTop 
                          =  Util.getOffset(ele.elm,  false );
                              }
                              
                          var  nextSib  =  el.elm.nextSibling;
                              
                          while  (nextSib) {
                                  nextSib.pagePosTop 
                          -=  el.elm.offsetHeight;
                                  nextSib 
                          =  nextSib.nextSibling;
                              }
                          };

                          // 隐藏Google Ig中间那个tableQ也是拖拽的容器,配合show一般就是刷新用Q解决一些浏览器的怪癖
                          Util.hide  =    () {
                              Util.rootElement.style.display 
                          =   " none " ;
                          };
                          // 昄Google Ig中间那个tableQ解释同?/span>
                          Util.show  =    () {
                              Util.rootElement.style.display 
                          =   "" ;
                          };

                          // Ud时显C的占位虚线?/span>
                          ghostElement  =   null ;
                          // 获取q个虚线框,通过dom动态生?/span>
                          getGhostElement  =    () {
                              
                          if  ( ! ghostElement) {
                                  ghostElement 
                          =  createElement( " DIV " );
                                  ghostElement.className 
                          =   " modbox " ;
                                  ghostElement.backgroundColor 
                          =   "" ;
                                  ghostElement.style.border 
                          =   " 2px dashed #aaa " ;
                                  ghostElement.innerHTML 
                          =   " &nbsp; " ;
                              }
                              
                          return  ghostElement;
                          };

                          // 初始化可以拖拽的Element的函敎ͼ与拖拽无关的我去掉了
                            draggable(el) {
                               // 公用的开始拖拽的函数
                               this ._dragStart  =  start_Drag;
                               // 公用的正在拖拽的函数
                               this ._drag  =  when_Drag;
                               // 公用的拖拽结束的函数
                               this ._dragEnd  =  end_Drag;
                               // q个函数主要用来q行拖拽l束后的dom处理
                               this ._afterDrag  =  after_Drag;
                               // 是否正在被拖动,一开始当然没有被拖动
                               this .isDragging  =   false ;
                               // 这个Element的this指针注册在elmq个变量里面Q方便在自己的上下文以外调用自己的函数等Q很常用的方?
                               this .elm  =  el;
                               // 触发拖拽的ElementQ在q里是q个div上显C标题的那个div
                               this .header  =  getElementById(el.id  +   " _h " );
                               // 对于有i的element拖拽不同Q这里检一下ƈ记录
                               this .hasI  =   this .elm.getElementsByTagName( " I " ).length  >   0 ;
                               // 如果扑ֈ了headerq定drag相关的event
                               if  ( this .header) {
                                   // 拖拽时的叉子鼠标指针
                                   this .header.style.cursor  =   " move " ;
                                   // 函数绑定到header和element的this上,参照那个函数的说?
                                  Drag.init( this .header,  this .elm);
                                   // 下面三个语句写好的三个函数l定l这个elemnt的三个函数钩子上Q也实Celement从draggablel承可拖拽的函数
                                   this .elm.onDragStart  =  Util.bind( this ,  " _dragStart " );
                                   this .elm.onDrag  =  Util.bind( this ,  " _drag " );
                                   this .elm.onDragEnd  =  Util.bind( this ,  " _dragEnd " );
                              }
                          };

                          // 下面是draggable里面用到的那4?
                          // 公用的开始拖拽的函数
                            start_Drag() {
                               // 重置坐标Q实现拖拽以后自q位置马上会被填充的效?
                              Util.re_calcOff( this );
                               // 记录原先的邻居节点,用来Ҏ是否被移动到新的位置
                               this .origNextSibling  =   this .elm.nextSibling;
                               // 获取Ud的时候那个灰色的虚线?
                               var  _ghostElement  =  getGhostElement();
                               // 获取正在Ud的这个对象的高度
                               var  offH  =   this .elm.offsetHeight;
                               if  (Util.isGecko) {
                                   // 修正gecko引擎的怪癖?
                                  offH  -=  parseInt(_ghostElement.style.borderTopWidth)  *   2 ;
                              }
                               // 获取正在Ud的这个对象的宽度
                               var  offW  =   this .elm.offsetWidth;
                               // 获取left和top的坐?
                               var  offLeft  =  Util.getOffset( this .elm,  true );
                               var  offTop  =  Util.getOffset( this .elm,  false );
                               // 防止闪烁Q现隐藏
                              Util.hide();
                               // 自q宽度记录在style属性里?
                               this .elm.style.width  =  offW  +   " px " ;
                               // 那个灰框设定得与正在拖动的对象一样高Q比较Ş?
                              _ghostElement.style.height  =  offH  +   " px " ;
                               // 把灰框放到这个对象原先的位置?
                               this .elm.parentNode.insertBefore(_ghostElement,  this .elm.nextSibling);
                               // ׃要拖动必d被拖动的对象从原先的盒子模型里面抽出来,所以设定position为absoluteQ这个可以参考一下css布局斚w的知?
                               this .elm.style.position  =   " absolute " ;
                               // 讄zIndexQ让它处在最前面一层,当然其实zIndex=100是让它很靠前Q如果页面里有zIndex>100的,?#8230;…
                               this .elm.style.zIndex  =   100 ;
                               // ׃position=absolute了,所以left和top实现l对坐标定位Q这是先前计算坐标的作用,不让q个模型pQ要从开始拖动的地方开始移?
                               this .elm.style.left  =  offLeft  +   " px " ;
                               this .elm.style.top  =  offTop  +   " px " ;
                               // 坐标讑֮完毕Q可以显CZQ这样就不会闪烁?
                              Util.show();
                               // q里本来有个ig_d.GQ没搞明白干什么用的,不过没有也可以用Q谁知道ȝ告诉我一壎ͼ不好意?
                               // q没有开始拖拽,q里做个记号
                               this .isDragging  =   false ;
                               return   false ;
                          };

                          // 初始化可以拖拽的Element的函敎ͼ与拖拽无关的我去掉了
                            draggable(el) {
                               // 公用的开始拖拽的函数
                               this ._dragStart  =  start_Drag;
                               // 公用的正在拖拽的函数
                               this ._drag  =  when_Drag;
                               // 公用的拖拽结束的函数
                               this ._dragEnd  =  end_Drag;
                               // q个函数主要用来q行拖拽l束后的dom处理
                               this ._afterDrag  =  after_Drag;
                               // 是否正在被拖动,一开始当然没有被拖动
                               this .isDragging  =   false ;
                               // 这个Element的this指针注册在elmq个变量里面Q方便在自己的上下文以外调用自己的函数等Q很常用的方?
                               this .elm  =  el;
                               // 触发拖拽的ElementQ在q里是q个div上显C标题的那个div
                               this .header  =  getElementById(el.id  +   " _h " );
                               // 对于有i的element拖拽不同Q这里检一下ƈ记录
                               this .hasI  =   this .elm.getElementsByTagName( " I " ).length  >   0 ;
                               // 如果扑ֈ了headerq定drag相关的event
                               if  ( this .header) {
                                   // 拖拽时的叉子鼠标指针
                                   this .header.style.cursor  =   " move " ;
                                   // 函数绑定到header和element的this上,参照那个函数的说?
                                  Drag.init( this .header,  this .elm);
                                   // 下面三个语句写好的三个函数l定l这个elemnt的三个函数钩子上Q也实Celement从draggablel承可拖拽的函数
                                   this .elm.onDragStart  =  Util.bind( this ,  " _dragStart " );
                                   this .elm.onDrag  =  Util.bind( this ,  " _drag " );
                                   this .elm.onDragEnd  =  Util.bind( this ,  " _dragEnd " );
                              }
                          };
                          // 下面是draggable里面用到的那4?
                          // 公用的开始拖拽的函数
                            start_Drag() {
                               // 重置坐标Q实现拖拽以后自q位置马上会被填充的效?
                              Util.re_calcOff( this );
                               // 记录原先的邻居节点,用来Ҏ是否被移动到新的位置
                               this .origNextSibling  =   this .elm.nextSibling;
                               // 获取Ud的时候那个灰色的虚线?
                               var  _ghostElement  =  getGhostElement();
                               // 获取正在Ud的这个对象的高度
                               var  offH  =   this .elm.offsetHeight;
                               if  (Util.isGecko) {
                                   // 修正gecko引擎的怪癖?
                                  offH  -=  parseInt(_ghostElement.style.borderTopWidth)  *   2 ;
                              }
                               // 获取正在Ud的这个对象的宽度
                               var  offW  =   this .elm.offsetWidth;
                               // 获取left和top的坐?
                               var  offLeft  =  Util.getOffset( this .elm,  true );
                               var  offTop  =  Util.getOffset( this .elm,  false );
                               // 防止闪烁Q现隐藏
                              Util.hide();
                               // 自q宽度记录在style属性里?
                               this .elm.style.width  =  offW  +   " px " ;
                               // 那个灰框设定得与正在拖动的对象一样高Q比较Ş?
                              _ghostElement.style.height  =  offH  +   " px " ;
                               // 把灰框放到这个对象原先的位置?
                               this .elm.parentNode.insertBefore(_ghostElement,  this .elm.nextSibling);
                               // ׃要拖动必d被拖动的对象从原先的盒子模型里面抽出来,所以设定position为absoluteQ这个可以参考一下css布局斚w的知?
                               this .elm.style.position  =   " absolute " ;
                               // 讄zIndexQ让它处在最前面一层,当然其实zIndex=100是让它很靠前Q如果页面里有zIndex>100的,?#8230;…
                               this .elm.style.zIndex  =   100 ;
                               // ׃position=absolute了,所以left和top实现l对坐标定位Q这是先前计算坐标的作用,不让q个模型pQ要从开始拖动的地方开始移?
                               this .elm.style.left  =  offLeft  +   " px " ;
                               this .elm.style.top  =  offTop  +   " px " ;
                               // 坐标讑֮完毕Q可以显CZQ这样就不会闪烁?
                              Util.show();
                               // q里本来有个ig_d.GQ没搞明白干什么用的,不过没有也可以用Q谁知道ȝ告诉我一壎ͼ不好意?
                               // q没有开始拖拽,q里做个记号
                               this .isDragging  =   false ;
                               return   false ;
                          };
                          // 在拖拽时的相应函敎ͼ׃l定到鼠标的moveq个event上,所以会传入鼠标的坐标clientX, clientY
                            when_Drag(clientX, clientY) {
                               // 刚开始拖拽的时候将囑ֱ变透明Qƈ标记为正在被拖拽
                               if  ( ! this .isDragging) {
                                   this .elm.style.filter  =   " alpha(opacity=70) " ;
                                   this .elm.style.opacity  =   0.7 ;
                                   this .isDragging  =   true ;
                              }
                               // 被拖拽到的新的columnQ当然也可以是原来那个)
                               var  found  =   null ;
                               // 最大的距离Q可能是防止溢出或者什么bug
                               var  max_distance  =   100000000 ;
                               // 遍历所有的可拖拽的elementQ寻扄当前鼠标坐标最q的那个可拖拽元素,以便后面插入
                               for  ( var  i  =   0 ; i  <  Util.dragArray.length; i ++ ) {
                                   var  ele  =  Util.dragArray[i];
                                   // 利用勾股定理计算鼠标到遍历到的这个元素的距离
                                   var  distance  =  Math.sqrt(Math.pow(clientX  -  ele.elm.pagePosLeft,  2 )  +  Math.pow(clientY  -  ele.elm.pagePosTop,  2 ));
                                   // 自己已经动了,所以不计算自己?
                                   if  (ele  ==   this ) {
                                       continue ;
                                  }
                                   // 如果计算p|l箋循环
                                   if  (isNaN(distance)) {
                                       continue ;
                                  }
                                   // 如果更小Q记录下q个距离Qƈ它作ؓfound
                                   if  (distance  <  max_distance) {
                                      max_distance  =  distance;
                                      found  =  ele;
                                  }
                              }
                               // 准备让灰框落?
                               var  _ghostElement  =  getGhostElement();
                               // 如果扑ֈ了另外的落脚?
                               if  (found  !=   null   &&  _ghostElement.nextSibling  !=  found.elm) {
                                   // 扑ֈ落脚点就先把灰框插进去,q就是我们看到的那个灰框停靠的特效,有点像吸附的感觉Q哈?
                                  found.elm.parentNode.insertBefore(_ghostElement, found.elm);
                                   if  (Util.isOpera) {
                                       // Opera的现实问题,要隐?昄后才能刷新出变化
                                      body.style.display  =   " none " ;
                                      body.style.display  =   "" ;
                                  }
                              }
                          };
                          // 拖拽完毕
                            end_Drag() {
                               // 拖拽完毕后执行后面的钩子Q执行after_Drag()Q如果布局发生了变动了p录到q程服务器,保存你拖拽后新的布局序
                               if  ( this ._afterDrag()) {
                                   // remote call to save the change
                              }
                               return   true ;
                          };
                          // 拖拽后的执行钩子
                            after_Drag() {
                               var  return  =   false ;
                               // 防止闪烁
                              Util.hide();
                               // 把拖拽时的position=absolute和相关的那些style都消?
                               this .elm.style.position  =   "" ;
                               this .elm.style.width  =   "" ;
                               this .elm.style.zIndex  =   "" ;
                               this .elm.style.filter  =   "" ;
                               this .elm.style.opacity  =   "" ;
                               // 获取灰框
                               var  ele  =  getGhostElement();
                               // 如果现在的邻居不是原来的d?
                               if  (ele.nextSibling  !=   this .origNextSibling) {
                                   // 把被拖拽的这个节Ҏ到灰框的前面
                                  ele.parentNode.insertBefore( this .elm, ele.nextSibling);
                                   // 标明被拖拽了新的地方
                                  return  =   true ;
                              }
                               // U除灰框Q这是这个灰框的生命周期应该q束了
                              ele.parentNode.removeChild(ele);
                               // 修改完毕Q显C?
                              Util.show();
                               if  (Util.isOpera) {
                                   // Opera的现实问题,要隐?昄后才能刷新出变化
                                  body.style.display  =   " none " ;
                                  body.style.display  =   "" ;
                              }
                               return  return;
                          };


                          // 可拖拽Element的原形,用来eventl定到各个钩子,q部分市比较通用的,netvibes也是基本完全相同的实?
                          // q部分推荐看dindin的这个,也会帮助理解Q?a >http://www.jroller.com/page/dindin/?anchor=pro_java_12
                          var  Drag  =  {
                               // 对这个element的引用,一ơ只能拖拽一个Element
                              obj: null ,
                               // element是被拖拽的对象的引用QelementHeader是鼠标可以拖拽的区?
                              init:   (elementHeader, element) {
                                   // startl定到down事gQ按下鼠标触发start
                                  elementHeader.down  =  Drag.start;
                                   // element存到header的obj里面Q方便header拖拽的时候引?
                                  elementHeader.obj  =  element;
                                   // 初始化绝对的坐标Q因Z是position=absolute所以不会v什么作用,但是防止后面onDrag的时候parse出错?
                                   if  (isNaN(parseInt(element.style.left))) {
                                      element.style.left  =   " 0px " ;
                                  }
                                   if  (isNaN(parseInt(element.style.top))) {
                                      element.style.top  =   " 0px " ;
                                  }
                                   // 挂上I,初始化这几个成员Q在Drag.init被调用后才帮定到实际的函敎ͼ可以参照draggable里面的内?
                                  element.onDragStart  =   new  ();
                                  element.onDragEnd  =   new  ();
                                  element.onDrag  =   new  ();
                              },
                               // 开始拖拽的l定Q绑定到鼠标的移动的event?
                              start:   (event) {
                                   var  element  =  Drag.obj  =   this .obj;
                                   // 解决不同览器的event模型不同的问?
                                  event  =  Drag.fixE(event);
                                   // 看看是不是左键点?
                                   if  (event.which  !=   1 ) {
                                       // 除了左键都不起作?
                                       return   true ;
                                  }
                                   // 参照q个函数的解释,挂上开始拖拽的钩子
                                  element.onDragStart();
                                   // 记录鼠标坐标
                                  element.lastMouseX  =  event.clientX;
                                  element.lastMouseY  =  event.clientY;
                                   // Global的eventl定到被拖动的element上面?
                                  up  =  Drag.end;
                                  move  =  Drag.drag;
                                   return   false ;
                              },
                               // Element正在被拖动的函数
                              drag:   (event) {
                                   // 解决不同览器的event模型不同的问?
                                  event  =  Drag.fixE(event);
                                   // 看看是不是左键点?
                                   if  (event.which  ==   0 ) {
                                       // 除了左键都不起作?
                                       return  Drag.end();
                                  }
                                   // 正在被拖动的Element
                                   var  element  =  Drag.obj;
                                   // 鼠标坐标
                                   var  _clientX  =  event.clientY;
                                   var  _clientY  =  event.clientX;
                                   // 如果鼠标没动׃么都不作
                                   if  (element.lastMouseX  ==  _clientY  &&  element.lastMouseY  ==  _clientX) {
                                       return   false ;
                                  }
                                   // 刚才Element的坐?
                                   var  _lastX  =  parseInt(element.style.top);
                                   var  _lastY  =  parseInt(element.style.left);
                                   // 新的坐标
                                   var  newX, newY;
                                   // 计算新的坐标Q原先的坐标+鼠标Ud的值差
                                  newX  =  _lastY  +  _clientY  -  element.lastMouseX;
                                  newY  =  _lastX  +  _clientX  -  element.lastMouseY;
                                   // 修改element的显C坐?
                                  element.style.left  =  newX  +   " px " ;
                                  element.style.top  =  newY  +   " px " ;
                                   // 记录element现在的坐标供下一ơ移动?
                                  element.lastMouseX  =  _clientY;
                                  element.lastMouseY  =  _clientX;
                                   // 参照q个函数的解释,挂接上Drag时的钩子
                                  element.onDrag(newX, newY);
                                   return   false ;
                              },
                               // Element正在被释攄函数Q停止拖?
                              end:   (event) {
                                   // 解决不同览器的event模型不同的问?
                                  event  =  Drag.fixE(event);
                                   // 解除对Global的event的绑?
                                  move  =   null ;
                                  up  =   null ;
                                   // 先记录下onDragEnd的钩子,好移除obj
                                   var  _onDragEndFuc  =  Drag.obj.onDragEnd();
                                   // 拖拽完毕Qobj清空
                                  Drag.obj  =   null ;
                                   return  _onDragEndFuc;
                              },
                               // 解决不同览器的event模型不同的问?
                              fixE:   (ig_) {
                                   if  ( typeof  ig_  ==   " undefined " ) {
                                      ig_  =  event;
                                  }
                                   if  ( typeof  ig_.layerX  ==   " undefined " ) {
                                      ig_.layerX  =  ig_.offsetX;
                                  }
                                   if  ( typeof  ig_.layerY  ==   " undefined " ) {
                                      ig_.layerY  =  ig_.offsetY;
                                  }
                                   if  ( typeof  ig_.which  ==   " undefined " ) {
                                      ig_.which  =  ig_.button;
                                  }
                                   return  ig_;
                              }
                          };

                          // 下面是初始化的函CQ看看上面这些东西怎么被调?
                          var  _IG_initDrag  =     (el) {
                               // column那个容器Q在google里面是那个table布局的tbodyQnetvibes用的<div>
                              Util.rootElement  =  el;
                               // q个tbody的行
                              Util._rows  =  Util.rootElement.tBodies[ 0 ].rows[ 0 ];
                               // 列,google?列,其实也可以更?
                              Util.column  =  Util._rows.cells;
                               // 用来存取可拖拽的对象
                              Util.dragArray  =   new  Array();
                               var  counter  =   0 ;
                               for  ( var  i  =   0 ; i  <  Util.column.length; i ++ ) {
                                   // 搜烦所有的column
                                   var  ele  =  Util.column[i];
                                   for  ( var  j  =   0 ; j  <  ele.childNodes.length; j ++ ) {
                                       // 搜烦每一column里面的所有element
                                       var  ele1  =  ele.childNodes[j];
                                       // 如果是div把它初始化Z个draggable对象
                                       if  (ele1.tagName  ==   " DIV " ) {
                                          Util.dragArray[counter]  =   new  draggable(ele1);
                                          counter ++ ;
                                      }
                                  }
                              }
                          };

                          // google的页面里可以拖动的部分的id?t_1"
                          // 挂蝲刎ͼ载入完毕执行。不q实际上google没有用?
                          // 而是写在面最下面Q异曲同工吧Q也许直接写在页面是U怪癖Q或者也有可能是兼容性考虑?

                          // 请将下面两条被注释掉的代码加Q到你自׃载的一个google ig面里面Q把里面的所有其余删除,挂上q个js也可以拖拽了Q哈?
                          // _table=getElementById("t_1");
                          // = _IG_initDrag(_table);

                          // 其实看懂q些代码对学习java很有益,希望对大家能有帮?/span>


                          C物 2008-02-13 22:51 发表评论
                          ]]>
                          调用IE内部的打印控件来实现打印功能http://m.tkk7.com/libin2722/archive/2007/12/19/168763.htmlC物C物Wed, 19 Dec 2007 07:29:00 GMThttp://m.tkk7.com/libin2722/archive/2007/12/19/168763.htmlhttp://m.tkk7.com/libin2722/comments/168763.htmlhttp://m.tkk7.com/libin2722/archive/2007/12/19/168763.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/168763.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/168763.html<OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(2,1) type=button value=关闭所?/span>>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(4,1) type=button value=另存?/span>> 
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value=打印>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(6,6) type=button value=直接打印>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(7,1) type=button value=打印预览>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value=面讄>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value=属?/span>>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(17,1) type=button value=全?/span>>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(22,1) type=button value=h>
                          <input name=Button onClick=document.all.WebBrowser.ExecWB(45,1) type=button value=关闭>

                          再jsp面中写入如下代码:
                          <object id="WebBrowser"  width=0  height=0  classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>   

                          <input type=button value=<s:text name="message.printing"/> onclick=document.all.WebBrowser.ExecWB(6,6)>  
                          <input type=button value=<s:text name="message.pagesetup"/> onclick=document.all.WebBrowser.ExecWB(8,1)>  
                          <input type=button value=<s:text name="message.printview"/> onclick=document.all.WebBrowser.ExecWB(7,1)> 
                          可以再页面上实现三个按钮Q?#8220;直接打印”?#8220;面讄”?#8220;打印预览”Q点M个按钮能够执行相应操?br />



                          C物 2007-12-19 15:29 发表评论
                          ]]>
                          java中文件操作大?/title><link>http://m.tkk7.com/libin2722/archive/2007/11/08/159167.html</link><dc:creator>C物</dc:creator><author>C物</author><pubDate>Thu, 08 Nov 2007 13:04:00 GMT</pubDate><guid>http://m.tkk7.com/libin2722/archive/2007/11/08/159167.html</guid><wfw:comment>http://m.tkk7.com/libin2722/comments/159167.html</wfw:comment><comments>http://m.tkk7.com/libin2722/archive/2007/11/08/159167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/libin2722/comments/commentRss/159167.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/libin2722/services/trackbacks/159167.html</trackback:ping><description><![CDATA[<span id="iwga84o" class="bold">java中文件操作大?/span><br /> <br /> <div id="y4cu4kg" class="t_msgfont" id="message557657" style="font-size: 14px">一.获得控制台用戯入的信息<br /> <br /> /** *//**获得控制台用戯入的信息<br />      * @return<br />      * @throws IOException<br />      */<br />     public String getInputMessage() throws IOException...{<br />         System.out.println("误入您的命令∶");<br />         byte buffer[]=new byte[1024];<br />         int count=System.in.read(buffer);<br />         char[] ch=new char[count-2];//最后两位ؓl束W,删去不要<br />         for(int i=0;i<count-2;i++)<br />             ch<em>=(char)buffer<em>;<br />         String str=new String(ch);<br />         return str;<br />     }<br /> 可以q回用户输入的信息,不之处在于不支持中文输入,有待q一步改q?br /> <br /> ?复制文g<br /> <br /> 1.以文件流的方式复制文?br /> <br /> /** *//**以文件流的方式复制文?br />      * @param src 文g源目?br />      * @param dest 文g目的目录<br />      * @throws IOException  <br />      */<br />     public void copyFile(String src,String dest) throws IOException...{<br />         FileInputStream in=new FileInputStream(src);<br />         File file=new File(dest);<br />         if(!file.exists())<br />             file.createNewFile();<br />         FileOutputStream out=new FileOutputStream(file);<br />         int c;<br />         byte buffer[]=new byte[1024];<br />         while((c=in.read(buffer))!=-1)...{<br />             for(int i=0;i<c;i++)<br />                 out.write(buffer<em>);        <br />         }<br />         in.close();<br />         out.close();<br />     }<br /> 该方法经q测试,支持中文处理Qƈ且可以复制多U类型,比如txtQxmlQjpgQdoc{多U格?br /> <br /> ?写文?br /> <br /> 1.利用PrintStream写文?br /> <br /> /** *//**<br />      * 文g输出CZ<br />      */<br />     public void PrintStreamDemo()...{<br />         try ...{<br />             FileOutputStream out=new FileOutputStream("D:/test.txt");<br />             PrintStream p=new PrintStream(out);<br />             for(int i=0;i<10;i++)<br />                 p.println("This is "+i+" line");<br />         } catch (FileNotFoundException e) ...{<br />             e.printStackTrace();<br />         }<br />     }<br /> 2.利用StringBuffer写文?br /> <br /> public void StringBufferDemo() throws IOException......{<br />         File file=new File("/root/sms.log");<br />         if(!file.exists())<br />             file.createNewFile();<br />         FileOutputStream out=new FileOutputStream(file,true);        <br />         for(int i=0;i<10000;i++)......{<br />             StringBuffer sb=new StringBuffer();<br />             sb.append("q是W?+i+"?前面介绍的各U方法都不关?Z么L奇怪的问题 ");<br />             out.write(sb.toString().getBytes("utf-8"));<br />         }        <br />         out.close();<br />     }<br /> 该方法可以设定用何U编码,有效解决中文问题?br /> <br /> ?文g重命?br /> <br /> <br />     /** *//**文g重命?br />      * @param path 文g目录<br />      * @param oldname  原来的文件名<br />      * @param newname 新文件名<br />      */<br />     public void renameFile(String path,String oldname,String newname)...{<br />         if(!oldname.equals(newname))...{//新的文g名和以前文g名不同时,才有必要q行重命?br />             File oldfile=new File(path+"/"+oldname);<br />             File newfile=new File(path+"/"+newname);<br />             if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同Q则不允讔R命名<br />                 System.out.println(newname+"已经存在Q?);<br />             else...{<br />                 oldfile.renameTo(newfile);<br />             } <br />         }         <br />     }?转移文g目录 <br /> <br /> <br /> 转移文g目录不等同于复制文gQ复制文件是复制后两个目录都存在该文Ӟ而{UL件目录则是{UdQ只有新目录中存在该文g?<br /> <br />     /** *//**转移文g目录<br />      * @param filename 文g?br />      * @param oldpath 旧目?br />      * @param newpath 新目?br />      * @param cover 若新目录下存在和转移文gh相同文g名的文gӞ是否覆盖新目录下文gQcover=true会覆盖原文Ӟ否则不操?br />      */<br />     public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{<br />         if(!oldpath.equals(newpath))...{<br />             File oldfile=new File(oldpath+"/"+filename);<br />             File newfile=new File(newpath+"/"+filename);<br />             if(newfile.exists())...{//若在待{Uȝ录下Q已l存在待转移文g<br />                 if(cover)//覆盖<br />                     oldfile.renameTo(newfile);<br />                 else<br />                     System.out.println("在新目录下已l存在:"+filename);<br />             }<br />             else...{<br />                 oldfile.renameTo(newfile);<br />             }<br />         }       <br />     }<br /> <br /> <br /> <br /> ?L?br /> <br /> 1.利用FileInputStreamd文g<br /> <br /> <br />     /** *//**L?br />      * @param path<br />      * @return<br />      * @throws IOException<br />      */<br />     public String FileInputStreamDemo(String path) throws IOException...{<br />         File file=new File(path);<br />         if(!file.exists()||file.isDirectory())<br />             throw new FileNotFoundException();<br />         FileInputStream fis=new FileInputStream(file);<br />         byte[] buf = new byte[1024];<br />         StringBuffer sb=new StringBuffer();<br />         while((fis.read(buf))!=-1)...{<br />             sb.append(new String(buf));    <br />             buf=new byte[1024];//重新生成Q避免和上次d的数据重?br />         }<br />         return sb.toString();<br />     }<br /> <br /> <br /> 2.利用BufferedReaderd<br /> <br /> 在IO操作Q利用BufferedReader和BufferedWriter效率会更高一?<br /> <br />     /** *//**L?br />      * @param path<br />      * @return<br />      * @throws IOException<br />      */<br />     public String BufferedReaderDemo(String path) throws IOException...{<br />         File file=new File(path);<br />         if(!file.exists()||file.isDirectory())<br />             throw new FileNotFoundException();<br />         BufferedReader br=new BufferedReader(new FileReader(file));<br />         String temp=null;<br />         StringBuffer sb=new StringBuffer();<br />         temp=br.readLine();<br />         while(temp!=null)...{<br />             sb.append(temp+" ");<br />             temp=br.readLine();<br />         }<br />         return sb.toString();<br />     }<br /> <br /> <br /> 3.利用dom4jdxml文g <br /> <br />     /** *//**从目录中dxml文g<br />      * @param path 文g目录<br />      * @return<br />      * @throws DocumentException<br />      * @throws IOException<br />      */<br />     public Document readXml(String path) throws DocumentException, IOException...{<br />         File file=new File(path);<br />         BufferedReader bufferedreader = new BufferedReader(new FileReader(file));<br />         SAXReader saxreader = new SAXReader();<br />         Document document = (Document)saxreader.read(bufferedreader);<br />         bufferedreader.close();<br />         return document;<br />     }<br /> <br /> <br /> ?创徏文g(文g?<br /> <br /> 1.创徏文g?nbsp; /** *//**创徏文g?br />      * @param path  目录<br />      */<br />     public void createDir(String path)...{<br />         File dir=new File(path);<br />         if(!dir.exists())<br />             dir.mkdir();<br />     }<br /> 2.创徏新文?/** *//**创徏新文?br />      * @param path 目录<br />      * @param filename 文g?br />      * @throws IOException<br />      */<br />     public void createFile(String path,String filename) throws IOException...{<br />         File file=new File(path+"/"+filename);<br />         if(!file.exists())<br />             file.createNewFile();<br />     }<br /> ?删除文g(目录)<br /> <br /> 1.删除文g     /** *//**删除文g<br />      * @param path 目录<br />      * @param filename 文g?br />      */<br />     public void delFile(String path,String filename)...{<br />         File file=new File(path+"/"+filename);<br />         if(file.exists()&&file.isFile())<br />             file.delete();<br />     }<br /> 2.删除目录<br /> 要利用Filecȝdelete()Ҏ删除目录Ӟ必须保证该目录下没有文g或者子目录Q否则删除失败,因此在实际应用中Q我们要删除目录Q必d用递归删除该目录下的所有子目录和文Ӟ然后再删除该目录?nbsp; /** *//**递归删除文g?br />      * @param path<br />      */<br />     public void delDir(String path)...{<br />         File dir=new File(path);<br />         if(dir.exists())...{<br />             File[] tmp=dir.listFiles();<br />             for(int i=0;i<tmp.length;i++)...{<br />                 if(tmp<em>.isDirectory())...{<br />                     delDir(path+"/"+tmp<em>.getName());<br />                 }<br />                 else...{<br />                     tmp<em>.delete();<br />                 }<br />             }<br />             dir.delete();<br />         }<br />     }</div> </em></em></em></em></em></em> <img src ="http://m.tkk7.com/libin2722/aggbug/159167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/libin2722/" target="_blank">C物</a> 2007-11-08 21:04 <a href="http://m.tkk7.com/libin2722/archive/2007/11/08/159167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~写你自q单点dQSSOQ服?http://m.tkk7.com/libin2722/archive/2007/09/11/144175.htmlC物C物Tue, 11 Sep 2007 02:31:00 GMThttp://m.tkk7.com/libin2722/archive/2007/09/11/144175.htmlhttp://m.tkk7.com/libin2722/comments/144175.htmlhttp://m.tkk7.com/libin2722/archive/2007/09/11/144175.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/144175.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/144175.html阅读全文

                          C物 2007-09-11 10:31 发表评论
                          ]]>
                          վ֩ģ壺 avվ߹ۿ | Ʒ߳| ˳վѲ| ˾ƷƵ| ޵Ӱһ| ʮ˽Ƶ߹ۿڵ | 鶹AV뾫Ʒþ| aѹۿ| պһ234 | AëƬA| þþƷĻվ| Ƶ| ޾aaվ| jizzһ| պߵһҳ| һëƬһֱӹۿ| ޹þþۺ| ҹӰԺþþƷѿһ | ޾ҹþþþþ| sihuƷ| avƬ߹ۿ| Ѹþ| ۺ˾þôý| ߳ˮ| ޳AVƬ߹ۻ| 99þùƷһ| ޹ƷAAAƬ| ɫtvվѿ| ޹Ʒþ| 2018ĻƵ| ޾ƷŮ| 91Ʒѹ| 㽶߹ۿ| õ߳| ŷۺһ| ٸaëƬ| ɫƵѹۿ| þþƷĻվ| 99Ƶѿ| av߾Ʒ޵һվ| ѸԴվ߹ۿ |