<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>GT-Grid</title>
    <description>GT-Grid 一个功能丰富,简单易用的列表组件. 
它可能不是最好的,但也许是你最需要的.</description>
    <link>http://ecside.group.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>主题：有关Oracle时间日期的操作</title>
        <author>sunsja</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunsja.javaeye.com">sunsja</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/192131" style="color:red;">http://ecside.group.javaeye.com/group/blog/192131</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="position: relative;"><span style="font-family: 仿宋;"><span><br /><span style="font-size: small;">sysdate + 1/24/60/60&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1秒<br />sysdate + 1/24/60&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1分钟<br />sysdate + 1/24&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1小时<br />sysdate + 1&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1天<br />add_months(sysdate,-1)&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1月<br />add_months(sysdate,-1*12)&nbsp;&nbsp;&nbsp; 在系统时间基础上延迟1年</span></span></span></div>
<p style="position: relative;"><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">上月末的日期：&nbsp;&nbsp;&nbsp; select last_day(add_months(sysdate, -1)) from dual;<br />本月的最后一秒：&nbsp;&nbsp;&nbsp; select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual<br />本周星期一的日期：select trunc(sysdate,'day') + 1 from dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">年初至今的天数：select ceil(sysdate - trunc(sysdate, 'year')) from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">本月的天数&nbsp;&nbsp;&nbsp; SELECT to_char(last_day(SYSDATE),'dd') days FROM dual<br />今年的天数&nbsp;&nbsp;&nbsp; select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual<br />下个星期一的日期&nbsp;&nbsp;&nbsp; SELECT Next_day(SYSDATE,'monday') FROM dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">--计算工作日方法</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">create table t(s date,e date);<br />alter session set nls_date_format = 'yyyy-mm-dd';<br />insert into t values('2003-03-01','2003-03-03');<br />insert into t values('2003-03-02','2003-03-03');<br />insert into t values('2003-03-07','2003-03-08');<br />insert into t values('2003-03-07','2003-03-09');<br />insert into t values('2003-03-05','2003-03-07');<br />insert into t values('2003-02-01','2003-03-31');</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">-- 这里假定日期都是不带时间的，否则在所有日期前加trunc即可。<br />select s,e,e-s + 1 total_days, trunc((e-s + 1)/7)*5 + length(replace(substr('01111100111110',to_char(s,'d'),mod(e-s + 1,7)),'0','')) work_days from t;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">-- drop table t;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">判断当前时间是上午下午还是晚上</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">SELECT CASE <br />WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN '上午'<br />WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN '下午'<br />WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN '晚上'<br />END<br />FROM dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">Oracle 中的一些处理日期</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">将数字转换为任意时间格式.如秒:需要转换为天/小时<br />SELECT to_char(floor(TRUNC(936000/(60*60))/24))||'天'||to_char(mod(TRUNC(936000/(60*60)),24))||'小时' FROM DUAL</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">TO_DATE格式 <br />Day: <br />dd number 12 <br />dy abbreviated fri <br />day spelled out friday <br />ddspth spelled out, ordinal twelfth <br />Month: <br />mm number 03 <br />mon abbreviated mar <br />month spelled out march <br />Year: <br />yy two digits 98 <br />yyyy four digits 1998</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">24小时格式下时间范围为： 0:00:00 - 23:59:59.... <br />12小时格式下时间范围为： 1:00:00 - 12:59:59 .... <br />1，日期和字符转换函数用法（to_date,to_char）</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">2，select to_char( to_date(222,'J'),'Jsp') from dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">显示Two Hundred Twenty-Two</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">3，求某天是星期几 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; <br />星期一 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; <br />monday <br />设置日期语言 <br />ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; <br />也可以这样 <br />TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">4，两个日期间的天数 <br />select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">5，时间为null的用法 <br />select id, active_date from table1 <br />UNION <br />select 1, TO_DATE(null) from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">注意要用TO_DATE(null)</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">6，a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') <br />那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 <br />所以，当时间需要精确的时候，觉得to_char还是必要的</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">7，日期格式冲突问题 <br />输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' <br />alter system set NLS_DATE_LANGUAGE = American <br />alter session set NLS_DATE_LANGUAGE = American <br />或者在to_date中写 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; <br />注意我这只是举了NLS_DATE_LANGUAGE，当然还有很多， <br />可查看 <br />select * from nls_session_parameters <br />select * from V$NLS_PARAMETERS</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">8，select count(*) <br />from ( select rownum-1 rnum <br />from all_objects <br />where rownum &lt;= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- <br />02-01','yyyy-mm-dd') + 1 <br />) <br />where to_char( to_date('2002-02-01','yyyy-mm-dd') + rnum-1, 'D' ) <br />not <br />in ( '1', '7' )</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">查找2002-02-28至2002-02-01间除星期一和七的天数 <br />在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)。</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">9，select months_between(to_date('01-31-1999','MM-DD-YYYY'), <br />to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; <br />1</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">select months_between(to_date('02-01-1999','MM-DD-YYYY'), <br />to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">1.03225806451613</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">10，Next_day的用法 <br />Next_day(date, day)</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">Monday-Sunday, for format code DAY <br />Mon-Sun, for format code DY <br />1-7, for format code D</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">11，select to_char(sysdate,'hh:mi:ss') TIME from all_objects <br />注意：第一条记录的TIME 与最后一行是一样的 <br />可以建立一个函数来处理这个问题 <br />create or replace function sys_date return date is <br />begin <br />return sysdate; <br />end;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">select to_char(sys_date,'hh:mi:ss') from all_objects;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">12，获得小时数</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer <br />SQL&gt; select sysdate ,to_char(sysdate,'hh') from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">SYSDATE TO_CHAR(SYSDATE,'HH') <br />-------------------- --------------------- <br />2003-10-13 19:35:21 07</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">SQL&gt; select sysdate ,to_char(sysdate,'hh24') from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">SYSDATE TO_CHAR(SYSDATE,'HH24') <br />-------------------- ----------------------- <br />2003-10-13 19:35:21 19</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">获取年月日与此类似</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">13，年月日的处理 <br />select older_date, <br />newer_date, <br />years, <br />months, <br />abs( <br />trunc( <br />newer_date- <br />add_months( older_date,years*12 + months ) <br />) <br />) days <br />from ( select <br />trunc(months_between( newer_date, older_date )/12) YEARS, <br />mod(trunc(months_between( newer_date, older_date )), <br />12 ) MONTHS, <br />newer_date, <br />older_date <br />from ( select hiredate older_date, <br />add_months(hiredate,rownum) + rownum newer_date <br />from emp ) <br />)</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">14，处理月份天数不定的办法 <br />select to_char(add_months(last_day(sysdate) + 1, -2), 'yyyymmdd'),last_day(sysdate) from dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">15，找出今年的天数 <br />select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">闰年的处理方法 <br />to_char( last_day( to_date('02' &brvbar; &brvbar; :year,'mmyyyy') ), 'dd' ) <br />如果是28就不是闰年</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">16，yyyy与rrrr的区别 <br />'YYYY99 TO_C <br />------- ---- <br />yyyy 99 0099 <br />rrrr 99 1999 <br />yyyy 01 0001 <br />rrrr 01 2001</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">17，不同时区的处理 <br />select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate <br />from dual;</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">18，5秒钟一个间隔 <br />Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') <br />from dual</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">2002-11-1 9:55:00 35786 <br />SSSSS表示5位秒数</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">19，一年的第几天 <br />select TO_CHAR(SYSDATE,'DDD'),sysdate from dual <br />310 2002-11-6 10:03:51</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">20.计算小时,分,秒,毫秒 <br />select <br />Days, <br />A, <br />TRUNC(A*24) Hours, <br />TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, <br />TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, <br />TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds <br />from <br />( <br />select <br />trunc(sysdate) Days, <br />sysdate - trunc(sysdate) A <br />from dual <br />)</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">select * from tabname <br />order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">// <br />floor((date2-date1) /365) 作为年 <br />floor((date2-date1, 365) /30) 作为月 <br />mod(mod(date2-date1, 365), 30)作为日。</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;">21.next_day函数 <br />next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 <br />1 2 3 4 5 6 7 <br />日 一 二 三 四 五 六</span></span></p>
<p><span style="font-family: 仿宋;"><span style="font-size: small;"><span>select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from dual <br />日期 返回的是天 然后 转换为ss</span><br /></span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/192131#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 12 May 2008 10:27:33 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/192131</link>
        <guid>http://ecside.group.javaeye.com/group/blog/192131</guid>
      </item>
          <item>
        <title>Oracle 日期函数</title>
        <author>sunsja</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunsja.javaeye.com">sunsja</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/192128" style="color:red;">http://ecside.group.javaeye.com/group/blog/192128</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一、 常用日期数据格式</p>
<p><br />1.Y或YY或YYY 年的最后一位，两位或三位 </p>
<p>SQL&gt; Select to_char(sysdate,'Y') from dual;</p>
<p>TO_CHAR(SYSDATE,'Y')<br />--------------------<br />7</p>
<p>SQL&gt; Select to_char(sysdate,'YY') from dual;</p>
<p>TO_CHAR(SYSDATE,'YY')<br />---------------------<br />07</p>
<p>SQL&gt; Select to_char(sysdate,'YYY') from dual;</p>
<p>TO_CHAR(SYSDATE,'YYY')<br />----------------------<br />007</p>
<p>2.Q 季度 1～3月为第一季度，2表示第二季度。</p>
<p>SQL&gt; Select to_char(sysdate,'Q') from dual;</p>
<p>TO_CHAR(SYSDATE,'Q')<br />--------------------<br />2</p>
<p>3.MM 月份数</p>
<p>SQL&gt; Select to_char(sysdate,'MM') from dual;</p>
<p>TO_CHAR(SYSDATE,'MM')<br />---------------------<br />05</p>
<p>4.RM 月份的罗马表示 （V在罗马数字中表示 5）</p>
<p>SQL&gt; Select to_char(sysdate,'RM') from dual;</p>
<p>TO_CHAR(SYSDATE,'RM')<br />---------------------<br />V</p>
<p>5.Month 用9个字符长度表示的月份名</p>
<p>SQL&gt; Select to_char(sysdate,'Month') from dual;</p>
<p>TO_CHAR(SYSDATE,'MONTH')<br />------------------------<br />5月</p>
<p>6.WW 当年第几周 （2007年5月29日为2007年第22周）</p>
<p>SQL&gt; Select to_char(sysdate,'WW') from dual;</p>
<p>TO_CHAR(SYSDATE,'WW')<br />---------------------<br />22</p>
<p>7.W 本月第几周 （2007年5月29日为5月第5周）</p>
<p>SQL&gt; Select to_char(sysdate,'W') from dual;</p>
<p>TO_CHAR(SYSDATE,'W')<br />--------------------<br />5</p>
<p>8.DDD 当年第几天 （2007年5月29日为2007年第149天）</p>
<p>SQL&gt; Select to_char(sysdate,'DDD') from dual;</p>
<p>TO_CHAR(SYSDATE,'DDD')<br />----------------------<br />149</p>
<p>9. DD 当月第几天</p>
<p>SQL&gt; Select to_char(sysdate,'DD') from dual;</p>
<p>TO_CHAR(SYSDATE,'DD')<br />---------------------<br />29</p>
<p>10.D 周内第几天</p>
<p>SQL&gt; Select to_char(sysdate,'D') from dual;</p>
<p>TO_CHAR(SYSDATE,'D')<br />--------------------<br />3</p>
<p>11.DY 中文的星期几 （ （2007年5月29日为星期二））</p>
<p>SQL&gt; Select to_char(sysdate,'DY') from dual;</p>
<p>TO_CHAR(SYSDATE,'DY')<br />---------------------<br />星期二</p>
<p>12.HH或HH12 12进制小时数 （16：09分为用12小时制计时为4点）</p>
<p>SQL&gt; Select to_char(sysdate,'HH') from dual;</p>
<p>TO_CHAR(SYSDATE,'HH')<br />---------------------<br />04</p>
<p>13.HH24 24小时制</p>
<p>SQL&gt; Select to_char(sysdate,'HH24') from dual;</p>
<p>TO_CHAR(SYSDATE,'HH24')<br />-----------------------<br />16</p>
<p>二、常用时间函数</p>
<p>1.trunc(sysdate,'Q') 本季度第一天</p>
<p>SQL&gt; select trunc(sysdate,'Q') from dual;</p>
<p>TRUNC(SYSDATE,'Q')<br />------------------<br />2007-4-1</p>
<p>2.trunc(sysdate,'D') 本周的第一天(周日)</p>
<p>SQL&gt; select trunc(sysdate,'D')from dual;</p>
<p>TRUNC(SYSDATE,'D')<br />------------------<br />2007-5-27<br /><br />3.last_day(sysdate) 本月最后一天 </p>
<p>SQL&gt; select last_day(sysdate) from dual;</p>
<p>LAST_DAY(SYSDATE)<br />-----------------<br />2007-5-31 15:20:3</p>
<p>4.add_months(sysdate,2) 日期sysdate后推2个月 </p>
<p><br />SQL&gt; select add_months(sysdate,2) from dual;</p>
<p>ADD_MONTHS(SYSDATE,2)<br />---------------------<br />2007-7-29 15:21:14</p>
<p>5.next_day(sysdate,2) 日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期 </p>
<p>SQL&gt; select next_day(sysdate,2) from dual;</p>
<p>NEXT_DAY(SYSDATE,2)<br />-------------------<br />2007-6-4 15:22:10</p>
<p>6.Months_between(f,s) 日期f和s间相差月数</p>
<p>SQL&gt; select months_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))from dual;</p>
<p>MONTHS_BETWEEN(SYSDATE,TO_DATE<br />------------------------------<br />1.56909908900836</p>
<p><br />7.得到SYSDATE+5所在的月份</p>
<p>SQL&gt; SELECT to_char(SYSDATE+5,'mon','nls_date_language=american') FROM dual;</p>
<p>TO_CHAR(SYSDATE+5,'MON','NLS_D<br />------------------------------<br />jun</p>
<p>8.current_date()返回当前会话时区中的当前日期 。</p>
<p>9.select dbtimezone from dual;</p>
<p>10.extract()找出日期或间隔值的字段值 </p>
<p>SQL&gt; select extract(month from sysdate) "This Month" from dual;</p>
<p>This Month<br />----------<br />5<br />SQL&gt; select extract(year from sysdate) "This year" from dual;</p>
<p>This year<br />----------<br />2007<br />SQL&gt; select extract(month from add_months(sysdate,2)) " Month" from dual;</p>
<p>Month<br />----------<br />7</p>
<p><br />==================================================================</p>
<p>三、一些实践后的用法：</p>
<p>1.上月末天：<br />select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual；</p>
<p>2.上月今天<br />SQL&gt; select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;</p>
<p>3.上月首天<br />SQL&gt; select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;</p>
<p>4.要找到某月中所有周五的具体日期 </p>
<p>SELECT to_char(b.a,'YY-MM-DD') <br />FROM ( SELECT trunc(SYSDATE,'mm')+ROWNUM-1 a<br />FROM dba_objects where rownum &lt; 32 ) b<br />WHERE to_char(b.a,'day')='星期五';</p>
<p><br />如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90，即为查找当前月份的前三个月中</p>
<p>的每周五的日期。</p>
<p><br />5.得到系统当前月及以后的日期 </p>
<p>select trunc(sysdate, 'MM')+ROWNUM-1 FROM dba_objects ;</p>
<p>&nbsp;</p>
<p>-----------------------------------</p>
<p>to_date 字符串类型转为换日期类型 <br />字符串中的相应位置上的字符,必须符合时间范围的限制&nbsp;&nbsp;</p>
<p>14.MI 分钟数(0～59)<br />提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式，将它用于分钟也能工作，但结果是错误的。 </p>
<p>15.SS 秒数(0～59)</p>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/192128#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 12 May 2008 10:24:58 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/192128</link>
        <guid>http://ecside.group.javaeye.com/group/blog/192128</guid>
      </item>
          <item>
        <title>GT-Grid]列表组件 GT-Grid 1.0 beta 1 20080508★更新</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/190376" style="color:red;">http://ecside.group.javaeye.com/group/blog/190376</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          再次食言了.<br />本来打算再多做一些改动之后再发布beta版本的.<br /><br />但是最近一直很忙,所以打算把我所计划的"大改动"往后再拖一拖.<br /><br />而把前一阵对alpha的修正版本作为 第一个 beta版.<br /><br />版本号叫 alpha beta  millstone  rc  final... 都没什么意义.<br />大家只要知道一版比一版好就可以了  呵呵<br /><br />其实 alpha beta  是容易让人产生恐惧感的单词.<br />如果直接以 1.0/ 1.1/ 1.2/2.0 / ... 这样的方式来命名版本 我想肯定能让更多的人用起来安心一些, 呵呵.<br /><br /><br />这个版本和 alpha 版本的主要差别是<br /><br />1 修正了目前已知的全部bug ( 感谢taocong ,感谢 mhere ---- 希望mhere不要被我的感谢弄得麻木了 )<br />2 提供了一个比原先好一点的 debug 功能 但是依然很简陋,以前是 用alert显示 调试信息,这次用一个textarea(不用div因为懒 呵呵)<br />3 增加了若干的钩子函数<br />4 对loadUrl的机制做了改变<br />5 支持对 锁定 编组 排序的 设置了 (就是让某一列在第一次显示时就具备某种特征,这个是很基本的功能,现在才提供 过分了<img src="/images/smiles/icon_razz.gif"/>)<br /><br />大家仔细看一看 demo.html文件吧 代码的注释里有说明.<br /><br /><br />beta 1 这个版本还将维持一段时间.<br />这段时间内 如果有bug ,我会和以前一样 以  beta 1 + 日期 + a/b/c 的方式来发布更新版本.
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/190376#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 20:43:18 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/190376</link>
        <guid>http://ecside.group.javaeye.com/group/blog/190376</guid>
      </item>
          <item>
        <title>(原创连载)LOG4J文档翻译</title>
        <author>coolbi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolbi.javaeye.com">coolbi</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/189945" style="color:red;">http://ecside.group.javaeye.com/group/blog/189945</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; color: #ff0000; background-color: #ffffff;"><strong>这是Log4j（版本：log4j-1.2.9）的官方英文文档，打算利用下班时间把它翻译一下，如果有翻译不对的地方，还请各位网友给小弟指出，谢谢大家</strong></span></p>
<p><span style="font-size: small;"><strong>Loggers, Appenders and Layouts(记录器，渲染器，样式)</strong></span></p>
<p><span style="font-size: small;">Log4j 有三大组件：Loggers,Appenders and layouts(记录器，渲染器，样式),这三种组件组成在一起使开发人员能够通过日志类型和日志级别来记录日志。并控制日志在运行时显示的格式和显示的位置。</span></p>
<p><span style="font-size: small;"><strong>Logger hierarchy　（日志层次结构）</strong></span></p>
<p><span style="font-size: small;">任何日记API最主要的优点都是可以控制最简单的System.out.println()显示和不显示，这种实现假定一种空白日志，也就是说，不记录一些日志语句，也就是通过开发者选择的某种标准来记录日志，观察了这种需求后。在以前会我们我们选择Category作为包的核心部分，然而，在log4j 1.2版本以后。Logger 类就已经替代了Category类，但是这些和先前的log4j版本相似。Logger类可以看作是Category类的一个别名。</span></p>
<p><span style="font-size: small;">记录器(Logger)被叫做实体。记录器(Logger)的名字是大小写敏感并且有以下的层次规则：</span></p>
<p><span style="font-size: small; color: #888888; background-color: #ff9900;"><strong>命名层次</strong></span></p>
<p><span style="font-size: small; color: #888888; background-color: #ff9900;"><strong>如果一个记录器的名字带有点并且是其它记录器的前缀，那么这个记录器就叫祖先记录器。父记录器是指在一个祖先记录器和子记录器之间不在有其它祖先记录器。</strong></span></p>
<p><span style="font-size: small;">例如，一个叫&ldquo;com.foo&rdquo;的记录器是一个&ldquo;com.foo.Bar&rdquo;的父记录器，同样地，&ldquo;java&rdquo;是一个"java.util"和"java.util.Vector"的祖先。这种命名模式对于大多数程序员来说是熟悉的。</span></p>
<p><span style="font-size: small;">root logger位于所以记录器之上，有二种特性：</span></p>
<p><span style="font-size: small;">1.总是存在</span></p>
<p><span style="font-size: small;">2.不能用名字重新取得</span></p>
<p><span style="font-size: small;">调用Logger.getRootLogger的静态方法得到。其它的记录器用Logger.getLogger静态方法实体化或得到，此方法接收一个想要得到的记录器名字。Logger类的一些基本方法如下：</span></p>
<pre name="code" class="java"><span style="font-size: small;">package org.apache.log4j;

  public class Logger {

    // Creation &amp; retrieval methods:
    public static Logger getRootLogger();
    public static Logger getLogger(String name);

    // printing methods:
    public void debug(Object message);
    public void info(Object message);
    public void warn(Object message);
    public void error(Object message);
    public void fatal(Object message);

    // generic printing method:
    public void log(Level l, Object message);
}
</span></pre>
<p><span style="font-size: small;">&nbsp;可以为记录器指定一个级别，一系列可以指定的级别是定义在</span><a href="../api/org/apache/log4j/Level.html"><span style="font-size: small; font-family: Courier New;">org.apache.log4j.Level</span></a><span style="font-size: small;">类中的： </span><a href="../api/org/apache/log4j/Level.html#DEBUG"><span style="font-size: small;">DEBUG</span></a><span style="font-size: small;">, </span><a href="../api/org/apache/log4j/Level.html#INFO"><span style="font-size: small;">INFO</span></a><span style="font-size: small;">, </span><a href="../api/org/apache/log4j/Level.html#WARN"><span style="font-size: small;">WARN</span></a><span style="font-size: small;">, </span><a href="../api/org/apache/log4j/Level.html#ERROR"><span style="font-size: small;">ERROR</span></a><span style="font-size: small;"> and </span><a href="../api/org/apache/log4j/Level.html#FATAL"><span style="font-size: small;">FATAL</span></a><span style="font-size: small;">&nbsp;，你可以通过继承Leverl类来定义自己的级别，但是我们不鼓励你这么做，我们一会要解释一种更好的方案。</span></p>
<p><span style="font-size: small;">如果一个给定的记录器没有指定级别，他将从最进的祖先继承，更正式地：</span></p>
<p><span style="background-color: #ffcc00;"><span style="font-size: small;">日志继承层次：</span></span></p>
<p><span style="background-color: #ffcc00;"><span style="font-size: small;">　　给定的一个记录器C的通过继承得到的记录级别和第一个不为空的记录器级别相同。&nbsp;从C开始向上推进一直达到根记录器(root logger)</span></span></p>
<p><span style="font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;">&nbsp;为了确保所有的记录器都持有一个日志记录级别，那么总是要指定根记录器的日志记录级别。</span></p>
<p><span style="font-size: small;">以下四个表格是通过以上规则列出的各种指定日志级别和继承日志级别</span></p>
<p>
<table border="1">
<tbody>
<tr>
<th>Logger<br />name</th><th>Assigned<br />level</th><th>Inherited<br />level</th>
</tr>
<tr align="left">
<td><span style="font-size: small;">root</span></td>
<td><span style="font-size: small;">Proot</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X </span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y </span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y.Z</span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
</tbody>
<caption>Example 1</caption>
</table>
</p>
<p><span style="font-size: small;">上面的例子1中，只有根记录器指定了日志级别，它的值是,Proot,将被记录器X,X.Y和X.Y.Z继承</span></p>
<p>
<table border="1">
<tbody>
<tr>
<th>Logger<br />name</th><th>Assigned<br />level</th><th>Inherited<br />level</th>
</tr>
<tr align="left">
<td><span style="font-size: small;">root</span></td>
<td><span style="font-size: small;">Proot</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X </span></td>
<td><span style="font-size: small;">Px</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y </span></td>
<td><span style="font-size: small;">Pxy</span></td>
<td><span style="font-size: small;">Pxy</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y.Z</span></td>
<td><span style="font-size: small;">Pxyz</span></td>
<td><span style="font-size: small;">Pxyz</span></td>
</tr>
</tbody>
<caption>Example 2</caption>
</table>
</p>
<p><span style="font-size: small;">在例子2中，所有的记录器被指定了一个日志级别，就没有必要继承了。</span></p>
<p>
<table border="1">
<tbody>
<tr>
<th>Logger<br />name</th><th>Assigned<br />level</th><th>Inherited<br />level</th>
</tr>
<tr align="left">
<td><span style="font-size: small;">root</span></td>
<td><span style="font-size: small;">Proot</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X </span></td>
<td><span style="font-size: small;">Px</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y </span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y.Z</span></td>
<td><span style="font-size: small;">Pxyz</span></td>
<td><span style="font-size: small;">Pxyz</span></td>
</tr>
</tbody>
<caption>Example 3</caption>
</table>
</p>
<p><span style="font-size: small;">在例子3中，根记录器(root)，X和X.Y.Z分别指定了记录级别Proot,Px和Pxyz。记录器从X.Y从你记录器X继承日志记录级别</span></p>
<p>
<table border="1">
<tbody>
<tr>
<th>Logger<br />name</th><th>Assigned<br />level</th><th>Inherited<br />level</th>
</tr>
<tr align="left">
<td><span style="font-size: small;">root</span></td>
<td><span style="font-size: small;">Proot</span></td>
<td><span style="font-size: small;">Proot</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X </span></td>
<td><span style="font-size: small;">Px</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y </span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
<tr align="left">
<td><span style="font-size: small;">X.Y.Z</span></td>
<td><span style="font-size: small;">none</span></td>
<td><span style="font-size: small;">Px</span></td>
</tr>
</tbody>
<caption>Example 4</caption>
</table>
</p>
<p><span style="font-size: small;">在例子4中，根记录器(root)和X记录器分别被指定了记录器Proot和Px。记录器X.Y和X.Y.Z从他们最近的指定了记录级别的父记录器X继承了这个日志记录级别</span></p>
<p><span style="font-size: small;">日志请求（注：即记录日志）调用记录器实例的打印方法，这些打印方法是：debug,info,warn,error,fatal和log。</span></p>
<p><span style="font-size: small;">更精确的说，打印方法决定了日志的记录级别。例如，如果C是一个记录器实例，那么语句 c.info("...")是一个INFO级别的记录请求。</span></p>
<p><span style="font-size: small;">为了能够记录日志，日志请求级别一定要打于或等于记录器级别，否则，日志不能够记录，如果记录器没有指定日志记录级别，它会按层次继承一个日志记录级别。规律总结如下：</span></p>
<p><span style="background-color: #ffcc00;"><span style="font-size: small;">基本选定规则：</span></span></p>
<p><span style="background-color: #ffcc00;"><span style="font-size: small;">日志请求级别为Ｐ(指定或继承的都可以)日志记录器级别为Ｑ,如果Ｐ&gt;=Ｑ则可以记录日志</span></span></p>
<p><span style="font-size: small;">这是Log4j的内在规则，这种级别是已经定义好了的，标准的级别是这样的：DEBUG&lt;INFO&lt;WARN&lt;ERROR&lt;FATAL</span></p>
<p><span style="font-size: small;">下面是这种规则的一个例子：</span></p>
<p>
<table border="0" bgcolor="#cccccc">
<tbody>
<tr>
<td>
<pre><span style="font-size: small;">   // get a logger instance named "com.foo"
   Logger  logger = Logger.getLogger(<strong>"com.foo"</strong>);

   // Now set its level. Normally you do not need to set the
   // level of a logger programmatically. This is usually done
   // in configuration files.
   <strong>logger</strong>.setLevel(<span style="color: #0000aa;"><strong>Level.INFO</strong></span>);

   Logger barlogger = Logger.getLogger(<strong>"com.foo.Bar"</strong>);

   // This request is enabled, because <span style="color: #00aa00;"><strong>WARN</strong></span> &gt;= <span style="color: #0000aa;"><strong>INFO</strong></span>.
   logger.<span style="color: #00aa00;"><strong>warn</strong></span>("Low fuel level.");

   // This request is disabled, because <span style="color: #00aa00;"><strong>DEBUG</strong></span> &lt; <span style="color: #0000aa;"><strong>INFO</strong></span>.
   logger.<span style="color: #00aa00;"><strong>debug</strong></span>("Starting search for nearest gas station.");

   // The logger instance barlogger, named "com.foo.Bar",
   // will inherit its level from the logger named
   // "com.foo" Thus, the following request is enabled
   // because <span style="color: #00aa00;"><strong>INFO</strong></span> &gt;= <span style="color: #0000aa;"><strong>INFO</strong></span>.
   barlogger.<span style="color: #00aa00;"><strong>info</strong></span>("Located nearest gas station.");

   // This request is disabled, because <span style="color: #00aa00;"><strong>DEBUG</strong></span> &lt; <span style="color: #0000aa;"><strong>INFO</strong></span>.
   barlogger.<span style="color: #00aa00;"><strong>debug</strong></span>("Exiting gas station search");
</span></pre>
</td>
</tr>
</tbody>
</table>
</p>
<p><span style="font-size: small;">用同一个相同的名字去调用方法getLogger会返回同一个日志对象的引用</span></p>
<p><span style="font-size: small;">例如：&nbsp; </span></p>
<p>
<table border="0" bgcolor="#cccccc">
<tbody>
<tr>
<td>
<pre><span style="font-size: small;">   Logger x = Logger.getLogger("wombat");
   Logger y = Logger.getLogger("wombat");</span></pre>
</td>
</tr>
</tbody>
</table>
</p>
<p><code><span style="font-size: small;">x和y引用同一个日志(Logger)对象</span></code></p>
<p><code><span style="font-size: small;">因此，当你配置一个记录器后就可以在代码的任何地方引用它，而不必到处传递这个对象引用。Log4j记录器与生物上的父在子之前原理相反，你可以在任何地方配置和创建，事实上，父记录器将找到并连接到他的子孙，即便子孙在父记录器之后创建。</span></code></p>
<p><code><span style="font-size: small;">配置Log4j的配置是在应用程序初始化的时候，首选的方式是读取一个配置文件，马上将要讨论。</span></code></p>
<p><code><span style="font-size: small;">通过Log4j你可以很方便的用软件的组件来给记录器命名，用和类名相同的记录器名，就可以在各个类中静态的建立一个记录器实例，这是一种直接并易用的方式来定义记录器，这样日志就要按照记录器的名字来生成，这种命名策阅很容易定义日志的起源，然而，这只是一种可行的方法，虽然常用，但是Log4j并不限定开发者定义自己的记录器。开发者可以取自己期望的任何一个记录器。</span></code>&nbsp;</p>
<p><span style="font-size: medium;">然而，通过类来给命名记录器是到现在最好的一种命名策略。</span></p>
<p><strong><span style="font-size: medium;">Appenders and Layouts（渲染器和样式）</span></strong></p>
<p><span style="font-size: medium;"><strong>让用户能够控制显示或不显示日志只是log4j的一部份功能，log4j把日志输出到不同的地方，用log4j的说法，输出地叫做渲染器（Appender）,当前的渲染器有：控制台（console）,文件（files）,图形组件，远程套节字服务器（remote socket server）,JMS，NT Event Loggers，和</strong>remote UNIX <a href="api/org/apache/log4j/net/SyslogAppender.html">Syslog</a> daemons，也呆以异步记录日志。</span></p>
<p><span style="font-size: medium;">可以为一个记录器指定多个Appender</span></p>
<p><span style="font-size: medium;">给一个记录器添加一个Appender的方法是addAppender，一次日志请求会输出到记录器所指定的所有Appender以及层次关系中继承的Appender。</span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/189945#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 05 May 2008 22:27:51 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/189945</link>
        <guid>http://ecside.group.javaeye.com/group/blog/189945</guid>
      </item>
          <item>
        <title>关于ECSdie列表中隔页存值的问题(CheckBox_Select)</title>
        <author>crabdave</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crabdave.javaeye.com">crabdave</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/188517" style="color:red;">http://ecside.group.javaeye.com/group/blog/188517</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <u><strong>问题：</strong></u>在ECSide列表中，每行都有select标签，用户在第一页进行各行的select选择之后，执行页面翻页操作，翻到第二页，再回到第一页时不能回显原先对各行select标签所做的选择。同样还有对列表进行排序、修改每页显示行数等打乱现有列表排列的操作。<br /><br /><u><strong>环境描述:</strong></u><br />   1)在ECSide列表中，保存用户所选择的每行select值，在用户执行页面翻页、排序、修改每页显示行数后，<br />   仍能回显出原先用户所选的select值。在用户点击提交或保存操作后能将用户在不同页所选的值提交到后台。<br />   2)select值的形式：用户所选值_本行记录的ID，例如：OptionValue_132<br />   3)确保ECSdie列表所在页面在执行页面翻页、排序、修改每页显示行数等操作时，整个页面局部刷新(如果整个页面刷新将会清除后面将要提到的一个JavaScript全局变量)。<br />   4)关闭ECSide列表标签中的隔页存值属性(autoIncludeParameters)，使用该属性虽然可以达到隔页存值的目的，但不能回显原先用户所做的选择，并且在每次在执行页面翻页、排序、修改每页显示行数等操作时，不停的在创建hidden标签。<br /> <br /><u><strong>解决方案：</strong></u><br />   1)在用户点击select进行选值时，将其所选值存入一个作为全局变量的数组，并且在往该数组中存入用户所选值时，以该行记录的ID作为数组下标，将对应的值存入数组。在用户对select值进行修改时，取出该ID对应的数组下标的值，进行修改操作，若置回请选择时，根据该行记录的ID作为索引找到数组中对应的值，清空数组中的该值。<br />   2)用户在执行页面翻页、排序、修改每页显示行数后，取出当页所有select对象，将这些select对象与数组中的值进行匹配，如果有对应下标的值将其回显出来。回显的时候需要从ecside.js中抽象出一个JavaScript函数用于在执行页面翻页、排序、修改每页显示行数后执行。<br />   <strong>对ecside.js的修改如下：</strong><br />     <strong>(1)翻页：</strong>在ECSideUtil.gotoPage方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。<br />     <strong>(2)排序：</strong>在ECSideUtil.doSort方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。<br />     <strong>(3)修改每页显示多行：</strong>在ECSideUtil.changeRowsDisplayed方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。<br />     在以上三个方法之后添加如下代码：<br />      try{<br />         //新的HMTL加载完后执行的函数    <br />         setAfterView();<br />      }catch(e){    <br />    <br />      }<br />     这样我们在每个开发的页面，直接写function setAfterView(){}函数就可以实现要回显的操作了。 <br />   3)在用户点击“保存”或“提交”时，将数组中的值生成hidden连接到页面form中，提交到后台。<br />       var tempHid="";<br />       if(saveSelValues!=null&&saveSelValues.length>0){//如果数组中有值<br />           for(var i=parseInt(custIdTemp,10);i&lt;saveSelValues.length;i++){<br />              if(saveSelValues[i]!=null){<br />           			tempHid+="&lt;input type='hidden' name='delIdTypeReas' value='" +i+"_"+saveSelValues[i]+ "'/>";//创建hidden标签,其中value值中的i(即数组的索引为每行记录的ID号)。<br />           		}           <br />           }<br />           if(tempHid!=""){<br />           		document.forms[0].insertAdjacentHTML("beforeEnd", tempHid);//将数组中的值生成hidden连接到页面form中<br />           }<br />       }<br />   4)在后台通过java的split("_")方法取出各ID所对应的用户所选值，之后再进行数据库操作。<br /><br /><u><strong>备注：</strong></u>这种方式还适合于ECSide列表各中行的CheckBox、二级联动的select标签等的隔页存值问题。<br /><br /><u><strong>参考实现：</strong></u>以下将以我在项目中开发的在ECSide列表中各行CheckBox和二级联动的select标签的隔页存值为例。<br />   <strong>描述：</strong>在EC列表中，第一列为CheckBox(进入列表页面默认都被选中)，最后两列为一个二级联动的select标签(在CheckBox不被选中时，显示为可用，即默认为disabled)。<br />   <strong>代码如下：</strong><br />    <strong>CheckBox:(第一列)</strong><br />       &lt;ec:column width="30" ellipsis="true" property="selectedCust" title="选择" sortable="false" ><br />	  &lt;input type="checkbox" value="该行记录的ID" onclick="abledSel(this)" checked="checked" typeId="该行记录的ID" name="delCustCheck"/><br />       &lt;/ec:column><br />    <strong>Select:(最后两列)</strong><br />       &lt;select name="delType" typeId="该行记录的ID"  disabled="disabled" id="firstSel_该行记录的ID" onchange="selSecondSel(this)">一级select菜单<br />            &lt;option value='1' selected="selected">一级菜单1&lt;/option><br />	    &lt;option value='2'>一级菜单2&lt;/option><br />       &lt;select name="delRes"  typeId="该行记录的ID" disabled="disabled" id="secondSel_该行记录的ID" onchange="saveSelValue(this)">二级select菜单<br />            &lt;option value='1_1'selected="selected">二级菜单1&lt;/option>  其中1_1中的第一个1表示一级菜单1的value值，第二个1表示二级菜单1的value值<br />	    &lt;option value='1_2'>二级菜单2&lt;/option><br />					<br />    <strong>准备select菜单数据：</strong><br />         //准备一级菜单数据<br />		var delType=new Array();<br /> <br />		delType[0]=new Array();<br />		delType[0].push('一级菜单1');<br />		delType[0].push('1'); <br /> <br />		delType[1]=new Array();<br />		delType[1].push('一级菜单2');<br />		delType[1].push('2'); <br /><br />	//准备二级菜单数据<br />		var delReas=new Array();<br /> <br />		delReas[0]=new Array();<br />		delReas[0].push('二级菜单1');<br />		delReas[0].push('1');<br />		delReas[0].push('1'); //属于一级菜单1<br /> <br />		delReas[1]=new Array();<br />		delReas[1].push('二级菜单2');<br />		delReas[1].push('2');<br />		delReas[1].push('1');  //属于一级菜单1<br /> <br />		delReas[2]=new Array();<br />		delReas[2].push('二级菜单3');<br />		delReas[2].push('3');<br />		delReas[2].push('2');  //属于一级菜单2<br />      <strong>JavaScript函数：</strong><br />//根据所选的一级菜单展示二级菜单<br />          function selSecondSel(firstSel){<br />	//取出一级菜单选择的是哪一个<br />   	var sel_Index = firstSel.selectedIndex;<br />	var temp=firstSel.options[sel_Index].value;<br />	var rowCode=firstSel.typeId;<br />	//设置二级菜单<br />	var sel_Obj_s=document.getElementById("secondSel_"+rowCode);<br />	sel_Obj_s.innerHTML="";<br />	var flag=true;<br />	//alert(delReas.length);<br />	for(var i=0;i&lt;delReas.length;i++){<br />	  if(delReas[i][2]==temp){<br />	  <br />	   var oOption = document.createElement("OPTION");<br />		sel_Obj_s.options.add(oOption);<br />		oOption.innerText = delReas[i][0];<br />		oOption.value = delReas[i][2]+"_"+delReas[i][1];<br />		if(flag){<br />		      saveSelValues[rowCode]=delReas[i][2]+"_"+delReas[i][1];<br />  			//  alert("4_saveSelValues["+rowCode+"]="+saveSelValues[rowCode]);<br />  			  flag=false;	<br />		}<br />			<br />		}<br />	 }<br />	}<br /> <br /> //将客户列表的checkbox和select设置为可用<br />function enableCheckSel(){<br /><br />   var dcc=document.getElementsByName("delCustCheck");<br />   if(dcc!=null&&dcc.length>0){<br />      for(var i=0;i&lt;dcc.length;i++){<br />          dcc[i].disabled="";<br />      }<br />   }<br />   if(saveSelValues!=null&&saveSelValues.length>0){<br />   	var temp=document.getElementsByTagName("select");<br />       for(var i=0;i&lt;temp.length;i++){<br />       		if(temp[i].typeId!=undefined&&temp[i]!=null){<br />       			if(saveSelValues[temp[i].typeId]!=undefined&&saveSelValues[temp[i].typeId]!=null&&saveSelValues[temp[i].typeId]!=""){<br />       			temp[i].disabled="";<br />       			}<br />       		}<br />       }<br />   }<br />} <br /><br />//点击checkbox时执行<br />var custIdTemp=0;//记录用户所点选过的最小值<br />function abledSel(abledSel){   <br />    var as=abledSel.value;<br />    if(parseInt(custIdTemp,10)==0){<br />       	custIdTemp=as;<br />    }<br />    if(parseInt(as,10)&lt;parseInt(custIdTemp,10)){<br />    	custIdTemp=as;<br />    }<br />    var ce=abledSel.checked<br />  <br />    var temp=new Array();<br />    temp[0]=document.getElementById("firstSel_"+as);<br />    temp[1]=document.getElementById("secondSel_"+as);<br />    if(temp.length>0){ <br />       for(var i=0;i&lt;temp.length;i++){  <br />              var selRowCode=as;<br />              if(ce){//如果checkbox变为被选中，select标签不可用，清除数组中的存值<br />              	 temp[i].disabled="true";              	 <br />              	 saveSelValues[selRowCode]=null;             <br />              }else{//如果checkbox变为没有被选中，将对应的select标签设置为可用，在数组中添加相应的select值<br />             	 temp[i].disabled="";<br />             	 if(temp[i].id==("secondSel_"+selRowCode)){<br />             		var sel_Index = temp[i].selectedIndex;<br />			var temp1=temp[i].options[sel_Index].value;             	 <br />             	 	saveSelValues[selRowCode]=temp1;         <br />             	 }<br />              }        <br />       }<br />    }<br />}<br />//保存用户所选value值的数组<br />var saveSelValues=new Array();<br />//保存用户所选的select值<br />function saveSelValue(sel_Obj){<br /> //取出一级菜单选择的是哪一个<br />   var sel_Index = sel_Obj.selectedIndex;<br />   var temp=sel_Obj.options[sel_Index].value;<br />   var selRowCode=sel_Obj.typeId;<br />   saveSelValues[selRowCode]=temp;<br />}<br />//在列表执行页面翻页、排序、修改每页显示行数等操作后执行回显<br />function setAfterView(){<br />        if(saveSelValues!=null&&saveSelValues.length>0){<br />    var delCustCheck=document.getElementsByName("delCustCheck");<br />    	for(var k=0;k&lt;delCustCheck.length;k++){<br />    		var i=delCustCheck[k].typeId;<br />    	    if(saveSelValues[i]!=null){<br />    	       var firstSel=document.getElementById("firstSel_"+i);<br />    	       var secondSel=document.getElementById("secondSel_"+i);<br />    	       if(firstSel==undefined||firstSel==null||secondSel==undefined||secondSel==null){<br />    	           continue;<br />    	       }<br />    	           delCustCheck[k].checked="";<br />    	       if(firstSel!=undefined&&firstSel!=null&&secondSel!=undefined&&secondSel!=null){<br />    	       			var temp=saveSelValues[i].split("_");<br />    	       			firstSel.disabled="";<br />    	       			secondSel.disabled="";<br />    	       			firstSel.value=temp[0];<br />    	       			temp=saveSelValues[i];<br />    	       			selSecondSel(firstSel);//执行该函数后会将该二级菜单的第一个选项存入数组，注意将原值保留，修改数组中的该值<br />    	       			secondSel.value=temp;<br />    	       			saveSelValues[i]=temp;<br />    	       }<br />    	    }<br />    	}<br />    }<br />}<br /><br />以上仅为一个小小的参考实现，不过在效率上可能还有些欠缺，还有待优化，希望能启到抛砖引玉的作用。
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/188517#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 30 Apr 2008 18:29:45 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/188517</link>
        <guid>http://ecside.group.javaeye.com/group/blog/188517</guid>
      </item>
          <item>
        <title>关于在EC列表页面点击标题查看明细后不能回到原来所在页的问题</title>
        <author>crabdave</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://crabdave.javaeye.com">crabdave</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/188353" style="color:red;">http://ecside.group.javaeye.com/group/blog/188353</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <u><strong>问题：</strong></u>在使用ECside分页框架的过程中，我们在EC列表页面点击某一行记录,进入该行记录的详细信息页面，此时我们在返回时却又只能返回到第一页，不能返回原来所在的第二页。其中还有原来我们设置好的每页显示多少行，也变回原来的默认值了，排序方式也变成默认的了。<br /><u><strong>解决方案：</strong></u>在明细页面点击返回时，需要带上几个参数，并且这些参数要用hidden来存储，ECside框架会用request.getParameter()方法来取值。<br />主要参数如下：<br />	&lt;input type="hidden"  name="ec_i"  value="StrategyListTable"/>ec_i存储的是EC列表的tableId,该tableId为StrategyListTable<br />	&lt;input type="hidden"  name="StrategyListTable_crd" value="20"/>StrategyListTable_crd存储的是每页显示多少行，该参数名是由tableId+"_crd"组成<br />	&lt;input type="hidden"  name="StrategyListTable_p" value="1"/>StrategyListTable_p存储的是当前是第几页，该参数名是由tableId+"_p"组成<br />	&lt;input type="hidden"  name="StrategyListTable_s_strategyName" value="asc"/>StrategyListTable_s_strategyName存储的是用户选择的排序字段和方式，该参数名是由tableId+"_s_"+排序字段 组成，它的value值为asc和desc可选，表示排序方式。<br /><u><strong>参考实现：</strong></u>在我的参与的项目开发过程中，我们的系统采用Struts+Spring+Hibernate，所有的action都继承自BaseAction,我们直接在这个基类中取出这些参数，再将其传入明细页面，在明细页面只用拷贝几行固定的代码，在返回提交表单的时候，顺便提交一下这些参数就OK了。<br />BaseAction中的代码：<br />			String ec_i="";<br />			ec_i=req.getParameter("ec_i");<br />			<br />			if(ec_i!=null&&!ec_i.equals("")){//存在EC显示属性<br />				String cp=req.getParameter(ec_i+"_p");//取出当前第几页<br />				String crd=req.getParameter(ec_i+"_crd");//取出每页多少行				<br />				String sort=req.getParameter("sort");//取出排序方式<br />				String sortProp=req.getParameter("sortProp");//取出排序字段<br />				//判断前台是否有排序信息，如果前台没有排序，则这两个属性都是null<br />				if(sort!=null&&!sort.equals("")&&sortProp!=null&&!sortProp.equals("")){<br />					log.info("原页面取到的排序属性为："+sortProp+"方式为："+sort);<br />					req.setAttribute("ECSort", sort);<br />					req.setAttribute("ECSortProp",sortProp);<br />				}<br />				log.info("原页面提交的列表名称为："+ec_i+" 当前是第 "+cp+" 页，每页显示 "+crd+" 行");<br />				req.setAttribute("ECI", ec_i);<br />				req.setAttribute("ECTable_p", cp);<br />				req.setAttribute("ECTable_crd", crd);<br />			}<br />明细页面的固定代码：<br />	&lt;input type="hidden"  name="ec_i"  value="&lt;c:out value='${ECI}'/>"/><br />	&lt;input type="hidden"  name="${ECI}_crd" value="&lt;c:out value='${ECTable_crd}'/>"/><br />	&lt;input type="hidden"  name="${ECI}_p" value="&lt;c:out value='${ECTable_p}'/>"/><br />	&lt;input type="hidden"  name="&lt;c:out value='${ECSortProp}'/>" value="&lt;c:out value='${ECSort}'/>"/><br />	&lt;input type="hidden"  name="sort" value="&lt;c:out value='${ECSort}'/>"/><br />	&lt;input type="hidden"  name="sortProp" value="&lt;c:out value='${ECSortProp}'/>"/><br /><br /><u><strong>备注：</strong></u>在项目开发过程中，会有这种情况：从第一个EC列表中点击某行记录进入明细页面，而在这个明细页面中，还有EC列表，在这种情况下，以上这些参数就会重复出现，但ECside框架只会取出其中一个，这时候要注意，在明细页面返回上一个EC列表的时候，要提交上一个EC列表的参数。
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/188353#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 30 Apr 2008 11:50:02 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/188353</link>
        <guid>http://ecside.group.javaeye.com/group/blog/188353</guid>
      </item>
          <item>
        <title>[GT-Grid]列表组件 GT-Grid 1.0 alpha 2 发布 ★20080422 </title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/185628" style="color:red;">http://ecside.group.javaeye.com/group/blog/185628</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          列表组件 GT-Grid 1.0 alpha <span style="color: red"><strong>2</strong></span> 发布 ★20080422 <br /><br />占位置 详细说明稍后再补充<br /><br />请 mhere 下载<img src="/images/smiles/icon_smile.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/185628#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 22 Apr 2008 21:20:20 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/185628</link>
        <guid>http://ecside.group.javaeye.com/group/blog/185628</guid>
      </item>
          <item>
        <title>理想的分页方案</title>
        <author>zhxp791008</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhxp791008.javaeye.com">zhxp791008</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/182548" style="color:red;">http://ecside.group.javaeye.com/group/blog/182548</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先明确的是:此方案不是解决怎样分页,而是解决page参数在service和dao中大量存在的问题.让程序员完全从分页中解脱出来. <br />大家可以尝试下.程序是否更加干净,程序员工作是否更少.现我的系统就是采用此种方式.<br />效果很好!  <br />以前的分页总是Action中获取分页信息.然后在service,dao的方法中传递参数进行分页查询,返回分页的信息.<br />   我上一个项目就是这样.导致service,dao中有大量的page参数.曾经想过用AOP方式进行分页参数的获取.填充.但是分页与不分页混乱,不易控制.<br /><br />改进了下用AOP的思路.完成此种分页方案.欢迎大家批评.但不要过激哟!我只是一个java新人而已,这样会打击我的....$#^%^&<br />系统采用SSH2.<br />整体有文件五个.<br /> 1.page.jsp.在需要分页的jsp中用&lt;jsp:include>包含.<br />2.page.js负责分页的js.<br />3.page的java类.包括totalRows,pageSize等.就是网上到处可见的page类写法.<br />如上三个文件中的属性要一致.<br />4.在ActionSupport中提供preparePage()方法.该方法负责收集jsp传递过来的分页信息,将生成的page对时象入到request的attribute中,供page.jsp使用.并且放到PageUtils类中.endPage()方法,结束分页.<br />5.PageUtils是该分页的核心所在.但是很简单.他有一个静态变量(TheadLocal类型)<br />6.修改Spring的源码.在查询之前取出PageUtils的值,如有进行分页,没有则不分页.<br /><br />整个分页架构完成.<br />程序员的工作.<br />1.在JSP中包含page.jsp<br />2.在Action中,如:<br />preparePage();<br />List&lt;User> userList = userManager.findAll();<br />endPage();<br /><br />List&lt;User> userList1 = userManager.findAll();<br />userList是分页,而userList1不分页.<br /><br />其余service,dao不需要关心分页东东.和不分页一样编写代码.<br /><br />本人QQ号:107607700,欢迎交流
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/182548#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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 Apr 2008 13:44:27 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/182548</link>
        <guid>http://ecside.group.javaeye.com/group/blog/182548</guid>
      </item>
          <item>
        <title>IE又一个让人吐血的BUG: 关于 table的position 和 select</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/182030" style="color:red;">http://ecside.group.javaeye.com/group/blog/182030</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在IE内( 6 7 都一样) 运行下面代码 ,代码可以从附件里下载<br /><br />(大家可以看一下 dom结构多么的简单啊<img src="/images/smiles/icon_sad.gif"/>)<br /><pre name="code" class="html">
&lt;html>
 &lt;head>
 &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 &lt;title>IE BUG ---- table position & select &lt;/title>

&lt;script>
  function showDiv(){
  	var tbox=document.getElementById("tbox");
 	tbox.style.display = tbox.style.display=="none"?"":"none";
 }
&lt;/script>

&lt;style>

.badtable {
	width: 200px; 
	height:100px;

	background-color: #f0f0f0;

	position: relative;
}

&lt;/style>
 &lt;/head>

 &lt;body>

  &lt;input onclick="showDiv()" type="button" value="show/hide" /> &lt;br/>


&lt;div id="tbox" >


	&lt;select>
		&lt;option>我是一个select&lt;/option>
	&lt;/select> 

	
	  &lt;table class="badtable" border="1" >
	   &lt;tr>
		 &lt;td >表格内容1&lt;/td>
		&lt;/tr>
	  &lt;/table>
	


 &lt;/div>

其他内容1&lt;br/>
其他内容2&lt;br/>
其他内容3&lt;br/>
其他内容4&lt;br/>
 &lt;/body>
&lt;/html>

</pre><br /><br />运行以上代码 <br />=============================================<br />点击 show/hide 按钮后, <br />div ccc 被隐藏, 里面的内容也被隐藏, 但是table 却还显示(里面的td也已经隐藏了)<br /><br />解决办法一:<br />把是 table样式里的 "position: relative;"去掉 (positiond 等于 absolute 也不行)<br /><br />解决方法二:<br />改那个 tbox的div 也加上 "position: relative;"<br /><br />★ 以上两种解决方案 还是有一点逻辑性,最多可以归结为 IE在处理 table的position时有bug.<br />但是下面两个方案绝对让你吐血<br /><br />解决方法三:<br />把那个 select 去掉,这个问题也不会出现<br /><br />解决方法四:<br />把那个 select 放到table后面,这个问题也不会出现<br /><br />=============================================<br />IE啊, 你可以让table不支持 position: relative; <br />但是为什么一定要在 table的前面有select的时候才不支持呢<br /><br />IE 你太诡异了 (IE 6 和 7 都是一样的诡异)<br />我彻底被你打败了<br />=============================================
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/182030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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>Sat, 12 Apr 2008 11:07:57 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/182030</link>
        <guid>http://ecside.group.javaeye.com/group/blog/182030</guid>
      </item>
          <item>
        <title>让ecside2离开prototype.js</title>
        <author>cats_tiger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cats-tiger.javaeye.com">cats_tiger</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/181714" style="color:red;">http://ecside.group.javaeye.com/group/blog/181714</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          虽然fins老大不再维护Ecside，但是俺一直在用着它呀，所以只好自己动手丰衣足食了。Ecside一个不爽的地方是依赖prototype.js，而且（好像）只用到了它的ajax。俺们的项目中底层js框架用的是jquery，而且即便不用jquery，仅仅为了一个ajax而引进50k的prototype.js也是非常不值得的。所以自己修改了一下ecside.js文件：<br /><pre name="code" class="javascript">
//找到Me.ajaxSubmit = function(resfunc, asy, parameter) 函数，注释掉
//Form.request方法的调用，改为:
jQuery.ajax({
        	type: 'POST',
            url: Me.ECForm.action,
            data: jQuery(Me.ECForm).serialize(),
            beforeSend: ECSideUtil.setRequestHeaders,
            async: asy,
            complete: resfunc
        });
//找到ECSideUtil.doAjaxUpdate = function(url, pars, callBack, formid)函数，注释掉
//var myAjax = new Ajax.Request(url, {...，改为：
jQuery.ajax({
        	type: 'POST',
            url: url,
            data: pars,
            beforeSend: ECSideUtil.setRequestHeaders,
            async: true,
            complete: callBack
        });
//为EcSideUtil添加一个函数（从prototype中摘出来的）：
ECSideUtil.setRequestHeaders = function(xhr, extras) {
	var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] &lt; 2005)
            headers['Connection'] = 'close';
    }
     
    for (var i = 0, length = ECSideConstants.AJAX_HEADER.length; i &lt; length; i += 2)
        headers[ECSideConstants.AJAX_HEADER[i]] = ECSideConstants.AJAX_HEADER[i+1];
     
};
</pre><br />OK，搞定。如果不想用jquery，可以使用任何js框架，比如用ExtJS，也可以自己写一个Ajax提交的方法。最后的那个setRequestHeaders可以不要的，有很多方法设置header...<br />BTW:怎么觉得这个文章俺好像写过一次了，汗...
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/181714#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 11 Apr 2008 12:14:21 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/181714</link>
        <guid>http://ecside.group.javaeye.com/group/blog/181714</guid>
      </item>
          <item>
        <title>GT-Grid的logo换了</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/179032" style="color:red;">http://ecside.group.javaeye.com/group/blog/179032</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          设计了一个新的<br /><br /><img src="http://fins.javaeye.com/upload/picture/pic/11090/2d5985fa-eabe-3ad7-8c6a-a47996791955.gif " /><br /><br /><img src="http://fins.javaeye.com/upload/picture/pic/11112/2170e8f6-44e9-3c40-b4d2-ced22b92f0ef.gif " /><br /><br />虽然不是很好看 但是也是用心设计了 过一阵打算在颜色搭配等细节上再做做文章<br />但是大体的样子应该就这样了<br /><br />原ecside的logo停用<br />纪念一下<br /><img src=" http://fins.javaeye.com/upload/picture/pic/11114/1bb33542-6ff5-3a86-bcc1-b701b2a2454c.gif " /><br /><br />不知道 圈子url能不能改一个啊 呵呵
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/179032#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 03 Apr 2008 00:35:55 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/179032</link>
        <guid>http://ecside.group.javaeye.com/group/blog/179032</guid>
      </item>
          <item>
        <title>咨询: 软件同名不同类,算不算侵权呢?</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/178749" style="color:red;">http://ecside.group.javaeye.com/group/blog/178749</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          google发现, 叫gt-grid的东西还有两个<br /><br />它们和我的gt-grid不是一类东西<br /><br />我起gt-grid这个名字算不算侵权呢?<br /><br />它们的网址: <br /><br />http://www.gtgrid.com<br /><br />http://www.shageophysics.com/GTGrid.html
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/178749#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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 Apr 2008 11:32:26 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/178749</link>
        <guid>http://ecside.group.javaeye.com/group/blog/178749</guid>
      </item>
          <item>
        <title>IE让人啼笑皆非的bug: 用cell的序号,找不到cell.</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/178671" style="color:red;">http://ecside.group.javaeye.com/group/blog/178671</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先不废话 代码如下:<br /><br /><pre name="code" class="html">
&lt;html>
 &lt;head>
&lt;script type="text/javascript" >

function init(){

var tab0=document.getElementById('tab0');

	var tr1=document.getElementById('tr1');

	var td3=document.getElementById('td3');

	var idx_tr1=tr1.rowIndex;

	var idx3= td3.cellIndex;



	alert( tab0.tBodies[0].rows[idx_tr1].id  + '\n'+ tr1.cells[idx3].id );

}
&lt;/script>
 &lt;/head>
 &lt;body onload="init()">
  &lt;table id="tab0" border="1" width="300">
  &lt;tr id="tr0" style="display:none;">&lt;td>.&lt;/td>&lt;td>.&lt;/td>&lt;td>.&lt;/td>&lt;td>.&lt;/td>&lt;td>.&lt;/td>&lt;/tr>
  &lt;tr id="tr1">
  	&lt;td id="td0">0&lt;/td>
	&lt;td id="td1">1&lt;/td>
	&lt;td id="td2" style="display:none;">2&lt;/td>
	&lt;td id="td3">3&lt;/td>
	&lt;td id="td4">4&lt;/td>
  &lt;/tr>
  &lt;/table>
 &lt;/body>
&lt;/html>
</pre><br /><br /><br />运行后<br /><br />ie里提示 tr1 td2<br /><br />ff safari opera下都提示  tr1 和 td3<br /><br />---------------------------------<br /><br />总结: 也就是说 在IE里 ,当table中有隐藏的td时 , cellIndex这个属性不再可靠.<br />但是 当table中有隐藏的tr时 , rowIndex这个属性依然是可靠的.<br /><br />ie里对 td 隐藏后的 ,在计算 cellIndex时 会当作那个隐藏的td被移除了一样计算<br />但是 tr的cells集合内却并没有移除那个隐藏的td.<br /><br />IE的做法实在是 让人无语了
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/178671#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 02 Apr 2008 09:38:42 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/178671</link>
        <guid>http://ecside.group.javaeye.com/group/blog/178671</guid>
      </item>
          <item>
        <title>GT-Grid 的bug, 建议,需求 汇总</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/178640" style="color:red;">http://ecside.group.javaeye.com/group/blog/178640</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请在此报告bug 以及建议<br />(不要提问题 谢谢合作)<br /><br />已知bug:<br /><br />1 日期控件bug (在ff下定位错误 同时会被覆盖)<br /><br />该bug的原因不明,因为日期控件使用的是一个开源组件,而不是我写的<br />下一步打算换一个,不过不打算自己写,还麻烦大家帮忙推荐几个轻量级的日期组件 谢谢了
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/178640#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 02 Apr 2008 08:56:36 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/178640</link>
        <guid>http://ecside.group.javaeye.com/group/blog/178640</guid>
      </item>
          <item>
        <title>[GT-Grid]列表组件 GT-Grid 1.0 alpha1 发布 ★20080417 更新</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/178353" style="color:red;">http://ecside.group.javaeye.com/group/blog/178353</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">[/color]2008年4月1日<br /><br />没想到会赶在今天发布第一个可用版本.<br />不知道是巧合 还是天意. 不过发布版本的消息绝对不是愚人节的玩笑<br /><br />这次发布的是第一个alpha版本. 肯定有很多问题,而且缺乏足够的文档和示例,所以并没有太指望有很多人来下载使用.<br />不过 我知道, 至少有一个人会下载的,那就是 [color=blue]mhere </span>.<br />长久以来 mhere 一直对 ecside 以及gtgrid 投入了极大的关注,如果没有mhere的督促,没有他的需求,也许GTGrid早已胎死腹中.<br />在这里要说一声谢谢.<br /><span style="font-size: medium"><span style="color: blue">谢谢 mhere</span></span><br /><br />(BTW: android刚出那阵,我真的想不做web 做移动开发去了,后来还是被支持我的朋友们拉了回来,谢谢你们.<br />也许我不应该错过android,但是如果我为了它而放弃自己坚持了好几年的东西,那我真的是太对不起自己了)<br /><br />同时还是要重复那句话: 向被我忽略的朋友说一声"对不起"<br /><br />很多热情的网友通过网络 向我咨询各种问题, 但是我却很少很少回答他们.<br />再这里我不想给自己的懒惰找借口,但是该说的还是一定要说的:<br />ecside 不够好 设计 代码质量 功能 都不够好,所以它已经死了.<br /><br />未来的GT会努力做到更好 更有生命力, 它不会再半途而废了, 因为我为它倾注了太多.<br />即使有一天 js html css 这些东西都已经过时, gtgrid依然会努力的以新的姿态存在.<br /><br />好, 废话到此为止, 下面是一些有一点点用处的废话.<br />======================================<br />(<span style="color: blue">暂时免费 , 不开源</span>)<br /><br />GT-Grid 1.0  alpha 1 特性: <br /><br />截图见 :  <a href="http://fins.javaeye.com/blog/172272" target="_blank">http://fins.javaeye.com/blog/172272</a><br /><br />ajax实现 (翻页,数据的crud基于ajax技术)<br />固定表头和工具栏<br />可调整列宽: 拖动列表表头之间的分割线.<br />可调整相对位置: 按住ctrl 键不放,拖动列表表头<br />支持按列排序,点击表头栏,将在 acs desc 默认排序 三者之间切换.<br />列隐藏<br />列冻结<br />支持列编组.(建议先排序后再编组)<br />支持行选择(按ctrl多选),选择方式类似在windows的资源管理器里选择文件.<br />可改变列表区域的大小: 拖动工具栏右下角的大小调整图标.<br />换肤 (功能上支持,但是目前只提供缺省皮肤,备选皮肤的css有错误)<br />自定义表头(使用自定义表头后 部分功能将不再支持)<br />可编辑列表<br />支持简单横向统计<br />支持flash chart<br />提供一定量的接口,可以实现一定量的自定义功能<br />不依赖任何第三方的ajax/js组件<br /><br />目前在 IE6 FF2 FF3 opera safari下测试通过.<br /><br /><br />下一版本的计划:<br />1 支持过滤<br />2 支持多列排序<br />3 完善统计功能<br />4 完善校验机制<br />5 编写和后台接合的例子<br />6 完善文档( 等待 javaeye的wiki完善,目前的je wiki太弱.表格 章节 图片 代码的支持还不够好 )<br /><br /><br />再下一版本的计划:<br />1 完善图表功能<br />2 支持单页大数据量的懒加载<br />3 支持客户端跨页数据保存<br />4 提供更好的更多样的编辑器<br />5 编写jsptag 简化前台开发<br />6 提供后台辅助函数,简化后台开发<br />7 开发ecside适配器,使其尽可能的与ecside兼容<br /><br /><br /><br />其他工作:<br />设计新的皮肤(风格) 和 logo. 寻求商业合作.<br /><br /><br />修改bug, 完善设计, 提供丰富的用户接口, 重构 ,性能优化 .... <br />这些是必须要做的 贯穿每一个版本<br /><br /><br />===================================<br />4月7日更新:<br />修正一些bug<br /><br />改变了一些接口实现方式<br />提供了 过滤功能的实现(接口实现,但是具体的界面还没有提供,示例中简单的演示了如何过滤)<br />丰富了示例<br /><br /><br />不要再下载这个alpha 1 了 alpha2出了 请去我的blog下载<img src="/images/smiles/icon_smile.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/178353#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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 Apr 2008 12:21:11 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/178353</link>
        <guid>http://ecside.group.javaeye.com/group/blog/178353</guid>
      </item>
          <item>
        <title>JAVA与SAP数据交互的方式总结</title>
        <author>woye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://woye.javaeye.com">woye</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/176056" style="color:red;">http://ecside.group.javaeye.com/group/blog/176056</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>JAVA与SAP数据交互的方式总结 </p><ol><li>RFC方式：Java程序直接通过RFC访问SAP的对象（或称函数，可能叫法不对）<br />SAP提供了BAPI(Business Application Programming Interface)，BAPI是SAP系统对外提供的一系列接口,主要是使第三方程序通过这些接口来使用SAP,从而方便客户定制某些程序.VB,Java,C,C++等都可以通过BAPI来访问SAP.BAPI是通过R/3系统上的RFC(Remote function call)功能来实现的.因为BAPI的强大功能作为基础,SAP就完全可以选择Java在CRM上加强各种功能,比如可以用Java快速开发一个实现特定功能的客户端。针对Java，SAP也提供了一个API叫Java Connector(JCo),可以使用它方便的调用BAPI提供的接口。</li></ol><p>举例说明 ：在我们的某一个项目中，需要每个月从R3取出供应商的寄售和非寄售汇总结算数据和明细数据，展现在供应商信息平台上，供供应商开发票和财务部付款进行结算，那么可以做一个定时器，通过RFC在每个月的一号0点将结算数据取出。</p><p>private final static String FUNCTION_GET_NONVMI_DATA = &quot;ZPUR_DATA_GET_TMP1&quot;;</p><p>&nbsp;/**<br />&nbsp; * 处理接口参数<br />&nbsp; */<br />&nbsp;private JCO.ParameterList getNonVmiTableParameterList(<br />&nbsp;&nbsp;&nbsp;JCO.Client aConnection, String bukr, String month, String start,<br />&nbsp;&nbsp;&nbsp;String end, String lifnr) {<br />&nbsp;&nbsp;IRepository aRepository = new JCO.Repository(&quot;SAPRep&quot;, aConnection);<br />&nbsp;&nbsp;IFunctionTemplate functionTemplate = aRepository<br />&nbsp;&nbsp;&nbsp;&nbsp;.getFunctionTemplate(FUNCTION_GET_NONVMI_DATA);<br />&nbsp;&nbsp;logger.debug(&quot;FunctionTemplate=&quot; + functionTemplate);<br />&nbsp;&nbsp;JCO.Function function = new JCO.Function(functionTemplate);<br />&nbsp;&nbsp;JCO.ParameterList input = function.getImportParameterList();<br />&nbsp;&nbsp;input.getField(&quot;BUKRS&quot;).setValue(bukr);<br />&nbsp;&nbsp;//input.getField(&quot;SPMON&quot;).setValue(month);<br />&nbsp;&nbsp;input.getField(&quot;LIFNR&quot;).setValue(lifnr);<br />&nbsp;&nbsp;input.getField(&quot;ZBUDATB&quot;).setValue(start);<br />&nbsp;&nbsp;input.getField(&quot;ZBUDATN&quot;).setValue(end);<br />&nbsp;&nbsp;logger.debug(&quot;ImportParameterList=&quot; + input);<br />&nbsp;&nbsp;aConnection.execute(function);<br />&nbsp;&nbsp;JCO.ParameterList tableParams = function.getTableParameterList();<br />&nbsp;&nbsp;return tableParams;<br />&nbsp;}</p><p>2、Idoc方式</p><p>　适用于中间文件的IDoc定义格式，是SAP企业系统软件的应用程序之间或SAP应用程序与外部程序之间电子数据交换用的标准数据格式。IDoc是SAP的应用程序连接系统的数据转换工具。IDoc用于数据异步处理：每个IDoc生成独立的文本文件，无需连接中央数据库，就可以传送给要求数据的工作平台。SAP的另一个系统业务应用程序接口则用于数据同步处理。　　一个大公司的网络操作环境很可能需要各地分公司的电脑都能与公司的主数据库连接。这些电脑很可能是用不同的硬件或操作系统平台。因为IDoc对数据进行了压缩，所以它无需变换格式就能在不同的操作系统上使用。　　IDoc类型指定不同种类的数据，比如说购买订单或发票，它们可能被划分为更细小的数据种类，即信息类型。更详细的分类意味着一个IDoc类型只能储存某一特定交易所需的数据，这样既提高了工作效率又降低了资源损耗。　　在事务处理过程中，IDoc随时会生成。例如，在运货交易过程中，可能会产生打印货运清单所需数据的IDoc。客户在SAP系统执行完一项交易后，在数据传送过程中和经过ALE通讯层时，一个或多个IDoc会生成。通讯层执行远程功能调用，使用由客户模式规定得端口定义和RFC介面定义。IDoc的接收者可能为R/3、R/2或一些外部系统。</p><p>在采用IDOC方式的时候，可以采用IDOC落地或不落地的方式，一般只有在跟踪测试或做传输记录的时候的采用IDOC落地的方式，一般其他情况基本上都是采用不落地的方式。</p><p>public class JcoIdocServer extends JCoIDoc.Server {</p><p>&nbsp;&nbsp;private final Log logger = LogFactory.getLog(JcoIdocServer.class);</p><p>&nbsp;&nbsp;public JcoIdocServer(java.util.Properties properties,<br />&nbsp;&nbsp;&nbsp;&nbsp;IRepository jcoRepository, IDoc.Repository idocRepository) {<br />&nbsp;&nbsp;&nbsp;super(properties, jcoRepository, idocRepository);<br />&nbsp;&nbsp;}// constructor MyIDocServer</p><p>&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * Overridden method of JCoIDoc.Server. Function requests that do not<br />&nbsp;&nbsp; * contain IDocs will be handled here. These requests will be stored as<br />&nbsp;&nbsp; * XML file in the incoming path. No other action will be done. The<br />&nbsp;&nbsp; * return values won't be filled and no exception will be thrown to the<br />&nbsp;&nbsp; * caller.<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;protected void handleRequest(JCO.Function function) {<br />&nbsp;&nbsp;&nbsp;logger.error(&quot;error:incoming function request '&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ function.getName() + &quot;',but this should be not happen.&quot;);<br />&nbsp;&nbsp;}// method handleRequest</p><p>&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * Overridden method of JCoIDoc.Server. Function requests that contain<br />&nbsp;&nbsp; * IDocs will be handled here. All IDocs will be stored as XML files in<br />&nbsp;&nbsp; * the incoming path. Additionally, IDocs that are part of an ORDERS<br />&nbsp;&nbsp; * message will be processed specifically. Some relevant information is<br />&nbsp;&nbsp; * extracted from these IDocs and will be stored in a text file in the<br />&nbsp;&nbsp; * incoming path.<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;protected void handleRequest(IDoc.DocumentList documentList) {<br />&nbsp;&nbsp;&nbsp;logger.debug(&quot;Incoming IDoc list request containing &quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ documentList.getNumDocuments() + &quot; documents...&quot;);</p><p>&nbsp;&nbsp;&nbsp;IDoc.DocumentIterator iterator = documentList.iterator();<br />&nbsp;&nbsp;&nbsp;IDoc.Document doc = null;</p><p>&nbsp;&nbsp;&nbsp;while (iterator.hasNext()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;doc = iterator.nextDocument();<br />&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(&quot;Processing document no. &quot; + doc.getIDocNumber()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ &quot;...&quot;);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;JcoIdocAudit jcoIdocAudit = new JcoIdocAudit();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setTabnam(doc.getTableStructureName());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setMandt(doc.getClient());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setDocnum(doc.getIDocNumber());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setDocrel(doc.getIDocSAPRelease());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setStatus(doc.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setDirect(doc.getDirection());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setOutmod(doc.getOutputMode());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setExprss(doc.getExpressFlag());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setTest(doc.getTestFlag());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setIdoctyp(doc.getIDocType());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setCimtyp(doc.getIDocTypeExtension());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setMestyp(doc.getMessageType());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setMescod(doc.getMessageCode());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setMesfct(doc.getMessageFunction());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setStd(doc.getEDIStandardFlag());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setStdvrs(doc.getEDIStandardVersion());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setStdmes(doc.getEDIMessageType());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndpor(doc.getSenderPort());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndprt(doc.getSenderPartnerType());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndpfc(doc.getSenderPartnerFunction());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndprn(doc.getSenderPartnerNumber());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndsad(doc.getSenderAddress());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSndlad(doc.getSenderLogicalAddress());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvpor(doc.getRecipientPort());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvprt(doc.getRecipientPartnerType());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvpfc(doc.getRecipientPartnerFunction());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvprn(doc.getRecipientPartnerNumber());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvsad(doc.getRecipientAddress());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRcvlad(doc.getRecipientLogicalAddress());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setCredat(doc.getCreationDateAsString());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setCretim(doc.getCreationTimeAsString());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRefint(doc.getEDITransmissionFile());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRefgrp(doc.getEDIMessageGroup());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setRefmes(doc.getEDIMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setArckey(doc.getArchiveKey());<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setSerial(doc.getSerialization());</p><p>&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAuditManager.create(jcoIdocAudit);<br />&nbsp;&nbsp;&nbsp;&nbsp;String[] result = new String[] {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JcoIdocAudit.OPERATION_FAILURE, &quot;未知错误&quot; };<br />&nbsp;&nbsp;&nbsp;&nbsp;String msgType = doc.getMessageType();<br />&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(&quot;Processing message of type '&quot; + msgType + &quot;'...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;if (&quot;MATMAS&quot;.equals(msgType)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(&quot;idocManager.processMATMAS(doc),msgType=&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ msgType);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(&quot;idocManager=&quot; + idocManager);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = idocManager.processMATMAS(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(&quot;invalid msgType:&quot; + msgType);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setOpcod(result[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAudit.setOpmsg(result[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;jcoIdocAuditManager.update(jcoIdocAudit);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}// method handleRequest</p><p>&nbsp;&nbsp;/**<br />&nbsp;&nbsp; * The following 4 methods for transaction management are not<br />&nbsp;&nbsp; * implemented here in this sample program. For a description on how to<br />&nbsp;&nbsp; * implement them in real production scenarios please see the JCo API<br />&nbsp;&nbsp; * specification for the JCO.Server class.<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp;protected boolean onCheckTID(String tid) {<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;}// method onCheckTID</p><p>&nbsp;&nbsp;protected void onConfirmTID(String tid) {<br />&nbsp;&nbsp;}// method onConfirmTID</p><p>&nbsp;&nbsp;protected void onCommit(String tid) {<br />&nbsp;&nbsp;}// method onCommit</p><p>&nbsp;&nbsp;protected void onRollback(String tid) {<br />&nbsp;&nbsp;}// method onRollback</p><p>@Override<br />&nbsp;&nbsp;public String toString() {<br />&nbsp;&nbsp;&nbsp;return &quot;gwhost=&quot; + this.getGWHost() + &quot;;gwserv=&quot; + this.getGWServ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ &quot;;progid=&quot; + this.getProgID();<br />&nbsp;&nbsp;}<br />&nbsp;}</p><p>3、XI方式</p><p>XI 的集成又可以分为两个层次，第一个层次称为Integration Broker，以消息的方式进行的数据的交换；另外一个层次是 BPM，即业务流程管理。<br />在 XI 中，数据（可以使一条记录，比如单个的物料主数据；也可以是多条记录，比如含主单明细的供应商主数据）从某一个业务系统通过 XI 发送到另外一个业务系统，站在业务系统的角度，前者称为 Sender，后者称为 Receiver 。<br />适配器(Adapter)进行 XI-XML 格式与业务系统的特定类型的数据格式之间的转换。依据业务系统的数据格式的不同，适配器可以分为多种类型，比如 SOAP Adapter, JDBC Adapter, File Adapter, RFC Adapter 和 IDoc Adapter 等。通常说的实现方式，譬如 SOAP+RFC，是指Sender 与 XI 之间使用 SOAP Adapter，XI 与 Receiver 之间使用 RFC Adapter。</p><p>&nbsp;</p><p>在我们其中的一个项目中，是java做一个接口部署为Web service，然后由XI通过这个web service向java程序输入相应数据。</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/176056#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 22:25:31 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/176056</link>
        <guid>http://ecside.group.javaeye.com/group/blog/176056</guid>
      </item>
          <item>
        <title>ectable的导出为Excel，以数字开头，以F或D结束的，最后F，D都被截取的问题终于解决</title>
        <author>woye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://woye.javaeye.com">woye</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/175199" style="color:red;">http://ecside.group.javaeye.com/group/blog/175199</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ectable的导出为Excel，以数字开头，以F或D结束的，最后F，D都被截取的问题，经过测试跟踪，终于找到了问题的根源。<br />在原ectable的org.extremecomponents.table.view.XlsView中，其方法writeToCellFormatted()为：<br />private void writeToCellFormatted(HSSFCell cell, String value, String styleModifier) {<br />        double numeric = NON_NUMERIC;<br /><br />        try {<br />         		<span style="color: red">numeric =Double.parseDouble(value);</span><br />        	} catch (Exception e) {<br />            numeric = NON_NUMERIC;<br />        }<br /><br />        if (value.startsWith("$") || value.endsWith("%") || value.startsWith("($")) {<br />            boolean moneyFlag = (value.startsWith("$") || value.startsWith("($"));<br />            boolean percentFlag = value.endsWith("%");<br /><br />            value = StringUtils.replace(value, "$", "");<br />            value = StringUtils.replace(value, "%", "");<br />            value = StringUtils.replace(value, ",", "");<br />            value = StringUtils.replace(value, "(", "-");<br />            value = StringUtils.replace(value, ")", "");<br /><br />            try {<br />                numeric = Double.parseDouble(value);<br />            } catch (Exception e) {<br />                numeric = NON_NUMERIC;<br />            }<br /><br />            cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);<br /><br />            if (moneyFlag) {<br />                // format money<br />                cell.setCellStyle((HSSFCellStyle) styles.get("moneyStyle" + styleModifier));<br />            } else if (percentFlag) {<br />                // format percent<br />                numeric = numeric / 100;<br />                cell.setCellStyle((HSSFCellStyle) styles.get("percentStyle" + styleModifier));<br />            }<br />        } else if (numeric != NON_NUMERIC) {<br />            // format numeric<br />            cell.setCellStyle((HSSFCellStyle) styles.get("numericStyle" + styleModifier));<br />        } else {<br />            // format text<br />            if (value.trim().equals(NBSP)) {<br />                value = "";<br />            }<br />            cell.setCellStyle((HSSFCellStyle) styles.get("textStyle" + styleModifier));<br />        }<br /><br />        fixWidthAndPopulate(cell, numeric, value);<br />    }<br /><br />其中红色部分对于以数字开头，以f，F，d，D结束的字符串会被解析为数字，因此导致结尾的F（f，D，d）会丢失。<br />因此需要排除这样的情况，相应修改如下：<br />try {<br />        <span style="color: red">	if(value.endsWith("F")||value.endsWith("f")||value.endsWith("D")||value.endsWith("d")){<br />        		numeric = NON_NUMERIC;<br />        	}else{<br />            numeric = Double.parseDouble(value);<br />        	}</span>        } catch (Exception e) {<br />            numeric = NON_NUMERIC;<br />        }
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/175199#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Sun, 23 Mar 2008 21:29:34 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/175199</link>
        <guid>http://ecside.group.javaeye.com/group/blog/175199</guid>
      </item>
          <item>
        <title>ectable的导出为Excel，以数字开头，以F或D结束的，最后F，D都被截取</title>
        <author>woye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://woye.javaeye.com">woye</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/175050" style="color:red;">http://ecside.group.javaeye.com/group/blog/175050</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          excel导出有个重大bug，该如何解决？以数字开头，以F或者D结束的，在导出的时候，字母f或d，都会被截取，类似25455F，3542654D，455555f，等？请问这是ectable的bug还是poi的bug？？
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/175050#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Sun, 23 Mar 2008 12:42:49 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/175050</link>
        <guid>http://ecside.group.javaeye.com/group/blog/175050</guid>
      </item>
          <item>
        <title>Ext的destroy机制引起的内存问题的分析( 二 )</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/174126" style="color:red;">http://ecside.group.javaeye.com/group/blog/174126</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天讨论了一下  ext的 Destroy机制引起的内存问题 发现出现问题的核心点 是 element.removeAllListeners 方法.   相关讨论见:<br /><br />Ext2.02事件机制缺陷分析,以及解决方案 <br />http://fins.javaeye.com/blog/173818<br /><br />EXT的destroy方法是不是存在漏洞?<br />http://fins.javaeye.com/blog/173218 <br /><br /><br />测试使用工具见<br />http://fins.javaeye.com/blog/172891 <br /><br /><br />解决这一问题后我们可以发现, 依然存在内存无法释放的问题. <br />分析后得出<span style="font-size: large"><span style="color: red">ext的又一个重大缺陷</span></span><br /><br />还是拿一个最最简单的window做例子<br /><pre name="code" class="javascript">
	win=new Ext.Window({title:" 窗口 ",
			width:400,
			draggable : false,
			shadow : false,
			resizable : false,
			shim :false,
			autoDestroy : true,
			height:300});
</pre><br />一个干净的页面, 生成上面那个窗口,然后再关闭, 用sIEve查看, 会发现存在很多无法被释放的 ext生成的孤立节点<br />大家可以注意看一下那些节点的 class ,可以发现如下两个(还有更多,我只是拿他们举例子).<br /><br />x-dlg-focus    x-window-bwrap<br /><br />也就是说,这两个节点没有被正确的销毁. 跟踪代码可以发现<br />这两个节点分别对应 window对象的<br /><br />this.focusEl<br /><br />this.bwrap<br /><br />为什么没有被正确的删除呢?  继续跟踪 跟踪所有 window层次结构上的所有类的<br />destroy beforeDestroy onDestroy 方法<br />可以看到 ,从来没有显示的调用过  消除他们的方法.<br /><br />看来我们需要自己手动来销毁他们了.<br /><br />于是可以修改 Window 的 beforeDestroy 方法: <br /><br /><pre name="code" class="javascript">
Ext.Window.prototype.beforeDestroy = function(){
        Ext.destroy(

	this.focusEl,  // 新增
	this.bwrap,	// 新增

            this.resizer,
            this.dd,
            this.proxy,
            this.mask
        );
        Ext.Window.superclass.beforeDestroy.call(this);
    }
</pre><br /><br />测试后发现, 依然无法删除那两个节点. 不死心, 继续!!!<br /><br />再修改<br /><br /><pre name="code" class="javascript">
Ext.Window.prototype.beforeDestroy = function(){
        Ext.destroy(

	this.focusEl,  // 新增
	this.bwrap,	// 新增

            this.resizer,
            this.dd,
            this.proxy,
            this.mask
        );
        Ext.Window.superclass.beforeDestroy.call(this);
	
	this.focusEl=null;  // 新增
	this.bwrap=null;	// 新增

    }
</pre><br /><br /><span style="color: red">注意</span> <span style="color: blue">由于 this.bwrap 是window从panel里继承来的, 所以this.bwrap其实应该通过修改panel的代码来消除<br />我在这里用偷懒的方式 是为了可以用尽量简短的代码来说明问题</span><br /><br /><br />再测试, ok 那两个节点没了!!<br /><br /><br />=================================<br />综上所述,我们可以得到如下结论:<br />Ext的作者为各个组件提供的 <span style="color: red">destroy方法存在严重缺陷</span>.<br />缺少对一些元素必要的 销毁动作, 同时 没有对属性赋值为 null ,使得浏览器无法回收多余的节点.<br /><br />页面越复杂 这个问题越严重. <br />解决办法只能是一个个组件看 看看哪些地方有遗漏 然后进行修补.能在基类中修补尽量修补.<br />同时 应该为组件增加 afterDestroy方法, 在里面对必要的属性进行赋值为null的操作.
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/174126#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 20 Mar 2008 15:01:38 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/174126</link>
        <guid>http://ecside.group.javaeye.com/group/blog/174126</guid>
      </item>
          <item>
        <title>Ext2.02事件机制缺陷分析,以及解决方案 ( 3-20更新 )</title>
        <author>fins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fins.javaeye.com">fins</a>&nbsp;
                    链接：<a href="http://ecside.group.javaeye.com/group/blog/173818" style="color:red;">http://ecside.group.javaeye.com/group/blog/173818</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">2008-03-20更新一个临时解决方案.</span><br /><br />测试发现,Ext2.02在IE下无法正常释放被删除的元素(当该元素被注册了事件时)<br />经过分析 发现ext事件机制中的一个bug<br />(<br />bug 具体描述见: http://fins.javaeye.com/blog/173218<br />测试使用工具见:  http://fins.javaeye.com/blog/172891<br />)<br /><br /><br />使用 el.on(eventName, fn) 为el添加事件<br />调用 Ext.destroy(el) 方法移除el<br />此时,如果fn为全局类型,或者是被全局对象引用, 那么会使el元素成为孤立节点,无法彻底移除.<br /><br />而如果在 Ext.destroy(el)  之前, 调用 el.un(eventName, fn) 移除添加的事件,<br />那么就可以彻底移除. 但是直接使用  Ext.destroy 才是ext中描述的正确做法,<br />切ext内部也都是这样使用的, 所以应该将解决问题的着手点放在 el.on 和  Ext.destroy方法上.<br /><br /><br /><pre name="code" class="javascript">
=============================
销毁元素的方法(很简单)
=============================
Ext.destroy(el){
	el.removeAllListeners();
	el.removeNode();
}
</pre><br />经过测试  Ext.destroy  el.removeNode 均无问题. 核心问题在 事件机制. 下面详细分析一下.<br /><br /><br /><pre name="code" class="javascript">
=============================
给一个元素添加事件
=============================
Element.on(eventName, fn) {
	el=this;
	调用 EventManager.on( el,eventName, fn ){
		调用 EventManager.listener( el,eventName, fn ){
			包装 	 h &lt;---- fn
			缓存  fn._handlers &lt;---- [ [h]  ]
			调用 Ext.Event.on( el,eventName, h )	{
				包装 	 wfn &lt;---- h
				缓存  Ext.Event._listeners  &lt;---- [ el , eventName, h, wfn ]
				el.addEvent( wfn ) 
			}
		}
	}
}
注意:真正注册到el上的事件是wfn
</pre><br /><br /><pre name="code" class="javascript">
=============================
移除一个元素的事件
=============================
Element.un(eventName, fn) {
	el=this;
	调用 EventManager.un( el,eventName, fn ){
		调用 EventManager.stopListener( el,eventName, fn ){
			取得之前缓存的 h &lt;---- fn._handlers 
			删除 fn._handlers  缓存内的相关数据 
			调用 Ext.Event.un( el,eventName, h )	{
				取得之前缓存的  wfn  &lt;---- Ext.Event._listeners
				el.removeEvent( wfn ) 
				删除 Ext.Event._listeners 缓存内的相关数据 
			}

		}
	}
}
</pre><br /><br /><pre name="code" class="javascript">
=============================
移除一个元素的所有注册的事件
=============================
Element.removeAllListeners() {
	el=this;
	调用 Ext.Event.purgeElement(el){
		取得缓存中所有的和el相关的信息   l[] &lt;---- Ext.Event._listeners
		&lt;循环开始 l[] >
			从 l中取得  eventName &lt;---- l[i];
			从 l中取得  h &lt;---- l[i];
			调用 Ext.Event.un( el,eventName, h )	{
				取得之前缓存的  wfn  &lt;---- Ext.Event._listeners
				el.remove( wfn ) 
				删除 Ext.Event._listeners 缓存内的相关数据 
			}
		&lt;循环结束>

	}

}
</pre><br /><br />==============================<br /><br />产生问题的原因<br />执行Element.removeAllListeners时没有调用  EventManager.stopListener中的 <br />"删除 fn._handlers  缓存内的相关数据 "<br /><br />导致在IE下 当 fn 为全局对象 或者是被引用时, 元素无法被正确移除.<br /><br />-----------------------------------------<br />如果只是简单的修改  Element.removeAllListeners<br /><br />让其 调用 Ext.Event.un 时 改成调用 EventManager.stopListener 是不行的<br /><br />因为  Element.removeAllListeners 调用   Ext.Event.un 时 ,传递的函数参数是h, 而不是最初的fn<br />但是 EventManager.stopListener需要得到 <span style="color: red">最初的fn</span>.<br /><br />-----------------------------------------<br />现在的情况是 从 fn 能找到h (fn._handlers)  ,但是 通过h无法找到fn<br />缓存Ext.Event._listeners  中也没有存放 <span style="color: red">最初的fn</span>.<br /><br />-----------------------------------------<br />也许可以考虑在 removeAllListeners  或 purgeElement 中对 fn._handlers 进行清除,但是 拿不到 <span style="color: red">最初的fn</span> <br /><br />-----------------------------------------<br />如果之前 强制 做一个引用, 例如  h._core =fn;<br />然后在 Element.removeAllListeners 加以利用 利用完之后 再清除, 似乎看起来不错<br />但是我试了 ,失败 !!!!<br />具体原因我也说不清<br /><br /><br /><br />==================================<br /><br />我觉得 如果要解决 这个bug  确实要对ext的整个事件机制做一番大改动.(恕我直言,ext的这套事件机制真的有点太....  )<br /><br />以上是我最近研究的成果<br />发上来和大家分享,如果说的不对 请务必一定马上纠正我, 以免误人子弟 谢谢大家了<br /><br /><br />======================================<br />下面附上刚刚写出的<span style="font-size: large"><span style="color: red">解决方案</span></span>,请大家拍砖, 我想肯定还有更好的方法. <br /><br /><br /><br />第一步 ========================<br />EventManager.js 153行<br /><br /><br /><pre name="code" class="javascript">
//修改 Ext.EventManager的 私有方法 listen
//	 E.on(el, ename, h);
// 改为如下 (即,多传一个最初的 fn)

	E.on(el, ename, h , fn);
</pre><br /><br /><br />第二步 ========================<br /><br />ext-base.js  227行<br /><br /><pre name="code" class="javascript">
//修改 Ext.lib.Event 的  addListener 和 removeListener 方法

addListener: function(el, eventName, fn , ofn) {

                el = Ext.getDom(el);

                if (!el || !fn) {
                    return false;
                }

                if ("unload" == eventName) {
                    unloadListeners[unloadListeners.length] =
                    [el, eventName, fn];
                    return true;
                }

                // prevent unload errors with simple check
                var wrappedFn = function(e) {
                    return typeof Ext != 'undefined' ? fn(Ext.lib.Event.getEvent(e)) : false;
                };
	
                var li = [el, eventName, fn, wrappedFn,ofn];
                var index = listeners.length;
                listeners[index] = li;

                this.doAdd(el, eventName, wrappedFn, false);
                return true;

            },

            removeListener: function(el, eventName, fn) {
                var i, len;

                el = Ext.getDom(el);

                if(!fn) {
                    return this.purgeElement(el, false, eventName);
                }


                if ("unload" == eventName) {

                    for (i = 0,len = unloadListeners.length; i &lt; len; i++) {
                        var li = unloadListeners[i];
                        if (li &&
                            li[0] == el &&
                            li[1] == eventName &&
                            li[2] == fn) {
                            unloadListeners.splice(i, 1);
                            return true;
                        }
                    }

                    return false;
                }

                var cacheItem = null;


                var index = arguments[3];

                if ("undefined" == typeof index) {
                    index = this._getCacheIndex(el, eventName, fn);
                }

                if (index >= 0) {
                    cacheItem = listeners[index];
                }

                if (!el || !cacheItem) {
                    return false;
                }

		this.doRemove(el, eventName, cacheItem[this.WFN], false);
		fn=listeners[index][4];
		if (fn){
			var id = Ext.id(el), hds = fn._handlers, hd = fn;
			if(hds){
				for(var i = 0, len = hds.length; i &lt; len; i++){
					var h = hds[i];
					if(h[0] == id && h[1] == eventName){
						hd = h[2];
						hds.splice(i, 1);
						break;
					}
				}
			}
		}
		delete listeners[index][this.WFN];
                delete listeners[index][this.FN];
                listeners.splice(index, 1);

                return true;

            },

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://ecside.group.javaeye.com/group/blog/173818#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 16:26:41 +0800</pubDate>
        <link>http://ecside.group.javaeye.com/group/blog/173818</link>
        <guid>http://ecside.group.javaeye.com/group/blog/173818</guid>
      </item>
          <item>
        <title>未来几天要做的工作</titl