梓聪's profile传说中的16号PhotosBlogListsMore Tools Help

Blog


    September 29

    武林三国辅助工具

    武林三国辅助工具
    不是脱机版哦スマイル
    暂时没有公开的打算,先看看界面,呵呵

    动作环境:.NET Framework 2.0
    下载地址:暂时不提供下载


    July 23

    Google日历客户端

    Google日历客户端
    利用Google Calendar .NET API 写的客户端
    (跟网上那个用IE内核做的不一样)
    有时间会慢慢添加功能,不满意的话,大家也可以自己写スマイル
    这样做的一个好处是windows的提醒比较方便(windows提醒功能有时间再完善)
        ----稍微修改了一下

    允许自定义多语言
    可以最小化到托盘

    动作环境:.NET Framework 2.0
    下载地址:Google日历客户端




    May 08

    SQL Server的DATEADD的备忘

    关于取前一个月的日期的问题,如果用下面的方法,
    结果=DATEADD(mm,-1,GETDATE()),两条结论:
    1.结果为月减一,日不变
    2.结果如果不是正确的日期,则月减一,日为前月最后一天

    例子:
    select DATEADD(mm,-1,'2008-11-30')   ->  2008-10-30  (结论一)
    select DATEADD(mm,-1,'2008-12-31')   ->  2008-11-30  (结论二,因为11月没有31号)

    所以,想用这种方法去获得2008-10-31是不可能的爆笑

    Oracle就不是这样的。。。クール

    最近用的一些挺好的工具

    DTS Backup 2000 主页
    用来批量导入导出SQL Server的数据转换服务(データ変換サービス)里面的DTS包的好工具。
    下载安装即可,有GUI

    HtmlCleaner 主页
    可以用于美化html代码。中文介绍
    java写的jar包,使用命令行执行,很方便
    December 13

    Visual Studio 2005的ReportViewer的一个bug

    发现一个问题:在DisplayMode.PrintLayout显示模式下,toolbar里面的PageNavigator的最大页数,
    99%的情况下,总是比报表里面显示的最大页数小1 !!!
    跟这里的哥们儿碰到的问题一模一样:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=297814&SiteID=1
    解决方法是:
    在Form_Load里面,进行数据填充,然后调用Me.ReportViewer1.RefreshReport() ----这个刷新完,会产生RenderingComplete事件
    然后在ReportViewer1_RenderingComplete事件响应函数里,才设置Me.ReportViewer1.SetDisplayMode(DisplayMode.PrintLayout)

    但是这样会出现画面刷新两次的问题。
    所以在Form_Load里面,数据填充前,先Me.ReportViewer1.Visible = False
    在ReportViewer1_RenderingComplete事件响应函数里,设置DisplayMode.PrintLayout之前,先Me.ReportViewer1.Visible = True

    还可以在Form上面加点提示信息之类的,用户就不会感到突兀了。
    August 23

    Web应用中解决编码问题

    1. 使用Filter
    1.修改web.xml文件,在<web-app>标签后增加如下内容.
    <filter>
     <filter-name>Set Character Encoding</filter-name>
     <filter-class>com.filter.SetEncodingFilter</filter-class>
     <init-param>
      <param-name>encoding</param-name>
      <param-value>shift_jis</param-value>
     </init-param>
    </filter>
    <filter-mapping>
     <filter-name>Set Character Encoding</filter-name>
     <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    没写完,待续。。。
    December 29

    IIS备忘录

    备忘:
    安装完.Net之后,如果重新安装IIS,在装完IIS后,运行一下C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe /i
    如果不能Debug,再来一下C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -r
    December 14

    让你的程序在blog上多姿多彩

    我写blog的时候,有时候需要把一些代码给贴上去,平时用IDE或者别的编辑器(如Editplus)写代码的时候,因为这些编辑环境有语法分析,所以程序的关键字和类等等的东西都能表示出不一样的颜色,但是当把这些代码贴到blog里面之后,颜色都没有了,只剩下黑色字体的干巴巴的代码:(

         在前一个删除注释程序的基础上,作了一些修改,就成了现在这个可以给你的代码添加颜色的程序。注释就不写了,和上一个差不多,就是多了一些正则表达式的使用,用了一下也还行,那就这样吧。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> Delete comment </TITLE>
    <META NAME="Author" CONTENT="zc-peng">
    </HEAD>
    
    <BODY>
    <textarea style="height:300;width:500" name="t1" onpropertychange=""></textarea>
    <textarea style="height:300;width:500" name="t3"></textarea>
    <input type="button" value="test" onclick="addColor()">
    <DIV id="divedit" style="BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; SCROLLBAR-FACE-COLOR: #dda0dd; SCROLLBAR-HIGHLIGHT-COLOR: #c3d6da; OVERFLOW: scroll; BORDER-LEFT: black 2px solid; WIDTH: 100%; SCROLLBAR-SHADOW-COLOR: #3d5054; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #3d5054; SCROLLBAR-ARROW-COLOR: #e6e6fa; BORDER-BOTTOM: black 2px solid; SCROLLBAR-DARKSHADOW-COLOR: #85989c; HEIGHT: 380px; BACKGROUND-COLOR: #e6e6fa" align=left CONTENTEDITABLE="false"></div>
    </BODY>
    
    <script>
    
    function addColor(){     var t1_Content = document.all.t1.value;     t1_Content = t1_Content.replace(/&amp/g,"&ampamp");          for(var i=0;i<entity.length;i++){         var tem1 = entity[i].substr(0,1);         var tem2 = entity[i].substr(1);         var reg = new RegExp("&(" + tem2 + ")","g");         //#0000ff is keyword color         t1_Content = t1_Content.replace(reg,"&amp$1");     }     t1_Content = t1_Content.replace(/</g,"&lt;");     t1_Content = t1_Content.replace(/>/g,"&gt;");     t1_Content = "<br>" + t1_Content;     for(var i=0;i<keyword.length;i++){         var reg = new RegExp("([^a-zA-Z0-9_]+)(" + keyword[i] + ")([^a-zA-Z0-9_]+)","g");         //#0000ff is keyword color         t1_Content = t1_Content.replace(reg,"$1<font color='#0000ff'>$2</font>$3");              }     for(var i=0;i<htmlkeyword.length;i++){         var reg = new RegExp("([^a-zA-Z0-9_]+)(" + htmlkeyword[i] + ")([^a-zA-Z0-9_]+)","g");         //#0000ff is keyword color         t1_Content = t1_Content.replace(reg,"$1<font color='#ff0000'>$2</font>$3");     }     var result = "";     var flag = false;     var b = t1_Content.split("\r\n");//split row     //for per row     for(var i = 0;i<b.length;i++){         var perRow = b[i];         if(flag == true){             if(perRow.indexOf("*/") != -1){                 //delete comment                 //perRow = perRow.substr(perRow.indexOf("*/") + 2);                 //perRow = "<font color='#008040'>" + perRow.substr(0,perRow.indexOf("*/") + 2) + "</font>" + perRow.substr(perRow.indexOf("*/") + 2);                 perRow = addFontTag(perRow.substr(0,perRow.indexOf("*/") + 2),COMMENT_COLOR) + perRow.substr(perRow.indexOf("*/") + 2);                 flag = false;             }else{                 //perRow = "<font color='#008040'>" + perRow + "</font>";                 perRow = addFontTag(perRow,COMMENT_COLOR);                 result += perRow + "\r\n";                 continue;             }         }         if(perRow.indexOf("\"") == -1 && perRow.indexOf("/") == -1){             //neither " nor / exsit in perRow             //do nothing         }else{             //for per character             for(var j = 0;j<perRow.length;j++){                 var tempChar = perRow.substr(j,1);//per char                 if(tempChar == "\""){                     var tempCol = j+1;                     if(tempCol == perRow.length){                         break;//next row                     }else{                         for(var k = tempCol;k<perRow.length;k++){                             var nextChar = perRow.substr(k,1);                             if(nextChar == "\""){                                 if(perRow.substr(k-1,1) == "\\"){                                     if(perRow.substr(k-2,1) == "\\"){                                         //match "...\\"                                         perRow = perRow.substr(0,j) + addFontTag(perRow.substr(j,k-j+1),STRING_COLOR)+ perRow.substr(k + 1);                                         j = k + 22 + 7;//22:<font color='#990099'>.length ; 7:</font>.length                                         break;//next col                                     }else{                                         continue;                                     }                                 }else{                                     //match "..."                                     //perRow = perRow.substr(0,j) + "<font color='#990099'>" + perRow.substr(j,k-j+1) + "</font>" + perRow.substr(k + 1);                                     perRow = perRow.substr(0,j) + addFontTag(perRow.substr(j,k-j+1),STRING_COLOR)+ perRow.substr(k + 1);                                     j = k + 22 + 7;//22:<font color='#990099'>.length ; 7:</font>.length                                     break;//next col                                 }                             }                         }                     }                 }else if(tempChar == "/"){                     var tempCol = j+1;                     if(tempCol == perRow.length){                         break;//next row                     }else{                         if(perRow.substr(tempCol,1) == "/"){                             //delete comment                             //perRow = perRow.substr(0,j);                             //perRow = perRow.substr(0,j) + "<font color='#008040'>" + perRow.substr(j) + "</font>";                             if(j != 0){                                 if(perRow.substr(j - 1,1) == "\\"){                                     //regExp                                     //like : /\/*asdf*\//                                     continue;                                 }                             }                             perRow = perRow.substr(0,j) + addFontTag(perRow.substr(j),COMMENT_COLOR);                             break;//next row                         }else if(perRow.substr(tempCol,1) == "*"){                             if(j != 0){                                 if(perRow.substr(j - 1,1) == "\\"){                                     //regExp                                     //like : /\/*asdf*\//                                     continue;                                 }                             }                             flag = true;                             var temp = perRow.substr(j + 2);                             if(temp.indexOf("*/") != -1){                                 //delete comment                                 //perRow = perRow.substr(0,j) + temp.substr(temp.indexOf("*/") + 2);                                 //perRow = perRow.substr(0,j) + "<font color='#008040'>" + temp.substr(0,temp.indexOf("*/")) + "</font>" + temp.substr(temp.indexOf("*/") + 2);                                 //alert(temp);                                 perRow = perRow.substr(0,j) + addFontTag("/*" + temp.substr(0,temp.indexOf("*/") + 2),COMMENT_COLOR) + temp.substr(temp.indexOf("*/") + 2);                                 flag = false;                                 j--;//important                                 j = j + 22 + 7;//22:<font color='#990099'>.length ; 7:</font>.length                             }else{                                 //delete comment                                 //perRow = perRow.substr(0,j);                                 //perRow = perRow.substr(0,j) + "<font color='#008040'>" + perRow.substr(j) + "</font>"                                 perRow = perRow.substr(0,j) + addFontTag(perRow.substr(j),COMMENT_COLOR);                                 break;//next row                             }                         }else{                             continue;                         }                     }                 }             }         }                  result += perRow + "\r\n";     }     result = result.replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;");     document.all.divedit.innerHTML = "<pre>" + result + "</pre>";     document.all.t3.value = result; } /** constant **/ var COMMENT_COLOR = "'#008040'"; var STRING_COLOR = "'#990099'"; var KEYWORD_COLOR = "'#0000ff'" /***/ function addFontTag(str,type){     var reg = /<font.*>(.*)<\/font>/g;     str = str.replace(reg,"$1");     //alert(str);     return "<font color=" + type + ">" + str + "</font>"; } var keyword = new Array( "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "delete", "do", "double", "else", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "while", "with"); var htmlkeyword = new Array( "document", "Array" ); var entity = new Array( "&lt;", "&gt;", "&amp;", "&nbsp;" ); </script> </HTML>

    关于注释删除程序的补充

    因为没有学过算法,凭自己想象去写,也不知道好不好,凑合用吧。
    谈一下自己的理解。
    单行注释://... 或 /*...*/
    多行注释:/*...
                    ...
                  */
    如果这些字符在字符串里面,就不是注释了;
    如果字符串在注释里面,就不是字符串了;
    还有js的正则表达式的特殊语法的捣乱;
    还有转义字符\(反斜杠)的搞鬼;
    所以,挺麻烦的。
    反正是写完了,注释也写了不少,怕自己忘了,用了下还算比较好使,就这样吧。
    December 13

    JS:去掉Java代码中的注释(也适用于JS和C#)

    用JS写的,用网页作为载体。
    欢迎有心人测试一下。
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> Delete comment </TITLE>
    <META NAME="Author" CONTENT="zc-peng">
    </HEAD>
    
    <BODY>
    <textarea style="height:300;width:500" name="t1" onpropertychange="deleteComment()"></textarea>
    <textarea style="height:300;width:500" name="t2"></textarea>
    </BODY>
    <script>
    
    function deleteComment(){     var t1_Content = document.all.t1.value;     //输出变量     var result = "";     //全局标志,用于处理多行注释     var flag = false;     //按行劈开,b是字符串数组     var b = t1_Content.split("\r\n");     //for per row     //对于每一行     for(var i = 0;i<b.length;i++){         var perRow = b[i];//当前行的字符串         //如果是多行注释         if(flag == true){             //判断是否存在多行注释的结束符             if(perRow.indexOf("*/") != -1){                         //exist "*/"                 //delete comment                 //取*/后面的字符                 perRow = perRow.substr(perRow.indexOf("*/") + 2);                 //把多行注释标志复位,下次用                 flag = false;                 //流程继续往下走,因为这一行剩下的字符串可能还有注释             }else{                 //不存在,表明当前行仍然是多行注释的一部分,继续检查下一行                 //而且不把此行累加到输出变量中                 continue;//流程不往下走             }         }         //对于每一行,判断是否存在双引号"或者注释起始符/         if(perRow.indexOf("\"") == -1 && perRow.indexOf("/") == -1){             //neither " nor / exsit in perRow             //do nothing             //两者都不存在,什么也不用做,检查下一行         }else if(perRow.indexOf("\"") != -1 && perRow.indexOf("/") == -1){             //only " exist in perRow             //do nothing             //只存在双引号,也是什么都不用做,检查下一行             //以上两个判断可以简化成一个         }else{             //如果存在"或者/,或者两者都存在             //在每一行中,对每一个字符进行判断             //for per character             for(var j = 0;j<perRow.length;j++){                 //取出每一个字符                 var tempChar = perRow.substr(j,1);//per char                 //如果是"的话,必须进行下一个"的匹配                 if(tempChar == "\""){                     //算出下一个字符的位置(index)                     var tempCol = j+1;                     if(tempCol == perRow.length){                         //如果没有下一个字符,则检查下一行                         //觉得不要这个判断也可以,因为需要处理的代码都是编译正确的代码,                         //不会出现这种情况的                         //结束当前行处理,进行结果累加                         break;//next row                     }else{                         //如果有下一个字符,循环判断                         for(var k = tempCol;k<perRow.length;k++){                             //取出下一个字符                             var nextChar = perRow.substr(k,1);                             //如果是"的话,还得判断它的前一个字符是否是转义字符\                             if(nextChar == "\""){                                 //取出它的前一个字符                                 var temp = perRow.substr(k-1,1);                                 //如果是转义字符的话                                 if(temp == "\\"){                                     //继续检查下一个字符                                     continue;                                 }else{                                     //match "..."                                     //如果不是\,则匹配上一对"                                     j = k;                                     //跳出字符串双引号的匹配循环,进行下一个字符的检查                                     break;//next col                                 }                             }                         }                     }                 }else if(tempChar == "/"){                     //如果是注释起始符的话,                     //算出下一个字符的位置                     var tempCol = j+1;                     if(tempCol == perRow.length){                         //如果没有下一个字符,则结束当前行处理,进行结果累加                         break;//next row                     }else{                         //如果下一个字符是/的话,还得判断前面那个字符是不是转移字符,                         //这样做的目的是避免js中的正则表达式                         if(perRow.substr(tempCol,1) == "/"){                             //判断是不是第一个字符                             if(j != 0){                                 //不是第一个的话,看它前面的字符是否是\                                 if(perRow.substr(j - 1,1) == "\\"){                                     //regExp                                     //like : /\/*asdf*\//                                     //如果是的话,则表明这是一个正则表达式,不是注释,                                     //则对此行的下一个字符进行检查                                     continue;                                 }                             }                             //如果当前字符是/,它的下一个字符也是/,它的前一个字符不是\,则表明这是一个单行注释                             //则取这个字符的前面的字符串作为删掉注释后的结果,累加到输出变量                             //delete comment                             perRow = perRow.substr(0,j);                             //跳出,结束当前行处理,进行结果累加                             break;//next row                         }else if(perRow.substr(tempCol,1) == "*"){                             //也是为了避免js的正则表达式                             if(j != 0){                                 if(perRow.substr(j - 1,1) == "\\"){                                     //regExp                                     //like : /\/*asdf*\//                                     continue;                                 }                             }                             //如果当前字符是/,它的下一个字符是*,它的前一个字符不是\,则表明这是一个/*形式的注释                             //把多行注释标志置成true                             flag = true;                             //把此行剩下的字符串取出                             var temp = perRow.substr(j + 2);                             //看看剩下的字符串里面有没有*/                             if(temp.indexOf("*/") != -1){                                 //delete comment                                 //如果有的话,则把/*...*/这样的注释删掉                                 perRow = perRow.substr(0,j) + temp.substr(temp.indexOf("*/") + 2);                                 //把标志复位,表明删除完毕                                 flag = false;                                 //因为删掉注释以后,j已经指向下一个字符,而这个逻辑处理完毕之后,                                 //会执行for(每一行)的循环的j++,这样就会跳过一个字符,                                 //所以需要先j--                                 j--;//important                             }else{                                 //delete comment                                 //如果在此行剩下的字符串没有发现*/,则表明这是一个多行注释                                 //删掉剩下的字符串(取出前面的字符串作为结果)                                 perRow = perRow.substr(0,j);                                 //结束当前行处理,结果累加                                 break;//next row                             }                         }else{                             //下一个字符既不是/也不是*,                             //那么,这不是一个注释起始符,进行下一个字符的检查                             continue;                         }                     }                 }             }                 }                  //进行下一行之前,把结果累加到输出变量         result += perRow + "\r\n";     }     document.all.t2.value = result; } </script> </HTML>
    December 12

    Java:校验日期,以后用

    import java.util.Calendar;
    import java.util.Date;
    
    /**
     * ********************************************************************
     * クラス名             : PzcDate
     * 作成者             : zc-peng
     * 作成日             : 2005/12/12
    *********************************************************************
     */
    public class PzcDate{    
        
        public static void main(String[] args){
            try {
                checkDateUseCalendar(2005,2,1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            try {
                checkDateUseDate(2005,2,11);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static void checkDateUseCalendar(int year,int month,int date) throws Exception{
            
            System.out.println("------start checkDateUseCalendar-------");
            
            //method 1 : use Calendar
            Calendar ca = Calendar.getInstance();
            
            //year : not like java.util.Date, no need to +1900
            //month : the same as java.util.Date, need to -1, value are 0~11
            //initialize : set the date to 1(must check date)
            ca.set(year,month - 1,1);
            
            if(year < 1900){
                //before 1900, no use
                throw new Exception("year error : Before 1900, no use." + " Current year is " + year);
            }else if(month < 1 || month > 12){
                //because input month value are 1~12
                throw new Exception("month error : Input month value are 1~12." + " Current month is " + month);
            }else{
                //get days of the specific month
                int day_of_month = ca.getActualMaximum(Calendar.DAY_OF_MONTH);
                if(date < 1){
                    throw new Exception("date error : Date value are > 0." + " Current date is " + date);
                }
                
                if(date > day_of_month){
                    throw new Exception("date error : date > day_of_month." + " Current date is " + date + ", the max date of " + year + "/" + month + " is " + day_of_month);
                }
                
                //if check successfully, set the date
                ca.set(Calendar.DATE,date);
            }
    
            System.out.println(ca);
            System.out.println(ca.get(Calendar.YEAR));
            System.out.println(ca.get(Calendar.MONTH) + "(0~11)");//attention : 0~11
            System.out.println(ca.get(Calendar.DATE));
            
            System.out.println("------end checkDateUseCalendar-------");
        }
        
        public static void checkDateUseDate(int year,int month,int date) throws Exception{
            
            System.out.println("------start checkDateUseDate-------");
            
            //method 2 : use Date
        
            //year : need to +1900
            //month : the same as java.util.Date, need to -1, value are 0~11
        
            if(year < 1900){
                //before 1900, no use
                throw new Exception("year error : Before 1900, no use." + " Current year is " + year);
            }else if(month < 1 || month > 12){
                //because input month value are 1~12
                throw new Exception("month error : Input month value are 1~12." + " Current month is " + month);
            }else{
                //get days of the specific month
                //input month : 1~12
                //because the constructor of java.util.Date need the month value(0~11),
                //month - 1 : current month
                //month : next month
                //new Date(year - 1900,month,0) : the last date of current year and mont
                Date temp = new Date(year - 1900,month,0);
                int day_of_month = temp.getDate();
                if(date < 1){
                    throw new Exception("date error : Date value are > 0." + " Current date is " + date);
                }
            
                if(date > day_of_month){
                    throw new Exception("date error : date > day_of_month." + " Current date is " + date + ", the max date of " + year + "/" + month + " is " + day_of_month);
                }
            
            }
            
            Date specificDate = new Date(year - 1900,month - 1,date);
            System.out.println(specificDate);
            System.out.println(specificDate.getYear() + "(-1900)");//attention : -1900
            System.out.println(specificDate.getMonth() + "(0~11)");//attention : 0~11
            System.out.println(specificDate.getDate());
    
            System.out.println("------end checkDateUseDate-------");
        }    
    }
    

    缺少DLL,上哪里找?

    缺少DLL哪里找
      如果你的系统中缺少了DLL文件,而上面提到的各种运行库也未能收录,那就得自己动手查找DLL文件了。记录下缺少的DLL的文件名,再从别的电脑、Windows的安装光盘中查找并拷贝到自己的电脑中。另外,最快捷有效的方法就是通过Internet搜索下载。
      到http://www.snapfiles.com/help/missingfiles.htmlhttp://support.microsoft.comhttp://www.dll-files.com/中输入完整文件名,再将查找到的文件下载、复制到系统的system32中即可。
     
    -----以上的话引用一篇文章:必备文件 一个不少
    更有有心人给这些文件打了一个包:《系统必备文件》,文章里面提供有下载地址。
    不错。

    备注:VC运行库,VB6运行库,JRE,Java虚拟机,.NET Framework安装文件,Windows Installer(Windows 2000/XP),USB万能驱动,MyMPC.rar等。
    December 09

    关于Java的GUI编程工具

    今天发现一个写GUI的工具,叫“SWT Designer”,网上对它评价不错,可惜收费,残念。后来又发现有注册机(注册机的帖子注册机下载地址),按照帖子的方法注册,果然好使,好。这个注册机对应的“SWT ...”版本是“SWT Designer v4.0.0”,是for Eclipse2.1的。
    注册机的用法:这个注册机只要输入任意的英文字符,加上你的网卡MAC地址(通过Ipconfig /all来查看),就可以生成注册文件,将其拷贝至你的用户目录(C:\Documents and Settings\你的用户名\)底下就OK了。注册机是个jar文件,用命令行java -jar keygeno.jar运行,按照图片上的操作就行了。

    Tomcat学习

    Tomcat\conf里面的server.xml和web.xml有好多值得学习的标记,注释很详细,有空研究研究。
    October 18

    一些关于web应用...

    web.xml :
    <?xml version="1.0"?>
    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "
    http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    </web-app>
     
    Tomcat4.1中发布应用:
    %tomcat_home%\conf\server.xml :
      <Context path="/ajax" docBase="C:\TestAJAX" debug="0" reload="true"/>
     
    Tomcat5.0中发布应用:
    1. %tomcat_home%\conf\Catalina\localhost下新建一个文件(如test.xml) :
    <?xml version='1.0' encoding='utf-8'?>
    <Context docBase="c:\testAJAX" path="/x" reload="true">
    </Context>
    2. 跟在Tomcat4.1中发布的做法一样。