??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩免费高清视频,精品99re,久久精品男人天堂http://www.aygfsteel.com/wyxdeniro/archive/2007/12/25/170225.html王永?/dc:creator>王永?/author>Tue, 25 Dec 2007 01:41:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/25/170225.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/170225.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/25/170225.html#Feedback1http://www.aygfsteel.com/wyxdeniro/comments/commentRss/170225.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/170225.html     可以把用实C某一接口的类创徏的对象的引用赋给该接口声明的接口变量Q那么该接口变量可以调用被cd现的接口的方法。实际上Q当接口变量调用被类实现的接口中的方法时Q就是通知相应的对象调用接口的ҎQ这一q程UCؓ对象功能的接口回调?br /> (2)、向上{型:
    1>如果a是类A的一个引用,那么Qa可以指向cA的一个实例,或者说指向cA的一个子c,q是向上转型的情形?br />     2>如果a是类A的一个引用,那么Qa必须指向实现了接口A的一个类的实例。这是接口回调的情Ş。在java里面Q向上{型是自动q行的,但是向下转型却不是,需要我们自己定义强制进行?br />         从实C某接口的对象Q得到对此接口的引用Q与向上转型个对象的基类Q实质上效果是一L。这些对象都可以调用基类型提供的ҎQ对于接口来说就是回调接口中的方法,对于父类来说是调用父类的方法。当然在向上转型的情况下Q还牉|到子c重写父cL法的情Ş?

]]>
java结http://www.aygfsteel.com/wyxdeniro/archive/2007/12/14/167797.html王永?/dc:creator>王永?/author>Fri, 14 Dec 2007 08:05:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/14/167797.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/167797.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/14/167797.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/167797.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/167797.html常用问题

Q?/span>1Q?/span>java.lang.String split

String value = "a,b,c,d,e";

String[] names = value.split(",");

for(int i=0,n=names.length;i

System.out.print(names[i]);

}

public String[] split(String regex)其中的参敎ͼ表示正则表达式?/span>

Q?Q、设|页面不~存信息Q在qo器中讄Q?/span>

httpResponse.setHeader("Cache-Control", "no-cache");

       httpResponse.setHeader("Cache-Control", "no-store");

       httpResponse.setDateHeader("Expires", 0);

package com.wyq.WebFilter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

public class ContextFilter implements Filter{
    
private String onErrorUrl;
    
private FilterConfig filterConfig;
    
public void destroy() {
        
// TODO Auto-generated method stub
        
    }


    
public void doFilter(ServletRequest request, ServletResponse response, FilterChain doFilter) throws IOException, ServletException {
        HttpServletRequest httpRequest
=(HttpServletRequest)request;
        HttpServletResponse httpResponse
=(HttpServletResponse)response;
        HttpSession httpSession
=httpRequest.getSession();
        httpResponse.setHeader(
"Cache-Control""no-cache");
        httpResponse.setHeader(
"Cache-Control""no-store");
        httpResponse.setDateHeader(
"Expires"0);
        
        
if(httpSession.getAttribute("epAccountInfo")==null){
            ActionErrors errors
=new ActionErrors();
            errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("没有登陆"));
            httpRequest.setAttribute(Globals.ERROR_KEY,errors);
            httpRequest.getRequestDispatcher(onErrorUrl).forward(httpRequest, httpResponse);
        }
else{
            doFilter.doFilter(request, response);
        }

        
    }


    
public void init(FilterConfig config) throws ServletException {
        filterConfig
=config;
        onErrorUrl
=filterConfig.getInitParameter("onError");
        
if(onErrorUrl==null||"".equals(onErrorUrl)){
            onErrorUrl
="onError";
        }

    }

    
}


(3)select * from TH_INT_ORG a where PAR_INT_ORG_ID is null 判断某个字段为空的纪录,要用is null

]]>
javaE序员面试必备的32个要?--转中国it实验?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/10/166668.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Mon, 10 Dec 2007 06:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/10/166668.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/166668.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/10/166668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/166668.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/166668.html</trackback:ping><description><![CDATA[<p><strong>W一Q谈谈final, finally, finalize的区别?br /> </strong><br />  final 用于声明属性,Ҏ和类Q分别表C属性不可变Q方法不可覆盖,cM可ѝfinally是异常处理语句结构的一部分Q表CL执行。finalize?Objectcȝ一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回Ӟ例如关闭文g{?/p> <p><strong>W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?</strong> <br /> <br />  可以l承其他cL完成其他接口Q在swing~程中常用此方式。 </p> <p><strong>W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?br /> </strong><br />  Static Nested Class是被声明为静态(staticQ的内部c,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部cd例化后才能实例化。  </p> <p><strong>W四Q?amp;?amp;&的区别?br /> </strong><br />   &是位q算W,表示按位与运,&&是逻辑q算W,表示逻辑与(andQ?  </p> <p><strong>W五QHashMap和Hashtable的区别?br /> <br /> </strong> HashMap是Hashtable的轻量实现Q非U程<a class="channel_keylink" target="_blank">安全</a>的实玎ͼQ他们都完成了Map接口Q主要区别在于HashMap允许I(nullQ键|keyQ?׃非线E?a class="channel_keylink" target="_blank">安全</a>Q效率上可能高于Hashtable.  </p> <p><strong>W六QCollection ?Collections的区别?br />  </strong> <br />  Collection是集合类的上U接口,l承与他的接口主要有Set 和List.Collections是针寚w合类的一个帮助类Q他提供一pd静态方法实现对各种集合的搜索、排序、线E安全化{操作。  </p> <p><strong>W七Q什么时候用assert?br /> <br /> </strong> 1.4新增关键字(语法Q,用于试boolean表达式状态,可用于调试程序。用方?assert <boolean>Q表C如果表辑ּ为真QtrueQ?则下面的语句执行Q否则抛出AssertionError。另外的使用方式assert < boolean表达?gt;:<other>Q表C如果表辑ּ为真Q后面的表达式忽略,否则后面表达式的值用于AssertionError的构建参数。注意编译时要增?source 1.4 参数Q否则报错。]q行时要增加 –ea参数Q否则assert行被忽略  </other></boolean></p> <p><strong>W八QGC是什? Z么要有GC? <br />  </strong> <br />  GC是垃圾收集的意思(Gabage CollectionQ?内存处理是编Eh员容易出现问题的地方Q忘记或者错误的内存回收会导致程序或pȝ的不E_甚至崩溃Q?a class="channel_keylink" target="_blank">Java</a>提供的GC功能可以 自动监测对象是否过作用域从而达到自动回收内存的目的Q?a class="channel_keylink" target="_blank">Java</a>语言没有提供释放已分配内存的昄操作Ҏ?  </p> <p><strong>W九QString s = new String("xyz");创徏了几个String Object?<br /> </strong><br />  两个  </p> <p><strong>W十QMath.round(11.5){於多少? Math.round(-11.5){於多少? <br /> <br /> </strong> Math.round(11.5)==12Math.round(-11.5)==-11roundҎq回与参数最接近的长整数Q参数加1/2后求其floor.  </p> <p><strong>W十一Qshort s1 = 1; s1 = s1 + 1;有什么错?</strong> <strong>short s1 = 1; s1 += 1;有什么错?</strong></p> <p> short s1 = 1; s1 = s1 + 1; Qs1+1q算l果是int型,需要强制{换类型)short s1 = 1; s1 += 1;Q可以正编译)  </p> <p><strong>W十二,sleep() ?wait() 有什么区?</strong> <br /> <br />  sleep是线E类QThreadQ的ҎQ导致此U程暂停执行指定旉Q给执行Zl其他线E,但是监控状态依然保持,到时后会自动恢复。调?sleep不会释放对象锁。wait是ObjectcȝҎQ对此对象调用waitҎD本线E放弃对象锁Q进入等待此对象的等待锁定池Q只有针Ҏ?象发出notifyҎQ或notifyAllQ后本线E才q入对象锁定池准备获得对象锁q入q行状态。  </p> <p><strong>W十三,Java有没有goto?</strong> <br /> <br />  没有  很十三的问题Q如果哪个面试的问到q个问题Q我劝你q是别进q家公司?/p> <p><strong>W十四,数组有没有length()q个Ҏ? String有没有length()q个ҎQ?br /> <br /> </strong> 数组没有length()q个ҎQ有length的属性?br />  String有有length()q个Ҏ?/p> <p><strong>W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?<br /> </strong><br />  Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ 重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方 法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?/p> <strong>W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?<br /> </strong><br />  Set里的元素是不能重复的Q那么用iterator()Ҏ来区分重复与否。equals()是判M个Set是否相等?br /> equals()?=Ҏ军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?br /> <p><strong>W十八,error和exception有什么区?<br /> </strong><br />  error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?br />  exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?/p> <p><strong>W十九,List, Set, Map是否l承自Collection接口?<br /> </strong><br /> ListQSet?br /> Map不是</p> <p><strong>W二十,abstract class和interface有什么区?<br /> </strong><br />  声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?br /> <br />  接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一?有程序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ?然后Q它可以在实C该接口的cȝM对象上调用接口的Ҏ。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到 接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?/p> <p><strong>W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?<br /> <br /> </strong>都不?/p> <p><strong>W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?<br /> <br /> </strong> 接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?/p> <p><strong>W二十三Q启动一个线E是用run()q是start()?<br /> </strong><br />  启动一个线E是调用start()ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ可以产生必须退出的标志来停止一个线E?/p> <p><strong>W二十四Q构造器Constructor是否可被override?<br /> </strong><br />  构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?/p> <p><strong>W二十五Q是否可以承Stringc?<br /> </strong><br />  StringcLfinalcL不可以ѝ?/p> <p><strong>W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?<br /> <br /> </strong> 不能Q一个对象的一个synchronizedҎ只能׃个线E访问?/p> <p><strong>W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?<br /> </strong><br /> 会执行,在return前执行?/p> <p><strong>W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?<br /> </strong><br /> 有C背景的程序员特别喜欢问这U问题?br /> 2 << 3</p> <p><strong>W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?<br /> </strong><br /> 不对Q有相同的hash code?/p> <p><strong>W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?</strong> <br /> <br />  是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?/p> <p><strong>W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?<br /> </strong><br />  switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte。long,string 都不能作用于swtich?/p> <p><strong>W三十二Q编E题: 写一个Singleton出来?br /> </strong><br />      Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?br /> 一般Singleton模式通常有几U种形式:<br /> <br />  W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引?l而调用其中的Ҏ?/p> <p> <table style="border-top-style: dotted; border-right-style: dotted; border-left-style: dotted; border-bottom-style: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt=""> <tbody> <tr> <td>public class Singleton {<br />   private Singleton(){}<br />   //在自己内部定义自׃个实例,是不是很奇怪?<br />   //注意q是private 只供内部调用<br />   private static Singleton instance = new Singleton();<br />   //q里提供了一个供外部讉K本class的静态方法,可以直接讉K  <br />   public static Singleton getInstance() {<br />     return instance;   <br />    } <br /> }  </td> </tr> </tbody> </table> </p> <p><br /> W二UŞ? </p> <p> <table style="border-top-style: dotted; border-right-style: dotted; border-left-style: dotted; border-bottom-style: dotted" bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt=""> <tbody> <tr> <td>public class Singleton { <br />   private static Singleton instance = null;<br />   public static synchronized Singleton getInstance() {<br />   //q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ     <br />   //使用时生成实例,提高了效率!<br />   if (instance==null)<br />     instanceQnew Singleton();<br /> return instance;   } <br /> } </td> </tr> </tbody> </table> <br />  <br /> 其他形式:<br /> 定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?br /> 一般认为第一UŞ式要更加安全?<br /> </p> <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/166668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-12-10 14:58 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/12/10/166668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线E编E(3Q?--转mldnhttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166032.html王永?/dc:creator>王永?/author>Fri, 07 Dec 2007 06:31:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166032.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/166032.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166032.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/166032.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/166032.html        一、run()和start() 
        q两个方法应该都比较熟悉Q把需要ƈ行处理的代码攑֜run()Ҏ中,start()Ҏ启动U程自动调?run()ҎQ这是由Java的内存机制规定的。ƈ且run()Ҏ必须是public讉K权限Q返回值类型ؓvoid?br />         二、关键字Synchronized 
        q个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志Q当一个线E访问该对象Ӟ被Synchronized修饰的数据将?#8220;上锁”Q阻止其他线E访问。当前线E访问完q部分数据后释放锁标志,其他U程可以访问了?br />         三、sleep() 
        使当前线E?卌用该Ҏ的线E?暂停执行一D|_让其他线E有Zl箋执行Q但它ƈ不释攑֯象锁。也是如果有Synchronized同步块,其他U程仍然不同讉K׃n数据?br />         四、join()
join()Ҏ使调用该Ҏ的线E在此之前执行完毕,也就是等待调用该Ҏ的线E执行完毕后再往下l执行。注意该Ҏ也要捕获异常?br />         五、yield() 
        它与sleep()cMQ只是不能由用户指定暂停多长旉Qƈ且yield()Ҏ只能让同优先U的U程有执行的Z?

        六、wait()和notify()、notifyAll() 
        q三个方法用于协调多个线E对׃n数据的存取,所以必dSynchronized语句块内使用q三个方法。前面说qSynchronizedq个关键字用于保护共享数据,L其他U程对共享数据的存取。但是这L序的程很不灵zMQ如何才能在当前U程q没退出Synchronized数据块时让其他线E也有机会访问共享数据呢Q此时就用这三个Ҏ来灵zL制?

wait()Ҏ使当前线E暂停执行ƈ释放对象锁标志,让其他线E可以进入Synchronized数据块,当前U程被放入对象等待池中。当调用 notify()Ҏ后,从对象的等待池中移C个Q意的U程q放到锁标志{待池中Q只有锁标志{待池中的线E能够获取锁标志Q如果锁标志{待池中没有U程Q则notify()不v作用?

notifyAll()则从对象{待池中U走所有等待那个对象的U程q放到锁标志{待池中?/p>

]]>
多线E编E(2Q?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166027.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Fri, 07 Dec 2007 06:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166027.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/166027.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/166027.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/166027.html</trackback:ping><description><![CDATA[        [U程的ƈ发与q行] <p><font face="Times New Roman">  在单CPUpȝ中,pȝ调度在某一时刻只能让一个线E运行,虽然q种调试机制有多UŞ?大多数是旉片轮巡ؓ?Q但无论如何Q要通过不断切换需要运行的U程让其q行的方式就叫ƈ?concurrent)。而在多CPUpȝ中,可以让两个以上的U程同时q行Q这U可以同时让两个以上U程同时q行的方式叫做ƈ?parallel)?br />         [JAVAU程对象] </p> <p><font face="Times New Roman">        在JAVA中,要开始一个线E,有两U方式。一是直接调用Thread实例的start()ҎQ二?/font><font face="Times New Roman">Runable实例传给一个Thread实例然后调用它的start()Ҏ。线E对象和U程是两个完全不同的概念。这里我们再ơ深入一下,生成一个线E的实例Qƈ不代表启动了U程。而启动线E是说在某个U程对象上启动了该实例对应的U程Q当该线E结束后Qƈ不会qx失?br />         在线E对象a上调用join()ҎQ就是让当前正在执行的线E等待线E对象a对应的线E运行完成后才l运行?br />         Q?Q、通过Thread实例的start()Q一个Thread的实例只能生一个线E,不同实例的多个线E?br />         Q?Q、Runnable的实例是可运行的Q但它自己ƈ不能直接q行Q它需要被Thread对象来包装才行运?同一实例(Runnable实例)的多个线E?/font></p> </font> <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/166027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-12-07 14:21 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java动态代理实现AOP学习Q?Q?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166008.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Fri, 07 Dec 2007 04:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166008.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/166008.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166008.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/166008.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/166008.html</trackback:ping><description><![CDATA[    AOP主要应用于日志记录,性能l计Q安全控?事务处理{方面。它的主要意囑ְ要将日志记录Q性能l计Q安全控制等{代码从商业逻辑代码中清楚的划分出来Q我们可以把q些行ؓ一个一个单独看作系l所要解决的问题Q就是所谓的面向问题的编E?不知AOP译作面向问题的编E是否欠?。通过对这些行为的分离Q我们希望可以将它们独立地配|到商业Ҏ中,而要改变q些行ؓ也不需要媄响到商业Ҏ代码?br />     Q?Q、创建接口,指明要实现的功能Q?br />      <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com.wyq.dynamic.proxy;<br /> <img id="Codehighlighter1_66_119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_119_Open_Text.style.display='none'; Codehighlighter1_66_119_Closed_Image.style.display='inline'; Codehighlighter1_66_119_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_66_119_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_119_Closed_Text.style.display='none'; Codehighlighter1_66_119_Open_Image.style.display='inline'; Codehighlighter1_66_119_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> BusinessInterface </span><span id="Codehighlighter1_66_119_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_66_119_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #008000">//</span><span style="color: #008000">定义实现c要实现的具体的Ҏ</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> processBusiness(); <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>     Q?Q、创建InvocationHandler的实现类Q在invoke中指明被代理的具体动?br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_154_Open_Text.style.display='none'; Codehighlighter1_0_154_Closed_Image.style.display='inline'; Codehighlighter1_0_154_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_0_154_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_154_Closed_Text.style.display='none'; Codehighlighter1_0_154_Open_Image.style.display='inline'; Codehighlighter1_0_154_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /><span id="Codehighlighter1_0_154_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_0_154_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * Created on 2005-12-7<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> *<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * TODO To change the template for this generated file go to<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * Window - Preferences - Java - Code Style - Code Templates<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /> </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">package</span><span style="color: #000000"> com.wyq.dynamic.proxy;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.InvocationHandler;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.Method;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img id="Codehighlighter1_266_287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_266_287_Open_Text.style.display='none'; Codehighlighter1_266_287_Closed_Image.style.display='inline'; Codehighlighter1_266_287_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_266_287_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_266_287_Closed_Text.style.display='none'; Codehighlighter1_266_287_Open_Image.style.display='inline'; Codehighlighter1_266_287_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span id="Codehighlighter1_266_287_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/** */</span><span id="Codehighlighter1_266_287_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * </span><span style="color: #808080">@author</span><span style="color: #008000"> wyq<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /> </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_289_433_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_433_Open_Text.style.display='none'; Codehighlighter1_289_433_Closed_Image.style.display='inline'; Codehighlighter1_289_433_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_289_433_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_289_433_Closed_Text.style.display='none'; Codehighlighter1_289_433_Open_Image.style.display='inline'; Codehighlighter1_289_433_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span id="Codehighlighter1_289_433_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_289_433_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">E序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器Q?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * 然后通过java.lang.reflect.Proxy得到一个代理对象,通过q个代理对象来执行商业方?<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /> * 在商业方法被调用的同Ӟ执行处理器会被自动调?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /> * </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_488_872_Open_Image" onclick="this.style.display='none'; Codehighlighter1_488_872_Open_Text.style.display='none'; Codehighlighter1_488_872_Closed_Image.style.display='inline'; Codehighlighter1_488_872_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_488_872_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_488_872_Closed_Text.style.display='none'; Codehighlighter1_488_872_Open_Image.style.display='inline'; Codehighlighter1_488_872_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> LogHandler </span><span style="color: #0000ff">implements</span><span style="color: #000000">  InvocationHandler</span><span id="Codehighlighter1_488_872_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_488_872_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> Object delegate;<br /> <img id="Codehighlighter1_551_580_Open_Image" onclick="this.style.display='none'; Codehighlighter1_551_580_Open_Text.style.display='none'; Codehighlighter1_551_580_Closed_Image.style.display='inline'; Codehighlighter1_551_580_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_551_580_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_551_580_Closed_Text.style.display='none'; Codehighlighter1_551_580_Open_Image.style.display='inline'; Codehighlighter1_551_580_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> LogHandler(Object delegate)</span><span id="Codehighlighter1_551_580_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_551_580_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">this</span><span style="color: #000000">.delegate</span><span style="color: #000000">=</span><span style="color: #000000">delegate;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object invoke(Object proxy, Method method, Object[] args)<br /> <img id="Codehighlighter1_668_870_Open_Image" onclick="this.style.display='none'; Codehighlighter1_668_870_Open_Text.style.display='none'; Codehighlighter1_668_870_Closed_Image.style.display='inline'; Codehighlighter1_668_870_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_668_870_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_668_870_Closed_Text.style.display='none'; Codehighlighter1_668_870_Open_Image.style.display='inline'; Codehighlighter1_668_870_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Throwable </span><span id="Codehighlighter1_668_870_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_668_870_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        Object o</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /> <img id="Codehighlighter1_693_798_Open_Image" onclick="this.style.display='none'; Codehighlighter1_693_798_Open_Text.style.display='none'; Codehighlighter1_693_798_Closed_Image.style.display='inline'; Codehighlighter1_693_798_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_693_798_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_693_798_Closed_Text.style.display='none'; Codehighlighter1_693_798_Open_Image.style.display='inline'; Codehighlighter1_693_798_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_693_798_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_693_798_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">AOP开始!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            o</span><span style="color: #000000">=</span><span style="color: #000000">method.invoke(delegate,args);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">AOPl束Q?/span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img id="Codehighlighter1_827_855_Open_Image" onclick="this.style.display='none'; Codehighlighter1_827_855_Open_Text.style.display='none'; Codehighlighter1_827_855_Closed_Image.style.display='inline'; Codehighlighter1_827_855_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_827_855_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_827_855_Closed_Text.style.display='none'; Codehighlighter1_827_855_Open_Image.style.display='inline'; Codehighlighter1_827_855_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (RuntimeException e) </span><span id="Codehighlighter1_827_855_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_827_855_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            e.printStackTrace();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> o;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <br />     Q?Q、实现第一ơ定义的接口<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com.wyq.dynamic.proxy;<br /> <img id="Codehighlighter1_88_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_157_Open_Text.style.display='none'; Codehighlighter1_88_157_Closed_Image.style.display='inline'; Codehighlighter1_88_157_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_88_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_88_157_Closed_Text.style.display='none'; Codehighlighter1_88_157_Open_Image.style.display='inline'; Codehighlighter1_88_157_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> BusinessObject </span><span style="color: #0000ff">implements</span><span style="color: #000000"> BusinessInterface </span><span id="Codehighlighter1_88_157_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_88_157_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_121_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_155_Open_Text.style.display='none'; Codehighlighter1_121_155_Closed_Image.style.display='inline'; Codehighlighter1_121_155_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_121_155_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_121_155_Closed_Text.style.display='none'; Codehighlighter1_121_155_Open_Image.style.display='inline'; Codehighlighter1_121_155_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> processBusiness() </span><span id="Codehighlighter1_121_155_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_121_155_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">开始事务!</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div>     Q?Q、调用处理器<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com.wyq.dynamic.proxy;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.InvocationHandler;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.reflect.Proxy;<br /> <img id="Codehighlighter1_134_608_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_608_Open_Text.style.display='none'; Codehighlighter1_134_608_Closed_Image.style.display='inline'; Codehighlighter1_134_608_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_134_608_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_134_608_Closed_Text.style.display='none'; Codehighlighter1_134_608_Open_Image.style.display='inline'; Codehighlighter1_134_608_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> BusinessMain </span><span id="Codehighlighter1_134_608_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_134_608_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img id="Codehighlighter1_177_606_Open_Image" onclick="this.style.display='none'; Codehighlighter1_177_606_Open_Text.style.display='none'; Codehighlighter1_177_606_Closed_Image.style.display='inline'; Codehighlighter1_177_606_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_177_606_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_177_606_Closed_Text.style.display='none'; Codehighlighter1_177_606_Open_Image.style.display='inline'; Codehighlighter1_177_606_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span id="Codehighlighter1_177_606_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_177_606_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">首先是实现接口BusinessInterface</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        BusinessInterface businessImp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BusinessObject();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">向InvocationHandler中添加要代理的实现类</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        InvocationHandler handler </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> LogHandler(businessImp); <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">通过proxycd实现cMhandler中的处理器绑?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        BusinessInterface proxy </span><span style="color: #000000">=</span><span style="color: #000000"> (BusinessInterface) Proxy.newProxyInstance( <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        businessImp.getClass().getClassLoader(), <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        businessImp.getClass().getInterfaces(), <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        handler); <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">调用处理器,触发事g</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        proxy.processBusiness(); <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/166008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-12-07 12:34 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/166008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中基本数据类型与的操作http://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/165988.html王永?/dc:creator>王永?/author>Fri, 07 Dec 2007 03:02:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/165988.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/165988.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/12/07/165988.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/165988.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/165988.html     说到Java的基本数据类型必谈到的两个cLDataInputStream和DataOutputStream。它们提供了对Java基本数据cd的操作,但是q些Ҏ事实上是在两个重要的接口中定义的DataInput和DataOutputQ它们的功能是把二q制的字节流转换成Java的基本数据类型,同时q提供了从数据中使用UTF-8~码构徏String的功能。有一个重要的cRandomAccessFile实现了DataInput和DataOutput两个接口使得他能够对文g同时q行写和ȝ操作?br />      在DataInputStream和DataOutputStream两个cM的方法都很简单,基本l构为readXXXX()和writeXXXX()其中XXXX代表基本数据cd或者String
    
package com.j2medev.mingjava;
import java.io.*;

public class TestDataIO
{
 
public static void main(String[] args) throws IOException
 
{
  Account account 
= new Account("mingjava","eric.zhan@263.net",25,true);
  System.out.println(
"before serialization");
  System.out.println(account.toString());
  ByteArrayOutputStream baos 
= new ByteArrayOutputStream();
  DataOutputStream dos 
= new DataOutputStream(baos); //数据通过输出存储到字节数组?/span>
  account.serialize(dos);
  DataInputStream dis 
= new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));//数据通过输入读到字节数l中

  Account sAccount 
= Account.deserialize(dis);
  System.out.println(
"after serialization.");
  System.out.println(sAccount.toString());
  dos.close();
  dis.close();
 }

}


package com.j2medev.mingjava;
import java.io.*;

public class Account
{
 
private String userName = "";
 
private String email = "";
 
private int age = 0;
 
private boolean gender = false;

 
public Account()
 
{}

 
public Account(String userName, String email, int age, boolean gender)
 
{
  
this.userName = userName;
  
this.email = email;
  
this.age = age;
  
this.gender = gender;
 }


 
public void serialize(DataOutputStream dos) throws IOException
 
{
  dos.writeUTF(userName);
  dos.writeUTF(email);
  dos.writeInt(age);
  dos.writeBoolean(gender);
 }


 
public static Account deserialize(DataInputStream dis) throws IOException
 
{
  Account account 
= new Account();
  account.userName 
= dis.readUTF();
  account.email 
= dis.readUTF();
  account.age 
= dis.readInt();
  account.gender 
= dis.readBoolean();
  
return account;
 }


 
public String toString()
 
{
  
return "UserName = " + userName + " Email = " + email + " age = " + age + " gender = " + (gender ? "male" : "female");
 }

}
 


]]>
JSP中的pageEncoding和contentType属?转赛q网l?http://www.aygfsteel.com/wyxdeniro/archive/2007/11/30/164228.html王永?/dc:creator>王永?/author>Fri, 30 Nov 2007 04:46:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/30/164228.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/164228.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/30/164228.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/164228.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/164228.html关于JSP面中的pageEncoding和contentType两种属性的区别Q?

pageEncoding是jsp文g本n的编?

contentType的charset是指服务器发送给客户端时的内容编?

JSP要经q两ơ的“~码”Q第一阶段会用pageEncodingQ第二阶D会用utf-8至utf-8Q第三阶D就是由Tomcat出来的网, 用的是contentType?

W一阶段是jsp~译?javaQ它会根据pageEncoding的设定读取jspQ结果是由指定的~码Ҏ译成统一的UTF-8 JAVA源码Q即.javaQ,如果pageEncoding讑֮错了Q或没有讑֮Q出来的是中文q?

W二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP~写时候用的是什么编码方案,l过q个阶段的结果全部是UTF-8的encoding的java源码?

JAVAC用UTF-8的encodingdjava源码Q编译成UTF-8 encoding的二q制码(?classQ,q是JVM对常数字串在二进制码Qjava encodingQ内表达的规范?

W三阶段是TomcatQ或其的application containerQ蝲入和执行阶段二的来的JAVA二进制码Q输出的l果Q也是在客L见到的,q时隐藏在阶D一和阶D二的参数contentType发挥了功效



]]>
java中的实现l承和面向接口编E?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/29/163981.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Thu, 29 Nov 2007 06:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/29/163981.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/163981.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/29/163981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163981.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/163981.html</trackback:ping><description><![CDATA[    l承分ؓ2U:接口l承和实现ѝ相对于接口l承Q实现承的问题要更多,他会带来更多的耦合。例子:我要实现一个Ac,Acdl承于Bc,现在又有了新的需求,需要实C个线E安全的Ac,我又定义了一个Ccȝ承于Aq覆盖了A中的部分代码?br />     因ؓAl承于B,A不得不对外暴露出B所有的publicҎQ即便其中的某些Ҏ对它可能是不需要的Q甚xp的是,可能其中的某些方法能改变A得状态,而A对这些改变ƈ不知情,q就会造成A得逻辑错误?br />     如果我要在B中添加新的方法,q个Ҏ有可能在逻辑上破坏它的派生类A,C。因此在基类dҎӞ必须查这些修Ҏ否会Ҏ生类产生影响?br />     关于何时采用l承Q一个重要的原则是确定方法是否能够共享。可以说是用接口q是抽象cȝ原则是,如果多个zcȝҎ内容没有共同的地方,q接口作ؓ抽象Q如果多个派生类的方法含有共同的地方Q就用抽象类作ؓ抽象?br />     面向接口~程Q实际上是面向抽象编E,抽象概念和具体实现盔RR这一原则使得我们拥有了更高层ơ的抽象模型Q在面对不断变更的需求时Q只要抽象模型做得好Q修改代码就要容易的多?br />     相比于承,OO中多态的概念要更重要。一个接口可以对应多个实现类Q对于声明ؓ接口cd的方法参数、类的字D,它们要比实现cL易于扩展、稳定,q也是多态的优点。假如我以实现类作ؓҎ参数定义了一个方法void doSomethingQArrayList listQ,但如果领导哪天觉?ArrayList不如LinkedList更好用,我将不得不将Ҏ重构为void doSomethingQLinkedList listQ,相应地要在所有调用此Ҏ的地方修改参数类型(很遗憑֜Q我q对象创Z是采用ArrayList list = new ArrayListQ)方式Q这大大增加我的修改工作量Q。如果领导又觉得用list<a class="channel_keylink" target="_blank">存储</a>数据不如set好的话,我将再一ơ重构方法,但这一ơ我变聪明了Q我方法定义ؓvoid doSomethingQSet setQ,创徏对象的方式改为Set set = new HashSetQ)。但q样仍不够,如果领导又要求将set改回list怎么办?所以我应该方法重构ؓvoid doSomethingQCollection collectionQ, Collection的抽象程度最高,更易于替换具体的实现cR即侉K要List或者Set固有的特性,我也可以做向下类型{换解决问题,管q样做ƈ不安全?br />     面向接口~程最重要的h值在于隐藏实玎ͼ抽象的实现l节装h而不对外开放,装q对?a class="channel_keylink" target="_blank">Java</a> EE 中的分层设计和框架设计尤光要。但即便在编E时使用了接口,我们也需要将接口和实现对应v来,q就引出如何创徏对象的问题。在创徏型设计模式中Q单例、工厂方法(模板ҎQ、抽象工厂等模式都是很好的解军_法。现在流行的控制反{Q也叫依赖注入)模式是以声明的方式将抽象与实现连接v来,q既减少了单调的工厂cM更易于单元测试?nbsp;<br />      <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/163981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-11-29 14:14 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/11/29/163981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>List,set,Map的区?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/28/163622.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Wed, 28 Nov 2007 01:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/28/163622.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/163622.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/28/163622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163622.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/163622.html</trackback:ping><description><![CDATA[List接口对Collectionq行了简单的扩充Q它的具体实现类常用的有ArrayList和LinkedList。你可以Q何东西放C个List容器中,q在需要时从中取出。ArrayList从其命名中可以看出它是一U类似数l的形式q行存储Q因此它的随问速度极快Q而LinkedList的内部实现是链表Q它适合于在链表中间需要频J进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历,而ListIterator则承了Iterator的思想Qƈ提供了对Listq行双向遍历的方法?<br /> <br /> Set接口也是Collection的一U扩展,而与List不同的时Q在Set中的对象元素不能重复Q也是说你不能把同L东西两次攑օ同一个Set容器中。它的常用具体实现有HashSet和TreeSetcRHashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()ҎQ它使用了前面说q的哈希码的法。而TreeSet则将攑օ其中的元素按序存放,q就要求你放入其中的对象是可排序的,q就用到了集合框架提供的另外两个实用cComparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类h相同的排序算法,那就不需要在每分别重复定义相同的排序法Q只要实现Comparator接口卛_。集合框架中q有两个很实用的公用c:Collections和Arrays。Collections提供了对一个Collection容器q行诸如排序、复制、查扑֒填充{一些非常有用的ҎQArrays则是对一个数l进行类似的操作?<br /> <br /> <br /> Map是一U把键对象和值对象进行关联的容器Q而一个值对象又可以是一个MapQ依ơ类推,q样可形成一个多U映。对于键对象来说Q像Set一P一个Map容器中的键对象不允许重复Q这是ؓ了保持查扄果的一致?如果有两个键对象一P那你惛_到那个键对象所对应的值对象时有问题了,可能你得到的q不是你想的那个值对象,l果会造成混ؕQ所以键的唯一性很重要Q也是符合集合的性质的。当然在使用q程中,某个键所对应的值对象可能会发生变化Q这时会按照最后一ơ修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以Q意多个键都映到一个值对象上Q这不会发生M问题Q不q对你的使用却可能会造成不便Q你不知道你得到的到底是那一个键所对应的值对象)。Map有两U比较常用的实现QHashMap和TreeMap。HashMap也用C哈希码的法Q以便快速查找一个键QTreeMap则是寚w按序存放Q因此它便有一些扩展的ҎQ比如firstKey(),lastKey(){,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的兌很简单,用pub(Object key,Object value)Ҏ卛_一个键与一个值对象相兌。用get(Object key)可得C此key对象所对应的值对象? <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/163622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-11-28 09:55 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/11/28/163622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线E编成(1Q?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163439.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Tue, 27 Nov 2007 06:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163439.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/163439.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163439.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/163439.html</trackback:ping><description><![CDATA[    首先Q和q程不同的是Q线E是׃n地址I间的,在多U程E序中,U程可以从准备就l队列中得到Qƈ在可获得的系lCPU上运行。操作系l和JVM可以控制U程的移动?br />     多个U程的执行是q发的,也就是在逻辑?#8220;同时”Q而不是否是物理上的“同时”?br />     协作式线E模型允许线E自己决定什么时候放弃处理器来等候其他的U程。要求线E共享执行时间?br />     抢占式线E模型中Q操作系l可以在M时候打断线E。要求线E正共享资源?br />     大多数应用程序要求线E互盔R信来同步他们的动作。在JAVAE序中最单实现同步的Ҏ是上锁 <br />     U程?U状?br />   1. 新状态:U程已被创徏但尚未执行(start() 未被调用)?br />   <br />   2. 可执行状态:U程可以执行Q虽然不一定正在执行。CPU 旉随时可能被分配给该线E,从而得它执行?br />   <br />   3. M状态:正常情况?run() q回使得U程M。调?stop()?destroy() 亦有同样效果Q但是不被推荐,前者会产生异常Q后者是强制l止Q不会释N?br />   <br />   4. d状态:U程不会被分?CPU 旉Q无法执行?br />      <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/163439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-11-27 14:08 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java汉字~码问题http://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163428.html王永?/dc:creator>王永?/author>Tue, 27 Nov 2007 05:28:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163428.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163428.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/27/163428.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163428.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163428.html     在JAVA~程中,要对中文字符q行正确的编码{换?br /> Q?Q、向|页输出中文字符串的时候:都要做UNICODE到GBK得{换?br />        
<%@page contentType=”text/html;charset=gb2312” %>

Q?Q、有些JSP版本中没有提供对输出字符集的支持Q这p手动~码输出了?br />     String s1=request.getParameter("keyword");
    String s2=request.getParameter(s1.getBytes("ISO-8859-1"),"GBK");
getBytes Ҏ用于中文字W以“ISO-8859-1”~码方式转化成字节数l,?#8220;GBK” 是目标编码方式?
附加Q?br />     2?font face="Times New Roman" size="3">最早的~码是iso8859-1Q和ascii~码怼。但Z方便表示各种各样的语aQ逐渐出现了很多标准编码,重要的有如下几个?br />     Q?Q、iso8859-1 Q?font face="Times New Roman" size="3">属于单字节编码,最多能表示的字W范围是0-255Q应用于英文pd
    Q?Q、GB2312/GBK Q?br /> q就是汉子的国标码,专门用来表示汉字Q是双字节编码,而英文字母和iso8859-1一_兼容iso8859-1~码Q。其中gbk~码能够用来同时表示J体字和体字Q而gb2312只能表示体字Qgbk是兼容gb2312~码的?br />     Q?Q、UNICODE Q?font face="Times New Roman" size="3">q是最l一的编码,可以用来表示所有语a的字W,而且是定长双字节Q也有四字节的)~码Q包括英文字母在内。所以可以说它是不兼容iso8859-1~码的,也不兼容M~码。不q,相对于iso8859-1~码来说Quniocode~码只是在前面增加了一?字节Q比如字母a?00 61"?/font>
    Q?Q、UTF Q?font face="Times New Roman" size="3">考虑到unicode~码不兼容iso8859-1~码Q而且Ҏ占用更多的空_因ؓ对于英文字母Qunicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而生了utf~码Qutf~码兼容iso8859-1~码Q同时也可以用来表示所有语a的字W,不过Qutf~码是不定长~码Q每一个字W的长度?-6个字节不{。另外,utf~码自带单的校验功能。一般来Ԍ英文字母都是用一个字节表C,而汉字用三个字节?br />
    

    3. java对字W的处理

在java应用软g中,会有多处涉及到字W集~码Q有些地斚w要进行正的讄Q有些地斚w要进行一定程度的处理?/font>

3.1. getBytes(charset)

q是java字符串处理的一个标准函敎ͼ其作用是字W串所表示的字W按照charset~码Qƈ以字节方式表C。注意字W串在java内存中L按unicode~码存储的。比?中文"Q正常情况下Q即没有错误的时候)存储?4e2d 6587"Q如果charset?gbk"Q则被编码ؓ"d6d0 cec4"Q然后返回字?d6 d0 ce c4"。如果charset?utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1"Q则׃无法~码Q最后返?"3f 3f"Q两个问P?/font>

3.2. new String(charset)

q是java字符串处理的另一个标准函敎ͼ和上一个函数的作用相反Q将字节数组按照charset~码q行l合识别Q最后{换ؓunicode存储。参考上qgetBytes的例子,"gbk" ?utf8"都可以得出正的l果"4e2d 6587"Q但iso8859-1最后变成了"003f 003f"Q两个问P?/font>

因ؓutf8可以用来表示/~码所有字W,所以new String( str.getBytes( "utf8" ), "utf8" ) === strQ即完全可逆?/font>

3.3. setCharacterEncoding()

该函数用来设|httph或者相应的~码?/font>

对于requestQ是指提交内容的~码Q指定后可以通过getParameter()则直接获得正的字符Ԍ如果不指定,则默认用iso8859-1~码Q需要进一步处理。参见下q?表单输入"。值得注意的是在执行setCharacterEncoding()之前Q不能执行Q何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且Q该指定只对POSTҎ有效Q对GETҎ无效。分析原因,应该是在执行W一个getParameter()的时候,java会按照~码分析所有的提交内容Q而后l的getParameter()不再q行分析Q所以setCharacterEncoding()无效。而对于GETҎ提交表单是,提交的内容在URL中,一开始就已经按照~码分析所有的提交内容QsetCharacterEncoding()自然无效?/font>

对于responseQ则是指定输出内容的~码Q同Ӟ该设|会传递给览器,告诉览器输出内Ҏ采用的编码?/font>

3.4. 处理q程

下面分析两个有代表性的例子Q说明java对编码有关问题的处理Ҏ?/font>

3.4.1. 表单输入

User input *(gbk:d6d0 cec4) browser *(gbk:d6d0 cec4) web server iso8859-1(00d6 00d 000ce 00c4) classQ需要在class中进行处理:getbytes("iso8859-1")为d6 d0 ce c4Qnew String("gbk")为d6d0 cec4Q内存中以unicode~码则ؓ4e2d 6587?/font>

l 用户输入的编码方式和面指定的编码有养I也和用户的操作系l有养I所以是不确定的Q上例以gbkZ?/font>

l 从browser到web serverQ可以在表单中指定提交内Ҏ使用的字W集Q否则会使用面指定的编码。而如果在url中直接用?的方式输入参敎ͼ则其~码往往是操作系l本w的~码Q因时和面无关。上qC旧以gbk~码Z?/font>

l Web server接收到的是字节流Q默认时QgetParameterQ会以iso8859-1~码处理之,l果是不正确的,所以需要进行处理。但如果预先讄了编码(通过request. setCharacterEncoding ()Q,则能够直接获取到正确的结果?/font>

l 在页面中指定~码是个好习惯,否则可能失去控制Q无法指定正的~码?/font>

3.4.2. 文g~译

假设文g是gbk~码保存的,而编译有两种~码选择Qgbk或者iso8859-1Q前者是中文windows的默认编码,后者是linux的默认编码,当然也可以在~译时指定编码?/font>

Jsp *(gbk:d6d0 cec4) java file *(gbk:d6d0 cec4) compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) compiler write utf(gbk: e4b8ad e69687; iso8859-1: *) compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class。所以用gbk~码保存Q而用iso8859-1~译的结果是不正的?/font>

class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser?/font>

l 文g可以以多U编码方式保存,中文windows下,默认为ansi/gbk?/font>

l ~译器读取文件时Q需要得到文件的~码Q如果未指定Q则使用pȝ默认~码。一般class文gQ是以系l默认编码保存的Q所以编译不会出问题Q但对于jsp文gQ如果在中文windows下编辑保存,而部|在英文linux下运?~译Q则会出现问题。所以需要在jsp文g中用pageEncoding指定~码?/font>

l Java~译的时候会转换成统一的unicode~码处理Q最后保存的时候再转换为utf~码?/font>

l 当系l输出字W的时候,会按指定~码输出Q对于中文windows下,System.out用gbk~码Q而对于responseQ浏览器Q,则用jsp文g头指定的contentTypeQ或者可以直接ؓresponse指定~码。同Ӟ会告诉browser|页的编码。如果未指定Q则会用iso8859-1~码。对于中文,应该为browser指定输出字符串的~码?/font>

l browser昄|页的时候,首先使用response中指定的~码Qjsp文g头指定的contentType最l也反映在response上)Q如果未指定Q则会用网中metaҎ定中的contentType?/font>

3.5. 几处讄

对于web应用E序Q和~码有关的设|或者函数如下?/font>

3.5.1. jsp~译

指定文g的存储编码,很明显,该设|应该置于文件的开头。例如:。另外,对于一般class文gQ可以在~译的时候指定编码?/font>

3.5.2. jsp输出

指定文g输出到browser是用的~码Q该讄也应该置于文件的开头。例如:。该讄和response.setCharacterEncoding("GBK"){效?/font>

3.5.3. meta讄

指定|页使用的编码,该设|对静态网尤其有作用。因为静态网|法采用jsp的设|,而且也无法执行response.setCharacterEncoding()。例如:

如果同时采用了jsp输出和meta讄两种~码指定方式Q则jsp指定的优先。因为jsp指定的直接体现在response中?/font>

需要注意的是,apache有一个设|可以给无编码指定的|页指定~码Q该指定{同于jsp的编码指定方式,所以会覆盖静态网中的meta指定。所以有人徏议关闭该讄?/font>

3.5.4. form讄

当浏览器提交表单的时候,可以指定相应的编码。例如:
。一般不必不使用该设|,览器会直接使用|页的编码?/font>


    
                             


]]>
Java语言异常处理(转蝲) http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163305.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:56:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163305.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163305.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163305.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163305.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163305.html l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch.不要试图处理所有可能出现的异常?br /> l论三:保证所有资源都被正释放。充分运用finally关键词?br /> l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?br /> l论五:量减小try块的体积?br /> l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?br />

OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
 Statement stat = conn.createStatement();
 ResultSet rs = stat.executeQuery(
  "select uid, name from user");
 while (rs.next())
 {
  out.println("IDQ? + rs.getString("uid") + "Q姓? "                                      + rs.getString("name"));
 }
}
catch(SQLException sqlex)
{
 out.println("警告Q数据不完整");
 throw new ApplicationException("d数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
 throw new ApplicationException("写入数据时出现IO错误", ioex);
}
finally
{
 if (conn != null) {
  try {
   conn.close();
  }
  catch(SQLException sqlex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连?                               " + sqlex2.toString());
  }
 }

 if (out != null) {
  try {
   out.close();
  }
  catch(IOException ioex2)
  {
   System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g"              + ioex2.toString());
  }
 }
}



]]>
JSP处理表单的一些经验分?(转蝲)http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163306.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:56:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163306.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163306.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163306.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163306.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163306.html1Q超q接跌{ 比如Qurl="jsp/managerAction.do?"+url;只传递参敎ͼ不传递表?br /> 2Q即传参又提交表?比如Q?br /> function commonSubmit(url)
{
form1.action="/jsp/managerAction.do?"+url;
form1.action.method=post;
form1.submit();
}

3Qjs和java变量互传
java变量传给js好办Qvar a ="";注意要将引号""加上Qjs变量ljavaE微复杂点,一般是在表单中用一?br /> 的隐藏表单元素,然后在脚本中js变量Dl它:

var jsParamValue=aaaa;
form1.jsParam.value=jsParamValue;

然后可以request.getPrameter("jsPrama");来取得js变量g
4QAction中request不会丢掉
不知大家有没有注意到q个好处QStruts架构中是׃个ActionServlet来作为MVC的控制器角色Qjsp面提交后request是传到ActionServelt中的Q?而ActionServlet根据struts-config.xml中的配置调用相应的Action的方法,q将从jsp中获得的request传给Actionc,q样request的生命周期是q箋的,即你在jsp中提交了表单Q在Action中执行了ҎQ再回到jsp面Q用request.getParamter()取jsp面的表单元素g发现它还在,q对于页面下拉列表等选择w止复位是一个很好实现方法?/font>

5Q传参时参数有空格的情况
如果你提交form时带参数Q比如form1.action="/jsp/Action.do?param1="+value1,注意如果value1中带有空格的话,你在

Action中request.getParameter("param1");

取得的只是空格前的|因此如果有这U带I格的参数在传递时Q个人徏议是其转化为特定的字符Ԍvalue1=value1.replaceAll(" ","%NULL%");
然后在Action中将其{回来Qrequest.getParamter("param1").replaceAll("%NULL%"," ");

6Qjsp中开模式对话框的方式
与Swing中类|jsp中也有模式对话框q一概念Q你可以一个jsp面攑ֈ一个模式对话框中打开Q这样在模式对话框消失前Q原jsp面不可操作。特别适合爉面中要做一些额外的选择操作Q而又没必要蟩转到新的jsp面的时候,
开模式对话框的方式参考如下:

Function open() {
If(window.showModelDialog())
{
Var returnValue = showModelDialog(“/jsp/模式H口包含的jsp面路径”;
help=0;status=0;center=yes;dialogWidth=100pt;dialogHeight=100pt”);
}

}



]]>
bat文g说明http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163302.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:54:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163302.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163302.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163302.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163302.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163302.html扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文g?

==== ?=======================================
.bat是dos下的批处理文?
.cmd是nt内核命o行环境的另一U批处理文g
从更q义的角度来看,unix的shell脚本以及其它操作pȝ甚至应用E序中由外壳q行解释执行的文本,都具有与批处理文件十分相似的作用Q而且同样是由专用解释器以行ؓ单位解释执行Q这U文本Ş式更通用的称谓是脚本语言。所以从某个E度分析Qbatch, unix shell, awk, basic, perl {脚本语a都是一LQ只不过应用的范围和解释的^台各有不同而已。甚x些应用程序仍然沿用批处理q一U呼Q而其内容和扩展名与dos的批处理却又完全不同?
===================================

首先批处理文件是一个文本文Ӟq个文g的每一行都是一条DOS命oQ大部分时候就好象我们在DOS提示W下执行的命令行一PQ你可以使用DOS下的Edit或者Windows的记事本(notepad){Q何文本文件编辑工具创建和修改批处理文件?

==== ?===================
批处理文件中完全可以使用非dos命oQ甚臛_以用不h可执行特性的普通数据性文Ӟq缘于windowspȝq个新型解释q_的涉入,使得批处理的应用来?边缘?。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动?
========================

其次Q批处理文g是一U简单的E序Q可以通过条g语句(if)和流E控制语?goto)来控制命令运行的程Q在批处理中也可以用@环语?for)来@环执行一条命令。当Ӟ批处理文件的~程能力与C语言{编E语句比h是十分有限的Q也是十分不规范的。批处理的程序语句就是一条条的DOS命oQ包括内部命令和外部命oQ,而批处理的能力主要取决于你所使用的命令?

==== ?==================
批处理文?batch file)也可以称之ؓ批处理程?batch program)Q这一点与~译型语a有所不同Q就c语言来说Q扩展名为c或者cpp的文件可以称之ؓc语言文g或者c语言源代码,但只有编译连接后的exe文g才可以称之ؓc语言E序。因为批处理文g本n既具有文本的可读性,又具有程序的可执行性,q些U谓的界限是比较模糊的?
===========================

W三Q每个编写好的批处理文g都相当于一个DOS的外部命令,你可以把它所在的目录攑ֈ你的DOS搜烦路径(path)中来使得它可以在L位置q行。一个良好的习惯是在盘上徏立一个bat或者batch目录Q例如C:\BATCHQ,然后所有你~写的批处理文g攑ֈ该目录中Q这样只要在path中设|上c:\batchQ你可以在L位置q行所有你~写的批处理E序?

==== ?=====
U以dospȝ而言Q可执行E序大约可以l分Zc,依照执行优先U由高到低排列分别是QDOSKEY宏命令(预先ȝ内存Q,COMMAND.COM中的内部命oQ根据内存的环境随时q驻内存Q,以com为扩展名的可执行E序Q由command.com 直接载入内存Q,以exe位扩展名的可执行E序Q由command.com 重定位后载入内存Q,以bat位扩展名的批处理E序Q由command.com 解释分析Q根据其内容按优先序调用W?Q?Q?Q?U可执行E序Q分析一行,执行一行,文g本n不蝲入内存)
============

W四Q在DOS和Win9x/Mepȝ下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动q行批处理文Ӟ每次pȝ启动时会自动q行该文Ӟ你可以将pȝ每次启动旉要运行的命o攑օ该文件中Q例如设|搜索\径,调入鼠标驱动和磁盘缓存,讄pȝ环境变量{。下面是一个运行于Windows 98下的autoexec.bat的示例:
@ECHO OFF
PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;<br>
C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH
LH SMARTDRV.EXE /X
LH DOSKEY.COM /insert
LH CTMOUSE.EXE
SET TEMP=D:\TEMP
SET TMP=D:\TEMP
==== ?=====
AUTOEXEC.BAT为DOSpȝ的自动运行批处理文gQ由COMMAND.COM启动时解释执行;
而在Win9x环境中,不仅增加支持?DOSSTART.BAT, WINSTART.BAT {许多其它自动运行的批处理文Ӟ对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS {许多变体以适应复杂的环境和多变的需求?
==== willsort ~注 =============
以下关于命o的分c,有很多值得推敲的地斏V常用命令中的@本不是命令,而dir、copy{也很常用的命o却没有列? 而特D命令中所有命令对我来说都是常用命令。徏议将批处理所引用的命令分为内部命令、外部命令、第三方E序三类。而内部命令和外部命o中别有一cL专用于或常用于批处理中的命o可称之ؓ"批处理命??

以下摘录MS-DOS 6.22 帮助文中关?批处理命?的文字,当然Q其中有些概念和定义已经有些落后了?

批处理命?

批处理文件或批处理程序是一个包含若qMS-DOS命o的正文文Ӟ扩展名ؓ.BAT。当在命令提C符下敲入批处理E序的名U时QMS-DOS成组执行此批处理E序中的命o?

M在命令提C符下可使用的命令都可用在批处理E序中。此外,下面MS-DOS命o是专门在批处理程序中使用的?
==========

常用命o

echo、@、call、pause、rem(技巧:?:代替rem)是批处理文g最常用的几个命令,我们׃他们开始学赗?

==== ?===========
首先, @ 不是一个命? 而是DOS 批处理的一个特D标记符, 仅用于屏蔽命令行回显. 下面是DOS命o行或批处理中可能会见到的一些特D标记符:
CR(0D) 命o行结束符
Escape(1B) ANSI转义字符引导W?
Space(20) 常用的参数界定符
Tab(09) ; = 不常用的参数界定W?
+ COPY命o文gq接W?
* ? 文g通配W?
"" 字符串界定符
| 命o道W?
< > >> 文g重定向符
@ 命o行回昑ֱ蔽符
/ 参数开兛_导符
: 批处理标{ּ导符
% 批处理变量引导符

其次, :: 实可以起到rem 的注释作? 而且更简z有? 但有两点需要注?
W一, 除了 :: 之外, M?:开头的字符? 在批处理中都被视作标? 而直接忽略其后的所有内? 只是Z与正常的标号相区? 使用 goto 所无法识别的标? 卛_ :后紧跟一个非字母数字的一个特D符?
W二, 与rem 不同的是, ::后的字符行在执行时不会回? 无论是否用echo on打开命o行回昄? 因ؓ命o解释器不认ؓ他是一个有效的命o? 此Ҏ? rem 在某些场合下比 :: 更ؓ适用; 另外, rem 可以用于 config.sys 文g?
=====================

echo 表示昄此命令后的字W?
echo off 表示在此语句后所有运行的命o都不昄命o行本w?
@与echo off相象Q但它是加在每个命o行的最前面Q表C行时不显C一行的命o行(只能影响当前行)?
call 调用另一个批处理文gQ如果不用call而直接调用别的批处理文gQ那么执行完那个批处理文件后无法返回当前文件ƈ执行当前文g的后l命令)?
pause q行此句会暂停批处理的执行ƈ在屏q上昄Press any key to continue...的提C,{待用户按Q意键后l?
rem 表示此命令后的字Wؓ解释行(注释Q,不执行,只是l自׃后参考用的(相当于程序中的注释)?
==== ?=====
此处的描q较为؜? 不如直接引用个命令的命o行帮助更为条?

-------------------------
ECHO

当程序运行时Q显C或隐藏批处理程序中的正文。也可用于允许或止命o的回显?

在运行批处理E序ӞMS-DOS一般在屏幕上显C(回显Q批处理E序中的命o?
使用ECHO命o可关闭此功能?

语法

ECHO [ON|OFF]

若要用echo命o昄一条命令,可用下述语法Q?

echo [message]

参数

ON|OFF
指定是否允许命o的回显。若要显C当前的ECHO的设|,可用不带参数的ECHO
命o?

message
指定让MS-DOS在屏q上昄的正文?

-------------------

CALL

从一个批处理E序中调用另一个批处理E序Q而不会引L一个批处理的中止?

语法

CALL [drive:][path]filename [batch-parameters]

参数

[drive:][path]filename
指定要调用的批处理程序的名字及其存放处。文件名必须?BAT作扩展名?


batch-parameters
指定批处理程序所需的命令行信息?

-------------------------------

PAUSE

暂停批处理程序的执行q显CZ条消息,提示用户按Q意键l箋执行。只能在批处
理程序中使用该命令?

语法

PAUSE


REM

在批处理文g或CONFIG.SYS中加入注解。也可用REM命o来屏蔽命令(在CONFIG.SYS
中也可以用分?; 代替REM命oQ但在批处理文g中则不能替代Q?

语法

REM [string]

参数

string
指定要屏蔽的命o或要包含的注解?
=======================

?Q用edit~辑a.bat文gQ输入下列内容后存盘为c:\a.batQ执行该批处理文件后可实玎ͼ根目录中所有文件写?a.txt中,启动UCDOSQ进入WPS{功能?

  批处理文件的内容?         命o注释Q?

    @echo off           不显C后l命令行及当前命令行
    dir c:\*.* >a.txt       c盘文件列表写入a.txt
    call c:\ucdos\ucdos.bat    调用ucdos
    echo 你好            昄"你好"
    pause              暂停,{待按键l箋
    rem 准备q行wps         注释Q准备运行wps
    cd ucdos            q入ucdos目录
    wps               q行wps  

批处理文件的参数

批处理文件还可以像C语言的函C样用参敎ͼ相当于DOS命o的命令行参数Q,q需要用C个参数表C符"%"?

%[1-9]表示参数Q参数是指在q行批处理文件时在文件名后加的以I格Q或者TabQ分隔的字符丌Ӏ变量可以从%0?9Q?0表示批处理命令本w,其它参数字符串用%1?9序表示?

?QC:根目录下有一批处理文件名为f.batQ内容ؓQ?
@echo off
format %1

如果执行C:\>f a:
那么在执行f.batӞ%1pCa:Q这样format %1q当于format a:Q于是上面的命oq行时实际执行的是format a:

?QC:根目录下一批处理文件名为t.batQ内容ؓ:
@echo off
type %1
type %2

那么q行C:\>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令将序地显Ca.txt和b.txt文g的内宏V?

==== ?===============
参数在批处理中也作ؓ变量处理, 所以同样用百分号作ؓ引导W? 其后?-9中的一个数字构成参数引用符. 引用W和参数之间 (例如上文中的 %1 ?a: ) 的关pȝg变量指针与变量值的关系. 当我们要引用W十一个或更多个参数时, 必ȝ动DOS 的参数v始指? shift 命o正充当了q个Ud指针的角? 它将参数的v始指针移动到下一个参? cMC 语言中的指针操作. 囄如下:

初始状? cmd 为命令名, 可以?%0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9

l过1ơshift? cmd 无法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9

l过2ơshift? arg1也被废弃, %9指向为空, 没有引用意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8

遗憾的是, win9x 和DOS下均不支?shift 的逆操? 只有?nt 内核命o行环境下, shift 才支?/n 参数, 可以以第一参数为基准返复移动v始指?
=================

Ҏ命o


if goto choice for是批处理文g中比较高U的命oQ如果这几个你用得很熟练Q你是批处理文件的专家啦?


一、if 是条件语句,用来判断是否W合规定的条Ӟ从而决定执行不同的命o?有三U格?

1、if [not] "参数" == "字符? 待执行的命o

参数如果{于(not表示不等Q下?指定的字W串Q则条g成立Q运行命令,否则q行下一句?

例:if "%1"=="a" format a:

====

if 的命令行帮助中关于此点的描述?
IF [NOT] string1==string2 command
在此有以下几炚w要注?
1. 包含字符串的双引号不是语法所必须? 而只是习惯上使用的一U?防空"字符
2. string1 未必是参? 它也可以是环境变? 循环变量以及其他字符串常量或变量
3. command 不是语法所必须? string2 后跟一个空格就可以构成一个有效的命o?
=============================

2、if [not] exist [路径\]文g?待执行的命o
如果有指定的文gQ则条g成立Q运行命令,否则q行下一句?

? if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文gQ则昄它的内容?

****** ?********
也可以用以下的用法:
if exist command
device 是指DOSpȝ中已加蝲的设? 在win98下通常?
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具体的内容会因硬软g环境的不同而略有差? 使用q些讑֤名称? 需要保证以下三?
1. 该设备确实存?pY件虚拟的讑֤除外)
2. 该设备驱动程序已加蝲(aux, prn{标准设备由pȝ~省定义)
3. 该设备已准备?主要是指a: b: ..., com1..., lpt1...{?
可通过命o mem/d | find "device" /i 来检阅你的系l中所加蝲的设?
另外, 在DOSpȝ? 讑֤也被认ؓ是一U特D的文g, 而文件也可以UC字符讑֤; 因ؓ讑֤(device)与文仉是用句?handle)来管理的, 句柄是名字, cM于文件名, 只不q句柄不是应用于盘理, 而是应用于内存管理而已, 所谓设备加载也x在内存中为其分配可引用的句柄.
==================================

3、if errorlevel <数字> 待执行的命o

很多DOSE序在运行结束后会返回一个数字值用来表C程序运行的l果(或者状?Q通过if errorlevel命o可以判断E序的返回|Ҏ不同的返回值来军_执行不同的命?q回值必L照从大到的序排列)。如果返回值等于指定的数字Q则条g成立Q运行命令,否则q行下一句?

如if errorlevel 2 goto x2

==== ?===========
q回g大到的序排列不是必须? 而只是执行命令ؓ goto 时的习惯用法, 当?set 作ؓ执行命o? 通常会从到大顺序排? 比如需返回码|入环境变量, 需使用以下的顺序Ş?

if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...

当然, 也可以用以下@环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e

更高效简z的用法, 可以参考我写的另一关于获?errorlevel 的文?

出现此种现象的原因是, if errorlevel 比较q回码的判断条gq{于, 而是大于{于. ׃ goto 的蟩转特? 由小到大排序会导致在较小的返回码处就跛_; 而由?set命o?"重复" 赋值特? 由大到小排序会导致较的q回?"覆盖" 较大的返回码.

另外, 虽然 if errorlevel=<数字> command 也是有效的命令行, 但也只是 command.com 解释命o行时?= 作ؓ命o行切分符而忽略掉|了
===========================


二、goto 批处理文件运行到q里蟩到goto所指定的标?标号即labelQ标L:后跟标准字符串来定义)处,goto语句一般与if配合使用Q根据不同的条g来执行不同的命ol?

?

goto end

:end
echo this is the end

标号?:字符?来定义,标号所在行不被执行?

==== willsort ~注

label 常被译ؓ "标签" , 但是qƈ不具有广泛的U定?

goto ?: 联用可实现执行中途的跌{, 再结?if 可实现执行过E的条g分支, 多个 if 卛_实现命o的分l? cM C ?switch case l构或?Basic 中的 select case l构, 大规模且l构化的命o分组卛_实现高语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对?

Batch C / Basic
goto&: goto&:
goto&:&if if{}&else{} / if&elseif&endif
goto&:&if... switch&case / select case
goto&:&if&set&envar... function() / function(),sub()
==================================
三、choice 使用此命令可以让用户输入一个字W(用于选择Q,从而根据用L选择q回不同的errorlevelQ然后于if errorlevel配合Q根据用L选择q行不同的命令?

注意Qchoice命o为DOS或者Windowspȝ提供的外部命令,不同版本的choice命o语法会稍有不同,Lchoice /?查看用法?

choice的命令语法(该语法ؓWindows 2003中choice命o的语法,其它版本的choice的命令语法与此大同小异)Q?

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
该工具允许用户从选择列表选择一个项目ƈq回所选项目的索引?

参数列表:
/C choices 指定要创建的选项列表。默认列表是 "YN"?

/N 在提C符中隐藏选项列表。提C前面的消息得到昄Q?
选项依旧处于启用状态?

/CS 允许选择分大写的选项。在默认情况下,q个工具
是不分大写的?

/T timeout 做出默认选择之前Q暂停的U数。可接受的值是?0
?9999。如果指定了 0Q就不会有暂停,默认选项
会得到选择?

/D choice ?nnnn U之后指定默认选项。字W必d?/C ?
Ҏ定的一l选择? 同时Q必ȝ /T 指定 nnnn?

/M text 指定提示之前要显C的消息。如果没有指定,工具?
昄提示?

/? 昄帮助消息?

注意:
ERRORLEVEL 环境变量被设|ؓ从选择集选择的键索引。列出的W一个?
择返?1Q第二个选择q回 2Q等{。如果用h的键不是有效的选择Q?
该工具会发出警告响声。如果该工具到错误状态,它会q回 255 ?
ERRORLEVEL 倹{如果用h Ctrl+Break ?Ctrl+C 键,该工具会q回 0
?ERRORLEVEL 倹{在一个批E序中?ERRORLEVEL 参数Ӟ参数降
序排列?

CZ:
CHOICE /?
CHOICE /C YNC /M "认h YQ否h NQ或者取消请?C?
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "选项 1 请选择 aQ选项 2 请选择 b?
CHOICE /C ab /N /M "选项 1 请选择 aQ选项 2 请选择 b?

==== willsort ~注 ===============================
我列出win98下choice的用法帮? 已资区分

Waits for the user to choose one of a set of choices.
{待用户选择一l待选字W中的一?

CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]

/C[:]choices Specifies allowable keys. Default is YN
指定允许的按?待选字W?, 默认为YN
/N Do not display choices and ? at end of prompt string.
不显C提C字W串中的问号和待选字W?
/S Treat choice keys as case sensitive.
处理待选字W时大小写敏?
/T[:]c,nn Default choice to c after nn seconds
?nn U后默认选择 c
text Prompt string to display
要显C的提示字符?
ERRORLEVEL is set to offset of key user presses in choices.
ERRORLEVEL 被设|ؓ用户键入的字W在待选字W中的偏Ud?
如果我运行命令:CHOICE /C YNC /M "认h YQ否h NQ或者取消请?C?
屏幕上会昄Q?
认h YQ否h NQ或者取消请?C?[Y,N,C]?


例:test.bat的内容如下(注意Q用if errorlevel判断q回值时Q要按返回g高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errorlevel 1 goto defrag

:defrag
c:\dos\defrag
goto end

:mem
mem
goto end

:end
echo good bye

此批处理q行后,显C?defrag,mem,end[D,M,E]?" Q用户可选择d m e Q然后if语句Ҏ用户的选择作出判断Qd表示执行标号为defrag的程序段Qm表示执行标号为mem的程序段Qe表示执行标号为end的程序段Q每个程序段最后都以goto end程序蟩到end标号处,然后E序显Cgood byeQ批处理q行l束?

四、for 循环命oQ只要条件符合,它将多次执行同一命o?

语法Q?
对一l文件中的每一个文件执行某个特定命令?

FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一个单一字母可替换的参数?
(set) 指定一个或一l文件。可以用通配W?
command 指定Ҏ个文件执行的命o?
command-parameters
为特定命令指定参数或命o行开兟?

例如一个批处理文g中有一?
for %%c in (*.bat *.txt) do type %%c

则该命o行会昄当前目录下所有以bat和txt为扩展名的文件的内容?

==== willsort ~注 =====================================================
需要指出的? ?)中的字符串ƈ非单个或多个文g名时, 它将单纯被当作字W串替换, q个Ҏ再加上()中可以嵌入多个字W串的特? 很明?for 可以被看作一U遍历型循环.
当然, ?nt/2000/xp/2003 pd的命令行环境? for 被赋予了更多的特? 使之可以分析命o输出或者文件中的字W串, 也有很多开兌用于扩展了文件替换功?
========================================================================

批处理示?

1. IF-EXIST

1) 首先用记事本在C:\建立一个test1.bat批处理文Ӟ文g内容如下Q?
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

然后q行它:
C:\>TEST1.BAT

如果C:\存在AUTOEXEC.BAT文gQ那么它的内容就会被昄出来Q如果不存在Q批处理׃提示你该文g不存在?

2) 接着再徏立一个test2.bat文gQ内容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist

执行:
C:\>TEST2 AUTOEXEC.BAT
该命令运行结果同上?

说明Q?
(1) IF EXIST 是用来测试文件是否存在的Q格式ؓ
IF EXIST [路径+文g名] 命o
(2) test2.bat文g中的%1是参敎ͼDOS允许传?个批参数信息l批处理文gQ分别ؓ%1~%9(%0表示test2命o本n) Q这有点象编E中的实参和形参的关p,%1是Ş参,AUTOEXEC.BAT是实参?

==== willsort ~注 =====================================================
DOS没有 "允许传?个批参数信息" 的限? 参数的个数只会受到命令行长度和所调用命o处理能力的限? 但是, 我们在批处理E序? 在同一时刻只能同时引用10个参? 因ؓ DOS只给Z %0~%9q十个参数引用符.
========================================================================

3) 更进一步的Q徏立一个名为TEST3.BAT的文Ӟ内容如下Q?
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN

如果q行Q?
C:\>TEST3 A B C
屏幕上会昄:
XIAO
TIAN
XIN

如果q行Q?
C:\>TEST3 A B
屏幕上会昄
XIAO
TIAN

在这个命令执行过E中QDOS会将一个空字符串指定给参数%3?

2、IF-ERRORLEVEL

建立TEST4.BATQ内容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 1 ECHO 文g拯p|
IF ERRORLEVEL 0 ECHO 成功拯文g

然后执行文g:
C:\>TEST4

如果文g拯成功Q屏q就会显C?成功拯文g"Q否则就会显C?文g拯p|"?

IF ERRORLEVEL 是用来测试它的上一个DOS命o的返回值的Q注意只是上一个命令的q回|而且q回值必M照从大到次序顺序判断?
因此下面的批处理文g是错误的Q?

@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拯文g
IF ERRORLEVEL 1 ECHO 未找到拷贝文?
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拯操作
IF ERRORLEVEL 3 ECHO 预置错误L文g拯操作
IF ERRORLEVEL 4 ECHO 拯q程中写盘错?

无论拯是否成功Q后面的Q?

未找到拷贝文?
用户通过ctrl-c中止拯操作
预置错误L文g拯操作
拯q程中写盘错?

都将昄出来?

以下是几个常用命o的返回值及其代表的意义Q?

backup
0 备䆾成功
1 未找到备份文?
2 文g׃n冲突L备䆾完成
3 用户用ctrl-c中止备䆾
4 ׃致命的错误备䆾操作中止

diskcomp
0 盘比较相?
1 盘比较不?
2 用户通过ctrl-c中止比较操作
3 ׃致命的错误比较操作中止
4 预置错误中止比较

diskcopy
0 盘拷贝操作成?
1 非致命盘?写错
2 用户通过ctrl-cl束拯操作
3 因致命的处理错误使盘拯中止
4 预置错误L拯操作

format
0 格式化成?
3 用户通过ctrl-c中止格式化处?
4 因致命的处理错误使格式化中止
5 在提C?proceed with formatQy/nQ?"下用户键入nl束

xcopy
0 成功拯文g
1 未找到拷贝文?
2 用户通过ctrl-c中止拯操作
4 预置错误L文g拯操作
5 拯q程中写盘错?

chkdsk
0 未找到错?
255 扑ֈ一个或多个错误

choice
0 用户按下ctrl+c/break
1 用户按下W一个键
255 到命o行中的错误条?
其它 用户按下的有效字W在列表中的位置

defrag
0 片压羃成功
1 出现内部错误
2 盘上没有空。要q行DEFRAGQ至要有一个空?
3 用户用Ctrl+C退ZDEFRAG
4 出现一般性错?
5 DEFRAG在读时遇到错误
6 DEFRAG在写时遇到错误
7 分配I间有错
8 内存?
9 没有_I间来压~磁盘碎?

deltree
0 成功地删除一个目?

diskcomp
0 两盘相同
1 发现不同
2 按CTRL+C l止了比?
3 出现严重错误
4 出现初始化错?

find
0 查找成功且至找C一个匹配的字符?
1 查找成功但没扑ֈ匚w的字W串
2 查找中出C错误

keyb
0 键盘定义文g装入成功
1 使用了非法的键盘代码Q字W集或语?
2 键盘定义文g坏或未找?
4 键盘、监视器通讯时出?
5 要求的字W集未准备好

move
0 成功地移动了指定的文?
1 发生了错?

msav /N
86 查到了病?

replace
0 REPLACE成功地替换或加入了文?
1 MS-DOS版本和REPLACE不兼?
2 REPLACE找不到源文g
3 REPLACE找不到源路径或目标\?
5 不能存取要替换的文g
8 内存不够无法执行REPLACE
11 命o行句法错?

restore
0 RESTORE成功地恢复了文g
1 RESTORE找不到要恢复的文?
3 用户按CTRL+Cl止恢复q程
4 RESTORE因错误而终?

scandisk
0 ScanDisk在它查的驱动器上未检到M错误
1 ׃命o行的语法不对Q不能运行ScanDisk
2 ׃内存用尽或发生内部错误,ScanDisk意外l止
3 用户让ScanDisk中途退?
4 q行盘面扫描Ӟ用户军_提前退?
254 ScanDisk扑ֈ盘故障q已全部校正
255 ScanDisk扑ֈ盘故障Q但未能全部校正

setver
0 SETVER成功地完成了d
1 用户指定了一个无效的命o开?
2 用户指定了一个非法的文g?
3 没有_的系l内存来q行命o
4 用户指定了一个非法的版本h?
5 SETVER在版本表中未扑ֈ指定的项
6 SETVER未找到SETVER.EXE文g
7 用户指定了一个非法的驱动?
8 用户指定了太多的命o行参?
9 SETVER到丢失了命令行参数
10 在读SETVER.EXE文gӞSETVER到发生错误
11 SETVER.EXE文g损坏
12 指定的SETVER.EXE文g不支持版本表
13 版本表中没有_的空间存放新的项
14 在写SETVER.EXE文g时SETVER到发生错误
========================================================================

3、IF STRING1 == STRING2

建立TEST5.BATQ文件内容如下:
@echo off
IF "%1" == "A" FORMAT A:

执行Q?
C:\>TEST5 A
屏幕上就出现是否A:盘格式化的内宏V?

注意Qؓ了防止参CؓI的情况Q一般会字W串用双引号Q或者其它符P注意不能使用保留W号Q括h?
如:if [%1]==[A] 或?if %1*==A*

5、GOTO

建立TEST6.BATQ文件内容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:\
:_DONE

注意Q?
(1) 标号前是ASCII字符的冒?:"Q冒号与标号之间不能有空根{?
(2) 标号的命名规则与文g名的命名规则相同?
(3) DOS支持最长八位字W的标号Q当无法区别两个标号Ӟ蟩转至最q的一个标受?

==== willsort ~注 =====================================================
1)标号也称作标{?label)
2)标签不能以大多数的非字母数字字符开? 而文件名中则可以使用很多
3)当无法区别两个标{时, 蟩转至位置最靠前的标{?
========================================================================

6、FOR

建立C:\TEST7.BATQ文件内容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

q行Q?
C:\>TEST7

执行以后Q屏q上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内ҎC出来(不包括隐藏文Ӟ?



]]>
webService的?1)-----Eclipse http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163300.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:53:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163300.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163300.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163300.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163300.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163300.html1、首先编写服务端Q?br /> W一部:先创Z个webService工程
W二部:~写服务chello.java与服务类应该实现的接口TestHello.java
W三部:发布服务新徏-->webService-->输入服务名称和上面服务类与接?br /> 2、编写客L
package com.wyq.business;

import javax.xml.rpc.encoding.XMLType;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class TestWebservice {
 public String sendAjax(){
  String result="";
  String url="";
  try{
   //创徏一个服?br />    Service service=new Service();
   //建立服务调用实例
   Call call=(Call)service.createCall();
   
   url="http://localhost:8000/webService/services/TestService";
   //讑֮调用路径
   call.setTargetEndpointAddress(url);
   //讑֮调用Ҏ
   call.setOperation("helloWord");
   //讑֮q回cd
   call.setReturnType(XMLType.XSD_STRING);
   //开始调?/span>
   result=(String)call.invoke(new Object[] {});
  }catch(Exception e){
   e.printStackTrace();
  }
  return result;
 }
}



]]>
克隆表达?----用于d调度 http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163298.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:52:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163298.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163298.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163298.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163298.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163298.html(1)、克隆表辑ּ可以包括7个字D:U、分、小时、月内日期、月、周内日期、年(可选字D?
(2)、特D字W:
一、反斜线(/)字符表示增量?5/15"代表从第5U开始,?5U一ơ?br /> 二、问   ??)字符和字母L字符只能在月内日期和周内日期字段中可用。问可C个字D不包含具体|所以,如果指定月内日期Q可以在周内日期字段中插??"Q表C周内日期值无关紧要,字母L攑֜月内日期字段中,表示安排在当月最后一天执行?br /> 三、在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日,?1W"攑֜月内日期字段中,表示把执行安排在当月的第一个工作日内?br /> 四、井?#)字符为给定月份指定具体的工作日实例。把"MON#2"攑֜周内日期字段中,表示把Q务安排在当月的第二个星期一?br /> 五、星?*)字符是通配字符Q表C字段可以接受M可能的倹{?br /> 例子Q?br /> "0 0 12 * * ?" 每天中午12点触?
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005q的每天上午10:15触发
"0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发
"0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发
"0 15 10 15 * ?" 每月15日上?0:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发 "0 0 12 * * ?" 每天中午12点触?
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005q的每天上午10:15触发
"0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发
"0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发
"0 15 10 15 * ?" 每月15日上?0:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发



]]>
JSPTag标签?http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163299.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:52:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163299.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163299.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163299.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163299.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163299.html标签库程序应该有以下几部分组成:
(1)、标{具体实现文g(*.java):必须l承javax.servlet.jsp.tagext.TagSuport
(2)、标{描述文g(*.tld)
(3)、如果需要可以在web.xml中进行设|?br /> (4)、在JSP中通过标签q行自定义标{ֺ的调?br />
一、在具体实现文g(*.java)中,doStartTagҎ:表示标签的开?br />                                              doStartEndҎ:表示标签的结?br /> 二?.tld文g是标{描述文gQ此文gҎ{ֺ的运行vl对性作用,*.tld文g也是一个xml文gQ如果是使用xml,则需要DTD、SCHEMA支持?br /> Name:表示标签的方法名Uͼ<jsp:forward><jsp:include>

java实现c:

package com.wyq.TagTest;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class Hello extends TagSupport{

 @Override
 public int doStartTag() throws JspException {
   //从页面获取request,得到面的?br />    ServletRequest request = pageContext.getRequest();
  String str="   //在servlet中打印要使用printWriter
  //如果在标{中打印需要用pageContext
  JspWriter out=pageContext.getOut();
  try{
   out.print(str);
  }catch(Exception e){
   e.printStackTrace();
  }
  //只要打印完了字符Ԍ则后面的代码׃需要执行了
  
  return TagSupport.SKIP_BODY;
 }

}

tld文g的配|:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" >
<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>hello</short-name>
  <tag>
    <name>mldn</name>
    <tag-class>com.wyq.TagTest.Hello</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>



]]>
Java关键字final、static使用ȝ http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163297.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:51:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163297.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163297.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163297.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163297.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163297.html一、final
        ҎE序上下文环境,Java关键字final?#8220;q是无法改变?#8221;或?#8220;l态的”含义Q它可以修饰非抽象类、非抽象cL员方法和变量。你可能Z两种理解而需要阻止改变:设计或效率?br />         finalcM能被l承Q没有子c,finalcM的方法默认是final的?br />         finalҎ不能被子cȝҎ覆盖Q但可以被ѝ?br />         final成员变量表示帔RQ只能被赋gơ,赋值后g再改变?br />         final不能用于修饰构造方法?br />         注意Q父cȝprivate成员Ҏ是不能被子类Ҏ覆盖的,因此privatecd的方法默认是finalcd的?/span>
1、finalc?/span>
        finalcM能被l承Q因此finalcȝ成员Ҏ没有Z被覆盖,默认都是final的。在设计cL候,如果q个cM需要有子类Q类的实现细节不允许改变Qƈ且确信这个类不会载被扩展Q那么就设计为finalcR?/span>
2、finalҎ
        如果一个类不允许其子类覆盖某个ҎQ则可以把这个方法声明ؓfinalҎ?br />         使用finalҎ的原因有二:
        W一、把Ҏ锁定Q防止Q何承类修改它的意义和实现?br />         W二、高效。编译器在遇到调用finalҎ时候会转入内嵌机制Q大大提高执行效率?br /> 3、final变量(帔R)
      用final修饰的成员变量表C常量,g旦给定就无法改变Q?br />       final修饰的变量有三种Q静态变量、实例变量和局部变量,分别表示三种cd的常量?br /> 二、static
      static表示全局或者静态的意思,用来修饰成员变量和成员方法,也可以Ş成静态static代码块,但是Java语言中没有全局变量的概c?br />       被static修饰的成员变量和成员Ҏ独立于该cȝM对象Q也是_它不依赖cȝ实例Q被cȝ所有实例共享,只要q个c被加蝲QJava虚拟机就能根据类名在q行时数据区的方法区内找C们,因此Qstatic对象可以在他的Q何对象创Z前访问,无须引用M对象?/font>


]]>
propertiesc读取配|文?http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163295.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:50:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163295.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163295.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163295.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163295.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163295.htmlpackage com.wyq.hibernate;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


public class Example {
 //建立一个静态的工场对象
 private static SessionFactory session_factory = null;
 //建立一个存储配|文件的对象--properties
 private static Properties pops=new Properties();
 //取得配置文g路径,配置文g存放在class路径?/span>
 private static String path=Example.class.getClassLoader().getResource("").getPath()+"hibernate.properties";
 //建立一个静态方法,用来d配置文g---hibernate.properties,在static静态方法中只能引用静态变?br />  static{
  try{
   String s=path.substring(1,path.length());
   //d配置文g
   InputStream stream= new FileInputStream(s);
   //如果配置文g和类攑֜同一个目录下Q这U情况不使用
   InputStream streams=Example.class.getResourceAsStream("hibernate.properties");
   //配|文件存储在pops?/span>
   pops.load(stream);
   //建立配置文g理对象
   Configuration cfg=new Configuration();
   //Persond到cfg中,cM于将xxx.hbm.xml写在hibernate.hbm.xml?br />    cfg.addClass(Person.class);
   //popsd到cfg中,是hiberante.hbm.xml
   cfg.setProperties(pops);
   //建立对象工厂
   session_factory=cfg.buildSessionFactory();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public static void main(String[] args)throws HibernateException{
  Person person=new Person();
  person.setName("wyq");
  person.setEmail("hibernate.com.cn");
  
  //取得一个session,获得q接
  Session session=session_factory.openSession();
  //定义一个事?/span>
  Transaction tx=null;
  try{
   //开启一个事?/span>
   tx=session.beginTransaction();
           //具体业务操作
   session.save(person);
   tx.commit();
   
  }catch(HibernateException ex){
   if(tx!=null){
    tx.rollback();
   }
  }
  finally{
   session.close();
  }
 }
}

package com.wyq.test;

import java.net.URL;
import java.util.*;

public class PropertyReader {
    
public static Properties getProperties(String propertyFile) {
        
try {
            URL url 
= getPropertiesURL(propertyFile);
            
return getProperties(url);
        }

        
catch (Exception e) {
            
return null;
        }

    }


    
public static URL getPropertiesURL(String fileName) {
        
try {
            URL url 
= null;
            url 
= PropertyReader.class.getResource("/" + fileName);
            String s 
= url.toString();
            
return url;
        }

        
catch (Exception e) {
            
return null;
        }

    }

    
public static Properties getProperties(URL url) {
        
try {
            Properties props 
= new Properties();
            props.load(url.openStream());
            
return props;
        }

        
catch (Exception e) {
            
return null;
        }

    }

}





]]>
StringTokenizercȝ用法 http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163296.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:50:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163296.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163296.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163296.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163296.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163296.htmlStringTokenizercȝ主要用途是字W串以定界符为界Q分析ؓ一个个的tokenQ可理解为单词)Q定界符可以自己指定?
     构造器有下面三UŞ式:
     ·public StringTokenizer(String str,String delim,boolean returnTokens);
     ·public StringTokenizer(String str,String delim);
     ·public StringTokenizer(String str);
     其中Qstr为需分析的字W串Qdelim为定界符QTokens描述是否定界符作ؓ一个token?
     常用的方法有Q?
     ·public boolean hasMoreTokens(); //判断字符串中是含q有token
     ·public String nextToken(); //StringTokenizer对象中的下一个token?
     ·public String nextToken(String delim) //delim为新的定界符

例子:
import java.io.*;
     impoort java.util.*;
        public class DemoStringTokenizer
        {
              public static void main(String[] args)
              {
                  String aString Q?word1 word2 word3";
                  StringTokenizer parser =new StringTokenizer(aString);
                  while(parser.hasMoreTokens()) {
                      System.out.println(parser.nextToken());
                  }
              }
          }



]]>
用java实现外部调用exe文g http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163293.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:49:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163293.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163293.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163293.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163293.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163293.html调用其他的可执行文gQ例如:自己制作的exeQ或是下载安装的软g

public void RunBat(String filepath)throws Exception{
        String str=filepath+"execute.bat";
        try{
            Process p=Runtime.getRuntime().exec(str);
            InputStream in=p.getInputStream();
            int c;
            while((c=in.read())!=-1){
                System.out.print(c);
            }
            in.close();
            p.waitFor();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

]]>
java文g操作 http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163294.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:49:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163294.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163294.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163294.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163294.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163294.html(1)目录的徏?查与删除
public void createDir(){
   String path=request.getRealPath("");
   path=path+"\sub";//要建立的目录\?br />    File d=new File(path);//建立代表sub目录的File对象Qƈ得到它的一个引?br />    if(d.exists()){
      d.delete();
      }else{
         d.mkdir();//建立sub目录
         System.out.println("sub目录不存在,已经建立");
         }
}

(2)文g的徏?查与删除
public void createFile(){
   String path=request.getRealPath("");
   File f=new File(path,"File.txt");
   if(f.exists()){//查File.txt是否存在
         f.delete();
}else{
         f.createNewFile();//在当前目录下建立一个名为File.txt的文?br /> }
}



]]>
java定时器的使用QTimerQ?/title><link>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163292.html</link><dc:creator>王永?/dc:creator><author>王永?/author><pubDate>Mon, 26 Nov 2007 09:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163292.html</guid><wfw:comment>http://www.aygfsteel.com/wyxdeniro/comments/163292.html</wfw:comment><comments>http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163292.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyxdeniro/services/trackbacks/163292.html</trackback:ping><description><![CDATA[<div style="color: #993300">1、在应用开发中Q经帔R要一些周期性的操作Q比如每5分钟执行某一操作{。对于这L操作最方便、高效的实现方式是使用java.util.Timer工具cR? <p style="color: #993300">private java.util.Timer timer; <br /> timer = new Timer(true); <br /> timer.schedule(<br /> new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操作的Ҏ } }, 0, 5*60*1000); <br />       W一个参数是要操作的ҎQ第二个参数是要讑֮延迟的时_W三个参数是周期的设定,每隔多长旉执行该操作?/p> <p style="color: #993300">    使用q几行代码之后,Timer本n会每?分钟调用一遍server.checkNewMail()ҎQ不需要自己启动线E。Timer本n也是多线E同步的Q多个线E可以共用一个TimerQ不需要外部的同步代码?</p> </div> <div style="color: #993300"></div> <div style="color: #993300">2?br /> (1)Timer.schedule(TimerTask task,Date time)安排在制定的旉执行指定的Q务?br /> (2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的Q务在指定的时间开始进行重复的固定延迟执行Q?br /> (3)Timer.schedule(TimerTask task,long delay)安排在指定gq后执行指定的Q务.<br /> (4)Timer.schedule(TimerTask task,long delay,long period)安排指定的Q务从指定的gq后开始进行重复的固定延迟执行Q?br /> (5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的Q务在指定的时间开始进行重复的固定速率执行Q?br /> (6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的Q务在指定的gq后开始进行重复的固定速率执行Q?/div> <img src ="http://www.aygfsteel.com/wyxdeniro/aggbug/163292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyxdeniro/" target="_blank">王永?/a> 2007-11-26 17:48 <a href="http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java定时器的使用QScheduler Q?http://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163291.html王永?/dc:creator>王永?/author>Mon, 26 Nov 2007 09:47:00 GMThttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163291.htmlhttp://www.aygfsteel.com/wyxdeniro/comments/163291.htmlhttp://www.aygfsteel.com/wyxdeniro/archive/2007/11/26/163291.html#Feedback0http://www.aygfsteel.com/wyxdeniro/comments/commentRss/163291.htmlhttp://www.aygfsteel.com/wyxdeniro/services/trackbacks/163291.html首先d所需要的cdQquartz-1.5.2.jarQquartz-all-1.5.2.jarQquartz-jboss-1.5.2.jar 
//讄定时作业
 public void startScheduler(HttpServletRequest requests)throws SchedulerException{
  try{
   //建立作业调度?br />    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
   //判断作业调度内是否有作业Q如果有其删除
   if (!scheduler.isShutdown()) {
                scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
            }
   //删除调度器的作业后,新徏一个我们现在要完成的作业,该作业所需要的cLReceiveJobd.class,作业名字是ReceiveOnTimes,所属分l是Scheduler.DEFAULT_GROUP
            JobDetail jobDetail = new JobDetail("ReceiveOnTimed",
                                                Scheduler.DEFAULT_GROUP,
                                                ReceiveJobd.class);

            int m = ips.length;
            int n = tablenames.length;
            //向作业内讄要传入的参数
            jobDetail.getJobDataMap().put("scheduler", scheduler);
            jobDetail.getJobDataMap().put("ipLength", m);
            jobDetail.getJobDataMap().put("tablenameLength", n);
            jobDetail.getJobDataMap().put("wcx",wc);
            for (int i = 0; i < m; i++) {
                jobDetail.getJobDataMap().put("ip" + i, ips[i]);
                for (int j = 0; j < n; j++) {
                    jobDetail.getJobDataMap().put("tablename" + j, tablenames[j]);
                }
            }
            //建立触发器,判断何时触发该作?参数发器的名Uͼ触发器分l,作业名称Q作业分l,旉讑֮
            Trigger trigger = new CronTrigger("ReceiverOnTimeTriggerd",
                                              scheduler.DEFAULT_GROUP,
                                              "ReceiveOnTimed",
                                              scheduler.DEFAULT_GROUP, time);
            //作业和触发器添加到调度?br />             scheduler.scheduleJob(jobDetail, trigger);
            //按照讄开始调?br />             scheduler.start();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 具体作业cȝ处理Q?br />  package com.bodhiya.schsystem.business;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.springframework.web.context.WebApplicationContext;

public class ReceiveJobd implements Job{
 public void ReceiveJobd(){
 }
 //作业具体实现的功?br />  public void execute(JobExecutionContext context) throws
    JobExecutionException
{
     try {
           
            //建立JobDataMap对象Q用来接收传递的参数
            JobDataMap dataMap = context.getMergedJobDataMap();
            int ipLength = dataMap.getInt("ipLength");
            int tablenameLength = dataMap.getInt("tablenameLength");
            WebApplicationContext wc=(WebApplicationContext)dataMap.get("wcx");
           
            String ip = "";
            String tablename = "";
            for (int i = 0; i < ipLength; i++) {
                ip = dataMap.getString("ip" + i);
                for (int j = 0; j < tablenameLength; j++) {
                    tablename = dataMap.getString("tablename" + j);
                    ExchangeAccess ea=new ExchangeAccess(ip,tablename,wc);
                     //启动U程
                    ea.start();
                }
            }
            Scheduler scheduler = (Scheduler) dataMap.get("scheduler");
            scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
 }
}



]]>
վ֩ģ壺 Ӧñر| | İ| | ӥ̶| ƽ| | ¡| | | | | | | ˻| ذ| | | | | | | | ˮ| Դ| | ɽ| | ǹ| | ƽ| Ѯ| | Ӵ| | | Ѩ| | | | |