<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>韶华易衰，逝者难追</title>
    <description></description>
    <link>http://chen4w.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>解决js对象的深度clone导致的递归死循环</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/147732" style="color:red;">http://chen4w.javaeye.com/blog/147732</a>&nbsp;
          发表时间: 2007年12月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li>问题描述：</li>
</ul>
js对象clone是RIA编程中常用方法，但是对象属性之间的循环引用会导致clone的递归进入死循环。<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;{pa1:'av1',pa2:'av2'};&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;b&nbsp;=&nbsp;{pb1:'bv1',pb2:'bv2'};&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>a.pa3&nbsp;=&nbsp;b;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//b.pb3&nbsp;=&nbsp;a;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;c&nbsp;=&nbsp;cloneobj(a);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
如果不包含注释掉的一行，clone是可以正常进行的。<br />
但是如果引入这一行，即出现了js对象属性的循环引用，clone将进入递归的死循环。<br />
<ul>
    <li>现象</li>
</ul>
浏览器能够很好的处理这种错误，并抛出&ldquo;too much recursion&quot;错误，并定位到相应的代码行。<br />
（小声说一句：如果写个js死循环就把浏览器搞死了，B/S应用就没法混了）<br />
<br />
<ul>
    <li>办法</li>
</ul>
如何解决了，通常的办法就是限制递归的深度，例如DWR的&lsquo;DWRUtil.toDescriptiveString&rsquo;<br />
但是窃以为这个并非好的解决办法，因为了对应用造成极大的限制。<br />
我的办法就是，在clone的过程中，记住每个已经clone的对象属性，<br />
并且在对对象进行深度clone之前，首先检查是否已经clone过了，如果是，则返回已clone的引用即可。<br />
因此只要放开示例代码的注释行&quot; // return os[m];&quot;<br />
就OK了。<br />
<br />
<ul>
    <li>说明</li>
</ul>
为了简化clone实现代码，引用并部分修改了DWR的工具类，见附件util.js<br />
同样的解决思路对于java对象的深度clone也是适用的
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/147732#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Dec 2007 10:34:22 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/147732</link>
        <guid>http://chen4w.javaeye.com/blog/147732</guid>
      </item>
      <item>
        <title>使用json取代传统的form提交</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/141124" style="color:red;">http://chen4w.javaeye.com/blog/141124</a>&nbsp;
          发表时间: 2007年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 传统的html提交在处理复杂对象的编辑时显得力不从心,结构性的数据在经过后台jsp或者asp处理，展示为前台的html表单后，成为平面型的form的input，这样，当form提交到后台，服务不得不重新将平面型的构造为结构性数据，以进行后续的处理。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 在采用O/R mapping的应用中，这样的展示方式成为开发工作的瓶颈。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WebRPC能够实现结构化数据在B/S之间的双向序列化，主流的实现如DWR，jsonRPC都提供了java对象&mdash;&mdash;js对象之间的双向序列化。<br />
&nbsp;&nbsp;&nbsp; 本文以jsonRPC与Ext2.0结合，通过以下步骤验证了用结构化数据取代传统form形式的可行性。<br />
<ol>
    <li> 将多个java对象序列化到Browser的js对象（json格式)</li>
    <li> 将json格式的js对象与Ext form进行绑定</li>
    <li> Ext界面组件负责交互，编辑数据</li>
    <li> 编辑结果更新到js对象</li>
    <li> js对象提交到后台，反序列化为java对象</li>
</ol>
<br />
关键代码如下：<br />
1.java对象序列化为json格式<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;format(Object&nbsp;o)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;JSONSerializer&nbsp;ser&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;JSONSerializer();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ser.registerDefaultSerializers();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;SerializerState&nbsp;state&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;SerializerState();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;JSONRPCResult&nbsp;result&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;JSONRPCResult(JSONRPCResult.CODE_SUCCESS,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">1</span><span>),&nbsp;ser.marshall(state,&nbsp;o));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;result.toString();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
2.json格式到Browser后，调用eval,形成js对象<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;jo;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;eval('jo&nbsp;=&nbsp;&lt;%=dt.format(dt.getDefaultObjs())&nbsp;%&gt;');&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;}&nbsp;<span class="keyword">catch</span><span>(e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;JSONRpcClient.Exception(550,&nbsp;</span><span class="string">&quot;error&nbsp;parsing&nbsp;result&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
3.js对象与Ext组件绑定<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;jsonload(fm,&nbsp;m){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;fm.obj&nbsp;=&nbsp;m;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(x&nbsp;</span><span class="keyword">in</span><span>&nbsp;m){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;fld&nbsp;=&nbsp;fm.find('name',x);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(fld.length==1)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fld[0].setValue(m[x]);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
4.Ext组件编辑结果更新<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;jsonupdate(fm){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!fm.obj)&nbsp;</span><span class="keyword">return</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;m=fm.obj;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(x&nbsp;</span><span class="keyword">in</span><span>&nbsp;m){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;fld&nbsp;=&nbsp;fm.find('name',x);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(fld.length==1)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m[x]=fld[0].getValue();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
5.js对象序列化为json字符串，并提交<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;jostr&nbsp;=&nbsp;toJSON(jo);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;el&nbsp;=&nbsp;Ext.getDom(</span><span class="string">&quot;jostr&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>el.value=jostr;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;fm&nbsp;=&nbsp;Ext.getDom(</span><span class="string">&quot;fm1&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>fm.submit();&nbsp;&nbsp;</span></li>
</ol>
</div>
6.json字符串反序列化为java对象<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;parse(String&nbsp;s)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jo&nbsp;=&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;JSONObject(s);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;JSONSerializer&nbsp;ser&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;JSONSerializer();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ser.registerDefaultSerializers();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;SerializerState&nbsp;state&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;SerializerState();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result=&nbsp;ser.unmarshall(state,&nbsp;<span class="keyword">null</span><span>,&nbsp;jo.get(</span><span class="string">&quot;result&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;result;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
页面是修改Ext2.0范例 examples\form\dynamic.html形成的，只保留了其中的tab-form示例用于多个对象的编辑<br />
涉及的jsonRPC、Ext库(2.0)请自行下载
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/141124#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Nov 2007 11:32:00 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/141124</link>
        <guid>http://chen4w.javaeye.com/blog/141124</guid>
      </item>
      <item>
        <title>拿什么拯救你，我的ie</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/121321" style="color:red;">http://chen4w.javaeye.com/blog/121321</a>&nbsp;
          发表时间: 2007年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我想在写这篇文章之前,已经有无数的难友被IE折磨得痛苦不堪了.<br />
下面就将我自己用IE的问题作个小结:<br />
1.div 无法覆盖select 表单的问题<br />
&nbsp; 痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp; 解决办法：<br />
&nbsp; 各路大仙真是仁者见仁，智者见智，归纳起来主要有两种<br />
&nbsp; a. 隐藏法<br />
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  计算select附近的div，如果发现div重叠，就赶紧隐藏select，典型代表 ：<a href="http://www.dynarch.com/projects/calendar/">www.dynarch.com/projects/calendar/</a><br />
&nbsp; b.替换法<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  干脆用div + table 重写个select得了<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  Ext做得不错，提供了对select的refresh方法 <a href="http://www.extjs.com">www.extjs.com</a><br />
<br />
2.缺少有效的脚本调试支持<br />
&nbsp;&nbsp;&nbsp; 痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp; 对于B/S的 B端开发人员来说,脚本调试器简直就是小李手的小刀.<br />
&nbsp;&nbsp;&nbsp; 相对于firefox下的firebug<a href="https://addons.mozilla.org/firefox/addon/1843">addons.mozilla.org/firefox/addon/1843</a><br />
&nbsp;&nbsp;&nbsp;&nbsp; IE的解决办法就是安装庞大的 InterDev , 或者目前的.net&nbsp; frame,就算是这样的庞然大物,<br />
&nbsp;&nbsp; 程序无响应也是经常的事情.<br />
&nbsp;&nbsp; 解决办法:<br />
&nbsp;&nbsp;&nbsp; 偶的解决办法,就是写跨浏览器的脚本,在ff下调试完了再往IE下移。<br />
&nbsp;&nbsp;&nbsp; 如果只在IE下出问题咋办？ &mdash;&mdash;&mdash;alert!!!!!<br />
<br />
3.低性能<br />
&nbsp;&nbsp; 痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp; 如果你用过这个<a href="http://www.scbr.com/docs/products/dhtmlxTree/index.shtml">www.scbr.com/docs/products/dhtmlxTree/index.shtml</a><br />
&nbsp;&nbsp; 如果你的书有上千个节点, 一定就会有所体会了, <br />
&nbsp;&nbsp; 在同一个页面里将几个图片重复利用几千次? <br />
&nbsp;&nbsp; 对不起,在IE中你不得不等待&quot;xxxx&quot;个图片正在下载。<br />
&nbsp; 我就弄不懂，同一个页面里的对同一个img的url引用，有必要每次都去检查更新么？？<br />
&nbsp; 解决办法：<br />
&nbsp;&nbsp; 把访问策略设置为&ldquo;自动&rdquo;吧，第一次的慢嘛只好忍受了。<br />
&nbsp;&nbsp; 提及低性能，有个有趣的实验一定要做&mdash;&mdash;将几千行的纯文本粘贴到 IE 的textarea中试试看，<br />
&nbsp; 一定会给你一个惊喜。<br />
<br />
4.自作主张<br />
&nbsp;  痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp;如果你调用getElementById,而ie未发现此id，那么它就会去找name为此id的元素并返回给你，不报任何错误。<br />
&nbsp;解决办法：<br />
&nbsp;写程序小心再小心<br />
<br />
5.内存泄漏<br />
&nbsp; 痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp; 在页面中通过js反复创建和删去Div，ie6会出现内存泄漏，甚至重启ie仍然无济于事。<br />
&nbsp; 这个真是RIA的噩梦啊！！<br />
&nbsp; RIA常用的手段就是利用div模拟窗口，因此div的创建和释放是最基本的操作。<br />
&nbsp;解决办法：<br />
&nbsp; 参考Ext的destory机制<br />
&nbsp;我的办法就是div复用，建一个就不放，重复利用。就算这样，由于窗口内容的刷新同样需要动态建立和释放html元素，<br />
&nbsp;仍然存在内存泄漏。<br />
<br />
6.兼容性差<br />
&nbsp; 痛苦指数&nbsp; <img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><img src="/javascripts/fckeditor/editor/images/smiley/msn/cry_smile.gif" alt="" /><br />
&nbsp; 这个问题是前一段在客户那里发现的，微软2003拼音输入法，与ie下textarea的刷新冲突。<br />
&nbsp;大家可以用下面这个最简单的页面看看效果<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;
    <p>&nbsp;</p>
    &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
&nbsp;当使用微软拼音2003的逐词提示，ie无法正确判断出刷新区域，干脆就将整个页面从背景到各层div逐个刷新的一遍。<br />
导致屏幕狂闪。<br />
&nbsp;让人哭笑不得的是，在firefox下居然一切正常。<br />
<br />
7.容错性差<br />
&nbsp;一个utf编码的页面通常有如下两句开头：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>title<span class="tag">&gt;</span><span>费力佩五世巧克力壶</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
这样写是没有问题的，可以如果调换这两句的顺序，ie就整个晕了，不仅分析不出title不说，<br />
后面的分析也全乱了,由于不知道编码,报出乱七八糟的错误.<br />
高版本的ie6解决了此问题，我的ie6.0.2900.2180存在问题.<br />
<br />
<br />
总结到此，欢迎大家补充！<br />
当然以上问题出现在目前应用较广的ie6上，ie7已经解决了大多数问题。<br />
但试想如果没有那只火狐狸捣乱，我们能指望用上ie7么？<br />
反过来也是一样，如果当年netscape一枝独秀，情况怕也好不到哪里去。<br />
所幸世界正在向着多元化的方向发展。<br />
&nbsp;<br />
<span lang="EN-US" style="font-size: 10.5pt; font-family: Wingdings;"><span style=""></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/121321#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Sep 2007 12:43:00 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/121321</link>
        <guid>http://chen4w.javaeye.com/blog/121321</guid>
      </item>
      <item>
        <title>采用动态缓存机制的内容发布实现（二）系统组成</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/116202" style="color:red;">http://chen4w.javaeye.com/blog/116202</a>&nbsp;
          发表时间: 2007年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>结构图</h2>
见附件<br />
<br />
<h2>说明</h2>
系统可划分为以远程文件管理为中心的网站管理和以模板引擎为中心页面生成两大部分。<br />
<br />
1.网站管理<br />
远程文件管理实现了B/S方式的对远程文件夹的管理，包括：<br />
&nbsp;&nbsp;&nbsp; 目录和文件的浏览<br />
&nbsp;&nbsp;&nbsp; 目录的创建、删除、重命名、移动<br />
&nbsp;&nbsp;&nbsp; 文件的上传、删除、重命名、移动<br />
&nbsp;&nbsp;&nbsp; 远程文件选择(单选)<br />
&nbsp;&nbsp;&nbsp; 远程目录选择（单选）<br />
在上述基本功能的基础上，可以实现以下系统功能：<br />
&nbsp;&nbsp;&nbsp; 网站文件夹管理<br />
&nbsp;&nbsp;&nbsp; 文章模板文件夹管理<br />
&nbsp;&nbsp;&nbsp; 频道封面及摘要模板管理<br />
&nbsp;&nbsp;&nbsp; 网站频道管理<br />
&nbsp;&nbsp;&nbsp; 网站频道选择<br />
&nbsp;&nbsp;&nbsp; 频道摘要编辑<br />
2.页面生成<br />
模板引擎负责将模板与结构化数据结合（文章模板），或者为模板注入URL参数（封面模板），以此生存静态页面。<br />
系统优先实现JSP形式的模板，但并不排斥其他的模板引擎技术。<br />
3.URL解析<br />
URL解析是实现动态缓存技术的关键，包括以下内容：、<br />
&nbsp;&nbsp;&nbsp; 定义文章发布的的URL规则<br />
&nbsp;&nbsp;&nbsp; 从静态URL请求中提取模板位置和结构化数据位置<br />
&nbsp;&nbsp;&nbsp; 将静态URL请求映射为动态URL请求（包括传入参数）<br />
URL解析为调用模板引擎生成静态页面准备了必要的信息。<br />
常见的URL有以下形式：<br />
&nbsp;&nbsp;&nbsp; 文章: site/数字资料馆/藏品/绘画/@dao.hb.Obj/12/21.html<br />
&nbsp;&nbsp;&nbsp; 分页封面： site/数字资料馆/藏品/陶瓷/$list.jsp/nd/明/page/3.html<br />
4. 文章发布管理<br />
负责定义文章的发布信息，包括：指向结构化数据的objkey标示、模板、目标频道、发布状态。<br />
文章发布定制实质上是URL解析的辅助部分，提供了基于文章发布定义的一种URL解析特例。<br />
RP系统设计目标为能够适应基于外部数据源的关系型数据发布，在文章的发布管理中，支持基于数据库检索的批量数据处理。此功能为文章发布管理模块之难点。<br />
5.数据源<br />
RP系统通过配置引入外部数据源，为提供读取外部数据的模板工具类提供支持。<br />
Spring对jdbc的良好封装，使RP能够以间接的代码读取外部数据源数据。<br />
6.模板工具类<br />
模板工具类提供常用的模板中可能调用的方法，其目标为简化模板脚本。
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/116202#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Aug 2007 16:49:31 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/116202</link>
        <guid>http://chen4w.javaeye.com/blog/116202</guid>
      </item>
      <item>
        <title>采用动态缓存机制的内容发布实现（一）工作流程</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/116200" style="color:red;">http://chen4w.javaeye.com/blog/116200</a>&nbsp;
          发表时间: 2007年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>流程图</h2>
见附件<br />
<br />
<h2>说明</h2>
1、浏览器向Apache请求静态页面<br />
<br />
2、Apache未找到该页面，通过Ajp3协议将请求转发Tomcat<br />
<br />
3、在Tomcat中一个、名为urlParser的Servlet负责处理转发请求<br />
<br />
4、urlParser根据URL规则匹配到相应的ActionBean<br />
<br />
5、ActionBean根据URL获得模板及必要的结构化数据<br />
<br />
6、模板管理模块负责根据模板及结构化数据（或者动态页面参数）生成静态页面，向浏览器回送静态页面内容，并将其按照URL路径写入文件系统。<br />
<br />
applicationContext.xml中相关的配置片断<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="comments"><!-- URL Parser--></span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;UrlParser&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;cm.rp.url.UrlParser&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;beanIds&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;chanelAct&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span><span class="tag"><!--</span--><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span><span class="comments"><!-- URL action--></span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;chanelAct&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;cm.rp.url.chanelAct&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;baseURL&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>/shtml</span><span class="tag"><!--</span--><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span><span class="tag"><!--</span--><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
</ol>
</div>
为了方便属性注入，其中UrlParser采用了Servlet代理<br />
在web.xml的配置<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>urlparser</span><span class="tag"><!--</span--><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>net.bat.util.ServletProxy</span><span class="tag"><!--</span--><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>targetBean</span><span class="tag"><!--</span--><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>UrlParser</span><span class="tag"><!--</span--><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag"><!--</span--><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
    <li class=""><span>&nbsp;<span class="tag"><!--</span--><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li>
</ol>
</div>
<br />
关于servlet代理，可以参考<a href="http://blog.csdn.net/indexchen/archive/2006/09/28/1301717.aspx">blog.csdn.net/indexchen/archive/2006/09/28/1301717.aspx</a>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/116200#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Aug 2007 16:40:34 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/116200</link>
        <guid>http://chen4w.javaeye.com/blog/116200</guid>
      </item>
      <item>
        <title>用Ext编写的远程文件管理</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/112163" style="color:red;">http://chen4w.javaeye.com/blog/112163</a>&nbsp;
          发表时间: 2007年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>功能描述</h2>
&nbsp;<br />
作为CMS系统的基础组件,远程文件管理实现了B/S方式的对远程文件夹的管理，包括：<br />
<ul>
    <li>目录和文件的浏览</li>
    <li>目录的创建、删除、重命名、移动</li>
    <li>文件的上传、删除、重命名、移动</li>
    <li>&nbsp;远程文件选择(单选,待实现)</li>
    <li>&nbsp;远程目录选择（单选,待实现）</li>
</ul>
在上述基本功能的基础上进行扩展,可以实现以下系统功能：<br />
<ul>
    <li>网站文件夹管理</li>
    <li>文章模板文件夹管理</li>
    <li>频道封面及摘要模板管理</li>
    <li>网站频道管理</li>
    <li>网站频道选择</li>
    <li>频道摘要编辑、</li>
</ul>
<h2>特点</h2>
集成了Ext的主题<br />
支持多国语言
<h2>如何部署</h2>
附件为eclipse工程，包含ant\文件,由于附件大小的限制，我没有上传以下文件<br />
ext :请下载ext1.1并展开重命名覆盖附件中的ext目录<br />
commons-io-1.2.jar (commons-fileupload-1.2.jar所需要)<br />
spring.jar ,hibernate3.jar 请自行下载并放到WebContent\WEB-INF\lib<br />
<br />
<h2>远程路径设置</h2>
我设置了两个远程目录,位于WebContent\bat\rp\rp.js 的497，498行<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>RP.initFile('d:/www/','tree_file');&nbsp;&nbsp;</span></span></li>
    <li class=""><span>RP.initFile('D:/RP/WebContent/site/','tree_chanel');&nbsp;&nbsp;</span></li>
</ol>
</div>
请将其改为你需要访问的目录<br />
<br />
<h2>访问</h2>
完成上述工作后访问http://localhost:8080/rp/bat/rp/rp.html<br />
就可以看到主界面了<br />
<br />
祝你顺利！<br />
<h2>声明</h2>
文件类型图标采用了<a href="http://www.vonloesch.de/jspbrowser.html">www.vonloesch.de/jspbrowser.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/112163#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Aug 2007 17:40:20 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/112163</link>
        <guid>http://chen4w.javaeye.com/blog/112163</guid>
      </item>
      <item>
        <title>Apache2.2和Tomcat5.0的整合（二）—解决REDIRECT_URL的中文路径问题</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/105363" style="color:red;">http://chen4w.javaeye.com/blog/105363</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li>
    <p>现象</p>
    </li>
</ul>
通过mod_jk整合Apache和Tomcat，在Servlet中可以通过request.getAttribute(&quot;REDIRECT_URL&quot;)获得Apache自定义错误处理的原始URL。<br />
不幸的是，如果这个REDIRECT_URL包含中文路径，我们获得的将是乱码。<br />
例如：请求不存在的页面http://localhost/rp/数字故宫/hh.html,<br />
返回结果为:/rp/&aelig;&deg;&aring;&shy;&aelig;&aring;&reg;&laquo;/hh.html<br />
<ul>
    <li>问题定位</li>
</ul>
问题出在哪里呢？<br />
作以下测试：<br />
在Apache的httpd.conf加入如下两行<br />
JkEnvVar DPM1 %e6%95%b0%e5%ad%97%e6%95%85%e5%ae%ab<br />
JkEnvVar DPM2 数字故宫<br />
结果第一行返回: %e6%95%b0%e5%ad%97%e6%95%85%e5%ae%ab<br />
第二行返回: &aelig;&deg;&aring;&shy;&aelig;&aring;&reg;&laquo;<br />
即jk本身不能正确将环境变量的中文值送到request.getAttribute<br />
<br />
下载mod_jk源代码http://tomcat.apache.org/download-connectors.cgi<br />
通过代码分析、日志跟踪，确定Apache送到jk的REDIRECT_URL值为utf-8编码<br />
此变量值经过jk_b_append_string函数写入到缓冲后，通过socket8009发送给tomcat之后，<br />
再经过tomcat接收分析之后，出现乱码。<br />
<ul>
    <li>解决办法</li>
</ul>
解决办法，既然jk处理西文没有问题，何不将中文URL进行URLEnocode<br />
从网上收到urlencode的C实现：<br />
<div class="code_title">c# 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">static</span><span>&nbsp;unsigned&nbsp;</span><span class="keyword">char</span><span>&nbsp;hexchars[]&nbsp;=&nbsp;</span><span class="string">&quot;0123456789ABCDEF&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">char</span><span>&nbsp;*urlencode(</span><span class="keyword">char</span><span>&nbsp;*s)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;<span class="keyword">int</span><span>&nbsp;x,&nbsp;y;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span class="keyword">char</span><span>&nbsp;*str;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;len=strlen(s);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;(unsigned&nbsp;<span class="keyword">char</span><span>&nbsp;*)&nbsp;malloc(3&nbsp;*&nbsp;strlen(s)&nbsp;+&nbsp;1);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(x&nbsp;=&nbsp;0,&nbsp;y&nbsp;=&nbsp;0;&nbsp;len--;&nbsp;x++,&nbsp;y++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y]&nbsp;=&nbsp;(unsigned&nbsp;<span class="keyword">char</span><span>)&nbsp;s[x];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(str[y]&nbsp;==&nbsp;'&nbsp;')&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y]&nbsp;=&nbsp;'+';&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="preprocessor">#ifndef&nbsp;CHARSET_EBCDIC</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;((str[y]&nbsp;&lt;&nbsp;'0'&nbsp;&amp;&amp;&nbsp;str[y]&nbsp;!=&nbsp;'-'&nbsp;&amp;&amp;&nbsp;str[y]&nbsp;!=&nbsp;</span><span class="string">'.'</span><span>)&nbsp;||&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(str[y]&nbsp;&lt;&nbsp;'A'&nbsp;&amp;&amp;&nbsp;str[y]&nbsp;&gt;&nbsp;'9')&nbsp;||&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(str[y]&nbsp;&gt;&nbsp;'Z'&nbsp;&amp;&amp;&nbsp;str[y]&nbsp;&lt;&nbsp;'a'&nbsp;&amp;&amp;&nbsp;str[y]&nbsp;!=&nbsp;'_')&nbsp;||&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(str[y]&nbsp;&gt;&nbsp;'z'))&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y++]&nbsp;=&nbsp;'%';&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y++]&nbsp;=&nbsp;hexchars[(unsigned&nbsp;<span class="keyword">char</span><span>)&nbsp;s[x]&nbsp;&gt;&gt;&nbsp;4];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y]&nbsp;=&nbsp;hexchars[(unsigned&nbsp;<span class="keyword">char</span><span>)&nbsp;s[x]&nbsp;&amp;&nbsp;15];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="preprocessor">#else&nbsp;/*CHARSET_EBCDIC*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!isalnum(str[y])&nbsp;&amp;&amp;&nbsp;strchr(</span><span class="string">&quot;_-.&quot;</span><span>,&nbsp;str[y])&nbsp;==&nbsp;NULL)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/*&nbsp;Allow&nbsp;only&nbsp;alphanumeric&nbsp;chars&nbsp;and&nbsp;'_',&nbsp;'-',&nbsp;'.';&nbsp;escape&nbsp;the&nbsp;rest&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y++]&nbsp;=&nbsp;'%';&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y++]&nbsp;=&nbsp;hexchars[os_toascii[(unsigned&nbsp;<span class="keyword">char</span><span>)&nbsp;s[x]]&nbsp;&gt;&gt;&nbsp;4];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[y]&nbsp;=&nbsp;hexchars[os_toascii[(unsigned&nbsp;<span class="keyword">char</span><span>)&nbsp;s[x]]&nbsp;&amp;&nbsp;0x0F];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="preprocessor">#endif&nbsp;/*CHARSET_EBCDIC*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;str[y]&nbsp;=&nbsp;'\0';&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;((</span><span class="keyword">char</span><span>&nbsp;*)&nbsp;str);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
将ajp_marshal_into_msgb函数体发送属性部分进行修改，修改后的代码为：<br />
<div class="code_title">cpp 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-cpp" start="1">
    <li class="alt"><span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(s-&gt;num_attributes&nbsp;&gt;&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;s-&gt;num_attributes;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//c4w</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="datatypes">char</span><span>&nbsp;*&nbsp;pval=s-&gt;attributes_values[i];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="datatypes">char</span><span>&nbsp;*&nbsp;url=NULL;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">if</span><span>(strcmp(s-&gt;attributes_names[i],</span><span class="string">&quot;REDIRECT_URL&quot;</span><span>)==0){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;url=urlencode(s-&gt;attributes_values[i]);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//pval=url;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(jk_b_append_byte(msg,&nbsp;SC_A_REQ_ATTRIBUTE)&nbsp;||&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jk_b_append_string(msg,&nbsp;s-&gt;attributes_names[i])&nbsp;||&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jk_b_append_string(msg,&nbsp;pval))&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jk_log(l,&nbsp;JK_LOG_ERROR,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;failed&nbsp;appending&nbsp;attribute&nbsp;%s=%s&quot;</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s-&gt;attributes_names[i],&nbsp;pval);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JK_TRACE_EXIT(l);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;JK_FALSE;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">if</span><span>(url!=NULL)&nbsp;free(url);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
最后，在jsp中对REDIRECT_URL进行解码<br />
String url=URLDecoder.decode((String)request.getAttribute(&quot;REDIRECT_URL&quot;),&quot;utf-8&quot;);<br />
<ul>
    <li>结论</li>
</ul>
编译，启动tomcat，重新请求不存在的页面http://localhost/rp/数字故宫/hh.html,返回结果为:/rp/&aelig;&deg;&aring;&shy;&aelig;&aring;&reg;&laquo;/hh.html<br />
看到了了正确的结果：/rp/数字故宫/hh.html
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/105363#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 12:37:18 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/105363</link>
        <guid>http://chen4w.javaeye.com/blog/105363</guid>
      </item>
      <item>
        <title>Apache2.2.4 + Tomcat5.0整合手记</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/102884" style="color:red;">http://chen4w.javaeye.com/blog/102884</a>&nbsp;
          发表时间: 2007年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          基于反向代理的动态页面缓存技术（参见<a href="http://www.chedong.com/tech/cache.html#apache">车东文章</a>），<br />
落实到穷人的解决方案之一就是Apache+tomcat的整合，整合应当达到以下几方面效果：<br />
1.Apache负责静态文件的处理<br />
2.涉及jsp，servlet的动态请求交给tomcat处理<br />
3.通过自定义错误响应404，当Apache找不到静态页面时，应当重定向给tomcat处理<br />
4.在负责处理第3种情况tomcat的servlet或者jsp中，能够获得重定向之前的URL等信息。<br />
<br />
看了网上的文章，需要在apache2.2自带ajp或者mod_jk之间做出选择。<br />
先试试ajp吧，大家都说配置简单。<br />
搜了一下，以<a href="http://dengqi-100.blog.163.com/blog/static/772597200741710343105/">这篇文章</a>讲得最为清楚。<br />
按照作者指引，很快来到了第4步。在httpd-vhosts.conf中加入一行<br />
&nbsp;&nbsp;&nbsp; ErrorDocument 404 /rp/test.jsp<br />
其中test.jsp是统一的404错误入口，将来调用模板和数据生成请求的静态页面。<br />
测试代码如下：<br />
&lt;%@ page contentType=&quot;text/html;charset=gb2312&quot; import=&quot;java.util.*&quot;%&gt;<br />
&lt;%out.println(&quot;
<h1>Hello World!jsp </h1>
&quot;);%&gt;<br />
&lt;%<br />
Object redir_url = request.getAttribute(&quot;REDIRECT_URL&quot;);<br />
out.println(redir_url);<br />
%&gt;<br />
<br />
结果404错误重定向到该页面后，确无法获得原始的URL。<br />
在网上搜索，也有难友遇到同样的问题，即ajp没有提供类似mod_jk的JkEnvVar机制，<br />
以将错误重定向的环境变量传递给servlet的request.getAttribute<br />
关于apache的自定义错误处理参见<a href="http://www.kingmx.com/Manual/ApacheMenu/custom-error.html">www.kingmx.com/Manual/ApacheMenu/custom-error.html</a><br />
没奈何只好悻悻作罢。<br />
后来想了想，有一个曲折的解决办法就是，将ErrorDocument重定向到apache下的一个html，再由此html在browser端<br />
利用js调用tomcat的servlet并将原始URL传递进去。<br />
关键代码行如下：<br />
<br />
document.location=&quot;http://localhost/batcal/test.jsp?ru=&quot;+document.URL;<br />
这个办法的缺点是效率较低,与服务端重定向相比较,多了一次http交互.<br />
<br />
改用mod_jk好了<br />
根据以下链接http://blog.sina.com.cn/u/4c592ecf010009dz<br />
指引，同样顺利来到第4步。<br />
<br />
在httpd.conf中加入一行<br />
JkEnvVar REDIRECT_URL NULL<br />
再次调用test.jsp，结果通过request.getAttribute(&quot;REDIRECT_URL&quot;);获得了原始URL，搞定。<br />
<br />
与采用ajp相比，mod_jk的配置确实麻烦。但总算实现了预期目标。
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/102884#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jul 2007 17:19:32 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/102884</link>
        <guid>http://chen4w.javaeye.com/blog/102884</guid>
      </item>
      <item>
        <title>缓存静态页面的编码问题</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/102081" style="color:red;">http://chen4w.javaeye.com/blog/102081</a>&nbsp;
          发表时间: 2007年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在CMS系统中一个基本问题是对基于模板的动态页面结果进行缓存,如果模板采用jsp,常常使用response重定向截获输出结果。<br />
常见的代码如下：
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>WrapperResponse&nbsp;wp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WrapperResponse(response);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>request.getRequestDispatcher(tp).include(request,&nbsp;wp);&nbsp;&nbsp;</span></li>
</ol>
</div>
但是如果我的jsp中指定了字符编码呢，例如：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&lt;%@&nbsp;page&nbsp;contentType=</span><span class="string">&quot;text/html;charset=utf-8&quot;</span><span>...&nbsp;&nbsp;</span></span></li>
</ol>
</div>
如何让生成的静态页面的编码与之一致呢?<br />
查看jsp对应的servlet代码，找到与上述指令对应的一行<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>response.setContentType(</span><span class="string">&quot;text/html;charset=utf-8&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
于是猜想是否可以response.getContentType来获得编码指定呢<br />
即： String ct = wp.getResponse().getContentType();<br />
但是结果为null。<br />
查javaDoc说明<br />
<a href="http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/RequestDispatcher.html">&nbsp;链接</a><br />
The <a href="http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletResponse.html"><code>ServletResponse</code></a> object has its path elements  and parameters remain unchanged from the caller's. The included  servlet cannot change the response status code or set headers;  any attempt to make a change is ignored.<br />
根据此说明上述jsp对应的servlet代码中<span><span>setContentType的语句被忽略了。<br />
但是我的问题还是没有解决。<br />
<br />
将</span></span><span>request.getRequestDispatcher(tp).include(request,&nbsp;wp);&nbsp; <br />
改为request.getRequestDispatcher(tp).forward(request, wp);<br />
问题解决了：<br />
写静态文件的代码为
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>FileOutputStream&nbsp;fos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(to);&nbsp;</span><span class="comment">//&nbsp;把jsp输出的内容写到xxx.htm</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>fos.write(wp.getContent().getBytes(wp.getCharacterEncoding()));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>fos.close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
</span>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/102081#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jul 2007 16:41:07 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/102081</link>
        <guid>http://chen4w.javaeye.com/blog/102081</guid>
      </item>
      <item>
        <title>HTML parser选型测试</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/99754" style="color:red;">http://chen4w.javaeye.com/blog/99754</a>&nbsp;
          发表时间: 2007年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          内容管理(cms)常常需要将网站频道的摘要(summery)合并到父频道的封面，引入HTML parser，<br />
&nbsp;可以结构化方式操作HTML内容，使网页内容的提取、重构变得容易。<br />
&nbsp;以下链接列出了相关的java opensource项目<br />
&nbsp;http://www.open-open.com/30.htm<br />
&nbsp;根据网友的评论，将htmlcleaner、htmlparser、nekohtml列入候选。<br />
&nbsp;以附件html作为测试用例，按照常见的getElementsByTagName提取Body,<br />
&nbsp;以getElementById获取id为'content6'的script<br />
&nbsp;测试编码如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;Neko(String&nbsp;path)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SAXException,&nbsp;IOException{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DOMParser&nbsp;parser&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;DOMParser();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//InputSource&nbsp;in&nbsp;=&nbsp;new&nbsp;InputSource(new&nbsp;Reader());</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;parser.parse(TPPath+path);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc=parser.getDocument();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.NodeList&nbsp;nl&nbsp;=&nbsp;doc.getElementsByTagName(<span class="string">&quot;body&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(printNode(nl.item(<span class="number">0</span><span>)));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;----------------------------------------&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Element&nbsp;n&nbsp;=&nbsp;doc.getElementById(<span class="string">&quot;content6&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(printNode(n));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;htmlparser(String&nbsp;path)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ParserException{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;one&nbsp;of&nbsp;several&nbsp;constructors</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Parser&nbsp;p&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Parser(TPPath+path);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;NodeList&nbsp;nl=p.parse(<span class="keyword">new</span><span>&nbsp;TagNameFilter(</span><span class="string">&quot;body&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(nl.elementAt(<span class="number">0</span><span>).toHtml());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;----------------------------------------&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Parser&nbsp;p2&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Parser(TPPath+path);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;NodeList&nbsp;nl2=p2.parse(<span class="keyword">new</span><span>&nbsp;HasAttributeFilter(</span><span class="string">&quot;id&quot;</span><span>,</span><span class="string">&quot;content6&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(nl2.elementAt(<span class="number">0</span><span>).toHtml());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;htmlcleaner(String&nbsp;path)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;one&nbsp;of&nbsp;several&nbsp;constructors</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;HtmlCleaner&nbsp;cleaner&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;HtmlCleaner(</span><span class="keyword">new</span><span>&nbsp;File(TPPath+path));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Document&nbsp;doc&nbsp;=&nbsp;cleaner.createDOM();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.NodeList&nbsp;nl&nbsp;=&nbsp;doc.getElementsByTagName(<span class="string">&quot;body&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(printNode(nl.item(<span class="number">0</span><span>)));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;----------------------------------------&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Element&nbsp;n=doc.getElementById(<span class="string">&quot;content6&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(printNode(n));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
一个打印dom节点的辅助方法如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;printNode(Node&nbsp;node)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sbuf=<span class="keyword">new</span><span>&nbsp;StringBuffer();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;nn=node.getNodeName();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">boolean</span><span>&nbsp;btag=</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(nn.equals(</span><span class="string">&quot;#text&quot;</span><span>))&nbsp;btag=</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(btag){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(node.hasAttributes()){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NamedNodeMap&nbsp;attrs=node.getAttributes();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;abuf=&nbsp;<span class="keyword">new</span><span>&nbsp;StringBuffer();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>,len=attrs.getLength();&nbsp;i&lt;len;&nbsp;i++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;attr=attrs.item(i);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abuf.append(<span class="string">&quot;&nbsp;&quot;</span><span>+attr.getNodeName()+</span><span class="string">&quot;=\&quot;&quot;</span><span>+attr.getNodeValue()+</span><span class="string">&quot;\&quot;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.append(<span class="string">&quot;&lt;&quot;</span><span>+nn+abuf.toString()+</span><span class="string">&quot;&gt;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>&nbsp;&nbsp;sbuf.append(</span><span class="string">&quot;&lt;&quot;</span><span>+nn+</span><span class="string">&quot;&gt;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(node.hasChildNodes()){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;child&nbsp;=&nbsp;node.getFirstChild();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.append(child.getNodeValue());&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(child&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.append(printNode(child));&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child&nbsp;=&nbsp;child.getNextSibling();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(btag)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.append(<span class="string">&quot;&lt;/&quot;</span><span>+nn+</span><span class="string">&quot;&gt;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;sbuf.toString();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
&nbsp;测试结果如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getElementsByTagName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getElementById<br />
htmlcleaner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抛出异常java.lang.NoSuchFieldError: fRecognizedFeatures <br />
htmlparser&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在分析到script中的字符串包含&quot;&lt;/b&gt;&quot;出现逻辑错误，将该&lt;/b&gt;误判为script结束<br />
nekohtml&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br />
<br />
nekohtml入选。
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/99754#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 10 Jul 2007 13:23:24 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/99754</link>
        <guid>http://chen4w.javaeye.com/blog/99754</guid>
      </item>
      <item>
        <title>RIA带来了什么</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/98376" style="color:red;">http://chen4w.javaeye.com/blog/98376</a>&nbsp;
          发表时间: 2007年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着B/S应用的逐渐兴起，传统的html Form对于完成复杂的表单提交已经越来越力不从心。表现在以下方面：<br />
1.组件类型不够丰富，且缺乏简单有效的扩展机制<br />
&nbsp; 例如grid、tree这些常见的需求不得不借助第三方组件（js\applet或者activex形式的）<br />
2.数据的无序<br />
&nbsp; 数据是平面型的，例如做一个主、子表的编辑，不得不将结构化数据通过input命名机制转化为平面的form，然后提交的时候再做逆向的转换。<br />
&nbsp;由于在browser端丢失了结构信息，C/S程序常见的剪切/复制/粘贴，实现起来也就比较困难，界面效果也差强人意（一大堆的input挤在一起，不知道focus在哪里）<br />
<br />
借助RIA框架，可以解决第1类问题，目前主流的RIA均实现了一套对象重载的组件（用户可以在此机制下编写自己的组件），以及组件的事件侦听机制。<br />
组件类型已经达到C/S解决方案的水平，甚至在支持theme上有独到之处。<br />
需要注意的是，如果仅仅是在某个特定页面需要某个特定的组件，那么引入RIA框架代价太大了。<br />
因为不得不引入该组件需要的核心库。因此，此类需求更适合应用其他功能独立的组件。<br />
<br />
RIA框架更加适合与Ajax结合，形成一套全新的browser端UI机制。<br />
目前将结构化数据从server序列化到browser端，有许多好的协议和实现，例如：json\burlap\dwr等。<br />
事实上，由于js中对象、数组以及函数是按引用来复制、传递和比较的。<br />
将结构化的js对象与UI组件进行绑定（通过js对象的属性进行关联），就实现了界面与数据的完全同步，从而彻底摆脱了传统form下的重命名机制。<br />
无论是browser还是server端，都可以操作结构良好、一致的数据，使得简化程序逻辑、增强复用性成为可能。
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/98376#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jul 2007 09:46:55 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/98376</link>
        <guid>http://chen4w.javaeye.com/blog/98376</guid>
      </item>
      <item>
        <title>Ext的form类型扩展（二）——AttachField</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/95536" style="color:red;">http://chen4w.javaeye.com/blog/95536</a>&nbsp;
          发表时间: 2007年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          类名:Ext.form.AttachField<br />
扩展自:Ext.form.TriggerField<br />
功能描述:能够处理多个附件的本地上传、删除、浏览，支持进度显示<br />
如何部署：<br />
-------------s端----------------------<br />
预备工作：建立Web工程，增加dwr支持<br />
1.将附件源码net.bar的java类加入你的Web工程<br />
2.在web.xml加入以下定义<br />
&nbsp;<servlet><init-param>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>fileupload</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>net.bat.upload.uploadServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>path</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>d:/upload/</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>tpPath</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>d:/</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  </init-param><br />
&nbsp;&nbsp;&nbsp; </servlet><br />
3.将类TaskCenter通过dwr开放给B端，以支持进度显示<br />
例如，我的dwr集成到spring下，相应的配置为<br />
&nbsp;&nbsp;&nbsp;&nbsp; <create creator="spring" javascript="TC"><include method="newTask"><include method="getTotal"><include method="getCur">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">create</span><span>&nbsp;</span><span class="attribute">creator</span><span>=</span><span class="attribute-value">&quot;spring&quot;</span><span>&nbsp;</span><span class="attribute">javascript</span><span>=</span><span class="attribute-value">&quot;TC&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>param&nbsp;<span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;beanName&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;TaskCenter&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;newTask&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;getTotal&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;getCur&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">include</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;cancel&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">create</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
------------b端-----------------------<br />
1.将附件form.rar展开到ext/examples/form/下<br />
2.浏览http://host:port/yourapp/ext/examples/form/formext.html<br />
其中photo为Attach类型</include></include></include></create>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/95536#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Jun 2007 14:56:38 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/95536</link>
        <guid>http://chen4w.javaeye.com/blog/95536</guid>
      </item>
      <item>
        <title>Ext的form类型扩展（一）——TreeField</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/95511" style="color:red;">http://chen4w.javaeye.com/blog/95511</a>&nbsp;
          发表时间: 2007年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          类型:Ext.form.TreeField<br />
扩展自:Ext.form.TriggerField<br />
功能描述:加载一个xml，作为前端选择的tree<br />
参数: url:xml路径<br />
源码及demo:见附件form.rar<br />
说明:将form.rar中包含的文件展开到ext\examples\form 下<br />
在浏览器中访问 http://host:port/ext/examples/form/formext.html<br />
效果如附图所示：<br />
其中rpTreeNodeFromXml函数参考了http://extjs.com/forum/上的从xml生成tree的例子<br />
formext.html参考了dynamic.html
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/95511#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Jun 2007 14:06:54 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/95511</link>
        <guid>http://chen4w.javaeye.com/blog/95511</guid>
      </item>
      <item>
        <title>AIX下的中文文件路径问题</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/94844" style="color:red;">http://chen4w.javaeye.com/blog/94844</a>&nbsp;
          发表时间: 2007年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>
<p>&nbsp; 在将java编写的Web应用部署到AIX系统下出现中文文件路径问题。</p>
<p>环境：AIX4.3，jdk1.5, tomcat5.0, 运行tomcat的file.encoding设置为GB18030</p>
<p>AIX语言为西文。<br />
</p>
<p>现象：1.不能通过new File创建中文文件路径; 2.获得的目录树如果包含中文路径，显示为乱码。</p>
<p>由于war为在window下打包，怀疑是javac的问题，于是直接在AIX下写了测试的java并以application运行，结果正确。</p>
<p>进一步将工程在aix下使用ant重新build，启动tomcat，运行结果确仍然乱码。</p>
<p>于是怀疑在西文的AIX下不能java的 new File()，或者File.getName(),不能处理非iso-8859-1的文件路径。</p>
<p>将写入和读出的文件路径经过程序处理：</p>
<p>待写入的路径转化为iso-8859-1编码的String ：</p>
<p> public static&nbsp; String toLocalFN(String fn){</p>
<p>&nbsp;&nbsp; return new String(fn.getBytes(),&quot;iso-8859-1&quot;);<br />
</p>
<p>} <br />
</p>
<p>相应地，获得的文件路径按照iso-8859-1编码处理</p>
<p> public static String fromLocalFN(String fn){</p>
<p>&nbsp; return new String(fn.getBytes(&quot;iso-8859-1&quot;));<br />
</p>
<p>}</p>
<p>直接在windows下ant，将jar部署到AIX下，结果创建中文路径和获取中文路径都顺利通过。</p>
<p>此解决方法需要检查工程中所有的文件读写，比较麻烦。<br />
</p>
<p>不知道有没有更好的解决办法?<br />
</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/94844#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Jun 2007 20:55:57 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/94844</link>
        <guid>http://chen4w.javaeye.com/blog/94844</guid>
      </item>
      <item>
        <title>Ext(www.extjs.com)使用感受</title>
        <author>chen4w</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chen4w.javaeye.com">chen4w</a>&nbsp;
          链接：<a href="http://chen4w.javaeye.com/blog/93834" style="color:red;">http://chen4w.javaeye.com/blog/93834</a>&nbsp;
          发表时间: 2007年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          知道Ext是从Flex粉丝的口水大战，看了它的jsDoc，感觉似曾相识，<br />
对象重载、事件侦听、怎么看都象C/S的组件sdk。<br />
再粗略浏览了examples，呵呵，实用而且酷！<br />
我说洪哥，咱们动手罢！<br />
****实战****<br />
用了两个月的时间，完成了以下工作：<br />
1.Ext的Grid采用json作为默认支持的数据格式，而我的数据格式是传输机制是基于dwr的，<br />
&nbsp; 不过Ext良好的分层设计允许编写自己的数据加载。<br />
&nbsp; 按照此机制编写了自己的数据加载类：<br />
&nbsp; Ext.extend(Bat.UI.Ext.ObjReader, Ext.data.DataReader<br />
&nbsp; Ext.extend(Bat.UI.Ext.Proxy, Ext.data.DataProxy,<br />
&nbsp; 在此基础上实现了grid组件与我自定义的数据格式的结合。<br />
&nbsp; <br />
2.扩展Ext.form.TriggerField，实现了几个自己需要的form组件<br />
&nbsp; AttachField：多附件<br />
&nbsp; 功能：支持带进度显示的本地上传、附件的浏览、删除。<br />
&nbsp; TreeField:树<br />
&nbsp; 功能：从xml加载生成树，支持节点的增加、删除、拖拽、重命名、属性编辑<br />
&nbsp; FileField:远程文件操作<br />
&nbsp; 功能:浏览远程文件目录、支持文件上传、选择、打开、移动、重命名<br />
<br />
此过程中、感觉Ext的重载和事件侦听机制还是比较好用的，基本上我能想到的功能都顺利实现了。<br />
也发现一些小bug，主要是特殊应用下在ie下出现，Ext论坛上也有许多网友提交了bug，大都是在ie下出现。<br />
看来Ext的开发团队应当是主要以ff为测试环境的。<br />
Ext的论坛比较活跃，提交的bug大都能得到及时响应。<br />
<br />
****编辑器****<br />
初期我使用jsEclipse，后来发现了更适合Ext开发的Spket，是我目前所见过的js editor中最强的。<br />
<a href="http://www.spket.com/js.html" target="_blank">http://www.spket.com/js.html</a><br />
<br />
****调试****<br />
Ext自带了debug窗口，可以实时监视Dom文档树和调试信息，我还是更习惯ff下的venkman<br />
&nbsp; <br />
****应用****&nbsp; <br />
Ext全部代码的压缩版本ext-all.js，目前为469KB<br />
比较适合部署在局域网上的B/S应用，不过其官方网站也列举了一些www上的应用。<br />
Ext对Dom进行了良好的封装，实现了对象重载和事件侦听，并在此基础上实现了一整套ui组件，<br />
这些组件正是对html组件的增强(validate问题、IE的select问题、)和补充。<br />
也是实现B/S应用频繁使用的，与用户自定义组件相结合，就可以形成一套可复用的ui组件。<br />
是编写RIA的好工具。
          <br/>
          <span style="color:red;">
            <a href="http://chen4w.javaeye.com/blog/93834#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Jun 2007 10:31:26 +0800</pubDate>
        <link>http://chen4w.javaeye.com/blog/93834</link>
        <guid>http://chen4w.javaeye.com/blog/93834</guid>
      </item>
  </channel>
</rss>