<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>nemy</title>
    <description></description>
    <link>http://nemy.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>半年IT工作年终总结</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75147" style="color:red;">http://nemy.javaeye.com/blog/75147</a>&nbsp;
          发表时间: 2007年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大学毕业来，一直在公司干着，从7月3日工作到现在&nbsp;，已经7个多月了。在公司的7个多月，感想甚多。不管是从自己的理想、生活还是经济，都感触甚多。</p><p>&nbsp;&nbsp;&nbsp; 首先先谈谈理想吧，从小，读书都有一个理想，大了，要当个医生，但却没有实现，反而在大学学了软件工程专业，没能如愿当上医生。&nbsp;不过在大学读软件工程专业，还是算非常顺利的，我也从开始对软件的一点都不懂到算还是非常的熟练。也就在大学开始萌芽了对软件编程的一种爱好，象是得了职业病的样子，不做编程，受不了。自从到公司工作来，我对编程有了一个很大的兴趣，自己的视野也开拓了好多，自己想的东西也不是象学校那么单纯的问题。不仅更加喜欢上编程、研究技术，而且对业务也有了很大的兴趣。在公司，我不断的开始学习新技术，主要学的是spring webwork hibernate等JAVA技术，自己当时的暂时理想也是先学好这些技术，争取把架构设计思想学好、学精。但人是有懒惰的，自己感觉，技术上没有达到自己想达到的一个程度。革命尚未达到境界，得继续努力。</p><p>&nbsp; 经济上，说实话，感受特深，一句话概括：&ldquo;穷就一个字&rdquo;。半年多来，为了自己能够独立起来，没有借什么钱，但是到了年终，还是欠了点钱，不知道自己的钱是怎么用的！一想自己心里也不是滋味。以后慢慢谈谈吧。</p><p>&nbsp; 生活上，开始跟同学在一起住，说实话，还是很好的，单身一个人，跟着同学住，相互也有个照应。。。。想睡觉 下次聊吧</p><br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75147#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Feb 2007 23:09:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75147</link>
        <guid>http://nemy.javaeye.com/blog/75147</guid>
      </item>
      <item>
        <title>tomcat做web服务器时,通过地址栏传中文参数时,编码编译</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75148" style="color:red;">http://nemy.javaeye.com/blog/75148</a>&nbsp;
          发表时间: 2007年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;tomcat做web服务器时,通过地址栏传中文参数时,为防止浏览器上的为乱码</p><p>需在服务器server.xml中配置对应的端口中配置编码方式即可.例如:</p><p>&nbsp;&nbsp;&nbsp; &lt;Connector port=&quot;8080&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads=&quot;150&quot; minSpareThreads=&quot;25&quot; maxSpareThreads=&quot;75&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot; acceptCount=&quot;100&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug=&quot;0&quot; connectionTimeout=&quot;20000&quot; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disableUploadTimeout=&quot;true&quot;&nbsp; useBodyEncodingForURI=&quot;true&quot; URIEncoding=&quot;UTF-8&quot;/&gt;</p><p>中加入useBodyEncodingForURI=&quot;true&quot; URIEncoding=&quot;UTF-8&quot;就可以了.</p><br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75148#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Feb 2007 17:20:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75148</link>
        <guid>http://nemy.javaeye.com/blog/75148</guid>
      </item>
      <item>
        <title>在b/s开发中经常用到的javaScript技术整理</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75149" style="color:red;">http://nemy.javaeye.com/blog/75149</a>&nbsp;
          发表时间: 2007年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一、验证类<br />1、数字验证内<br />&nbsp; 1.1 整数<br />&nbsp; 1.2 大于0的整数 （用于传来的ID的验证)<br />&nbsp; 1.3 负整数的验证<br />&nbsp; 1.4 整数不能大于iMax<br />&nbsp; 1.5 整数不能小于iMin<br />2、时间类<br />&nbsp; 2.1 短时间，形如 (13:04:06)<br />&nbsp; 2.2 短日期，形如 (2003-12-05)<br />&nbsp; 2.3 长时间，形如 (2003-12-05 13:04:06)<br />&nbsp; 2.4 只有年和月。形如(2003-05,或者2003-5)<br />&nbsp; 2.5 只有小时和分钟,形如(12:03)<br />3、表单类<br />&nbsp; 3.1 所有的表单的值都不能为空<br />&nbsp; 3.2 多行文本框的值不能为空。<br />&nbsp; 3.3 多行文本框的值不能超过sMaxStrleng<br />&nbsp; 3.4 多行文本框的值不能少于sMixStrleng<br />&nbsp; 3.5 判断单选框是否选择。<br />&nbsp; 3.6 判断复选框是否选择.<br />&nbsp; 3.7 复选框的全选，多选，全不选，反选<br />&nbsp; 3.8 文件上传过程中判断文件类型<br />4、字符类<br />&nbsp; 4.1 判断字符全部由a-Z或者是A-Z的字字母组成<br />&nbsp; 4.2 判断字符由字母和数字组成。<br />&nbsp; 4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />&nbsp; 4.4 字符串替换函数.Replace();<br />5、浏览器类<br />&nbsp; 5.1 判断浏览器的类型<br />&nbsp; 5.2 判断ie的版本<br />&nbsp; 5.3 判断客户端的分辨率<br />&nbsp; <br />6、结合类<br />&nbsp; 6.1 email的判断。<br />&nbsp; 6.2 手机号码的验证<br />&nbsp; 6.3 身份证的验证<br />&nbsp; <br />二、功能类</p><p>1、时间与相关控件类<br />&nbsp; 1.1 日历<br />&nbsp; 1.2 时间控件<br />&nbsp; 1.3 万年历<br />&nbsp; 1.4 显示动态显示时钟效果（文本，如OA中时间）<br />&nbsp; 1.5 显示动态显示时钟效果 (图像，像手表) <br />2、表单类<br />&nbsp; 2.1 自动生成表单<br />&nbsp; 2.2 动态添加，修改，删除下拉框中的元素<br />&nbsp; 2.3 可以输入内容的下拉框<br />&nbsp; 2.4 多行文本框中只能输入iMax文字。如果多输入了，自动减少到iMax个文字（多用于短信发送)<br />&nbsp; <br />3、打印类<br />&nbsp; 3.1 打印控件<br />4、事件类<br />&nbsp; 4.1 屏蔽右键<br />&nbsp; 4.2 屏蔽所有功能键<br />&nbsp; 4.3 --&gt; 和&lt;-- F5 F11,F9,F1<br />&nbsp; 4.4 屏蔽组合键ctrl+N<br />5、网页设计类<br />&nbsp; 5.1 连续滚动的文字，图片（注意是连续的，两段文字和图片中没有空白出现）<br />&nbsp; 5.2 html编辑控件类<br />&nbsp; 5.3 颜色选取框控件<br />&nbsp; 5.4 下拉菜单<br />&nbsp; 5.5 两层或多层次的下拉菜单<br />&nbsp; 5.6 仿IE菜单的按钮。（效果如rongshuxa.com的导航栏目)<br />&nbsp; 5.7 状态栏，title栏的动态效果（例子很多，可以研究一下）<br />&nbsp; 5.8 双击后，网页自动滚屏<br />6、树型结构。<br />&nbsp; 6.1 asp+SQL版<br />&nbsp; 6.2 asp+xml+sql版<br />&nbsp; 6.3 java+sql或者java+sql+xml<br />7、无边框效果的制作<br />8、连动下拉框技术<br />9、文本排序</p><p><br />一、验证类<br />1、数字验证内<br />&nbsp; 1.1 整数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /^(-|\+)?\d+$/.test(str)<br />&nbsp; 1.2 大于0的整数 （用于传来的ID的验证)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /^\d+$/.test(str)<br />&nbsp; 1.3 负整数的验证<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /^-\d+$/.test(str)<br />2、时间类<br />&nbsp; 2.1 短时间，形如 (13:04:06)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function isTime(str)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a == null) {alert('输入的参数不是时间格式'); return false;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a[1]&gt;24 || a[3]&gt;60 || a[4]&gt;60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;时间格式不对&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; 2.2 短日期，形如 (2003-12-05)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function strDateTime(str)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r==null)return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var d= new Date(r[1], r[3]-1, r[4]); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; 2.3 长时间，形如 (2003-12-05 13:04:06)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function strDateTime(str)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var r = str.match(reg); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(r==null)return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]&amp;&amp;d.getHours()==r[5]&amp;&amp;d.getMinutes()==r[6]&amp;&amp;d.getSeconds()==r[7]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; 2.4 只有年和月。形如(2003-05,或者2003-5)<br />&nbsp; 2.5 只有小时和分钟,形如(12:03)<br />3、表单类<br />&nbsp; 3.1 所有的表单的值都不能为空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input onblur=&quot;if(this.value.replace(/^\s+|\s+$/g,'')=='')alert('不能为空!')&quot;&gt;<br />&nbsp; 3.2 多行文本框的值不能为空。<br />&nbsp; 3.3 多行文本框的值不能超过sMaxStrleng<br />&nbsp; 3.4 多行文本框的值不能少于sMixStrleng<br />&nbsp; 3.5 判断单选框是否选择。<br />&nbsp; 3.6 判断复选框是否选择.<br />&nbsp; 3.7 复选框的全选，多选，全不选，反选<br />&nbsp; 3.8 文件上传过程中判断文件类型<br />4、字符类<br />&nbsp; 4.1 判断字符全部由a-Z或者是A-Z的字字母组成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input onblur=&quot;if(/[^a-zA-Z]/g.test(this.value))alert('有错')&quot;&gt;<br />&nbsp; 4.2 判断字符由字母和数字组成。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input onblur=&quot;if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')&quot;&gt;<br />&nbsp; 4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /^([a-zA-z_]{1})([\w]*)$/g.test(str)<br />&nbsp; 4.4 字符串替换函数.Replace();<br />5、浏览器类<br />&nbsp; 5.1 判断浏览器的类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.navigator.appName<br />&nbsp; 5.2 判断ie的版本<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.navigator.appVersion<br />&nbsp; 5.3 判断客户端的分辨率<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.screen.height;&nbsp; window.screen.width;<br />&nbsp; <br />6、结合类<br />&nbsp; 6.1 email的判断。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function ismail(mail)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; 6.2 手机号码的验证<br />&nbsp; 6.3 身份证的验证<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function isIdCardNo(num)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isNaN(num)) {alert(&quot;输入的不是数字！&quot;); return false;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var len = num.length, re; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (len == 15)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (len == 18)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {alert(&quot;输入的数字位数不对！&quot;); return false;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = num.match(re);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (len==15)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var D = new Date(&quot;19&quot;+a[3]+&quot;/&quot;+a[4]+&quot;/&quot;+a[5]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var B = D.getYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var D = new Date(a[3]+&quot;/&quot;+a[4]+&quot;/&quot;+a[5]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var B = D.getFullYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!B) {alert(&quot;输入的身份证号 &quot;+ a[0] +&quot; 里出生日期不对！&quot;); return false;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p><br />3.7 复选框的全选，多选，全不选，反选<br />&lt;form name=hrong&gt;<br />&lt;input type=checkbox name=All onclick=&quot;checkAll('mm')&quot;&gt;全选&lt;br/&gt;<br />&lt;input type=checkbox name=mm onclick=&quot;checkItem('All')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm onclick=&quot;checkItem('All')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm onclick=&quot;checkItem('All')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm onclick=&quot;checkItem('All')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm onclick=&quot;checkItem('All')&quot;&gt;&lt;br/&gt;&lt;br/&gt;</p><p><br />&lt;input type=checkbox name=All2 onclick=&quot;checkAll('mm2')&quot;&gt;全选&lt;br/&gt;<br />&lt;input type=checkbox name=mm2 onclick=&quot;checkItem('All2')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm2 onclick=&quot;checkItem('All2')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm2 onclick=&quot;checkItem('All2')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm2 onclick=&quot;checkItem('All2')&quot;&gt;&lt;br/&gt;<br />&lt;input type=checkbox name=mm2 onclick=&quot;checkItem('All2')&quot;&gt;&lt;br/&gt;</p><p>&lt;/form&gt;</p><p>&lt;SCRIPT LANGUAGE=&quot;java script&quot;&gt;<br />function checkAll(str)<br />{<br />&nbsp; var a = document.getElementsByName(str);<br />&nbsp; var n = a.length;<br />&nbsp; for (var i=0; i&lt;n; i++)<br />&nbsp; a[i].checked = window.event.srcElement.checked;<br />}<br />function checkItem(str)<br />{<br />&nbsp; var e = window.event.srcElement;<br />&nbsp; var all = eval(&quot;document.hrong.&quot;+ str);<br />&nbsp; if (e.checked)<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; var a = document.getElementsByName(e.name);<br />&nbsp;&nbsp;&nbsp; all.checked = true;<br />&nbsp;&nbsp;&nbsp; for (var i=0; i&lt;a.length; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!a[i].checked){ all.checked = false; break;}<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />&nbsp; else all.checked = false;<br />}<br />&lt;/SCRIPT&gt;</p><p>3.8 文件上传过程中判断文件类型<br />&lt;input type=file onchange=&quot;alert(this.value.match(/^(.*)(\.)(.{1,8})$/)[3])&quot;&gt;</p><p>画图:<br />&lt;OBJECT <br />id=S <br />style=&quot;LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px&quot; <br />height=240 <br />width=392 <br />classid=&quot;clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6&quot;&gt;<br />&lt;/OBJECT&gt;<br />&lt;SCRIPT&gt;<br />S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);<br />S.DrawingSurface.ArcRadians(30,0,0,30,50,60);<br />S.DrawingSurface.Line(10,10,100,100);<br />&lt;/SCRIPT&gt;</p><p>写注册表：<br />&lt;SCRIPT&gt;<br />var WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;);<br />WshShell.RegWrite (&quot;HKCU\\Software\\ACME\\FortuneTeller\\&quot;, 1, &quot;REG_BINARY&quot;);<br />WshShell.RegWrite (&quot;HKCU\\Software\\ACME\\FortuneTeller\\MindReader&quot;, &quot;Goocher!&quot;, &quot;REG_SZ&quot;);<br />var bKey =&nbsp;&nbsp;&nbsp; WshShell.RegRead (&quot;HKCU\\Software\\ACME\\FortuneTeller\\&quot;);<br />WScript.Echo (WshShell.RegRead (&quot;HKCU\\Software\\ACME\\FortuneTeller\\MindReader&quot;));<br />WshShell.RegDelete (&quot;HKCU\\Software\\ACME\\FortuneTeller\\MindReader&quot;);<br />WshShell.RegDelete (&quot;HKCU\\Software\\ACME\\FortuneTeller\\&quot;);<br />WshShell.RegDelete (&quot;HKCU\\Software\\ACME\\&quot;);<br />&lt;/SCRIPT&gt;</p><p>TABLAE相关(客户端动态增加行列）<br />&lt;HTML&gt;<br />&lt;SCRIPT LANGUAGE=&quot;JScript&quot;&gt;<br />function numberCells() {<br />&nbsp;&nbsp;&nbsp; var count=0;<br />&nbsp;&nbsp;&nbsp; for (i=0; i &lt; document.all.mytable.rows.length; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j=0; j &lt; document.all.mytable.rows(i).cells.length; j++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.all.mytable.rows(i).cells(j).innerText = count;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />&lt;/SCRIPT&gt;<br />&lt;BODY onload=&quot;numberCells()&quot;&gt;<br />&lt;TABLE id=mytable border=1&gt;<br />&lt;TR&gt;&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;&lt;TH&gt;&amp;nbsp;&lt;/TH&gt;&lt;/TR&gt;<br />&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;<br />&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;<br />&lt;/TABLE&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt; </p><p>１．身份证严格验证：</p><p>&lt;script&gt;<br />var aCity={11:&quot;北京&quot;,12:&quot;天津&quot;,13:&quot;河北&quot;,14:&quot;山西&quot;,15:&quot;内蒙古&quot;,21:&quot;辽宁&quot;,22:&quot;吉林&quot;,23:&quot;黑龙江&quot;,31:&quot;上海&quot;,32:&quot;江苏&quot;,33:&quot;浙江&quot;,34:&quot;安徽&quot;,35:&quot;福建&quot;,36:&quot;江西&quot;,37:&quot;山东&quot;,41:&quot;河南&quot;,42:&quot;湖北&quot;,43:&quot;湖南&quot;,44:&quot;广东&quot;,45:&quot;广西&quot;,46:&quot;海南&quot;,50:&quot;重庆&quot;,51:&quot;四川&quot;,52:&quot;贵州&quot;,53:&quot;云南&quot;,54:&quot;西藏&quot;,61:&quot;陕西&quot;,62:&quot;甘肃&quot;,63:&quot;青海&quot;,64:&quot;宁夏&quot;,65:&quot;新疆&quot;,71:&quot;台湾&quot;,81:&quot;香港&quot;,82:&quot;澳门&quot;,91:&quot;国外&quot;}<br />&nbsp; </p><p><br />function cidInfo(sId){<br />&nbsp;var iSum=0<br />&nbsp;var info=&quot;&quot;<br />&nbsp;if(!/^\d{17}(\d|x)$/i.test(sId))return false;<br />&nbsp;sId=sId.replace(/x$/i,&quot;a&quot;);<br />&nbsp;if(aCity[parseInt(sId.substr(0,2))]==null)return &quot;Error:非法地区&quot;;<br />&nbsp;sBirthday=sId.substr(6,4)+&quot;-&quot;+Number(sId.substr(10,2))+&quot;-&quot;+Number(sId.substr(12,2));<br />&nbsp;var d=new Date(sBirthday.replace(/-/g,&quot;/&quot;))<br />&nbsp;if(sBirthday!=(d.getFullYear()+&quot;-&quot;+ (d.getMonth()+1) + &quot;-&quot; + d.getDate()))return &quot;Error:非法生日&quot;;<br />&nbsp;for(var i = 17;i&gt;=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)<br />&nbsp;if(iSum%11!=1)return &quot;Error:非法证号&quot;;<br />&nbsp;return aCity[parseInt(sId.substr(0,2))]+&quot;,&quot;+sBirthday+&quot;,&quot;+(sId.substr(16,1)%2?&quot;男&quot;:&quot;女&quot;)<br />}</p><p>document.write(cidInfo(&quot;380524198002300016&quot;),&quot;&lt;br/&gt;&quot;);<br />document.write(cidInfo(&quot;340524198002300019&quot;),&quot;&lt;br/&gt;&quot;)<br />document.write(cidInfo(&quot;340524197711111111&quot;),&quot;&lt;br/&gt;&quot;)<br />document.write(cidInfo(&quot;34052419800101001x&quot;),&quot;&lt;br/&gt;&quot;);<br />&lt;/script&gt;</p><p>２．验证ＩＰ地址<br />&lt;SCRIPT LANGUAGE=&quot;java script&quot;&gt;<br />function isip(s){<br />&nbsp;var check=function(v){try{return (v&lt;=255 &amp;&amp; v&gt;=0)}catch(x){return false}};<br />&nbsp;var re=s.split(&quot;.&quot;)<br />&nbsp;return (re.length==4)?(check(re[0]) &amp;&amp; check(re[1]) &amp;&amp; check(re[2]) &amp;&amp; check(re[3])):false<br />}</p><p>var s=&quot;202.197.78.129&quot;;<br />alert(isip(s))<br />&lt;/SCRIPT&gt;</p><p>&nbsp;</p><p>３．加sp1后还能用的无边框窗口！！<br />&lt;HTML XMLNS:IE&gt;<br />&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;<br />&lt;IE:Download ID=&quot;include&quot; STYLE=&quot;behavior:url(#default#download)&quot; /&gt;<br />&lt;title&gt;Chromeless Window&lt;/title&gt;</p><p>&lt;SCRIPT LANGUAGE=&quot;JScript&quot;&gt;<br />/*--- Special Thanks For andot ---*/</p><p>/*<br />&nbsp;This following code are designed and writen by Windy_sk &lt;<a href="mailto:seasonx@163.net">seasonx@163.net</a>&gt;<br />&nbsp;You can use it freely, but u must held all the copyright items!<br />*/</p><p>/*--- Thanks For andot Again ---*/</p><p>var CW_width = 400;<br />var CW_height = 300;<br />var CW_top = 100;<br />var CW_left = 100;<br />var CW_url = &quot;/&quot;;<br />var New_CW = window.createPopup();<br />var CW_Body = New_CW.document.body;<br />var content = &quot;&quot;;<br />var CSStext = &quot;margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;&quot;;</p><p>//Build Window<br />include.startDownload(CW_url, function(source){content=source});</p><p>function insert_content(){<br />&nbsp;var temp = &quot;&quot;;<br />&nbsp;CW_Body.style.overflow&nbsp; = &quot;hidden&quot;;<br />&nbsp;CW_Body.style.backgroundColor = &quot;white&quot;;<br />&nbsp;CW_Body.style.border&nbsp; =&nbsp; &quot;solid black 1px&quot;;<br />&nbsp;content = content.replace(/&lt;a ([^&gt;]*)&gt;/g,&quot;&lt;a onclick='parent.open(this.href);return false' $1&gt;&quot;);<br />&nbsp;temp += &quot;&lt;table width=100% height=100% cellpadding=0 cellspacing=0 border=0&gt;&quot;;<br />&nbsp;temp += &quot;&lt;tr style=';font-size:12px;background:#0099CC;height:20;cursor:default' ondblclick=\&quot;Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\&quot; onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'&gt;&quot;;<br />&nbsp;temp += &quot;&lt;td style='color:#ffffff;padding-left:5px'&gt;Chromeless Window For IE6 SP1&lt;/td&gt;&quot;;<br />&nbsp;temp += &quot;&lt;td style='color:#ffffff;padding-right:5px;' align=right&gt;&quot;;<br />&nbsp;temp += &quot;&lt;span id=Help&nbsp; onclick=\&quot;alert('Chromeless Window For IE6 SP1&nbsp; -&nbsp; Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot')\&quot; style=\&quot;&quot;+CSStext+&quot;font-family:System;padding-right:2px;\&quot;&gt;?&lt;/span&gt;&quot;;<br />&nbsp;temp += &quot;&lt;span id=Min&nbsp;&nbsp; onclick='parent.New_CW.hide();parent.blur()' style=\&quot;&quot;+CSStext+&quot;font-family:Webdings;\&quot; title='Minimum'&gt;0&lt;/span&gt;&quot;;<br />&nbsp;temp += &quot;&lt;span id=Max&nbsp;&nbsp; onclick=\&quot;this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\&quot; style=\&quot;&quot;+CSStext+&quot;font-family:Webdings;\&quot; title='Maximum'&gt;1&lt;/span&gt;&quot;;<br />&nbsp;temp += &quot;&lt;span id=Close onclick='parent.opener=null;parent.close()' style=\&quot;&quot;+CSStext+&quot;font-family:System;padding-right:2px;\&quot; title='Close'&gt;x&lt;/span&gt;&quot;;<br />&nbsp;temp += &quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=2&gt;&quot;;<br />&nbsp;temp += &quot;&lt;div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:&quot;+CW_width+&quot;'&gt;&quot;;<br />&nbsp;temp += content;<br />&nbsp;temp += &quot;&lt;/div&gt;&quot;;<br />&nbsp;temp += &quot;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&quot;;<br />&nbsp;CW_Body.innerHTML = temp;<br />}</p><p>setTimeout(&quot;insert_content()&quot;,1000);</p><p>var if_max = true;<br />function show_CW(){<br />&nbsp;window.moveTo(10000, 10000);<br />&nbsp;if(if_max){<br />&nbsp; New_CW.show(CW_top, CW_left, CW_width, CW_height);<br />&nbsp; if(typeof(New_CW.document.all.include)!=&quot;undefined&quot;){<br />&nbsp;&nbsp; New_CW.document.all.include.style.width = CW_width;<br />&nbsp;&nbsp; New_CW.document.all.Max.innerText = &quot;1&quot;;<br />&nbsp; }<br />&nbsp; <br />&nbsp;}else{<br />&nbsp; New_CW.show(0, 0, screen.width, screen.height);<br />&nbsp; New_CW.document.all.include.style.width = screen.width;<br />&nbsp;}<br />}</p><p>window.onfocus&nbsp; = show_CW;<br />window.onresize = show_CW;</p><p>// Move Window<br />var drag_x,drag_y,draging=false</p><p>function drag_move(e){<br />&nbsp;if (draging){<br />&nbsp; New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);<br />&nbsp; return false;<br />&nbsp;}<br />}</p><p>function drag_down(e){<br />&nbsp;if(e.button==2)return;<br />&nbsp;if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height)return;<br />&nbsp;drag_x=e.clientX;<br />&nbsp;drag_y=e.clientY;<br />&nbsp;draging=true;<br />&nbsp;e.srcElement.setCapture();<br />}</p><p>function drag_up(e){<br />&nbsp;draging=false;<br />&nbsp;e.srcElement.releaseCapture();<br />&nbsp;if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height) return;<br />&nbsp;CW_top&nbsp; = e.screenX-drag_x;<br />&nbsp;CW_left = e.screenY-drag_y;<br />}</p><p>&lt;/SCRIPT&gt;<br />&lt;/HTML&gt;</p><p>电话号码的验证</p><p>要求：<br />　　(1)电话号码由数字、&quot;(&quot;、&quot;)&quot;和&quot;-&quot;构成<br />　　(2)电话号码为3到8位<br />　　(3)如果电话号码中包含有区号，那么区号为三位或四位<br />　　(4)区号用&quot;(&quot;、&quot;)&quot;或&quot;-&quot;和其他部分隔开<br />　　(5)移动电话号码为11或12位，如果为12位,那么第一位为0<br />　　(6)11位移动电话号码的第一位和第二位为&quot;13&quot;<br />　　(7)12位移动电话号码的第二位和第三位为&quot;13&quot;<br />　　根据这几条规则，可以与出以下正则表达式：<br />　　(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)</p><p><br />&lt;script language=&quot;java script&quot;&gt;<br />function PhoneCheck(s) {<br />var str=s;<br />var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/<br />alert(reg.test(str));<br />}<br />&lt;/script&gt;<br />&lt;input type=text name=&quot;iphone&quot;&gt;<br />&lt;input type=button onclick=&quot;PhoneCheck(document.all.iphone.value)&quot; value=&quot;Check&quot;&gt;</p><p>具有在输入非数字字符不回显的效果，即对非数字字符的输入不作反应。<br />function numbersonly(field,event){<br />&nbsp;var key,keychar;<br />&nbsp;if(window.event){<br />&nbsp; key = window.event.keyCode;<br />&nbsp;}<br />&nbsp;else if (event){<br />&nbsp; key = event.which;<br />&nbsp;}<br />&nbsp;else{<br />&nbsp; return true<br />&nbsp;}<br />&nbsp;keychar = String.fromCharCode(key);<br />&nbsp;if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){<br />&nbsp; return true;<br />&nbsp;}<br />&nbsp;else if((&quot;0123456789.&quot;).indexOf(keychar)&gt;-1){<br />&nbsp; window.status = &quot;&quot;;<br />&nbsp; return true;<br />&nbsp;}<br />&nbsp;else {<br />&nbsp; window.status = &quot;Field excepts numbers only&quot;;<br />&nbsp; return false;<br />&nbsp;}<br />}</p><p>验证ip </p><p>str=document.RegExpDemo.txtIP.value;<br />if(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(str)==false)<br />{<br />&nbsp;window.alert('错误的IP地址格式');<br />&nbsp;document.RegExpDemo.txtIP.select();<br />&nbsp;document.RegExpDemo.txtIP.focus();<br />&nbsp;return;<br />}<br />if(RegExp.$1&lt;1 || RegExp.$1&gt;254||RegExp.$2&lt;0||RegExp.$2&gt;254||RegExp.$3&lt;0||RegExp.$3&gt;254||RegExp.$4&lt;1||RegExp.$4&gt;254)<br />{<br />&nbsp;window.alert('错误的IP地址');<br />&nbsp;document.RegExpDemo.txtIP.select();<br />&nbsp;document.RegExpDemo.txtIP.focus();<br />&nbsp;return;<br />}<br />//剔除 如&nbsp; 010.020.020.03 前面 的0 <br />var str=str.replace(/0(\d)/g,&quot;$1&quot;);<br />str=str.replace(/0(\d)/g,&quot;$1&quot;);<br />window.alert(str);<br />&nbsp;</p><br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75149#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Feb 2007 13:30:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75149</link>
        <guid>http://nemy.javaeye.com/blog/75149</guid>
      </item>
      <item>
        <title>实现rss</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75151" style="color:red;">http://nemy.javaeye.com/blog/75151</a>&nbsp;
          发表时间: 2007年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>一:什么是RSS<br />&nbsp;RSS(really simple syndication) :网页内容聚合器。RSS的格式是XML。必须符合XML 1.0规范。<br />&nbsp;RSS的作用：订阅BLOG,订阅新闻<br />二:RSS的历史版本:<br />&nbsp;<a href="http://blogs.law.harvard.edu/tech/rssVersionHistory">http://blogs.law.harvard.edu/tech/rssVersionHistory</a><br />&nbsp;RSS的版本有很多个，0.90、0.91、0.92、0.93、0.94、1.0 和 2.0。与RSS相对的还有ATOM。<br />&nbsp;国内主要是RSS2.0,国外主要用ATOM0.3.<br />&nbsp;由于RSS出现2派，导致混乱场面。其中RSS2.0规范由哈佛大学定义并锁定。<br />&nbsp;地址:http://blogs.law.harvard.edu/tech/rss<br />三：RSS 文件形式<br />&nbsp;&nbsp;&nbsp; 1:例子：<br />&nbsp;&lt;?xml version=&quot;1.0&quot;?&gt;<br />&nbsp;&lt;rss version=&quot;2.0&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;channel&gt;<br />&nbsp;&nbsp;&nbsp; &lt;title&gt;The channel's name goes here&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp; &lt;link&gt;http://www.urlofthechannel.com/&lt;/link&gt;<br />&nbsp;&nbsp;&nbsp; &lt;description&gt;This channel is an example channel for an article.<br />&nbsp;&nbsp;&nbsp; &lt;/description&gt;<br />&nbsp;&nbsp;&nbsp; &lt;language&gt;en-us&lt;/language&gt;<br />&nbsp;&nbsp;&nbsp; &lt;image&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;The image title goes here&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://www.urlofthechannel.com/images/logo.gif&lt;/url&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;http://www.urlofthechannel.com/&lt;/link&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/image&gt;<br />&nbsp;&nbsp;&nbsp; &lt;item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;The Future of content&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;http://www.itworld.com/nl/ecom_in_act/11122003/&lt;/link&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt; The issue of people distributing and reusing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digital media is a problem for many businesses. It may also be<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a hidden opportunity. Just as open source licensing has opened<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; up new possibilities in the world of technology, it promises to do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the same in the area of creative content.&lt;/description&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/item&gt;<br />&nbsp;&nbsp;&nbsp; &lt;item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Online Music Services - Better than free?&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;http://www.itworld.com/nl/ecom_in_act/08202003/&lt;/link&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;More people than ever are downloading music from <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the Internet. Many use person-to-person file sharing programs like <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Kazaa to share and download music in MP3 format, paying nothing. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This has made it difficult for companies to setup online music <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; businesses. How can companies compete against free?&lt;/description&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/item&gt;<br />&nbsp; &lt;/channel&gt;<br />&nbsp;&lt;/rss&gt;<br />&nbsp;&nbsp;&nbsp; 2:RSS文件由一个 &lt;channel&gt; 元素及其子元素组成。除了频道内容本身之外，&lt;channel&gt; <br />&nbsp;还以项的形式包含表示频道元数据的元素 &mdash;&mdash; 比如 &lt;title&gt;、&lt;link&gt; 和 &lt;description&gt;。<br />&nbsp;项通常是频道的主要部分，包含经常变化的内容。<br />&nbsp;&nbsp;&nbsp; 3:频道(channel)用&lt;channel&gt;表示<br />&nbsp;频道一般有三个元素，提供关于频道本身的信息：<br />&nbsp;&lt;title&gt;：频道或提要的名称。 <br />&nbsp;&lt;link&gt;：与该频道关联的 Web 站点或者站点区域的 URL。 <br />&nbsp;&lt;description&gt;：简要介绍该频道是做什么的。 <br />&nbsp;许多频道子元素都是可选的。常用的 &lt;image&gt; 元素包含三个必需的子元素：<br />&nbsp;&lt;url&gt;：表示该频道的 GIF、JPEG 或 PNG 图像的 URL。 <br />&nbsp;&lt;title&gt;：图象的描述。当频道以 HTML 呈现时，用作 HTML &lt;image&gt; 标签的 ALT 属性。 <br />&nbsp;&lt;link&gt;：站点的 URL。如果频道以 HTML 呈现，该图像作为到这个站点的链接。 <br />&nbsp;&lt;image&gt; 还有三个可选的子元素：<br />&nbsp;&lt;width&gt;：数字，表示图象的像素宽度，最大值是 188，默认值为 88。 <br />&nbsp;&lt;height&gt;：数字，表示图象的像素高度。最大值是 400，默认值为 31。 <br />&nbsp;&lt;description&gt;：包含文本，在呈现时可以作为围绕着该图像形成的链接元素的 title 属性。 <br />&nbsp;此外还可以使用许多其他可选的频道元素。多数都是不言自明的：<br />&nbsp;&lt;language&gt;：en-us <br />&nbsp;&lt;copyright&gt;：Copyright 2003, James Lewin <br />&nbsp;&lt;managingEditor&gt;：<a href="mailto:dan@spam_me.com">dan@spam_me.com</a> (Dan Deletekey) <br />&nbsp;&lt;webMaster&gt;：<a href="mailto:dan@spam_me.com">dan@spam_me.com</a> (Dan Deletekey) <br />&nbsp;&lt;pubDate&gt;：Sat, 15 Nov 2003 0:00:01 GMT <br />&nbsp;&lt;lastBuildDate&gt;：Sat, 15 Nov 2003 0:00:01 GMT <br />&nbsp;&lt;category&gt;：ebusiness <br />&nbsp;&lt;generator&gt;：Your CMS 2.0 <br />&nbsp;&lt;docs&gt;：<a href="http://blogs.law.harvard.edu/tech/rss">http://blogs.law.harvard.edu/tech/rss</a> <br />&nbsp;&lt;cloud&gt;：允许进程注册为&ldquo;cloud&rdquo;，频道更新时通知它，为 RSS 提要实现了一种轻量级的发布-订阅协议。 <br />&nbsp;&lt;ttl&gt;：存活时间 是一个数字，表示提要在刷新之前缓冲的分钟数。 <br />&nbsp;&lt;rating&gt;：关于该频道的 PICS 评价。 <br />&nbsp;&lt;textInput&gt;：定义可与频道一起显示的输入框。 <br />&nbsp;&lt;skipHours&gt;：告诉聚集器哪些小时的更新可以忽略。 <br />&nbsp;&lt;skipDays&gt;：告诉聚集器那一天的更新可以忽略。 <br />&nbsp;&nbsp;&nbsp; 4:摘要(feed)用&lt;item&gt;表示,&lt;item&gt;的格式如下：<br />&nbsp;每个摘要通常包含三个元素：<br />&nbsp;&lt;title&gt;：这是项的名称，在标准应用中被转换成 HTML 中的标题。 <br />&nbsp;&lt;link&gt;：这是该项的 URL。title 通常作为一个链接，指向包含在 &lt;link&gt; 元素中的 URL。 <br />&nbsp;&lt;description&gt;：通常作为 link 中所指向的 URL 的摘要或者补充。 <br />&nbsp;所有的元素都是可选的，但是一个项至少要么 包含一个 &lt;title&gt;，要么包含一个 &lt;description&gt;。<br />&nbsp;项还有其他一些可选的元素：<br />&nbsp;&lt;author&gt;：作者的 e-mail 地址。 <br />&nbsp;&lt;category&gt;：支持有组织的记录。 <br />&nbsp;&lt;comments&gt;：关于项的注释页的 URL。 <br />&nbsp;&lt;enclosure&gt;：支持和该项有关的媒体对象。 <br />&nbsp;&lt;guid&gt;：唯一与该项联系在一起的永久性链接。 <br />&nbsp;&lt;pubDate&gt;：该项是什么时候发布的。 <br />&nbsp;&lt;source&gt;：该项来自哪个 RSS 频道，当<br />四:主流java rss lib及其评测:<br />&nbsp;主要有一下几种:<br />&nbsp;&nbsp;&nbsp; 1:Rome: <a href="http://wiki.java.net/bin/view/Javawsxml/Rome">http://wiki.java.net/bin/view/Javawsxml/Rome</a><br />&nbsp;Rome是 java.net 上的一个开源项目，现在的版本是0.5。为什么叫Rome呢,按它的介绍上的说法，有个&ldquo;条条大路通罗马&rdquo;的意思，有些RSS的意味。Rome可能是 sun 公司从自己某个子项目中抽离出来的，package和类的命名就象j2sdk一样感觉规范。功能上支持RSS的所有版本及 Atom 0.3(Atom是和RSS类似的一种内容聚合的方式)。Rome 本身是提供API和功能实现.<br />&nbsp;&nbsp;&nbsp; 2:rssutils: <a href="http://gceclub.sun.com.cn/staticcontent/html/2004-04-22/rss.html">http://gceclub.sun.com.cn/staticcontent/html/2004-04-22/rss.html</a><br />&nbsp;rssutils是一个工具包，sun 的 develope站点上有文章 RSS Utilities: A Tutorial 专门介绍用taglib 显示RSS内容，附带的可以下载这个工具包，但我从网上搜索不到它的出处，自然也无法看到它的源码。但从反编译的代码来看，也是sun公司内部高手所做，设计精巧，代码简练。实现一个handler，用sax的方式解析xml内容，handler内部用反射和javabean的机制构造RSS元素对象并赋值。<br />&nbsp;&nbsp;&nbsp; 3:rsslib4j: <a href="http://sourceforge.net/projects/rsslib4j">http://sourceforge.net/projects/rsslib4j</a><br />&nbsp;rsslib4j 是 sourceforget 上的项目，同样支持所有RSS版本。 <br />&nbsp;&nbsp;&nbsp; 4:rsslibj:http://enigmastation.com/rsslibj/<br />&nbsp;&nbsp;&nbsp; 5:总结<br />&nbsp;Rome: <br />&nbsp;优 - 1）可扩展性好，有前途。2）功能强大，除了用来解析RSS，还可以聚合和构造RSS。<br />&nbsp;劣 - 1）兼容性待加强，2）绑定jdom。<br />&nbsp;rssutils: <br />&nbsp;优 - 1）代码设计精妙，值得学习。2）附带 taglib 实现，直接可在 jsp 中应用。<br />&nbsp;劣 - 1）没有源码。 2）兼容性有待加强。 3）功能较弱，只能用来解析RSS，没有聚合和构造RSS功能。<br />&nbsp;rsslib4j:<br />&nbsp;优 - 1）简单有效，体积小。2）兼容性不错。<br />&nbsp;劣 - 1）有小bug。2）功能较弱，只能用来解析RSS，没有聚合和构造RSS功能。<br />&nbsp;rsslibj:<br />&nbsp;优 - 1）简单有效，体积小,才25K。2）能解析和生成RSS(动态和静态)<br />&nbsp;劣 - 1）有小bug。2）版本很久没有更新了，陈旧.</div><div>五:选择ROME作为RSS实现工具<br />&nbsp;在官网<a href="http://wiki.java.net/bin/view/Javawsxml/Rome">http://wiki.java.net/bin/view/Javawsxml/Rome</a>下载rome-0.8.jar,<br />&nbsp;rome用到了jdom1.0,下载地址:http://www.jdom.org<br />&nbsp;rome支持:rss_0.9 <br />&nbsp;&nbsp; rss_0.91 <br />&nbsp;&nbsp; rss_0.92 <br />&nbsp;&nbsp; rss_0.93 <br />&nbsp;&nbsp; rss_0.94 <br />&nbsp;&nbsp; rss_1.0 <br />&nbsp;&nbsp; rss_2.0 <br />&nbsp;&nbsp; atom_0.3 <br />&nbsp;&nbsp; atom_1.0 <br />&nbsp;生成RSS类新需要在程序中指定，如：rss_2.0<br />六:包结构<br />&nbsp;com.sun.syndication.feed&nbsp;提供RSS and Atom beans的父类<br />&nbsp;com.sun.syndication.feed.atom&nbsp;提供实现Atom feeds核心元素的beans<br />&nbsp;com.sun.syndication.feed.module 提供处理聚合modules的beans<br />&nbsp;com.sun.syndication.feed.rss&nbsp;提供实现Rss feeds核心元素的beans<br />&nbsp;com.sun.syndication.feed.synd&nbsp;我们主要用的就是这个包，SyndFeed and SyndEntryImpl <br />&nbsp;com.sun.syndication.io&nbsp;&nbsp;提供对读取和分析feeds的输入和输出<br />七:实例：</div><div>1:读取远端url的rss,然后输出到控制台:<br />/**<br />&nbsp;* 关键代码：<br />&nbsp;* SyndFeedInput input = new SyndFeedInput();<br />&nbsp;* SyndFeed feed = input.build(new XmlReader(feedUrl));<br />&nbsp;*/</div><div>package com.sun.syndication.samples;</div><div>import com.sun.syndication.feed.synd.SyndFeed;<br />import com.sun.syndication.io.SyndFeedInput;<br />import com.sun.syndication.io.XmlReader;<br />import java.net.URL;</div><div>/**<br />&nbsp;* It Reads and prints any RSS/Atom feed type.<br />&nbsp;*/<br />public class FeedReader {</div><div>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean ok = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length==0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL feedUrl = new URL(&quot;<a href="http://seu.org.cn/bbs/rss.php">http://seu.org.cn/bbs/rss.php</a>&quot;);<br />&nbsp;&nbsp;//SyndFeedInput:从远程读到xml结构的内容转成SyndFeedImpl实例<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeedInput input = new SyndFeedInput();<br />&nbsp;&nbsp;//rome按SyndFeed类型生成rss和atom的实例,<br />&nbsp;&nbsp;//SyndFeed是rss和atom实现类SyndFeedImpl的接口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed feed = input.build(new XmlReader(feedUrl));<br />&nbsp;&nbsp;//打印到控制台<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(feed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;ERROR: &quot;+ex.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ok) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FeedReader reads and prints any RSS/Atom feed type.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The first parameter must be the URL of the feed to read.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />2:将多个远程RSS在本地聚集成一个RSS<br />package com.sun.syndication.samples;</div><div>import java.net.URL;<br />import java.io.InputStreamReader;<br />import java.io.PrintWriter;<br />import java.util.List;<br />import java.util.ArrayList;</div><div>import com.sun.syndication.feed.synd.SyndFeed;<br />import com.sun.syndication.feed.synd.SyndFeedImpl;<br />import com.sun.syndication.io.SyndFeedOutput;<br />import com.sun.syndication.io.SyndFeedInput;<br />import com.sun.syndication.io.XmlReader;</div><div>/**<br />&nbsp;* It aggregates a list of RSS/Atom feeds (they can be of different types)<br />&nbsp;* into a single feed of the specified type.<br />&nbsp;* &lt;p&gt;<br />&nbsp;* @author Alejandro Abdelnur<br />&nbsp;*<br />&nbsp;*/<br />public class FeedAggregator {</div><div>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean ok = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length&gt;=2) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String outputType = args[0];</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed feed = new SyndFeedImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setFeedType(outputType);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setTitle(&quot;Aggregated Feed&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setDescription(&quot;Anonymous Aggregated Feed&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setAuthor(&quot;anonymous&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setLink(&quot;<a href="http://www.anonymous.com/">http://www.anonymous.com</a>&quot;);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List entries = new ArrayList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setEntries(entries);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=1;i&lt;args.length;i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL inputUrl = new URL(args[i]);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeedInput input = new SyndFeedInput();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed inFeed = input.build(new XmlReader(inputUrl));</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries.addAll(inFeed.getEntries());</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeedOutput output = new SyndFeedOutput();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.output(feed,new PrintWriter(System.out));</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;ERROR: &quot;+ex.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ok) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FeedAggregator aggregates different feeds into a single one.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The first parameter must be the feed type for the aggregated feed.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot; [valid values are: rss_0.9, rss_0.91U, rss_0.91N, rss_0.92, rss_0.93, ]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot; [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rss_0.94, rss_1.0, rss_2.0 &amp; atom_0.3&nbsp; ]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The second to last parameters are the URLs of feeds to aggregate.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</div><div>}<br />3:将动态生成的RSS存盘，形成静态RSS<br />package com.sun.syndication.samples;</div><div>import com.sun.syndication.feed.synd.*;<br />import com.sun.syndication.io.SyndFeedOutput;</div><div>import java.io.FileWriter;<br />import java.io.Writer;<br />import java.text.DateFormat;<br />import java.text.SimpleDateFormat;<br />import java.util.ArrayList;<br />import java.util.List;</div><div>/**<br />&nbsp;* It creates a feed and writes it to a file.<br />&nbsp;* &lt;p&gt;<br />&nbsp;* @author Alejandro Abdelnur<br />&nbsp;*<br />&nbsp;*/<br />public class FeedWriter {</div><div>&nbsp;&nbsp;&nbsp; private static final String DATE_FORMAT = &quot;yyyy-MM-dd&quot;;</div><div>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean ok = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length==0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String feedType = &quot;rss_2.0&quot;;//指定rss类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = &quot;F:\\ss.xml&quot;;//静态rss存放目录</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);</div><div>&nbsp;&nbsp;//feed是通过SyndFeedImpl的实例&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed feed = new SyndFeedImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setFeedType(feedType);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setTitle(&quot;Sample Feed (created with Rome)&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setLink(&quot;<a href="http://rome.dev.java.net/">http://rome.dev.java.net</a>&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setDescription(&quot;This feed has been created using Rome (Java syndication utilities&quot;);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//entries就是item集合<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List entries = new ArrayList();<br />&nbsp;&nbsp;//一个entry就是一个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndEntry entry;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndContent description;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//第一个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry = new SyndEntryImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setTitle(&quot;Rome v1.0&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setLink(&quot;<a href="http://wiki.java.net/bin/view/Javawsxml/Rome01">http://wiki.java.net/bin/view/Javawsxml/Rome01</a>&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setPublishedDate(dateParser.parse(&quot;2004-06-08&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description = new SyndContentImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setType(&quot;text/plain&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setValue(&quot;Initial release of Rome&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setDescription(description);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries.add(entry);</div><div>&nbsp;&nbsp;//第二个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry = new SyndEntryImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setTitle(&quot;Rome v2.0&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setLink(&quot;<a href="http://wiki.java.net/bin/view/Javawsxml/Rome02">http://wiki.java.net/bin/view/Javawsxml/Rome02</a>&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setPublishedDate(dateParser.parse(&quot;2004-06-16&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description = new SyndContentImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setType(&quot;text/xml&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setValue(&quot;Bug fixes, &lt;xml&gt;XML&lt;/xml&gt; minor API changes and some new features&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setDescription(description);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries.add(entry);</div><div>&nbsp;&nbsp;//第三个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry = new SyndEntryImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setTitle(&quot;Rome v3.0&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setLink(&quot;<a href="http://wiki.java.net/bin/view/Javawsxml/Rome03">http://wiki.java.net/bin/view/Javawsxml/Rome03</a>&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setPublishedDate(dateParser.parse(&quot;2004-07-27&quot;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description = new SyndContentImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setType(&quot;text/html&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description.setValue(&quot;&lt;p&gt;More Bug fixes, mor API changes, some new features and some Unit testing&lt;/p&gt;&quot;+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;p&gt;For details check the &lt;a href=\&quot;<a href="\&quot;&lt;a">http://wiki.java.net/bin/view/Javawsxml/RomeChangesLog#RomeV03\&quot;&gt;Changes</a> Log&lt;/a&gt;&lt;/p&gt;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry.setDescription(description);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//将所有item存入entries<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries.add(entry);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//将entries加入channel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setEntries(entries);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Writer writer = new FileWriter(fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeedOutput output = new SyndFeedOutput();<br />&nbsp;&nbsp;//存盘,形成静态rss<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.output(feed,writer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The feed has been written to the file [&quot;+fileName+&quot;]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(feed);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;ERROR: &quot;+ex.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ok) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FeedWriter creates a RSS/Atom feed and writes it to a file.&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The first parameter must be the syndication format for the feed&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;&nbsp; (rss_0.90, rss_0.91, rss_0.92, rss_0.93, rss_0.94, rss_1.0 rss_2.0 or atom_0.3)&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;The second parameter must be the file name for the feed&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</div><div>}</div><div>4：动态生成rss，给一个blog站点动态生成rss<br />package com.vaga.rss.web.admin;</div><div>import java.io.IOException;<br />import java.text.DateFormat;<br />import java.text.ParseException;<br />import java.text.SimpleDateFormat;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.List;</div><div>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</div><div>import org.springframework.web.servlet.ModelAndView;<br />import org.springframework.web.servlet.mvc.ParameterizableViewController;</div><div>import com.sun.syndication.feed.synd.SyndContent;<br />import com.sun.syndication.feed.synd.SyndContentImpl;<br />import com.sun.syndication.feed.synd.SyndEntry;<br />import com.sun.syndication.feed.synd.SyndEntryImpl;<br />import com.sun.syndication.feed.synd.SyndFeed;<br />import com.sun.syndication.feed.synd.SyndFeedImpl;<br />import com.sun.syndication.io.FeedException;<br />import com.sun.syndication.io.SyndFeedOutput;<br />import com.sun.syndication.feed.synd.SyndContent;<br />import com.sun.syndication.feed.synd.SyndEntry;<br />import com.totsp.xml.syndication.content.ContentModule;<br />import com.vaga.blog.model.WeblogEntry;<br />import com.vaga.blog.model.Website;<br />import com.vaga.blog.service.WeblogEntryManager;<br />import com.vaga.blog.service.WebsiteManager;</div><div>public class SiteRssViewController&nbsp; extends ParameterizableViewController {<br />&nbsp;//&nbsp;Constants<br />&nbsp; /** Namespace URI for content:encoded elements */<br />&nbsp;&nbsp; private static final String CONTENT_NS =&quot;<a href="http://purl.org/rss/1.0/modules/content/">http://purl.org/rss/1.0/modules/content/</a>&quot;;<br />&nbsp;&nbsp; private static final String FEED_TYPE = &quot;type&quot;;<br />&nbsp;&nbsp; private static final String MIME_TYPE = &quot;application/xml; charset=UTF-8&quot;;<br />&nbsp;&nbsp; private static final String COULD_NOT_GENERATE_FEED_ERROR = &quot;Could not generate feed&quot;;<br />&nbsp;&nbsp; private static final String _defaultFeedType=&quot;rss_2.0&quot;;<br />&nbsp;&nbsp; private static final String DATE_FORMAT = &quot;yyyy-MM-dd&quot;;<br />&nbsp;&nbsp; //controller starts<br />&nbsp;&nbsp; private WeblogEntryManager weblogEntryManager;//spring依赖注入<br />&nbsp;&nbsp; private WebsiteManager websiteManager;&nbsp;//spring依赖注入<br />&nbsp;//spring依赖注入<br />&nbsp;&nbsp; public void setWeblogEntryManager(WeblogEntryManager weblogEntryManager) {<br />&nbsp;&nbsp;this.weblogEntryManager = weblogEntryManager;<br />&nbsp;&nbsp; }<br />&nbsp;//spring依赖注入<br />&nbsp;&nbsp; public void setWebsiteManager(WebsiteManager websiteManager) {<br />&nbsp;&nbsp;this.websiteManager = websiteManager;<br />&nbsp;&nbsp; }<br />&nbsp;<br />&nbsp;protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {<br />&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed feed = getFeed(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String feedType = request.getParameter(FEED_TYPE);//null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feedType = (feedType!=null) ? feedType : _defaultFeedType;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setFeedType(feedType);//rss_2.0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType(MIME_TYPE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeedOutput output = new SyndFeedOutput();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.output(feed,response.getWriter());//向发出请求的用户输出该RSS(xml格式)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (FeedException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String msg = COULD_NOT_GENERATE_FEED_ERROR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log(msg,ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;return null;<br />&nbsp;}<br />&nbsp;</div><div>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp; * 请求的类型如下:<br />&nbsp;&nbsp;&nbsp; * siteRss.htm?websiteId=21&nbsp;&nbsp;&nbsp;|ID=66的个人站点最新20条文章<br />&nbsp;&nbsp;&nbsp; * siteRss.htm?websiteId=21&amp;entryType=hot&nbsp;|ID=66的个人站点最热20条文章<br />&nbsp;&nbsp;&nbsp; *<br />&nbsp;&nbsp;&nbsp; * @param request<br />&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; protected SyndFeed getFeed(HttpServletRequest request) throws IOException,FeedException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //feed就是channel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndFeed feed = new SyndFeedImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //item集合<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List entries = new ArrayList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一个entry就是代表一个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndEntry entry;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SyndContent description;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setFeed(request,feed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator iterator = setIterator(request);<br />&nbsp;&nbsp;//将文章的20记录转成20个item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(iterator.hasNext()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;entry = new SyndEntryImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;WeblogEntry weblogEntry = (WeblogEntry)iterator.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;entry.setTitle(weblogEntry.getTitle());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;entry.setLink(feed.getLink()+&quot;?weblogEntryId=&quot;+weblogEntry.getId());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;entry.setPublishedDate(dateParser.parse(weblogEntry.getPubTime().toString()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;catch (ParseException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//该item的description<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;description = new SyndContentImpl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;description.setType(&quot;text/plain&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String text=null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(weblogEntry.getText().length()&gt;500){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;text = weblogEntry.getText().substring(0, 500);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;text = weblogEntry.getText();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;description.setValue(text);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;entry.setDescription(description);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;addFooter(entry);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;entries.add(entry);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将所有的item存入channel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed.setEntries(entries);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return feed;<br />&nbsp;&nbsp; }<br />&nbsp;private SyndFeed setFeed(HttpServletRequest request,SyndFeed feed){<br />&nbsp;&nbsp;&nbsp; //blog中的website&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Website website = websiteManager.getWebsite(request.getParameter(&quot;websiteId&quot;));<br />&nbsp;&nbsp;&nbsp; 设置当前website的channel属性<br />&nbsp;&nbsp;&nbsp; feed.setTitle(website.getName());<br />&nbsp;&nbsp;&nbsp; feed.setAuthor(website.getCreator());<br />&nbsp;&nbsp;&nbsp; feed.setCopyright(website.getEmailAddress());<br />&nbsp;&nbsp;&nbsp; feed.setLink(&quot;<a href="http://wxz.vaga.com.cn:8080/blog/weblog/&quot;+website.getHandle">http://wxz.vaga.com.cn:8080/blog/weblog/&quot;+website.getHandle</a>());<br />&nbsp;&nbsp;&nbsp; feed.setDescription(website.getDescription());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return feed;&nbsp;&nbsp; <br />&nbsp;}</div><div>&nbsp;//从数据库中获得20条该website的文章<br />&nbsp;private Iterator setIterator(HttpServletRequest request){<br />&nbsp;&nbsp;if(request.getParameter(&quot;entryType&quot;)==null){<br />&nbsp;&nbsp;&nbsp;return weblogEntryManager.getRecentWeblogEntriesForRss(request.getParameter(&quot;websiteId&quot;), null, &quot;PUBLISHED&quot;, 21).iterator();<br />&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;return weblogEntryManager.getHotWeblogEntriesForRss(request.getParameter(&quot;websiteId&quot;), null, 21).iterator();<br />&nbsp;&nbsp;}<br />&nbsp;}</div><div><br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * Add footer to an entry.给每个文章摘要添加页脚<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param entry<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static void addFooter(SyndEntry entry)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Prep variables used in loops<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String title = entry.getTitle();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String link = entry.getLink();</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Use the add-on ContentModule to handle<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;content:encoded/&gt; elments within the feed<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContentModule module =((ContentModule) entry.getModule(CONTENT_NS));</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If content:encoded is found, use that.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(module!=null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Container for footer-appended HTML strings<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List newStringList = new ArrayList();</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Iterate through encoded HTML, creating footers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator oldStringIter =module.getEncodeds().iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (oldStringIter.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String original = (String) oldStringIter.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newStringList.add(createFooter(original,link, title));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set new encoded HTML strings on entry<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; module.setEncodeds(newStringList);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Fall back to adding footer in &lt;description/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This results in escaped HTML.&nbsp; Ugly, but common.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//Target the description node<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;SyndContent content = entry.getDescription();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create and set a footer-appended description<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String original = content.getValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content.setValue(createFooter(original,link, title));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * Create a feed item footer of immediate actions<br />&nbsp;&nbsp;&nbsp;&nbsp; * by using information from the feed item itself<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param original&nbsp; The original text of the feed item<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param link&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The link for the feed item<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param title&nbsp;&nbsp;&nbsp;&nbsp; The title of the feed item<br />&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; private static String createFooter(String original, String link,String title)<br />&nbsp;&nbsp;&nbsp; {&nbsp;<br />&nbsp;&nbsp;&nbsp; &nbsp;// Use StringBuffer to create a sb<br />&nbsp;&nbsp;&nbsp; &nbsp;StringBuffer sb;<br />&nbsp;&nbsp;&nbsp; &nbsp;if(original==null){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;sb=new StringBuffer(&quot;&lt;br /&gt;&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;}else{<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;sb= new StringBuffer(original);<br />&nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;\n\n&lt;div class='feedwarmer'&gt;&lt;hr/&gt;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;i&gt;相关操作:&lt;/i&gt; &quot;);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add email link using title and item link<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;a href='mailto:?body=Check this out: &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(link).append(&quot;'&gt;推荐该链接&lt;/a&gt; | &quot;);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add delicious link using item title link<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;a href='http://del.icio.us/post/?url=&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(link).append(&quot;&amp;title=&quot;).append(title);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;'&gt;添加到delicious&lt;/a&gt; | &quot;);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add Google Blogs Search link using item title<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;a href='http://blogsearch.google.com/&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;blogsearch?hl=en&amp;q=&quot;).append(title);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;'&gt;搜索相关内容&lt;/a&gt;&quot;);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Finish and return the sb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(&quot;&lt;/div&gt;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sb.toString();<br />&nbsp;&nbsp;&nbsp; }<br />}</div>&nbsp;<br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75151#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Feb 2007 16:04:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75151</link>
        <guid>http://nemy.javaeye.com/blog/75151</guid>
      </item>
      <item>
        <title>Java开源RSS组件包（Java Open Source RSS Lib Packages）</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75152" style="color:red;">http://nemy.javaeye.com/blog/75152</a>&nbsp;
          发表时间: 2007年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>* RSSLibJ</p><p>RSSLibJ是一个专门读取和生成RSS的小巧实用的Java库，大小仅25k。</p><p>* RSSLib4J</p><p>RSSLib4J 是一套用于从RSS Feed解析和检索信息的Java API。它支持RSS version0.9x ,1.0和2.0规范，Doublin内核和Syndication名字空间。</p><p>* BlogBridge</p><p>BlogBridge是一个RSS阅读器/合成器，专为阅读和处理大量RSS feed的人而提供。这些典型的有Weblogs, 但也有其它类型的RSS feed。</p><p>* Flock</p><p>Flock是一种RSS/RDF用Java编写的信息集成器。它是一种server-side应用程序，带有一个浏览器。</p><p>* RSSOwl</p><p>RSSOwl 是一个完全用 Java 的SWT快速图形库开发的 RSS / RDF / Atom 新闻阅读器。按类别读取新闻，分类存储收藏信息，导出为 PDF / RTF / HTML / OPML，从 OPML格式导入，支持全文本搜索，使用Internet浏览器。</p><p>* Informa</p><p>Informa提供一个基于Java的RSS类库.它支持导出,导入,存储,搜索等。</p><p>* Jena</p><p>Jena 是一个由HP实验室开发的表示和处理半结构化数据（主要是基于RDF的管理、查询等）的Java开源项目。目前是Jena2版本，Jena1做到了支持 RDF的数据表达、解析、查询（采用RDQL）和简单的推理，Jena2的目标在支持本体（包括DAML、RDFS和OWL的应用程序接口API）。</p><p>* RSS Reader</p><p>RSS Reader提供了一个Java API和一个图形客户端来分析与显示RSS格式的内容。</p><p>* Schema</p><p>Schema是一个利用RDF与RDF Schema进行存储,查询,讨论(reasoning )的Java开源框架.Sesame既可以当作RDF与 RDF Schema的数据库或当作一个Java 库用来为应用程序提供RDF的功能.</p><p>* RSS Notifier</p><p>RSS Notifier是一个RSS Feed阅读器,它设计成一个Window托盘程序随Windows的启动一起加载.它用基于使用RSS文件的新闻订阅方式来阅读即时新闻.</p><p>* Sesame</p><p>inferencing是一个用于存储,查询,解析RDF的Java框架.它可被配置作为一个web服务器或当一个Java包来使用.它的特点包括3种查询语言(SeRQL, RQL, RDQL),支持内存(RAM),磁盘(disk),与RDBMS存储.</p><p>* FaceRSS</p><p>FaceRSS是一个简单的JSF组件,它可以从指定的RSS url读取新闻并展示出来。 FaceRSS基于rsslib4j这个开源包进行构建所以它支持RSS 0.9x,1.0,和2.0。</p><p>* ROME</p><p>ROME是一组Atom/RSS工具类它使得用Java来操作大部份syndication格式变得更加容易: <br /># RSS 0.90 <br /># RSS 0.91 Netscape <br /># RSS 0.91 Userland <br /># RSS 0.92 <br /># RSS 0.93 <br /># RSS 0.94 <br /># RSS 1.0 <br /># RSS 2.0 <br /># Atom 0.3 <br /># Atom 1.0 <br />ROME不仅包括各种syndication feeds的解析器与生成器,而且还包括能够把一种格式转换成另外一种格式的转换器。</p><p>* HORRORss</p><p>HORRORss是一个简单的RSS(RSS0.9x,RSS.0,RSS2.0)解析包。它支持Atom feeds，但并没有完全符合Atom规范。只能支持一些基本的feed元素：title,link,author,和description。</p>&nbsp;<br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75152#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Feb 2007 16:02:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75152</link>
        <guid>http://nemy.javaeye.com/blog/75152</guid>
      </item>
      <item>
        <title>acegi参考手册(v1.0.4)</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75154" style="color:red;">http://nemy.javaeye.com/blog/75154</a>&nbsp;
          发表时间: 2007年02月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center">&nbsp;&nbsp;<strong> 第三章. 协助系统</strong></p><p>本章介绍一些Acegi Security使用的附加和协助系统。那些和安全无关，但是包含在Acegi Security项目中的部分，将会在本章中讨论</p><p><strong>3.1. 本地化</strong></p><p>Acegi Security支持对终端客户可能会看到的异常信息进行本地化。如果你的应用是为英文用户设计的，那么你什么都不用做，因为Acegi Security的所有消息默认都是英文的。如果你要支持其他区域用户，那么本节包含了你所需要了解的所有东西。</p><p>包括认证失败或者访问被拒绝（授权失败）的所有异常消息都可以被本地化。提供给开发者或者系统部署人员的异常或者日志信息(包括错误的属性、接口不符、构造器错误、debug级日志)没有被本地化，它们硬编码在Acegi Security的代码中。</p><p>在acegi-security-xx.jar（译注：xx代表版本号）的org.acegisecurity包中包含了一个 messages.properties文件。这个文件会被你的application context引用，因为Acegi Security实现了Spring的MessageSourceAware接口，它期待在application context启动的时候注入一个message resolver。通常你所需要做的是在你的application context中注册一个引用这个消息的bean，如下所示：</p><div class="code"><div class="codeContent"><pre class="code-java"><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;messageSource&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.context.</span></span></li><li class="alt"><span><span class="attribute-value">support.ReloadableResourceBundleMessageSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;basename&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>org/acegisecurity/messages</span></span></li><li class=""><span><span></span><span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></span></li><li class="alt"><span><span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div><br /></pre></div></div><p>messages.properties是按照资源包标准命名的，它代表了Acegi Securtiy支持的默认语言。文件默认是英文的。如果你不注册一个消息源，Acegi Security仍然可以正常工作，它会用回硬编码的英文消息。</p><p>如果你想定制messages.properties文件，或者支持其他语言，那么你应该copy这个文件，然后重命名，并在上述的bean定义中 注册。因为文件中的key并不多，因此本地化花不了多少工夫。如果你针对消息文件进行了本地化，那么请和社区分享，你可以添加一个JIRA任务，将你正确 命名的messages.properties本地化文件作为附件添加。</p><p>为了完善关于本地化的讨论需要知道Spring的ThreadLocal org.springframework.context.i18n.LocaleContextHolder。你应该为每个用户设置代表他区域的 LocaleContextHolder。Acegi Security会尝试从这个ThreadLocal中获取的Locale来从消息源中获取消息。请参考Spring的文档以获取更多使用 LocaleContextHolder和能够帮你自动设置它的辅助类(例如</p><p>AcceptHeaderLocaleResolver, CookieLocaleResolver, FixedLocaleResolver, SessionLocaleResolver 等)的详细信息。</p><p><strong>3.2. Filters</strong></p><p>正如你在整个手册中看到的那样，Acegi Security使用很多filter。你可以使用FilterToBeanProxy或者FilterChainProxy来确定这些是怎样加入到你的web应用中的，下面我们来看看。</p><p>大部分filter使用FilterToBeanProxy来配置。例如下面web.xml中配置所示：</p><div class="code"><div class="codeContent"><pre class="code-java"><filter></filter><init></init><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>Acegi&nbsp;HTTP&nbsp;Request&nbsp;Security&nbsp;Filter</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>org.acegisecurity.util.FilterToBeanProxy</span><span class="tag">&lt;/</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>targetClass</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>org.acegisecurity.ClassThatImplementsFilter</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="tag">&lt;/</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><br /></pre></div></div><p>注意在web.xml中的filter实际上是一个FilterToBeanProxy，而不是真正实现filter逻辑的filter。 FilterToBeanProxy所作的是代理Filter的方法到一个从Spring的application context 获取的bean。这使得这个bean可以享受Spring application context的生命周期支持以及配置灵活性。这个bean必须实现javax.servlet.Filter。</p><p>FilterToBeanProxy只需要一个简单的初始化参数，targetClass或者targetBean。targetClass会定位 application context中指定的类的第一个对象，而FilterToBeanProxy按照bean的名字定位对象。象标准的Spring web应用一样，FilterToBeanProxy使用 WebApplicationContextUtils.getWebApplicationContext(ServletContext)来访问 application context，所以你应该在web.xml中配置一个ContextLoaderListener。 </p><p>&nbsp;</p><p>在IoC容器而不是servlet容器中部署Filter会有一个生命周期的问题。特别是，哪个容器应该负责调用Filter的&quot;startup&quot; 和 &quot;shutdown&quot;方法？注意到Filter的初始化和析构顺序随servlet容器不同而不同，如果一个Filter依赖于由另一个更早初始化的 Filter的配置，这样就会出现问题。另一方面，Spring IoC具备更加完善的生命周期/IoC接口（例如InitializingBean, DisposableBean, BeanNameAware, ApplicationContextAware以及其他许多）以及一个容易理解的接口契约（interface contract），可预见的方法调用顺序，自动装配支持，以及可以避免实现Spring接口的选项（例如Spring XML中的destroy-method 属性）。因此，我们推荐尽可能使用Spring生命周期服务而不是servlet容器生命周期服务。FilterToBeanProxy默认不会将 init(FilterConfig) 和 destroy()方法委派到被代理的bean。如果你需要这些调用被委派，那么将lifecycle初始化参数设置为servlet- container-managed。</p><p>我们强烈推荐你使用FilterChainProxy而不是FilterToBeanProxy。虽然FilterToBeanProxy是一个非 常有用的类FilterToBeanProxy，问题是当web.xml中filter变多时，<filter></filter> 和 <filter></filter>项就会太多而变得臃肿不堪。为了解决这个问题，Acegi Security提供一个FilterChainProxy类。它在FilterToBeanProxy中被装配（正如上面例子中所示），但目标类 （target class）是org.acegisecurity.util.FilterChainProxy。这样过滤器链（filter chain）可以在application context中按照如下代码配置：</p><div class="code"><div class="codeContent"><pre class="code-java"><bean class="code-quote" id="&lt;span"></bean><property name="&lt;span" class="code-quote"><value></value></property><div class="code_title">xml 代码</div><div class="dp-highlighter"><div class="bar">&nbsp;</div><ol class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;filterChainProxy&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.acegisecurity.util.FilterChainProxy&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;filterInvocationDefinitionSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PATTERN_TYPE_APACHE_ANT&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/webServices/*=httpSessionContextIntegrationFilterWithASCFalse,</span></li><li class=""><span>            basicProcessingFilter,exceptionTranslationFilter,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*=httpSessionContextIntegrationFilterWithASCTrue,</span></li><li class="alt"><span>           authenticationProcessingFilter,exceptionTranslationFilter,</span></li><li class="alt"><span>filterSecurityInterceptor&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li><li class=""><span><span class="tag">&lt;!--&lt;/span--&gt;<span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></span></li></ol></div>&nbsp;&nbsp;&nbsp; <br /></pre></div></div><p>你可能注意到FilterSecurityInterceptor定义方式的相似之处。同时支持正则表达式和Ant Paths格式，越对应的URI越早出现。在运行时，FilterChainProxy会定位符合当前的web请求的第一个URI模式。每个对应的配置属 性代表了在application context中定义的一个bean的名字。接着fiter会按照它们被指定的顺序，按照FilterChain的标准行为模式被调用(如果一个 Filter决定停止处理，它可以不在chain中执行)。</p><p>如你所见，FilterChainProxy需要为不同的请求模式重复配置filter的名字（在上面的例子中，, exceptionTranslationFilter 和 filterSecurityInterceptor 是重复的）。这样的设计是为了让FilterChainProxy能够为不同的URI配置不同的filter调用顺序，同时也提高了表达力（针对正则表达 式、Ant Paths、以及任何FilterInvocationDefinitionSource的特定实现）和清晰度，可以知道是哪个filter应该被调用。</p><p>你可能注意到了我们在filter chain定义了两个HttpSessionContextIntegrationFilter (ASC是allowSessionCreation的缩写,是HttpSessionContextIntegrationFilter的一个属性)。 因为web服务不会为将来的请求提供一个jsessionid，为这样的用户创建HttpSessions是浪费的。如果你有一个需要最大限度的伸缩性的 高容量的应用，我们建议你使用上述的方法。对于小的应用，使用单一的HttpSessionContextIntegrationFilter (默认的allowSessionCreation设为true)应该足够了。</p><p>说到生命周期问题，如果对FilterChainProxy自身调用init(FilterConfig) 和 destroy()方法，它会把它代理到底层的filter。这样FilterChainProxy保证只初始化和析构每个filter一次，不论它在 FilterInvocationDefinitionSource中定义了多少次。你可以通过FilterToBeanProxy的lifecycle 初始化参数来控制这些方法是否被调用。如上面所讨论的那样，默认所有servlet容器生命周期调用是不被代理到FilterChainProxy的。</p><p>在web.xml中定义的filter的顺序是非常重要的。不管你实际用到哪个filter，<filter></filter>的顺序应该是如下所示的：</p><p>1．ChannelProcessingFilter，因为可能要重定向到另一种协议。</p><p>2．ConcurrentSessionFilter 因为不使用任何SecurityContextHolder的功能，但是需要更新SessionRegistry来表示当前的发送请求的principal。</p><p>3． HttpSessionContextIntegrationFilter, 这样当一个web请求开始的时候就可以在SecurityContextHolder中设置一个SecurityContext，当web请求结束的时候 任何对SecurityContext的改动都会被copy到HttpSession（以备下一个web请求使用）。</p><p>4．Authentication processing mechanisms - AuthenticationProcessingFilter, CasProcessingFilter, BasicProcessingFilter, HttpRequestIntegrationFilter, JbossIntegrationFilter 等 - 修改SecurityContextHolder，使其中包含一个有效的认证请求令牌（token）。</p><p>5．SecurityContextHolderAwareRequestFilter, 如果你使用它来在你的servlet容器中安装一个Acegi Security aware HttpServletRequestWrapper。</p><p>6．RememberMeProcessingFilter, 如果早期的认证处理过程没有更新SecurityContextHolder，并且请求（request）提供了一个cookie启用remember- me服务，一个合适的被记住的Authentication对象会被放到SecurityContextHolder那里。</p><p>7．AnonymousProcessingFilter, 如果早期的认证处理过程没有更新SecurityContextHolder，, 一个匿名Authentication 对象会被放到SecurityContextHolder那里。</p><p>8．ExceptionTranslationFilter, 捕获所有的Acegi Security 异常，这样要么返回一个HTTP错误响应或者加载一个对应的AuthenticationEntryPoint。</p><p>9．FilterSecurityInterceptor, 保护 web URIs</p><p>所有上述的filter使用FilterToBeanProxy或FilterChainProxy。建议在一个应用中使用一个单个的 FilterToBeanProxy代理到一个单个的FilterChainProxy。，在FilterChainProxy中定义所有的Acegi Security Filters。如果你使用SiteMesh，确保Acegi Security filters 在 SiteMesh filters调用前调用。这样使SecurityContextHolder在SiteMesh decorator使用前能够及时被装配。</p>&nbsp;<br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75154#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 Feb 2007 00:24:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75154</link>
        <guid>http://nemy.javaeye.com/blog/75154</guid>
      </item>
      <item>
        <title>javax.servlet.Filter 的应用</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75155" style="color:red;">http://nemy.javaeye.com/blog/75155</a>&nbsp;
          发表时间: 2007年02月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px"><h2>&nbsp;</h2></div><div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px"><table width="100%">    <tbody>        <tr>            <td>            <div id="art" style="MARGIN: 15px">            <div><font size="3">Filter过滤器的使用<br />本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证.实现以上两个功能需以下几个步骤:<br />1、实现javax.servlet.Filter接口，编写两个类，如下：</font></div>            <div><font size="3">/**<br />&nbsp;* 作用：过滤编码<br />&nbsp;*/<br />package filter;<br />import java.io.IOException;<br />import javax.servlet.*;<br />import javax.servlet.http.HttpServletRequest;<br />public class EncodingFilter implements Filter<br />{<br />&nbsp;&nbsp;&nbsp; protected FilterConfig filterConfig;<br />&nbsp;&nbsp;&nbsp; private String targetEncoding;<br />&nbsp;&nbsp;&nbsp; public EncodingFilter()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targetEncoding = &quot;gb2312&quot;;//直接初始化0912<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterconfig) throws ServletException<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = filterconfig;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //targetEncoding = filterconfig.getInitParameter(&quot;encoding&quot;);//web.xml挂参初始化<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest httpservletrequest = (HttpServletRequest)servletrequest;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; httpservletrequest.setCharacterEncoding(targetEncoding);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;使用&quot; targetEncoding &quot;对请求进行编码过滤&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterchain.doFilter(servletrequest, servletresponse);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setFilterConfig(FilterConfig filterconfig)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = filterconfig;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void destroy()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = null;<br />&nbsp;&nbsp;&nbsp; }<br />}</font></div>            <div><font size="3">/**<br />&nbsp;* 作用：过滤外界非法的进入页面<br />&nbsp;* 注意：使用该功能时，一定要把登录页与被过滤文件夹设为同级，否则会出现循环<br />&nbsp;*/<br />package filter;<br />import java.io.IOException;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />public class ManageFilter implements Filter<br />{<br />&nbsp;&nbsp;&nbsp; String LOGIN_PAGE;<br />&nbsp;&nbsp;&nbsp; protected FilterConfig filterConfig;<br />&nbsp;&nbsp;&nbsp; public ManageFilter()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOGIN_PAGE = &quot;/login.jsp&quot;;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = (HttpServletRequest) servletrequest;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response = (HttpServletResponse) servletresponse;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String key = &quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通过验证时在session中存的一个标志<br />&nbsp;&nbsp;&nbsp;&nbsp; key = (String) session.getAttribute(&quot;key&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key!= null&amp;&amp;key.equals(&quot;ok&quot;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterchain.doFilter(servletrequest, servletresponse);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect(LOGIN_PAGE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;被拦截一个未认证的请求&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception exception)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exception.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void setFilterConfig(FilterConfig filterconfig)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = filterconfig;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void destroy()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = null;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterconfig)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filterConfig = filterconfig;<br />&nbsp;&nbsp;&nbsp; }<br />}</font></div>            <div><font size="3">2、在web.xml中做一些设置<br />&nbsp;<filter></filter><br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>code<br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>filter.EncodingFilter<br />&nbsp;<br />&nbsp;<br />&nbsp;<filter></filter><br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>manage<br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>filter.ManageFilter<br />&nbsp;<br />&nbsp;<filter></filter><br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>code<br />&nbsp;&nbsp;&nbsp;&nbsp; <url></url>/*<br />&nbsp;<br />&nbsp;<br />&nbsp;<filter></filter><br />&nbsp;&nbsp;&nbsp;&nbsp; <filter></filter>manage<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- &lt;url-pattern&gt;/ShuiBaoRHPWK_NEW/system/ruhepaiwukou/*&lt;/url-pattern&gt;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; <url></url>/servlets-examples/*<br /></font></div>            </div>            </td>        </tr>    </tbody></table></div><br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75155#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 Feb 2007 00:10:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75155</link>
        <guid>http://nemy.javaeye.com/blog/75155</guid>
      </item>
      <item>
        <title>大学毕业后的第一份工作</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75156" style="color:red;">http://nemy.javaeye.com/blog/75156</a>&nbsp;
          发表时间: 2007年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2006年6月底,大学毕业,心理不知道是高兴,还是悲伤,在学校拿到毕业证后当天,一晚也没停留,跟着几个很好要好的同学分离之后,开始离开了待了4年的母校---江西师范大学.&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面队着大学生活的结束,心里不知道怎么搞的,有一种不好受的感觉,很不是滋味.也许是因为跟四年的同窗要分别的缘故吧,或也许是不能过着大学那种无忧无虑的生活吧,或也许是开始要为自己的职业生涯做初步的谋划吧.总之这一切一切的原因弄得自己实在是有点伤感.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 离开学校后,我跟同了四年的室友,老同学盖盖和一个朋友一起做火车奔赴广州,开始着自己大学毕业后的第一份工作.面对着这份工作,自己也不知道说什么可好.不知道是应该高兴还是伤心.因为在大四毕业前夕,我曾在福建星网锐捷股份有限公司有一份工作,当时在那里是做软件测试,虽说那边的条件和各种情况应该说都还可以,但自己还是有点很不满意,总感觉还没有找到自己心目中理想的岗位(大学自己一直都想过,毕业开始要做程序员,要做JAVA程序员,现在做测试,是否跟原来的计划有出入否?心里老想着.),面对着这一些心里感觉不顺心的缘故和自己的理想,我不顾亲人的反对,坚决果断的辞掉了福建星网锐捷股份有限公司的那份工作,义无反顾的做着火车到人生地不熟的广州找工作,当时老广州,真愧有室友丁崽和其他大学同学的帮助,总算有了个落脚的地方,心想能开始好好的找工作了,一定能好好的找个好工作了(因为自己觉得自己的水平还可以,应该能找个好工作,&quot;真是后生可畏,不知天高地厚,不知道外面的高手如云&quot;).经过好多次的网上投简历、面试、失败之后,终于找到了一个自己觉得还可以的工作单位,当时心里太高兴了,,心想终于找到了一个自己满意的工作--JAVA软件工程师.也就从此公司开始,真正开始着我大学毕业后的第一份工作.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ７月３日，我开始正式工作．面对着这份工作，说实话，开始的确非常满意，工资虽然不高，但日子过得实在，又是自己想的技术职位．初到公司，什么都不熟悉，什么都不懂，因为我参与公司的项目是广州市移动的大项目，用的技术都是ＪＡＶＡ比较流行的，包括spring hibernate webwork ，采用的是ＭＶＣ开发模式．面对着这一些不懂的技术，不熟悉的同事，说实话，很有压力．但也没办法，自己认命吧，既然做了这一个行业，就得踏踏实实的干．经过自己一凡的努力和认真工作，没想到不知不觉在公司，都差不多呆了半年了．呵呵．说实话，对于第一份工作，真是一言难尽．．．</p><br /><br /><p id="TBPingURL"></p>
          <br/>
          <span style="color:red;">
            <a href="http://nemy.javaeye.com/blog/75156#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 27 Jan 2007 23:09:00 +0800</pubDate>
        <link>http://nemy.javaeye.com/blog/75156</link>
        <guid>http://nemy.javaeye.com/blog/75156</guid>
      </item>
      <item>
        <title>40种网站设计常用技巧</title>
        <author>nemy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nemy.javaeye.com">nemy</a>&nbsp;
          链接：<a href="http://nemy.javaeye.com/blog/75157" style="color:red;">http://nemy.javaeye.com/blog/75157</a>&nbsp;
          发表时间: 2007年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;<p>1. oncontextmenu=&quot;window.event.returnValue=false&quot; 将彻底屏蔽鼠标右键<br />&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt; 可用于Table</p><p>2. &lt;body onselectstart=&quot;return false&quot;&gt; 取消选取、防止复制</p><p>3. onpaste=&quot;return false&quot; 不准粘贴</p><p>4. oncopy=&quot;return false;&quot; oncut=&quot;return false;&quot; 防止复制</p><p>5. &lt;link rel=&quot;Shortcut Icon&quot; href=&quot;favicon.ico&quot;&gt; IE地址栏前换成自己的图标</p><p>6. &lt;link rel=&quot;Bookmark&quot; href=&quot;favicon.ico&quot;&gt; 可以在收藏夹中显示出你的图标</p><p>7. &lt;input style=&quot;ime-mode:disabled&quot;&gt; 关闭输入法</p><p>8. 永远都会带着框架<br />&lt;script language=&quot;JavaScript&quot;&gt;&lt;!--<br />if (window == top)top.location.href = &quot;frames.htm&quot;; //frames.htm为框架网页<br />// --&gt;&lt;/script&gt;</p><p>9. 防止被人frame<br />&lt;SCRIPT LANGUAGE=JAVASCRIPT&gt;&lt;!-- <br />if (top.location != self.location)top.location=self.location;<br />// --&gt;&lt;/SCRIPT&gt;</p><p>10. 网页将不能被另存为<br />&lt;noscript&gt;&lt;iframe src=&quot;/blog/*.html&gt;&quot;;&lt;/iframe&gt;&lt;/noscript&gt; </p><p>11. &lt;input type=button value=查看网页源代码 <br />onclick=&quot;window.location = &quot;view-source:&quot;+ &quot;<a href="http://www.williamlong.info/">http://www.williamlong.info</a>&quot;&quot;&gt;</p><p>12.删除时确认<br />&lt;a href=&quot;javascript:if(confirm(&quot;确实要删除吗?&quot;))location=&quot;boos.asp?&amp;areyou=删除&amp;page=1&quot;&quot;&gt;删除&lt;/a&gt; </p><p>13. 取得控件的绝对位置<br />//Javascript<br />&lt;script language=&quot;Javascript&quot;&gt;<br />function getIE(e){<br />var t=e.offsetTop;<br />var l=e.offsetLeft;<br />while(e=e.offsetParent)<br />alert(&quot;top=&quot;+t+&quot;/nleft=&quot;+l);<br />}<br />&lt;/script&gt;</p><p>//VBScript<br />&lt;script language=&quot;VBScript&quot;&gt;&lt;!--<br />function getIE()<br />dim t,l,a,b<br />set a=document.all.img1<br />t=document.all.img1.offsetTop<br />l=document.all.img1.offsetLeft<br />while a.tagName&lt;&gt;&quot;BODY&quot;<br />set a = a.offsetParent<br />t=t+a.offsetTop<br />l=l+a.offsetLeft<br />wend<br />msgbox &quot;top=&quot;&amp;t&amp;chr(13)&amp;&quot;left=&quot;&amp;l,64,&quot;得到控件的位置&quot;<br />end function<br />--&gt;&lt;/script&gt;</p><p>14. 光标是停在文本框文字的最后<br />&lt;script language=&quot;javascript&quot;&gt;<br />function cc()<br />{<br />var e = event.srcElement;<br />var r =e.createTextRange();<br />r.moveStart(&quot;character&quot;,e.value.length);<br />r.collapse(true);<br />r.select();<br />}<br />&lt;/script&gt;<br />&lt;input type=text name=text1 value=&quot;123&quot; onfocus=&quot;cc()&quot;&gt;</p><p>15. 判断上一页的来源<br />javascript:<br />document.referrer</p><p>&nbsp;16. 最小化、最大化、关闭窗口<br />&lt;object id=hh1 classid=&quot;clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11&quot;&gt; <br />&lt;param name=&quot;Command&quot; value=&quot;Minimize&quot;&gt;&lt;/object&gt;<br />&lt;object id=hh2 classid=&quot;clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11&quot;&gt; <br />&lt;param name=&quot;Command&quot; value=&quot;Maximize&quot;&gt;&lt;/object&gt;<br />&lt;OBJECT id=hh3 classid=&quot;clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11&quot;&gt;<br />&lt;PARAM NAME=&quot;Command&quot; VALUE=&quot;Close&quot;&gt;&lt;/OBJECT&gt;<br />&lt;input type=button value=最小化 onclick=hh1.Click()&gt;<br />&lt;input type=button value=最大化 onclick=hh2.Click()&gt;<br />&lt;input type=button value=关闭 onclick=hh3.Click()&gt;<br />本例适用于IE</p><p>17.屏蔽功能键Shift,Alt,Ctrl<br />&lt;script&gt;<br />function look(){ <br />if(event.shiftKey) <br />alert(&quot;禁止按Shift键!&quot;); //可以换成ALT　CTRL<br />} <br />document.onkeydown=look; <br />&lt;/script&gt;</p><p>18. 网页不会被缓存<br />&lt;META HTTP-EQUIV=&quot;pragma&quot; CONTENT=&quot;no-cache&quot;&gt;<br />&lt;META HTTP-EQUIV=&quot;Cache-Control&quot; CONTENT=&quot;no-cache, must-revalidate&quot;&gt;<br />&lt;META HTTP-EQUIV=&quot;expires&quot; CONTENT=&quot;Wed, 26 Feb 1997 08:21:57 GMT&quot;&gt;<br />或者&lt;META HTTP-EQUIV=&quot;expires&quot; CONTENT=&quot;0&quot;&gt;</p><p>19.怎样让表单没有凹凸感？<br />&lt;input type=text style=&quot;border:1 solid #000000&quot;&gt; <br />或<br />&lt;input type=text style=&quot;border-left:none; border-right:none; border-top:none; border-bottom: </p><p>1 solid #000000&quot;&gt;&lt;/textarea&gt;</p><p>20.&lt;div&gt;&lt;span&gt;&amp;&lt;layer&gt;的区别？ <br />&lt;div&gt;(division)用来定义大段的页面元素，会产生转行 <br />&lt;span&gt;用来定义同一行内的元素，跟&lt;div&gt;的唯一区别是不产生转行 <br />&lt;layer&gt;是ns的标记，ie不支持，相当于&lt;div&gt;</p><p>21.让弹出窗口总是在最上面:<br />&lt;body onblur=&quot;this.focus();&quot;&gt;</p><p>22.不要滚动条? <br />让竖条没有: <br />&lt;body style=&quot;overflow:scroll;overflow-y:hidden&quot;&gt; <br />&lt;/body&gt; <br />让横条没有: <br />&lt;body style=&quot;overflow:scroll;overflow-x:hidden&quot;&gt; <br />&lt;/body&gt; <br />两个都去掉？更简单了 <br />&lt;body scroll=&quot;no&quot;&gt; <br />&lt;/body&gt; </p><p>23.怎样去掉图片链接点击后，图片周围的虚线？<br />&lt;a href=&quot;#&quot; onFocus=&quot;this.blur()&quot;&gt;&lt;img src=&quot;/blog/logo.jpg&quot; border=0&gt;&lt;/a&gt;</p><p>24.电子邮件处理提交表单<br />&lt;form name=&quot;form1&quot; method=&quot;post&quot; action=&quot;<a href="mailto:****@***.com">mailto:****@***.com</a>&quot; enctype=&quot;text/plain&quot;&gt; <br />&lt;input type=submit&gt;<br />&lt;/form&gt;</p><p>25.在打开的子窗口刷新父窗口的代码里如何写？<br />window.opener.location.reload()</p><p>26.如何设定打开页面的大小<br />&lt;body onload=&quot;top.resizeTo(300,200);&quot;&gt;<br />打开页面的位置&lt;body onload=&quot;top.moveBy(300,200);&quot;&gt;</p><p>27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 <br />&lt;STYLE&gt; <br />body <br />{background-image:url(/blog/logo.gif); background-repeat:no-repeat; <br />background-position:center;background-attachment: fixed} <br />&lt;/STYLE&gt; </p><p>28. 检查一段字符串是否全由数字组成<br />&lt;script language=&quot;Javascript&quot;&gt;&lt;!--<br />function checkNum(str){return str.match(//D/)==null}<br />alert(checkNum(&quot;1232142141&quot;))<br />alert(checkNum(&quot;123214214a1&quot;))<br />// --&gt;&lt;/script&gt;</p><p>29. 获得一个窗口的大小<br />document.body.clientWidth; document.body.clientHeight</p><p>30. 怎么判断是否是字符<br />if (/[^/x00-/xff]/g.test(s)) alert(&quot;含有汉字&quot;);<br />else alert(&quot;全是字符&quot;);</p><p>31.TEXTAREA自适应文字行数的多少<br />&lt;textarea rows=1 name=s1 cols=27 onpropertychange=&quot;this.style.posHeight=this.scrollHeight&quot;&gt;<br />&lt;/textarea&gt;</p><p>32. 日期减去天数等于第二个日期<br />&lt;script language=Javascript&gt;<br />function cc(dd,dadd)<br />{<br />//可以加上错误处理<br />var a = new Date(dd)<br />a = a.valueOf()<br />a = a - dadd * 24 * 60 * 60 * 1000<br />a = new Date(a)<br />alert(a.getFullYear() + &quot;年&quot; + (a.getMonth() + 1) + &quot;月&quot; + a.getDate() + &quot;日&quot;)<br />}<br />cc(&quot;12/23/2002&quot;,2)<br />&lt;/script&gt;</p><p>33. 选择了哪一个Radio<br />&lt;HTML&gt;&lt;script language=&quot;vbscript&quot;&gt;<br />function checkme()<br />for each ob in radio1<br />if ob.checked then window.alert ob.value<br />next<br />end function<br />&lt;/script&gt;&lt;BODY&gt;<br />&lt;INPUT name=&quot;radio1&quot; type=&quot;radio&quot; value=&quot;style&quot; checked&gt;Style<br />&lt;INPUT name=&quot;radio1&quot; type=&quot;radio&quot; value=&quot;barcode&quot;&gt;Barcode<br />&lt;INPUT type=&quot;button&quot; value=&quot;check&quot; onclick=&quot;checkme()&quot;&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;</p><p>34.脚本永不出错<br />&lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; <br />&lt;!-- Hide <br />function killErrors() { <br />return true; <br />} <br />window.onerror = killErrors; <br />// --&gt; <br />&lt;/SCRIPT&gt;</p><p>35.ENTER键可以让光标移到下一个输入框<br />&lt;input onkeydown=&quot;if(event.keyCode==13)event.keyCode=9&quot;&gt;<br />36. 检测某个网站的链接速度：<br />把如下代码加入&lt;body&gt;区域中:<br />&lt;script language=Javascript&gt;<br />tim=1<br />setInterval(&quot;tim++&quot;,100)<br />b=1<br />var autourl=new Array()<br />autourl[1]=&quot;<a href="http://www.njcatv.net/">www.njcatv.net</a>&quot;<br />autourl[2]=&quot;javacool.3322.net&quot;<br />autourl[3]=&quot;<a href="http://www.sina.com.cn/">www.sina.com.cn</a>&quot;<br />autourl[4]=&quot;<a href="http://www.nuaa.edu.cn/">www.nuaa.edu.cn</a>&quot;<br />autourl[5]=&quot;<a href="http://www.cctv.com/">www.cctv.com</a>&quot;<br />function butt(){<br />document.write(&quot;&lt;form name=autof&gt;&quot;)<br />for(var i=1;i&lt;autourl.length;i++)<br />document.write(&quot;&lt;input type=text name=txt&quot;+i+&quot; size=10 value=&quot;/blog/测试中......&gt;&quot; =》&lt;input type=text <br />name=url&quot;+i+&quot; size=40&gt; =》&lt;input type=button value=GO </p><p>onclick=window.open(this.form.url&quot;+i+&quot;.value)&gt;&lt;br/&gt;&quot;)<br />document.write(&quot;&lt;input type=submit value=刷新&gt;&lt;/form&gt;&quot;)<br />}<br />butt()<br />function auto(url)<br />else</p><p>b++<br />}<br />function run(){for(var i=1;i&lt;autourl.length;i++)document.write(&quot;&lt;img src=http://&quot;+autourl+&quot;/&quot;+Math.random()+&quot; width=1 height=1 </p><p>onerror=auto(&quot;<a href="http://&quot;+autourl/">http://&quot;+autourl</a>+&quot;&quot;)&gt;&quot;)}<br />run()&lt;/script&gt;</p><p>37. 各种样式的光标<br />auto ：标准光标<br />default ：标准箭头<br />hand ：手形光标<br />wait ：等待光标<br />text ：I形光标<br />vertical-text ：水平I形光标<br />no-drop ：不可拖动光标<br />not-allowed ：无效光标<br />help ：?帮助光标<br />all-scroll ：三角方向标<br />move ：移动标<br />crosshair ：十字标<br />e-resize<br />n-resize<br />nw-resize<br />w-resize<br />s-resize<br />se-resize<br />sw-resize</p><p>38.页面进入和退出的特效<br />进入页面&lt;meta http-equiv=&quot;Page-Enter&quot; content=&quot;revealTrans(duration=x, transition=y)&quot;&gt;<br />推出页面&lt;meta http-equiv=&quot;Page-Exit&quot; content=&quot;revealTrans(duration=x, transition=y)&quot;&gt;&nbsp; <br />这个是页面被载入和调出时的一些特效。duration表示特效的持续时间，以秒为单位。transition表示使用哪种特效，取值为1-23:<br />　　0 矩形缩小 <br />　　1 矩形扩大 <br />　　2 圆形缩小<br />　　3 圆形扩大 <br />　　4 下到上刷新 <br />　　5 上到下刷新<br />　　6 左到右刷新 <br />　　7 右到左刷新 <br />　　8 竖百叶窗<br />　　9 横百叶窗 <br />　　10 错位横百叶窗 <br />　　11 错位竖百叶窗<br />　　12 点扩散 <br />　　13 左右到中间刷新 <br />　　14 中间到左右刷新<br />　　15 中间到上下<br />　　16 上下到中间 <br />　　17 右下到左上<br />　　18 右上到左下 <br />　　19 左上到右下 <br />　　20 左下到右上<br />　　21 横条 <br />　　22 竖条 <br />　　23 以上22种随机选择一种</p><p>39.在规定时间内跳转<br />&lt;META http-equiv=V=&quot;REFRESH&quot; content=&quot;5;URL=http://www.williamlong.info&quot;&gt; </p><p>40.网页是否被检索<br />&lt;meta name=&quot;ROBOTS&quot; content=&quot;属性值&quot;&gt;<br />　　其中属性值有以下一些:<br />　　属性值为&quot;all&quot;: 文件将被检索，且页上链接可被查询；<br />　　属性值为&quot;none&quot;: 文件不被检索，而且不查询页上的链接；<br />　　属性值为&quot;index&quot;: 文件将被检索；<br />　　属性值为&quot;follow&quot;: 查询页上的链接；<br />　　属性值为&quot;noindex&quot;: 文件不检索，但可被查询链接；<br />　　属性值为&quot;nofollow&quot;: 文件不被检索，但可查询页上的链接。</p><p>最大化窗口？<br />&lt;script language=&quot;JavaScript&quot;&gt;<br />&lt;!--<br />self.moveTo(0,0)<br />self.resizeTo(screen.availWidth,screen.availHeight)<br />//--&gt;<br />&lt;/script&gt;</p><p>&nbsp;</p><p><br />解决问题：由于层与下拉框之间的优先级是：下拉框 &gt; 层，因此在显示的时候，会因为优先级的次序而会出现如上问题。（如果几个元素都是层的话，我们可以通过层的 z-index 属性来设置）解决办法就是：给层中放一个优先级比下拉框更高的元素（iframe），从而解决此问题！具体解决代码如下：</p><p>&lt;div id=&quot;menu&quot; style=&quot;position:absolute; visibility:hidden; top:20px; left:20px; width:100px; height:200px; background-color:#6699cc;&quot;&gt