<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>java开发</title>
    <description></description>
    <link>http://kuangbaoxu.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>checkbox 隐藏的特殊性</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/226514" style="color:red;">http://kuangbaoxu.javaeye.com/blog/226514</a>&nbsp;
          发表时间: 2008年08月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">/*checkbox 的hidden=true属性不能使其隐藏,但是用style.display='none'可以使其隐藏.*/

   oCheckBox.hidden=true;
   // 这个隐藏不好使.
   oCheckBox.sytle.display="none";
   // 这个隐藏好用.
/*
hidden:
    HTML N/A 
    Scripting EMBED.hidden(v) [ = sHidden ] 
*/
/*
display:
    HTML { display : sDisplay }  
    Scripting object.style.display [ = sDisplay ] 
*/
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/226514#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Aug 2008 10:32:00 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/226514</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/226514</guid>
      </item>
      <item>
        <title>http 通讯讲解</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/224161" style="color:red;">http://kuangbaoxu.javaeye.com/blog/224161</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Http客户端程序已集成在Java语言中，可以通过URLConnection类调用。遗憾的<br />是，由于SUN没有公布Http客户程序的源码，它实现的细节仍是一个谜。本文根据HTTP<br />协议规范，用Java.net.Socket类实现一个HTTP协议客户端程序。<br /><br />1.Socket类:<br />了解TCP/IP协议集通信的读者知道，协议间的通信是通过Socket完成的。在<br />Java.net包中，Socket类就是对Socket的具体实现。它通过连接到主机后，返回一个<br />I/O流，实现协议间的信息交换。<br /><br />2.HTTP协议<br />HTTP协议同其它TCP/IP协议集中的协议一样，是遵循客户/服务器模型工作的。客<br />户端发往服务端的信息格式如下:<br />------------------------------<br />请求方法URLHTTP协议的版本号<br />提交的元信息<br />**空行**<br />实体<br />------------------------------<br />请求方法是对这次连接工作的说明，目前HTTP协议已经发展到1.1版，它包括GET、<br />HEAD、POST、DELETE、OPTIONS、TRACE、PUT七种。元信息是关于当前请求的信息。通<br />过分析元信息，可以检查实体数据是否完整，接收过程是否出错，类型是否匹配等。元<br />信息的引入使HTTP协议通信更加稳妥可靠。实体是请求的具体内容。<br />将上述报文发往Web服务器，如果成功，应答格式如下:<br />--------------------------------<br />HTTP协议的版本号应答状态码应答状态码说明<br />接收的元信息<br />**空行**<br />实体<br />--------------------------------<br />以上报文发向客户端，并且接收成功，彼此间关闭连接，完成一次握手。<br />下面用最常用的GET方法，来说明具体的报文应用<br />----------------------------------<br />GEThttp://www.youhost.comHTTP/1.0<br />accept:www/source;text/html;image/gif;image/jpeg;*/*<br />User_Agent:myAgent<br />**空行**<br />-----------------------------------<br />这个报文是向www.youhost.com主机请求一个缺省HTML文档。客户端HTTP协议版本<br />号是1.0版，元信息包括可接收的文件格式，用户代理，每一段之间用回车换行符分<br />隔，最后以一个空行结束。发向服务器后，如果执行过程正常，服务器返回以下代码:<br />------------------------------------<br />HTTP/1.1200OK<br />Date:Tue,14Sep199902:19:57GMT<br />Server:Apache/1.2.6<br />Connection:close<br />Content-Type:text/html<br />**空行**<br />&lt;html>&lt;head>...&lt;/head>&lt;body>...&lt;/body>&lt;/html><br />------------------------------------<br />HTTP/1.1表示这个HTTP服务器是1.1版，200是服务器对客户请求的应答状态码，OK<br />是对应答状态码的解释，之后是这个文档的元信息和文档正文。(相关应答状态码和元<br />信息的解释请参阅Inetrnet标准草案:RFC2616)。<br /><br />Http.java<br /><br /><br /><pre name="code" class="java">importjava.net.*;
importjava.io.*;
importjava.util.Properties;
importjava.util.Enumeration;

publicclassHttp{
protectedSocketclient;
protectedBufferedOutputStreamsender;
protectedBufferedInputStreamreceiver;
protectedByteArrayInputStreambyteStream;
protectedURLtarget;
privateintresponseCode=-1;
privateStringresponseMessage="";
privateStringserverVersion="";
privatePropertiesheader=newProperties();
publicHttp(){}
publicHttp(Stringurl){
GET(url);
}

/*GET方法根据URL，会请求文件、数据库查询结果、程序运行结果等多种内容*/
publicvoidGET(Stringurl){
try{
checkHTTP(url);
openServer(target.getHost(),target.getPort());
Stringcmd="GET"+getURLFormat(target)+"HTTP/1.0\r\n"
+getBaseHeads()+"\r\n";
sendMessage(cmd);
receiveMessage();
}catch(ProtocolExceptionp){
p.printStackTrace();
return;
}catch(UnknownHostExceptione){
e.printStackTrace();
return;
}catch(IOExceptioni){
i.printStackTrace();
return;
}
}

/*
*HEAD方法只请求URL的元信息，不包括URL本身。若怀疑本机和服务器上的
*文件相同，用这个方法检查最快捷有效。
*/
publicvoidHEAD(Stringurl){
try{
checkHTTP(url);
openServer(target.getHost(),target.getPort());
Stringcmd="HEAD"+getURLFormat(target)+"HTTP/1.0\r\n"
+getBaseHeads()+"\r\n";
sendMessage(cmd);
receiveMessage();
}catch(ProtocolExceptionp){
p.printStackTrace();
return;
}catch(UnknownHostExceptione){
e.printStackTrace();
return;
}catch(IOExceptioni){
i.printStackTrace();
return;
}
}


/*
*POST方法是向服务器传送数据，以便服务器做出相应的处理。例如网页上常用的
*提交表格。
*/
publicvoidPOST(Stringurl,Stringcontent){
try{
checkHTTP(url);
openServer(target.getHost(),target.getPort());
Stringcmd="POST"+getURLFormat(target)+"HTTP/1.0\r\n"+getBaseHeads();
cmd+="Content-type:application/x-www-form-urlencoded\r\n";
cmd+="Content-length:"+content.length()+"\r\n\r\n";
cmd+=content+"\r\n";
sendMessage(cmd);
receiveMessage();
}catch(ProtocolExceptionp){
p.printStackTrace();
return;
}catch(UnknownHostExceptione){
e.printStackTrace();
return;
}catch(IOExceptioni){
i.printStackTrace();
return;
}
}

protectedvoidcheckHTTP(Stringurl)throwsProtocolException{
try{
URLtarget=newURL(url);
if(target==null||!target.getProtocol().toUpperCase().equals("HTTP"))
thrownewProtocolException("这不是HTTP协议");
this.target=target;
}catch(MalformedURLExceptionm){
thrownewProtocolException("协议格式错误");
}
}

/*
*与Web服务器连接。若找不到Web服务器，InetAddress会引发UnknownHostException
*异常。若Socket连接失败，会引发IOException异常。
*/
protectedvoidopenServer(Stringhost,intport)throws
UnknownHostException,IOException{
header.clear();
responseMessage="";responseCode=-1;
try{
if(client!=null)closeServer();
if(byteStream!=null){
byteStream.close();byteStream=null;
}
InetAddressaddress=InetAddress.getByName(host);
client=newSocket(address,port==-1?80:port);
sender=newBufferedOutputStream(client.getOutputStream());
receiver=newBufferedInputStream(client.getInputStream());
}catch(UnknownHostExceptionu){
throwu;
}catch(IOExceptioni){
throwi;
}
}

/*关闭与Web服务器的连接*/
protectedvoidcloseServer()throwsIOException{
if(client==null)return;
try{
client.close();sender.close();receiver.close();
}catch(IOExceptioni){
throwi;
}
client=null;sender=null;receiver=null;
}

protectedStringgetURLFormat(URLtarget){
Stringspec="http://"+target.getHost();
if(target.getPort()!=-1)
spec+=":"+target.getPort();
returnspec+=target.getFile();
}

/*向Web服务器传送数据*/
protectedvoidsendMessage(Stringdata)throwsIOException{
sender.write(data.getBytes(),0,data.length());
sender.flush();
}

/*接收来自Web服务器的数据*/
protectedvoidreceiveMessage()throwsIOException{
bytedata[]=newbyte[1024];
intcount=0;
intword=-1;
//解析第一行
while((word=receiver.read())!=-1){
if(word=='\r'||word=='\n'){
word=receiver.read();
if(word=='\n')word=receiver.read();
break;
}
if(count==data.length)data=addCapacity(data);
data[count++]=(byte)word;
}
Stringmessage=newString(data,0,count);
intmark=message.indexOf(32);
serverVersion=message.substring(0,mark);
while(mark&lt;message.length()&&message.charAt(mark+1)==32)mark++;
responseCode=Integer.parseInt(message.substring(mark+1,mark+=4));
responseMessage=message.substring(mark,message.length()).trim();

//应答状态码和处理请读者添加
switch(responseCode){
case400:
thrownewIOException("错误请求");
case404:
thrownewFileNotFoundException(getURLFormat(target));
case503:
thrownewIOException("服务器不可用");
}
if(word==-1)thrownewProtocolException("信息接收异常终止");
intsymbol=-1;
count=0;
//解析元信息
while(word!='\r'&&word!='\n'&&word>-1){
if(word=='\t')word=32;
if(count==data.length)data=addCapacity(data);
data[count++]=(byte)word;
parseLine:{
while((symbol=receiver.read())>-1){
switch(symbol){
case'\t':
symbol=32;break;
case'\r':
case'\n':
word=receiver.read();
if(symbol=='\r'&&word=='\n'){
word=receiver.read();
if(word=='\r')word=receiver.read();
}
if(word=='\r'||word=='\n'||word>32)breakparseLine;
symbol=32;break;
}
if(count==data.length)data=addCapacity(data);
data[count++]=(byte)symbol;
}
word=-1;
}
message=newString(data,0,count);
mark=message.indexOf(':');
Stringkey=null;
if(mark>0)key=message.substring(0,mark);
mark++;
while(mark&lt;message.length()&&message.charAt(mark)&lt;=32)mark++;
Stringvalue=message.substring(mark,message.length());
header.put(key,value);
count=0;
}
//获得正文数据
while((word=receiver.read())!=-1){
if(count==data.length)data=addCapacity(data);
data[count++]=(byte)word;
}
if(count>0)byteStream=newByteArrayInputStream(data,0,count);
data=null;
closeServer();
}

publicStringgetResponseMessage(){
returnresponseMessage;
}

publicintgetResponseCode(){
returnresponseCode;
}

publicStringgetServerVersion(){
returnserverVersion;
}

publicInputStreamgetInputStream(){
returnbyteStream;
}

publicsynchronizedStringgetHeaderKey(inti){
if(i>=header.size())returnnull;
Enumerationenum=header.propertyNames();
Stringkey=null;
for(intj=0;j&lt;=i;j++)
key=(String)enum.nextElement();
returnkey;
}

publicsynchronizedStringgetHeaderValue(inti){
if(i>=header.size())returnnull;
returnheader.getProperty(getHeaderKey(i));
}

publicsynchronizedStringgetHeaderValue(Stringkey){
returnheader.getProperty(key);
}

protectedStringgetBaseHeads(){
Stringinf="User-Agent:myselfHttp/1.0\r\n"+
"Accept:www/source;text/html;image/gif;*/*\r\n";
returninf;
}

privatebyte[]addCapacity(byterece[]){
bytetemp[]=newbyte[rece.length+1024];
System.arraycopy(rece,0,temp,0,rece.length);
returntemp;
}


publicstaticvoidmain(String[]args){
Httphttp=newHttp();
//http.GET("http://192.168.1.5");
inti;
for(i=0;i&lt;50000;i++){
http.GET("http://www.model-dl.com/modelinfo.asp?modelid=101");
http.POST("http://www.model-dl.com/modelinfo.asp?modelid=101","ratecontd=101&MM_insert=form1");
}
}

}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/224161#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Aug 2008 10:17:07 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/224161</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/224161</guid>
      </item>
      <item>
        <title>HTTP协议基础</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/224158" style="color:red;">http://kuangbaoxu.javaeye.com/blog/224158</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          HTTP（HyperTextTransferProtocol）是超文本传输协议的缩写，它用于传送WWW方式的数据，关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求，请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应，相应的内容包括消息协议的版本，成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。<br /><br />通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行，一个或者多个头域，一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头，请求头，响应头和实体头四个部分。每个头域由一个域名，冒号（:）和域值三部分组成。域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多行，在每行开始处，使用至少一个空格或制表符。<br /><br />通用头域<br /><br />通用头域包含请求和响应消息都支持的头域，通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展，如果存在不支持的通用头域，一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。<br /><br />Cache-Control头域<br /><br />Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached，响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下：<br /><br />Public指示响应可被任何缓存区缓存。<br />Private指示对于单个用户的整个或部分响应消息，不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息，此响应消息对于其他用户的请求无效。<br />no-cache指示请求或响应消息不能缓存<br />no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。<br />max-age指示客户机可以接收生存期不大于指定时间（以秒为单位）的响应。<br />min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。<br />max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值，那么客户机可以接收超出超时期指定值之内的响应消息。<br /><br />Date头域<br /><br />Date头域表示消息发送的时间，时间的描述格式由rfc822定义。例如，Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时，换算成本地时间，需要知道用户所在的时区。<br /><br />Pragma头域<br /><br />Pragma头域用来包含实现特定的指令，最常用的是Pragma:no-cache。在HTTP/1.1协议中，它的含义和Cache-Control:no-cache相同。<br /><br />请求消息<br /><br />请求消息的第一行为下面的格式：<br />MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法，这个字段是大小写敏感的，包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持，其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息，只是可以在响应时，不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息，可以用于提交表单，向新闻组、BBS、邮件群组和数据库发送消息。<br /><br />SP表示空格。Request-URI遵循URI格式，在此字段为星号（*）时，说明请求并不用于某个特定的资源地址，而是用于服务器本身。HTTP-Version表示支持的HTTP版本，例如为HTTP/1.1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持，如果存在不支持的请求头域，一般将会作为实体头域处理。<br /><br />典型的请求消息：<br /><br /><br />GEThttp://class/download.microtool.de:80/somedata.exe<br />Host:download.microtool.de<br />Accept:*/*<br />Pragma:no-cache<br />Cache-Control:no-cache<br />Referer:http://class/download.microtool.de/<br />User-Agent:Mozilla/4.04[en](Win95;I;Nav)<br />Range:bytes=554554-<br /><br />上例第一行表示HTTP客户端（可能是浏览器、下载程序）通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息，绿色的部分表示通用头部分。<br /><br />Host头域<br /><br />Host头域指定请求资源的Intenet主机和端口号，必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域，否则系统会以400状态码返回。<br /><br />Referer头域<br /><br />Referer头域允许客户端指定请求uri的源资源地址，这可以允许服务器生成回退链表，可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址，Referer不能被发送。如果指定的是部分uri地址，则此地址应该是一个相对地址。<br /><br />Range头域<br /><br />Range头域可以请求实体的一个或者多个子范围。例如，<br /><br />表示头500个字节：bytes=0-499<br />表示第二个500字节：bytes=500-999<br />表示最后500个字节：bytes=-500<br />表示500字节以后的范围：bytes=500-<br />第一个和最后一个字节：bytes=0-0,-1<br />同时指定几个范围：bytes=500-600,601-999<br /><br />但是服务器可以忽略此请求头，如果无条件GET包含Range请求头，响应会以状态码206（PartialContent）返回而不是以200（OK）。<br /><br />User-Agent头域<br /><br />User-Agent头域的内容包含发出请求的用户信息。<br /><br />响应消息<br /><br />响应消息的第一行为下面的格式：<br /><br />HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF<br />HTTP-Version表示支持的HTTP版本，例如为HTTP/1.1。Status-Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别，Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别，后两个数字没有分类的作用。第一个数字可能取5个不同的值：<br /><br />1xx:信息响应类，表示接收到请求并且继续处理<br />2xx:处理成功响应类，表示动作被成功接收、理解和接受<br />3xx:重定向响应类，为了完成指定的动作，必须接受进一步处理<br />4xx:客户端错误，客户请求包含语法错误或者是不能正确执行<br />5xx:服务端错误，服务器不能正确执行一个正确的请求<br /><br />响应头域允许服务器传递不能放在状态行的附加信息，这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持，如果存在不支持的响应头域，一般将会作为实体头域处理。<br /><br />典型的响应消息：<br /><br /><br />HTTP/1.0200OK<br />Date:Mon,31Dec200104:25:57GMT<br />Server:Apache/1.3.14(Unix)<br />Content-type:text/html<br />Last-modified:Tue,17Apr200106:46:28GMT<br />Etag:"a030f020ac7c01:1e9f"<br />Content-length:39725426<br />Content-range:bytes554554-40279979/40279980<br />上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息，绿色的部分表示通用头部分，红色的部分表示实体头域的信息。<br /><br />Location响应头<br /><br />Location响应头用于重定向接收者到一个新URI地址。<br /><br />Server响应头<br /><br />Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释，产品标识一般按照重要性排序。<br /><br />实体<br /><br />请求消息和响应消息都可以包含实体信息，实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息，实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头，但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流，它的编码方式由Content-Encoding或Content-Type定义，它的长度由Content-Length或Content-Range定义。<br /><br />Content-Type实体头<br /><br />Content-Type实体头用于向接收方指示实体的介质类型，指定HEAD方法送到接收方的实体介质类型，或GET方法发送的请求介质类型Content-Range实体头<br /><br />Content-Range实体头用于指定整个实体中的一部分的插入位置，他也指示了整个实体的长度。在服务器向客户返回一个部分响应，它必须描述响应覆盖的范围和整个实体长度。一般格式：<br /><br />Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth<br />例如，传送头500个字节次字段的形式：Content-Range:bytes0-499/1234如果一个http消息包含此节（例如，对范围请求的响应或对一系列范围的重叠请求），Content-Range表示传送的范围，Content-Length表示实际传送的字节数。<br /><br />Last-modified实体头<br /><br />Last-modified实体头指定服务器上保存内容的最后修订时间。
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/224158#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Aug 2008 10:13:55 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/224158</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/224158</guid>
      </item>
      <item>
        <title>HTTP协议状态码的含义</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/224157" style="color:red;">http://kuangbaoxu.javaeye.com/blog/224157</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul><li>"100":Continue</li><li>"101":witchingProtocols</li><li>"200":OK</li><li>"201":Created</li><li>"202":Accepted</li><li>"203":Non-AuthoritativeInformation</li><li>"204":NoContent</li><li>"205":ResetContent</li><li>"206":PartialContent</li><li>"300":MultipleChoices</li><li>"301":MovedPermanently</li><li>"302":Found</li><li>"303":SeeOther</li><li>"304":NotModified</li><li>"305":UseProxy</li><li>"307":TemporaryRedirect</li><li>"400":BadRequest</li><li>"401":Unauthorized</li><li>"402":PaymentRequired</li><li>"403":Forbidden</li><li>"404":NotFound</li><li>"405":MethodNotAllowed</li><li>"406":NotAcceptable</li><li>"407":ProxyAuthenticationRequired</li><li>"408":RequestTime-out</li><li>"409":Conflict</li><li>"410":Gone</li><li>"411":LengthRequired</li><li>"412":PreconditionFailed</li><li>"413":RequestEntityTooLarge</li><li>"414":Request-URITooLarge</li><li>"415":UnsupportedMediaType</li><li>"416":Requestedrangenotsatisfiable</li><li>"417":ExpectationFailed</li><li>"500":InternalServerError</li><li>"501":NotImplemented</li><li>"502":BadGateway</li><li>"503":ServiceUnavailable</li><li>"504":GatewayTime-out</li><li>"505":HTTPVersionnotsupported</li></ul>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/224157#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Aug 2008 10:11:39 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/224157</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/224157</guid>
      </item>
      <item>
        <title>javascript 字符串链接效率解决办法</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/222886" style="color:red;">http://kuangbaoxu.javaeye.com/blog/222886</a>&nbsp;
          发表时间: 2008年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="html">
&lt;html>
	&lt;head>
		&lt;SCRIPT LANGUAGE="JavaScript">
		&lt;!--
			function StringBuffer()
			{
				this._strings_= new Array();
			}
			StringBuffer.prototype.append = function (str)
			{
				this._strings_.push(str);
			}
			StringBuffer.prototype.toString = function ()
			{
				return this._strings_.join("");
			}
			// 方法小试
			var str = "";
			var buffer = new StringBuffer();
			buffer.append("hello ");
			buffer.append("world!");
			var result = buffer.toString();
			document.write(result);
			// 测试效率
			var d1 = new Date();
			for (var i = 0; i &lt; 10000; i++)
			{
				str +="test";
			}
			var d2 = new Date();
			document.write("&lt;br/>Concatenation with plus:" + (d2.getTime() - d1.getTime()) + "milliseconds");
			var d3 = new Date();
			var oBuffer = new StringBuffer();
			for (var i = 0; i &lt; 10000; i++)
			{
				oBuffer.append("test");
			}
			var sResult = buffer.toString();
			var d4 = new Date();
			document.write("&lt;br/>Concatenation with StringBuffer:" + (d4.getTime() - d3.getTime()) + "milliseconds");
		//-->
		&lt;/SCRIPT>
	&lt;/head>
	&lt;body>
	&lt;/body>
&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/222886#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Aug 2008 16:39:27 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/222886</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/222886</guid>
      </item>
      <item>
        <title>ANT技术研究－－与VSS整合自动获取源码进行编译 </title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/218275" style="color:red;">http://kuangbaoxu.javaeye.com/blog/218275</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: darkblue">1、首先用MAVEN生成一个工程目录结构 （maven genapp）；<br />2、生成ANT基本脚本 （maven ant:generate-build）；<br />3、修改生成出来的build.xml，在其中加入下面这样的task<br />&lt;target name="getSource" depends=""><br />  &lt;vssget vsspath="${vss.path}/src" localpath="./src" login="userid,password" <br />   ssdir="${vss.ssdir}" serverPath="${vss.svrdir}" <br />      autoresponse="Y" recursive="true" quiet="true"/><br />&lt;vsslabel vsspath="${vss.path}" login="userid,password" ssdir="${vss.ssdir}"<br />   serverPath="${vss.svrdir}" label="1.0 beta1" autoresponse="Y"/><br />&lt;/target><br /><br />其中几个参数需要说明：<br />1、${vss.path}suorcesafe中源码的路径<br />2、${vss.ssdir}包含ss.exe的路径<br />3、${vss.svrdir}包含srcsafe.ini文件的路径，如果是局域网的其他机器要先映射本地驱动器；<br /><br />另外两个标签要说的是：<br />1、vssget 相当于get latest(获取最新的源码)<br />2、vsslabel 在获取源码之后给你的项目打一个label </span>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/218275#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 16:58:05 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/218275</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/218275</guid>
      </item>
      <item>
        <title>Unsupported major.minor version</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/218095" style="color:red;">http://kuangbaoxu.javaeye.com/blog/218095</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: darkblue">当你在编译Java时，遇到Unsupported major.minor version类似如下问题提示：<br />Unsupported major.minor version 50.0<br />Unsupported major.minor version 49.0<br />Unsupported major.minor version 48.0<br />均属于Java版本问题，即JDK版本过低，只要选择相对应的JDK版本编译即可。<br />48，49，50是Java编译器内部的版本号<br />Unsupported major.minor version 50.0 对应于 JDK1.6（JRE1.6）<br />Unsupported major.minor version 49.0 对应于 JDK1.5（JRE1.5）<br />Unsupported major.minor version 48.0 对应于 JDK1.4（JRE1.4）<br />问题解决方法就是重新用老的JDK1.4编译，并在JDK1.4的环境下（包括修改JAVA_HOME,PATH,CLASSPATH）运行（可能造成Web应用程序失败）<br />JDK版本的不兼容给所有的Java开发人员带来了很多麻烦。</span>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/218095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 13:40:13 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/218095</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/218095</guid>
      </item>
      <item>
        <title>Spring中常用事务类型</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/216824" style="color:red;">http://kuangbaoxu.javaeye.com/blog/216824</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: darkblue"><ul><li>PROPAGATION_REQUIRED--支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。 </li><li>PROPAGATION_SUPPORTS--支持当前事务，如果当前没有事务，就以非事务方式执行。 </li><li>PROPAGATION_MANDATORY--支持当前事务，如果当前没有事务，就抛出异常。 </li><li>PROPAGATION_REQUIRES_NEW--新建事务，如果当前存在事务，把当前事务挂起。 </li><li>PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。 </li><li>PROPAGATION_NEVER--以非事务方式执行，如果当前存在事务，则抛出异常。 </li><li>PROPAGATION_NESTED--如果当前存在事务，则在嵌套事务内执行。如果当前没有事务，则进行与PROPAGATION_REQUIRED类似的操作。</li></ul></span>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/216824#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jul 2008 10:48:34 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/216824</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/216824</guid>
      </item>
      <item>
        <title>a link 标签的disabled属性实现disabled</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/214564" style="color:red;">http://kuangbaoxu.javaeye.com/blog/214564</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.由于alink是disabled属性设置成true,只是颜色变灰色但是还能提交.要想不能提交,不许删除href属性.代码如下<br /><pre name="code" class="java">
     var aLinkArr = document.getElementsByTagName("a"); 
     for(var j = 0; j &lt; aLinkArr.length; j++)
     {	
     	if(!aLinkArr[j].disabled)
     	{
	     	aLinkArr[j].disabled = true;
	     	aLinkArr[j].removeAttribute('href');
     	}
     }
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/214564#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 14:17:24 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/214564</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/214564</guid>
      </item>
      <item>
        <title>struts token 机制</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/214561" style="color:red;">http://kuangbaoxu.javaeye.com/blog/214561</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Struts的Token（令牌）机制能够很好的解决表单重复提交的问题，基本原理是：服务器端在处理到达的请求之前，会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较，看是否匹配。在处理完该请求后，且在答复发送给客户端之前，将会产生一个新的令牌，该令牌除传给客户端以外，也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和服务器端的令牌不一致，从而有效地防止了重复提交的发生<br /><br />这时其实也就是两点:<br />   第一：你需要在请求中有这个令牌值，请求中的令牌值如何保存，其实就和我们平时在页面中保存一些信息是一样的，通过隐藏字段来保存，保存的形式如： 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，这个value是TokenProcessor类中的generateToken()获得的，是根据当前用户的session id和当前时间的long值来计算的。<br />   第二：在客户端提交后，我们要根据判断在请求中包含的值是否和服务器的令牌一致，因为服务器每次提交都会生成新的Token，所以，如果是重复提交，客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。<br />在Action中的add方法中，我们需要将Token值明确的要求保存在页面中，只需增加一条语句：saveToken(request);如下所示： <br /><br /><pre name="code" class="java">public ActionForward add(ActionMapping mapping, ActionForm form, 
HttpServletRequest request, HttpServletResponse response)
//前面的处理省略
saveToken(request);
return mapping.findForward("add");
}
/*在Action的insert方法中，我们根据表单中的Token值与服务器端的Token值比较，如下所示：*/
public ActionForward insert(ActionMapping mapping, ActionForm form, 
HttpServletRequest request, HttpServletResponse response)
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/214561#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 14:08:19 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/214561</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/214561</guid>
      </item>
      <item>
        <title>事件设计模式 </title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/213976" style="color:red;">http://kuangbaoxu.javaeye.com/blog/213976</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. 事件设计概述 <br /><br />    事件机制可以是程序逻辑更加清晰可见，在JavaScript中很多对象都有自己的事件，如：button有onclick事件，selcet有onchange事件。对于我们自己设计的类，是否也可以有事件机制呢？答案是肯定的。我们可以通过事件机制，将类设计为独立的模块，从而使其可以通过事件与外通信，提高程序的开发效率。 <br /><br />2. 不带参数的事件设计模式 <br /><br />    最简单的一种模式是将一个类的方法成员定义为事件，可以借助JavaScript的基本语法来实现，通常是一个空的方法。例如： <br /><pre name="code" class="java">
&lt;script language="javascript" type="text/javascript" >   
  
function User(){   
}   
User.prototype={   
    show:function(){   
        this.onShow();//触发onShow事件   
    },   
    onShow:function(){}//定义事件接口   
}   
var obj = new User();   
//创建obj的onShow事件处理程序   
obj.onShow = function(){   
    alert("事件触发了");   
}   
//调用obj的show方法   
obj.show();   
&lt;/script>  
</pre><br /> obj.onShow 方法在类的外部被定义，在类的内部方法 show() 中被调用，这就实现了事件机制。 <br /><br />    此设计模式应用起来简单，但有其有以下缺点： <br /><br />不能够给事件处理程序传递参数，原因是我们是在 show() 这个内部方法中调用事件处理程序的，无法知道外部的参数。 <br />每个事件接口只能绑定一个事件处理程序，而内部方法则可以使用 attachEvent 或 addEventListener 方法绑定多个处理程序。 <br />3. 给事件处理程序传递参数 <br /><br />    给事件处理程序传递参数不仅是自定义事件中存在的问题，也是系统内部对象的事件机制中存在的问题，因为事件机制仅传递一个函数名称，不带有任何参数信息，所以无法传递参数进去。例如： <br /><pre name="code" class="java">
&lt;script language="javascript" type="text/javascript" >   
function User(){   
}   
User.prototype={   
    show:function(){   
        this.onShow();//触发onShow事件   
    },   
    onShow:function(){}//定义事件接口   
}   
var obj = new User();   
//创建obj的onshow事件处理程序   
function objOnShow(userName){   
    alert("hello,"+userName);   
}   
//定义username变量   
var userName = "plkong";   
//绑定obj的onshow事件   
obj.onShow = objOnShow;//无法将userName这个变量传递进去   
obj.show();   
&lt;/script>  
</pre><br /><br />&lt;script language="javascript" type="text/javascript" ><br />function User(){<br />}<br />User.prototype={<br />	show:function(){<br />		this.onShow();//触发onShow事件<br />	},<br />	onShow:function(){}//定义事件接口<br />}<br />var obj = new User();<br />//创建obj的onshow事件处理程序<br />function objOnShow(userName){<br />	alert("hello,"+userName);<br />}<br />//定义username变量<br />var userName = "plkong";<br />//绑定obj的onshow事件<br />obj.onShow = objOnShow;//无法将userName这个变量传递进去<br />obj.show();<br />&lt;/script>  上面的程序是无法传递参数进去的，为了解决这个问题，我们可以从相反的思维方式去考虑问题。不考虑怎么把参数传递进去，而是考虑如何构建一个无需参数的事件处理程序。我们看看先看看下面的函数：<br /><pre name="code" class="java">
/* 将参数的函数封装为无参数的函数 */  
    function createFunction(obj, strFunc)
    {   
	    var args = [];//定义args用于存储传递给事件处理程序的参数   
	    if(!obj) obj = window;//如果是全局函数则obj = window;   
	    //得到传递给事件处理程序的参数   
	    for( var i = 2; i&lt;arguments.length; i++)   
	        args.push(arguments[i]);   
	    //用无参函数封装事件处理程序的调用   
	    /*  
	    JavaScript为函数对象定义了两个方法：apply 和 call， 它们的作用都是函数绑定到另外一个对象上运行。  
	    */  
	    return function()
	    {   
        	obj[strFunc].apply(obj, args);//将参数传递给指定的事件处理程序   
        }   
	}   
</pre><br /> 该方法将一个有参数的函数封装为一个无参数的函数，不仅对全局函数适用，作为对象方法存在的函数也是适用的。该方法首先接收两个参数：obj 和 strFunc ，obj 表示事件处理程序所在的对象； strFunc 表示事件处理程序的名称。程序中还利用了arguments对象（arguments是传递给函数的隐含参数，arguments对象存储的是实际传递给函数的参数，而且不局限与函数声明所定义的形参列表。关于arguments对象可以参考其他资料）处理第二个参数以后的隐式参数，即未定义为形参的参数， <br /><br />    例如：事件处理程序 <br /><br />    someObject.eventHandler = function(_arg1, _arg2){ <br /><br />                   //事件处理代码<br /><br /><br />} <br /><br />    应该调用：creatFunction(someObject, "eventHander", arg1, arg2); <br /><br />    这样就返回一个无参数的函数，在返回的函数中已经包括了传递进去的参数。如果是全局函数作为事件处理程序，事实上它是window 对象的一个方法，所以可以传递window对象作为obj参数，为了更清晰一点，也可以指定obj为null， creatFunction函数内部会自动认为该函数是全局函数，从而自动吧obj赋值为window。最后完成的代码如下：<br /><pre name="code" class="java">
function User()
	{   
	}   
	User.prototype=
	{   
	    show:function()
	    {   
	        this.onShow();//触发onShow事件   
	    },   
	    onShow:function(){}//定义事件接口   
	}   
	var obj = new User();   
	//创建obj的onshow事件处理程序   
	function objOnShow(userName)
	{   
	    alert("hello,"+userName);   
	}   
	//定义username变量   
	var userName = "plkong";   
	//绑定obj的onshow事件   
	//obj.onShow = objOnShow;//无法将userName这个变量传递进去   
	obj.onShow = createFunction(null, "objOnShow", userName);   
	obj.show();  
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/213976#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 16:24:05 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/213976</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/213976</guid>
      </item>
      <item>
        <title>oracle 91 调用java代码</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/213688" style="color:red;">http://kuangbaoxu.javaeye.com/blog/213688</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.coder<br /><pre name="code" class="java">
create or replace and compile java source named Hello as   
  
  
public class Hello {   
     
  public static String sayHello(String name){   
    return "hello,"+name;   
  }   
  
}  

</pre><br />2.coder<br /><pre name="code" class="java">
create or replace function execHello(cmd varchar2) return varchar2   
  as language java   
  name 'Hello.sayHello(java.lang.String) return varchar2';  
</pre><br />3.coder<br /><pre name="code" class="java">
select execHello('kusix') from MDSYS.CS_SRS where rownum&lt;2  
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/213688#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 21:06:43 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/213688</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/213688</guid>
      </item>
      <item>
        <title>LookupDispatchAction 用法</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/213687" style="color:red;">http://kuangbaoxu.javaeye.com/blog/213687</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.html 代码<br /><pre name="code" class="java">
 &lt;html:form action="/test" method="post">
     &lt;html:submit property="action">
            &lt;bean:message key="toone"/>
      &lt;/html:submit>&lt;br>
     &lt;html:submit property="action">
            &lt;bean:message key="totwo"/>
     &lt;/html:submit>
  &lt;/html:form>
</pre><br />2.java 代码<br /><pre name="code" class="java">
public ActionForward one(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) 
{
    TestForm testForm = (TestForm) form;
    return mapping.findForward("toone");
} 
public ActionForward two(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) 
{
    TestForm testForm = (TestForm) form;
    return mapping.findForward("totwo");
}
 @Override
 protected Map getKeyMethodMap() 
{
   Map map = new HashMap();
   map.put("toone", "one");
   map.put("totwo", "two");
   return map;
 }

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/213687#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 20:53:52 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/213687</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/213687</guid>
      </item>
      <item>
        <title>js 去掉前后的空格</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/213596" style="color:red;">http://kuangbaoxu.javaeye.com/blog/213596</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">function trim(s)
{
    try
    {
        return s.replace(/^\s+|\s+$/g,"");
    }
    catch(e)
    {
        return s;
    }
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/213596#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 18:09:54 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/213596</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/213596</guid>
      </item>
      <item>
        <title>两种方法删除ArrayList里重复元素</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/213503" style="color:red;">http://kuangbaoxu.javaeye.com/blog/213503</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.方法一:<br /><pre name="code" class="java">
/** List order not maintained **/

  public static void removeDuplicate(ArrayList arlList)
  {
   HashSet h = new HashSet(arlList);
   arlList.clear();
   arlList.addAll(h);
  }


</pre><br />2.方法二:<br /><pre name="code" class="java">
/** List order maintained **/

public static void removeDuplicateWithOrder(ArrayList arlList)
 {
 Set set = new HashSet();
 List newList = new ArrayList();
 for (Iterator iter = arlList.iterator();    iter.hasNext(); ) {
 Object element = iter.next();
   if (set.add(element))
      newList.add(element);
    }
    arlList.clear();
    arlList.addAll(newList);
}

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/213503#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 16:00:00 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/213503</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/213503</guid>
      </item>
      <item>
        <title>struts form scope 原理</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/212989" style="color:red;">http://kuangbaoxu.javaeye.com/blog/212989</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
protected ActionForm processActionForm(HttpServletRequest request,    
                                           HttpServletResponse response,    
                                           ActionMapping mapping) {    
   
        // Create (if necessary) a form bean to use    
        //（如果有必要）创建一个新的formbean, 现在请看下面的RequestUtils.createActionForm源码     
        ActionForm instance = RequestUtils.createActionForm    
            (request, mapping, moduleConfig, servlet);    
        if (instance == null) {    
            return (null);    
        }    
   
        // Store the new instance in the appropriate scope    
    //把新的实例存储在合适的范围内(根据action配置的时指定的scope的值)    
        if (log.isDebugEnabled()) {    
            log.debug(" Storing ActionForm bean instance in scope '" +    
                mapping.getScope() + "' under attribute key '" +    
                mapping.getAttribute() + "'");    
        }    
        //    
        if ("request".equals(mapping.getScope())) {    
            request.setAttribute(mapping.getAttribute(), instance);    
        } else {    
            HttpSession session = request.getSession();    
            session.setAttribute(mapping.getAttribute(), instance);    
        }    
        return (instance);    
   
    }   

</pre><br /><pre name="code" class="java">
public static ActionForm createActionForm(    
            HttpServletRequest request,    
            ActionMapping mapping,    
            ModuleConfig moduleConfig,    
            ActionServlet servlet) {    
   
        // Is there a form bean associated with this mapping?    
        String attribute = mapping.getAttribute();    
        if (attribute == null) {    
            return (null);    
        }    
   
        // Look up the form bean configuration information to use    
        String name = mapping.getName();    
        FormBeanConfig config = moduleConfig.findFormBeanConfig(name);    
        if (config == null) {    
            log.warn("No FormBeanConfig found under '" + name + "'");    
            return (null);    
        }    
        //根据 action 配置从request或session中获得form bean 实例，如果指定scope="request"     
    //那么每次请求都是新的Request实例，那么也就不会有form bean 实例，该方法将返回null    
        ActionForm instance = lookupActionForm(request, attribute, mapping.getScope());    
   
        // Can we recycle the existing form bean instance (if there is one)?    
    //可以重复使用一个已经存在的form bean 实例么    
        try {    
        //instance != null 且 instance 是 type 是 DynaActionForm 或 ActionForm 时返回form bean实例    
        //这里应该是scope="session"的情况吧，formbean保持上次请求的状态    
            if (instance != null && canReuseActionForm(instance, config)) {    
                return (instance);    
            }    
        } catch(ClassNotFoundException e) {    
            log.error(servlet.getInternal().getMessage("formBean", config.getType()), e);    
            return (null);    
        }    
   
        //返回一个新创建的form bean 实例()    
        return createActionForm(config, servlet);    
    }    
        
    private static ActionForm lookupActionForm(HttpServletRequest request, String attribute, String scope)    
    {    
        // Look up any existing form bean instance    
        if (log.isDebugEnabled()) {    
            log.debug(    
                    " Looking for ActionForm bean instance in scope '"   
                    + scope    
                    + "' under attribute key '"   
                    + attribute    
                    + "'");    
        }    
        ActionForm instance = null;    
        HttpSession session = null;    
        if ("request".equals(scope)) {    
            instance = (ActionForm) request.getAttribute(attribute);    
        } else {    
            session = request.getSession();    
            instance = (ActionForm) session.getAttribute(attribute);    
        }    
   
        return (instance);    
    }    

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/212989#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 11:17:46 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/212989</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/212989</guid>
      </item>
      <item>
        <title>XMLHttpRequest</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/212795" style="color:red;">http://kuangbaoxu.javaeye.com/blog/212795</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容见附件
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/212795#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 16:57:00 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/212795</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/212795</guid>
      </item>
      <item>
        <title>使用Javascript和DOM Interfaces来处理HTML</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/212792" style="color:red;">http://kuangbaoxu.javaeye.com/blog/212792</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于内容见附件！
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/212792#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 16:53:39 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/212792</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/212792</guid>
      </item>
      <item>
        <title>html表格自动换行</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/212789" style="color:red;">http://kuangbaoxu.javaeye.com/blog/212789</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用表格做网页排版的时候，一般都能正常使用。偏偏有时会碰到一段连续的英文词或者一堆感叹号(!!!)把网页就撑开的现象：（ <br />总结了一下，只要在CSS中定义了如下句子，可保网页不会再被撑开了。 <br />table{table-layout: fixed;} <br />td{word-break: break-all; word-wrap:break-word;} <br />注释一下： <br />1.第一条table{table-layout: fixed;}，此样式可以让表格中有!!!(感叹号)之类的字符时自动换行。 <br />2.td{word-break: break-all}，一般用这句这OK了，但在有些特殊情况下还是会撑开，因此需要再加上后面一句(word-wrap:break-word;)就可以解决。此样式可以让表格中的一些连续的英文单词自动换行。 <br /><br />语法： <br /><br />word-break : normal | break-all | keep-all <br /><br />参数： <br /><br />normal : 　依照亚洲语言和非亚洲语言的文本规则，允许在字内换行 <br />break-all : 　该行为与亚洲语言的normal相同。也允许非亚洲语言文本行的任意字内断开。该值适合包含一些非亚洲文本的亚洲文本 <br />keep-all : 　与所有非亚洲语言的normal相同。对于中文，韩文，日文，不允许字断开。适合包含少量亚洲文本的非亚洲文本 <br /><br /><br />语法： <br /><br />word-wrap : normal | break-word <br /><br />参数： <br /><br />normal : 　允许内容顶开指定的容器边界 <br />break-word : 　内容将在边界内换行。如果需要，词内换行（word-break）也行发生 <br /><br />说明： <br /><br />设置或检索当当前行超过指定容器的边界时是否断开转行。 <br />对应的脚本特性为word-wrap。请参阅我编写的其他书目。 <br /><br /><br /><br />语法： <br /><br />table-layout : auto | fixed <br /><br />参数： <br /><br />auto : 　默认的自动算法。布局将基于各单元格的内容。表格在每一单元格读取计算之后才会显示出来。速度很慢 <br />fixed : 　固定布局的算法。在这算法中，水平布局是仅仅基于表格的宽度，表格边框的宽度，单元格间距，列的宽度，而和表格内容无关 <br /><br />说明： <br /><br />设置或检索表格的布局算法。 <br />对应的脚本特性为tableLayout。
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/212789#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 16:49:35 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/212789</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/212789</guid>
      </item>
      <item>
        <title>JavaScript Object Notation 学习1 (转贴)</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210775" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210775</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JSON （JavaScript Object Notation）一种简单的数据格式，比xml更轻巧。 JSON 是 JavaScript 原生格式，这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。 <br />JSON的规则很简单： 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”（左括号）开始，“}”（右括号）结束。每个“名称”后跟一个“:”（冒号）；“‘名称/值’ 对”之间使用“,”（逗号）分隔。具体细节参考http://www.json.org/json-zh.html<br /><br />举个简单的例子：<br /><pre name="code" class="JS">
function showJSON() {   
    var user =    
    {    
        "username":"andy",   
        "age":20,   
        "info": { "tel": "123456", "cellphone": "98765"},   
        "address":   
            [   
                {"city":"beijing","postcode":"222333"},   
                {"city":"newyork","postcode":"555666"}   
            ]   
    }   
       
    alert(user.username);   
    alert(user.age);   
    alert(user.info.cellphone);   
    alert(user.address[0].city);   
    alert(user.address[0].postcode);   
}  
</pre><br />这表示一个user对象，拥有username, age, info, address 等属性。<br /><br />同样也可以用JSON来简单的修改数据，修改上面的例子<br /><pre name="code" class="JS">
function showJSON() {   
    var user =    
    {    
        "username":"andy",   
        "age":20,   
        "info": { "tel": "123456", "cellphone": "98765"},   
        "address":   
            [   
                {"city":"beijing","postcode":"222333"},   
                {"city":"newyork","postcode":"555666"}   
            ]   
    }   
       
    alert(user.username);   
    alert(user.age);   
    alert(user.info.cellphone);   
    alert(user.address[0].city);   
    alert(user.address[0].postcode);   
       
    user.username = "Tom";   
    alert(user.username);   
}   
</pre><br />JSON提供了json.js包，下载http://www.json.org/json.js 后，将其引入然后就可以简单的使用object.toJSONString()转换成JSON数据。<br /><pre name="code" class="JS">
function showCar() {   
    var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow");   
    alert(carr.toJSONString());   
}   
  
function Car(make, model, year, color)       {   
     this.make  =  make;   
     this.model  =  model;   
     this.year  =  year;   
     this.color  =  color;   
}   
</pre><br />可以使用eval来转换JSON字符到Object<br /><pre name="code" class="JS">
function myEval() {   
    var str = '{ "name": "Violet", "occupation": "character" }';   
    var obj = eval('(' + str + ')');   
    alert(obj.toJSONString());   
}   

</pre><br />或者使用parseJSON()方法<br /><pre name="code" class="JS">
function myEval() {   
    var str = '{ "name": "Violet", "occupation": "character" }';   
    var obj = str.parseJSON();   
    alert(obj.toJSONString());   
}   
</pre><br />先写一个servlet (我的是servlet.ajax.JSONTest1.java)就写一句话 <br /><pre name="code" class="java">response.getWriter().print("{ \"name\": \"Violet\", \"occupation\": \"character\" }");  
</pre>再在页面中写一个ajax的请求<br /><pre name="code" class="js">
function sendRequest() {   
    var url = "/MyWebApp/JSONTest1";   
    var mailAjax = new Ajax.Request(   
        url,   
        {   
            method: 'get',   
            onComplete: jsonResponse   
        }   
    );   
}   
  
function jsonResponse(originalRequest) {   
    alert(originalRequest.responseText);   
    var myobj = originalRequest.responseText.parseJSON();   
    alert(myobj.name);   
}   
</pre><br />prototype-1.5.1.js中提供了JSON的方法，String.evalJSON(), 可以不使用json.js, 修改上面的方法<br /><pre name="code" class="js">
function jsonResponse(originalRequest) {   
    alert(originalRequest.responseText);   
    var myobj = originalRequest.responseText.evalJSON(true);   
    alert(myobj.name);   
}   

</pre><br />JSON还提供了java的jar包 http://www.json.org/java/index.html API也很简单，下面举个例子<br /><br />在javascript中填加请求参数<br /><br /><pre name="code" class="js">
function sendRequest() {   
    var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow");   
    var pars = "car=" + carr.toJSONString();   
  
    var url = "/MyWebApp/JSONTest1";   
    var mailAjax = new Ajax.Request(   
        url,   
        {   
            method: 'get',   
            parameters: pars,   
            onComplete: jsonResponse   
        }   
    );   
}   
</pre><br />使用JSON请求字符串就可以简单的生成JSONObject并进行解析,修改servlet添加JSON的处理(要使用json.jar)<br /><pre name="code" class="java">
private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException {   
        String s3 = request.getParameter("car");   
        try {   
            JSONObject jsonObj = new JSONObject(s3);   
            System.out.println(jsonObj.getString("model"));   
            System.out.println(jsonObj.getInt("year"));   
        } catch (JSONException e) {   
            e.printStackTrace();   
        }   
        response.getWriter().print("{ \"name\": \"Violet\", \"occupation\": \"character\" }");   
    }   

</pre><br />同样可以使用JSONObject生成JSON字符串，修改servlet<br /><pre name="code" class="java">
private void doService(HttpServletRequest request, HttpServletResponse response) throws IOException {   
        String s3 = request.getParameter("car");   
        try {   
            JSONObject jsonObj = new JSONObject(s3);   
            System.out.println(jsonObj.getString("model"));   
            System.out.println(jsonObj.getInt("year"));   
        } catch (JSONException e) {   
            e.printStackTrace();   
        }   
           
        JSONObject resultJSON = new JSONObject();   
        try {   
            resultJSON.append("name", "Violet")   
                      .append("occupation", "developer")   
                      .append("age", new Integer(22));   
            System.out.println(resultJSON.toString());   
        } catch (JSONException e) {   
            e.printStackTrace();   
        }   
        response.getWriter().print(resultJSON.toString());   
    }   

</pre><br /><br /><pre name="code" class="js">
function jsonResponse(originalRequest) {   
    alert(originalRequest.responseText);   
    var myobj = originalRequest.responseText.evalJSON(true);   
    alert(myobj.name);   
    alert(myobj.age);   
}  

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210775#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 21:01:30 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210775</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210775</guid>
      </item>
      <item>
        <title>javascript---类的构建</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210299" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210299</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.构造方式定义类，优点:多个实例对象不共享类的属性值，缺点:每个实例对象都会产生出一个函数say <br /><pre name="code" class="java">
//构造方式定义类，优点:多个实例对象不共享类的属性值，缺点:每个实例对象都会产生出一个函数say
function User(){
	this.username = "zhangsan";//this.不能丢
	
	this.say = function(){//this.不能丢
		alert("username:" + this.username );//this.不能丢
	}
	//下面注释的这种写法不对
//	function say(){
//		alert("username:" + this.username );
//	}
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
user1.say();//username:zhangsan,不受user对象的影响
//多个实例对象不共享类的属性值: 
//多个实例对象不共享类的属性值，如下:
function User(){
	this.username = new Array();//this.不能丢
	
	this.say = function(){//this.不能丢
		alert("username:" + this.username );//this.不能丢
	}
}

var user = new User();
user.username.push("zhangsan");
user.say();//username:zhangsan

var user1 = new User();
user1.say();//user1的username为空，不为zhangsan,因为user1的属性值不受user影响
</pre><br />2.原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享 <br />//原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享<br /><pre name="code" class="java">function User(){
}
User.prototype.username = "zhangsan";
User.prototype.say = function(){
	alert("username: " + this.username );
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
user1.say();//username:zhangsan
//类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享： 
//类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享,如下
function User(){
}
User.prototype.username = new Array();
User.prototype.say = function(){
	alert("username: " + this.username );
}

var user = new User();
user.username.push("zhangsan") ;
user.say();//username:zhangsan

var user1 = new User();
user1.say();//username:zhangsan,因为user1属性也会受到user的影响，user1和user指向同一引用，即共享同一属性
</pre><br />3.构造和原型结合方式创建类:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。 <br /><pre name="code" class="java">
//构造和原型结合方式创建类:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。
function User(){
	this.username = "zhangsan";
}
User.prototype.say = function(){
	alert("username: " + this.username );
}
var user = new User();
alert(user.username);
</pre><br />4.动态的原型方式:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的 <br /><pre name="code" class="java">
////动态的原型方式:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的

function User(){
	this.username = "zhangsan";
	
	if(typeof User.flag == "undefined"){
		alert("execute...");
		User.prototype.say = function(){
			alert("username: " + this.username );
		}
		
		User.flag = true;
	}
}

var user1 = new User();//execute...
var user2 = new User();//不会打印出execute...，则说明方法只创建了一次，即方法只会产生一个
user1.say();//username
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210299#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 21:30:35 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210299</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210299</guid>
      </item>
      <item>
        <title>javascript---类的继承 </title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210295" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210295</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.第一种方式,冒充对象的方式.(利用js里的每一个方法名都是一个Function对象) <br /><pre name="code" class="java">
//第一种方式,冒充对象的方式.(利用js里的每一个方法名都是一个Function对象)   
function Parent(username){   
    this.username = username;   
    this.say = function(){   
        alert(this.username);   
    }   
}   
  
function Child(username,password){   
       
    this.temp = Parent;//temp指向Parent所指向的地方 。 利用js里的每一个方法名都是一个Function对象,指向一个方法。   
    this.temp(username);//初始化方法里的内容   
    delete this.temp;//temp没有用了。可以直接删除掉.this不可以丢了   
       
       
    //Parent(username);//这样写表面看起来是正确的，其实是错误的。因为只有new出来的对象才有this,所以调用Parent里的this就没有值了   
       
       
    this.password = password;   
    this.hello = function(){   
        alert(this.password);   
    }   
}   
  
var parent = new Parent("zhangsan");   
parent.say();//zhangsan   
  
var child = new Child("lisi","123456");   
child.say();//lisi   
child.hello();//123456  

</pre><br />2.第二种方式：call()函数方式 <br /><br />call()函数是Function对象的一个函数，具体用法如下 <br /><pre name="code" class="java">
//call()函数是Function对象的一个函数   
//具体用法如    
function test(str){   
    alert(this.username + ","  + str);   
}   
  
var o = new Object();   
o.username = "zhangsan";   
test.call(o,"123456");//zhangsan,123456 .因为每个Function 对象都有一个call()方法，而函数名就是一个Function对象.call()函数的第一个参数是test函数里的this.  
</pre><br /><pre name="code" class="java">
function Parent(username){   
    this.username = username;   
    this.say = function(){   
        alert(this.username);   
    }   
}   
function Child(username,password){   
    Parent.call(this,username);   
    this.password = password;   
    this.hello = function(){   
        alert(this.password);   
    }   
}   
var parent = new Parent("zhangsan");   
parent.say();//zhangsan   
  
var child = new Child("lisi","123456");   
child.say();//lisi   
child.hello();//123456  
</pre><br />3.第三种实现方式:apply()函数方式，apply()和call()是一样的，只不过参数传递不同而已,apply的参数为数组 <br /><pre name="code" class="java">
//第三种实现方式:apply()函数方式，apply()和call()是一样的，只不过参数传递不同而已,apply的参数为数组   
//所以继承可以这样实现   
  
function Parent(username){   
    this.username = username;   
    this.say = function(){   
        alert(this.username);   
    }   
}   
function Child(username,password){   
    Parent.apply(this,new Array(username));   
    this.password = password;   
    this.hello = function(){   
        alert(this.password);   
    }   
}   
var parent = new Parent("zhangsan");   
parent.say();//zhangsan   
  
var child = new Child("lisi","123456");   
child.say();//lisi   
child.hello();//123456  
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210295#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 21:22:27 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210295</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210295</guid>
      </item>
      <item>
        <title>java compileClassLoader</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210293" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210293</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">import java.io.*;

/*

A CompilingClassLoader compiles your Java source on-the-fly.  It checks
for nonexistent .class files, or .class files that are older than their
corresponding source code.

*/

public class CompilingClassLoader extends ClassLoader
{
  // Given a filename, read the entirety of that file from disk
  // and return it as a byte array.
  private byte[] getBytes( String filename ) throws IOException {
    // Find out the length of the file
    File file = new File( filename );
    long len = file.length();

    // Create an array that's just the right size for the file's
    // contents
    byte raw[] = new byte[(int)len];

    // Open the file
    FileInputStream fin = new FileInputStream( file );

    // Read all of it into the array; if we don't get all,
    // then it's an error.
    int r = fin.read( raw );
    if (r != len)
      throw new IOException( "Can't read all, "+r+" != "+len );

    // Don't forget to close the file!
    fin.close();

    // And finally return the file contents as an array
    return raw;
  }

  // Spawn a process to compile the java source code file
  // specified in the 'javaFile' parameter.  Return a true if
  // the compilation worked, false otherwise.
  private boolean compile( String javaFile ) throws IOException {
    // Let the user know what's going on
    System.out.println( "CCL: Compiling "+javaFile+"..." );

    // Start up the compiler
    Process p = Runtime.getRuntime().exec( "javac "+javaFile );

    // Wait for it to finish running
    try {
      p.waitFor();
    } catch( InterruptedException ie ) { System.out.println( ie ); }

    // Check the return code, in case of a compilation error
    int ret = p.exitValue();

    // Tell whether the compilation worked
    return ret==0;
  }

  // The heart of the ClassLoader -- automatically compile
  // source as necessary when looking for class files
  public Class loadClass( String name, boolean resolve )
      throws ClassNotFoundException {

    // Our goal is to get a Class object
    Class clas = null;

    // First, see if we've already dealt with this one
    clas = findLoadedClass( name );

    //System.out.println( "findLoadedClass: "+clas );

    // Create a pathname from the class name
    // E.g. java.lang.Object => java/lang/Object
    String fileStub = name.replace( '.', '/' );

    // Build objects pointing to the source code (.java) and object
    // code (.class)
    String javaFilename = fileStub+".java";
    String classFilename = fileStub+".class";

    File javaFile = new File( javaFilename );
    File classFile = new File( classFilename );

    //System.out.println( "j "+javaFile.lastModified()+" c "+
    //  classFile.lastModified() );

    // First, see if we want to try compiling.  We do if (a) there
    // is source code, and either (b0) there is no object code,
    // or (b1) there is object code, but it's older than the source
    if (javaFile.exists() &&
         (!classFile.exists() ||
          javaFile.lastModified() > classFile.lastModified())) {

      try {
        // Try to compile it.  If this doesn't work, then
        // we must declare failure.  (It's not good enough to use
        // and already-existing, but out-of-date, classfile)
        if (!compile( javaFilename ) || !classFile.exists()) {
          throw new ClassNotFoundException( "Compile failed: "+javaFilename );
        }
      } catch( IOException ie ) {

        // Another place where we might come to if we fail
        // to compile
        throw new ClassNotFoundException( ie.toString() );
      }
    }

    // Let's try to load up the raw bytes, assuming they were
    // properly compiled, or didn't need to be compiled
    try {

      // read the bytes
      byte raw[] = getBytes( classFilename );

      // try to turn them into a class
      clas = defineClass( name, raw, 0, raw.length );
    } catch( IOException ie ) {
      // This is not a failure!  If we reach here, it might
      // mean that we are dealing with a class in a library,
      // such as java.lang.Object
    }

    //System.out.println( "defineClass: "+clas );

    // Maybe the class is in a library -- try loading
    // the normal way
    if (clas==null) {
      clas = findSystemClass( name );
    }

    //System.out.println( "findSystemClass: "+clas );

    // Resolve the class, if any, but only if the "resolve"
    // flag is set to true
    if (resolve && clas != null)
      resolveClass( clas );

    // If we still don't have a class, it's an error
    if (clas == null)
      throw new ClassNotFoundException( name );

    // Otherwise, return the class
    return clas;
  }
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210293#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 21:15:18 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210293</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210293</guid>
      </item>
      <item>
        <title>java runtime.exec() 的讲解(转贴)</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210291" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210291</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          那就首先说点Runtime类吧，他是一个与JVM运行时环境有关的类，这个类是Singleton的。我说几个自己觉得重要的地方。<br /><br />1、Runtime.getRuntime()可以取得当前JVM的运行时环境，这也是在Java中唯一一个得到运行时环境的方法。<br /><br />2、Runtime上其他大部分的方法都是实例方法，也就是说每次进行运行时调用时都要用到getRuntime方法。<br /><br />3、Runtime中的exit方法是退出当前JVM的方法，估计也是唯一的一个吧，因为我看到System类中的exit实际上也是通过调用Runtime.exit()来退出JVM的，这里说明一下Java对Runtime返回值的一般规则（后边也提到了），0代表正常退出，非0代表异常中止，这只是Java的规则，在各个操作系统中总会发生一些小的混淆。<br /><br /><br /><br />4、Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中，方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。（注意，Java中的Thread都是执行过了就不值钱的哦）<br /><br />5、说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。文档上是这样写的，当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程，在这个过程开始后，他会并行启动所有登记的shutdown hook（注意是并行启动，这就需要线程安全和防止死锁）。当shutdown过程启动后，只有通过调用halt方法才能中止shutdown的过程并退出JVM。<br /><br />那什么时候JVM会abort退出那？首先说明一下，abort退出时JVM就是停止运行但并不一定进行shutdown。这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行。<br /><br /><br />现在开始看这篇文章，呵呵。<br /><br /><br />首先讲的是Runtime.exec()方法的所有重载。这里要注意的有一点，就是public Process exec(String [] cmdArray, String [] envp);这个方法中cmdArray是一个执行的命令和参数的字符串数组，数组的第一个元素是要执行的命令往后依次都是命令的参数，envp我个人感觉应该和C中的execve中的环境变量是一样的，envp中使用的是name=value的方式。<br /><br /><br />&lt;!--[if !supportLists]-->1、 &lt;!--[endif]-->一个很糟糕的调用程序，代码如下，这个程序用exec调用了一个外部命令之后马上使用exitValue就对其返回值进行检查，让我们看看会出现什么问题。<br /><br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class BadExecJavac<br />{<br />public static void main(String args[])<br />{<br />try<br />{ <br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("javac");<br />int exitVal = proc.exitValue();<br />System.out.println("Process exitValue: " + exitVal);<br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />A run of BadExecJavac produces: <br /><br /><br />E:classescomjavaworldjpitfallsarticle2>java BadExecJavac<br />java.lang.IllegalThreadStateException: process has not exited<br />at java.lang.Win32Process.exitValue(Native Method)<br />at BadExecJavac.main(BadExecJavac.java:13)<br /><br /><br />这里看原文就可以了解，这里主要的问题就是错误的调用了exitValue来取得外部命令的返回值（呵呵，这个错误我也曾经犯过），因为exitValue这个方法是不阻塞的，程序在调用这个方法时外部命令并没有返回所以造成了异常的出现，这里是由另外的方法来等待外部命令执行完毕的，就是waitFor方法，这个方法会一直阻塞直到外部命令执行结束，然后返回外部命令执行的结果，作者在这里一顿批评设计者的思路有问题，呵呵，反正我是无所谓阿，能用就可以拉。但是作者在这里有一个说明，就是exitValue也是有好多用途的。因为当你在一个Process上调用waitFor方法时，当前线程是阻塞的，如果外部命令无法执行结束，那么你的线程就会一直阻塞下去，这种意外会影响我们程序的执行。所以在我们不能判断外部命令什么时候执行完毕而我们的程序还需要继续执行的情况下，我们就应该循环的使用exitValue来取得外部命令的返回状态，并在外部命令返回时作出相应的处理。<br /><br /><br />2、对exitValue处改进了的程序<br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class BadExecJavac2<br />{<br />public static void main(String args[])<br />{<br />try<br />{ <br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("javac");<br />int exitVal = proc.waitFor();<br />System.out.println("Process exitValue: " + exitVal);<br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />不幸的是，这个程序也无法执行完成，它没有输出但却一直悬在那里，这是为什么那？<br /><br /><br />JDK文档中对此有如此的解释：因为本地的系统对标准输入和输出所提供的缓冲池有效，所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁，甚至死锁。<br /><br /><br />文档引述完了，作者又开始批评了，他说JDK仅仅说明为什么问题会发生，却并没有说明这个问题怎么解决，这的确是个问题哈。紧接着作者说出自己的做法，就是在执行完外部命令后我们要控制好Process的所有输入和输出（视情况而定），在这个例子里边因为调用的是Javac，而他在没有参数的情况下会将提示信息输出到标准出错，所以在下面的程序中我们要对此进行处理。<br /><br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class MediocreExecJavac<br />{<br />public static void main(String args[])<br />{<br />try<br />{ <br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("javac");<br />InputStream stderr = proc.getErrorStream();<br />InputStreamReader isr = new InputStreamReader(stderr);<br />BufferedReader br = new BufferedReader(isr);<br />String line = null;<br />System.out.println("&lt;ERROR>");<br />while ( (line = br.readLine()) != null)<br />System.out.println(line);<br />System.out.println("&lt;/ERROR>");<br />int exitVal = proc.waitFor();<br />System.out.println("Process exitValue: " + exitVal);<br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br /><br />程序的运行结果为<br /><br />E:classescomjavaworldjpitfallsarticle2>java MediocreExecJavac<br />&lt;ERROR><br />Usage: javac &lt;options> &lt;source files><br /><br />where &lt;options> includes:<br />-g Generate all debugging info<br />-g:none Generate no debugging info<br />-g:{lines,vars,source} Generate only some debugging info<br />-O Optimize; may hinder debugging oｒ enlarge class files<br />-nowarn Generate no warnings<br />-verbose Output messages about what the compiler is doing<br />-deprecation Output source locations where deprecated APIs are used<br />-classpath &lt;path> Specify where to find user class files<br />-sourcepath &lt;path> Specify where to find input source files<br />-bootclasspath &lt;path> Override location of bootstrap class files<br />-extdirs &lt;dirs> Override location of installed extensions<br />-d &lt;directory> Specify where to place generated class files<br />-encoding &lt;encoding> Specify character encoding used by source files<br />-target &lt;release> Generate class files for specific VM version<br />&lt;/ERROR><br />Process exitValue: 2<br /><br /><br />哎，不管怎么说还是出来了结果，作者作了一下总结，就是说，为了处理好外部命令大量输出的情况，你要确保你的程序处理好外部命令所需要的输入或者输出。<br /><br /><br />下一个题目，当我们调用一个我们认为是可执行程序的时候容易发生的错误（今天晚上我刚刚犯这个错误，没事做这个练习时候发生的）<br /><br />import java.util.*;<br />import java.io.*;<br /><br />public class BadExecWinDir<br />{<br />public static void main(String args[])<br />{<br />try<br />{ <br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("dir");<br />InputStream stdin = proc.getInputStream();<br />InputStreamReader isr = new InputStreamReader(stdin);<br />BufferedReader br = new BufferedReader(isr);<br />String line = null;<br />System.out.println("&lt;OUTPUT>");<br />while ( (line = br.readLine()) != null)<br />System.out.println(line);<br />System.out.println("&lt;/OUTPUT>");<br />int exitVal = proc.waitFor(); <br />System.out.println("Process exitValue: " + exitVal);<br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />A run of BadExecWinDir produces: <br /><br /><br />E:classescomjavaworldjpitfallsarticle2>java BadExecWinDir<br />java.io.IOException: CreateProcess: dir error=2<br />at java.lang.Win32Process.create(Native Method)<br />at java.lang.Win32Process.&lt;init>(Unknown Source)<br />at java.lang.Runtime.execInternal(Native Method)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at BadExecWinDir.main(BadExecWinDir.java:12)<br /><br /><br />说实在的，这个错误还真是让我摸不着头脑，我觉得在windows中返回2应该是没有找到这个文件的缘故，可能windows 2000中只有cmd命令，dir命令不是当前环境变量能够解释的吧。我也不知道了，慢慢往下看吧。<br /><br />嘿，果然和作者想的一样，就是因为dir命令是由windows中的解释器解释的，直接执行dir时无法找到dir.exe这个命令，所以会出现文件未找到这个2的错误。如果我们要执行这样的命令，就要先根据操作系统的不同执行不同的解释程序command.com 或者cmd.exe。<br /><br />作者对上边的程序进行了修改<br /><br />import java.util.*;<br />import java.io.*;<br /><br />class StreamGobbler extends Thread<br />{<br />InputStream is;<br />String type;<br /><br />StreamGobbler(InputStream is, String type)<br />{<br />this.is = is;<br />this.type = type;<br />}<br /><br />public void run()<br />{<br />try<br />{<br />InputStreamReader isr = new InputStreamReader(is);<br />BufferedReader br = new BufferedReader(isr);<br />String line=null;<br />while ( (line = br.readLine()) != null)<br />System.out.println(type + ">" + line); <br />} catch (IOException ioe)<br />{<br />ioe.printStackTrace(); <br />}<br />}<br />}<br /><br />public class GoodWindowsExec<br />{<br />public static void main(String args[])<br />{<br />if (args.length &lt; 1)<br />{<br />System.out.println("USAGE: java GoodWindowsExec &lt;cmd>");<br />System.exit(1);<br />}<br /><br />try<br />{ <br />String osName = System.getProperty("os.name" );<br />String[] cmd = new String[3];<br /><br />if( osName.equals( "Windows NT" ) )<br />{<br />cmd[0] = "cmd.exe" ;<br />cmd[1] = "/C" ;<br />cmd[2] = args[0];<br />}<br />else if( osName.equals( "Windows 95" ) )<br />{<br />cmd[0] = "command.com" ;<br />cmd[1] = "/C" ;<br />cmd[2] = args[0];<br />}<br /><br />Runtime rt = Runtime.getRuntime();<br />System.out.println("Execing " + cmd[0] + " " + cmd[1] <br />+ " " + cmd[2]);<br />Process proc = rt.exec(cmd);<br />// any error message?<br />StreamGobbler errorGobbler = new <br />StreamGobbler(proc.getErrorStream(), "ERROR"); <br /><br />// any output?<br />StreamGobbler outputGobbler = new <br />StreamGobbler(proc.getInputStream(), "OUTPUT");<br /><br />// kick them off<br />errorGobbler.start();<br />outputGobbler.start();<br /><br />// any error???<br />int exitVal = proc.waitFor();<br />System.out.println("ExitValue: " + exitVal); <br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />Running GoodWindowsExec with the dir command generates: <br /><br /><br />E:classescomjavaworldjpitfallsarticle2>java GoodWindowsExec "dir *.java"<br />Execing cmd.exe /C dir *.java<br />OUTPUT> Volume in drive E has no label.<br />OUTPUT> Volume Serial Number is 5C5F-0CC9<br />OUTPUT><br />OUTPUT> Directory of E:classescomjavaworldjpitfallsarticle2<br />OUTPUT><br />OUTPUT>10/23/00 09:01p 805 BadExecBrowser.java<br />OUTPUT>10/22/00 09:35a 770 BadExecBrowser1.java<br />OUTPUT>10/24/00 08:45p 488 BadExecJavac.java<br />OUTPUT>10/24/00 08:46p 519 BadExecJavac2.java<br />OUTPUT>10/24/00 09:13p 930 BadExecWinDir.java<br />OUTPUT>10/22/00 09:21a 2,282 BadURLPost.java<br />OUTPUT>10/22/00 09:20a 2,273 BadURLPost1.java<br />... (some output omitted for brevity)<br />OUTPUT>10/12/00 09:29p 151 SuperFrame.java<br />OUTPUT>10/24/00 09:23p 1,814 TestExec.java<br />OUTPUT>10/09/00 05:47p 23,543 TestStringReplace.java<br />OUTPUT>10/12/00 08:55p 228 TopLevel.java<br />OUTPUT> 22 File(s) 46,661 bytes<br />OUTPUT> 19,678,420,992 bytes free<br />ExitValue: 0<br /><br />这里作者教了一个windows中很有用的方法，呵呵，至少我是不知道的，就是cmd.exe /C +一个windows中注册了后缀的文档名，windows会自动地调用相关的程序来打开这个文档，我试了一下，的确很好用，但是好像文件路径中有空格的话就有点问题，我加上引号也无法解决。<br /><br />这里作者强调了一下，不要假设你执行的程序是可执行的程序，要清楚自己的程序是单独可执行的还是被解释的，本章的结束作者会介绍一个命令行工具来帮助我们分析。<br /><br />这里还有一点，就是得到process的输出的方式是getInputStream，这是因为我们要从Java 程序的角度来看，外部程序的输出对于Java来说就是输入，反之亦然。<br /><br /><br />最后的一个漏洞的地方就是错误的认为exec方法会接受所有你在命令行或者Shell中输入并接受的字符串。这些错误主要出现在命令作为参数的情况下，程序员错误的将所有命令行中可以输入的参数命令加入到exec中（这段翻译的不好，凑合看吧）。下面的例子中就是一个程序员想重定向一个命令的输出。<br /><br /><br />import java.util.*;<br />import java.io.*;<br /><br />// StreamGobbler omitted for brevity<br /><br />public class BadWinRedirect<br />{<br />public static void main(String args[])<br />{<br />try<br />{ <br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("java jecho 'Hello World' > test.txt");<br />// any error message?<br />StreamGobbler errorGobbler = new <br />StreamGobbler(proc.getErrorStream(), "ERROR"); <br /><br />// any output?<br />StreamGobbler outputGobbler = new <br />StreamGobbler(proc.getInputStream(), "OUTPUT");<br /><br />// kick them off<br />errorGobbler.start();<br />outputGobbler.start();<br /><br />// any error???<br />int exitVal = proc.waitFor();<br />System.out.println("ExitValue: " + exitVal); <br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />Running BadWinRedirect produces: <br /><br /><br />E:classescomjavaworldjpitfallsarticle2>java BadWinRedirect<br />OUTPUT>'Hello World' > test.txt<br />ExitValue: 0<br /><br />程序员的本意是将Hello World这个输入重订向到一个文本文件中，但是这个文件并没有生成，jecho仅仅是将命令行中的参数输出到标准输出中，用户觉得可以像dos中重定向一样将输出重定向到一个文件中，但这并不能实现，用户错误的将exec认为是一个shell解释器，但它并不是，如果你想将一个程序的输出重定向到其他的程序中，你必须用程序来实现他。可用java.io中的包。<br /><br /><br />import java.util.*;<br />import java.io.*;<br /><br />class StreamGobbler extends Thread<br />{<br />InputStream is;<br />String type;<br />OutputStream os;<br /><br />StreamGobbler(InputStream is, String type)<br />{<br />this(is, type, null);<br />}<br /><br />StreamGobbler(InputStream is, String type, OutputStream redirect)<br />{<br />this.is = is;<br />this.type = type;<br />this.os = redirect;<br />}<br /><br />public void run()<br />{<br />try<br />{<br />PrintWriter pw = null;<br />if (os != null)<br />pw = new PrintWriter(os);<br /><br />InputStreamReader isr = new InputStreamReader(is);<br />BufferedReader br = new BufferedReader(isr);<br />String line=null;<br />while ( (line = br.readLine()) != null)<br />{<br />if (pw != null)<br />pw.println(line);<br />System.out.println(type + ">" + line); <br />}<br />if (pw != null)<br />pw.flush();<br />} catch (IOException ioe)<br />{<br />ioe.printStackTrace(); <br />}<br />}<br />}<br /><br />public class GoodWinRedirect<br />{<br />public static void main(String args[])<br />{<br />if (args.length &lt; 1)<br />{<br />System.out.println("USAGE java GoodWinRedirect &lt;outputfile>");<br />System.exit(1);<br />}<br /><br />try<br />{ <br />FileOutputStream fos = new FileOutputStream(args[0]);<br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec("java jecho 'Hello World'");<br />// any error message?<br />StreamGobbler errorGobbler = new <br />StreamGobbler(proc.getErrorStream(), "ERROR"); <br /><br />// any output?<br />StreamGobbler outputGobbler = new <br />StreamGobbler(proc.getInputStream(), "OUTPUT", fos);<br /><br />// kick them off<br />errorGobbler.start();<br />outputGobbler.start();<br /><br />// any error???<br />int exitVal = proc.waitFor();<br />System.out.println("ExitValue: " + exitVal);<br />fos.flush();<br />fos.close(); <br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />Running GoodWinRedirect produces: <br /><br /><br />E:classescomjavaworldjpitfallsarticle2>java GoodWinRedirect test.txt<br />OUTPUT>'Hello World'<br />ExitValue: 0<br /><br />这里就不多说了，看看就明白，紧接着作者给出了一个监测命令的小程序<br /><br />import java.util.*;<br />import java.io.*;<br /><br />// class StreamGobbler omitted for brevity<br /><br />public class TestExec<br />{<br />public static void main(String args[])<br />{<br />if (args.length &lt; 1)<br />{<br />System.out.println("USAGE: java TestExec "cmd"");<br />System.exit(1);<br />}<br /><br />try<br />{<br />String cmd = args[0];<br />Runtime rt = Runtime.getRuntime();<br />Process proc = rt.exec(cmd);<br /><br />// any error message?<br />StreamGobbler errorGobbler = new <br />StreamGobbler(proc.getErrorStream(), "ERR"); <br /><br />// any output?<br />StreamGobbler outputGobbler = new <br />StreamGobbler(proc.getInputStream(), "OUT");<br /><br />// kick them off<br />errorGobbler.start();<br />outputGobbler.start();<br /><br />// any error???<br />int exitVal = proc.waitFor();<br />System.out.println("ExitValue: " + exitVal);<br />} catch (Throwable t)<br />{<br />t.printStackTrace();<br />}<br />}<br />}<br /><br />对这个程序进行运行: <br />E:classescomjavaworldjpitfallsarticle2>java TestExec "e:javadocsindex.html"<br />java.io.IOException: CreateProcess: e:javadocsindex.html error=193<br />at java.lang.Win32Process.create(Native Method)<br />at java.lang.Win32Process.&lt;init>(Unknown Source)<br />at java.lang.Runtime.execInternal(Native Method)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at java.lang.Runtime.exec(Unknown Source)<br />at TestExec.main(TestExec.java:45)<br /><br />193在windows中是说这不是一个win32程序，这说明路径中找不到这个网页的关联程序，下面作者决定用一个绝对路径来试一下。<br /><br />E:classescomjavaworldjpitfallsarticle2>java TestExec <br />"e:program filesnetscapeprogramnetscape.exe e:javadocsindex.html"<br />ExitValue: 0<br /><br /><br />好用了，这个我也试了一下，用的是IE。<br /><br /><br />最后，作者总结了几条规则，防止我们在进行Runtime.exec()调用时出现错误。<br /><br /><br />&lt;!--[if !supportLists]-->1、 &lt;!--[endif]-->在一个外部进程执行完之前你不能得到他的退出状态<br /><br />&lt;!--[if !supportLists]-->2、 &lt;!--[endif]-->在你的外部程序开始执行的时候你必须马上控制输入、输出、出错这些流。<br /><br />&lt;!--[if !supportLists]-->3、 &lt;!--[endif]-->你必须用Runtime.exec()去执行程序<br /><br />&lt;!--[if !supportLists]-->4、 &lt;!--[endif]-->你不能象命令行一样使用Runtime.exec()。
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210291#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 20:59:53 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210291</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210291</guid>
      </item>
      <item>
        <title>Commons HttpClient 的Logger的开启和关闭</title>
        <author>kuangbaoxu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuangbaoxu.javaeye.com">kuangbaoxu</a>&nbsp;
          链接：<a href="http://kuangbaoxu.javaeye.com/blog/210225" style="color:red;">http://kuangbaoxu.javaeye.com/blog/210225</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在原来的log4j.properties的基础上添加 <br /><br />log4j.logger.httpclient.wire.header=INFO <br /><br />是否debug头信息 <br /><br />log4j.logger.httpclient.wire.content=INFO <br /><br />是否debug内容 <br /><br />log4j.logger.org.apache.commons.httpclient = INFO <br /><br />是否debug一下httpclient目录下的文件。 <br /><br /><br />简简单单就可以打开还是关闭是否打印头还是body等。
          <br/>
          <span style="color:red;">
            <a href="http://kuangbaoxu.javaeye.com/blog/210225#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 17:21:03 +0800</pubDate>
        <link>http://kuangbaoxu.javaeye.com/blog/210225</link>
        <guid>http://kuangbaoxu.javaeye.com/blog/210225</guid>
      </item>
  </channel>
</rss>