<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>铁木箱子</title>
    <description>Java程序员，主要从事B/S系统开发，熟悉spring、freemarker、dojo、prototype、ext等开源工具，热衷系统架构设计和用户体验设计！推崇和向往开源项目开发：-）</description>
    <link>http://ferreousbox.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>如何区分真静态和伪静态网页呢？</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/197478" style="color:red;">http://ferreousbox.javaeye.com/blog/197478</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 我们在逛大型网站的时候，如163、淘宝这样的网站，总是对它的&ldquo;静态&rdquo;技术感兴趣（当然是技术人员了），比如一个163上的新闻链接：<a href="http://news.163.com/08/0527/05/4CU68GU300012MS7.html">http://news.163.com/08/0527/05/4CU68GU300012MS7.html</a>，我们如何来确定这个是真实的静态文件，还是url rewrite后的伪静态呢？今天突然想到是否可用js来判断，通过读取文档的最后修改时间来判断是否是真实的静态网页。</p>
<p>&nbsp;&nbsp;&nbsp; 我们使用FF访问该页面，等页面加载完成后，在FF的控制台上输入js命令：alert(document.lastModified);然后我们就可以看到该文档的最后修改时间了，然后刷新该页面，再输入同样的命令查看日期，如果两次或多次查看的日期都是不一样的，那么可以肯定该文档肯定是伪静态的。然后大家可以试一下访问真实静态的页面，然后查看其问的那个的最后修改日期，其结果都是一样的。</p>
<p>&nbsp;&nbsp;&nbsp; 不知道这样的测试方法是否可以包含全部情况？大家或许可以一起来讨论下~：）</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/197478#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 15:19:25 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/197478</link>
        <guid>http://ferreousbox.javaeye.com/blog/197478</guid>
      </item>
      <item>
        <title>休息一下，顺便看下ibatis的一个小bug</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/197125" style="color:red;">http://ferreousbox.javaeye.com/blog/197125</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 今天在使用ibatis的例子程序的时候，发现了一个bug（版本是ibatis-2.3.0.677），平常不用倒看不出来，呵呵。当然了，这不是ibatis框架的bug，估计是开发人员忙着打包忘记了：-）</p>
<p>&nbsp;&nbsp;&nbsp; 看下图，大家应该看出来了吧~~~~，顺便也贴个源码，呵呵</p>
<pre name="code" class="xml">  &lt;!-- Insert example, using the Account parameter class --&gt;
  &lt;insert id="insertAccount" parameterClass="Account"&gt;
    insert into ACCOUNT (
      ACC_ID,
      ACC_FIRST_NAME,
      ACC_LAST_NAME,
      ACC_EMAIL
    values (
      #id#, #firstName#, #lastName#, #emailAddress#
    )
  &lt;/insert&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/197125#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 16:27:34 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/197125</link>
        <guid>http://ferreousbox.javaeye.com/blog/197125</guid>
      </item>
      <item>
        <title>lighttpd的安装和基本模块的使用介绍</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/196212" style="color:red;">http://ferreousbox.javaeye.com/blog/196212</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 前端时间以为系统的需要，就弄了个lighttpd，主要是使用flowplayer和lighttpd搭建一个在线的flv流媒体播放功能。而且lighttpd也是有mod_flv_streaming模块来支持flv视频的流播放功能，不过我也是只是简单的使用了其中的功能，并不是很深入，但是入门还是可以的。</p>
<p>&nbsp;&nbsp;&nbsp; 首先就是lighttpd的安装了，lighttp的安装需要pcre-7.6.tar.gz，主要是正则式的解析，安装包如下：</p>
<p>1.pcre-7.6.tar.gz&nbsp;&nbsp;&nbsp; (<a href="http://www.pcre.org/">http://www.pcre.org/</a>)<br />2.lighttpd-1.4.19.tar.gz&nbsp;&nbsp; (<a href="http://www.lighttpd.net/download/">http://www.lighttpd.net/download/</a>)</p>
<p><span style="color: #ff0000;">一、安装pcre和lighttpd</span></p>
<div><span>0</span><span>1</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />// pcre的安装 <br /><span>0</span><span>2</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#tar xf pcre-7.6.tar.gz <br /><span>0</span><span>3</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#cd pcre-7.6 <br /><span>0</span><span>4</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#./configure <br /><span>0</span><span>5</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make clean <br /><span>0</span><span>6</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make <br /><span>0</span><span>7</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make install <br /><span>0</span><span>8</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /> <br /><span>0</span><span>9</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /><span>// lighttpd的编译安装 </span><br /><span>10</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#tar xf lighttpd-1.4.19.tar.gz <br /><span>11</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#cd lighttpd-1.4.19 <br /><span>12</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#./configure --prefix=/usr/local/lighttpd <br /><span>13</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make clean <br /><span>14</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make <br /><span>15</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#make install <br /><span>16</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /> <br /><span>17</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /><span>// lighttpd的配置文件、用户组和用户的配置 </span><br /><span>18</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#mkdir /usr/local/lighttpd/etc <br /><span>19</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#cp doc/lighttpd.conf /usr/local/lighttpd/etc <br /><span>20</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#groupadd lighttpd <br /><span>21</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#useradd -g lighttpd lighttpd <br /><span>22</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /> <br /><span>23</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /><span>// lighttpd的日志文件设置 </span><br /><span>24</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#mkdir /usr/local/lighttpd/logs <br /><span>25</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />#vi /etc/init.d/lighttpd <br /><span>26</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /> 修改LIGHTTPD_CONFIG=/etc/sysconfig/lighttpd为/usr/local/lighttpd/etc/lighttpd.conf <br /><span>27</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" /> 修改LIGHTTPD_BIN=/usr/sbin/lighttpd为/usr/local/lighttpd/sbin/lighttpd</div>
<p><span style="color: #ff0000;">二、lighttpd的简单配置和主要参数说明</span></p>
<p><span style="color: #990000;"><strong>#vi /usr/local/lighttpd/etc/lighttpd.conf</strong></span><br />&nbsp;server.modules 根据需要启动模块<br />&nbsp;server.document-root 改为你的网站的根目录(如/www)<br />&nbsp;server.errorlog 改为错误日志的路径(如/usr/local/lighttpd/logs/error.log)<br />&nbsp;accesslog.filename 改为访问日志的路径(如/usr/local/lighttpd/logs/access.log)</p>
<p><span style="color: #ff0000;">三、启动lighttpd<br /><br /></span><span style="color: #990000;"><strong>#/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf</strong></span></p>
<p>&nbsp; 然后我们在/www下建立一个index.html，输入hello，然后访问该服务器即可看到该页面，即表明lighttpd安装成功！<br />lighttpd的命令如下：<br /><span style="color: #990000;"><strong>#/usr/local/lighttpd/sbin/lighttpd --help</strong></span><br />-f &lt;name&gt; 指定配置文件的路径<br />-m &lt;name&gt; 指定模块的加载目录，默认是/usr/local/lighttpd/lib<br />-p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在屏幕上显示解析后的配置文件信息(运行信息)，要指定-f参数<br />-t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检测配置文件的正确行，要指定-f参数<br />-D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置lighttpd非后台运行，默认是后台运行<br />-v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示lighttpd的版本<br />-V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示lighttpd的编译时特性信息<br />-h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示帮助信息，同--help</p>
<p><span style="color: #ff0000;">四、lighttpd的模块配置</span></p>
<p>&nbsp;&nbsp;&nbsp; lighttpd按照上面的安装步骤后，其所有模块都已经安装在/usr/local/lighttpd/lib目录下了，我们设置在server.modules中的模块名称和lib目录下的模块文件的名称一致即可，如mod_secdownload.so就是表示mod_secdownload模块。我们可以在server.modules的列表中增加mod_secdownload来使lighttpd支持mod_secdownload。另外还可以使用这样的语法来增加模块：server.modules += ("mod_secdownload")</p>
<p><strong><span style="color: #990099;">1)rewrite 模块配置</span></strong><br />&nbsp;&nbsp;&nbsp; 如果要配置rewrite模块，则直接在lighttpd.conf文件中书写：<br /><span style="color: #990000;">url.rewrite-once = (<br />&nbsp; "^/show-([0-9]+)\.html" =&gt; "$1.html",<br />&nbsp; "^/v/show-([0-9]+)\.html" =&gt; "$1.html"<br />)</span><br />&nbsp;&nbsp;&nbsp; 如果有多个，则使用,分割开写即可，如上说述！另外还有url.rewrite-repeat等方式，请参看文档<a href="http://trac.lighttpd.net/trac/wiki/Docs%3AConfigurationOptions">http://trac.lighttpd.net/trac/wiki/Docs%3AConfigurationOptions</a>！其基本的正则式和apache的rewrite模块基本一样，只是书写形式不一样而已。比如按照上面的rewrite规则，我们在www目录下建立文件：123.html，然后访问：<a href="http://localhost:8080/show-123.html">http://localhost:8080/show-123.html</a>即可以访问到123.html这个文件了，和直接访问：<a href="http://localhost:8080/123.html">http://localhost:8080/123.html</a>是一样的效果。<br />&nbsp; </p>
<p><span style="color: #990099;"><strong>2)secdownload 模块配置<br /></strong></span>&nbsp;&nbsp;&nbsp; secdownload是安全下载模块，其主要原理就是根据时间戳来判断请求是否已经超时了，如果超过了指定的时间那么将不允许访问指定的资源，否则就是可以访问。其在lighttpd.conf文件中的配置如下：<br /><br /><span style="color: #990000;">secdownload.secret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "my-password"<br />secdownload.document-root&nbsp;&nbsp; = "/home/my-download/"<br />secdownload.uri-prefix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "/rs/dl/"<br />secdownload.timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 60</span></p>
<p>&nbsp;&nbsp;&nbsp; 先来说下lighttpd针对该模块的url要求，如果使用lighttpd的secdownload模块，那么其请求的url地址必须满足特定的要求才可以，其要求的url格式如下：</p>
<p><span style="color: #ff3366;">&lt;uri-prefix&gt;/&lt;token&gt;/&lt;timestamp-in-hex&gt;/&lt;rel-path&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp; 其url地址由四个部分组成，分别说明如下：<br />1.<span style="color: #ff3366;">&lt;uri-prefix&gt;：</span>配置文件中<span style="color: #990000;">secdownload.uri-prefix</span>指定的前缀；</p>
<p>2.<span style="color: #ff0033;">&lt;token&gt;：</span>是由配置文件中指定的<span style="color: #990000;">secdownload.secret</span><span style="color: #000000;">加<span style="color: #990000;">要下载的文件的路径（必须以/开头）</span>加<span style="color: #990000;">时间戳</span></span><span style="color: #000000;">三者连接后的MD5加密后的字符串，注意官方网站上提供的例子是php的，其中php的time()获取的就是从1970年到当前的标准时间（单位是秒）的8进制表示形式，如果是使用java的话，那么可以通过如下代码来获取：</span></p>
<div><span>1</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />String timestamp = String.format(<span>"%08x"</span>, System.currentTimeMillis()/1000);</div>
<p>&nbsp;&nbsp;&nbsp;因为System.currentTimeMillis()获取的是毫秒，所以应该除1000，这样才可以。比如我要下载的文件的文件存放路径为：/home/my-download/aa.txt。注意到这里的路径前缀就是配置文件中的<span style="color: #990000;">secdownload.document-root</span>的值，最好是将<span style="color: #990000;">secdownload.document-root</span>的值设置在当前lighttpd的<span style="color: #990000;">server.document-root</span>目录之外，这样就可以避免直接下载了。那么针对这个文件动态生成token的java代码就应该是如下了：</p>
<div><span>1</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />String timestamp = String.format(<span>"%08x"</span>, System.currentTimeMillis()/1000); <br /><span>2</span> <img src="file:///E:/Resources/编辑器/PiscesTextEditor_V1.1/PiscesTextEditor/codeimages/InBlock.gif" alt="" />String encoder = Encrypt.MD5(<span>"my-password"</span> + <span>"/aa.txt"</span> + timestamp);</div>
<p>&nbsp;&nbsp;&nbsp; 其中Encrypt.MD5是我自己的一个MD5加密方法，大家可以自己写一个，注意该方法中三个部分我是分开写的，第一个就是我们在lighttpd配置文件中设置的<span style="color: #990000;">secdownload.secret</span><span style="color: #000000;">，第二个就是我们要下载的文件名称（包括路径），是相对<span style="color: #990000;">secdownload.document-root</span>的路径而言的，第三个部分就是我们获取到的当前的时间戳了。这样我们就可以动态的生成了一个满足lighttpd要求的token。</span></p>
<p>3.<span style="color: #ff0066;">&lt;timestamp-in-hex&gt;：</span>就是我们刚才生成的时间戳，即上面的timestamp了；</p>
<p>4.<span style="color: #ff0066;">&lt;rel-path&gt;：</span><span style="color: #000000;">这个就是我们要下载的文件，也就是aa.txt了。</span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 配置文件中<span style="color: #990033;">secdownload.timeout</span>是用来校验时间戳在多长时间后失效的，我们这里设置的是1分钟，即60秒。这表明，从我们生成下载地址后的60s内如果没有人点击这个地址那么该链接就将失效。这样也就可以基本防止文件被随意下载了。</span></p>
<p><span style="color: #000000;"><strong><span style="color: #990099;">3)mod_proxy 代理模块配置</span></strong><br />&nbsp;&nbsp;&nbsp; 该模块主要是用来连接lighttpd和动态服务器的，如tomcat，在配置文件中输入如下：</span></p>
<p><span style="color: #990000;">$HTTP["url"] =~ ".jsp|.go|.do|action" { <br />&nbsp;&nbsp;&nbsp; proxy.balance = "fair" <br />&nbsp;&nbsp;&nbsp; proxy.server = ( "" =&gt; ( ( "host" =&gt; "127.0.0.1", "port" =&gt; 8080 ),("host" =&gt; "127.0.0.1", "port" =&gt; 18080) ))<br />}</span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 其中host字段表示代理服务器的配置(ip和端口),如果有多个则可以配置负载服务器，这里配置的是两个。proxy.loadblance用来做负载，具体的没有研究过，大家可以参看官方文档详细了解下。</span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 这里主要简单的说了lighttpd的安装部署和简单模块的使用，希望可以和大家一起相互交流~~~</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/196212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 May 2008 18:00:52 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/196212</link>
        <guid>http://ferreousbox.javaeye.com/blog/196212</guid>
      </item>
      <item>
        <title>说说网站静态化和SEO</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/184860" style="color:red;">http://ferreousbox.javaeye.com/blog/184860</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家一说起网站的高性能，第一时间想到的就是使访问者访问的是静态页面，因为大家都知道访问静态页面的开销比动态的要小得多，而且高效得多。这也是前几年seo专家们普遍优化网站的重点之一。但是对于目前网络上内容变化频繁的大型网站而言（如淘宝），使用静态页面访问虽然很好。但是细细想一下，以淘宝这样的规模，其静态化网站的页面至少有几十万，甚至上百万。这样维护一个如此大规模的静态文件，其难度程度可想而知了，最重要的是其页面内容是经常更新的，如我们一个宝贝的页面，要显示店主的在线状态、用户的购买情况等等，这些都是可能随时更新的，因此对于这样的网站实行静态化，个人感觉无疑于“自杀”！话可能说的有点过了，呵呵，网站静态化对于小型网站，页面内容更新不需要很频繁的网站无疑是优化网站性能的一个很重要的方面，而且网站静态化对于SEO也是非常有帮助的，虽然目前的搜索引擎也支持动态生成的内容，但似乎更青睐静态页面，包括伪静态页面。<br /><br />    以前在开发系统时，也有一个门户的部分，当时考虑到系统的性能问题也使用静态化页面，但并不是传统的html页面，而是xml+xsl文件的组合，这样改变xsl文件后整个网站也就随之改变了，达到了内容与显示的分离，同时也实现了静态化。当然了，那个门户基本上都是新闻发布之类的，对于其内容的更新不是非常多，所以这样处理就很方便和实用了。刚刚也说到了使用伪静态化似乎是大型网站的更好的选择，因为不需要维护大量的静态文件。我们可以看到对于淘宝、163、sohu等网站，虽然其新闻页面和宝贝页面是html后缀的，但是同时也看到其内容应该是属于动态更新的，要不然，还真是无法想象。所以可以想到，目前的大型网站几乎很少用静态页面来访问的，多数是基于伪静态化的访问方式。伪静态化就是说访问地址看上去其后缀是html或htm等形式，但其内容实际上是动态生成的。那么如何实现网站的伪静态化呢？这个也是我下面要说的，就是URL的rewrite，即URL的重写技术。<br /><br />    我们以apache2.2为例来说下如何实现url的rewrite，首先要给apahce2安装rewrite模块，操作步骤如下：<br /><br /><pre name="code" class="java">#cd /home/
#tar xf httpd-2.2.6.tar.gz
#cd httpd-2.2.6
#./configure --prefix=/usr/local/apache2.2 --enable-so --with-mpm=worker --enable-module=rewrite --enable-shared=rewrite
#make && make install
#cd modules/mappers/
#/usr/local/apache2.2/bin/apxs  -c mod_rewrite.c -lgdbm
#gcc -shared -o mod_rewrite.so mod_rewrite.o -lgdbm
#/usr/local/apache2.2/bin/apxs  -i -A -n rewrite mod_rewrite.so</pre><br /><br />    这样我们就安装好了apache的rewrite模块，然后我们就可以使用正则式来匹配url并替换了。apache使用rewrite模块的格式如下：<br /><br />RewriteEngine On   #开启rewrite模块<br />RewriteRule 源地址的正则式 rewrite后的真实地址<br /><br />    通常对于如下的动态地址我们可以使用相应的静态地址进行重写，如下：<br /><br /><pre name="code" class="java">/bbs/list-4-1.html      /mybbs/show-topic.do?border=4&page=1</pre><br />这样我们在apache中就可以这样写入:<br /><br /><pre name="code" class="java">RewriteRule ^/bbs/list-([0-9]+)-([0-9]+)\.html$  /mybbs/show-topic.do?border=$1&page=$2 [pt]</pre><br /><br />    像上面的地址我们就是将所有/bbs/list-4-1.html这样的地址匹配成/mybbs/show-topic.do?border=4&page=1这样的动态地址，同时转给tomcat来进行处理（rewriteRule后的[pt]标志）。我们假设以静态页面为例子的话，同时假设apache的网站根路径是/www/test/，我们在根目录下建立123.html文件，然后在apache的配置文件中写入如下的重写规则：<br /><br /><pre name="code" class="java">RewriteRule ^/show/news-([0-9]+)\.html$ /$1.html</pre><br />    这样，当我们访问/show/news-123.html的时候，就会被apache重写为/123.html，也就是访问到根目录下的123.html文件了，如果有246.html文件在根目录下，那么我们就可以访问/show/news-246.html了。<br /><br />    通过url的rewrite技术，我们可以很方便的来伪静态化网站，同时又实现动态的内容，而且对于seo也有一定的帮助，呵呵~~~另外，在lighttpd中使用rewrite也是非常方便，正则式基本上差不多。
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/184860#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 11:47:55 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/184860</link>
        <guid>http://ferreousbox.javaeye.com/blog/184860</guid>
      </item>
      <item>
        <title>phpMyAdmin安装完全攻略手记</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/179530" style="color:red;">http://ferreousbox.javaeye.com/blog/179530</a>&nbsp;
          发表时间: 2008年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; 最近由于需要用到phpMyAdmin来管理服务器上的mysql数据库，所以今天就学习了下如何安装phpMyAdmin，顺便也记录下来以备后查。</p><p>&nbsp;</p><p><strong>一、软件安装包</strong></p><p>1.httpd-2.2.6.tar.gz<br />2.php-5.2.5.tar.gz<br />3.phpMyAdmin-2.11.5.1-all-languages.tar.gz<br />4.php-mysqlnd-5.0.1-beta.tar.gz</p><p>&nbsp;</p><p><strong>二、安装apache的httpd</strong></p><p>#tar xf httpd-2.2.6.tar.gz<br />#cd httpd-2.2.6<br />#./configure --prefix=/usr/local/apache2 --enable-module=so<br />#make<br />#make install</p><p>&nbsp;</p><p><strong>三、安装php5</strong></p><p>#tar xf php-mysqlnd-5.0.1-beta.tar.gz<br />#tar xf php-5.2.5.tar.gz<br />#cd php-5.2.5<br />#rm -f -R ext/mysqli<br />#cp -R ../php-mysqlnd-5.0.1-beta/php5/ext/mysqli&nbsp; ./ext/<br />#./buildconf --force<br />#./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/lib --enable-track-vars --with-xml --with-mysqli --enable-mysqlnd --with-mbstring --enable-mbstring=all<br />#make<br />#make install<br />#cp php.ini-dist /usr/local/lib/php.ini</p><p>&nbsp;</p><p><strong>四、安装phpMyAdmin（假设安装目录在：/webapp/phpMyAdmin）</strong></p><p>#tar xf phpMyAdmin-2.11.5.1-all-languages.tar.gz<br />#mv phpMyAdmin-2.11.5.1-all-languages /webapp/phpMyAdmin </p><p>&nbsp;</p><p><strong>五、配置apache的httpd.conf</strong></p><p>#vi /usr/local/apache2/conf/httpd.conf<br />1)将DocumentRoot和Directory的目录改为：/webapp/phpMyAdmin<br />2)在DirectoryIndex中添加index.php<br />3)添加php的扩展类型：<br />&nbsp; AddType application/x-httpd-php .php .phtml .php3 .inc<br />&nbsp; AddType application/x-httpd-php-source .phps</p><p>&nbsp;</p><p><strong>六、配置phpMyAdmin</strong></p><p>#cd /webapp/phpMyAdmin<br />#cp config.sample.inc.php config.inc.php<br />#vi config.inc.php</p><p><br />对如下的字段进行配置即可，没有的可以自己添加：<br />$cfg['Servers'][$i]['auth_type'] = 'config';&nbsp; // 认证模式，可以有cookie、http和config<br />$cfg['blowfish_secret'] = 'mabiqiang';&nbsp; // 使用cookie方式认证的密码短语<br />$cfg['Servers'][$i]['host'] = '127.0.0.1';&nbsp; // 设置你的数据库服务器的访问IP<br />$cfg['Servers'][$i]['user'] = 'root';&nbsp; // config认证模式时的访问用户名称<br />$cfg['Servers'][$i]['password'] = 'root';&nbsp; // config认证模式时的访问密码<br />$cfg['Servers'][$i]['connect_type'] = 'tcp';&nbsp; // 连接方式，tcp(默认)或socket<br />$cfg['Servers'][$i]['extension'] = 'mysqli'; // MYSQL扩展，可以为mysql和mysqli(推荐mysql4.1.0以上版本)<br />$cfg['Servers'][$i]['only_db'] = array('db1','db2'); // 只显示指定的数据库,字符串或数组</p><p>&nbsp;</p><p>&nbsp;&nbsp; 以上是给出了phpMyAdmin的基本配置信息，具体的还需要根据个人的情况做适当的调整。另外，对于php5的安装，我是使用了mysql官方提供的php-mysqlnd-5.0.1-beta.tar.gz，而没有使用mysql-dev。前者是mysql官方最新推荐的php对mysql的访问驱动，相比以前的，官方的解说如下：</p><p>&nbsp;</p><p><span style="color: #996600"><strong>Q: Is mysqlnd a new PHP extension?</strong><br /></span><span style="color: #990000">No, the new MySQL driver for PHP is not a new PHP extension. The driver is a replacement for libmysql on the internal C level of the PHP extension ext/mysqli. </span></p><p><span style="color: #990000">You can continue to compile the ext/mysqli extension with libmysql like ever since. We will not remove this functionality. Alternatively you can compile ext/mysqli with mysqlnd. We suggest that you try it, because mysqlnd is easier to compile and we found it to be faster than libmysql. </span></p><p>&nbsp;</p><p><span style="color: #996600"><strong>Q: Does it work with any MySQL Server before 4.1?</strong></span></p><p><span style="color: #990000">The MySQL native driver for PHP requires PHP 5 or PHP 6. </span></p><p><span style="color: #990000">You can use it to connect to the MySQL Server 4.1 or newer.</span></p><p>&nbsp;</p><p><strong><span style="color: #996600">Q: Can other PHP extensions use it?</span></strong></p><p><span style="color: #990000">Yes, they can, if they want to. The source code of the new driver is the ext/mysqli/mysqlnd directory of the download files. Extension writes will find that mysqlnd mimics the API of libmysql respectively the MySQL C API. </span></p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/179530#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Apr 2008 18:51:20 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/179530</link>
        <guid>http://ferreousbox.javaeye.com/blog/179530</guid>
      </item>
      <item>
        <title>Tomcat5的中文参数编码问题解决方案</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/177911" style="color:red;">http://ferreousbox.javaeye.com/blog/177911</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们在使用Tomcat应用服务器时，为了更好的支持URL地址中的中文参数问题，我们需要做如下的配置来确保应用程序接受到参数不乱码。比如我的系统采用了UTF-8的编码方式，那么如果直接传递中文参数，需要在tomcat进行如下设置：<br /><br />1.如果单使用tomcat，不整合apache<br />    我们需要修改server.xml文件的如下行：<br /><pre name="code" class="java">    &lt;Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/></pre><br />    注意URIEncoding="UTF-8"的部分，即将URI的编码设置为“UTF-8“，这样就不会有问题了；<br /><br /><br />2.整合tomcat和apache后的设置<br />    刚开始我没有整合的时候传递的中文参数可以很好的解决，后来整合apache后，却出现乱码了，绕过apache后是正常的，所以问题出现在apache或apache和tomcat的通信上，经过baidu，好不容易找到答案。修改server.xml文件中的如下行：<br /><pre name="code" class="java">    &lt;Connector port="8009"
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="UTF-8" /></pre><br />    这出现apache和tomcat的通信上，由于我这里的整合是采用JK，tomcat使用的是ajp13协议，所以，需要在他们的通信阶段来处理编码，即代码中的URIEncoding="UTF-8"部分。<br /><br /><br />    以上是我在处理tomcat的中文参数时遇到的问题，记下来以备速查：-）
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/177911#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 31 Mar 2008 10:00:39 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/177911</link>
        <guid>http://ferreousbox.javaeye.com/blog/177911</guid>
      </item>
      <item>
        <title>使用HttpSessionBindingListener来统计在线人数</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/179532" style="color:red;">http://ferreousbox.javaeye.com/blog/179532</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 最近也要做一个站内短信和群聊的功能，所以需要对当前登陆的用户进行在线统计.之前也看到过很多这方面的介绍，但是自己都没有试过，然后试的适合又发现了一个问题，就是使用HttpSessionBindingListener来实现在线统计的时候，使用该接口来实现在线统计需要注意以下几点：</p>
<p>1.应该使用你的用户信息Bean来实现该接口，而不是其他的类；</p>
<p>2.无需在web.xml文件中配置listener-class；</p>
<p>&nbsp;&nbsp;&nbsp; 然后用户登陆的时候创建用户的信息Bean，并设置到session中去，这样容器会自动调用你的用户bean实现的valueBound方法，同时退出的时候也会自动调用valueUnbound方法!</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/179532#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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 15:54:12 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/179532</link>
        <guid>http://ferreousbox.javaeye.com/blog/179532</guid>
      </item>
      <item>
        <title>spring2.0在JDK1.4下的运行问题</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/168038" style="color:red;">http://ferreousbox.javaeye.com/blog/168038</a>&nbsp;
          发表时间: 2008年03月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近开发的一套应用程序在部署运行的时候总是出现如下的错误:<br /><br />   Exception in thread "main" java.lang.NoClassDefFoundError: org.springframework.core.CollectionFactory$JdkCollectionFactory<br />   at java.lang.Class.initializeClass(libgcj.so.7rh)<br />   at org.springframework.core.CollectionFactory.createLinkedSetIfPossible(CollectionFactory.java:91)<br />   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.&lt;init>(DefaultSingletonBeanRegistry.java:85)<br />   at org.springframework.beans.factory.support.AbstractBeanFactory.&lt;init>(AbstractBeanFactory.java:142)<br />   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.&lt;init>(AbstractAutowireCapableBeanFactory.java:135)<br />   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.&lt;init>(AbstractAutowireCapableBeanFactory.java:146)<br />   at org.springframework.beans.factory.support.DefaultListableBeanFactory.&lt;init>(DefaultListableBeanFactory.java:99)<br />   at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:144)<br />   at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:99)<br />   at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:389)<br />   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:324)<br />   at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init>(ClassPathXmlApplicationContext.java:91)<br />   at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init>(ClassPathXmlApplicationContext.java:75)<br />   at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init>(ClassPathXmlApplicationContext.java:65)<br />Caused by: java.lang.ClassNotFoundException: <span style="color: red">java.util.concurrent.ConcurrentHashMap not found</span> in gnu.gcj.runtime.SystemClassLoader{urls=[...], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}<br />   at java.net.URLClassLoader.findClass(libgcj.so.7rh)<br />   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)<br />   at java.lang.ClassLoader.loadClass(libgcj.so.7rh)<br />   at java.lang.ClassLoader.loadClass(libgcj.so.7rh)<br />   at java.lang.Class.forName(libgcj.so.7rh)<br />   at java.lang.Class.initializeClass(libgcj.so.7rh)<br />   ...14 more<br /><br />    本来在测试服务器上运行的非常好,从来没有出现过如此问题.而且什么都配置好了，而且也装好了,可就是运行不起来。后来,无意中敲了下java -version,发现默认是JDK是1.4的,然后再看红色的部分就明白了.JDK5中才有线程池的引入,在1.4中是没有的.虽然服务器上安装了JDK5,但系统却是使用默认自带的JDK,所以就出现了如上的问题,然后用JDK5启动后一切问题解决.<br /><br />    因此,我们在发现ClassNotFoundException的时候,不一定是classpath没有设置或设置错误,关键是要看是出现什么样的问题.因为我在网上一baidu,只要是这个错误的,回答几乎无一例外,都是"你的classpath"没有设置,可见这个回答也太偏颇了点!另外,虽然JDK6也已经出来了,但目前还是有不少的系统在使用JDK1.4,而且有些LINUX系统也自带的版本比较低.所以,我们在进行这样的系统部署时就要格外的注意了!
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/168038#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Mar 2008 08:24:31 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/168038</link>
        <guid>http://ferreousbox.javaeye.com/blog/168038</guid>
      </item>
      <item>
        <title>ffmpeg转换参数和对几种视频格式的转换分析</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/163865" style="color:red;">http://ferreousbox.javaeye.com/blog/163865</a>&nbsp;
          发表时间: 2008年02月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 我们在将多种格式的视频转换成flv格式的时候，我们关注的就是转换后的flv视频的品质和大小。下面就自己的实践所得来和大家分享一下，主要针对avi、3gp、mp4和wmv四种格式来进行分析。通常在使用ffmpeg进行视频转换的时候我们使用到的控制音视频的主要参数有如下：<br /><span style="color: #cc0000">-ab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitrate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置音频码率<br />-acodec&nbsp; codec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用codec编解码<br />-ac&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channels&nbsp;&nbsp;&nbsp;&nbsp; 设置通道,缺省为1<br />-ar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置音频采样率<br />-r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fps&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置帧频,缺省25<br />-b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitrate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置比特率,缺省200kb/s<br />-qscale&nbsp; 6或4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用动态码率来设置<br /></span>&nbsp;&nbsp;&nbsp; 对于其他诸如-i、-y、-s等参数基本上都是可以很好理解的了。我们上面提到的几个参数前四个主要是用来设置音频的，后三个主要是用来设置视频的。对于音频的ar（采样率）可以指定为22050、24000、44100或48000，一般来将后两种比较常见；对于音频的ab（码率）一般是选择32、64、96或128这几种；对音频的acodec则是指定编码方式，可以指定为libmp3lame或aac等，这两种分别是指使用mp3和aac格式的音频。在实际的测试过程中我发现在使用mp3进行音频编码时指定ab为64或更高和指定ar为22050或更高对实际的视频音质没有什么大的影响，请参见后面的测试结果。</p><p>&nbsp;&nbsp;&nbsp; 对于视频的r用来指定帧频，一般设置为29.97；对于视频的b（视频的比特率）可以指定如128、314等数字，对于1500以上则没有效果；对于视频的qscale，属于动态码率，可以设置为4或6，4的质量比6的要高。在测试的过程中我发现设置-b参数对视频的质量并没有过大的改变（指定大指定小都差不多或是一样），而设置qscale则完全不一样，如果我们想获取高品质的话应该使用动态码率而不是指定-b参数，当然了，使用动态码率的坏处就是视频的体积变大了。在使用动态码率的时候使用6的效果和4差不多，但是体积减少了，因此通常建议使用6来设置动态码率。</p><p>&nbsp;&nbsp;&nbsp; 上面介绍了转换过程中的音视频的配置参数，综合上面，我们在转换的时候通常的命令如下：<br />高品质：ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile<br />低品质：ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -b 512 -y outfile</p><p>使用这两个命令测试四种格式的视频结果如下，同时在测试的过程中会改变相应的参数进行测试，四个视频的信息如下：<br />AVI格式的：test.avi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14.1M<br />3GP格式的：test.3gp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.30M<br />MP4格式的：test.mp4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16.4M<br />WMV格式的：test.wmv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15.0M</p><p><span style="color: #ff0000"><strong>1.使用高品质的脚本测试结果如下：</strong></span><br />AVI格式转换后的：-qscale 6结果=avi_01.flv&nbsp;&nbsp; 6.61M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -qscale 4结果=avi_02.flv&nbsp;&nbsp; 9.30M<br />3GP格式转换后的：-qscale 6结果=3gp_01.flv&nbsp;&nbsp; 4.21M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -qscale 4结果=3gp_02.flv&nbsp;&nbsp; 5.30M<br />MP4格式转换后的：-qscale 6结果=mp4_01.flv&nbsp;&nbsp; 13.1M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -qscale 4结果=mp4_02.flv&nbsp;&nbsp; 17.5M<br />WMV格式转换后的：-qscale 6结果=wmv_01.flv&nbsp;&nbsp; 15.9M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -qscale 4结果=wmv_02.flv&nbsp;&nbsp; 22.3M</p><p><strong><span style="color: #ff0000">2.使用低品质的脚本测试结果如下：</span></strong><br />AVI格式转换后的：-b 512结果=avi_03.flv&nbsp;&nbsp; 2.87M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b 1000结果=avi_04.flv&nbsp;&nbsp; 2.87M<br />3GP格式转换后的：-b 512结果=3gp_03.flv&nbsp;&nbsp; 1.73M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b 1000结果=3gp_04.flv&nbsp;&nbsp; 1.73M<br />MP4格式转换后的：-b 512结果=mp4_03.flv&nbsp;&nbsp; 5.84M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b 1000结果=mp4_04.flv&nbsp;&nbsp; 5.84M<br />WMV格式转换后的：-b 512结果=wmv_03.flv&nbsp;&nbsp; 6.17M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -b 1000结果=wmv_04.flv&nbsp;&nbsp; 6.17M</p><p><strong><span style="color: #ff0000">3.压缩率比较如下：<br /></span></strong>AVI格式转换后的：-qscale 6结果=53.12%&nbsp;&nbsp; -qscale 4结果=34.04%&nbsp;&nbsp; -b 512/1000结果=79.65%<br />3GP格式转换后的：-qscale 6结果=2.093%&nbsp;&nbsp; -qscale 4结果=123.1%&nbsp;&nbsp; -b 512/1000结果=59.77%<br />MP4格式转换后的：-qscale 6结果=20.12%&nbsp;&nbsp; -qscale 4结果=106.7%&nbsp;&nbsp; -b 512/1000结果=64.39%<br />WMV格式转换后的：-qscale 6结果=106.0%&nbsp;&nbsp; -qscale 4结果=148.7%&nbsp;&nbsp; -b 512/1000结果=58.87%</p><p>&nbsp;&nbsp;&nbsp; 通过比较前后的压缩大小我们可以看到在音频保持一致的情况下，使用高品质的转换和使用低品质的转换的巨大差异，同时对于不同格式的视频在转换的过程中也会出现比较大的差异。当然了，这些数据并不一定代表所有这些格式的视频都是如此，具体的要看大家的应用了。不过，我们可以确定的是AVI格式的视频在转换成FLV格式后其压缩率最大，不过对于不同编码的AVI其结果就不一定了。同时我们也还看到，对于某些格式的视频在转换后其体积比原先的还大了，这个我们在应用的时候就需要注意了。</p><p>&nbsp;&nbsp;&nbsp; 这里没有测试RM和RMVB格式的，因为ffmpeg无法直接转换这两种格式的视频，下次我将使用mencoder来测试转换RM和RMVB格式的视频为FLV的分析。以下是转换前后截取的图片，可以参考看一下.</p><p><span style="color: #cc0000">1.AVI格式截取前、使用-qscale 6和-b 512三个的截图分别如下:</span><br /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/15/118d7ca15e5.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/15/118d7ca12eb.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/15/118d7ca1104.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /></p><p><span style="color: #cc0000">2.3GP格式截取前、使用-qscale 6和-b 512三个的截图分别如下:</span><br /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/21/118d7cfb462.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/21/118d7cfb343.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/21/118d7cfb01d.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /></p><p><span style="color: #cc0000">3.MP4格式截取前、使用-qscale 6和-b 512三个的截图分别如下:</span></p><p><img src="http://122.img.pp.sohu.com/images/blog/2008/2/21/11/24/118d7d26668.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://122.img.pp.sohu.com/images/blog/2008/2/21/11/24/118d7d262f4.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://122.img.pp.sohu.com/images/blog/2008/2/21/11/24/118d7d26090.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /></p><p><span style="color: #cc0000">4.WMV格式截取前、使用-qscale 6和-b 512三个的截图分别如下:</span></p><p><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/28/118d7d5c5ed.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/28/118d7d5c38d.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /><img src="http://119.img.pp.sohu.com/images/blog/2008/2/21/11/28/118d7d5b4f8.jpg" border="0" alt="" style="display: block; margin: 0px auto 10px; text-align: center" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/163865#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Feb 2008 12:01:07 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/163865</link>
        <guid>http://ferreousbox.javaeye.com/blog/163865</guid>
      </item>
      <item>
        <title>java的properties文件中的换行书写</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/163871" style="color:red;">http://ferreousbox.javaeye.com/blog/163871</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 我们经常在properties文件中设置属性的时候,如果某一个属性的值太长，那么查看就不太方便，但是又不能直接的换行,否则读取属性的值的时候其换行部分就被忽略了.其实我们可以通过增加一个\符号来达到换行的效果.如下:</p>
<p><strong><font color="#cc0000">test.properties文件:</font></strong><br /><font color="#cc9933">name=Hello world \<br />My Name is ferreousbox</font></p>
<p>&nbsp;&nbsp;&nbsp; 那么我们在读取name属性的时其值就变成了:Hello world My Name is ferreousbox.也就解决了在properties文件中换行书写的问题,只需要在每一行的最后增加一个\符号,注意其下一行必须是接着的一行,即中间不能空行,否则也会被忽略的:-).</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/163871#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jan 2008 15:22:14 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/163871</link>
        <guid>http://ferreousbox.javaeye.com/blog/163871</guid>
      </item>
      <item>
        <title>MySQL主从备份的缺点</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/163874" style="color:red;">http://ferreousbox.javaeye.com/blog/163874</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 最近在研究mysql的主从备份,发现一个比较麻烦的问题,就是同步过程中出现错误而导致从数据库服务器无法再同步数据的问题.比如,有两台数据库服务器db1和db2,db1作为主数据库服务器,db2作为从数据库服务器,现在假设db1和db2的主从配置已经成功了.这时候我们在db1上执行如下操作:</p>
<p>db1数据库上执行:<br />mysql&gt;create database test_db;<br />Query OK, 1 row affected (0.00 sec)</p>
<p>&nbsp;&nbsp;&nbsp; 那么会显示我们数据库创建成功,然后在从数据库服务器db2上查看也可以看到数据库test_db已经成功同步过来了，这时我们再在db1上执行如下命令:&nbsp; </p>
<p>db1数据库上执行:<br />mysql&gt;create database test_db;<br />ERROR 1007 (HY000): Can't create database 'test_db'; database exists</p>
<p>&nbsp;&nbsp;&nbsp; 这个提示我们已经存在数据库test_db了,这个很正常,因为我们之前已经创建了一个,这个时候我们再看从数据库服务器上的slave状态,如下:</p>
<p>db2数据库上执行:<br />mysql&gt;show slave status;</p>
<p>&nbsp;&nbsp;&nbsp; 我们可以在状态信息中看到如下的信息:</p>
<p>Error 'Can't create database 'test_db'; database exists' on query. Default database: 'test_db'. Query: 'create database test_db'</p>
<p>&nbsp;&nbsp;&nbsp; 然后,我在db1上进行的任何操作都无法再同步到db2上了,这样实际上主从备份就已经失效了,然后我们也只有手动删除数据库和重置slave了,目前还没有找到比较好的解决办法,或许是我没有找到相关的配置吧,再找找看:-)</p>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/163874#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 18:29:51 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/163874</link>
        <guid>http://ferreousbox.javaeye.com/blog/163874</guid>
      </item>
      <item>
        <title>HttpURLConnection的流式输出的缺陷和解决方法</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/157728" style="color:red;">http://ferreousbox.javaeye.com/blog/157728</a>&nbsp;
          发表时间: 2008年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在用applet写文件上传控件的时候发现使用URLConnection来对服务器进行流式输出时的一些问题.我们通常要对服务器上的某个地址进行写流操作,那么我们一般的做法就是:<br /><br /><pre name="code" class="java">
URLConnection con = new URL("/test.do").openConnection();
con.setDoOutput(true); // 允许输出流,默认是false
</pre><br /><br />    这样我们就获取一个到/test.do地址的HTTP连接了,我们打印con的class后发现其实是:sun.net.www.protocol.http.HttpURLConnection这个类,我们在写大数据流到服务器上时就会发现总是会出现OutOfMemoryError的错误,当然不同的机器上出现错误所对应的文件输出流的大小是不一样的.这个主要就是取决于本机的JVM的内存空间的大小了.出现OutOfMemoryError错误的主要原因就是:sun公司实现的HttpURLConnection的输出流是首先在本地内存进行缓存,然后再一次性输出的(在close操作时).我们可以追踪到sun自己的HttpURLConnection使用的OutputStream是sun.net.www.http.PosterOutputStream这个类,我们查看这个类的源码就会发现它是继承自ByteArrayOutputStream的,而且基本上这个类没有做任何事情,大家可以参看其源码.而我们的ByteArrayOutputStream则是每次将要输出的内容复制到一个byte数组中,从而导致的结果是将整个输出流全部存储在内存中，这样当我们输出流一大的时候就会出现内存不够用的情况.请看ByteArrayOutputStream的部分源码:<br /><br /><pre name="code" class="java">
public synchronized void write(int i) 
{ 
    int j = count + 1; 
    if(j > buf.length) { 
        byte abyte0[] = new byte[Math.max(buf.length &lt;&lt; 1, j)]; 
        System.arraycopy(buf, 0, abyte0, 0, count); 
        buf = abyte0; 
    } 
    buf[count] = (byte)i; 
    count = j; 
} 

public synchronized void write(byte abyte0[], int i, int j) 
{ 
    if(i &lt; 0 || i > abyte0.length || j &lt; 0 || i + j > abyte0.length || i + j &lt; 0) throw new IndexOutOfBoundsException(); 
    if(j == 0)  return; 
    int k = count + j; 
    if(k > buf.length) { 
        byte abyte1[] = new byte[Math.max(buf.length &lt;&lt; 1, k)]; 
        System.arraycopy(buf, 0, abyte1, 0, count); 
        buf = abyte1; 
    } 
    System.arraycopy(abyte0, i, buf, count, j); 
    count = k; 
}
</pre><br />    我们可以看到它是使用System.arraycopy的功能来将所有的输出流存放在一个数组中的.因此,在使用HttpURLConnection进行流式输出的时候如果输出流比较大,那么就该考虑使用其他方式了(当然,修改JVM的堆栈空间是一种方法,但是不可取).<br /><br />    这是我们直接使用java.net.HttpURLConnection类的相关方法来进行输出文件流,我们查看sun提供的HttpURLConnection的源码,会发现其默认是采用上面提高的PosterOutputStream类来进行缓冲输出的,即首先将所有的文件流在本地内存中进行缓存,等到输出结束执行close的时候一次性输出到服务器端.同时我们看到sun的HttpURLConnection中的getOutputStream()中有如下代码:<br /><br /><pre name="code" class="java">
if(streaming()) {
    if(fixedContentLength != -1) 
        strOutputStream = new StreamingOutputStream(ps, fixedContentLength); 
    else if(chunkLength != -1) 
        strOutputStream = new StreamingOutputStream(new ChunkedOutputStream(ps, chunkLength), -1); 
    return strOutputStream; 
}
</pre><br /><br />    其中strmeanming()方法是用来判断是否是流式的输出,其代码为:return fixedContentLength != -1 || chunkLength != -1;它的判断方法就是如果设置了输出流的固定长度或是设置了块的长度,那么将采用流式输出.因此,我们可以在输出的时候可以设置其长度来达到流式输出这样的效果.另外,StreamingOutputString类是sun提供的HttpURLConnection的内部类,继承自FilterOutputStream,而非ByteArrayOutputStream,所以不会在本地内存中进行缓存.<br /><br />    而jdk中的HttpURLConnection并没有提供设置流的固定长度或块输出的长度方法,所以我们需要显示的将new URL("url").openConnection()返回的URLConnection转换成sun的HttpURLConnection,从而我们就可以很方便的使用setFixedLengthStreamingMode方法来设置流的固定长度,那么也就会采用流式的输出了.那么也就不会出现OutOfMemoryError的错误了.另外,ChunkedOutputStream也是不会在本地进行缓存的,它是使用固定大小的数组来缓存输出流,等缓存满的时候就自动的调用基础流进行输出,这个主要是用在无法确定输出流的具体长度但是又不想在本地进行缓存时用到.同理,我们通过设置setChunkedStreamingMode就可以达到这样的效果,三种方式的代码如下:<br /><br />第1种方式:使用直接输出流的方式(已知输出流的长度):<br /><pre name="code" class="java">
import sun.net.www.protocol.http.HttpURLConnection;
......
HttpURLConnection con = (HttpURLConnection)new URL("url").openConnection();
con.setFixedLengthStreamingMode(输出流的固定长度);
......
</pre><br /><br /><br />第2种方式:使用直接输出流的方式(未知输出流的长度):<br /><pre name="code" class="java">
import sun.net.www.protocol.http.HttpURLConnection;
......
HttpURLConnection con = (HttpURLConnection)new URL("url").openConnection();
con.setChunkedStreamingMode(块的大小);
......
</pre><br /><br /><br />第3种方式:本地缓存后一次性输出:<br /><pre name="code" class="java">
import java.net.HttpURLConnection;
......
HttpURLConnection con = (HttpURLConnection)new URL("url").openConnection();
......
</pre><br /><br />    通过设置直接输出后,我传送文件的大小为200M的时候也不会出现OutOfMemoryError的错误,而之前使用第3种方式进行文件流输出的时候不到40M就出现了OutOfMemoryError的错误了.
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/157728#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Jan 2008 11:50:28 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/157728</link>
        <guid>http://ferreousbox.javaeye.com/blog/157728</guid>
      </item>
      <item>
        <title>applet应用程序的数字签名应用实战</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/154531" style="color:red;">http://ferreousbox.javaeye.com/blog/154531</a>&nbsp;
          发表时间: 2008年01月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在研究applet,打算使用applet来开发一个上传文件上传控件,之前因为一直觉得applet的沙箱控制导致applet不能主动的访问客户端的资源,所以也曾因此而放弃.不过最近在研究applet的签名后,有了点收获,可以通过签名jar文档来达到这样的控制策略,下面是我在实际实验过程中的一些心得和体会,跟大家一起分享下.(<strong>注:如果转载此文,请注明出处和作者,尊重作者的劳动成果,谢谢</strong>)<br /><br /><strong>一、压缩你的class类文件为jar包</strong><br />1.假设你的需要压缩的类文件存在的包为：cn.mbq.test1和cn.mbq.test2<br />2.进入你的classes目录，在DOS窗口中执行命令：jar cf mytest.jar cn.mbq.test1 cn.mbq.test2<br />3.执行命令后你会在当前目录中找到mytest.jar文件，这个就是刚才生成的档案文件。你可以修改它的后缀为rar，然后使用winrar压缩程序打开它查看看是否正确。<br /><br /><br /><strong>二、使用keytool工具生成密匙库</strong><br />1.keytool工具位于${java_home}/bin目录下；<br />2.在DOS窗口中执行命令：keytool -genkey -keystore mytest.store -alias mbq<br />  注意：mytest.store 是你的密匙库的名称，可以随意修改，后缀请不要修改！<br />        mbq 为别名，这个也可以改成自己的名称<br />3.执行上述命令后，DOS窗口中会提示你输入keystore的密码、你的姓名、组织单位等等信息。这里要注意的是输入密码请记住，后面要用到的。在最后，我们输入y确认信息。然后再直接回车设置mbq的主密码和store密码一致即可！<br /><br /><br /><strong>三、使用keytool工具导出签名时用到的证书</strong><br />1.在DOS窗口中执行命令：keytool -export -keystore mytest.store -alias mbq -file mbq.cert<br />  注意：mytest.store 就是第二步生成的密匙库名称<br />        mbq 也是在第二步中我们指定的别名<br />        mbq.cert 为我们生成的证书的名称，可以自己修改名称，注意后缀不要改<br />2.命令执行成功，我们会在当前目录下找到一个mbq.cert文件，这个就是我们刚才生成的证书。<br /><br /><br /><strong>四、使用jarsigner工具签名jar压缩文档</strong><br />1.jarsigner工具位于${java_home}/bin目录下；<br />2.在当前DOS窗口中执行命令：jarsigner -keystore mytest.store mytest.jar mbq<br />  注意：mytest.store 就是我们在第二步中生成的密匙库名称<br />        mytest.jar 就是我们这第一步压缩的jar文档<br />        mbq 是提供者的名称，我们这里设置为我们的别名<br /><br /><br /><strong>五、创建mytest.policy文件</strong><br />1.在当前目录下创建一个mytest.policy文件，其内容如下：<br />keystore"file:mytest.store","JKS";<br />grantsignedBy"mbq"<br />{<br /> permission java.io.FilePermission"&lt;&lt;ALLFILES>>","read";<br />};<br />2.这个文件的意思就是说让所有由mbq签名的applet都可以对本地的所有文件进行读操作。<br /><br /><br /><strong>六、归档文件</strong><br />    通过上述的五个操作后，我们会在当前目录中找到如下几个文件：mytest.jar-签名后的jar文档、mytest.store-密匙库、mbq.cert-证书、mytest.policy-访问策略文件。如果没有这些文件，那么你的applet数字签名过程就没有正确的完成，请检查上述的操作。以后，如果对打包的java文件做了修改，那么就需要重新签名一次才可以！<br /><br /><br /><strong>七、在网页中运行applet</strong><br />1.假设你的applet中的主启动类为：cn.test.TestApplet.class；整个前面生成的档案文件、证书啊存储在目录：d:\test\myapplet下；<br />2.建立一applet_test.html文件存放在任何目录下都可以，然后内容如下：<br /><br /><pre name="code" class="java">1 &lt;HTML>...&lt;/HTML>&lt;HTML> 
2 &lt;BODY>...&lt;/BODY>&lt;BODY> 
3 &lt;APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar" WIDTH=200 HEIGHT=100 name="myapp"> 
4 &lt;/APPLET> 
5 &lt;/BODY> 
6 &lt;/HTML></pre><br /><br />    注意：其中的CODEBASE就是你的类的基础目录，CODE也就是你的APPLET的启动主类，ARCHIVE也就是签名后的JAR文档。<br />2.然后在IE中打开该html文件，那么会看到IE提示你是否信任该插件，也就是说我们的证书起作用了，然后确定运行后，就可以在页面上看到applet的运行效果了。<br /><br />    但是由于SUN和MS的问题，目前IE并不支持最新的JRE，而是使用MS自己开发的JRE，所以这个也是影响APPLET发展壮大的一个原因。而且正是由于这个原因，SUN的java-plugin技术才会出现。使用SUN的java-plugin技术我们就可以在applet中使用最新的JAVA类库了。由于IE在遇到APPLET标签的时候会调用自己的JRE，但是如果客户机器上安装的JRE不是我们想要的版本，那么就会出错了。所谓java-plugin技术就是利用IE的插件机制来制定我们想要的JRE，我们可以在IE中使用OBJECT标签来调用APPLET，这样就不会引用MS的JRE了，从而达到我们想要的效果，而且java-plugin技术不仅仅支持IE，还支持Navigator等浏览器。不过我们需要编写比较复杂的HTML代码了，但是这一且SUN已经帮我们做到了，呵呵，在JDK1.4或更高的版本中SUN提供了一个HtmlConverter.exe工具来帮助将包含applet标签的html转换成包含OBJECT和EMBED标签的html代码，该工具位于${java_home}/bin目录下，对于1.4以前的版本该工具则是单独提供的，不过现在几乎都是1.4或1.5甚至更高版本的JDK了吧，呵呵。<br /><br />    该工具很简单，是图形化的工具，我们直接运行即可。比如我将上面的包含applet的html转换后(比如我选择只支持IE的)，其代码变成了如下：<br /><br /><pre name="code" class="java">01 &lt;HTML>...&lt;/HTML>&lt;HTML> 
02 &lt;BODY>...&lt;/BODY>&lt;BODY> 
03 &lt;!--"CONVERTED_APPLET"--> 
04 &lt;!-- HTML CONVERTER --> 
05 &lt;object 
06     classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" 
07     codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,3" 
08     WIDTH = 200 HEIGHT = 100 NAME = "myapp" > 
09     &lt;PARAM NAME = CODE VALUE = "cn.test.TestApplet.class" > 
10     &lt;PARAM NAME = CODEBASE VALUE = "d:\test\myapplet" > 
11     &lt;PARAM NAME = ARCHIVE VALUE = "mytest.jar" > 
12     &lt;PARAM NAME = NAME VALUE = "myapp" > 
13     &lt;param name = "type" value = "application/x-java-applet;version=1.5"> 
14     &lt;param name = "scriptable" value = "false"> 
15 &lt;/object> 
16 &lt;!-- 
17 &lt;APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar" 
18 WIDTH=200 HEIGHT=100 name="myapp"> 
19 &lt;/APPLET> 
20 --> 
21 &lt;!--"END_CONVERTED_APPLET"--> 
22 &lt;/BODY> 
23 &lt;/HTML></pre><br /><br />    注意其中的OBJECT标签，可以看到APPLET标签已经被注释掉了。其中PARAM NAME=NAME这一行中的myapp就是我们applet应用程序的名称，在IE提示的确认运行中显示的就是这个名称了，我们可以改为自己的公司或组织的名称。然后提示的提供者也就是我们在签名时用到的名称了。<br /><br />    另外，还要特别注意的就是这个包含OBJECT标签的html页面必须和你的mytest.jar压缩文档放在同一个目录下，这样才可以正确的加载，否则会一直报ClassNotFound的异常的，即使我们在OBJECT标签中指定了CODEBASE也不行，这个是我在测试的时候遇到的问题！<br /><br /><br /><strong>八、在Internet上应用签名的applet</strong><br />    如果要把applet部署在网络上，那么最好是采用OBJECT标签的形式，同时也要兼顾采用EMBED标签来支持诸如FF等浏览器。我们把已签名了的mytest.jar和我们的网页放在同一个目录下，至于其他的如mytest.store和mbq.cert可以不用放在一起，至少我在测试的过程中没有放到一起也不会出错，而且在不同的机器上运行的也非常好，可以读取客户端机器的资源！另外，也发现mytest.policy其实也没什么用处，因为这是参考网络上的，而且他们的版本都是1.3左右，所以估计是版本低的缘故吧！<br /><br /><br />    到此，我们就已经完成了applet的签名到部署，以及到实际的网络应用中了。这样我们使用applet来开发控件时就不会因为无法读取客户端资源而放弃了，呵呵~~
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/154531#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jan 2008 18:36:59 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/154531</link>
        <guid>http://ferreousbox.javaeye.com/blog/154531</guid>
      </item>
      <item>
        <title>js解析RSS </title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/154068" style="color:red;">http://ferreousbox.javaeye.com/blog/154068</a>&nbsp;
          发表时间: 2008年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为最近在项目中用到了RSS频道,所以今天就花了点时间写了一个JS来解析RSS频道的类,说白了就是JS解析XML文件而已,呵呵.我的这个JS类提供解析XML返回JSON对象,便于操作结果集.目前只支持RSS2.0规范的解析,不过我这个JS类也很简单的,只获取title和link字段，其他的就不管了,呵呵,所以对RSS1.0和RSS0.9规范应该都是可以支持的,以后再有时间完善吧.另外,本来是想在web页面上直接访问RSS频道地址来的,可忘记了AJAX是不允许跨域访问的,所以也就只能在后台写一程序去获取RSS的内容,然后生成在本地磁盘上,最后web页面直接访问本地的XML文件了.<br /><br /><strong>RssReader的源码:</strong><br /><br /><pre name="code" class="jsScript">
01 /** 
02 * @title:Rss频道的读取与解析类. 
03 * @author:铁木箱子 
04 * @modify:2008-1-8 
05 */ 
06 
07 function RssReader(){}; 
08 RssReader.prototype= { 
09     /** 
10      * 获取RSS并解析.该方法是综合了getRss和parseXmlToJSON两个方法,最终的回调函数的值为json对象. 
11      */ 
12     getAndParse : function(/*string*/_url, /*function*/callback) { 
13         var parseXml = this.parseRss; 
14         this.getRss(_url, function(rssXml) { 
15             var json = parseXml(rssXml); 
16             callback(json); 
17         }); 
18     }, 
19      
20     /** 
21      * 获取rss频道的xml文件内容，以xml对象返回. 
22      * @param _url 要获取的RSS的URL地址 
23      * @param callback 获取成功或失败后的回调方法，参数为RSS内容的XML对象（失败则返回null） 
24      */ 
25     getRss : function(/*string*/ _url, /*function*/callback) { 
26         new Ajax.Request( 
27             _url, 
28             { 
29                 method : 'GET', 
30                 onComplete : function(xmlHttp) { 
31                     var rssXml = xmlHttp.responseXML; 
32                     if (rssXml == null) alert('非法的RSS频道内容，无法解析！'); 
33                     callback(rssXml); 
34                 } 
35             } 
36         ); 
37     }, 
38      
39     /** 
40      * 将RSS频道的XML内容转换成JSON对象返回. 
41      */ 
42     parseRss : function(/*object*/rssXml) { 
43         try { 
44             var rss = rssXml.getElementsByTagName('rss'); 
45             var channel = rssXml.getElementsByTagName('channel'); 
46             if (!rss || !channel || rss.length != 1 || channel.length &lt; 1) { 
47                 alert('无效的RSS格式：没有rss节点和channel节点！'); 
48                 return null; 
49             } 
50             var version = rss.item(0).getAttribute('version'); 
51             if (!version) { 
52                 alert('无效的RSS格式：没有指定RSS版本号！'); 
53                 return null; 
54             } 
55             if (version == '2.0') return RssReader.parseRss2_0(channel.item(0)); 
56              
57             alert('无效的RSS格式：无法确定RSS版本！'); 
58             return null; 
59         } catch (ex) { 
60             alert('解析RSS内容时发生错误：' + ex.message); 
61             return null; 
62         } 
63     } 
64 }; 
65 
66 /** 
67 * Rss2.0格式的静态解析方法，返回结果为JSON对象. 
68 * 返回的JSON格式为： 
69 * {"items" : [ {"title" : "标题", "link" : "连接地址"}, 
70 *             {"title" : "标题", "link" : "连接地址"}, 
71 *             {"title" : "标题", "link" : "连接地址"} 
72 *            ] 
73 * } 
74 * 使用方法为（假设最终返回的对象名称为json）： 
75 * json.items.length - 获取总的信息的条数 
76 * json.items[i] - 获取每一条信息的对象（其中0&lt;=i&lt;json.items.length） 
77 * json.items[i].title - 获取单条信息的标题文字 
78 * json.items[i].link - 获取单条信息的连接地址 
79 */ 
80 RssReader.parseRss2_0 = function(/*object*/channel) { 
81     var items = channel.getElementsByTagName('item'); 
82     var json = '{"items":['; 
83     for (var i = 0; i &lt; items.length; i ++) { 
84         var item = items.item(i); 
85         var _title = item.getElementsByTagName('title')[0]; 
86         var _link = item.getElementsByTagName('link')[0]; 
87         if (!_title.hasChildNodes() || !_link.hasChildNodes()) continue; 
88         json += '{"title":"' + _title.firstChild.nodeValue.gsub(/"/,"'") + '",'; 
89         json += '"link":"' + _link.firstChild.nodeValue.gsub(/"/,"'") + '"}'; 
90         if (i &lt; items.length - 1) json += ','; 
91     } 
92     json += ']}'; 
93     //alert(json); 
94     return eval('(' + json + ')'); 
95 };
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/154068#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 08 Jan 2008 16:52:17 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/154068</link>
        <guid>http://ferreousbox.javaeye.com/blog/154068</guid>
      </item>
      <item>
        <title>再谈FCKeditor添加自定义工具栏的问题</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/150487" style="color:red;">http://ferreousbox.javaeye.com/blog/150487</a>&nbsp;
          发表时间: 2007年12月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前在弄FCKeditor的时候写了一篇如何添加自定义工具栏的文章，请参看：http://j2ee.blog.sohu.com/36813753.html。不过那时候虽然写了具体的操作方法，不过写的比较杂乱，呵呵，什么都写了，所以可能来实践的时候会看的比较辛苦：-）同时也无意中发现了网上很多人也确实在找这样的东东，所以今天有时间就重新整理了一份如何添加自定义工具栏在FCKeditor编辑器中详细步骤。<br /><br />    话不多说了，首先做准备工作，下载相应的文件，呵呵。目前FCKeditor已经升级到2.5了，下载连接如下：<br />1.FCKeditor下载主页面：http://www.fckeditor.net/download<br />2.FCKeditor V2.5的下载页面：http://sourceforge.net/project/downloading.php?group_id=75348&filename=FCKeditor_2.5.1.zip<br />3.另外的，如java和.net的上传等工具包就根据自己的情况下载了。<br /><br />    我们今天来做一个非常简单的工具按钮，就是点击这个按钮后会弹出一个对话框，只有一个输入框，我们输入的任何内容都会被插入到编辑器中去。这个工具按钮我们就叫做：MyToolBar吧，呵~~~<br /><br />一、修改fckconfig.js文件（位于FCKeditor_2.5.zip压缩包解压后的fckeditor目录下）<br />1.我们找到FCKConfig.ToolbarSets["Default"]这一行，在最后即'About'后添加一个工具按钮MyToolBar，名称为MyToolBar；<br />2.找到FCKConfig.DefaultLanguage，修改语言为：zh-cn；<br />3.找到FCKConfig.AutoDetectLanguage，设置为false，即关闭语言的自动检测功能；<br /><br />二、修改zh-cn.js文件（位于editor\lang目录下）<br />1.在最后加入：MyToolBar : "我的自定义工具栏"<br />2.注意它前面的一个最后要加多一个逗号；<br /><br />三、修改源码<br />1.打开文件fckregexlib.js（位于editor\_source\internals）；<br />2.找到NamedCommands这一行，在最后加入：MyToolBar<br />3.然后再打开同目录下的fckcommands.js文件；<br />4.找到FCKCommands.GetCommand函数，在其中加入：<br /><br />case 'MyToolBar'    : oCommand = new FCKDialogCommand( 'MyToolBar', FCKLang.MyToolBar    , 'dialog/MyToolBar.html', 450, 400 ) ; break ;<br /><br />5.然后再打开同目录下的fcktoolbaritems.js文件；<br />6.找到FCKToolbarItems.GetItem函数，在其中加入：<br /><br />case 'MyToolBar'        : oItem = new FCKToolbarButton( 'MyToolBar'    , FCKLang.MyToolBar, null, null, null, true, 72 ) ; break ;<br />    这里72是表示skins目录下各个皮肤目录中fck_strip.gif图片文件中的图片索引，我们这里用和命令ShowBlocks一样的图标（一个问号图片）。<br /><br />四、建立模式对话框文件<br />1.打开目录editor\dialog，在其下建立文件：MyToolBar.html<br />2.内容如下：<br /><br />01 &lt;html>...&lt;/html>&lt;html xmlns="http://www.w3.org/1999/xhtml"> <br />02 &lt;head>...&lt;/head>&lt;head> <br />03     &lt;title>&lt;/title> <br />04     &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <br />05     &lt;meta content="noindex, nofollow" name="robots" /> <br />06     &lt;script src="common/fck_dialog_common.js" type="text/javascript">&lt;/script> <br />07 &lt;script type="text/javascript"> <br />08  <br />09 var oEditor = window.parent.InnerDialogLoaded() ; <br />10  <br />11 window.onload = function() <br />12 ...{ <br />13     window.parent.SetOkButton( true ) ; <br />14     window.parent.SetAutoSize( true ) ; <br />15 } <br />16  <br />17 function Ok() <br />18 ...{ <br />19     var oActiveEl = oEditor.FCK.EditorDocument.createElement( 'SPAN' ) ; <br />20     oActiveEl.innerHTML = GetE('txtName').value ; <br />21     oEditor.FCKUndo.SaveUndoStep() ; <br />22     oActiveEl = oEditor.FCK.InsertElement( oActiveEl ) ; <br />23  <br />24     return true ; <br />25 } <br />26 &lt;/script> <br />27 &lt;/head> <br />28 &lt;body>...&lt;/body>&lt;body style="overflow: hidden"> <br />29     &lt;table width="100%" style="height: 100%"> <br />30         &lt;tr> <br />31             &lt;td align="center"> <br />32                 &lt;table cellspacing="0" cellpadding="0" border="0"> <br />33                     &lt;tr>&lt;td>请输入文字：&lt;input id="txtName" type="text"/>&lt;/td>&lt;/tr> <br />34                 &lt;/table> <br />35             &lt;/td> <br />36         &lt;/tr> <br />37     &lt;/table> <br />38 &lt;/body> <br />39 &lt;/html><br /> <br /><br />五、打包修改后的源代码<br />    官方网站下载页面给出的那个压缩程序（.net写的）有问题，在运行的时候总是报错：Unhandled Exception: System.NullReferenceException: Object reference not set。然后在fckeditor论坛上找相关的帖子时发现另外一个地方可以下载，呵呵，一样是官方的，不过是php编译后的可执行程序。在windows下可以直接运行，非常方便。大家可以到这里下载：http://dev.fckeditor.net/browser/FCKpackager/trunk/fckpackager.exe。注意这个是下载页面，然后在页面在最下方点那个“downloading”下载即可！注意下下来的文件就是一个可执行程序fckpackager.exe。<br />1.copy这个程序（fckpackager.exe）到fckeditor目录下。<br />2.打开一个DOS窗口，定位到当前目录；<br />3.运行fckpackager命令即可。<br />4.命令运行后，DOS窗口会列出一长串的JS清单，然后最后会显示：<br />    Number of files processed: 84<br />    Original size............: 568,563 bytes<br />    Output file size.........: 240,124 bytes (42.23% of original)<br /><br />   The generation of 2 files has been completed in 3.3316287994 seconds.<br />这样就表示文件已经压缩成功了！<br /><br />六、查看运行效果<br />    打开目录_samples\html下的sample01.html文件，我们就可以在页面上的最后一个工具栏发现我们刚添加的这个按钮命令了。<br /><br />七、添加上下文菜单<br />    我们在使用FCKeditor来添加一个单行输入框的时候，添加成功后会发现在编辑区域我们通过在该input员素上点右键就可以很方便的来编辑我们刚才输入的内容。这就是fckeditor中的contextmenu了，我们也可以非常方便的为我们自定义的工具栏来添加上下文菜单。<br />1.打开源文件夹中internals目录下的fck_contextmenu.js文件；<br />2.找到函数FCK_ContextMenu_GetListener，在最后加入一指定的CASE代码，具体的视自己的情况而写；<br />3.修改fckconfig.js在FCKConfig.ContextMenu的最后加入一菜单名称，注意要和你的第二步中的case的条件名称一样；<br />4.另外在zh-cn.js中添加一个上下文菜单的中文名称，然后在第二步中的代码中的menu.AddItem处使用该名称，通常的命名规范就是你的工具按钮的命令名称后加一个Prop;<br /><br />   通过这几步后就可以很方便的添加一个上下文菜单了，我前面的一篇文章也提到了这个，可以参考一下。至此，我们对fckeditor进行自定义工具栏的添加就算完成了。可以试一试哦，如果大家觉得好的话也顶一下和鼓励下咯~  <br /><br />   另外，附件里已经是按照上面说的添加成功的的编辑器，大家可以试一试！
          <br/>
          <span style="color:red;">
            <a href="http://ferreousbox.javaeye.com/blog/150487#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 24 Dec 2007 15:24:08 +0800</pubDate>
        <link>http://ferreousbox.javaeye.com/blog/150487</link>
        <guid>http://ferreousbox.javaeye.com/blog/150487</guid>
      </item>
      <item>
        <title>Ajax+Flash多文件上传之FancyUpload的应用</title>
        <author>ferreousbox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ferreousbox.javaeye.com">ferreousbox</a>&nbsp;
          链接：<a href="http://ferreousbox.javaeye.com/blog/144518" style="color:red;">http://ferreousbox.javaeye.com/blog/144518</a>&nbsp;
          发表时间: 2007年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;<strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">一、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">简单说明</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span lang="EN-US" style="FONT-SIZE: 12pt">Ajax+Flash</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多文件上传是一个开源的上传组件，名称是</span><span lang="EN-US" style="FONT-SIZE: 12pt">F</span><span lang="EN-US">ancyUpload</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，其官方网址是：</span><span lang="EN-US"><a href="http://digitarald.de/project/fancyupload/">http://digitarald.de/project/fancyupload/</a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这个组件仅仅是客户端的应用组件，即与任何服务器端的技术没有关系，服务器端可以采用任何后台技术（如</span><span lang="EN-US">JSP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Servlet</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">ASP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等）。应用该组件提供给我们的最大的好处有如下几点（个人认为，呵呵）：</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以同时选择多个文件进行上传；</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以队列的形式排列要上传的文件和其相关信息（如名称、大小等）（美观</span><span lang="EN-US">^_^</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）；</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以设置要上传的文件个数、文件类型和文件大小（实用</span><span lang="EN-US">^_^</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）；</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有上传进度显示（感觉这个非常直观，很方便实用）；</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上传的过程中可以随时取消要上传的文件；</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台独立性，由于使用</span><span lang="EN-US">flash</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和成熟的</span><span lang="EN-US">AJAX</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架（</span><span lang="EN-US">mootools</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）可以避免对特定浏览器和服务器依赖！</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用简单，文件体积小！（这个才是最实在的，呵呵）</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">n<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表单无须设置</span><span lang="EN-US">enctype=&quot;multipart/form-data&quot;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了（这个有点意思吧）</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br clear="all" style="PAGE-BREAK-BEFORE: always; mso-special-character: line-break" />
</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; mso-list: l0 level1 lfo2; tab-stops: list 36.0pt"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">二、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用部署</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件夹</span><span lang="EN-US">fancyupload</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的文件就是该组件所需要到的所有文件了，包括四个</span><span lang="EN-US">JS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、二个图片、一个</span><span lang="EN-US">swf</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，另外还包含一个简单的测试</span><span lang="EN-US">html</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面，其文件结构如下：</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.75pt"><span lang="EN-US"><img v:shapes="_x0000_i1025" src="file:///C:/DOCUME~1/马必强/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" border="0" height="136" alt="" width="582" /></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将整个文件夹</span><span lang="EN-US">copy</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到你的</span><span lang="EN-US">web</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用目录即可，使用的时候其步骤和代码如下：</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo3; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">&Oslash;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引入</span><span lang="EN-US">JS</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件</span><span lang="EN-US"><br />
</span></strong><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在页面上依次引入</span><span lang="EN-US">mootools-release-1.11.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Swiff.Base.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">Swiff.Uploader.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">FancyUpload.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这四个</span><span lang="EN-US">JS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，具体目录请依据自己的情况进行设置！</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo3; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">&Oslash;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在页面上设置</span><span lang="EN-US">CSS</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">样式（主要是文件列表和上传进度的样式）</span><span lang="EN-US"><br />
</span></strong><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">head</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间嵌入</span><span lang="EN-US">mytest.html</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">css</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码！</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo3; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">&Oslash;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">onload</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法中调用如下代码：</span></strong><span lang="EN-US"><br />
<span style="COLOR: green">var upload = new FancyUpload(<br />
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>$(&ldquo;fileId&rdquo;),<br />
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<br />
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>swf: 'Swiff.Uploader.swf'<br />
<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<br />
);</span><br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们只要这一行代码就可以工作了，不过我们可以通过像设置</span><span lang="EN-US">swf</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样来设置多个参数来控制我们的上传，比如是否使用队列，控制文件大小等。相关的参数意义如下：</span><span lang="EN-US"><br />
fileId<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是我们页面上文件域的</span><span lang="EN-US">ID</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即</span><span lang="EN-US">type</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang="EN-US">file</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">input</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">元素的</span><span lang="EN-US">ID</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span lang="EN-US"><br />
{}<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样包起来的参数就是我们的可选参数了，可参考</span><span lang="EN-US">FancyUpload.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的说明。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo3; tab-stops: list 21.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">&Oslash;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在页面上设置类似</span><span lang="EN-US">mytest.html</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">body</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">区域的代码即可！</span></strong></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来看一个文件上传的实际效果，如下图：</span></p>
<p class="MsoNormal"><span lang="EN-US"><img v:shapes="_x0000_i1026" src="file:///C:/DOCUME~1/马必强/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg" border="0" height="60" alt="" width="553" /></span></p>
<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br clear="all" style="PAGE-BREAK-BEFORE: always; mso-special-character: line-break" />
</span>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt; mso-list: l0 level1 lfo2; tab-stops: list 36.0pt"><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">三、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt">FancyUpload</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的参数说明</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 15pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">url<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件上传的地址，如果不指定，那么将会自动取文件域所在的表单的</span><span lang="EN-US">action</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值来进行上传。如果表单的</span><span lang="EN-US">action</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也没有指定值，那么将尝试获取路径栏中的地址来进行文件上传。一般而言我们都需要指定该参数和文件域所在的表单的</span><span lang="EN-US">action</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两者之一！</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">swf<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是组件中的</span><span lang="EN-US">flash</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件了，主要是用来选择文件和过滤等，基本上可以不用设置。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">multiple<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否允许选择多个文件，默认是</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这个多选是指在打开的文件对话框中按住</span><span lang="EN-US">ctr</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键进行多文件的选中。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">queued<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否允许队列上传，默认是</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">types<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定上传文件的类型，采用的格式是</span><span lang="EN-US"> {</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提示信息</span><span lang="EN-US">:</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件类型</span><span lang="EN-US">}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如只允许媒体文件上传的例子：</span><span lang="EN-US">{&ldquo;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">媒体文件</span><span lang="EN-US">(*.rm,*.avi)&rdquo; : &ldquo;*.rm; *.avi&rdquo;}</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">limitSize<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定限制的文件大小，单位是字节！默认是不限制，超过此值的文件将不被选中，注意即使选择后系统也没有提示，但是队列中也是没有该文件的！可以通过修改文件</span><span lang="EN-US">FancyUpload.js</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在其</span><span lang="EN-US">128</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行的</span><span lang="EN-US">if</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中加上一个</span><span lang="EN-US">alert</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提示即可！</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">u<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">limitFiles<br />
</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">限制的文件个数，默认是不限制！</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT