<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>执着的笨蛋</title>
    <description></description>
    <link>http://java-lk.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>js --- 粘贴板 、iframe操作</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/211603" style="color:red;">http://java-lk.javaeye.com/blog/211603</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近用到的两个东西<br /><br />复制粘贴：<br /><pre name="code" class="java">
&lt;script language="javascript"> 
function readTxt(){ 
	alert(window.clipboardData.getData("text")); 
} 

function setTxt(){ 
	var t=document.getElementById("txt"); 
	t.select();
	window.clipboardData.setData('text',t.value); 
} 
&lt;/script> 
&lt;input name="txt" value="测试"> 
&lt;input type="button" value="复制" onclick="setTxt()"> 
&lt;input type="button" value="读取" onclick="readTxt()">

</pre><br /><br />iframe操作：<br />aa.htm<br /><pre name="code" class="java">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
&lt;html xmlns="http://www.w3.org/1999/xhtml" >
&lt;head>
    &lt;title>Untitled Page&lt;/title>
&lt;style type="text/css">
&lt;!--
body{
margin:0px;
}
-->
&lt;/style>
&lt;/head>
&lt;body>
&lt;iframe id="ifr" name="ifr" width="100%" height="500" src="bb.htm">&lt;/iframe>
&lt;/body>
&lt;/html>
&lt;script language="javascript" type="text/javascript">

var aa_value="I'm a variant in Top window!";

var ifr_id=document.getElementById("ifr");
var ifr_window=window.frames["ifr"];

alert("Alert from Top window : Can't get iframe's variant by ifr_id, it will return :" + ifr_id.bb_var);
alert("Alert from Top window : Can't get iframe's DOM model by ifr_id ,it will return :" + ifr_id.window);
alert("Alert from Top window : Get src from id :" + ifr_id.src);
alert("Alert from Top window : Get href from window:" + ifr_window.document.location.href);

//由于bb.htm可能还未装载完成,所以,下冇的可能引发错误 
//调用iframe内的函数 ifr_window.bb();

//调用iframe内的变量
alert("Alert from Top window : " + ifr_window.bb_var);

//
alert("Alert from Top Window :" + ifr_window.document.body.innerHTML);


function aa(msg){
    alert("I'm  alerting from Top window ,and I received a msg:\n" + msg);
}
&lt;/script>
</pre><br /><br />bb.htm<br /><pre name="code" class="java">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
&lt;html xmlns="http://www.w3.org/1999/xhtml" >
&lt;head>
    &lt;title>sub frame&lt;/title>
&lt;style type="text/css">
&lt;!--
html,body{
margin:0px;
width:90%;
}
-->
&lt;/style>
&lt;/head>
&lt;body>
    I'm a sub frame!
    &lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...&lt;br />
    ...
&lt;/body>
&lt;/html>
&lt;script language="javascript" type="text/javascript">

var bb_var="I'm a  variable in ifr";
/**/
function bb(){
    alert("Alert from iframe :I'm frame ifr's function")
}

//获取父页面的变量
alert("Alert from iframe parent.ifr_id::" + parent.ifr_id);
alert("Alert from iframe parent.aa_value : " + parent.aa_value);

//通过父页面的ifr_id来改变 iframe的高度
alert("Alert from iframe : ifr's clientHeight :" +document.body.clientHeight);
parent.ifr_id.height=document.body.clientHeight;

alert("Alert from iframe : ifr's scrollHeight : " + document.body.scrollHeight);

//调用父窗体的函数:
parent.aa("I will calling a function which is Top window's ");

//改变父窗体的标题:
alert("Alert from iframe : I will changing Top window's title");
top.document.title="The title value changed";

//通过父窗体的ifr_id来改变的border 与scrolling
alert("Alert from iframe : I will change my border and scrolling :");
top.ifr_id.border=0;
top.ifr_id.scrolling="no";
&lt;/script>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/211603#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, 04 Jul 2008 16:03:45 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/211603</link>
        <guid>http://java-lk.javaeye.com/blog/211603</guid>
      </item>
      <item>
        <title>MySQL中使用存储过程[转]</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/196053" style="color:red;">http://java-lk.javaeye.com/blog/196053</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文地址：http://www.javaresearch.org/article/33716.htm<br /><br />使用CallableStatements执行存储过程<br /><br />mysql版本:5.0<br />Connector/J的版本:3.1.1以上(java.sql.CallableStatement接口已完全实现,除了getParameterMetaData()方法)<br />MySQL的存储过程语法在MySQL参考手册的"存储过程和函数"一章.<br />http://www.mysql.com/doc/en/Stored_Procedures.html<br />下面是一个存储过程,返回一个inOutParam增1后的值,以ResultSet形式传入一个字符串参数inputParam.<br />CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)<br />BEGIN<br />DECLARE z INT;<br />SET z = inOutParam + 1;<br />SET inOutParam = z;<br />SELECT inputParam;<br />SELECT CONCAT('zyxw', inputParam);<br />END<br /><br />要通过connector/J使用demoSp这个存储过程,要经过几个步骤:<br />1.Connection.prepareCall()<br /><br /><pre name="code" class="java">
import java.sql.CallableStatement; 
... 
// 
// Prepare a call to the stored procedure 'demoSp' 
// with two parameters 
// 
// Notice the use of JDBC-escape syntax ({call ...}) 
// 
CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}"); 
cStmt.setString(1, "abcdefg"); 
</pre><br /><br />Connection.prepareCall()方法非常消耗资源,因为jdbc驱动通过元数据(metadata)的获取支持输出参数.出于执行效率的考虑,应该尽可能减少不必要的prepareCall调用,重用CallableStatement对象.<br /><br />2.注册输出参数(如果有的话)<br /><br />要得到输出参数的值(创建存储过程时设置的OUT和INOUT),JDBC要求这些参数必须要在数据库操作执行之前通过registerOutputPrameter()方法设置.<br /><pre name="code" class="java">import java.sql.Types; 
... 
// 
// 下面给出了设置输出参数的几个方法 
// 
// 注册第二个参数为输出参数 
// 
cStmt.registerOutParameter(2); 
// 
// 注册第二个参数为输出参数,设定getObject得到的返回值的类型为整型 
//  
cStmt.registerOutParameter(2, Types.INTEGER); 
// 
// 注册名为"inOutParam"的参数为输出参数 
// 
cStmt.registerOutParameter("inOutParam"); 
// 
// 注册名为"inOutParam"的参数为输出参数,设定getObject得到的返回值的类型为整型 
// 
cStmt.registerOutParameter("inOutParam", Types.INTEGER); 
</pre><br />3.设置输入参数(如果有的话)<br />类似PreparedStatement的设置参数方法.<br /><pre name="code" class="java">// 设置第一个参数值 
// 
cStmt.setString(1, "abcdefg"); 
// 
// 根据名字设置参数值 
// 
cStmt.setString("inputParameter", "abcdefg"); 
// 
// 根据索引值设置输入/输出参数 
// 
cStmt.setInt(2, 1); 
// 
// 根据参数名设置输入/输出参数 
//  
// 
cStmt.setInt("inOutParam", 1); 
... 
</pre><br />4.执行CallableStatement,获取结果集合或输出参数<br />尽管CallableStatement支持Statement接口的所有执行方法(executeUpdate(),executeQuery()或execute()),最具伸缩性的方法是execute(),因为你不需要知道是否这个存储过程返回结果集合.<br /><pre name="code" class="java">... 
boolean hadResults = cStmt.execute(); 
// 
// 处理返回的结果集合 
// 
while (hadResults) { 
ResultSet rs = cStmt.getResultSet(); 
//  
... 
hadResults = cStmt.getMoreResults(); 
} 
// 
// 获取输出参数,通过索引值或参数名 
// 
// 
int outputValue = cStmt.getInt(1);  
outputValue = cStmt.getInt("inOutParam");  

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/196053#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, 23 May 2008 13:20:55 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/196053</link>
        <guid>http://java-lk.javaeye.com/blog/196053</guid>
      </item>
      <item>
        <title>动态生成Table</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/196038" style="color:red;">http://java-lk.javaeye.com/blog/196038</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在http://topic.csdn.net/t/20030823/16/2180668.html找到的，将内容进行了整理，把有用的代码留下。<br /><br /><span style="color: red">manyou的代码：</span><br /><pre name="code" class="java">
&lt;HTML>   
  &lt;BODY>   
  &lt;script>   
  hy   =   new   Object();   
    
  //   +----------------------------------------------------+   
  //   |   创建表格类 |   
  //   +----------------------------------------------------+   
  hy.cT   =   function()   
  {   
  var   args,   ot,   rc,   cc,   i,   j,   rw,   itd,   _pa,   as,   xx,   nn;   
  as   =   {'bgc':'bgcolor',   'bg':'backgorund',   'h':'height',   'cN':'className',   'oC':'onClick',   'style':'STYLE',   'oDC':'onDoubleClick',   'oMO':'onMouseOver',   'oMOu':'onMouseOut',   'oMD':'onMouseDown',   'oMU':'onMouseUp',   'w':'width',   'cp':'cellpadding',   'cs':'cellspacing',   'iH':'innerHTML',   'br':'border'};   //as::attributes初始化table,tr,td的所有属性列表   
    
  args   =   hy.cT.arguments;   //得到参数列表   
    
  _pa   =   function(obj)   //pa::public_attributes生成所有属性   
  {   
  var   nm;   
  for   (nm   in   xx)   {   //nm::name公用属性名称   
  eval('obj.'   +   nm   +   '=xx[nm]');   //为table,tr或td的属性赋值   
  }   
  if   (xx['id'])   obj.name   =   xx['id'];   //为table,tr或td的name属性赋值   
  }   
    
  //建立一个表格对象   
  ot   =   document.createElement("TABLE");   
  //表格对象属性   
    
  xx   =   [];   //清空数组   
  for   (nn   in   args[0])   xx[(as[nn]==null?nn:as[nn])]   =   args[0][nn];   //执行完后xx数组的格式举例:xx['bgcolor']   =   '#ffffaa'   
  if   (!xx['cellpadding'])   xx['cellpadding']   =   '0';   
  if   (!xx['cellspacing'])   xx['cellspacing']   =   '0';   
  if   (!xx['border'])   xx['border']   =   '0';   
  if   (!xx['width'])   xx['width']   =   '100%';   
  _pa(ot);   //生成公用属性   
  if   (args.length   ==   1)   return;   //如果参数只有一行,直接返回   
  rc   =   (args[0]['row']?args[0]['row']:1);   //rc::row_count表格行数   
  if   (rc)   cc   =   (args.length-1-rc)/rc;   //cc::colume_count表格列数   
  for   (i=0;   i&lt;rc;   i++)   {   
  xx   =   [];   //清空数组,以备下一个对象使用   
  rw   =   ot.insertRow(i);   //建立一行   
  for   (nn   in   args[(cc   +   1)*i   +   1])   xx[(as[nn]==null?nn:as[nn])]   =   args[(cc   +   1)*i   +   1][nn];   //执行完后xx数组的格式举例:xx['bgcolor']   =   '#ffffaa'   
  _pa(rw);   //生成公用属性   
  for   (j=0;   j&lt;cc;   j++)   {   
  xx   =   [];   
  //建立一列   
  itd   =   rw.insertCell(j);   //itd::insert_td::插入列   
  //TD对象属性   
  for   (nn   in   args[(cc   +   1)*i   +   2   +   j])   xx[(as[nn]==null?nn:as[nn])]   =   args[(cc   +   1)*i   +   2   +   j][nn];   //执行完后xx数组的格式举例:xx['bgcolor']   =   '#ffffaa'   
  if   (!xx['width'])   xx['width']   =   '100%';   
  _pa(itd);   //生成公用属性   
  }   
  }   
  return   ot.outerHTML;   //返回生成的表格字符串   
  };   
    
    
  //调用创建表格类   
  var   str   =   hy.cT({'row':3,   'id':'aaa',   'w':'100%',   'br':'5',   'style':'border-color:#FF3300;',   'cp':'5',   'cs':'5',   'oC':'alert()'},   
    
  {'h':111,   'oC':'alert()',   'wwwwww':'asdfasdfasdf',   'id':'x'},   
  {'id':'www',   'w':136,   'cN':'hyIc2SCL',   'iH':'lsdjfsldkjf',   'bgc':'#6666FF'},   
  {'w':4,   'iH':'ph'},   
  {'id':'bbb',   'cN':'hyIc2SCR',   'iH':'&lt;font   color=#FF0066>恍恍惚惚含含糊糊&lt;/font>'},   
    
  {'h':1},   
  {'iH':'pcbch',   'on随口的':'asdfasdfasdf',   'onselectstart':'return   false;',   'id':'qqqqq'},   
  {'iH':'pcvbxch','id':'xxx'},   
  {'iH':'pxvh','id':'www'},   
    
  {'h':1},   
  {'cN':'hyIc2SCLL',   'iH':'pxvh'},   
  {'iH':'pxcvh',   '搜索':'脸色打击法'},   
  {'cN':'hyIc2SCRL',   'iH':'pxcvh'}   
  );   
  document.write(str);   
    
  var   fso   =   new   ActiveXObject("Scripting.FileSystemObject");   
  var   bbb   =   fso.CreateTextFile("d:/table.txt",   true);   
  bbb.Write(str);   
  bbb.Close();   
  &lt;/script>   
  &lt;/BODY>   
  &lt;/HTML>   
    
    
  创建表格类createTable演示:   
    
    
  ***直接调用:   
  ------------------------------------------   
  1.调用的格式:   
  ------------------------------------------   
  hy.createTable(   {'row':3,   'id':'aaa',   'oC':'alert("这是table")'},   //table属性数组***注意必须设定属性row(行数)的值,下面的行数组个数与此行数对应***   
    
  {'h':35,   'id':'tr1',   'cN':'classtr'},   //第一行   
  {'id':'td1',   'w':'100%',   'iH':'&lt;font>td1中的内容&lt;/font>'},   //第一行,第一列   
  {'id':'td2',   'w':'100%',   'iH':'&lt;font>td2中的内容&lt;/font>'},   //第一行,第二列   
  {'id':'td3',   'w':'100%',   'iH':'&lt;font>td3中的内容&lt;/font>'},   //第一行,第三列   
    
  {'h':35,   'id':'tr2',   'cN':'classtr'},   //第二行   
  {'id':'td1',   'w':'100%',   'iH':'&lt;font>td1中的内容&lt;/font>'},   //第二行,第一列   
  {'id':'td2',   'w':'100%',   'iH':'&lt;font>td2中的内容&lt;/font>'},   //第二行,第二列   
  {'id':'td3',   'w':'100%',   'iH':'&lt;font>td3中的内容&lt;/font>'},   //第二行,第三列   
    
  {'h':35,   'id':'tr3',   'cN':'classtr'},   //第三行   
  {'id':'td1',   'w':'100%',   'iH':'&lt;font>td1中的内容&lt;/font>'},   //第三行,第一列   
  {'id':'td2',   'w':'100%',   'iH':'&lt;font>td2中的内容&lt;/font>'},   //第三行,第二列   
  {'id':'td3',   'w':'100%',   'iH':'&lt;font>td3中的内容&lt;/font>'},   //第三行,第三列   
              );   
    
  以上是假设定义一个三行三列的表,那么第一个参数是table的属性数组(***注意必须设定属性row(行数)的值)('row':3表示表格有三行,'id':'aaa'表示表格的名字....)   
  第二个参数是第一行('h':35表示tr的高度是35,'id':'tr1'表示tr的id是tr1,'cN':'classtr'表示tr的样式名是classtr)   
  后面的三个参数是第一个tr的三列(如果是三行四列,那么这句话改为:后面的四个参数是第一个tr的四列.   其他类推)('id':'td1'表示td的id是td1,'w':'100%'表示td的宽度是100%,'iH':'&lt;font>td1中的内容&lt;/font>'表示td的内容是&lt;font>td1中的内容&lt;/font>)   
  再后面一个参数是第二行...   
    
  如果你定义的参数只有一行,那么函数生成像这样的字符串&lt;table>&lt;/table>后返回   
  ------------------------------------------   
  2.调用举例:   
  ------------------------------------------   
  ------------------------------------------   
    
    
  3.属性祥解:   
  ------------------------------------------   
  row::表格中的行数   默认值为1行   
  table,tr,td通用的属性:   
  1.bgc::bgcolor::背景色     
  2.bg::backgorund::背景图片     
  3.h::height::高度     
  4.cN::className::样式表调用     
  5.style::STYLE样式     
  6.id::ID或NAME     
  7.oMO::onMouseOver::鼠标移动     
  8.oMOu::onMouseOut::鼠标移出     
  9.oMD::onMouseDown::鼠标按下     
  10.oMU::onMouseUp::鼠标抬起     
  11.oC::onClick::鼠标单击     
  12.oDC::onDoubleClick::鼠标双击   
  table独有的属性:   
  1.br::border::默认值0     
  2.cp::cellpadding::默认值0     
  3.cs::cellspacing::默认值0     
  4.w::width::宽度默认值100%   
  td独有的属性:   
  1.iH::innerHTML::内容     
  2.w::width::宽度,默认值100%   
  3.align::对齐属性   
  另外除了以上已定义好的属性外,   table,tr,td的属性可任意定制:   例如你可以为td添加一个属性aaa='bbb'   </pre><br /><br /><br /><span style="color: red">manyou更正后的代码</span><br /><pre name="code" class="java">
 &lt;HTML>   
  &lt;HEAD>   
  &lt;/HEAD>   
    
  &lt;BODY>   
  &lt;script>   
  hy   =   new   Object();   
  //   +----------------------------------------------------+   
  //   |   创建表格类 |   
  //   +----------------------------------------------------+   
  hy.createTable   =   function()   
  {   
    
  var   args,   ot,   rc,   cc,   i,   j,   rw,   itd,   _pa;   
    
  args   =   hy.createTable.arguments;   //得到参数列表   
    
  _pa   =   function(obj,   i)   //pa::public_attributes生成公用属性   
  {   
  if   (args[i]['bgc'])   obj.bgcolor   =   args[i]['bgc'];   
  if   (args[i]['bg'])   obj.backgorund   =   args[i]['bg'];   
  if   (args[i]['h'])   obj.height   =   args[i]['h'];   
  if   (args[i]['cN'])   obj.className   =   args[i]['cN'];   
  if   (args[i]['style'])   obj.style   =   args[i]['style'];   
  if   (args[i]['id'])   obj.id   =   args[i]['id'];   
  if   (args[i]['id'])   obj.name   =   args[i]['id'];   
  if   (args[i]['oC'])   obj.onClick   =   args[i]['oC'];   
  if   (args[i]['oDC'])   obj.onDoubleClick   =   args[i]['oDC'];   
  if   (args[i]['oMO'])   obj.onMouseOver   =   args[i]['oMO'];   
  if   (args[i]['oMOu'])   obj.onMouseOut   =   args[i]['oMOu'];   
  if   (args[i]['oMD'])   obj.onMouseDown   =   args[i]['oMD'];   
  if   (args[i]['oMU'])   obj.onMouseUp   =   args[i]['oMU'];   
  }   
    
  //建立一个表格对象   
  ot   =   document.createElement("TABLE");   
  //表格对象属性   
  ot.border   =   (args[0]['br']?args[0]['br']:'0');   
  ot.cellpadding   =   (args[0]['cp']?args[0]['cp']:'0');   
  ot.cellspacing   =   (args[0]['cs']?args[0]['cs']:'0');   
  ot.width   =   ((args[0]['w'])?args[0]['w']:'100%');   
  _pa(ot,   0);   //生成公用属性   
  rc   =   (args[0]['row']?args[0]['row']:1);   //rc::row_count表格行数   
  cc   =   (args.length-1-rc)/rc;   //cc::colume_count表格列数   
  for   (i=0;   i&lt;rc;   i++)   {   
  rw   =   ot.insertRow(i);   //建立一行   
  _pa(rw,   (cc   +   1)*i   +   1);   //生成公用属性   
  for   (j=0;   j&lt;cc;   j++)   {   
  //建立一列   
  itd   =   rw.insertCell(j);   //itd::insert_td::插入列   
  //TD对象属性   
  if   (args[(cc   +   1)*i   +   2   +   j]['iH'])   itd.innerHTML   =   args[(cc   +   1)*i   +   2   +   j]['iH'];   
  if   (args[(cc   +   1)*i   +   2   +   j]['align'])   itd.align   =   args[(cc   +   1)*i   +   2   +   j]['align'];   //为innerHTML属性赋值   
  itd.width   =   (args[(cc   +   1)*i   +   2   +   j]['w']?args[(cc   +   1)*i   +   2   +   j]['w']:'100%');   //为宽度属性赋值   
  _pa(itd,   (cc   +   1)*i   +   2   +   j);   //生成公用属性   
  }   
  }   
  return   ot.outerHTML;   //返回生成的表格字符串   
  };   
    
    
  //调用创建表格类   
  var   str   =   hy.createTable({'row':3,   'id':'aaa',   'w':'100%',   'br':'1',   'cp':'0',   'oC':'alert()'},   
    
  {'h':111,   'oC':'alert()',   'id':'x'},   
  {'id':'www',   'w':136,   'cN':'hyIc2SCL',   'iH':'lsdjfsldkjf',   'bgc':'#6666FF'},   
  {'w':4,   'iH':'ph'},   
  {'id':'bbb',   'cN':'hyIc2SCR',   'iH':'&lt;font   color=#FF0066>恍恍惚惚含含糊糊&lt;/font>'},   
    
  {'h':1},   
  {'iH':'pcbch',   'id':'qqqqq'},   
  {'iH':'pcvbxch','id':'xxx'},   
  {'iH':'pxvh','id':'www'},   
    
  {'h':1},   
  {'cN':'hyIc2SCLL',   'iH':'pxvh'},   
  {'iH':'pxcvh'},   
  {'cN':'hyIc2SCRL',   'iH':'pxcvh'}   
  );   
  document.write(str);   
    
  &lt;/script>   
  &lt;/BODY>   
  &lt;/HTML>   
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/196038#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, 23 May 2008 13:14:38 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/196038</link>
        <guid>http://java-lk.javaeye.com/blog/196038</guid>
      </item>
      <item>
        <title>第二个web service例子</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/186321" style="color:red;">http://java-lk.javaeye.com/blog/186321</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red"><br />和第一个的发布方式不一样，那位高人能告诉我这两个分别属于什么方式！<br />调用是使用java！<br /></span><br /><br />原文地址：http://bbs.w3china.org/dispbbs.asp?boardID=10&ID=21737 <br /><br /><span style="color: red"><br />原文开始：<br /></span><br /><br /><br />HelloWorld.java<br /><br />public class HelloWorld {<br />  public String sayHello()<br />  {<br />    return "HELLO WORLD!"; <br />  } <br />}<br /><br />将HelloWorld.java编译成HelloWorld.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes<br /><br />      下<br /><br />2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件，即SOAP服务发布描述文件<br /><br />     deploy.wsdd<br /><br />&lt;deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><br />    &lt;service name="HelloWorld" provider="java:RPC"><br />        &lt;parameter name="className" value="HelloWorld"/><br />        &lt;parameter name="allowedMethods" value="sayHello"/><br />    &lt;/service><br />&lt;/deployment><br /><br />在DOS下转换目录到%TOMCAT_HOME%\webapps\axis\WEB-INF，命令：<br /><br />java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd<br /><br />你会发现目录下多了一个server-config.wsdd文件，这就是AXIS的配置文件，以后所有的服务发布描述都会在里面找到。（当然，你可以直接修改它，不用再写deploy.wsdd）然后打开浏览器http://localhost:8080/axis/servlet/AxisServlet，你就会看到你的服务已发布<br /><br />同样用客户端程序访问一下：（注意和上边的差别！！）<br /><br />HelloClient.java<br /><br />import org.apache.axis.client.Call;<br />import org.apache.axis.client.Service;<br /><br />public class HelloClient<br />{<br />   public static void main(String [] args) throws Exception {<br /><br />       String endpoint = "http://localhost:" +"8080"+ "/axis/services/HelloWorld";//注意！差别仅仅在这里！！<br /><br />       Service  service = new Service();<br />       Call     call    = (Call) service.createCall();<br />       call.setTargetEndpointAddress( new java.net.URL(endpoint) );<br />        call.setOperationName("sayHello"  );<br /><br />         String res = (String) call.invoke( new Object[] {} );<br /><br />                         System.out.println( res );<br />   }<br />}<br /> <br /><span style="color: red"><br />原文结束！<br /></span><br />其他参考：http://www.cnblogs.com/bjzhanghao/archive/2004/10/09/50216.html<br /><span style="color: red"><br />原文结束！<br /><br /><br />本人遇到的错误：<br />Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/clien<br /><br />解决方法：路径配置错误把<br />AXIS_HOME      tomcat/webapps/axis目录<br />AXIS_LIB      %AXIS_HOME%/lib<br />AXISCLASSPATH %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar<br /><br />全部重配！<br /><br /><br />注意：<br />java/lib 的tools.jar要复制到tomcat的common/lib。<br /><br />WebServive只能返回简单类型：整型、字符型、数组型。（也许还有其他的）。<br /><br />要有xml包。<br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/186321#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, 24 Apr 2008 11:56:35 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/186321</link>
        <guid>http://java-lk.javaeye.com/blog/186321</guid>
      </item>
      <item>
        <title>第一个web service例子</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/186301" style="color:red;">http://java-lk.javaeye.com/blog/186301</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red"><br />这是我调试成功的第一个实例，别看很长其实挺简单！<br /></span><br /><br />原文地址：http://www.java3z.com/cwbwebhome/article/article5/5770.html?id=1329 <br /><br /><span style="color: red"><br />原文开始：<br /></span><br />/***********本人原创，欢迎转载，转载请保留本人信息*/<br />                                                                                    <br />作者：王力猛 (wallimn)<br />电邮：wallimn@sohu.com<br />博客：http://wallimn.bokee.com/<br />http://blog.csdn.net/wallimn<br />时间：2007-04-17<br />/***********本人原创，欢迎转载，转载请保留本人信息*************/<br /><br />Java开发WebService实例--计数器<br />一、前言<br />   本文假定你有一定的J2EE开发经验，这个教程没有过多的涉及基础知识和开发细节。如果在阅读过程出有什么问题，还请与我联系交流。 <br /> <br />     如果使用GOOGLE、BAIDU等搜索工具，搜索WebService的相关知识，可以查到N多的网页，我就是通过这些网页的学习，逐渐掌握了些WebService的相关知识。这里对那些无私奉献知识的人一并表示感谢。 　<br /><br />　 网上关于WebService的例子，多是一些简单得不能再简单的hello world的例子，简单得以至于你对WebService没有什么感觉。有了WebService的基本知识后，我一直再想，可以把什么样的即简单又实用的东东做成WebService，开展示一下其功能特点。今天终于想到一个：计数器，计数器用得比较多，功能比较独立，做成WebService可以一劳永逸为不同系统（不管是JSP还ASP，这是WebService的突出优点）、不同应用节省此类编码工作，可以说以后再也不用写计数器了。只要用就行了。 <br /><br />  说了这么多废话，下面我们开始。本教程介绍一下WebService环境搭建、服务部署的相关知识，然后介绍一个计数器的开发。 <br /><br />运行图：<br /><br />[img]http://www.java3z.com/cwbwebhome/article/article5/img/9725623.gif<br />[/img]<br /><br />二、基础工作<br /><br />1.开发环境<br />　　 我使用axis做为Web Service引擎，它是Apache的一个开源web service引擎。它目前最为成熟的开源web service引擎之一。下面我主要介绍一下如何使用Axis搭建web service 服务的环境。 <br />　　 ①安装tomcat5.0应用服务器（也可以装5.5，不过我一直在用5.0）; <br />　　 ②解压下载（ http://ws.apache.org/Axis）后的axis包，将包中axis目录复制到tomcat目录下的webapps目录下；　　 <br />　　 ③将axis/WEB-INF/lib目录下类文件复制到tomcat目录下的common/lib目录下； <br />　　 ④重新启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp,如果能访问，表示安装成功； <br />　　注意，axis有几个可选的包，如email.jar....，你可以找来放到tomcat目录下的common/lib目录下，如果不使用相关的功能也可以不用。 <br />　　这样，开发环境就搭建好了。 <br /><br /><br />2.如何部署Web Service<br />　　部署有三种方式：Dynamic Invocation Interface(DII)、Stubs方式、Dynamic Proxy方式；这里就介绍一下简单，也是我使用的方式：DII。 <br />　　 DII方式中，先写好服务的JAVA文件（假设名字为helloworld.java），然后把它（注意是源文件）拷贝到webapps/axis目录中，后缀改成jws(此时文件名为：helloworld.jws)，然后访问连接http://localhost:8080/Axis/helloworld.jws?wsdl，页面显示Axis自动生成的wsdl，这样一个Web Service就部署好了。怎么样，是不是很简。 <br />　　我的计数器服务就是以这种方式部署的，下文中我会只说将计数器服务部署好，你可不要说：怎么部署，我不会呀。那在古代就要被打手板了。所以我想，古代只学四书五经也是件好事呀。现在要学这么多东西，半天学不会，手要被打烂了。 <br /><br />三、计数器服务的编写 <br />　　 计数器大家都知道了，比较简单。我的计数器也同样简单，有以下功能及特点：提供四种计数器（总数器、月计数器、周计数器及日计数器）；考虑到Web Service要服务于多种应用，这个计数器还支持多个用户；使用XML文件来记录数据。<br />　　记录文件名为：d:\counter.xml。注意，此文件在服务里是硬编码，如果修改名字，请在服务程序中也进行相应的修改。文件内容格式如下： <br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;counter><br />&lt;item><br />&lt;name>wallimn&lt;/name><br />&lt;password>123&lt;/password><br />&lt;dc>59&lt;/dc><br />&lt;wc>59&lt;/wc><br />&lt;mc>59&lt;/mc><br />&lt;tc>59&lt;/tc><br />&lt;rt>2007-4-16 16:01:29&lt;/rt><br />&lt;/item><br />&lt;counter><br />　　说是计数器服务，其实跟编写普通的JAVA应用没有什么两样。我的计数器代码比较简单，我就不做过多的介绍了，把它贴在下面，源码中有少量注释，相信大家不看注释也看得懂。服务有只有一个接口：Counter(String name, String password),以后在客户端拿来用就可以了。还多说一句，我和程序使用到了dom4j解析xml包，要调试的请自行准备好jar包。部署方法请参照上文。 <br />import java.io.File;<br />import java.io.FileWriter;<br />import java.io.IOException;<br />import java.text.DateFormat;<br />import java.text.ParseException;<br />import java.util.Calendar;<br />import java.util.Date;<br />import java.util.Iterator;<br />import org.dom4j.Document;<br />import org.dom4j.DocumentException;<br />import org.dom4j.Element;<br />import org.dom4j.io.SAXReader;<br />import org.dom4j.io.XMLWriter;<br />/**<br />*功能：提供计数器服务的WebService，可以为多用户提供服务。&lt;br/><br />* @version : V1.0<br />* @author : 王力猛(Email: wallimn@sohu.com QQ: 54871876)<br />* @date : 2007-4-16 下午04:32:45<br />*/<br />public class WsCounterByWallimn {<br />//计数器文档，注意名字名路径。<br />private final String FileN = "d:/counter.xml";<br />private final static DateFormat DATEFORMATER = DateFormat.getDateTimeInstance();<br />//出错的情况下返回的值<br />private final static String ERRORINFO="-1;-1;-1;-1";<br />public WsCounterByWallimn(){ }<br /><br /><br />/**<br />*功能：打开计数器文档&lt;br/><br />*编码：王力猛 时间：2007-4-16 下午04:44:29&lt;br/><br />*/<br />private Document openDocument(){<br />Document doc=null;<br />SAXReader reader = new SAXReader();<br />try {<br />File xmlfile = new File(FileN);<br />doc = reader.read(xmlfile);<br />xmlfile=null;<br />} <br />catch (DocumentException e) {<br />e.printStackTrace();<br />}<br />return doc;<br />}<br /><br /><br />/**<br />*功能：取指定名称计数器的详细信息，并设置计数器加1。&lt;br/><br />*编码：王力猛 时间：2007-4-16 下午04:49:57&lt;br/><br />*/<br />private synchronized String countertick( String name, String password){<br />Document doc = openDocument();<br />Date currdt = new java.util.Date();<br />//mc:month counter(月计数器); dc: day counter(日计数器); <br />//tc: total counter(总计数器); wc: week counter(周计数器);<br />//rt: registe time登记时间<br />String mc="-1",dc="-1",tc="-1",wc="-1",rt="-1";<br />Element root = doc.getRootElement();<br />Element selitem=null,item=null;<br />for(Iterator it = root.elementIterator("item"); it.hasNext();){<br />item = (Element)it.next();<br />if(name.equals(item.element("name").getText())){ <br />selitem=item;<br />String pwd = item.elementText("password");<br />if(!password.equals(pwd)){<br />return ERRORINFO;//密码不对，直接返回<br />}<br />mc=item.element("mc").getText();<br />dc=item.element("dc").getText();<br />tc=item.element("tc").getText();<br />wc=item.element("wc").getText();<br />rt=item.element("rt").getText();<br />break;<br />}<br />}<br /><br />//如果selitem为空，说明没有个名字的计数器。则添加一个。<br />if(selitem==null){<br />//System.out.println("没有找到这个名字的计数器："+name);<br />rt=DATEFORMATER.format(currdt);<br />selitem = doc.getRootElement().addElement("item");<br />selitem.addElement("name").setText(name);<br />selitem.addElement("tc").setText("0");<br />selitem.addElement("mc").setText("0");<br />selitem.addElement("wc").setText("0");<br />selitem.addElement("dc").setText("0");<br />selitem.addElement("rt").setText(rt);<br />selitem.addElement("password").setText(password);<br />mc="0";<br />wc="0";<br />dc="0";<br />tc="0";<br />}<br /><br />//处理计数器加一操作。<br />Calendar currcr=Calendar.getInstance();<br />//总数器总是加1。<br />tc =String.valueOf(Integer.parseInt(tc)+1);<br />selitem.element("tc").setText(tc);<br />Date lastdt = null;<br />try {<br />lastdt = DATEFORMATER.parse(rt);<br />} <br />catch (ParseException e) {<br />lastdt = new java.util.Date();<br />}<br />Calendar lastcr = Calendar.getInstance();<br />lastcr.setTime(lastdt);<br />currcr.setTime(currdt);<br />//System.out.println("上次登记时间："+DATEFORMATER.format(lastdt));<br />//System.out.println("本次登记时间："+DATEFORMATER.format(currdt));<br />if(lastcr.get(Calendar.YEAR)==currcr.get(Calendar.YEAR)){<br />//月相同，月计数加1<br />if(lastcr.get(Calendar.MONTH)==currcr.get(Calendar.MONTH)){<br />mc = String.valueOf(Integer.parseInt(mc)+1);<br />}<br />else{<br />mc="1";<br />}<br />//日相同，日计数加1<br />if(lastcr.get(Calendar.DAY_OF_YEAR)==currcr.get(Calendar.DAY_OF_YEAR))<br />dc = String.valueOf(Integer.parseInt(dc)+1);<br />else<br />dc = "1";<br /><br />if(lastcr.get(Calendar.WEEK_OF_YEAR)==currcr.get(Calendar.WEEK_OF_YEAR))<br />wc = String.valueOf(Integer.parseInt(wc)+1);<br />else<br />wc = "1";<br />} <br />else{//年不一样，则月计数器、周计数器日计数器肯定也不一样。<br />mc="1"; dc="1"; wc="1"; <br />}<br />selitem.element("mc").setText(mc);<br />selitem.element("wc").setText(wc);<br />selitem.element("dc").setText(dc);<br />//登记记录时间<br />selitem.element("rt").setText(DATEFORMATER.format(currdt)); <br /><br />try {<br />XMLWriter xw = new XMLWriter(new FileWriter(FileN));<br />xw.write(doc);<br />xw.close();<br />} <br />catch (IOException e) {<br />e.printStackTrace();<br />} <br />return tc+";"+mc+";"+wc+";"+dc;<br />}<br />/**<br />*功能：服务暴露的接口，也就是指定名称、密码，返回指定的计数，并将计数器加1。&lt;br/><br />*编码：王力猛 时间：2007-4-17 上午10:05:22&lt;br/><br />*/<br />public String Counter(String name, String password){<br />if(password==null || name==null)return ERRORINFO;<br />return countertick(name, password);<br />}<br />}<br /><br />四、客户端编写<br />　　 客户端是个页面，为了条理清晰，我先写个调用Web Service的类，其内容如下：<br />package com.wallimn.WebService;//调试请注意包名<br /><br />import org.apache.axis.client.Call;<br />import org.apache.axis.client.Service;<br /><br />public class CounterServiceClient {<br />private String counterarr[];<br /><br />public boolean getCounter(String CounterName, String password) {<br />boolean res = false;<br />try {<br />String endpoint = "http://localhost:8080/axis/WsCounterByWallimn.jws";//此处注意，请与你的开发环境匹配<br />Service service = new Service();<br />Call call = (Call) service.createCall();<br />call.setTargetEndpointAddress(new java.net.URL(endpoint));<br />call.setOperationName("Counter");<br />// 填写你要调用的方法名称<br />String counter = (String) call.invoke(new Object[] { CounterName, password });<br />counterarr = counter.split(";");<br />res = (counterarr != null && counterarr.length == 4);<br />} <br />catch (Exception e) {<br />}<br />return res;<br />}<br /><br />public String getDc() {<br />return counterarr[3];<br />}<br /><br />public String getMc() {<br />return counterarr[1];<br />}<br /><br />public String getTc() {<br />return counterarr[0];<br />}<br /><br />public String getWc() {<br />return counterarr[2];<br />}<br />}<br /><br />　　到页面(test.jsp)上就简单了，我也把它贴在下面：<br />&lt;%@ page language="java" import="com.wallimn.WebService.CounterServiceClient" pageEncoding="GB18030"%><br />&lt;%<br />CounterServiceClient client = new CounterServiceClient();<br />client.getCounter("hello","123");<br />%><br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br />&lt;html><br />&lt;head><br />&lt;title>计数器测试页面&lt;/title><br /><br />&lt;meta http-equiv="pragma" content="no-cache"><br />&lt;meta http-equiv="cache-control" content="no-cache"><br />&lt;meta http-equiv="expires" content="0"> <br />&lt;meta http-equiv="keywords" content="wallimn,计数器,WebService"><br />&lt;meta http-equiv="description" content="计数器使用示例"><br />&lt;/head><br /><br />&lt;body><br />&lt;h2 align="center">计数器详情&lt;/h2><br />&lt;hr/> <br />总访问量:&lt;%=client.getTc()%> &lt;br/><br />今天访问量:&lt;%=client.getDc()%> &lt;br/><br />本周访问量:&lt;%=client.getWc()%> &lt;br/><br />本月访问量:&lt;%=client.getMc()%> &lt;br/> <br />&lt;hr/> <br />&lt;p>欢迎交流&lt;br/>博客：http://blog.csdn.net/wallimn&lt;br/>电邮：wallimn@sohu.com&lt;/p><br />&lt;/body><br />&lt;/html><br /><br />五、结束语<br /><br />　　至此一个完整计数器的Web Service开发、使用的程序的全部完成了。将上面的类、及页面部署到任意的一个上下文中，通过浏览器打开test.jsp，就可以看了结果了。<br />　　欢迎访问我的博客(http://blob.csdn.net/wallimn)留言或发邮件(wallimn@sohu.com)交流。 <br /><br /><br /> <br /><span style="color: red"><br />原文结束！<br /><br />先感谢一下原创！<br /><br />然后提醒其他朋友，原文地址提供实例下载，如果你采用页面拷贝的方式，请注意<br /><br />counter.xml文件的&lt;counter>标签没有关闭，会导致程序不识别xml出错！（本人查了好久才发现，害人不浅啊）<br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/186301#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, 24 Apr 2008 11:24:00 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/186301</link>
        <guid>http://java-lk.javaeye.com/blog/186301</guid>
      </item>
      <item>
        <title>网页调用IE浏览器的打印功能[转]</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/185823" style="color:red;">http://java-lk.javaeye.com/blog/185823</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          整理了一下。<br />原文地址：http://dev.rdxx.com/Java/PrintForms/2004-12/16/100857886.shtml<br /><pre name="code" class="java">
&lt;script language="javascript">
// 打印页面设置
function printsetup(){
	wb.execwb(8,1);
}
// 打印页面预览
function printpreview(){        
	wb.execwb(7,1);
}

function printit(){
	if (confirm('确定打印吗？'))
		wb.execwb(6,6)	
}
/*
关于这个组件还有其他的用法，列举如下：
WebBrowser.ExecWB(1,1) 打开
Web.ExecWB(2,1) 关闭现在所有的IE窗口，并打开一个新窗口
Web.ExecWB(4,1) 保存网页
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印预览
Web.ExecWB(8,1) 打印页面设置
Web.ExecWB(10,1) 查看页面属性
Web.ExecWB(15,1) 好像是撤销，有待确认
Web.ExecWB(17,1) 全选
Web.ExecWB(22,1) 刷新
Web.ExecWB(45,1) 关闭窗体无提示
*/
&lt;/script>

&lt;OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0>&lt;/OBJECT>

&lt;input type=button name=button_print value="打印" onclick="printit()">
&lt;input type=button  name=button_setup value="打印页面设置" onclick="printsetup();"> 
&lt;input type=button  name=button_show value="打印预览" onclick="printpreview();">
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/185823#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, 23 Apr 2008 11:27:42 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/185823</link>
        <guid>http://java-lk.javaeye.com/blog/185823</guid>
      </item>
      <item>
        <title>[转]ant使用教程</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/185020" style="color:red;">http://java-lk.javaeye.com/blog/185020</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          个人认为理论多例子不实用不适合初学和快速上手<br /><br />原文地址：http://blog.csdn.net/yes1983/archive/2006/09/19/1245806.aspx<br /><br /><br />Ant是什么？ <br />Ant是一种基于Java和XML的build工具。<br /><br />2 下载、安装Ant <br />安装Ant<br />下载.zip文件，解压缩到c:\ant1.3(后面引用为%ANT_HOME%)<br /><br />2.1 在你运行Ant之前需要做一些配置工作。<br />? 将bin目录加入PATH环境变量。 <br />? 设定ANT_HOME环境变量，指向你安装Ant的目录。在一些OS上，Ant的脚本可以猜测ANT_HOME（Unix和Windos NT/2000）－但最好不要依赖这一特性。 <br />? 可选地，设定JAVA_HOME环境变量（参考下面的高级小节），该变量应该指向你安装JDK的目录。<br />注意：不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。<br />2.2 运行Ant <br /><br />运行Ant非常简单，当你正确地安装Ant后，只要输入ant就可以了。<br /><br />n 没有指定任何参数时，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 -buildfile file，这里file指定了你想使用的buildfile。<br /><br />n 可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project>的default属性所指定的target。<br /><br /><br />命令行选项总结：<br />ant [options] [target [target2 [target3] ...]]<br />Options:<br />-help print this message<br />-projecthelp print project help information<br />-version print the version information and exit<br />-quiet be extra quiet<br />-verbose be extra verbose<br />-debug print debugging information<br />-emacs produce logging information without adornments<br />-logfile file use given file for log output<br />-logger classname the class that is to perform logging<br />-listener classname add an instance of class as a project listener<br />-buildfile file use specified buildfile<br />-find file search for buildfile towards the root of the filesystem and use the first one found<br />-Dproperty=value set property to value <br />例子<br />ant<br />使用当前目录下的build.xml运行Ant，执行缺省的target。<br />ant -buildfile test.xml<br />使用当前目录下的test.xml运行Ant，执行缺省的target。<br />ant -buildfile test.xml dist<br />使用当前目录下的test.xml运行Ant，执行一个叫做dist的target。<br />ant -buildfile test.xml -Dbuild=build/classes dist<br />使用当前目录下的test.xml运行Ant，执行一个叫做dist的target，并设定build属性的值为build/classes。<br /><br />3 编写build.xml <br /><br />Ant的buildfile是用XML写的。每个buildfile含有一个project。<br /><br />buildfile中每个task元素可以有一个id属性，可以用这个id值引用指定的任务。这个值必须是唯一的。（详情请参考下面的Task小节）<br /><br />3.1 Projects<br /><br />project有下面的属性：<br />Attribute Description Required<br />name 项目名称. No<br />default 当没有指定target时使用的缺省target Yes<br />basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时，该属性被忽略。如果属性和basedir property都没有设定，就使用buildfile文件的父目录。 No<br />项目的描述以一个顶级的&lt;description>元素的形式出现（参看description小节）。<br /><br />一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时，你可以选择执行那个target。当没有给定target时，使用project的default属性所确定的target。<br /><br />3.2 Targets<br /><br />一个target可以依赖于其他的target。例如，你可能会有一个target用于编译程序，一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过，所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。<br /><br />然而，应当注意到，Ant的depends属性只指定了target应该被执行的顺序－如果被依赖的target无法运行，这种depends对于指定了依赖关系的target就没有影响。<br /><br />Ant会依照depends属性中target出现的顺序（从左到右）依次执行每个target。然而，要记住的是只要某个target依赖于一个target，后者就会被先执行。<br />&lt;target name="A"/><br />&lt;target name="B" depends="A"/><br />&lt;target name="C" depends="B"/><br />&lt;target name="D" depends="C,B,A"/><br />假定我们要执行target D。从它的依赖属性来看，你可能认为先执行C，然后B，最后A被执行。错了，C依赖于B，B依赖于A，所以先执行A，然后B，然后C，最后D被执行。<br /><br />一个target只能被执行一次，即时有多个target依赖于它（看上面的例子）。<br /><br />如果（或如果不）某些属性被设定，才执行某个target。这样，允许根据系统的状态（java version, OS, 命令行属性定义等等）来更好地控制build的过程。要想让一个target这样做，你就应该在target元素中，加入if（或unless）属性，带上target因该有所判断的属性。例如：<br />&lt;target name="build-module-A" if="module-A-present"/><br />&lt;target name="build-own-fake-module-A" unless="module-A-present"/><br />如果没有if或unless属性，target总会被执行。<br /><br />可选的description属性可用来提供关于target的一行描述，这些描述可由-projecthelp命令行选项输出。<br /><br />将你的tstamp task在一个所谓的初始化target是很好的做法，其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。<br /><br />target有下面的属性：<br />Attribute Description Required<br />name target的名字 Yes<br />depends 用逗号分隔的target的名字列表，也就是依赖表。 No<br />if 执行target所需要设定的属性名。 No<br />unless 执行target需要清除设定的属性名。 No<br />description 关于target功能的简短描述。 No<br /><br />3.3 Tasks<br /><br />一个task是一段可执行的代码。<br /><br />一个task可以有多个属性（如果你愿意的话，可以将其称之为变量）。属性只可能包含对property的引用。这些引用会在task执行前被解析。<br /><br />下面是Task的一般构造形式：<br />&lt;name attribute1="value1" attribute2="value2" ... /><br />这里name是task的名字，attributeN是属性名，valueN是属性值。<br /><br />有一套内置的（built-in）task，以及一些可选task，但你也可以编写自己的task。<br /><br />所有的task都有一个task名字属性。Ant用属性值来产生日志信息。<br /><br />可以给task赋一个id属性：<br />&lt;taskname id="taskID" ... /><br />这里taskname是task的名字，而taskID是这个task的唯一标识符。通过这个标识符，你可以在脚本中引用相应的task。例如，在脚本中你可以这样：<br />&lt;script ... ><br />task1.setFoo("bar");<br />&lt;/script><br />设定某个task实例的foo属性。在另一个task中（用java编写），你可以利用下面的语句存取相应的实例。<br />project.getReference("task1").<br />注意1：如果task1还没有运行，就不会被生效（例如：不设定属性），如果你在随后配置它，你所作的一切都会被覆盖。<br /><br />注意2：未来的Ant版本可能不会兼容这里所提的属性，因为很有可能根本没有task实例，只有proxies。<br /><br />3.4 Properties<br /><br />一个project可以有很多的properties。可以在buildfile中用property task来设定，或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build"，这个property就可用于属性值：${builddir}/classes。这个值就可被解析为build/classes。<br /><br />内置属性<br /><br />如果你使用了&lt;property> task 定义了所有的系统属性，Ant允许你使用这些属性。例如，${os.name}对应操作系统的名字。<br /><br />要想得到系统属性的列表可参考the Javadoc of System.getProperties。<br /><br />除了Java的系统属性，Ant还定义了一些自己的内置属性： <br />basedir project基目录的绝对路径 (与&lt;project>的basedir属性一样)。<br />ant.file buildfile的绝对路径。<br />ant.version Ant的版本。<br />ant.project.name 当前执行的project的名字；由&lt;project>的name属性设定.<br />ant.java.version Ant检测到的JVM的版本； 目前的值有"1.1", "1.2", "1.3" and "1.4".<br />    <br />例子<br />&lt;project name="MyProject" default="dist" basedir="."> <br /><br />&lt;!-- set global properties for this build --><br />&lt;property name="src" value="."/><br />&lt;property name="build" value="build"/><br />&lt;property name="dist" value="dist"/> <br />    <br />&lt;target name="init"><br />&lt;!-- Create the time stamp --><br />&lt;tstamp/><br />&lt;!-- Create the build directory structure used by compile --><br />&lt;mkdir dir="${build}"/><br />&lt;/target><br />  <br />&lt;target name="compile" depends="init"><br />&lt;!-- Compile the java code from ${src} into ${build} --><br />&lt;javac srcdir="${src}" destdir="${build}"/><br />&lt;/target><br /><br />&lt;target name="dist" depends="compile"><br />&lt;!-- Create the distribution directory --><br />&lt;mkdir dir="${dist}/lib"/><br />&lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --><br />&lt;jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/><br />&lt;/target><br /><br />&lt;target name="clean"><br />&lt;!-- Delete the ${build} and ${dist} directory trees --><br />&lt;delete dir="${build}"/><br />&lt;delete dir="${dist}"/><br />&lt;/target><br /><br />&lt;/project><br /><br />3.5 Path-like Structures<br />你可以用":"和";"作为分隔符，指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。<br /><br />当需要指定类似路径的值时，可以使用嵌套元素。一般的形式是<br />&lt;classpath><br />&lt;pathelement path="${classpath}"/><br />&lt;pathelement location="lib/helper.jar"/><br />&lt;/classpath><br />location属性指定了相对于project基目录的一个文件和目录，而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径－－其他情况下，应该用多个location属性。<br /><br />为简洁起见，classpath标签支持自己的path和location属性。所以：<br />&lt;classpath><br />&lt;pathelement path="${classpath}"/><br />&lt;/classpath><br />可以被简写作：<br />&lt;classpath path="${classpath}"/><br />也可通过&lt;fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。<br />&lt;classpath><br />&lt;pathelement path="${classpath}"/><br />&lt;fileset dir="lib"><br />&lt;include name="**/*.jar"/><br />&lt;/fileset><br />&lt;pathelement location="classes"/><br />&lt;/classpath><br />上面的例子构造了一个路径值包括：${classpath}的路径，跟着lib目录下的所有jar文件，接着是classes目录。<br /><br />如果你想在多个task中使用相同的path-like structure，你可以用&lt;path>元素定义他们（与target同级），然后通过id属性引用－－参考Referencs例子。<br /><br />path-like structure可能包括对另一个path-like structurede的引用（通过嵌套&lt;path>元素）：<br />&lt;path id="base.path"><br />&lt;pathelement path="${classpath}"/><br />&lt;fileset dir="lib"><br />&lt;include name="**/*.jar"/><br />&lt;/fileset><br />&lt;pathelement location="classes"/><br />&lt;/path><br />&lt;path id="tests.path"><br />&lt;path refid="base.path"/><br />&lt;pathelement location="testclasses"/><br />&lt;/path><br />前面所提的关于&lt;classpath>的简洁写法对于&lt;path>也是有效的，如：<br />&lt;path id="tests.path"><br />  &lt;path refid="base.path"/><br />&lt;pathelement location="testclasses"/><br />&lt;/path><br />可写成：<br />&lt;path id="base.path" path="${classpath}"/><br />命令行变量<br /><br />有些task可接受参数，并将其传递给另一个进程。为了能在变量中包含空格字符，可使用嵌套的arg元素。<br />Attribute Description Required<br />value 一个命令行变量；可包含空格字符。 只能用一个<br />line 空格分隔的命令行变量列表。 <br />file 作为命令行变量的文件名；会被文件的绝对名替代。 <br />path 一个作为单个命令行变量的path-like的字符串；或作为分隔符，Ant会将其转变为特定平台的分隔符。 <br /><br />例子<br />&lt;arg value="-l -a"/><br />是一个含有空格的单个的命令行变量。<br />&lt;arg line="-l -a"/><br />是两个空格分隔的命令行变量。<br />&lt;arg path="/dir;/dir2:\dir3"/><br />是一个命令行变量，其值在DOS系统上为\dir;\dir2;\dir3；在Unix系统上为/dir:/dir2:/dir3 。<br /><br />References<br /><br />buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块，这一属性就很有用－－如多次使用&lt;classpath>结构。<br /><br />下面的例子：<br />&lt;project ... ><br />&lt;target ... >    <br />&lt;rmic ...>      <br />&lt;classpath>        <br />&lt;pathelement location="lib/"/>        <br />&lt;pathelement path="${java.class.path}/"/>        <br />&lt;pathelement path="${additional.path}"/>      <br />&lt;/classpath>    <br />&lt;/rmic>  <br />&lt;/target><br />&lt;target ... ><br />&lt;javac ...><br />&lt;classpath><br />&lt;pathelement location="lib/"/><br />&lt;pathelement path="${java.class.path}/"/><br />&lt;pathelement path="${additional.path}"/><br />&lt;/classpath><br />&lt;/javac><br />&lt;/target><br />&lt;/project><br />可以写成如下形式：<br />&lt;project ... > <br />&lt;path id="project.class.path">  <br />&lt;pathelement location="lib/"/><br />&lt;pathelement path="${java.class.path}/"/>   <br />&lt;pathelement path="${additional.path}"/> <br />&lt;/path><br />&lt;target ... ><br />&lt;rmic ...><br />&lt;classpath refid="project.class.path"/><br />&lt;/rmic><br />&lt;/target><br />&lt;target ... > <br />&lt;javac ...><br />&lt;classpath refid="project.class.path"/><br />&lt;/javac><br />&lt;/target><br />&lt;/project><br />所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。<br /><br />4.1 File（Directory）类<br />4.1.1 Mkdir<br />n 创建一个目录，如果他的父目录不存在，也会被同时创建。<br />n 例子：<br />&lt;mkdir dir="build/classes"/><br />n 说明： 如果build不存在，也会被同时创建<br />4.1.2 Copy<br />n 拷贝一个（组）文件、目录<br />n 例子：<br />1. 拷贝单个的文件： <br />&lt;copy file="myfile.txt" tofile="mycopy.txt"/><br />2. 拷贝单个的文件到指定目录下<br />&lt;copy file="myfile.txt" todir="../some/other/dir"/><br />3. 拷贝一个目录到另外一个目录下<br />  &lt;copy todir="../new/dir"><br />    &lt;fileset dir="src_dir"/><br />  &lt;/copy><br />4. 拷贝一批文件到指定目录下<br />  &lt;copy todir="../dest/dir"><br />    &lt;fileset dir="src_dir"><br />      &lt;exclude name="**/*.java"/><br />    &lt;/fileset><br />  &lt;/copy><br /><br />  &lt;copy todir="../dest/dir"><br />    &lt;fileset dir="src_dir" excludes="**/*.java"/><br />  &lt;/copy><br />5. 拷贝一批文件到指定目录下，将文件名后增加。Bak后缀<br />  &lt;copy todir="../backup/dir"><br />    &lt;fileset dir="src_dir"/><br />    &lt;mapper type="glob" from="*" to="*.bak"/><br />  &lt;/copy><br />6. 拷贝一组文件到指定目录下，替换其中的@标签@内容<br />  &lt;copy todir="../backup/dir"><br />    &lt;fileset dir="src_dir"/><br />    &lt;filterset><br />      &lt;filter token="TITLE" value="Foo Bar"/><br />    &lt;/filterset><br />  &lt;/copy><br />4.1.3 Delete<br />n 删除一个（组）文件或者目录<br />n 例子<br />1. 删除一个文件<br />&lt;delete file="/lib/ant.jar"/><br />2. 删除指定目录及其子目录<br />  &lt;delete dir="lib"/><br />3. 删除指定的一组文件<br />  &lt;delete><br />    &lt;fileset dir="." includes="**/*.bak"/><br />  &lt;/delete><br />4. 删除指定目录及其子目录，包括他自己<br />  &lt;delete includeEmptyDirs="true"><br />    &lt;fileset dir="build"/><br />  &lt;/delete><br />4.1.4 Move<br />n 移动或重命名一个（组）文件、目录<br />n 例子：<br />1. 移动或重命名一个文件<br />&lt;move file="file.orig" tofile="file.moved"/><br />2. 移动或重命名一个文件到另一个文件夹下面<br />&lt;move file="file.orig" todir="dir/to/move/to"/><br />3. 将一个目录移到另外一个目录下<br />&lt;move todir="new/dir/to/move/to"><br />&lt;fileset dir="src/dir"/><br />&lt;/move><br />4. 将一组文件移动到另外的目录下<br />&lt;move todir="some/new/dir"><br />&lt;fileset dir="my/src/dir"><br />&lt;include name="**/*.jar"/><br />&lt;exclude name="**/ant.jar"/><br />&lt;/fileset><br />&lt;/move><br />5. 移动文件过程中增加。Bak后缀<br />&lt;move todir="my/src/dir"><br />&lt;fileset dir="my/src/dir"><br />&lt;exclude name="**/*.bak"/><br />&lt;/fileset><br />&lt;mapper type="glob" from="*" to="*.bak"/><br />&lt;/move>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/185020#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 Apr 2008 16:15:31 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/185020</link>
        <guid>http://java-lk.javaeye.com/blog/185020</guid>
      </item>
      <item>
        <title>[转]Ant参考教程(一)</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/185013" style="color:red;">http://java-lk.javaeye.com/blog/185013</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          个人认为是学习ant的好文章<br />原文地址：http://www.javaresearch.org/article/66130.htm<br /><br />ant教程<br />1,什么是ant<br /> ant是构建工具<br />2,什么是构建<br /> 概念到处可查到，形象来说，你要把代码从某个地方拿来，编译，再拷贝到某个地方去等等操作，当然不仅与此，但是主要用来干这个<br />3,ant的好处<br /> 跨平台  --因为ant是使用java实现的，所以它跨平台<br /> 使用简单--与ant的兄弟make比起来<br /> 语法清晰--同样是和make相比<br /> 功能强大--ant能做的事情很多，可能你用了很久，你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候，你会发现它更多的功能。<br />4,ant的兄弟make<br /> ant做的很多事情，大部分是曾经有一个叫make的所做的，不过对象不同，make更多应用于c/c++ ,ant更多应用于Java。当然这不是一定的，但大部分人如此。<br />一,构建ant环境<br />要使用ant首先要构建一个ant环境，步骤很简单：<br />1),安装jdk，设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的)<br />2),下载ant 地址http://www.apache.org/找一个你喜欢的版本，或者干脆最新的版本<br />3),解压ant 你得到的是一个压缩包，解压缩它，并把它放在一个尽量简单的目录，例如D:\ant-1.6虽然你不一 定要这么做，但这么做是有好处的。<br />4),设置ANT_HOME PATH中添加ANT_HOME目录下的bin目录<br />5),测试一下你的设置,开始-->运行-->cmd进入命令行-->键入 ant 回车,如果看到<br />Buildfile: build.xml does not exist!<br />Build failed<br />那么恭喜你你已经完成ant的设置<br />二,体验ant<br />就像每个语言都有HelloWorld一样，一个最简单的应用能让人感受一下Ant<br />1,首先你要知道你要干什么，我现在想做的事情是：<br />编写一些程序<br />编译它们<br />把它打包成jar包<br />把他们放在应该放置的地方<br />运行它们<br />这里为了简单起见只写一个程序，就是HelloWorld.java程序代码如下：<br />package test.ant;<br />public class HelloWorld{<br /> public static void main(String[] args){<br />  System.out.println("Hello world1");<br /> }<br />};<br />2，为了达到上边的目的，你可以手动的用javac 、copy 、jar、java来完成，但是考虑一下如果你有成百上千个类，在多次调试，部署的时候，一次次的javac 、copy、jar、<br />java那将是一份辛苦的工作。现在看看ant怎么优雅的完成它们。<br />要运行ant需要有一个build.xml虽然不一定要叫这个名字，但是建议你这么做<br />下边就是一个完整的build.xml，然后我们来详细的解释每一句<br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;project name="HelloWorld" default="run" basedir="."><br /> &lt;property name="src" value="src"/><br /> &lt;property name="dest" value="classes"/><br /> &lt;property name="hello_jar" value="hello1.jar"/><br /> &lt;target name="init"><br />  &lt;mkdir dir="${dest}"/><br /> &lt;/target><br /> &lt;target name="compile" depends="init"><br />  &lt;javac srcdir="${src}" destdir="${dest}"/><br /> &lt;/target><br /> &lt;target name="build" depends="compile"><br />  &lt;jar jarfile="${hello_jar}" basedir="${dest}"/><br /> &lt;/target><br /> &lt;target name="run" depends="build"><br />  &lt;java classname="test.ant.HelloWorld" classpath="${hello_jar}"/><br /> &lt;/target><br /> &lt;target name="clean"><br />  &lt;delete dir="${dest}" /><br />  &lt;delete file="${hello_jar}" /><br /> &lt;/target><br /> &lt;target name="rerun" depends="clean,run"><br />  &lt;ant target="clean" /><br />  &lt;ant target="run" /><br /> &lt;/target><br />&lt;/project><br />解释：<br />&lt;?xml version="1.0" encoding="UTF-8" ?> <br />build.xml中的第一句话，没有实际的意义<br />&lt;project name="HelloWorld" default="run" basedir="."><br />&lt;/project><br />ant的所有内容必须包含在这个里边，name是你给它取的名字，basedir故名思意就是工作的根目录 .代表当前目录。default代表默认要做的事情。<br />&lt;property name="src" value="src"/><br />类似程序中的变量，为什么这么做想一下变量的作用<br />&lt;target name="compile" depends="init"><br />  &lt;javac srcdir="${src}" destdir="${dest}"/><br />&lt;/target><br />把你想做的每一件事情写成一个target ，它有一个名字，depends是它所依赖的target，在执行这个target 例如这里的compile之前ant会先检查init是否曾经被执行过，如果执行<br />过则直接直接执行compile，如果没有则会先执行它依赖的target例如这里的init，然后在执行这个target<br />如我们的计划<br />编译：<br />&lt;target name="compile" depends="init"><br /> &lt;javac srcdir="${src}" destdir="${dest}"/><br />&lt;/target><br />做jar包:<br />&lt;target name="build" depends="compile"><br /> &lt;jar jarfile="${hello_jar}" basedir="${dest}"/><br />&lt;/target><br />运行：<br />&lt;target name="run" depends="build"><br /> &lt;java classname="test.ant.HelloWorld" classpath="${hello_jar}"/><br />&lt;/target><br />为了不用拷贝，我们可以在最开始定义好目标文件夹，这样ant直接把结果就放在目标文件夹中了<br />新建文件夹:<br />&lt;target name="init"><br /> &lt;mkdir dir="${dest}"/><br />&lt;/target><br />为了更多一点的功能体现，又加入了两个target<br />删除生成的文件<br />&lt;target name="clean"><br /> &lt;delete dir="${dest}" /><br /> &lt;delete file="${hello_jar}" /><br />&lt;/target><br />再次运行，这里显示了如何在一个target里边调用其他的target<br />&lt;target name="rerun" depends="clean,run"><br /> &lt;ant target="clean" /><br /> &lt;ant target="run" /><br />&lt;/target><br />好了，解释完成了，下边检验一下你的ant吧<br />新建一个src的文件夹，然后把HelloWorld.java按照包目录放进去<br />做好build.xml文件<br />在命令行下键入ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant<br />有的时候我们可能并不想运行程序，只想执行这些步骤中的某一两个步骤，例如我只想重新部署而不想运行，键入<br />ant build<br />ant中的每一个任务都可以这样调用ant + target name<br />好了，这样一个简单的ant任务完成了。<br /> <br /> <br />一,什么时候使用ant<br />也许你听到别人说起ant，一时冲动准备学习一下ant，当你看完了上边的第一个实例，也许你感觉ant真好，也许你感觉ant不过如此，得出这些结论都不能说错，虽然ant很好用，<br />但并不是在任何情况下都是最好的选择，例如windows上有更多更简单，更容易使用的工具，比如eclipse+myeclipse eclipse+wtp等等，无论是编译，部署，运行使用起来比ant更<br />容易，方便但有些情况则是ant发挥的好地方：<br />1,服务器上部署的时候<br />当你的程序开发完成，部署人员要部署在服务器上的时候，总不能因为因为安装一个程序就配置一个eclipse+myeclipse吧，ant在这个时候是个很好的选择，因为它小巧，容易配<br />置，你带着你写好的build.xml到任何一台服务器上，只需要做简单的修改（一些设定，例如目录），然后一两个命令完成，这难道不是一件美好的事情吗。<br />2,linux上，很多时候是这样的，程序开发是在windows下，但是程序要在linux或者unix上运行，在linux或者<br />在unix(特别是unix上)部署是个麻烦的事情，这个时候ant的特点又出来了，因为ant是跨平台的，你在build.xml可以在大多数操作系统上使用，基本不需要修改。<br />3,当服务器维护者不懂编程的时候<br />很多人都有过这样的经历，使用你们程序的人，并不懂得写程序。你得程序因为版本更新，因为修正bug需要一次又一次得重新部署。这个时候你会发现教一个人是如此得困难。但<br />是有ant后，你只需要告诉他，输入ant xxx等一两个命令，一切ok.<br />以上是我遇到得一些情况。<br />看完以上得情况，好好考虑一下，你是否需要使用ant，如果是继续。<br /> <br />进一步学习一个稍微复杂一点点的ant<br />在实际的工作过程中可能会出现以下一些情况，一个项目分成很多个模块，每个小组或者部门负责一个模块，为了测试，他们自己写了一个build.xml,而你负责把这些模块组合到<br />一起使用，写一个build.xml<br />这个时候你有两种选择：<br />1,自己重新写一个build.xml ，这将是一个麻烦的事情<br />2,尽量利用他们已经写好的build.xml，减少自己的工作<br />举个例子：<br />假设你下边有三个小组，每个小组负责一个部分，他们分别有一个src 和一个写好的build.xml<br />这个时候你拿到他们的src，你需要做的是建立三个文件夹src1 ,src2, src3分别把他们的src和build.xml放进去，然后写一个build.xml<br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;project name="main" default="build" basedir="."><br /> &lt;property name="bin" value="${basedir}\bin" /> <br /> &lt;property name="src1" value="${basedir}\src1" /> <br /> &lt;property name="src2" value="${basedir}\src2" /> <br /> &lt;property name="src3" value="${basedir}\src3" /> <br /> &lt;target name="init"><br />  &lt;mkdir dir="${bin}" /><br /> &lt;/target><br /> &lt;target name="run"><br />  &lt;ant dir="${src1}" target="run" /><br />  &lt;ant dir="${src2}" target="run" /><br />  &lt;ant dir="${src3}" target="run" /><br /> &lt;/target><br /> &lt;target name="clean"><br />  &lt;ant dir="${src1}" target="clean" /><br />  &lt;ant dir="${src2}" target="clean" /><br />  &lt;ant dir="${src3}" target="clean" /><br /> &lt;/target> <br /> &lt;target name="build" depends="init,call"><br />  &lt;copy todir="${bin}"><br />   &lt;fileset dir="${src1}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />   &lt;fileset dir="${src2}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />   &lt;fileset dir="${src3}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />  &lt;/copy><br /> &lt;/target><br /> &lt;target name="rebuild" depends="build,clean"><br />  &lt;ant target="clean" /><br />  &lt;ant target="build" /><br /> &lt;/target><br />&lt;/project><br />ok你的任务完成了。<br /> <br />ok,上边你完成了任务，但是你是否有些感触呢，在那些build.xml中，大多数是重复的，而且更改一次目录需要更改不少东西。是否能让工作做的更好一点呢，答案是肯定的。<br />引入两个东西：<br />1,propery<br />2,xml include<br />这两个东西都有一个功能，就是能把build.xml中&lt;propery />中的内容分离出来，共同使用<br />除此之外它们各有特点：<br />propery的特点是维护简单，只需要简单的键值对，因为并不是所有人都喜欢xml的格式<br />xml include的特点是不单可以提取出属性来，连target也可以。<br />还是以前的例子：<br />例如我们想把src1 src2 src3这三个属性从xml中提出来，可以新建一个文件叫all.properties<br />里边的内容<br />src1=D:\\study\\ant\\src1<br />src2=D:\\study\\ant\\src2<br />src3=D:\\study\\ant\\src3<br />然后你的build.xml文件可以这样写，别人只需要更改配置文件，而不许要更改你的build.xml文件了<br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;project name="main" default="build" basedir="."><br /> &lt;property file="all.properties" /> <br /> &lt;property name="bin" value="${basedir}\bin" /> <br /> &lt;target name="init"><br />  &lt;mkdir dir="${bin}" /><br /> &lt;/target><br /> &lt;target name="run"><br />  &lt;ant dir="${src1}" target="run" /><br />  &lt;ant dir="${src2}" target="run" /><br />  &lt;ant dir="${src3}" target="run" /><br /> &lt;/target><br /> &lt;target name="clean"><br />  &lt;ant dir="${src1}" target="clean" /><br />  &lt;ant dir="${src2}" target="clean" /><br />  &lt;ant dir="${src3}" target="clean" /><br /> &lt;/target> <br /> &lt;target name="build" depends="init,call"><br />  &lt;copy todir="${bin}"><br />   &lt;fileset dir="${src1}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />   &lt;fileset dir="${src2}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />   &lt;fileset dir="${src3}"><br />    &lt;include name="*.jar" /><br />   &lt;/fileset><br />  &lt;/copy><br /> &lt;/target><br /> &lt;target name="rebuild" depends="build,clean"><br />  &lt;ant target="clean" /><br />  &lt;ant target="build" /><br /> &lt;/target><br /> &lt;target name="test"><br />  &lt;ant dir="${src1}" target="test" /><br />  &lt;ant dir="${src2}" target="test" /><br />  &lt;ant dir="${src3}" target="test" /><br /> &lt;/target><br />&lt;/project><br />如果你自己看的话你会看到这样一个target<br />&lt;target name="test"><br /> &lt;ant dir="${src1}" target="test" /><br /> &lt;ant dir="${src2}" target="test" /><br /> &lt;ant dir="${src3}" target="test" /><br />&lt;/target><br />有的时候你想给每个小组的build.xml加入几个target，一种做法是每个里边写，然后在这里调用<br />但是有一种更好的方法。<br />你可以写一个include.xml文件，内容如下<br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;property name="src" value="src"/><br />&lt;property name="dest" value="classes"/><br />&lt;target name="test" ><br /> &lt;ant target="run" /><br />&lt;/target><br />然后更改你三个小组的build.xml文件,每个里边加入如下内容<br />&lt;!--include a xml file ,it can be common propery ,can be also a target  --><br />&lt;!DOCTYPE project [<br />&lt;!ENTITY share-variable SYSTEM "file:../include.xml"><br />]><br />&share-variable;<br />变成如下的样子<br />这个时候，你只要在include.xml添加propery , 添加target，三个build.xml会同时添加这些propery和target<br />而且不会让三个组的build.xml变得更复杂。<br />&lt;?xml version="1.0" encoding="UTF-8" ?><br />&lt;!--include a xml file ,it can be common propery ,can be also a target  --><br />&lt;!DOCTYPE project [<br />&lt;!ENTITY share-variable SYSTEM "file:../include.xml"><br />]><br />&lt;project name="HelloWorld" default="run" basedir="."><br /> &lt;!--use the include  --><br /> &share-variable;<br /> &lt;!--defined the property--><br /> &lt;!--via include<br /> &lt;property name="src" value="src"/><br /> &lt;property name="dest" value="classes"/><br /> --><br /> &lt;property name="hello_jar" value="hello1.jar"/><br /> &lt;!--define the op--><br /> &lt;target name="init"><br />  &lt;mkdir dir="${dest}"/><br /> &lt;/target><br /> &lt;target name="compile" depends="init"><br />  &lt;javac srcdir="${src}" destdir="${dest}"/><br /> &lt;/target><br /> &lt;target name="build" depends="compile"><br />  &lt;jar jarfile="${hello_jar}" basedir="${dest}"/><br /> &lt;/target><br /> &lt;target name="run" depends="build"><br />  &lt;java classname="test.ant.HelloWorld" classpath="${hello_jar}"/><br /> &lt;/target><br /> &lt;target name="clean"><br />  &lt;delete dir="${dest}" /><br />  &lt;delete file="${hello_jar}" /><br /> &lt;/target><br /> &lt;target name="rerun" depends="clean,run"><br />  &lt;ant target="clean" /><br />  &lt;ant target="run" /><br /> &lt;/target><br />&lt;/project><br /> <br />掌握了上边的那些内容之后，你就知道如何去写一个好的ant，但是你会发现当你真的想去做的时候，你不能马上作出好的build.xml，因为你知道太少的ant的默认提供的命令.这<br />个时候如果你想完成任务，并提高自己，有很多办法：<br />1,很多开源的程序都带有build.xml，看看它们如何写的<br />2,ant的document，里边详细列写了ant的各种默认命令，及其丰富<br />3,google，永远不要忘记它<br />ok,在这之后随着你写的ant build越来越多，你知道的命令就越多，ant在你的手里也就越来越强大了。<br />这个是一个慢慢积累的过程。 <br /><br />ant的例子很好找，各种开源框架都会带有一个build.xml仔细看看，会有很大收获<br />另外一个经常会用到的，但是在开源框架的build.xml一般没有的是cvs<br />如果使用的是远程的cvs，可以这样使用<br />&lt;xml version="1.0" encoding="utf-8"?><br />&lt;project><br />     &lt;property name="cvsroot" value=":pserver:wang:@192.168.1.2:/cvsroot"/><br />     &lt;property name="basedir" value="/tmp/testant/"/><br />     &lt;property name="cvs.password" value="wang"/><br />     &lt;property name="cvs.passfile" value="${basedir}/ant.cvspass"/><br />     &lt;target name="initpass"><br />             &lt;cvspass cvsroot="${cvsroot}" password="${cvs.password}" passfile="${cvs.passfile}"/><br />     &lt;/target><br />     &lt;target name="checkout" depends="initpass"><br />             &lt;cvs cvsroot="${cvsroot}" command="checkout" cvsrsh="ssh" package="myproject" dest="${basedir}" <br />              passfile="${cvs.passfile}"/><br />      &lt;/target><br />&lt;/project><br /><br />在eclipse里边先天支持ant，所以你可以在eclipse里边直接写build.xml<br />因为eclipse提供了提示功能，自动补充功能，它能让你事半功倍。<br />使用方法，只需要建立一个工程，然后建立一个叫build.xml的文件。然后就可以在里边写你的ant build了<br />但是时刻记住http://www.apache.org/永远能找到你需要的东西
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/185013#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, 21 Apr 2008 16:05:50 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/185013</link>
        <guid>http://java-lk.javaeye.com/blog/185013</guid>
      </item>
      <item>
        <title>web service 学习资料搜集（陆续更新）</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/183710" style="color:red;">http://java-lk.javaeye.com/blog/183710</a>&nbsp;
          发表时间: 2008年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          axis2英文文档  http://ws.apache.org/axis2/1_3/toc.html<br />axis2中文文档  http://tech.surfcareer.com/axis2/index.html<br /><br /><br />本站知识库  http://www.javaeye.com/subject/Axis-Webservice<br /><br />IBM  http://www.ibm.com/developerworks/cn/webservices/ws-intwsdl/part1/#N10054<br /><br />本站内的有经验者  http://tenn.javaeye.com/category/15833<br /><br />另外感谢一下 http://mler.javaeye.com/category/24602我是通过该博客找到以上资料的<br /><br />又找到一个好地方  bea的：http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/core/index.html<br />可惜要用Workshop<br /><br /><br />不是知名的网站也许有用 ：http://www.cm1314.cn/article/web/webservice/<br /><br />http://www.cm1314.cn/Article/web/webservice/200703/5497.html<br /><br /><br />http://www.family168.com/tutorial/axis14/html/<br /><br /><br />http://tech.it168.com/zt/webservice/index.html<br /><br />该blog上基础理论很好，实际例子步骤正确（没试过不知道是否调得过）http://dzqlhh.javaeye.com（补充一下是axis的）
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/183710#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, 17 Apr 2008 11:34:59 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/183710</link>
        <guid>http://java-lk.javaeye.com/blog/183710</guid>
      </item>
      <item>
        <title>js 读写本地文件整理</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/183176" style="color:red;">http://java-lk.javaeye.com/blog/183176</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          简单明了比《Javascript之文件操作 (IE)》实用！<br /><br /><br />&lt;script><br />/*<br />object.OpenTextFile(filename[, iomode[, create[, format]]])<br />参数<br />object <br />必选项。object 应为 FileSystemObject 的名称。 <br />filename <br />必选项。指明要打开文件的字符串表达式。 <br />iomode <br />可选项。可以是三个常数之一：ForReading 、 ForWriting 或 ForAppending 。 <br />create <br />可选项。Boolean 值，指明当指定的 filename 不存在时是否创建新文件。如果创建新文件则值为 True ，如果不创建则为 False 。如果忽略，则不创建新文件。 <br />format <br />可选项。使用三态值中的一个来指明打开文件的格式。如果忽略，那么文件将以 ASCII 格式打开。 <br />设置<br />iomode 参数可以是下列设置中的任一种：<br />常数 值         描述 <br />ForReading 1 以只读方式打开文件。不能写这个文件。 <br />ForWriting 2 以写方式打开文件 <br />ForAppending 8 打开文件并从文件末尾开始写。 <br /><br />format 参数可以是下列设置中的任一种：<br />值              描述 <br />TristateTrue 以 Unicode 格式打开文件。 <br />TristateFalse 以 ASCII 格式打开文件。 <br />TristateUseDefault 使用系统默认值打开文件。<br />*/<br /><br />//读文件<br />function readFile(filename){	<br />	var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />	var f = fso.OpenTextFile(filename,1); <br />	var s = ""; <br />	while (!f.AtEndOfStream)<br />		s += f.ReadLine()+"\n";<br />	f.Close();<br />	return s;	<br />}<br /><br />//写文件<br />function writeFile(filename,filecontent){<br />    var fso, f, s ; <br />    fso = new ActiveXObject("Scripting.FileSystemObject");    <br />    f = fso.OpenTextFile(filename,8,true);<br />    f.WriteLine(filecontent);   <br />    f.Close();<br />	alert('ok');<br />}<br /><br />&lt;/script><br />&lt;html><br />&lt;input type="text" id="in" name="in" /><br />&lt;input type="button" value="Write!" onclick="writeFile('c:/12.txt',document.getElementById('in').value);"/>&lt;br>&lt;br><br />&lt;input type="button" value="Read!" onclick="document.getElementById('show').value=readFile('c:/12.txt');"/>&lt;br><br />&lt;textarea id="show" name="show" cols="50" rows="8" ><br />&lt;/textarea><br />&lt;/html>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/183176#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, 16 Apr 2008 10:38:33 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/183176</link>
        <guid>http://java-lk.javaeye.com/blog/183176</guid>
      </item>
      <item>
        <title>JS读取本地文本文件（不用fso）</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/183130" style="color:red;">http://java-lk.javaeye.com/blog/183130</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Only For IE<br /><br /><br />&lt;SCRIPT><br />//&lt;!--<br />function onDownloadDone(s) {<br />        oText.value=s;<br />}<br />//--><br />&lt;/SCRIPT><br />&lt;BODY><br />&lt;IE:DOWNLOAD ID="oDownload" STYLE="behavior:url(#default#download)" /><br />&lt;input type="file" id="src"><br />&lt;A HREF="#" onclick="if(src.value!='')oDownload.startDownload(src.value, onDownloadDone)">读取TXT&lt;/A><br />&lt;BR>&lt;BR><br />&lt;TEXTAREA ID=oText COLS=70 ROWS=10><br />&lt;/TEXTAREA>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/183130#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, 16 Apr 2008 09:25:13 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/183130</link>
        <guid>http://java-lk.javaeye.com/blog/183130</guid>
      </item>
      <item>
        <title>Javascript之文件操作 (IE)</title>
        <author>java_lk</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://java-lk.javaeye.com">java_lk</a>&nbsp;
          链接：<a href="http://java-lk.javaeye.com/blog/183111" style="color:red;">http://java-lk.javaeye.com/blog/183111</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自： http://www.jb51.net/article/7905.htm<br /><br />一、功能实现核心：FileSystemObject 对象  <br />    要在javascript中实现文件操作功能，主要就是依靠FileSystemobject对象。 <br />二、FileSystemObject编程  <br />使用FileSystemObject 对象进行编程很简单，一般要经过如下的步骤： 创建FileSystemObject对象、应用相关方法、访问对象相关属性 。  <br />（一）创建FileSystemObject对象  <br />创建FileSystemObject对象的<br />代码只要1行：  <br />var fso = new ActiveXObject("Scripting.FileSystemObject");  <br />上述代码执行后，fso就成为一个FileSystemObject对象实例。  <br />（二）应用相关方法  <br />创建对象实例后，就可以使用对象的相关方法了。比如，使用CreateTextFile方法创建一个文本文件：  <br />var fso = new ActiveXObject("Scripting.FileSystemObject");  <br />var f1 = fso.createtextfile("c:\\myjstest.txt",true");  <br />（三）访问对象相关属性  <br />要访问对象的相关属性，首先要建立指向对象的句柄，这就要通过get系列方法实现：GetDrive负责获取驱动器信息，GetFolder负责获取文件夹信息，GetFile负责获取文件信息。比如，指向下面的代码后，f1就成为指向文件c:\test.txt的句柄：  <br />var fso = new ActiveXObject("Scripting.FileSystemObject");  <br />var f1 = fso.GetFile("c:\\myjstest.txt");  <br />然后，使用f1访问对象的相关属性。比如：  <br />var fso = new ActiveXObject("Scripting.FileSystemObject");  <br />var f1 = fso.GetFile("c:\\myjstest.txt");  <br />alert("File last modified: " + f1.DateLastModified);  <br />执行上面最后一句后，将显示c:\myjstest.txt的最后修改日期属性值。  <br />但有一点请注意：对于使用create方法建立的对象，就不必再使用get方法获取对象句柄了，这时直接使用create方法建立的句柄名称就可以：  <br />var fso = new ActiveXObject("Scripting.FileSystemObject");  <br />var f1 = fso.createtextfile("c:\\myjstest.txt",true");  <br />alert("File last modified: " + f1.DateLastModified);  <br />三、操作驱动器（Drives）  <br />使用FileSystemObject对象来编程操作驱动器（Drives）和文件夹（Folders）很容易，这就象在Windows文件浏览器中对文件进行交互操作一样，比如：拷贝、移动文件夹，获取文件夹的属性。  <br />（一）Drives对象属性  <br />Drive对象负责收集系统中的物理或逻辑驱动器资源内容，它具有如下属性：  <br />l TotalSize：以字节（byte）为单位计算的驱动器大小。  <br />l AvailableSpace或FreeSpace：以字节（byte）为单位计算的驱动器可用空间。  <br />l DriveLetter：驱动器字母。  <br />l DriveType：驱动器类型，取值为：removable（移动介质）、fixed（固定介质）、network（网络资源）、CD-ROM或者RAM盘。  <br />l SerialNumber：驱动器的系列码。  <br />l FileSystem：所在驱动器的文件系统类型，取值为FAT、FAT32和NTFS。  <br />l IsReady：驱动器是否可用。  <br />l ShareName：共享名称。  <br />l VolumeName：卷标名称。  <br />l Path和RootFolder：驱动器的路径或者根目录名称。  <br />（二）Drive对象操作例程  <br />下面的例程显示驱动器C的卷标、总容量和可用空间等信息：  <br />var fso, drv, s ="";  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />drv = fso.GetDrive(fso.GetDriveName("c:\\"));  <br />s += "Drive C:" + " - ";  <br />s += drv.VolumeName + "\n";  <br />s += "Total Space: " + drv.TotalSize / 1024;  <br />s += " Kb" + "\n";  <br />s += "Free Space: " + drv.FreeSpace / 1024;  <br />s += " Kb" + "\n";  <br />alert(s);  <br />四、操作文件夹（Folders）  <br />涉及到文件夹的操作包括创建、移动、删除以及获取相关属性。  <br />Folder对象操作例程 : <br />下面的例程将练习获取父文件夹名称、创建文件夹、删除文件夹、判断是否为根目录等操作：  <br />var fso, fldr, s = "";  <br />// 创建FileSystemObject对象实例  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />// 获取Drive 对象  <br />fldr = fso.GetFolder("c:\\");  <br />// 显示父目录名称  <br />alert("Parent folder name is: " + fldr + "\n");  <br />// 显示所在drive名称  <br />alert("Contained on drive " + fldr.Drive + "\n");  <br />// 判断是否为根目录  <br />if (fldr.IsRootFolder)  <br />alert("This is the root folder.");  <br />else  <br />alert("This folder isn't a root folder.");  <br />alert("\n\n");  <br />// 创建新文件夹  <br />fso.CreateFolder ("C:\\Bogus");  <br />alert("Created folder C:\\Bogus" + "\n");  <br />// 显示文件夹基础名称，不包含路径名  <br />alert("Basename = " + fso.GetBaseName("c:\\bogus") + "\n");  <br />// 删除创建的文件夹  <br />fso.DeleteFolder ("C:\\Bogus");  <br />alert("Deleted folder C:\\Bogus" + "\n");  <br />五、操作文件（Files）  <br />对文件进行的操作要比以上介绍的驱动器（Drive）和文件夹（Folder）操作复杂些，基本上分为以下两个类别：对文件的创建、拷贝、移动、删除操作和对文件内容的创建、添加、删除和读取操作。下面分别详细介绍。  <br />（一）创建文件  <br />一共有3种方法可用于创建一个空文本文件，这种文件有时候也叫做文本流（text stream）。  <br />第一种是使用CreateTextFile方法。代码如下：  <br />var fso, f1;  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />f1 = fso.CreateTextFile("c:\\testfile.txt", true);  <br />第二种是使用OpenTextFile方法，并添加上ForWriting属性，ForWriting的值为2。代码如下：  <br />var fso, ts;  <br />var ForWriting= 2;  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true);  <br />第三种是使用OpenAsTextStream方法，同样要设置好ForWriting属性。代码如下：  <br />var fso, f1, ts;  <br />var ForWriting = 2;  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />fso.CreateTextFile ("c:\\test1.txt");  <br />f1 = fso.GetFile("c:\\test1.txt");  <br />ts = f1.OpenAsTextStream(ForWriting, true);  <br />（二）添加数据到文件  <br />当文件被创建后，一般要按照“打开文件－>填写数据－>关闭文件”的步骤实现添加数据到文件的目的。  <br />打开文件可使用FileSystemObject对象的OpenTextFile方法，或者使用File对象的OpenAsTextStream方法。  <br />填写数据要使用到TextStream对象的Write、WriteLine或者WriteBlankLines方法。在同是实现写入数据的功能下，这3者的区别在于：Write方法不在写入数据末尾添加新换行符，WriteLine方法要在最后添加一个新换行符，而WriteBlankLines则增加一个或者多个空行。  <br />关闭文件可使用TextStream对象的Close方法。  <br />（三）创建文件及添加数据例程  <br />下面的代码将创建文件、添加数据、关闭文件几个步骤结合起来进行应用：  <br />var fso, tf;  <br />fso = new ActiveXObject("Scripting.FileSystemObject");  <br />// 创建新文件  <br />tf = fso.CreateTextFile("c:\\testfile.txt", true);  <br />// 填写数据，并增加换行符  <br />tf.WriteLine("Testing 1, 2, 3.") ;  <br />// 增加3个空行  <br />tf.WriteBlankLines(3) ;  <br />// 填写一行，不带换行符  <br />tf.Write ("This is a test.");  <br />// 关闭文件  <br />tf.Close();  <br />（四）读取文件内容  <br />从文本文件中读取数据要使用TextStream对象的Read、ReadLine或ReadAll 方法。Read方法用于读取文件中指定数量的字符； ReadLine方法读取一整行，但不包括换行符；ReadAll方法则读取文本文件的整个内容。读取的内容存放于字符串变量中，用于显示、分析。 <br />  <br />方法或者属性 描述  <br />BuildPath()  <br /> 生成一个文件路径  <br />CopyFile()  复制文件  <br />CopyFolder() 复制目录  <br />CreateFolder()  创建新目录  <br />CreateTextFile()  生成一个文件  <br />DeleteFile()  删除一个文件  <br />DeleteFolder()  删除一个目录  <br />DriveExists()  检验盘符是否存在  <br />Drives 返回盘符的集合  <br />FileExists()  检验文件是否存在  <br />FolderExists 检验一个目录是否存在  <br />GetAbsolutePathName()  取得一个文件的绝对路径  <br />GetBaseName()  取得文件名  <br />GetDrive()  取得盘符名  <br />GetDriveName()  取得盘符名  <br />GetExtensionName()  取得文件的后缀  <br />GetFile()  生成文件对象  <br />GetFileName()  取得文件名  <br />GetFolder()  取得目录对象  <br />GetParentFolderName 取得文件或目录的父目录名  <br />GetSpecialFolder()  取得特殊的目录名  <br />GetTempName()  生成一个临时文件对象  <br />MoveFile()  移动文件  <br />MoveFolder()  移动目录  <br />OpenTextFile()  打开一个文件流 <br /><br />f.Files //目录下所有文件集合 <br />f.attributes //文件属性 <br />  Case 0 Str="普通文件。没有设置任何属性。 " <br />  Case 1 Str="只读文件。可读写。 " <br />  Case 2 Str="隐藏文件。可读写。 " <br />  Case 4 Str="系统文件。可读写。 " <br />  Case 16 Str="文件夹或目录。只读。 " <br />  Case 32 Str="上次备份后已更改的文件。可读写。 "  <br />  Case 1024 Str="链接或快捷方式。只读。 " <br />  Case 2048 Str=" 压缩文件。只读。" <br />f.Datecreated // 创建时间 <br />f.DateLastAccessed //上次访问时间 <br />f.DateLastModified // 上次修改时间 <br />f.Path //文件路径 <br />f.Name //文件名称 <br />f.Type //文件类型 <br />f.Size // 文件大小（单位：字节） <br />f.ParentFolder //父目录 <br />f.RootFolder // 根目录  <br /> 实例说明 <br />BuildPath(路径,文件名) //这个方法会对给定的路径加上文件，并自动加上分界符  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var newpath = fso.BuildPath("c:\\tmp", "51js.txt"); //生成 c:\tmp\51js.txt的路径 <br />alert(newpath); <br />--> <br />&lt;/SCRIPT>  <br />CopyFile(源文件, 目标文件, 覆盖) //复制源文件到目标文件，当覆盖值为true时，如果目标文件存在会把文件覆盖  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bak"); <br />--> <br />&lt;/SCRIPT>  <br />CopyFolder(对象目录,目标目录 ,覆盖) //复制对象目录到目标目录，当覆盖为true时，如果目标目录存在会把文件覆盖  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //把C盘的Desktop目录复制到D盘的根目录 <br />--> <br />&lt;/SCRIPT>  <br />CreateFolder(目录名) //创建一个新的目录  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var newFolderName = fso.CreateFolder("c:\\51JS"); //在C盘上创建一个51JS的目录  <br />--> <br />&lt;/SCRIPT>  <br />CreateTextFile(文件名, 覆盖) //创建一个新的文件，如果此文件已经存在，你需要把覆盖值定为true  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var newFileObject = fso.CreateTextFile("c:\\autoexec51JS.bat", true); //脚本将在C盘创建一个叫 autoexec51JS.bat的文件 <br />--> <br />&lt;/SCRIPT>  <br />DeleteFile(文件名, 只读？) //删除一个文件，如果文件的属性是只读的话，你需要把只读值设为true  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); //为了安全我先把要删除的autoexec.bat备份到你的D盘 <br />var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盘的autoexec.bat文件删除掉  <br />fso.DeleteFile("c:\\autoexec.bat", true); <br />--> <br />&lt;/SCRIPT>  <br />DeleteFolder(文件名, 只读？)//删除一个目录，如果目录的属性是只读的话，你需要把只读值设为true  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //为了安全我先把你C盘的Desktop目录复制到你D盘的根目录 <br />fso.DeleteFolder("c:\\WINDOWS\\Desktop", true); //把你的Desktop目录删除，但因为desktop是系统的东西，所以不能全部删除，但......... <br />--> <br />&lt;/SCRIPT>  <br />DriveExists(盘符) //检查一个盘是否存在，如果存在就返会真，不存在就返回.......  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />hasDriveD = fso.DriveExists("d"); //检查系统是否有D盘存在 <br />hasDriveZ = fso.DriveExists("z"); //检查系统是否有Z盘存在 <br />if (hasDriveD) alert("你的系统内有一个D盘"); <br />if (!hasDriveZ) alert("你的系统内没有Z盘"); <br />--> <br />&lt;/SCRIPT>  <br />FileExists(文件名) //检查一个文件是否存在，如果存在就返会真，不存在就返回.......  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />fileName = fso.FileExists("c:\\autoexec.bat"); <br />if (fileName) alert("你在C盘中有autoexec.bat文件，按下确定后这个文件将被删除！"); //开个玩笑:)  <br />--> <br />&lt;/SCRIPT>  <br />FolderExists(目录名) //检查一个目录是否存在，如果存在就返会真，不存在就返回.......  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />folderName = fso.FolderExists("c:\\WINDOWS\\Fonts"); <br />if (folderName) alert("按下确定后系统的字库将被删除！"); //开个玩笑:)  <br />--> <br />&lt;/SCRIPT>  <br />GetAbsolutePathName(文件对象) //返回文件对象在系统的绝对路径  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />pathName = fso.GetAbsolutePathName("c:\\autoexec.bat");  <br />alert(pathName); <br />--> <br />&lt;/SCRIPT>  <br />GetBaseName(文件对象) //返回文件对象的文件名  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />baseName = fso.GetBaseName("c:\\autoexec.bat"); //取得autoexec.bat的文件名autoexec <br />alert(baseName); <br />--> <br />&lt;/SCRIPT>  <br />GetExtensionName(文件对象) //文件的后缀  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />exName = fso.GetExtensionName("c:\\autoexec.bat"); //取得autoexec.bat后缀bat <br />alert(exName); <br />--> <br />&lt;/SCRIPT>  <br />GetParentFolderName(文件对象) //取得父级的目录名  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />parentName = fso.GetParentFolderName("c:\\autoexec.bat"); //取得autoexec.bat的父级目录C盘 <br />alert(parentName); <br />--> <br />&lt;/SCRIPT>  <br />GetSpecialFolder(目录代码) //取得系统中一些特别的目录的路径，目录代码有3个分别是 0:安装Window的目录 1:系统文件目录 2:临时文件目录  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />tmpFolder = fso.GetSpecialFolder(2); //取得系统临时文件目录的路径 如我的是 C:\windows\temp <br />alert(tmpFolder); <br />--> <br />&lt;/SCRIPT>  <br />GetTempName() //生成一个随机的临时文件对象，会以rad带头后面跟着些随机数，就好象一些软件在安装时会生成*.tmp  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />tmpName = fso.GetTempName(); //我在测试时就生成了radDB70E.tmp <br />alert(tmpName); <br />--> <br />&lt;/SCRIPT>  <br />MoveFile(源文件, 目标文件) //把源文件移到目标文件的位置  <br />&lt;SCRIPT LANGUAGE="JavaScript"> <br />&lt;!-- <br />var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />var newpath = fso.MoveFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盘的autoexec.bat文件移移动到D盘 <br />--> <br />&lt;/SCRIPT>
          <br/>
          <span style="color:red;">
            <a href="http://java-lk.javaeye.com/blog/183111#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>Wed, 16 Apr 2008 09:10:03 +0800</pubDate>
        <link>http://java-lk.javaeye.com/blog/183111</link>
        <guid>http://java-lk.javaeye.com/blog/183111</guid>
      </item>
  </channel>
</rss>