﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-备注学院-文章分类-Web开发</title><link>http://www.blogjava.net/smildlzj/category/27392.html</link><description>LuLu</description><language>zh-cn</language><lastBuildDate>Sun, 18 Oct 2009 17:04:12 GMT</lastBuildDate><pubDate>Sun, 18 Oct 2009 17:04:12 GMT</pubDate><ttl>60</ttl><item><title>多站点整合—单点登录简单方案 </title><link>http://www.blogjava.net/smildlzj/articles/298132.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Tue, 13 Oct 2009 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/298132.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/298132.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/298132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/298132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/298132.html</trackback:ping><description><![CDATA[<p><span class="content" id="fontzoom">问题描述：在一个比较复杂的网站环境下。有多个产品向外提供服务。每个产品下都有自己的用户登录界面。现在需要设计一个统一的登录界面。当用户在这个界面登录后就可以自由的使用各个产品和服务。同时意味着用户用一个帐号可以在不同服务里登录，另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去。<br />
<br />
实际应用：Sohu的Passport将focus.cn，17173.com，sogou.com，chinaren.com这四个域名下的产品全部整合在一起了。用户在这四个站点中任何一个地方都可以登录。当用户登录后可以自由的使用其他域名下的服务。现在很多网站上都有bbs blog album服务。这些服务一般也是自己维护自己的用户信息。当发展到一定时候，也需要一个Passport机制整合所有服务，使用户可以单点登录。<br />
<br />
<strong><font color="#ff0000">Sohu的实现方案</font></strong><br />
在<a href="http://passport.sohu.com/" target="_blank" tip>http://passport.sohu.com/</a> 登录后 fiddler可以拦截到如下的返回信息：<br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220611_tqixsso1.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220611_tqixsso1.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
由于passport.sohu.com的登录界面使用了iframe隐藏提交。所以页面没有看到刷新。隐藏的iframe把用户名和加密的password和其他信息发送给了passport.sohu.com。passport.sohu.com在Response中设置了成功登录的cookie。这个cookie可以证实这个用户成功登录了passport.sohu.com。<br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220615_if8lsso2.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220615_if8lsso2.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
当用户在Passport成功登录后。客户端的Javascript根据成功登录的标志，操作iframe请求<a href="http://passport.sohu.com/sso/crossdomain_all.jsp?action=login" target="_blank" tip>http://passport.sohu.com/sso/crossdomain_all.jsp?action=login</a> 因为在同一个域名下，没有跨域，在这次请求中，上次成功登陆的cookie会被一并带着回去。服务器端检查到成功登录的cookie后会Render回一段同时登录多个站点的html。 <br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220619_74vasso3.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220619_74vasso3.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
这段html 要向4个地址发送请求。截至到现在都是在相同的Domain(passport.sohu.com)请求和返回，为真正的跨站点登录做准备，真正的跨站点登录还没有开始。下面passport.sohu.com通过sso/crossdomain.jsp 在服务器端进行Redirect 设置http head 为302进行跳转。跳转后在这个跳转后的域名下设置登录成功的cookie。这就是sohu实现跨站点登录的核心过程。下面是passport.sohu.com登录17173.com的过程。<br />
1.&nbsp;&nbsp;通过<a href="http://passport.sohu.com/sso/crossdomain_all.jsp?action=login" target="_blank" tip>http://passport.sohu.com/sso/crossdomain_all.jsp?action=login</a> Render回来的script &lt;script type="text/javascript" src="<a href='http://passport.sohu.com/sso/crossdomain.jsp?action=login&amp;domain=17173.com"></script>
' target=_blank tip href_cetemp='http://passport.sohu.com/sso/crossdomain.jsp?action=login&amp;domain=17173.com"></script>
'>http://passport.sohu.com/sso/crossdomain.jsp?action=login&amp;domain=17173.com"&gt;&lt;/script&gt;</a> 请求同域下的<a href="http://passport.sohu.com/sso/crossdomain.jsp?action=login&amp;domain=17173.com" target="_blank" tip>http://passport.sohu.com/sso/crossdomain.jsp?action=login&amp;domain=17173.com</a> 这时passport.sohu.com下成功登录的cookie会被带回去。 <br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220622_c02fsso4.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220622_c02fsso4.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
2.&nbsp;&nbsp;服务器看到成功登录的Cookie后。在服务器端计算出一个加密后的17173.com的登录Url，并Redirect到这个Url。 <br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220626_liapsso5.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220626_liapsso5.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
3.&nbsp;&nbsp;17173.com从url的QueryString中取得信息。并在Response中设置Cookie。这个Cookie终于写到了17173.com下。而不是passport.sohu.com下。从而使得用户在17173.com下登录。其实用户在17173.com下手动登录也是写上同样的Cookie。以后用户再访问17173.com的页面时这个Cookie会被带回去。这就表示用户在17173.com下成功登录过了。 <br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/23_220629_96xbsso6.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/23_220629_96xbsso6.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
经过上面的步骤。用户在passport.sohu.com下登录的同时也在其他站点登录了。<br />
<br />
<strong><font color="#ff0000">在上面的过程中，最核心的技巧就是在指定的域下写入想要的Cookie：</font></strong><br />
<br />
<strong>1.&nbsp;&nbsp;Sohu使用了在同一个域名登录后通过再次请求这个域名下某个链接后，得到要登录站点的请求Url，通过javascript使隐藏的iframe请求要登录站点的Url，服务器端接到请求Redirect到要登录站点，然后通过Response写入Cookie，完成跨域名写Cookie的操作。这种写Cookie的方式，需要在跳转时对请求的QueryString进行加密。接受方需要对QueryString进行解密。</strong><br />
<br />
<strong>2.&nbsp;&nbsp;这种做法在服务器端不需要特别的处理。只要写好相应Post操作 WriteCookie操作 Redirect操作 就可以了。在FireFox下就可以正常工作了。但是在IE下写Cookie的操作还不行，总是写不进去Cookie。需要在Response中加入一段特别的Header. P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" </strong><br />
<br />
<strong>这个Http Header 是P3P安全的要求。P3P的详解 <a href="http://www.oreilly.com.cn/book.php?bn=7-302-07170-5" target="_blank" tip>http://www.oreilly.com.cn/book.php?bn=7-302-07170-5</a> </strong><br />
<strong>微软对这个的解释：<a href="http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q323752" target="_blank" tip>http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q323752</a> </strong><br />
<br />
<strong><font color="#ff0000">一个更加轻量级的方案</font></strong><br />
<br />
Sohu的通行证方案已经可以轻松的将各个域名下的用户都同步登录了。但是在实现上Sohu会让客户端的浏览器请求两次passport.sohu.com。在第二次得到一个登录多个站点的地址列表。在第三次请求时通过本域下的cookie进行身份验证，最后在服务器端跳转到一个含有加密Key的其它域名的Url地址，最终写入登录成功的Cookie。除去最开始的登录，要求用户在登录后再进行两次请求。并且服务器端要再做一次跳转。Sohu的做法可能由于Sohu服务器环境和数据存储的结构所决定。<br />
<br />
其实总共只需一次登录请求，和每个域名下一次请求就可以完成多站点登录了，同时也不需要服务器端的跳转。<br />
<br />
<a href="http://zhangsichu.com/attachments/month_200710/24_174933_fc5isso7.gif" target="_blank" tip><img alt="Click to Open in New Window" src="http://zhangsichu.com/attachments/month_200710/24_174933_fc5isso7.gif" onload="javascript:if(this.width />screen.width-300)this.width=screen.width-300" border=0></a><br />
<br />
跨站点的请求由script的src发出。各个域名下的ssologin处理QueryString中的key，解密key，验证Key的合法性。在Response中写入登录成功的Cookie。完成跨站点Cookie的写入。<br />
<br />
<strong><font color="#ff0000">两种方案的比较</font></strong><br />
<br />
<strong>1. Sohu使用的登录方式，请求次数多，但是每次请求都有对应的验证过程，在服务端跳转时，重要的跳转Url地址在HttpHeader中，使得跳转地址更加安全，使得用户在跨域登录时非常安全可靠。</strong><br />
<br />
<strong>2. 轻量级方案的登录方式，请求次数少，没有服务器端的跳转，对服务器压力小。但是需要对Key进行加密解密。跳转的Url会在Response的Http Body中Render给用户。在使用轻量级方案的时候，最好在Key中加上时间戳，过期时间设置为3分钟。Key过期认为这个Key是非法Key，不在Response中写入登录成功的Cookie。</strong><br />
</span></p>
<script src="http://www.yaosansi.com/PLUGIN/copytofriends/copy.js" type="text/javascript"></script>
<img src ="http://www.blogjava.net/smildlzj/aggbug/298132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2009-10-13 23:47 <a href="http://www.blogjava.net/smildlzj/articles/298132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>纯CSS仿IE经典菜单栏</title><link>http://www.blogjava.net/smildlzj/articles/278144.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Wed, 27 May 2009 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/278144.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/278144.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/278144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/278144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/278144.html</trackback:ping><description><![CDATA[http://www.blogjava.net/Files/smildlzj/纯CSS仿IE经典菜单栏.rar<br />
<img src ="http://www.blogjava.net/smildlzj/aggbug/278144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2009-05-27 09:38 <a href="http://www.blogjava.net/smildlzj/articles/278144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DNS Package</title><link>http://www.blogjava.net/smildlzj/articles/220789.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Thu, 07 Aug 2008 15:26:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/220789.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/220789.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/220789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/220789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/220789.html</trackback:ping><description><![CDATA[<p>On the surface of it, DNS seems pretty straightforward, simply converting names to numbers, or retrieving other information about a domain. It's actually a huge and complicated subject and books on it tend to be quite wide. Thankfully, for the purpose of what we're doing we don't need to understand very much at all - just how to create a query, send it to a server, and interpret the response. The most common query that a DNS server deals with is the ANAME query, which maps domain names to IP addresses (<em>codeproject.com</em> to 209.171.52.99, for example). <code>System.Net.Dns.GetHostByName</code> performs ANAME lookups. Probably the next most common type of query is the MX query.</p>
<p>Unlike many of the internet protocols which are text based, DNS is a binary protocol. DNS servers are some of the busiest computers on the internet, and the overhead of string-parsing would make such a protocol prohibitive. To keep things fast and lean, UDP is the transport of choice being lightweight, connectionless and fast in comparison to TCP. To communicate with a DNS server, you simply throw a single UDP packet at it and it throws one back. Oh, and these packets cannot exceed 512 bytes in length. (Incidentally, many firewalls block UDP packets larger than 512 bytes in length.)</p>
<p>The diagram below shows the binary request I sent to my DNS server to look up the MX records for the domain <em>microsoft.com</em> and the corresponding response I received. To do this, I sent a 31 byte UDP packet to port 53 of my DNS server as shown below. It replied with a 97 byte response again on UDP port 53.</p>
<p>Both request and response share the same format, which starts with a 12 byte header block. This starts with a two byte message identifier. This can be any 16 bit value and is echoed in the first two bytes of the response, and is useful as it allows us to match up requests and responses as UDP makes no guarantees about the order in which things arrive. After that follows a two byte status field which in our request has just one single bit set, the <em>recursion desired</em> bit. Next comes a two byte value denoting how many questions there are in the request, in this case just 1. There then follows three more two byte values denoting the number of answers, name server records and additional records. As this is a request, all these are zero.</p>
<p>The rest of the request is our single question. A question consists of a variable length domain name, a two byte <code>QTYPE</code> and a two byte <code>QCLASS</code> in that order. Domain names are treated as a series of <em>labels</em>, labels being the words between dots. In our example <em>microsoft.com</em> consists of two labels, <em>microsoft</em> and <em>com</em>. Each label is preceded by a single byte specifying its length. The <code>QTYPE</code> denotes the type of record to retrieve, in this example, MX. <code>QCLASS</code> is <em>Internet</em>.</p>
<p><img height="459" alt="Test Application" src="http://www.codeproject.com/KB/IP/DnsLookupDotNet/messages.gif" width="600" /></p>
<p>The response we get back tells us that there are three inbound mail servers for the domain <em>microsoft.com</em>, <em>maila.microsoft.com</em>, <em>mailb.microsoft.com</em> and <em>mailc.microsoft.com</em>. All three have the same preference of 10. When sending mail to a domain, the mail server with the lowest preference should be tried first, then the next lowest etc. In this case, there is no preference difference and any of the three may be used. Let's look a bit more closely at the response.</p>
<p>You may have noticed that the first 31 bytes of the response are very similar to the request, the only difference being in the status field (bytes 2 &amp; 3) and the answer count (bytes 6 &amp; 7). The answer count tells us that three answers follow in the response. I refer those who are interested in the make up of the status field to the above RFC section 4.1.1, as I will not cover that here. You'll also notice that the question is echoed in the response, something which seems rather inefficient to me, but that's the standard. The first answer starts at byte 31 (0x1F).</p>
<p>The first part of any answer embeds the question in it so if you ask more than one question you know to which question the answer refers. A shortened form is used - rather than repeating the domain <em>microsoft.com</em> explicitly here which is wasteful when we've only got 512 bytes to play with. We reference the existing domain definition at byte 12 (0x0C). This requires just two bytes instead of 15 in our example. When examining the label length byte which precedes a label, if the two most significant bits are set, this denotes a reference to a previously defined domain name and the label does not follow here. The next byte tells you the position in the message of the existing domain name. Again the <code>QTYPE</code> and <code>QCLASS</code> follow, and then we start to see the part which is the answer.</p>
<p>The next four bytes represent the TTL (time to live) of the record. When a DNS server can't answer a question explicitly, it knows (or can find out) another server which can and asks that. It will then cache this answer for a certain period to improve efficiency. Every record in the cache has a TTL after which it will be destroyed and re-fetched from elsewhere if needed.</p>
<p>The next two bytes tell the size of the record, the next two the MX preference, and then follows the variable length domain name. Here we only specify the <em>mailc</em> part of the domain, and then again reference the rest of the domain name at byte 12 (to produce <em>mailc.microsoft.com).</em> Two almost identical records follow for <em>maila.microsoft.com</em> and <em>mailb.microsoft.com</em>.</p>
<img src ="http://www.blogjava.net/smildlzj/aggbug/220789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-08-07 23:26 <a href="http://www.blogjava.net/smildlzj/articles/220789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RFC 1035 shows the structure of DNS message  </title><link>http://www.blogjava.net/smildlzj/articles/220788.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Thu, 07 Aug 2008 15:22:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/220788.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/220788.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/220788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/220788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/220788.html</trackback:ping><description><![CDATA[<p>RFC 1035 shows the structure of DNS message as follows </p>
<pre>+---------------------+
| Header              |
+---------------------+
| Question            | the question <span class="code-keyword">for</span> the name server
+---------------------+
| Answer              | RRs answering the question
+---------------------+
| Authority           | RRs pointing toward an authority
+---------------------+
| Additional          | RRs holding additional information
+---------------------+
</pre>
<p>Obviously queries won't have the answer, authority, and additional fields. Packets are of course UDP and DNS servers feel comfortable to operate on port 53. So the first thing is to send a query containing the hostname. </p>
<p>The next task is to receive the reply which is expected to contain the information we are expecting. DNS queries are used for a variety of purposes. Apart from getting the ipv4 address of a host we also use DNS for getting the mail exchange/server of a specified domain and etc. All types of queries and response packets are built nearly on the same structure depicted above. </p>
<p>When a DNS server replies it sends the question as it is along with a bunch of RR's or resource records. All RR's stand in a queue, and certain fields of the header reveal how many of the RR's fall into the answer, authority, and additional categories. </p>
<p>This is the structure of a DNS header : </p>
<pre>+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID                                            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode    |AA|TC|RD|RA| Z      |  RCODE    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   QDCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   ANCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   NSCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   ARCOUNT                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
</pre>
<p>ID :the identifier<br />
QDCOUNT : how many questions are there in the packet.<br />
ANCOUNT : how many answers in the RR queue.<br />
NSCOUNT : Authority RR count <br />
ARCOUNT : Additional Count <br />
for explanation of the other fields lookup the RFC <br />
A DNS packet typically looks like this Header-Query-RR-RR-RR-RR-RR-RR........ </p>
<p>A Query structure looks like this </p>
<pre>+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                    QNAME                      /
/                                               /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QTYPE                      |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QCLASS                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
</pre>
<p>Note : QNAME is a variable length field to fit the hostname <br />
QCLASS should be 1 since we are on internet <br />
QTYPE determines what you want to know ; ipv4 address,mx etc. <br />
<br />
Resource Record(RR) field looks like this </p>
<pre>+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                                               /
/                     NAME                      /
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     TYPE                      |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     CLASS                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     TTL                       |
|                                               |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                  RDLENGTH                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/                     RDATA                     /
/                                               /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
</pre>
<p>Note again : NAME and RDATA are variable length field <br />
Type field tells how RDATA relates to NAME. e.g. if TYPE is 1 then RDATA contains the ipv4 address of the NAME. <br />
That's all about the structures we need. </p>
<img src ="http://www.blogjava.net/smildlzj/aggbug/220788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-08-07 23:22 <a href="http://www.blogjava.net/smildlzj/articles/220788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSS半透明滤镜在FIREFOX和IE下面的能够通用的写法</title><link>http://www.blogjava.net/smildlzj/articles/204269.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Sat, 31 May 2008 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/204269.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/204269.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/204269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/204269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/204269.html</trackback:ping><description><![CDATA[CSS半透明滤镜在FIREFOX和IE下面的能够通用的写法，记录下来备用：
<div class="codeText">
<div class="codeHead">CSS代码</div>
<ol class="dp-css">
    <li class="alt"><span><span>.test{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">background</span><span>:</span><span class="colors">#000</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">color</span><span>:</span><span class="string">white</span><span>; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">width</span><span>:</span><span class="string">200px</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">position</span><span>:</span><span class="string">absolute</span><span>; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span><span class="string">left</span><span>:</span><span class="string">10px</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="string">top</span><span>:</span><span class="string">10px</span><span>; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; filter: Alpha(opacity=10); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; -moz-opacity:.1; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; opacity:0.1; &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>这里关键的是</p>
<div class="codeText">
<div class="codeHead">CSS代码</div>
<ol class="dp-css">
    <li class="alt"><span><span>filter: Alpha(opacity=10); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp; -moz-opacity:.1; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp; opacity:0.1;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>这三句,第一句是ie 支持.第二三句是firefox支持的,但是版本不一样就有两种了,所以用时候把三句都加上就行了</p>
<img src ="http://www.blogjava.net/smildlzj/aggbug/204269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-05-31 09:38 <a href="http://www.blogjava.net/smildlzj/articles/204269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java权限控制的算法 </title><link>http://www.blogjava.net/smildlzj/articles/189575.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Sun, 30 Mar 2008 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/189575.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/189575.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/189575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/189575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/189575.html</trackback:ping><description><![CDATA[这里笔者介绍一种很常用，也比较专业的权限控制思路。这里用java语言描述，其实都差不多的。要换成其他的语言主，自己转一下就可以了。为了方便起见，我们这里定义a^b为：a的b次方。这里，我们为每一个操作设定一个唯一的整数值，比如：
<p>删除Ａ－－－0<br />
修改Ａ－－－1<br />
添加Ａ－－－2</p>
<!--newszw_hzh_begin-->
<table cellspacing="0" cellpadding="0" align="left" border="0">
    <tbody>
        <tr>
            <td>
            <div id="PublicRelation5" name="PublicRelation">&nbsp;</div>
            </td>
        </tr>
    </tbody>
</table>
<!--newszw_hzh_end-->
<p>删除Ｂ－－－3<br />
修改Ｂ－－－4<br />
添加Ｂ－－－5</p>
<p>&#8230;&#8230;</p>
<p>　　理论上可以有Ｎ个操作，这取决于你用于储存用户权限值的数据类型了。</p>
<p>　　这样，如果用户有权限：添加Ａ－－－2；删除Ｂ－－－3；修改Ｂ－－－4。那用户的权限值 purview =2^2+2^3+2^4＝28，也就是2的权的和了。化成二进制可以表示为11100。这样，如果要验证用户是否有删除Ｂ的权限，就可以通过位与运算来实现。在Ｊａｖａ里，位与运算运算符号为＆，即是：</p>
<p class="code">int value = purview &amp;((int)Math.pow(2,3));</p>
<p>　　你会发现，当用户有操作权限时，运算出来的结果都会等于这个操作需要的权限值！</p>
<p>　　原理：</p>
<p>　　位与运算，顾名思义就是对位进行与运算：</p>
<p>　　以上面的式子为例：purview &amp; 2^3 也就是　28&amp;8</p>
<p>　　将它们化成二进制有</p>
<p>　11100<br />
＆ 01000<br />
-------------------<br />
　 01000 == 8(十进制)　＝＝　2^3</p>
<p>　　同理，如果要验证是否有删除Ａ－－－0的权限</p>
<p>　　可以用：purview &amp;((int)Math.pow(2,0));</p>
<p>　　即：</p>
<p>　11100<br />
＆ 00001<br />
------------------------<br />
　 00000 == 0(十进制)　　！＝　2^0 </p>
<p>　　这种算法的一个优点是速度快。可以同时处理Ｎ个权限。如果想验证是否同时有删除Ａ－－－0和删除Ｂ－－－3的权限，可以用purview&amp;(2^0+2^3)==(2^0+2^3)?true:false;设置多角色用户。根据权限值判断用户的角色。</p>
<p>　　下面提供一个java的单操作权限判断的代码：</p>
<p class="code">//userPurview是用户具有的总权限<br />
//optPurview是一个操作要求的权限为一个整数（没有经过权的！）<br />
public static boolean checkPower(int userPurview, int optPurview)<br />
{<br />
&nbsp; int purviewValue = (int)Math.pow(2, optPurview);<br />
&nbsp; return (userPurview &amp; purviewValue) == purviewValue;<br />
}</p>
<p>　　当然，多权限的验证只要扩展一下就可以了。</p>
<p>　　几点注意事项：首先，一个系统可能有很多的操作，因此，请建立数据字典，以便查阅，修改时使用。其次，如果用数据库储存用户权限，请注意数值的有效范围。操作权限值请用唯一的整数！&nbsp;</p>
<br />
<img src ="http://www.blogjava.net/smildlzj/aggbug/189575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-03-30 10:33 <a href="http://www.blogjava.net/smildlzj/articles/189575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又一FLASH多文件上传组件</title><link>http://www.blogjava.net/smildlzj/articles/180964.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Wed, 20 Feb 2008 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/180964.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/180964.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/180964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/180964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/180964.html</trackback:ping><description><![CDATA[demo:http://www.element-it.com/DemoMultiPOW.aspx<br />
<br />
有js+flash和flash方式...
<img src ="http://www.blogjava.net/smildlzj/aggbug/180964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-02-20 23:53 <a href="http://www.blogjava.net/smildlzj/articles/180964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax+flash实现多文件上传 </title><link>http://www.blogjava.net/smildlzj/articles/180642.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Tue, 19 Feb 2008 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/180642.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/180642.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/180642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/180642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/180642.html</trackback:ping><description><![CDATA[FROM:http://www.cnblogs.com/wengjinbao/archive/2007/06/19/788639.html<br />
<br />
<p><a id="r_l_5" href="http://digitarald.de/project/fancyupload/"><font color="#990033">FancyUpload</font></a>，用flash和mootools实现的一款多文件无刷新上传工具。<br />
最大的特点是可以<strong>一次选择多个文件</strong>，无刷新上传。<br />
早些时候曾想过一次选择多个文件的问题，浏览器默认的file标签一次只能选择一个文件，要浏览并读取本地文件就必须调用本地的组件或命令，所以单纯用javascript+html无解。<br />
今天查看订阅的feeds时，无意中在Ajaxian看到这个演示图片上选择了多个文件：<br />
<img src="http://digitarald.de/image/180/0/1/fff/upload/digifancyuploadmx1.gif"  alt="" /></p>
<p>非常好奇，过去看了一下<a id="r_l_1" href="http://digitarald.de/playground/uplooad.html"><font color="#990033">demo</font></a>，果然可以一次选择多个文件！</p>
<p>Browsfile的button没什么特别，就是一个button，肯定是通过js触发了某个动作。前面说过js和html是不能实现这个功能的，那么肯定是flash实现了这个功能。</p>
<p>文件里面有个Swiff.Uploader.swf，就是这个swf实现了文件浏览的功能，as在这：<a id="r_l_2" href="http://digitarald.de/workspace/packages/Uploader/Swiff.Uploader.as"><font color="#990033">http://digitarald.de/workspace/packages/Uploader/Swiff.Uploader.as</font></a></p>
<p>google了一下<a href="http://www.google.cn/search?complete=1&amp;hl=zh-CN&amp;newwindow=1&amp;client=firefox&amp;rls=org.mozilla%3Azh-CN%3Aofficial&amp;q=flash+filebrowser&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;meta="><font color="#990033">flash filebrowser</font></a>和<a href="http://www.google.cn/search?aq=t&amp;oq=flash+file&amp;complete=1&amp;hl=zh-CN&amp;newwindow=1&amp;client=firefox&amp;rls=org.mozilla%3Azh-CN%3Aofficial&amp;q=flash+fileupload&amp;btnG=Google+%E6%90%9C%E7%B4%A2&amp;meta="><font color="#990033">flash fileupload</font></a>果然找到很多内容</p>
<p>这片中文的详细说明了那个flash的原理：<br />
<a id="r_l_3" href="http://www.cnblogs.com/walkingboy/archive/2007/02/09/Flash_FileUpload_FileReference.html"><font color="#990033">http://www.cnblogs.com/walkingboy/archive/2007/02/09/Flash_FileUpload_FileReference.html</font></a><br />
出处可能是这个：<br />
<a id="r_l_9" href="http://www.codeproject.com/aspnet/FlashUpload.asp"><font color="#990033">http://www.codeproject.com/aspnet/FlashUpload.asp</font></a></p>
<p>原理是用了flash的FileReferenceList API实现的多文件选取。<br />
<a id="r_l_10" href="http://markshu.ca/imm/flash/tutorial/fileReference.html"><font color="#990033">http://markshu.ca/imm/flash/tutorial/fileReference.html</font></a></p>
<p>另外还有几个实例：<br />
<a id="r_l_11" href="http://www.betriebsraum.de/blog/2006/01/13/download-flash-8-file-browser/"><font color="#990033">http://www.betriebsraum.de/blog/2006/01/13/download-flash-8-file-browser/<br />
</font></a><br />
<a id="r_l_12" href="http://www.extremefx.com.ar/blog/flash-textarea"><font color="#990033">http://www.extremefx.com.ar/blog/flash-textarea</font></a></p>
<img src ="http://www.blogjava.net/smildlzj/aggbug/180642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-02-19 13:21 <a href="http://www.blogjava.net/smildlzj/articles/180642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]用 AOP 来记录每个方法的执行时间 </title><link>http://www.blogjava.net/smildlzj/articles/179310.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Mon, 04 Feb 2008 14:56:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/179310.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/179310.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/179310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/179310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/179310.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有时候我们要跟踪方法的执行时间，来观察系统的性能、时间分布。特别是要找出那些十分耗时的操作。如果是在每个方法中起始和结束位置记下时间相减，那是不太现实的，对代码的侵入性太过份，而且在产品环境中又得屏闭那部份代码。幸好现在有了 AOP，通过配置方式再加上外部辅助代码就能达到我们的要求，正式上线时只需要简单改个配置项拆卸下来即可。下面介绍三种方式来打印每个方法的执行时间，分别是：...&nbsp;&nbsp;<a href='http://www.blogjava.net/smildlzj/articles/179310.html'>阅读全文</a><img src ="http://www.blogjava.net/smildlzj/aggbug/179310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-02-04 22:56 <a href="http://www.blogjava.net/smildlzj/articles/179310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring拦截器来控制URL路径的转发</title><link>http://www.blogjava.net/smildlzj/articles/178730.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Thu, 31 Jan 2008 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/178730.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/178730.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/178730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/178730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/178730.html</trackback:ping><description><![CDATA[<div class="dp-highlighter">
<div class="tools">struts的代码&nbsp;</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletRequest; &nbsp;&nbsp;</span></span>
    <li><span class="keyword">import</span><span>&nbsp;org.aopalliance.intercept.MethodInterceptor; &nbsp;&nbsp;</span></span>
    <li><span class="keyword">import</span><span>&nbsp;org.aopalliance.intercept.MethodInvocation; &nbsp;&nbsp;</span></span>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.struts.action.ActionMapping; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="comment">/** </span>&nbsp;</span>
    <li><span><span class="comment">&nbsp;*&nbsp;这是一个拦截器,用来验证用户是否通过验证 </span>&nbsp;</span>
    <li><span><span class="comment">&nbsp;* </span>&nbsp;</span>
    <li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;AuthorityInterceptor&nbsp;</span><span class="keyword">implements</span><span>&nbsp;MethodInterceptor&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;invoke(MethodInvocation&nbsp;invocation)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args&nbsp;=&nbsp;invocation.getArguments(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>&nbsp;;&nbsp;i&nbsp;&lt;&nbsp;args.length&nbsp;;&nbsp;i++&nbsp;) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args[i]&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;HttpServletRequest)&nbsp;request&nbsp;=&nbsp;(HttpServletRequest)args[i]; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args[i]&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;ActionMapping)&nbsp;mapping&nbsp;=&nbsp;(ActionMapping)args[i]; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;request.getSession().getAttribute(</span><span class="string">"adminname"</span><span>)&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;invocation.proceed(); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;mapping.findForward(</span><span class="string">"login"</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">import javax.servlet.http.HttpServletRequest;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.struts.action.ActionMapping;
/**
* 这是一个拦截器,用来验证用户是否通过验证
*
*/
public class AuthorityInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable
{
HttpServletRequest request = null;
ActionMapping mapping = null;
Object[] args = invocation.getArguments();
for (int i = 0 ; i &lt; args.length ; i++ )
{
if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
}
if ( request.getSession().getAttribute("adminname") != null)
{
return invocation.proceed();
}
else
{
return mapping.findForward("login");
}
}
}</pre>
<br />
<br />
配置文件: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span>&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"</span><span>&gt; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=</span><span class="string">"beanNames"</span><span>&gt; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;/vaiiduser&lt;/value&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;/admin&lt;/value&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;/phone&lt;/value&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=</span><span class="string">"interceptorNames"</span><span>&gt; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;authorityInterceptor&lt;/value&gt;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&lt;/bean&gt; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&lt;bean&nbsp;id=</span><span class="string">"authorityInterceptor"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.mmc.utils.AuthorityInterceptor"</span><span>/&gt;&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<img src ="http://www.blogjava.net/smildlzj/aggbug/178730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-01-31 19:40 <a href="http://www.blogjava.net/smildlzj/articles/178730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>autoassist库简单应用：给出下拉提示的输入框</title><link>http://www.blogjava.net/smildlzj/articles/174741.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Fri, 11 Jan 2008 16:44:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/174741.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/174741.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/174741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/174741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/174741.html</trackback:ping><description><![CDATA[<p>&nbsp;<br />
&nbsp;在网页上有一些搜索的文本输入框，用户可以在其中输入内容，然后进行查找。然而如果用户并不熟悉网站的内容，他应该输入那些信息来查找呢？如果能够在用户输入某些内容时显示包含这些内容并与网站相关的信息，将会大大提高用户的方便性，并且让用户对网站的内容有进一步的了解，增强交互性。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;autoassist库就是针对以上需求而产生的。如果要使用autoassist库，你可以从<a href="http://capxous.com/">http://capxous.com/</a>上下载<a href="http://capxous.com/autoassist-0.8.zip">http://capxous.com/autoassist-0.8.zip</a>，其中javascripts目录下的autoassist.js和prototype.js就是相关的库文件。<span style="display: none">社区门户"QD Zr9bF3d</span><br />
</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;<span style="font-size: 10pt">思路：在页面上的一个输入框中，当用户输入内容的时侯，网页应该做出响应，将用户所输内容提交给一个后台页面或程序处理；然后将此内容与网站中的信息（固定信息或数据库中的信息）相比较，若找到相关内容，则使的输入框弹出下拉提示信息，用户可选择下拉提示信息，输入框中内容也不再是用户所输内容，而是所选的下拉信息。</span></span></p>
<p><br />
&lt;html&gt; </p>
<p>&lt;head&gt; </p>
<p>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-&nbsp;8"&gt; </p>
<p>&nbsp;&lt;title&gt;Insert title here&lt;/title&gt; </p>
<p>&nbsp;&lt;script type="text/javascript" src="javascripts/prototype.js"&gt;&lt;/s&nbsp;cript&gt;&nbsp;&nbsp; </p>
<p>&nbsp;&lt;script type="text/javascript" src="javascripts/autoassist.js"&gt;&lt;/&nbsp;script&gt; </p>
<p>&nbsp;&lt;link rel="stylesheet" type="text/css" href="styles/autoassist.cs&nbsp;s" /&gt;&nbsp;&nbsp; </p>
<p>&nbsp;&lt;script language="javascript"&gt; </p>
<p>&nbsp;Event.observe(window, "load", function() { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; var aa = new AutoAssist("userName", function() { </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return "autoassist.action?q=" + this.txtBox.value;//q为用<br />
户所输内容找出下拉信息后返回；当用户点击后改变input中的值 </p>
<p>&nbsp;&nbsp;&nbsp; }); </p>
<p>});//将用户所输内容传递到action中的函数 </p>
<p>&lt;/script&gt; </p>
<p>&lt;/head&gt; </p>
<p>&lt;body&gt; </p>
<p>&lt;input type="text" name="userName" id="userName"/&gt; </p>
<p>&lt;/body&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html&gt; </p>
<img src ="http://www.blogjava.net/smildlzj/aggbug/174741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2008-01-12 00:44 <a href="http://www.blogjava.net/smildlzj/articles/174741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用HttpClient来模拟浏览器GET POST</title><link>http://www.blogjava.net/smildlzj/articles/161977.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Tue, 20 Nov 2007 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/161977.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/161977.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/161977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/161977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/161977.html</trackback:ping><description><![CDATA[<p><font size="4">一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器，用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面，有的需要用户登录后方可使用，或者需要认证以及是一些通过加密方式传输，例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面，比如从别人的网页中&#8220;偷&#8221;一些数据；利用某些站点提供的页面来完成某种功能，例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据，因此只好借助其他公司已有的网站来完成这个功能，这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面，那我们的程序会很简单，本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题，很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的，而必须经过注册然后登录后方可使用提供服务的页面，这个时候就涉及到COOKIE问题的处理。我们知道目前流行的***页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面，就要求程序首先登录后再访问服务页面，这过程就需要自行处理cookie，想想当你用java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊！况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的&#8220;顽固&#8221;！再有如通过HTTP来上传文件呢？不需要头疼，这些问题有了&#8220;它&#8221;就很容易解决了！ </font></p>
<p><font size="4">我们不可能列举所有可能的顽固，我们会针对几种最常见的问题进行处理。当然了，正如前面说到的，如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情，因此在开始之前我们先要介绍一下一个开放源码的项目，这个项目就是Apache开源组织中的httpclient，它隶属于Jakarta的commons项目，目前的版本是2.0RC2。commons下本来已经有一个net的子项目，但是又把httpclient单独提出来，可见http服务器的访问绝非易事。</font></p>
<p><font size="4">Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决，例如你不再管是HTTP或者HTTPS的通讯方式，告诉它你想使用HTTPS方式，剩下的事情交给httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们，为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容，然后循序渐进解决掉前进中的所形侍狻?/font&gt;
<p><font size="4">1． 读取网页(HTTP/HTTPS)内容</font></p>
<p><font size="4">下面是我们给出的一个简单的例子用来访问某个页面</font></p>
<p><font size="4">/*</font></p>
<p><font size="4">&nbsp;* Created on 2003-12-14 by Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">package http.demo;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import java.io.IOException;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import org.apache.commons.httpclient.*;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.*;</font></p>
<p><font size="4">/**</font></p>
<p><font size="4">&nbsp;* 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面</font></p>
<p><font size="4">&nbsp;* @author Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">public class SimpleClient {</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置代理服务器地址和端口&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用GET方法，如果服务器需要通过HTTPS连接，那只需要将下面URL中的http换成https</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = new GetMethod("</font><a href="http://java.sun.com/"><font size="4">http://java.sun.com</font></a><font size="4">"); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用POST方法</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HttpMethod method = new PostMethod("</font><a href="http://java.sun.com/"><font size="4">http://java.sun.com</font></a><font size="4">"); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getResponseBodyAsString());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放连接</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">在这个例子中首先创建一个HTTP客户端(HttpClient)的实例，然后选择提交的方法是GET或者POST，最后在HttpClient实例上执行提交的方法，最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程，非常的简单！</font></p>
<p><br />
<font size="4">2． 以GET或者POST方式向网页提交参数</font></p>
<p><font size="4">其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面，本小节与之不同的是多了提交时设定页面所需的参数，我们知道如果是GET的请求方式，那么所有参数都直接放到页面的URL后面用问号与页面地址隔开，每个参数用&amp;隔开，例如：</font><a href="http://java.sun.com/?name=liudong&amp;mobile=123456"><font size="4">http://java.sun.com?name=liudong&amp;mobile=123456</font></a><font size="4">，但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市，代码如下：</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">/*</font></p>
<p><font size="4">&nbsp;* Created on 2003-12-7 by Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">package http.demo;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import java.io.IOException;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import org.apache.commons.httpclient.*;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.*;</font></p>
<p><font size="4">/**</font></p>
<p><font size="4">&nbsp;* 提交参数演示</font></p>
<p><font size="4">&nbsp;* 该程序连接到一个用于查询手机号码所属地的页面</font></p>
<p><font size="4">&nbsp;* 以便查询号码段1330227所在的省份以及城市</font></p>
<p><font size="4">&nbsp;* @author Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">public class SimpleHttpClient {</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost("</font><a href="http://www.imobile.com.cn/"><font size="4">www.imobile.com.cn</font></a><font size="4">", 80, "http");</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = getPostMethod();//使用POST方式提交数据</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印结果页面</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response =</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String(method.getResponseBodyAsString().getBytes("8859_1"));</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(response);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; /**</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * 使用GET方式提交数据</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * @return</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; */</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; private static HttpMethod getGetMethod(){</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new GetMethod("/simcard.php?simcard=1330227");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; /**</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * 使用POST方式提交数据</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; * @return</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp; */</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; private static HttpMethod getPostMethod(){</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/simcard.php");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair simcard = new NameValuePair("simcard","1330227");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[] { simcard});</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return post;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">}</font></p>
<p><font size="4">在上面的例子中页面</font><a href="http://www.imobile.com.cn/simcard.php"><font size="4">http://www.imobile.com.cn/simcard.php</font></a><font size="4">需要一个参数是simcard，这个参数值为手机号码段，即手机号码的前七位，服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息，而POST则需要通过NameValuePair类来设置参数名称和它所对应的值</font></p>
<p><font size="4">3． 处理页面重定向</font></p>
<p><font size="4">在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的&lt;jsp:forward &#8230;&gt;的区别在于后者是在服务器中实现页面的跳转，也就是说应用容器加载了所要跳转的页面的内容并返回给客户端；而前者是返回一个状态码，这些状态码的可能值见下表，然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程，所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了，那么可以通过读取HTTP头中的location属性来获取新的地址。</font></p>
<p><font size="4">状态码<br />
&nbsp;对应HttpServletResponse的常量<br />
&nbsp;详细描述<br />
&nbsp;<br />
301<br />
&nbsp;SC_MOVED_PERMANENTLY<br />
&nbsp;页面已经永久移到另外一个新地址<br />
&nbsp;<br />
302<br />
&nbsp;SC_MOVED_TEMPORARILY<br />
&nbsp;页面暂时移动到另外一个新的地址<br />
&nbsp;<br />
303<br />
&nbsp;SC_SEE_OTHER<br />
&nbsp;客户端请求的地址必须通过另外的URL来访问<br />
&nbsp;<br />
307<br />
&nbsp;SC_TEMPORARY_REDIRECT<br />
&nbsp;同SC_MOVED_TEMPORARILY<br />
&nbsp;</font></p>
<p><br />
<font size="4">下面的代码片段演示如何处理页面的重定向</font></p>
<p><font size="4">client.executeMethod(post);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getStatusLine().toString()); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是否重定向</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int statuscode = post.getStatusCode();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) ||</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_SEE_OTHER) ||</font></p>
<p><font size="4">(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {</font></p>
<p><font size="4">//读取新的URL地址</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header header = post.getResponseHeader("location");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (header != null) {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newuri = header.getValue();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((newuri == null) || (newuri.equals("")))</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newuri = "/"; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod redirect = new GetMethod(newuri);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(redirect);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Redirect:"+ redirect.getStatusLine().toString()); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirect.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Invalid redirect");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">我们可以自行编写两个JSP页面，其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。</font></p>
<p><font size="4">4． 模拟输入用户名和口令进行登录</font></p>
<p><font size="4">本小节应该说是HTTP客户端编程中最常碰见的问题，很多网站的内容都只是对注册用户可见的，这种情况下就必须要求使用正确的用户名和口令登录成功后，方可浏览到想要的页面。因为HTTP协议是无状态的，也就是连接的有效期只限于当前请求，请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例，当浏览器请求一个JSP或者是Servlet的页面时，应用服务器会返回一个参数，名为jsessionid（因不同应用服务器而异），值是一个较长的唯一字符串的Cookie，这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息，应用服务器根据读取这个会话标识来获取对应的会话信息。</font></p>
<p><font size="4">对于需要用户登录的网站，一般在用户登录成功后会将用户资料保存在服务器的会话中，这样当访问到其他的页面时候，应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息，然后就可以判断用户资料是否存在于会话信息中，如果存在则允许访问页面，否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。</font></p>
<p><font size="4">这样一来，对于HTTP的客户端来讲，如果要访问一个受保护的页面时就必须模拟浏览器所做的工作，首先就是请求登录页面，然后读取Cookie值；再次请求登录页面并加入登录页所需的每个参数；最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多，可是如果你使用httpclient的话，你甚至连一行代码都无需增加，你只需要先传递登录信息执行登录过程，然后直接访问想要的页面，跟访问一个普通的页面没有任何区别，因为类HttpClient已经帮你做了所有该做的事情了，太棒了！下面的例子实现了这样一个访问的过程。</font></p>
<p><br />
<font size="4">/*</font></p>
<p><font size="4">&nbsp;* Created on 2003-12-7 by Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">package http.demo;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import org.apache.commons.httpclient.*;</font></p>
<p><font size="4">import org.apache.commons.httpclient.cookie.*;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.*;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">/**</font></p>
<p><font size="4">&nbsp;* 用来演示登录表单的示例</font></p>
<p><font size="4">&nbsp;* @author Liudong</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">public class FormLoginDemo {</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; static final String LOGON_SITE = "localhost";</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; static final int&nbsp;&nbsp;&nbsp; LOGON_PORT = 8080;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception{</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模拟登录页面login.jsp-&gt;main.jsp</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/main.jsp");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair name = new NameValuePair("name", "ld");&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair pass = new NameValuePair("password", "ld");&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[]{name,pass});</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod(post);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看cookie信息</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CookieSpec cookiespec = CookiePolicy.getDefaultSpec();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cookies.length == 0) {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("None");&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; cookies.length; i++) {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cookies[i].toString());&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问所需的页面main2.jsp</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("/main2.jsp");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(get);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(get.getResponseBodyAsString());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">}</font></p>
<p><font size="4">5． 提交XML格式参数</font></p>
<p><font size="4">提交XML格式的参数很简单，仅仅是一个提交时候的ContentType问题，下面的例子演示从文件文件中读取XML信息并提交给服务器的过程，该过程可以用来测试Web服务。</font></p>
<p><font size="4">import java.io.File;</font></p>
<p><font size="4">import java.io.FileInputStream;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">import org.apache.commons.httpclient.HttpClient;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.EntityEnclosingMethod;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.PostMethod;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">/**</font></p>
<p><font size="4">&nbsp;* 用来演示提交XML格式数据的例子</font></p>
<p><font size="4">&nbsp;*/</font></p>
<p><font size="4">public class PostXMLClient {</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File(&#8220;test.xml&#8221;);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod(&#8220;http://localhost:8080/httpclient/xml.jsp&#8221;);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置请求的内容直接从文件中读取</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new FileInputStream(input));</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (input.length() &lt; Integer.MAX_VALUE) </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(input.length());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指定请求内容的类型</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestHeader("Content-type", "text/xml; charset=GBK");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient httpclient = new HttpClient(); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = httpclient.executeMethod(post); </font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response status code: " + result);</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response body: ");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">}</font></p>
<p><font size="4">6． 通过HTTP上传文件</font></p>
<p><font size="4">httpclient使用了单独的一个HttpMethod子类来处理文件的上传，这个类就是MultipartPostMethod，该类已经封装了文件上传的细节，我们要做的仅仅是告诉它我们要上传文件的全路径即可，下面的代码片段演示如何使用这个类。</font></p>
<p><font size="4">MultipartPostMethod filePost = new MultipartPostMethod(targetURL);</font></p>
<p><font size="4">filePost.addParameter("fileName", targetFilePath);</font></p>
<p><font size="4">HttpClient client = new HttpClient();</font></p>
<p><font size="4">//由于要上传的文件可能比较大,因此在此设置最大的连接超时时间</font></p>
<p><font size="4">client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);</font></p>
<p><font size="4">int status = client.executeMethod(filePost);</font></p>
<p><br />
<font size="4">上面代码中，targetFilePath即为要上传的文件所在的路径。</font></p>
<p><font size="4">7． 访问启用认证的页面</font></p>
<p><font size="4">我们经常会碰到这样的页面，当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可，这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略，httpclient支持三种认证方式包括：基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全；摘要认证是在HTTP 1.1中加入的认证方式，而NTLM则是微软公司定义的而不是通用的规范，最新版本的NTLM是比摘要认证还要安全的一种方式。</font></p>
<p><font size="4">下面例子是从httpclient的CVS服务器中下载的，它简单演示如何访问一个认证保护的页面：</font></p>
<p><br />
<font size="4">import org.apache.commons.httpclient.HttpClient;</font></p>
<p><font size="4">import org.apache.commons.httpclient.UsernamePasswordCredentials;</font></p>
<p><font size="4">import org.apache.commons.httpclient.methods.GetMethod;</font></p>
<p><font size="4">&nbsp;</font></p>
<p><font size="4">public class BasicAuthenticationExample {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public BasicAuthenticationExample() {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getState().setCredentials(</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><a href="http://www.verisign.com/"><font size="4">www.verisign.com</font></a><font size="4">",</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "realm",</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UsernamePasswordCredentials("username", "password")</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("</font><a href="https://www.verisign.com/products/index.html"><font size="4">https://www.verisign.com/products/index.html</font></a><font size="4">");</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.setDoAuthentication( true );</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod( get );</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(status+""+ get.getResponseBodyAsString());</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection();</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="4">}</font></p>
<p><font size="4">8． 多线程模式下使用httpclient</font></p>
<p><font size="4">多线程同时访问httpclient，例如同时从一个站点上下载多个文件。对于同一个HttpConnection同一个时间只能有一个线程访问，为了保证多线程工作环境下不产生冲突，httpclient使用了一个多线程连接管理器的类：MultiThreadedHttpConnectionManager，要使用这个类很简单，只需要在构造HttpClient实例的时候传入即可，代码如下：</font></p>
<p><font size="4">MultiThreadedHttpConnectionManager connectionManager = </font></p>
<p><font size="4">&nbsp;&nbsp; new MultiThreadedHttpConnectionManager();</font></p>
<p><font size="4">HttpClient client = new HttpClient(connectionManager);</font></p>
<p><font size="4">以后尽管访问client实例即可。</font></p>
<p><font size="4">参考资料：</font></p>
<p><font size="4">httpclient首页：&nbsp;&nbsp;&nbsp; </font><a href="http://jakarta.apache.org/commons/httpclient/"><font size="4">http://jakarta.apache.org/commons/httpclient/</font></a><br />
<font size="4">关于NTLM是如何工作：&nbsp; </font><a href="http://davenport.sourceforge.net/ntlm.html"><font size="4">http://davenport.sourceforge.net/ntlm.html</font></a><br />
</p>
</font>
<img src ="http://www.blogjava.net/smildlzj/aggbug/161977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2007-11-20 23:52 <a href="http://www.blogjava.net/smildlzj/articles/161977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WebWork和Rome轻松实现RSS </title><link>http://www.blogjava.net/smildlzj/articles/161368.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Sun, 18 Nov 2007 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/smildlzj/articles/161368.html</guid><wfw:comment>http://www.blogjava.net/smildlzj/comments/161368.html</wfw:comment><comments>http://www.blogjava.net/smildlzj/articles/161368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/smildlzj/comments/commentRss/161368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/smildlzj/services/trackbacks/161368.html</trackback:ping><description><![CDATA[<p>WebWork的result实现非常实用，它很好的解决了View渲染的灵活性问题。这才是MVC模式的优势所在，而像JSF那样帮定JSP的MVC就吃不到这个甜头了。说WebWork2是Model 2 MVC的巅峰就在这些灵活的地方。 <br />
闲扯这个不是主要目的。现在Rome是Java下最常用的RSS包，最近消息似乎要转入Apache的Abdera合并变成更强大的聚合引擎。用Rome生成和解析RSS都很方便。今天讨论一下使用ROME给网站生成RSS，并通过WebWork2的Result机制渲染。 <br />
最初是从WebWork的Cookbook上看到的RomeResult的文章，一看就会，我这里其实不过是举个详细点的例子，注意我使用的是<span style="color: red">WebWork 2.2.2</span>和<span style="color: red">Rome 0.8</span>： <br />
http://wiki.opensymphony.com/display/WW/RomeResult <br />
参考了和东的这篇Blog，利用rome写rss feed生成程序： <br />
<a href="http://hedong.3322.org/newblog/archives/000051.html" target="blank">http://hedong.3322.org/newblog/archives/000051.html</a>
<p>首先创建RomeResult类： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">package</span><span>&nbsp;com.goldnet.framework.webwork.result; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;java.io.Writer; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;org.apache.log4j.Logger; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.opensymphony.webwork.ServletActionContext; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.ActionInvocation; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.Result; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;com.sun.syndication.feed.synd.SyndFeed; &nbsp;&nbsp;</span></span></li>
    <li class=""><span class="keyword">import</span><span>&nbsp;com.sun.syndication.io.SyndFeedOutput; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="comment">/** </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;A&nbsp;simple&nbsp;Result&nbsp;to&nbsp;output&nbsp;a&nbsp;Rome&nbsp;SyndFeed&nbsp;object&nbsp;into&nbsp;a&nbsp;newsfeed. </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;Philip&nbsp;Luppens </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RomeResult&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Result&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;-6089389751322858939L; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;feedName; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;feedType; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;Logger.getLogger(RomeResult.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/* </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(non-Javadoc) </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.opensymphony.xwork.Result#execute(com.opensymphony.xwork.ActionInvocation) </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;execute(ActionInvocation&nbsp;ai)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(feedName&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;ack,&nbsp;we&nbsp;need&nbsp;this&nbsp;to&nbsp;find&nbsp;the&nbsp;feed&nbsp;on&nbsp;the&nbsp;stack </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.error(</span><span class="string">"Required&nbsp;parameter&nbsp;'feedName'&nbsp;not&nbsp;found.&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"Make&nbsp;sure&nbsp;you&nbsp;have&nbsp;the&nbsp;param&nbsp;tag&nbsp;set&nbsp;and&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"the&nbsp;static-parameters&nbsp;interceptor&nbsp;enabled&nbsp;in&nbsp;your&nbsp;interceptor&nbsp;stack."</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;no&nbsp;point&nbsp;in&nbsp;continuing&nbsp;.. </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;don't&nbsp;forget&nbsp;to&nbsp;set&nbsp;the&nbsp;content&nbsp;to&nbsp;the&nbsp;correct&nbsp;mimetype </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletActionContext.getResponse().setContentType(</span><span class="string">"text/xml"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;get&nbsp;the&nbsp;feed&nbsp;from&nbsp;the&nbsp;stack&nbsp;that&nbsp;can&nbsp;be&nbsp;found&nbsp;by&nbsp;the&nbsp;feedName </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndFeed&nbsp;feed&nbsp;=&nbsp;(SyndFeed)&nbsp;ai.getStack().findValue(feedName); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(logger.isDebugEnabled())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span class="string">"Found&nbsp;object&nbsp;on&nbsp;stack&nbsp;with&nbsp;name&nbsp;'"</span><span>&nbsp;+&nbsp;feedName&nbsp;+&nbsp;</span><span class="string">"':&nbsp;"</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;feed); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(feed&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(feedType&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Accepted&nbsp;types&nbsp;are:&nbsp;rss_0.90&nbsp;-&nbsp;rss_2.0&nbsp;and&nbsp;atom_0.3 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;There&nbsp;is&nbsp;a&nbsp;bug&nbsp;though&nbsp;in&nbsp;the&nbsp;rss&nbsp;2.0&nbsp;generator&nbsp;when&nbsp;it&nbsp;checks </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;for&nbsp;the&nbsp;type&nbsp;attribute&nbsp;in&nbsp;the&nbsp;description&nbsp;element.&nbsp;It's&nbsp;has&nbsp;a </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;big&nbsp;'FIXME'&nbsp;next&nbsp;to&nbsp;it&nbsp;(v.&nbsp;0.7beta). </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setFeedType(feedType); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndFeedOutput&nbsp;output&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SyndFeedOutput(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//we'll&nbsp;need&nbsp;the&nbsp;writer&nbsp;since&nbsp;Rome&nbsp;doesn't&nbsp;support&nbsp;writing&nbsp;to&nbsp;an&nbsp;outputStream&nbsp;yet </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Writer&nbsp;out&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;=&nbsp;ServletActionContext.getResponse().getWriter(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.output(feed,&nbsp;out); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Woops,&nbsp;couldn't&nbsp;write&nbsp;the&nbsp;feed&nbsp;? </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span class="string">"Could&nbsp;not&nbsp;write&nbsp;the&nbsp;feed"</span><span>,&nbsp;e); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//close&nbsp;the&nbsp;output&nbsp;writer&nbsp;(will&nbsp;flush&nbsp;automatically) </span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(out&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;woops&nbsp;..&nbsp;no&nbsp;object&nbsp;found&nbsp;on&nbsp;the&nbsp;stack&nbsp;with&nbsp;that&nbsp;name&nbsp;? </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span class="string">"Did&nbsp;not&nbsp;find&nbsp;object&nbsp;on&nbsp;stack&nbsp;with&nbsp;name&nbsp;'"</span><span>&nbsp;+&nbsp;feedName &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;</span><span class="string">"'"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setFeedName(String&nbsp;feedName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.feedName&nbsp;=&nbsp;feedName; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setFeedType(String&nbsp;feedType)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.feedType&nbsp;=&nbsp;feedType; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>程序很简单。实现了Result接口，寻找一个与feedName参数匹配的SyndFeed实例，然后转换为指定的feedType类型，然后通过rome的SyndFeedOutput输出到Response去。 <br />
然后我们给我们的WebWork配置romeResult。 <br />
在xwork.xml中配置： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"default"</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">"webwork-default"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result-types</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result-type</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"feed"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.goldnet.framework.webwork.result.RomeResult"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">result-types</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><span class="tag">&lt;</span><span class="tag-name">interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;然后是你的那些inteceptor配置等&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script>这样我们就给xwork配置了一个叫做feed的result，它就是我们的romeResult。 <br />
然后我们实现一个类，来测试一下这个romeResult。 <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>/** &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;* &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class=""><span>package&nbsp;com.goldnet.webwork.action.news; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.opensymphony.xwork.ActionSupport; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.sun.syndication.feed.synd.SyndCategory; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.sun.syndication.feed.synd.SyndCategoryImpl; &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.sun.syndication.feed.synd.SyndContent; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.sun.syndication.feed.synd.SyndContentImpl; &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.sun.syndication.feed.synd.SyndEntry; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.sun.syndication.feed.synd.SyndEntryImpl; &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;com.sun.syndication.feed.synd.SyndFeed; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;com.sun.syndication.feed.synd.SyndFeedImpl; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;org.apache.commons.logging.Log; &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;org.apache.commons.logging.LogFactory; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;java.util.ArrayList; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>import&nbsp;java.util.Date; &nbsp;&nbsp;</span></li>
    <li class=""><span>import&nbsp;java.util.List; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>/** &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;*&nbsp;@author&nbsp;Tin &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;* &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class=""><span>public&nbsp;class&nbsp;TestFeedCreateAction&nbsp;extends&nbsp;ActionSupport&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;long&nbsp;</span><span class="attribute">serialVersionUID</span><span>&nbsp;=&nbsp;-2207516408313865979L; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;transient&nbsp;final&nbsp;Log&nbsp;</span><span class="attribute">log</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">LogFactory</span><span>.getLog(TestFeedCreateAction.class); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;</span><span class="attribute">maxEntryNumber</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">25</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;</span><span class="attribute">siteUrl</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">"http://127.0.0.1"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SyndFeed&nbsp;</span><span class="attribute">feed</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TestFeedCreateAction()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;execute()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">News</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="attribute">newsList</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">getNewsList</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(log.isDebugEnabled())&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("Geting&nbsp;feed!&nbsp;and&nbsp;got&nbsp;news&nbsp;"&nbsp;+&nbsp;newsList.size()&nbsp;+ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;pieces."); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">feed</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;SyndFeedImpl(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setTitle(converttoISO("测试中的新闻系统")); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setDescription(converttoISO("测试中的新闻系统：测试Rome&nbsp;Result")); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setAuthor(converttoISO("测试Tin")); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setLink("http://www.justatest.cn"); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">SyndEntry</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="attribute">entries</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;ArrayList</span><span class="tag">&lt;</span><span class="tag-name">SyndEntry</span><span class="tag">&gt;</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feed.setEntries(entries); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(News&nbsp;news&nbsp;:&nbsp;newsList)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndEntry&nbsp;</span><span class="attribute">entry</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;SyndEntryImpl(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setAuthor(converttoISO(news.getAuthor())); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndCategory&nbsp;</span><span class="attribute">cat</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;SyndCategoryImpl(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat.setName(converttoISO(news.getCategory())); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">SyndCategory</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="attribute">cats</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;ArrayList</span><span class="tag">&lt;</span><span class="tag-name">SyndCategory</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;cats.add(cat); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setCategories(cats); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndContent&nbsp;</span><span class="attribute">content</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;SyndContentImpl(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content.setValue(converttoISO(news.getContent())); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">SyndContent</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="attribute">contents</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;ArrayList</span><span class="tag">&lt;</span><span class="tag-name">SyndContent</span><span class="tag">&gt;</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.add(content); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setContents(contents); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setDescription(content); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setLink(siteUrl&nbsp;+&nbsp;"/common/news/displayNews.action?</span><span class="attribute">id</span><span>="&nbsp;+ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.getId()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setTitle(converttoISO(news.getTitle())); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setPublishedDate(news.getPublishDate()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entries.add(entry); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SUCCESS; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;String&nbsp;converttoISO(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;</span><span class="attribute">abyte0</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">s</span><span>.getBytes("UTF-8"); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;String(abyte0,&nbsp;"ISO-8859-1"); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;exception)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;s; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">News</span><span class="tag">&gt;</span><span>&nbsp;getNewsList()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span class="tag">&lt;</span><span class="tag-name">News</span><span class="tag">&gt;</span><span>&nbsp;</span><span class="attribute-value">new</span><span class="attribute">newsList</span><span>&nbsp;=&nbsp;new&nbsp;ArrayList</span><span class="tag">&lt;</span><span class="tag-name">News</span><span class="tag">&gt;</span><span>(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;</span><span class="attribute">i</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">0</span><span>;&nbsp;i&nbsp;</span><span class="tag">&lt;</span><span>&nbsp;</span><span class="tag-name">maxEntryNumber</span><span>;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;News&nbsp;</span><span class="attribute-value">new</span><span class="attribute">news</span><span>&nbsp;=&nbsp;new&nbsp;News(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setTitle("测试标题"&nbsp;+&nbsp;i); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setContent( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"</span><span class="tag">&lt;</span><span class="tag-name">p</span><span class="tag">&gt;</span><span>测试内容测试内容</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">style</span><span>=\"color:red\"</span><span class="tag">&gt;</span><span>测试内容</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">p</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;news.setPublishDate(new&nbsp;Date()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setId(new&nbsp;Long(i)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news.setAuthor("Tin"); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsList.add(news); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;newsList; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Returns&nbsp;the&nbsp;maxEntryNumber. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;long&nbsp;getMaxEntryNumber()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;maxEntryNumber; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;maxEntryNumber&nbsp;The&nbsp;maxEntryNumber&nbsp;to&nbsp;set. &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMaxEntryNumber(int&nbsp;maxEntryNumber)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">this.maxEntryNumber</span><span>&nbsp;=&nbsp;maxEntryNumber; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;siteUrl&nbsp;The&nbsp;siteUrl&nbsp;to&nbsp;set. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSiteUrl(String&nbsp;siteUrl)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">this.siteUrl</span><span>&nbsp;=&nbsp;siteUrl; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Returns&nbsp;the&nbsp;feed. &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SyndFeed&nbsp;getFeed()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;feed; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;News&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Long&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;title; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;content; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Date&nbsp;publishDate; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;author; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;category; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Getter/Setter都省略了，使用了内部类，就是图个方便 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;本意是模仿我们常常使用的Pojo，大家的实现都不一样，我突简单，里面其实可以有复杂类型的&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>*/ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>真是不好意思，Getter/Setter占了大部分地方我省略去了。逻辑很简单，就是把我们的POJO影射到Feed的模型上面，过程很简单。我留下了几个参数可以在外面设置： <br />
maxEntryNumber显示的feed的条数，链接生成时使用的SiteUrl，当然也可以通过request获取。 <br />
下面我们配置我们的Action，注意平时我们可能使用DAO生成newsList，而不是我这个写死的getNewsList()方法，此时可能需要配合Spring进行IOC的设置，我们这里省略掉。 <br />
下面是我们这个Action的xwork配置： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"news"</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">"default"</span><span>&nbsp;</span><span class="attribute">namespace</span><span>=</span><span class="attribute-value">"/news"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"feed"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.goldnet.webwork.action.news.TestFeedCreateAction"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;每次生成15条rss&nbsp;feed&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxEntryNumber"</span><span class="tag">&gt;</span><span>15</span><span class="tag">&lt;/</span><span class="tag-name">param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;链接的前缀，我们使用Weblogic是7001，也许你的是8080&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"siteUrl"</span><span class="tag">&gt;</span><span>http://127.0.0.1:7001</span><span class="tag">&lt;/</span><span class="tag-name">param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;result是feed&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"success"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"feed"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;feed名字是feed，对应我们这个Action中的那个SyndFeed的实例的名字feed，别忘记写getter&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"feedName"</span><span class="tag">&gt;</span><span>feed</span><span class="tag">&lt;/</span><span class="tag-name">param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;制定生成的feed的类型，我这里选择rss_2.0&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;rome&nbsp;0.8支持atom_0.3、atom_1.0、rss_1.0、rss_2.0、rss_0.90、rss_0.91、rss_0.91、rss_0.91U、rss_0.92、rss_0.93、rss_0.94&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"feedType"</span><span class="tag">&gt;</span><span>rss_2.0</span><span class="tag">&lt;/</span><span class="tag-name">param</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;</span><span class="tag">&lt;/</span><span class="tag-name">result</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><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
OK，配置完毕后访问/news/feed.action就可以访问到这个feed了。倒入你的feedDeamon，看看，是不是非常简单？ <br />
不过需要考虑两个地方，一个是编码问题，看了和东说的中文问题，本没当回事，结果生成乱码（我们项目全部使用UTF-8），然后还是转了一下。没有研究ROME源代码，感觉xml不应该有UTF-8还会乱码的问题呀，也许还需要看看是否是设置不到位。还有就是对于feed如果增加了权限认证则访问比较麻烦，用feedDeamon这样的客户端就无法访问到了，因为它不会显示登陆失败后显示的登陆页面，也许放feed就要开放一点吧（当然还是有变通放案的）。 <br />
和动例子里面的rome 0.7和现在的rome 0.8相比，Api已经发生了不少变化，唉，开源要代码稳定还真难。 <br />
就这些，就到这里，粗陋了:D<br />
<br />
摘自：http://www.javaeye.com/post/125096
<img src ="http://www.blogjava.net/smildlzj/aggbug/161368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/smildlzj/" target="_blank">smildlzj</a> 2007-11-18 12:08 <a href="http://www.blogjava.net/smildlzj/articles/161368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>