﻿<?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-天行健-随笔分类-JAVA </title><link>http://www.blogjava.net/bnlovebn/category/12153.html</link><description>《周易》曰：&lt;br&gt;
天行健，君子以自强不息(乾卦)&lt;br&gt;
地势坤，君子以厚德载物(坤卦)
</description><language>zh-cn</language><lastBuildDate>Sun, 01 Jun 2008 11:40:30 GMT</lastBuildDate><pubDate>Sun, 01 Jun 2008 11:40:30 GMT</pubDate><ttl>60</ttl><item><title>Hibernate中如何使用count(*)取得表中记录总数</title><link>http://www.blogjava.net/bnlovebn/archive/2008/05/29/203841.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Thu, 29 May 2008 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2008/05/29/203841.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/203841.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2008/05/29/203841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/203841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/203841.html</trackback:ping><description><![CDATA[<div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getCount(String&nbsp;emailGroupId,&nbsp;String&nbsp;emailBatchId)<br />
<img id="Codehighlighter1_100_893_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_893_Open_Text.style.display='none'; Codehighlighter1_100_893_Closed_Image.style.display='inline'; Codehighlighter1_100_893_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_100_893_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_100_893_Closed_Text.style.display='none'; Codehighlighter1_100_893_Open_Image.style.display='inline'; Codehighlighter1_100_893_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException&nbsp;</span><span id="Codehighlighter1_100_893_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_100_893_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;HibernateUtil.currentSession();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.beginTransaction();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;count(*)&nbsp;from&nbsp;EmailSendInfo&nbsp;where&nbsp;email_group_id&nbsp;=&nbsp;:emailGroupId&nbsp;and&nbsp;batch_id&nbsp;=&nbsp;:batchId</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createQuery(hql);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setString(</span><span style="color: #000000">"</span><span style="color: #000000">emailGroupId</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;emailGroupId);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setString(</span><span style="color: #000000">"</span><span style="color: #000000">batchId</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;emailBatchId);<br />
<img id="Codehighlighter1_497_632_Open_Image" onclick="this.style.display='none'; Codehighlighter1_497_632_Open_Text.style.display='none'; Codehighlighter1_497_632_Closed_Image.style.display='inline'; Codehighlighter1_497_632_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_497_632_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_497_632_Closed_Text.style.display='none'; Codehighlighter1_497_632_Open_Image.style.display='inline'; Codehighlighter1_497_632_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_497_632_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_497_632_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">//*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;(Iterator&nbsp;it&nbsp;=&nbsp;query.iterate();&nbsp;it.hasNext();)&nbsp;{&nbsp;return<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;((Integer)&nbsp;it.next()).intValue();&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_646_722_Open_Image" onclick="this.style.display='none'; Codehighlighter1_646_722_Open_Text.style.display='none'; Codehighlighter1_646_722_Closed_Image.style.display='inline'; Codehighlighter1_646_722_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_646_722_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_646_722_Closed_Text.style.display='none'; Codehighlighter1_646_722_Open_Image.style.display='inline'; Codehighlighter1_646_722_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_646_722_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_646_722_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((Integer)&nbsp;query.iterate().next()).intValue();<br />
<img id="Codehighlighter1_744_800_Open_Image" onclick="this.style.display='none'; Codehighlighter1_744_800_Open_Text.style.display='none'; Codehighlighter1_744_800_Closed_Image.style.display='inline'; Codehighlighter1_744_800_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_744_800_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_744_800_Closed_Text.style.display='none'; Codehighlighter1_744_800_Open_Image.style.display='inline'; Codehighlighter1_744_800_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_744_800_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_744_800_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HibernateException(</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_810_887_Open_Image" onclick="this.style.display='none'; Codehighlighter1_810_887_Open_Text.style.display='none'; Codehighlighter1_810_887_Closed_Image.style.display='inline'; Codehighlighter1_810_887_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_810_887_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_810_887_Closed_Text.style.display='none'; Codehighlighter1_810_887_Open_Image.style.display='inline'; Codehighlighter1_810_887_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_810_887_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_810_887_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtil.closeSession();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<span id="_100_889_Open_Text"><span style="color: #000000"><br />
spring+hibernate<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">第一种方法：</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;count(*)&nbsp;from&nbsp;User&nbsp;as&nbsp;user</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;Integer&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Integer)getHibernateTemplate().find(hql).listIterator().next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;count.intValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">第二种方法：</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;String&nbsp;hql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;count(*)&nbsp;from&nbsp;User&nbsp;as&nbsp;user</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((Integer)getHibernateTemplate().iterate(hql).next()).intValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">第三种方法：</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;String&nbsp;hql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">select&nbsp;count(*)&nbsp;from&nbsp;User&nbsp;as&nbsp;user</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;getHibernateTemplate().createQuery(&nbsp;getSession(),hql);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((Integer)query.uniqueResult()).intValue();&nbsp;</span></div>
<br />
</span></span></div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/203841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2008-05-29 14:59 <a href="http://www.blogjava.net/bnlovebn/archive/2008/05/29/203841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error:java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource</title><link>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Wed, 12 Sep 2007 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/144500.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/144500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/144500.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10pt; color: black"><span style="font-size: 10pt; color: black"><u><span style="font-size: 10pt; color: navy">java.lang.ClassNotFoundException</span></u><span style="font-size: 10pt; color: black">: org.apache.commons.dbcp.BasicDataSource</span><br />
很显然这是一个没有找到对应的类文件的异常。<br />
<span style="font-size: 10pt; color: black">还有两个包commons-pool.jar和commons-dbcp-1.2.1.jar需要引入到工程中。</span></span></span></div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/144500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-09-12 15:16 <a href="http://www.blogjava.net/bnlovebn/archive/2007/09/12/144500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在你的struts应用中施展部分AJAX魔法(翻译)[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Tue, 31 Jul 2007 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/133607.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/133607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/133607.html</trackback:ping><description><![CDATA[<span style="COLOR: #00ff00; BACKGROUND-COLOR: #666699">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文将介绍在JSP页面中包含一些JavaScript这样一个简单而有效的方法来结合AJAX和Struts。在此我们介绍如何重新使用已经存在的Struts actions，但此技术同样可用于你选择的其他Java-Web 框架。本方法同样可平移到Struts或者JSF的下一个版本。 <br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX是&#8220;异步的JavaScript和XML&#8221;的缩写。这是一项技术，而不是一个如Struts一样的框架。为什么在AJAX周围会有这么多的关注呢?这是因为AJAX使web页面看起来并不像一个平面的文档，而更像用户所期望的如桌面应用的动态GUI应用程序。AJAX技术能在很多的浏览器上使用(包括IE和Netscape/Mozilla)。它已经为Microsoft(用于Outlook的web客户端)和Google(用户Google Maps和Gmail)所使用。
<p>　　未使用AJAX之前</p>
<p>　　目前大多数的Struts应用都是标准的&#8220;如同一个平面文档的web页面&#8221;的结构。如果你想模仿一些桌面应用程序(比如那些使用<a href="http://dev.yesky.com/devjava/" target=_blank>Java</a> Swing，Visual Basic，或者Delphi建立的应用程序)，那么你有两个选择:你可以发送所有的可能作为页面的一部分被请求的信息，使用大量的JavaScript来操作其动态的显示(一个很慢并且非企业级Java的方法);或者你可以不改变形式地提交到后台服务器(一种有效的方法) 。AJAX提高给你了融合前面的最佳解决方案:动态的页面，但是大多数的应用是在你的web服务器的Java程序来处理的。</p>
<p>　　AJAX 101</p>
<p>　　AJAX和现有的动态HTML技术非常相似，并在其上增加了一个发送到&#8220;后台&#8221;服务器的请求来获取需要的新的或者更新的信息。AJAX的机制在其他地方已经有详细的说明――请查看本文后的Resources来获取更多。但是你至少需要知道:</p>
<ul>
    <li>　　1. XMLHttpRequest (如果你使用的是IE浏览器的话，则是Microsoft.XMLHTTP的ActiveX的对象)。这些对象，你可以在web页面中使用JavaScript调用。他们允许你作为后台的调用方式来请求web服务器的内容(例如，在表单提交后，屏幕并不像平时一样显示&#8220;空白&#8221;)。
    <li>　　2. XMLHttpRequest 和Microsoft.XMLHTTP 返回的内容可以作为XML或者文本来处理。JavaScript(在你页面上的)可以使用请求的新内容来更新页面。
    <li>　　3. 整个处理过程可以由普通的JavaScript事件来触发:onclick，onchange，onblur，等。</li>
</ul>
<p>　　在你的Struts应用中使用AJAX</p>
<p>　　你阅读了本文，然后你会对使用AJAX来创建动态的web页面感兴趣，并且想知道如何将它加入到你的Struts应用中。这只是选择之一。那么你会如何选择呢?</p>
<ul>
    <li>　　&#183; 等待，知道Struts的下一个版本融合了AJAX技术。如果Struts开发者准备开发一个新的应用，这或许会是一个好的选择。再后面，可能会是要求JSF也这样做――对其本身并不一件坏事，但是对于已经存在的系统这将会带来最根本的改变。
    <li>　　&#183; 你也可以直接采用新的方法，比如Direct Web Remoting (DWR) 和Ruby on Rails，这些都是专为建立AJAX应用的。如果你考虑不使用Struts来开发web的话，那么这些都是很又用的框架，并且值得一试。但是，这也同时意味着你必须要重写你的应用。
    <li>　　&#183; 在你已经存在的Struts应用中增加AJAX。既然AJAX只是一项技术而并非框架，那么它就很容易融入到Struts中。作为现有的系统，其稳定性(如，保持现有的库文件)是相当重要的。所以这个方法被推荐，并且我们将在后面详细介绍。</li>
</ul>
<p>　　我们选择在Struts应用中增加AJAX的优势是:</p>
<ul>
    <li>　　1. 它并不需要任何新的库文件或者服务器代码;只需要使用现有的Struts库文件和action。
    <li>　　2. 解决方案中所有部分――JavaScript，XML，Java和Struts――早已为广泛所知。
    <li>　　3. 此应用可以一块一块地移植到AJAX;我们可以确定哪些部分对用户有益，并首先将它们更新到动态AJAX显示。</li>
</ul>
<p>　　实现方案</p>
<p>　　我们如何真正的贯彻我们的选择呢?我们首先应该注意一个&#8220;标准的&#8221;(没有AJAX)Struts应用是如何工作的。在此应用中，一个一般的事件流程如下:</p>
<ul>
    <li>　　1. 使用点击超链接或者表单的提交按钮，用户发送请求。
    <li>　　2. web服务器运行处理请求的Struts Action来生成一个web页面。
    <li>　　3. 浏览器显示web页面。
    <li>　　4. 当用户点击保存的时候，信息由Struts框架中一个ActionForm类来转换并发送到服务器。
    <li>　　5. 然后，Struts框架调用Struts Action来出来请求(如，保存数据到数据库中)。
    <li>　　6. 页面再一次回传，处理流程继续。</li>
</ul>
<p>　　现有的Struts应用</p>
<p>　　一个演示事件流程的简单Struts应用可以在以下地址下载: <a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target=_blank>struts-non-ajax.zip</a>。此基于Struts的应用，是基于用户的输入显示或者隐藏蓝色和绿色的表格。图1显示了载入初始页面的画面。图2显示了用户输入值并点击了提交后的画面。虽然简单，但它已经足以表示一个Struts的工作流程。</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/w5xpm4gf26fg.jpg" border=0></p>
<p>　　图 1. 没有AJAX的例子:初始屏幕</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/e1992717m03d.jpg" border=0></p>
<p>　　图 2. 没有AJAX的例子:输入值并点击了提交</p>
服务器端的代码是:一个Struts Action使用struts-config.xml 中定义的值转发到(相同的)JSP。这个例子代码中一些需要注意的地方是:
<ul>
    <li>　　&#183;struts-config.xml文件将所有的请求重定向到http://localhost:8080/struts-non-ajax/(或者和你自己的服务器相同)的index.jsp。
    <li>　　&#183; index.jsp 包含了一个两个文本框的Struts form(showBlue和showGreen)。该页面同样包含了标签，但是如同两个文本框被初始化为空，标签之间的内容并不显示。
    <li>　　&#183; 用户输入值(true或者false)并点击提交按钮，处理控制(经过Struts框架，读取struts-config.xml)提交到SampleAction类中。
    <li>　　&#183;SampleAction记录下值，然后转发到index.jsp。一个成熟的Struts应用可能会处理更多的事情，不如保存或者查询数据库等。
    <li>　　&#183; index.jsp 现在重新处理请求;如果ShowBlue或者ShowGreen的值是true，这些表格就显示出来。</li>
</ul>
<p>　　该应用并没有任何&#8220;错误&#8221;。类似的Struts项目好多年都是这样做的。但是，我们如何在不添加复杂的JavaScript或者频繁的表单提交的前提下，为此应用增加动态的元素呢?</p>
<p>　　我们的第一个Struts AJAX应用</p>
<p>　　观察下下面的图3和图4。第一眼看上去，它们和前面的例子没有说明区别。它们的不同之处在于，页面载入后(图3)然后文本框中的值改变了，窗体自动提交而不显示空白的，然后在图4中显示结果。普通的提交按钮仍然在，你也可以选择使用它。</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/6s0y6u481893.jpg" border=0></p>
<p>　　图 3. 页面载入后的AJAX例子</p>
<p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/04/xc0k049x6hf0.jpg" border=0></p>
<p>　　图 4. AJAX调用后的AJAX例子</p>
<p>　　添加AJAX是出奇的容易。服务器端的代码和前面的例子是一样的: 一个Struts的ActionForm来后去数据，一个Struts的Action来执行需要的任务(例如，存储数据库)然后转发到适当的JSP页面来显示结果。</p>
<p>　　继续</p>
<p>　　如果你希望就此停止阅读(跳过这个例子的工作说明)，但是这里的是和你需要转换你的Struts应用到一个Struts-AJAX应用同样的风格:</p>
<ul>
    <li>　　1. 在你的web页面中引入一个Ajax.js (该文件是struts-ajax.zip 例文件中的一部分)。Ajax.js 包含了所有需要发送和接收AJAX调用的JavaScript方法。
    <li>　　2. 确保你希望在AJAX调用中更新的web页面的部分包含在标签中，并且给每个标签一个id。
    <li>　　3. 当一些事件触发的时候就更新页面(例如，文本框的the onchange()方法)，调用retrieveURL()方法，通过URL传递到需要执行服务器端处理的Struts Action。
    <li>　　4. 为了页面的显示/更新，最简单的方法是Struts Action转发回同样的页面。在本例中，showGreen/showBlue 文本框中的onchange()方法来触发AJAX调用。</li>
</ul>
<p>　　JavaScript方法retrieveURL()调用服务器的Struts(通过URL)，获取JSP响应，然后更新显示页面中的 标签中的部分。就是这么简单!</p>
<p>　　AJAX解决方案的细节</p>
<p>　　我们将例子变为AJAX-Struts应用的时候，需要三个变化:</p>
<ul>
    <li>　　1. 增加一个JavaScript方法来完成到服务器的&#8220;背后的&#8221;AJAX调用。
    <li>　　2. 增加JavaScript代码来接收服务器的响应并更新页面。
    <li>　　3. 在JSP页面增加标签标签，这个标签中内容将在AJAX调用中更新。</li>
</ul>
<p>　　我们将详细的说明上面的每一步。</p>
发送AJAX请求到服务器
<p>　　有两个方法(在下面列出)用于发送请求到服务器。</p>
<p>　　&#183; retrieveURL()方法获得服务器的URL和Struts form。URL用于使用AJAX，form的值用于传递到服务器。</p>
<p>　　&#183; getFormAsString()方法用于将retrieveURL()中form命名的值组装成查询字符串，并发送到服务器。</p>
<p>　　使用方法很简单，使用onclick()/onChange()事件来触发retrieveURL()更新显示。</p>
<p>　　在这两个方法中有一些有趣的东西。</p>
<p>　　在retrieveURL()方法中，req.onreadystatechange = processStateChange (注意，没有括号)这一行来告诉浏览器在服务器响应到达的时候调用processStateChange()方法(该方法将在后面介绍)。retrieveURL()方法中(现在已经是AJAX的标准了)同样决定是使用IE浏览器(ActiveX)还是使用Netscape/Mozilla (XmlHttpRequest) 来实现跨浏览器兼容。</p>
<p>　　getFormAsString()方法将HTML form转换成字符串连接在URL后面(这样就允许我们发送HTTP GET请求)。这个字符串是经过转换的(比如，空格转换成%20等)，并且是一个Struts能将其组装成ActionForm的格式(并不需要Struts清楚的明白这个是来之AJAX的请求)。注意，在本例中我们使用HTTP GET，使用HTTP POST的方法也是类似的。</p>
<p>function retrieveURL(url,nameOfFormToPost) {</p>
<p>//将url转换成字符串<br>url=url+getFormAsString(nameOfFormToPost);</p>
<p>//调用AJAX<br>if (window.XMLHttpRequest) { </p>
<p>// 非IE浏览器<br>req = new XMLHttpRequest();<br>req.onreadystatechange = processStateChange;<br>try {<br>req.open("GET", url, true); <br>} catch (e) {<br>alert("Server Communication Problem\n"+e);<br>}<br>req.send(null);<br>} else if (window.ActiveXObject) {<br>// IE</p>
<p>req = new ActiveXObject("Microsoft.XMLHTTP");<br>if (req) {<br>req.onreadystatechange=processStateChange;<br>req.open("GET", url, true);<br>req.send();<br>}<br>}<br>}</p>
<p>getFormAsString() 是一个&#8220;私有&#8221; 方法，在retrieveURL()中使用。</p>
<p>function getFormAsString(formName){</p>
<p>//设置返回字符串<br>returnString ="";</p>
<p>//取得表单的值<br>formElements=document.forms[formName].elements;</p>
<p>//循环数组，组装url<br>//像'/strutsaction.do&amp;name=value'这样的格式</p>
<p>for(var i=formElements.length-1;i&gt;=0; --i ){<br>//转化每一个值<br>returnString+="&amp;" <br>+escape(formElements[i].name)+"=" <br>+escape(formElements[i].value);<br>}</p>
<p>//返回字符串<br>return returnString; <br>}</p>
根据AJAX的响应更新web页面
<p>　　到现在为止，我们学习过了使用JavaScript来完成AJAX调用(前面列出)，Struts Action，ActionForm以及JSP(基本没有变化，只是增加了标签)。为了完善我们对Struts-AJAX项目的了解，我们需要了解三个用于根据服务器返回的结果而更新页面的JavaScript方法。</p>
<ul>
    <li>　　&#183; processStateChange(): 该方法在AJAX调用前设定。它在服务器响应到达后由XMLHttpRequest/Microsoft.XMLHTTP 对象调用。
    <li>　　&#183;splitTextIntoSpan(): 根据响应，循环取出数组中的元素组装成NewContent。
    <li>　　&#183;replaceExistingWithNewHtml(): 根据span元素数组，循环搜索，将里面的元素调换掉页面中和它的'someName'相同的中的内容。注意，我们使用的是req.responseText 方法来获得返回的内容(它允许我们操作任何文本的响应)。与此相对于的是req.responseXml (它的作用更大，但是要求服务器返回是XHTML或者XML)。</li>
</ul>
<p>function processStateChange() {</p>
<p>if (req.readyState == 4) { // 完成<br>if (req.status == 200) { // 响应正常</p>
<p>//将响应的文本分割成Span元素<br>spanElements = <br>splitTextIntoSpan(req.responseText);</p>
<p>//使用这些Span元素更新页面<br>replaceExistingWithNewHtml(spanElements);</p>
<p>} else {<br>alert("Problem with server response:\n " <br>+ req.statusText);<br>}<br>}<br>}<br>replaceExistingWithNewHtml() 是为processStateChange()使用的&#8220;私有&#8221;方法。</p>
<p>function replaceExistingWithNewHtml <br>(newTextElements){</p>
<p>//循环newTextElements<br>for(var i=newTextElements.length-1;i&gt;=0;--i){</p>
<p>//判断是否以 if(newTextElements[i]. <br>indexOf("-1){</p>
<p>//获得span的名字- 设置在第一和第二个引号之间<br>//确认span元素是以下的格式<br>//NewContent<br>startNamePos=newTextElements[i]. <br>indexOf('"')+1;<br>endNamePos=newTextElements[i]. <br>indexOf('"',startNamePos);<br>name=newTextElements[i]. <br>substring(startNamePos,endNamePos);</p>
<p>//获得内容－在第一个&gt;标记后的所有内容<br>startContentPos=newTextElements[i]. <br>indexOf('&gt;')+1; <br>content=newTextElements[i].<br>substring(startContentPos);</p>
<p>//现在更新现有的Document中的元素， <br>// 确保文档存在该元素<br>if(document.getElementById(name)){<br>document.getElementById(name). <br>innerHTML = content;<br>}<br>}<br>}<br>splitTextIntoSpan() 是为processStateChange() 使用的&#8220;私有&#8221;方法。<br>function splitTextIntoSpan(textToSplit){</p>
<p>//分割文档<br>returnElements=textToSplit. <br>split("")</p>
<p>//处理每个元素 <br>for(var i=returnElements.length-1;i&gt;=0;--i){</p>
<p>//删除掉第一个span后面的元素<br>spanPos = returnElements[i]. <br>indexOf(" </p>
<p>//如果找到匹配的，获得span前的内容<br>if(spanPos&gt;0){<br>subString=returnElements[i].<br>substring(spanPos);<br>returnElements[i]=subString;<br>} <br>}<br>return returnElements;<br>}</p>
<p>　　新的控制流</p>
<p>　　添加以下的JavaScript代码到我们的应用中，以下的步骤将在服务器和浏览器中执行。</p>
<ul>
    <li>　　1. 如同一个普通Struts应用装载页面。
    <li>　　2. 用户改变文本框的值，触发一个onChange() 事件，调用retrieveURL() 方法。
    <li>　　3. 该JavaScript方法通过发送Struts明白的表单变量(后台)请求到服务器的Struts Action。
    <li>　　4. 该JavaScript方法同样设定了第二个JavaScript方法的名字，此方法将到服务器响应完毕后调用。本例子中，设定为processStateChange() 方法。
    <li>　　5. 如我们所预期的，服务器响应完毕，调用processStateChange() 方法。
    <li>　　6. JavaScript在(新的)服务器响应中循环取出所有元素。将页面上存在与获得元素名字相同的 中的元素替换掉。</li>
</ul>
<p>　　在你的应用中设计AJAX</p>
<p>　　以上描述的JavaScript方法能在大多数的应用中使用，包括比我们的例子复杂得多的。但是，在使用之前，你需要注意以下几点:</p>
<p>　　&#183; 避免复制代码，最好在初始化请求(如，显示完整的页面)和AJAX(更新部分页面)请求中使用相同的Struts Action和JSP。</p>
<p>　　&#183;在公共的Action(控制器)中，决定JSP页面(所有的JSP页面或者其中的一部分)中的一个区域需要传送到浏览器。通过在web服务器的session或者ActionForm中设定标记来让JSP页面知道哪些部分需要提交。</p>
<p>　　&#183; 在JSP中，使用Struts 或者JSTL标签来决定提交的HTML区域。</p>
<p>　　使用AJAX的本例子，可以在以下下载: <a href="http://sourceforge.net/project/showfiles.php?group_id=99476&amp;package_id=158438" target=_blank>struts-Ajax.zip</a></p>
<p>　　结语</p>
<p>　　AJAX技术允许我们在创建和使用web应用的时候完全的改变。本文介绍了一个简单的技术，在现有的Struts应用中增加Struts的处理。它允许我们利用我们已有的东西，不仅仅是代码，还包括了开发的技能。作为一个好的产品，它同样允许我们写出更清晰，更具移植性的Java Struts应用。</p>
<p>版权声明：Techtarget获Matrix授权发布,如需转载请联系Matrix<br>作者:作者:Paul Browne;pawenwen(作者的blog:http://blog.matrix.org.cn/page/pawenwen)<br>译文:<a href="http://blog.matrix.org.cn/page/pawenwen?entry=%E5%9C%A8%E4%BD%A0%E7%9A%84struts%E5%BA%94%E7%94%A8%E4%B8%AD%E6%96%BD%E5%B1%95%E9%83%A8%E5%88%86ajax%E9%AD%94%E6%B3%95_%E7%BF%BB%E8%AF%91" target=_blank>点击</a></p>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/133607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-31 16:33 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/31/133607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Servlet与JSP中取得当前文件所在的相对路径与绝对路径（路径相关）</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/27/132741.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Fri, 27 Jul 2007 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/27/132741.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/132741.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/27/132741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/132741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/132741.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">根目录所对应的绝对路径:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;request.getServletPath()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>String&nbsp;strPathFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;request.getSession().getServletContext().getRealPath(request.getRequestURI());&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件的绝对路径:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;strPathFile&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>String&nbsp;strDirPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;File(request.getSession().getServletContext().getRealPath(request.getRequestURI())).getParent();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">目录的绝对路径:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;strDirPath&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);&nbsp;<br>&nbsp;&nbsp;&nbsp; this.getServlet().getServletContext().getRealPath("/");//在struts的action中取得当前系统的根目录<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br>　举例：<a href="http://localhost:7001/myservlet/somepath/test?someparam=somevalue">http://localhost:7001/myservlet/somepath/test?someparam=somevalue</a><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>request.getPathInfo()：返回</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">somepath</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">test<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>request.getRequestURL()：返回http:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">localhost:7001/myservlet/somepath/test</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">request.getRequestURI()：返回</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">myservlet</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">somepath</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">test<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>request.getServletPath()：返回</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">myservlet<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>request.getQueryString()：返回someparam</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">somevalue<br>&nbsp;&nbsp;&nbsp; request.getContextPath();&nbsp; 返回项目名<u><font color=#0000ff>/myservlet</font></u></span></div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/132741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-27 12:23 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/27/132741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts+FCKeditor修改读取的html文本</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/25/132216.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Wed, 25 Jul 2007 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/25/132216.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/132216.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/25/132216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/132216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/132216.html</trackback:ping><description><![CDATA[因为<span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean:write　默认的filter是true。表示把html敏感标签转换成转换成它们实体的等价物。如&lt;转换成&amp;lt。设为false则不转换。</span><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">FCK:editor&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="classContent"</span><span style="COLOR: #ff0000">&nbsp;basePath</span><span style="COLOR: #0000ff">="/ECR_WWW/FCKeditor/"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="COLOR: #0000ff">="500"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height</span><span style="COLOR: #0000ff">="500"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skinPath</span><span style="COLOR: #0000ff">="/ECR_WWW/FCKeditor/editor/skins/silver/"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean:write&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="articleAdminForm"</span><span style="COLOR: #ff0000">&nbsp;property</span><span style="COLOR: #0000ff">="classContent"</span><span style="COLOR: #ff0000">&nbsp;filter</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">FCK:editor</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/132216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-25 10:06 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/25/132216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKeditor2.4 JSP版使用[转] </title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132119.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Tue, 24 Jul 2007 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132119.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/132119.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132119.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/132119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/132119.html</trackback:ping><description><![CDATA[<p>1.下载<br>FCKeditor2.3 (FCKeditot for java)<br>FCKeditor2.4 (FCKeditor基本文件)<br>以下是下载地址：<br><a href="http://www.fckeditor.net/download/default.html">http://www.fckeditor.net/download/default.html</a></p>
<p>2.建立项目:<br>建立项目tomcat/webapps/TestFCKeditor.</p>
<p>3.将FCKeditor2.4解压缩<br>将FCKeditor2.4解压缩,将整个目录FCKeditor复制到项目的根目录下，并将解压缩出来的文件夹fckeditor重命名为FCKeditor<br>目录结构为：tomcat/webapps/TestFCKeditor/FCKeditor<br>然后将FCKeditor-2.3.zip（java）压缩包中\web\WEB-INF\lib\目录下的两个jar文件拷到项目的\WEB-INF\ lib\目录下。把其中的src目录下的FCKeditor.tld文件copy到TestFCKedit/WEB-INF/下</p>
<p>4.合并web.xml:<br>将FCKeditor-2.3.zip压缩包中\web\WEB-INF\目录下的web.xml文件合并到项目的\WEB-INF\目录下的web.xml文件中。</p>
<p><br>5. 修改合并后的web.xml文件<br>修改合并后的web.xml文件，将名为SimpleUploader的Servlet的enabled参数值改为true，<br>以允许上传功能，Connector Servlet的baseDir参数值用于设置上传文件存放的位置。<br>在web.xml最后添加标签定义:</p>
<p>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;/TestFCKeditor&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/FCKeditor.tld&lt;/taglib-location&gt;<br>&nbsp;&lt;/taglib&gt;</p>
<p>现在的web.xml文件没有&lt;taglib&gt;标签了，应该直接在jsp文件中使用：&lt;%@ taglib uri="<a href="http://fckeditor.net/tags-fckeditor">http://fckeditor.net/tags-fckeditor</a>" prefix="FCK" %&gt;</p>
<p>&nbsp;</p>
<p>6. 映射:<br>上面文件中两个servlet的映射分别为：/editor/filemanager/browser/default/connectors/jsp/connector<br>和/editor/filemanager/upload/simpleuploader，需要在两个映射前面加上/FCKeditor，<br>即改为/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector和<br>/FCKeditor/editor/filemanager/upload/simpleuploader。<br>这两个名字根据你放在工程中的FCKeditor文件夹名称而定。。</p>
<p><br>7.修改skin文件夹<br>进入skin文件夹，如果你想使用fckeditor默认的这种奶黄色，<br>那就把除了default文件夹外的另两个文件夹直接删除.（建议不删除，以后要用到其中的一个文件夹）</p>
<p>8.删除无用文件<br>删除/FCKeditor/目录下除fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文件以外的所有文件，保留文件夹editor<br>删除目录/editor/_source,<br>删除/editor/filemanager/browser/default/connectors/下的所有文件<br>删除/editor/filemanager/upload/下的所有文件<br>删除/editor/lang/下的除了fcklanguagemanager.js（我下载的没有这个文件）, en.js, zh.js, zh-cn.js四个文件的所有文件</p>
<p>9.修改配置：<br>打开/FCKeditor/fckconfig.js<br>修改 FCKConfig.DefaultLanguage = 'zh-cn' ;<br>把FCKConfig.LinkBrowserURL等的值替换成以下内容：<br>FCKConfig.LinkBrowserURL<br>= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;</p>
<p>FCKConfig.ImageBrowserURL<br>= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/jsp/connector" ;</p>
<p>FCKConfig.FlashBrowserURL<br>= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/jsp/connector" ;</p>
<p>FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=File' ;<br>FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Flash' ;<br>FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Image' ;</p>
<p>10.其它<br>fckconfig.js总配置文件，可用记录本打开，修改后将文件存为utf-8 编码格式。找到：</p>
<p>FCKConfig.TabSpaces = 0 ; 改为FCKConfig.TabSpaces = 1 ; 即在编辑器域内可以使用Tab键。</p>
<p>如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了，<br>在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic，<br>也就是基本的toolbar，找到：<br>FCKConfig.ToolbarSets["Basic"] = [<br>['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-',<br>'Smiley','SpecialChar','Replace','Preview'] ] ;<br>这是改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台<br>页直接访问和上传文件， fckeditor还支持编辑域内的鼠标右键功能。</p>
<p>FCKConfig.ContextMenu = ['Generic',/*'Link',*/'Anchor',/*'Image',*/'Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField',<br>/*'ImageButton',*/'Button','BulletedList','NumberedList','TableCell','Table','Form'] ;</p>
<p>这也是改过的把鼠标右键的&#8220;链接、图像，FLASH，图像按钮&#8221;功能都去掉。</p>
<p>　　找到： FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;<br>加上几种我们常用的字体<br>FCKConfig.FontNames<br>= '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;</p>
<p><br>11.添加文件<br>添加文件 /TestFCKeditor/test.jsp:<br>&lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&gt;<br>&lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&gt;<br>&lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&gt;&lt;/script&gt;</p>
<p>&lt;%--<br>三种方法调用FCKeditor<br>1.FCKeditor自定义标签 (必须加头文件 &lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&gt; )<br>2.script脚本语言调用 (必须引用 脚本文件 &lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&gt;&lt;/script&gt; )<br>3.FCKeditor API 调用 (必须加头文件 &lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&gt; )<br>--%&gt;</p>
<p><br>//标签调用方式<br>&lt;%--<br>&lt;form action="show.jsp" method="post" target="_blank"&gt;<br>&lt;FCK:editor id="content" basePath="/TestFCKeditor/FCKeditor/"<br>width="700"<br>height="500"<br>skinPath="/TestFCKeditor/FCKeditor/editor/skins/silver/"<br>toolbarSet = "Default"<br>&gt;<br>input<br>&lt;/FCK:editor&gt;<br>&lt;input type="submit" value="Submit"&gt;<br>&lt;/form&gt;<br>--%&gt;</p>
<p><br>//JS调用方式<br>&lt;form action="show.jsp" method="post" target="_blank"&gt;<br>&lt;table border="0" width="700"&gt;&lt;tr&gt;&lt;td&gt;<br>&lt;textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px"&gt;input&lt;/textarea&gt;<br>&lt;script type="text/javascript"&gt;<br>var oFCKeditor = new FCKeditor('content') ;<br>oFCKeditor.BasePath = "/TestFCKeditor/FCKeditor/" ;<br>oFCKeditor.Height = 400;<br>oFCKeditor.ToolbarSet = "Default" ;<br>oFCKeditor.ReplaceTextarea();<br>&lt;/script&gt;<br>&lt;input type="submit" value="Submit"&gt;<br>&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br>&lt;/form&gt;</p>
<p><br>//FCKeditor API 调用<br>&lt;%--<br>&lt;form action="show.jsp" method="post" target="_blank"&gt;<br>&lt;%<br>FCKeditor oFCKeditor ;<br>oFCKeditor = new FCKeditor( request, "content" ) ;<br>oFCKeditor.setBasePath( "/TestFCKeditor/FCKeditor/" ) ;<br>oFCKeditor.setValue( "input" );<br>out.println( oFCKeditor.create() ) ;<br>%&gt;<br>&lt;br&gt;<br>&lt;input type="submit" value="Submit"&gt;<br>&lt;/form&gt;<br>--%&gt;</p>
<p>添加文件/TestFCKeditor/show.jsp:<br>&lt;%<br>String content = request.getParameter("content");<br>out.print(content);<br>%&gt;</p>
<p>&nbsp;</p>
<p><br>12.测试<br>浏览<a href="http://localhost:8080/TestFCKeditor/test.jsp">http://localhost:8080/TestFCKeditor/test.jsp</a> </p>
<p><br>最后注意。。不同的版本 变量名称可能不一样。请参考你使用的API文档</p>
<p>配置选项:</p>
<p>AutoDetectLanguage=true/false 自动检测语言<br>BaseHref="" 相对链接的基地址<br>ContentLangDirection="ltr/rtl" 默认文字方向<br>ContextMenu=字符串数组,右键菜单的内容<br>CustomConfigurationsPath="" 自定义配置文件路径和名称<br>Debug=true/false 是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容<br>DefaultLanguage="" 缺省语言<br>EditorAreaCss="" 编辑区的样式表文件<br>EnableSourceXHTML=true/false 为TRUE时,当由可视化界面切换到代码页时,把HTML处理成XHTML<br>EnableXHTML=true/false 是否允许使用XHTML取代HTML<br>FillEmptyBlocks=true/false 使用这个功能,可以将空的块级元素用空格来替代<br>FontColors="" 设置显示颜色拾取器时文字颜色列表<br>FontFormats="" 设置显示在文字格式列表中的命名<br>FontNames="" 字体列表中的字体名<br>FontSizes="" 字体大小中的字号列表<br>ForcePasteAsPlainText=true/false 强制粘贴为纯文本<br>ForceSimpleAmpersand=true/false 是否不把&amp;符号转换为XML实体<br>FormatIndentator="" 当在源码格式下缩进代码使用的字符<br>FormatOutput=true/false 当输出内容时是否自动格式化代码<br>FormatSource=true/false 在切换到代码视图时是否自动格式化代码<br>FullPage=true/false 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容<br>GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记<br>IeSpellDownloadUrl=""下载拼写检查器的网址<br>ImageBrowser=true/false 是否允许浏览服务器功能<br>ImageBrowserURL="" 浏览服务器时运行的URL<br>ImageBrowserWindowHeight="" 图像浏览器窗口高度<br>ImageBrowserWindowWidth="" 图像浏览器窗口宽度<br>LinkBrowser=true/false 是否允许在插入链接时浏览服务器<br>LinkBrowserURL="" 插入链接时浏览服务器的URL<br>LinkBrowserWindowHeight=""链接目标浏览器窗口高度<br>LinkBrowserWindowWidth=""链接目标浏览器窗口宽度<br>Plugins=object 注册插件<br>PluginsPath="" 插件文件夹<br>ShowBorders=true/false 合并边框<br>SkinPath="" 皮肤文件夹位置<br>SmileyColumns=12 图符窗列数<br>SmileyImages=字符数组 图符窗中图片文件名数组<br>SmileyPath="" 图符文件夹路径<br>SmileyWindowHeight 图符窗口高度<br>SmileyWindowWidth 图符窗口宽度<br>SpellChecker="ieSpell/Spellerpages" 设置拼写检查器<br>StartupFocus=true/false 开启时FOCUS到编辑器<br>StylesXmlPath="" 设置定义CSS样式列表的XML文件的位置<br>TabSpaces=4 TAB键产生的空格字符数<br>ToolBarCanCollapse=true/false 是否允许展开/折叠工具栏<br>ToolbarSets=object 允许使用TOOLBAR集合<br>ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开<br>UseBROnCarriageReturn=true/false 当回车时是产生BR标记还是P或者DIV标记</p>
<p>解决上传乱码:<br>在SimpleUploaderServlet.java和ConnectorServlet.java两个文件里找到<br>DiskFileUpload upload = new DiskFileUpload();<br>分别在其后加入 upload.setHeaderEncoding("utf-8");<br>这样解决了文件上传的中文乱码问题.<br>但是在控制台显示的中文内容还是乱码,但是没关系,我们没必要去看控制台下的中文</p>
<p>----------------------------------------------------------------another<br>FCKeditor2.4.2 Java版使用说明<br>下载地址以及基本配置请参考：<a href="http://hi.baidu.com/wain19/blog/item/c33fb0fab74f24dfb48f312d.html">http://hi.baidu.com/wain19/blog/item/c33fb0fab74f24dfb48f312d.html</a></p>
<p>我的开发环境是ubuntu7.04, 系统默认编码是utf-8, <br>期间，本人遇到了下面这些问题：</p>
<p>问题一：XML request error: Internel Server Error(500)</p>
<p>出现错误的地方是在：点插入图片，点Browse按钮的时候：<br>XML request error: Internel Server Error(500)</p>
<p>找资料：<a href="http://lamono.javaeye.com/blog/49135">http://lamono.javaeye.com/blog/49135</a><br>拷贝xalan.jar和serialize.jar到/WEB-INF/lib，问题解决。</p>
<p>FCKeditor-java没有很好的解决中文问题。需要我们修改它的源代码后重新编译打包。打包过程如下：<br>1。 新建一个web工程名字为FCKeditor-java-2.3，然后把FCKeditor-2.3-java.zip解压缩后的代码拷贝到工程目录下。<br>2。如果是用的Eclipse,使用快捷键Ctrl+Shift+R<br>在SimpleUploaderServlet.java和ConnectorServlet.java两个文件里找到<br>DiskFileUpload upload = new DiskFileUpload();<br>分别在其后加入 upload.setHeaderEncoding("utf-8");<br>现在如果直接运行ant任务，会报下面的错误：<br>taskdef class org.apache.catalina.ant.DeployTask cannot be found</p>
<p>3。 把tomcat安装目录下/server/lib中的catalina-ant.jar拷贝到/WEB-INF/lib目录 下。<br>4。 打开build.xml<br>找到<br>&lt;property name="catalina.home"<br>修改成你自己的tomcat安装目录<br>&lt;property name="catalina.home"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="/home/uniquejava/tool/tomcat5028/"/&gt;<br>找到<br>&lt;taskdef name="deploy"<br>修改成如下内容<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="compile.classpath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/taskdef&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taskdef name="list" classname="org.apache.catalina.ant.ListTask"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="compile.classpath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/taskdef&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="compile.classpath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/taskdef&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="compile.classpath"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/taskdef&gt;</p>
<p>运行ant任务dist, 就可以生成新的FCKeditor-2.3.jar包</p>
<p>问题三： 上传时新建的中文目录全部乱码。 虽然上传到服务器上的文件名正常，但在JSP页面点下载链接时文件名乱码导致不能正常下载。</p>
<p>查找资料：TOMCAT 链接参数有中文时，乱码解决方法<br><a href="http://hi.baidu.com/jadestone/blog/item/7564deefc9192d36acafd5be.html">http://hi.baidu.com/jadestone/blog/item/7564deefc9192d36acafd5be.html</a><br>修改tomcat-home/conf/server.xml<br>方法一:<br>在两处地方加上URIEncoding="utf-8"：<br>&nbsp;&nbsp;&nbsp; &lt;Connector port="8080"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug="0" connectionTimeout="20000" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disableUploadTimeout="true" URIEncoding="utf-8" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;Connector port="8009" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" debug="0"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol="AJP/1.3" URIEncoding="utf-8" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>方法二:<br>使用useBodyEncodingForURI="true". 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。（有点怀疑？！）<br>&lt;... maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" /</p>
<p>我只试了方法一，问题解决！</p>
<p>这样, FCKeditor终于可以正常使用了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。<br>=================================================================<br>以下为个人原创 <a href="http://blog.csdn.net/nickshen3/">http://blog.csdn.net/nickshen3/</a><br>怎么将FCKeditor2.4使用在自己的web中。<br>1. 在webapps创建test文件夹。webapps\test<br>2. 将下载的FCKeditor2.3的Java包FCKeditor-2.3.zip解压缩，并将web文件夹下的两个文件夹_samples，WEB-INF拷贝到刚才建立的webapps\test下。再将src文件夹下的FCKeditor.tld拷贝到WEB-INF下。<br>3. 在webapps\test\下建立文件夹FCKeditor 。<br>4. 将刚才下载的 FCKeditor_2.4.3.zip 解压缩，然后将fckeditor文件夹下的 editor（文件夹）,fckconfig.js,fckeditor.js,fckstyles.xml,fcktemplates.xml。四个文件拷贝到刚才建立的文件夹FCKeditor下。<br>5.修改test\_samples\jsp\sample02.jsp文件，将原来的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FCK:editor id="EditorDefault" basePath="/FCKeditor/"<br>改为&lt;FCK:editor id="EditorDefault" basePath="/test/FCKeditor/"。以后使用的时候只需将test换成项目的名称即可。<br>6.打开tomcat。测试<a href="http://localhost:8080/test/_samples/jsp/sample02.jsp">Http://localhost:8080/test/_samples/jsp/sample02.jsp</a>。<br>ok。<br><br>另外 ： &nbsp;<a href="http://www.blogjava.net/youxia/archive/2007/03/15/104077.html"><font color=#000080>http://www.blogjava.net/youxia/archive/2007/03/15/104077.html</font></a>&nbsp;</p>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/132119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-24 17:58 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/24/132119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 如何创建\删除\修改\复制目录及文件 3in1[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132030.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Tue, 24 Jul 2007 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132030.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/132030.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/24/132030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/132030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/132030.html</trackback:ping><description><![CDATA[&nbsp; 这需要导入java.io类<br>import java.io.*; <br><br>public class FileOperate {<br>&nbsp; public FileOperate() {<br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 新建目录<br>&nbsp;&nbsp; * @param folderPath String 如 c:/fqf<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void newFolder(String folderPath) {<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = folderPath;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myFilePath = new java.io.File(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!myFilePath.exists()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.mkdir();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("新建目录操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 新建文件<br>&nbsp;&nbsp; * @param filePathAndName String 文件路径及名称 如c:/fqf.txt<br>&nbsp;&nbsp; * @param fileContent String 文件内容<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void newFile(String filePathAndName, String fileContent) {<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = filePathAndName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File myFilePath = new File(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!myFilePath.exists()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.createNewFile();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter resultFile = new FileWriter(myFilePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter myFile = new PrintWriter(resultFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strContent = fileContent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFile.println(strContent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultFile.close();<br><br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("新建目录操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 删除文件<br>&nbsp;&nbsp; * @param filePathAndName String 文件路径及名称 如c:/fqf.txt<br>&nbsp;&nbsp; * @param fileContent String<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void delFile(String filePathAndName) {<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = filePathAndName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myDelFile = new java.io.File(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myDelFile.delete();<br><br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("删除文件操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 删除文件夹<br>&nbsp;&nbsp; * @param filePathAndName String 文件夹路径及名称 如c:/fqf<br>&nbsp;&nbsp; * @param fileContent String<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void delFolder(String folderPath) {<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delAllFile(folderPath); //删除完里面所有内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = folderPath;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myFilePath = new java.io.File(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.delete(); //删除空文件夹<br><br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("删除文件夹操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 删除文件夹里面的所有文件<br>&nbsp;&nbsp; * @param path String 文件夹路径 如 c:/fqf<br>&nbsp;&nbsp; */<br>&nbsp; public void delAllFile(String path) {<br>&nbsp;&nbsp;&nbsp; File file = new File(path);<br>&nbsp;&nbsp;&nbsp; if (!file.exists()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if (!file.isDirectory()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; String[] tempList = file.list();<br>&nbsp;&nbsp;&nbsp; File temp = null;<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; tempList.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (path.endsWith(File.separator)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = new File(path + tempList[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = new File(path + File.separator + tempList[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (temp.isFile()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp.delete();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (temp.isDirectory()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delFolder(path+"/"+ tempList[i]);//再删除空文件夹<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 复制单个文件<br>&nbsp;&nbsp; * @param oldPath String 原文件路径 如：c:/fqf.txt<br>&nbsp;&nbsp; * @param newPath String 复制后路径 如：f:/fqf.txt<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void copyFile(String oldPath, String newPath) {<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesum = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int byteread = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File oldfile = new File(oldPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oldfile.exists()) { //文件存在时<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream inStream = new FileInputStream(oldPath); //读入原文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fs = new FileOutputStream(newPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[1444];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (byteread = inStream.read(buffer)) != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesum += byteread; //字节数 文件大小<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bytesum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.write(buffer, 0, byteread);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inStream.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("复制单个文件操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 复制整个文件夹内容<br>&nbsp;&nbsp; * @param oldPath String 原文件路径 如：c:/fqf<br>&nbsp;&nbsp; * @param newPath String 复制后路径 如：f:/fqf/ff<br>&nbsp;&nbsp; * @return boolean<br>&nbsp;&nbsp; */<br>&nbsp; public void copyFolder(String oldPath, String newPath) {<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File a=new File(oldPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] file=a.list();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File temp=null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; file.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(oldPath.endsWith(File.separator)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=new File(oldPath+file[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=new File(oldPath+File.separator+file[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp.isFile()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream input = new FileInputStream(temp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream output = new FileOutputStream(newPath + "/" +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (temp.getName()).toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[1024 * 5];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (len = input.read(b)) != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.write(b, 0, len);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp.isDirectory()){//如果是子文件夹<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("复制整个文件夹内容操作出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 移动文件到指定目录<br>&nbsp;&nbsp; * @param oldPath String 如：c:/fqf.txt<br>&nbsp;&nbsp; * @param newPath String 如：d:/fqf.txt<br>&nbsp;&nbsp; */<br>&nbsp; public void moveFile(String oldPath, String newPath) {<br>&nbsp;&nbsp;&nbsp; copyFile(oldPath, newPath);<br>&nbsp;&nbsp;&nbsp; delFile(oldPath);<br><br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * 移动文件到指定目录<br>&nbsp;&nbsp; * @param oldPath String 如：c:/fqf.txt<br>&nbsp;&nbsp; * @param newPath String 如：d:/fqf.txt<br>&nbsp;&nbsp; */<br>&nbsp; public void moveFolder(String oldPath, String newPath) {<br>&nbsp;&nbsp;&nbsp; copyFolder(oldPath, newPath);<br>&nbsp;&nbsp;&nbsp; delFolder(oldPath);<br><br>&nbsp; }<br>}<br><br><br><br>java中删除目录事先要删除目录下的文件或子目录。用递归就可以实现。这是我第一个用到算法作的程序，哎看来没白学。<br>public void del(String filepath) throws IOException{<br>File f = new File(filepath);//定义文件路径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>if(f.exists() &amp;&amp; f.isDirectory()){//判断是文件还是目录<br>&nbsp;&nbsp;&nbsp; if(f.listFiles().length==0){//若目录下没有文件则直接删除<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.delete();<br>&nbsp;&nbsp;&nbsp; }else{//若有则把文件放进数组，并判断是否有下级目录<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File delFile[]=f.listFiles();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i =f.listFiles().length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;i;j++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (delFile[j].isDirectory()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del (delFile[j].getAbsolutePath());//递归调用del方法并取得子目录路径<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delFile[j].delete();//删除文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; del(filepath);//递归调用<br>}<br><br>}&nbsp;&nbsp;&nbsp;&nbsp; <br><br><br>删除一个非空目录并不是简单地创建一个文件对象，然后再调用delete()就可以完成的。要在平台无关的方式下安全地删除一个非空目录，你还需要一个算法。该算法首先删除文件，然后再从目录树的底部由下至上地删除其中所有的目录。<br><br>只要简单地在目录中循环查找文件，再调用delete就可以清除目录中的所有文件：<br><br>static public void emptyDirectory(File directory) {<br>&nbsp;&nbsp; File[ ] entries = directory.listFiles( );<br>&nbsp;&nbsp; for(int i=0; i&lt;entries.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries[i].delete( );<br>&nbsp;&nbsp; }<br>} <br>这个简单的方法也可以用来删除整个目录结构。当在循环中遇到一个目录时它就递归调用deleteDirectory，而且它也会检查传入的参数是否是一个真正的目录。最后，它将删除作为参数传入的整个目录。<br>static public void deleteDirectory(File dir) throws IOException {<br>&nbsp;&nbsp; if( (dir == null) || !dir.isDirectory) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException(<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Argument "+dir+" is not a directory. "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; File[ ] entries = dir.listFiles( );<br>&nbsp;&nbsp; int sz = entries.length;<br><br>&nbsp;&nbsp; for(int i=0; i&lt;sz; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(entries[i].isDirectory( )) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteDirectory(entries[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries[i].delete( );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br><br>&nbsp; dir.delete();<br>} <br>在Java 1.1以及一些J2ME/PersonalJava的变种中没有File.listFiles方法。所以只能用File.list，它的返回值一个字符串数组，你要为每个字符串构造一个新的文件对象。<i;j++){ if="" (delfile[j].isdirectory="" del="" (delfile[j].getabsolutepath());//递归调用del="" delfile[j].delete="" del(filepath="" }="" 删除一个非空目录并不是简单地创建一个文件对象，然后再调用delete="" 只要简单地在目录中循环查找文件，再调用delete="" static="" public="" void="" emptydirectory(file="" directory="" {="" file="" ]="" entries="directory.listFiles(" )="" for(int="" i="0;"><entries.length; entries[i].delete="" 这个简单的方法也可以用来删除整个目录结构。当在循环中遇到一个目录时它就递归调用deletedirectory="" static="" public="" void="" deletedirectory(file="" dir="" throws="" ioexception="" if="" (dir="=" null="" |="" !dir.isdirectory="" {="" throw="" new="" illegalargumentexception="" argument="" +dir="" is="" not="" a="" directory="" }="" file="" ]="" entries="dir.listFiles(" )="" int="" sz="entries.length;" for(int="" i=""><sz; i="" if(entries[i].isdirectory="" deletedirectory(entries[i="" else="" {="" entries[i].delete="" )="" dir.delete="" }="" 在java="" 1.1以及一些j2me/personaljava的变种中没有file.listfiles方法。所以只能用file.list=""></sz;></entries.length;></i;j++){><img src ="http://www.blogjava.net/bnlovebn/aggbug/132030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-24 13:25 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/24/132030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringUtils工具类的使用[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/13/130041.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Fri, 13 Jul 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/13/130041.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/130041.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/13/130041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/130041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/130041.html</trackback:ping><description><![CDATA[一、数组转成字符串： <br>1、 将数组中的字符转换为一个字符串 <br>将数组中的字符转换为一个字符串 <br><br>@param strToConv 要转换的字符串 ,默认以逗号分隔 <br>@return 返回一个字符串 <br>String[3] s={"a","b","c"} <br>StringUtil.convString（s)="a,b,c" <br>2、 static public String converString(String strToConv) <br>@param strToConv 要转换的字符串 , <br>@param conv 分隔符,默认以逗号分隔 <br>@return 同样返回一个字符串 <br><br>String[3] s={"a","b","c"} <br>StringUtil.convString（s,"@")="a@b@c" <br>static public String converString(String strToConv, String conv) <br><br><br>二、空值检测： <br>3、 <br><br>Checks if a String is empty ("") or null. <br><br><br>判断一个字符串是否为空，空格作非空处理。 StringUtils.isEmpty(null) = true StringUtils.isEmpty("") = true StringUtils.isEmpty(" ") = false StringUtils.isEmpty("bob") = false StringUtils.isEmpty(" bob ") = false <br><br>NOTE: This method changed in Lang version 2.0. <br><br>It no longer trims the String. <br>That functionality is available in isBlank(). <br><br><br>@param str the String to check, may be null <br>@return true if the String is empty or null <br>public static boolean isEmpty(String str) <br><br><br>三、非空处理： <br>4、 <br>Checks if a String is not empty ("") and not null. <br><br><br>判断一个字符串是否非空，空格作非空处理. StringUtils.isNotEmpty(null) = false StringUtils.isNotEmpty("") = false StringUtils.isNotEmpty(" ") = true StringUtils.isNotEmpty("bob") = true StringUtils.isNotEmpty(" bob ") = true <br><br>@param str the String to check, may be null <br>@return true if the String is not empty and not null <br>public static boolean isNotEmpty(String str) <br><br>5、 <br><br>Checks if a String is not empty (""), not null and not whitespace only. <br><br><br>判断一个字符串是否非空，空格作空处理. StringUtils.isNotBlank(null) = false StringUtils.isNotBlank("") = false StringUtils.isNotBlank(" ") = false StringUtils.isNotBlank("bob") = true StringUtils.isNotBlank(" bob ") = true <br><br>@param str the String to check, may be null <br>@return true if the String is <br>not empty and not null and not whitespace <br>@since 2.0 <br>public static boolean isNotBlank(String str) <br><br><br>四、 空格处理 <br>6、 <br>Removes control characters (char &lt;= 32) from both <br><br>ends of this String, handling null by returning <br>null. <br><br><br>The String is trimmed using {@link String#trim()}. <br><br>Trim removes start and end characters &lt;= 32. <br>To strip whitespace use {@link //strip(String)}. <br><br><br>To trim your choice of characters, use the <br><br>{@link //strip(String, String)} methods. <br><br><br>格式化一个字符串中的空格，有非空判断处理； StringUtils.trim(null) = null StringUtils.trim("") = "" StringUtils.trim(" ") = "" StringUtils.trim("abc") = "abc" StringUtils.trim(" abc ") = "abc" <br><br>@param str the String to be trimmed, may be null <br>@return the trimmed string, null if null String input <br>public static String trim(String str) <br><br>7、 <br><br><br>Removes control characters (char &lt;= 32) from both <br><br>ends of this String returning null if the String is <br>empty ("") after the trim or if it is null. <br><br>The String is trimmed using {@link String#trim()}. <br><br>Trim removes start and end characters &lt;= 32. <br>To strip whitespace use {@link /stripToNull(String)}. <br><br><br>格式化一个字符串中的空格，有非空判断处理，如果为空返回null； StringUtils.trimToNull(null) = null StringUtils.trimToNull("") = null StringUtils.trimToNull(" ") = null StringUtils.trimToNull("abc") = "abc" StringUtils.trimToNull(" abc ") = "abc" <br><br>@param str the String to be trimmed, may be null <br>@return the trimmed String, <br>null if only chars &lt;= 32, empty or null String input <br>@since 2.0 <br>public static String trimToNull(String str) <br><br>8、 <br><br><br>Removes control characters (char &lt;= 32) from both <br><br>ends of this String returning an empty String ("") if the String <br>is empty ("") after the trim or if it is null. <br><br>The String is trimmed using {@link String#trim()}. <br><br>Trim removes start and end characters &lt;= 32. <br>To strip whitespace use {@link /stripToEmpty(String)}. <br><br><br>格式化一个字符串中的空格，有非空判断处理，如果为空返回""； StringUtils.trimToEmpty(null) = "" StringUtils.trimToEmpty("") = "" StringUtils.trimToEmpty(" ") = "" StringUtils.trimToEmpty("abc") = "abc" StringUtils.trimToEmpty(" abc ") = "abc" <br><br>@param str the String to be trimmed, may be null <br>@return the trimmed String, or an empty String if null input <br>@since 2.0 <br>public static String trimToEmpty(String str) <br><br><br>五、 字符串比较: <br>9、 <br>Compares two Strings, returning true if they are equal. <br><br><br>nulls are handled without exceptions. Two null <br><br>references are considered to be equal. The comparison is case sensitive. <br><br><br>判断两个字符串是否相等，有非空处理。 StringUtils.equals(null, null) = true StringUtils.equals(null, "abc") = false StringUtils.equals("abc", null) = false StringUtils.equals("abc", "abc") = true StringUtils.equals("abc", "ABC") = false <br><br>@param str1 the first String, may be null <br>@param str2 the second String, may be null <br>@return true if the Strings are equal, case sensitive, or <br>both null <br>@see java.lang.String#equals(Object) <br>public static boolean equals(String str1, String str2) <br><br><br>10、 <br><br>Compares two Strings, returning true if they are equal ignoring <br><br>the case. <br><br><br>nulls are handled without exceptions. Two null <br><br>references are considered equal. Comparison is case insensitive. <br><br><br>判断两个字符串是否相等，有非空处理。忽略大小写 StringUtils.equalsIgnoreCase(null, null) = true StringUtils.equalsIgnoreCase(null, "abc") = false StringUtils.equalsIgnoreCase("abc", null) = false StringUtils.equalsIgnoreCase("abc", "abc") = true StringUtils.equalsIgnoreCase("abc", "ABC") = true <br><br>@param str1 the first String, may be null <br>@param str2 the second String, may be null <br>@return true if the Strings are equal, case insensitive, or <br>both null <br>@see java.lang.String#equalsIgnoreCase(String) <br>public static boolean equalsIgnoreCase(String str1, String str2) <br><br><br>六、 IndexOf 处理 <br>11、 <br><br><br>Finds the first index within a String, handling null. <br><br>This method uses {@link String#indexOf(String)}. <br><br><br>A null String will return -1. <br><br><br>返回要查找的字符串所在位置，有非空处理 StringUtils.indexOf(null, *) = -1 StringUtils.indexOf(*, null) = -1 StringUtils.indexOf("", "") = 0 StringUtils.indexOf("aabaabaa", "a") = 0 StringUtils.indexOf("aabaabaa", "b") = 2 StringUtils.indexOf("aabaabaa", "ab") = 1 StringUtils.indexOf("aabaabaa", "") = 0 <br><br>@param str the String to check, may be null <br>@param searchStr the String to find, may be null <br>@return the first index of the search String, <br>-1 if no match or null string input <br>@since 2.0 <br>public static int indexOf(String str, String searchStr) <br><br>12、 <br><br>Finds the first index within a String, handling null. <br><br>This method uses {@link String#indexOf(String, int)}. <br><br><br>A null String will return -1. <br><br>A negative start position is treated as zero. <br>An empty ("") search String always matches. <br>A start position greater than the string length only matches <br>an empty search String. <br><br><br>返回要由指定位置开始查找的字符串所在位置，有非空处理 StringUtils.indexOf(null, *, *) = -1 StringUtils.indexOf(*, null, *) = -1 StringUtils.indexOf("", "", 0) = 0 StringUtils.indexOf("aabaabaa", "a", 0) = 0 StringUtils.indexOf("aabaabaa", "b", 0) = 2 StringUtils.indexOf("aabaabaa", "ab", 0) = 1 StringUtils.indexOf("aabaabaa", "b", 3) = 5 StringUtils.indexOf("aabaabaa", "b", 9) = -1 StringUtils.indexOf("aabaabaa", "b", -1) = 2 StringUtils.indexOf("aabaabaa", "", 2) = 2 StringUtils.indexOf("abc", "", 9) = 3 <br><br>@param str the String to check, may be null <br>@param searchStr the String to find, may be null <br>@param startPos the start position, negative treated as zero <br>@return the first index of the search String, <br>-1 if no match or null string input <br>@since 2.0 <br>public static int indexOf(String str, String searchStr, int startPos) <br><br><br>七、 子字符串处理： <br>13、 <br>Gets a substring from the specified String avoiding exceptions. <br><br><br>A negative start position can be used to start n <br><br>characters from the end of the String. <br><br><br>A null String will return null. <br><br>An empty ("") String will return "". <br><br><br>返回指定位置开始的字符串中的所有字符 StringUtils.substring(null, *) = null StringUtils.substring("", *) = "" StringUtils.substring("abc", 0) = "abc" StringUtils.substring("abc", 2) = "c" StringUtils.substring("abc", 4) = "" StringUtils.substring("abc", -2) = "bc" StringUtils.substring("abc", -4) = "abc" <br><br>@param str the String to get the substring from, may be null <br>@param start the position to start from, negative means <br>count back from the end of the String by this many characters <br>@return substring from start position, null if null String input <br>public static String substring(String str, int start) <br><br>14、 <br><br>Gets a substring from the specified String avoiding exceptions. <br><br><br>A negative start position can be used to start/end n <br><br>characters from the end of the String. <br><br><br>The returned substring starts with the character in the start <br><br>position and ends before the end position. All postion counting is <br>zero-based -- i.e., to start at the beginning of the string use <br>start = 0. Negative start and end positions can be used to <br>specify offsets relative to the end of the String. <br><br><br>If start is not strictly to the left of end, "" <br><br>is returned. <br><br><br>返回由开始位置到结束位置之间的子字符串 StringUtils.substring(null, *, *) = null StringUtils.substring("", * , *) = ""; StringUtils.substring("abc", 0, 2) = "ab" StringUtils.substring("abc", 2, 0) = "" StringUtils.substring("abc", 2, 4) = "c" StringUtils.substring("abc", 4, 6) = "" StringUtils.substring("abc", 2, 2) = "" StringUtils.substring("abc", -2, -1) = "b" StringUtils.substring("abc", -4, 2) = "ab" <br><br>@param str the String to get the substring from, may be null <br>@param start the position to start from, negative means <br>count back from the end of the String by this many characters <br>@param end the position to end at (exclusive), negative means <br>count back from the end of the String by this many characters <br>@return substring from start position to end positon, <br>null if null String input <br>public static String substring(String str, int start, int end) <br><br><br>15、 SubStringAfter/SubStringBefore（前后子字符串处理： <br><br><br>Gets the substring before the first occurance of a separator. <br><br>The separator is not returned. <br><br><br>A null string input will return null. <br><br>An empty ("") string input will return the empty string. <br>A null separator will return the input string. <br><br><br>返回指定字符串之前的所有字符 StringUtils.substringBefore(null, *) = null StringUtils.substringBefore("", *) = "" StringUtils.substringBefore("abc", "a") = "" StringUtils.substringBefore("abcba", "b") = "a" StringUtils.substringBefore("abc", "c") = "ab" StringUtils.substringBefore("abc", "d") = "abc" StringUtils.substringBefore("abc", "") = "" StringUtils.substringBefore("abc", null) = "abc" <br><br>@param str the String to get a substring from, may be null <br>@param separator the String to search for, may be null <br>@return the substring before the first occurance of the separator, <br>null if null String input <br>@since 2.0 <br>public static String substringBefore(String str, String separator) <br><br>16、 <br><br>Gets the substring after the first occurance of a separator. <br><br>The separator is not returned. <br><br><br>A null string input will return null. <br><br>An empty ("") string input will return the empty string. <br>A null separator will return the empty string if the <br>input string is not null. <br><br><br>返回指定字符串之后的所有字符 StringUtils.substringAfter(null, *) = null StringUtils.substringAfter("", *) = "" StringUtils.substringAfter(*, null) = "" StringUtils.substringAfter("abc", "a") = "bc" StringUtils.substringAfter("abcba", "b") = "cba" StringUtils.substringAfter("abc", "c") = "" StringUtils.substringAfter("abc", "d") = "" StringUtils.substringAfter("abc", "") = "abc" <br><br>@param str the String to get a substring from, may be null <br>@param separator the String to search for, may be null <br>@return the substring after the first occurance of the separator, <br>null if null String input <br>@since 2.0 <br>public static String substringAfter(String str, String separator) <br><br>17、 <br><br>Gets the substring before the last occurance of a separator. <br><br>The separator is not returned. <br><br><br>A null string input will return null. <br><br>An empty ("") string input will return the empty string. <br>An empty or null separator will return the input string. <br><br><br>返回最后一个指定字符串之前的所有字符 StringUtils.substringBeforeLast(null, *) = null StringUtils.substringBeforeLast("", *) = "" StringUtils.substringBeforeLast("abcba", "b") = "abc" StringUtils.substringBeforeLast("abc", "c") = "ab" StringUtils.substringBeforeLast("a", "a") = "" StringUtils.substringBeforeLast("a", "z") = "a" StringUtils.substringBeforeLast("a", null) = "a" StringUtils.substringBeforeLast("a", "") = "a" <br><br>@param str the String to get a substring from, may be null <br>@param separator the String to search for, may be null <br>@return the substring before the last occurance of the separator, <br>null if null String input <br>@since 2.0 <br>public static String substringBeforeLast(String str, String separator) <br><br>18、 <br><br>Gets the substring after the last occurance of a separator. <br><br>The separator is not returned. <br><br><br>A null string input will return null. <br><br>An empty ("") string input will return the empty string. <br>An empty or null separator will return the empty string if <br>the input string is not null. <br><br><br>返回最后一个指定字符串之后的所有字符 StringUtils.substringAfterLast(null, *) = null StringUtils.substringAfterLast("", *) = "" StringUtils.substringAfterLast(*, "") = "" StringUtils.substringAfterLast(*, null) = "" StringUtils.substringAfterLast("abc", "a") = "bc" StringUtils.substringAfterLast("abcba", "b") = "a" StringUtils.substringAfterLast("abc", "c") = "" StringUtils.substringAfterLast("a", "a") = "" StringUtils.substringAfterLast("a", "z") = "" <br><br>@param str the String to get a substring from, may be null <br>@param separator the String to search for, may be null <br>@return the substring after the last occurance of the separator, <br>null if null String input <br>@since 2.0 <br>public static String substringAfterLast(String str, String separator) <br><br><br>八、 Replacing（字符串替换） <br>19、 <br>Replaces all occurances of a String within another String. <br><br><br>A null reference passed to this method is a no-op. <br><br><br>以指定字符串替换原来字符串的的指定字符串 StringUtils.replace(null, *, *) = null StringUtils.replace("", *, *) = "" StringUtils.replace("aba", null, null) = "aba" StringUtils.replace("aba", null, null) = "aba" StringUtils.replace("aba", "a", null) = "aba" StringUtils.replace("aba", "a", "") = "aba" StringUtils.replace("aba", "a", "z") = "zbz" <br><br>@param text text to search and replace in, may be null <br>@param repl the String to search for, may be null <br>@param with the String to replace with, may be null <br>@return the text with any replacements processed, <br>null if null String input <br>@see #replace(String text, String repl, String with, int max) <br>public static String replace(String text, String repl, String with) <br><br>20、 <br><br>Replaces a String with another String inside a larger String, <br><br>for the first max values of the search String. <br><br><br>A null reference passed to this method is a no-op. <br><br><br>以指定字符串最大替换原来字符串的的指定字符串 StringUtils.replace(null, *, *, *) = null StringUtils.replace("", *, *, *) = "" StringUtils.replace("abaa", null, null, 1) = "abaa" StringUtils.replace("abaa", null, null, 1) = "abaa" StringUtils.replace("abaa", "a", null, 1) = "abaa" StringUtils.replace("abaa", "a", "", 1) = "abaa" StringUtils.replace("abaa", "a", "z", 0) = "abaa" StringUtils.replace("abaa", "a", "z", 1) = "zbaa" StringUtils.replace("abaa", "a", "z", 2) = "zbza" StringUtils.replace("abaa", "a", "z", -1) = "zbzz" <br><br>@param text text to search and replace in, may be null <br>@param repl the String to search for, may be null <br>@param with the String to replace with, may be null <br>@param max maximum number of values to replace, or -1 if no maximum <br>@return the text with any replacements processed, <br>null if null String input <br>public static String replace(String text, String repl, String with, int max) <br><br><br>九、 Case conversion（大小写转换） <br>21、 <br><br>Converts a String to upper case as per {@link String#toUpperCase()}. <br><br><br>A null input String returns null. <br><br><br>将一个字符串变为大写 StringUtils.upperCase(null) = null StringUtils.upperCase("") = "" StringUtils.upperCase("aBc") = "ABC" <br><br>@param str the String to upper case, may be null <br>@return the upper cased String, null if null String input <br>public static String upperCase(String str) 22、 <br><br>Converts a String to lower case as per {@link String#toLowerCase()}. <br><br><br>A null input String returns null. <br><br><br>将一个字符串转换为小写 StringUtils.lowerCase(null) = null StringUtils.lowerCase("") = "" StringUtils.lowerCase("aBc") = "abc" <br><br>@param str the String to lower case, may be null <br>@return the lower cased String, null if null String input <br>public static String lowerCase(String str) 23、 <br><br>Capitalizes a String changing the first letter to title case as <br><br>per {@link Character#toTitleCase(char)}. No other letters are changed. <br><br><br>For a word based alorithm, see {@link /WordUtils#capitalize(String)}. <br><br>A null input String returns null. <br><br><br>StringUtils.capitalize(null) = null StringUtils.capitalize("") = "" StringUtils.capitalize("cat") = "Cat" StringUtils.capitalize("cAt") = "CAt" <br><br>@param str the String to capitalize, may be null <br>@return the capitalized String, null if null String input <br>@see /WordUtils#capitalize(String) <br>@see /uncapitalize(String) <br>@since 2.0 <br>将字符串中的首字母大写 <br>public static String capitalize(String str) 
<img src ="http://www.blogjava.net/bnlovebn/aggbug/130041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-13 12:57 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/13/130041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用过滤器(Filter)对请求做统一的认证处理</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128019.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Wed, 04 Jul 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128019.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/128019.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/128019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/128019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Filter有要实现的三方法：void init(FilterConfig config) throws ServletExceptionvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletExceptionvoid destroy...&nbsp;&nbsp;<a href='http://www.blogjava.net/bnlovebn/archive/2007/07/04/128019.html'>阅读全文</a><img src ="http://www.blogjava.net/bnlovebn/aggbug/128019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（Bing）</a> 2007-07-04 09:31 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/04/128019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态WEB应用中的用户SESSION管理方案</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128006.html</link><dc:creator>重归本垒（Bing）</dc:creator><author>重归本垒（Bing）</author><pubDate>Wed, 04 Jul 2007 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128006.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/128006.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/04/128006.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/128006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/128006.html</trackback:ping><description><![CDATA[<p>要有这么一个监听器，当加入session时就可以触发一个加入session事件，在session过期时就可以触发一个删除事件，那么我们的把要处理的东西加入到这两个事件中就可以做很多于SESSION相关连的事。如在线用户的管理，单点登陆等等。<br>在J2EE中可以实现HttpSessionBindingListener接口，此接口有两要实现的方法。<br>&nbsp;void valueBound(HttpSessionBindingEvent event) 当实现此接口的监听类和session绑定时触发此事件。<br>void valueUnbound(HttpSessionBindingEvent event) 当session过期或实现此接口的监听类卸裁时触发此事件。<br><br>下面是一个示例解决方案：可以把登陆用户的信息记录在缓冲池中，当SESSION过期时，用户信息自动删除。<br>一个用户信息接口。一个用户缓冲池。一个HttpSessionBindingListener接口的监听类。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_34_35_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_35_Open_Text.style.display='none'; Codehighlighter1_34_35_Closed_Image.style.display='inline'; Codehighlighter1_34_35_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_34_35_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_35_Closed_Text.style.display='none'; Codehighlighter1_34_35_Open_Image.style.display='inline'; Codehighlighter1_34_35_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;LoginUserMessage&nbsp;</span><span id=Codehighlighter1_34_35_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_34_35_Open_Text><span style="COLOR: #000000">{}</span></span></div>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_27_797_Open_Image onclick="this.style.display='none'; Codehighlighter1_27_797_Open_Text.style.display='none'; Codehighlighter1_27_797_Closed_Image.style.display='inline'; Codehighlighter1_27_797_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_27_797_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_797_Closed_Text.style.display='none'; Codehighlighter1_27_797_Open_Image.style.display='inline'; Codehighlighter1_27_797_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;LoginUserPool&nbsp;</span><span id=Codehighlighter1_27_797_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_27_797_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Map&nbsp;map&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;LoginUserPool&nbsp;loginUserPool&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LoginUserPool();<br><img id=Codehighlighter1_163_164_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_164_Open_Text.style.display='none'; Codehighlighter1_163_164_Closed_Image.style.display='inline'; Codehighlighter1_163_164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_163_164_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_164_Closed_Text.style.display='none'; Codehighlighter1_163_164_Open_Image.style.display='inline'; Codehighlighter1_163_164_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;LoginUserPool()</span><span id=Codehighlighter1_163_164_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_163_164_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_209_236_Open_Image onclick="this.style.display='none'; Codehighlighter1_209_236_Open_Text.style.display='none'; Codehighlighter1_209_236_Closed_Image.style.display='inline'; Codehighlighter1_209_236_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_209_236_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_209_236_Closed_Text.style.display='none'; Codehighlighter1_209_236_Open_Image.style.display='inline'; Codehighlighter1_209_236_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;LoginUserPool&nbsp;getInstance()&nbsp;</span><span id=Codehighlighter1_209_236_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_209_236_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;loginUserPool;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_325_405_Open_Image onclick="this.style.display='none'; Codehighlighter1_325_405_Open_Text.style.display='none'; Codehighlighter1_325_405_Closed_Image.style.display='inline'; Codehighlighter1_325_405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_325_405_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_325_405_Closed_Text.style.display='none'; Codehighlighter1_325_405_Open_Image.style.display='inline'; Codehighlighter1_325_405_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;addLoginUserMessage(String&nbsp;sessionId,LoginUserMessage&nbsp;loginUserMessage)</span><span id=Codehighlighter1_325_405_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_325_405_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.remove(sessionId);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(sessionId,loginUserMessage);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_475_539_Open_Image onclick="this.style.display='none'; Codehighlighter1_475_539_Open_Text.style.display='none'; Codehighlighter1_475_539_Closed_Image.style.display='inline'; Codehighlighter1_475_539_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_475_539_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_475_539_Closed_Text.style.display='none'; Codehighlighter1_475_539_Open_Image.style.display='inline'; Codehighlighter1_475_539_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;LoginUserMessage&nbsp;removeLoginUserMessage(String&nbsp;sessionId)</span><span id=Codehighlighter1_475_539_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_475_539_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;(LoginUserMessage)&nbsp;map.remove(sessionId);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_606_666_Open_Image onclick="this.style.display='none'; Codehighlighter1_606_666_Open_Text.style.display='none'; Codehighlighter1_606_666_Closed_Image.style.display='inline'; Codehighlighter1_606_666_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_606_666_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_606_666_Closed_Text.style.display='none'; Codehighlighter1_606_666_Open_Image.style.display='inline'; Codehighlighter1_606_666_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;LoginUserMessage&nbsp;getLoginUserMessage(String&nbsp;sessionId)</span><span id=Codehighlighter1_606_666_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_606_666_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(LoginUserMessage)&nbsp;map.get(sessionId);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_705_728_Open_Image onclick="this.style.display='none'; Codehighlighter1_705_728_Open_Text.style.display='none'; Codehighlighter1_705_728_Closed_Image.style.display='inline'; Codehighlighter1_705_728_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_705_728_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_705_728_Closed_Text.style.display='none'; Codehighlighter1_705_728_Open_Image.style.display='inline'; Codehighlighter1_705_728_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Map&nbsp;getLoginUserMessages()</span><span id=Codehighlighter1_705_728_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_705_728_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;map;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_758_795_Open_Image onclick="this.style.display='none'; Codehighlighter1_758_795_Open_Text.style.display='none'; Codehighlighter1_758_795_Closed_Image.style.display='inline'; Codehighlighter1_758_795_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_758_795_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_758_795_Closed_Text.style.display='none'; Codehighlighter1_758_795_Open_Image.style.display='inline'; Codehighlighter1_758_795_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;isEmpty()</span><span id=Codehighlighter1_758_795_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_758_795_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;map.isEmpty();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_68_1565_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_1565_Open_Text.style.display='none'; Codehighlighter1_68_1565_Closed_Image.style.display='inline'; Codehighlighter1_68_1565_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_68_1565_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_1565_Closed_Text.style.display='none'; Codehighlighter1_68_1565_Open_Image.style.display='inline'; Codehighlighter1_68_1565_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UserLoginListener&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;HttpSessionBindingListener</span><span id=Codehighlighter1_68_1565_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_68_1565_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;Log&nbsp;logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LogFactory.getLog(getClass());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;sessionId&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;LoginUserMessage&nbsp;loginUserMessage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;LoginUserPool&nbsp;loginUserPool&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LoginUserPool.getInstance();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_345_384_Open_Image onclick="this.style.display='none'; Codehighlighter1_345_384_Open_Text.style.display='none'; Codehighlighter1_345_384_Closed_Image.style.display='inline'; Codehighlighter1_345_384_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_345_384_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_345_384_Closed_Text.style.display='none'; Codehighlighter1_345_384_Open_Image.style.display='inline'; Codehighlighter1_345_384_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;LoginUserMessage&nbsp;getLoginUserMessage()&nbsp;</span><span id=Codehighlighter1_345_384_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_345_384_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;loginUserMessage;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_457_513_Open_Image onclick="this.style.display='none'; Codehighlighter1_457_513_Open_Text.style.display='none'; Codehighlighter1_457_513_Closed_Image.style.display='inline'; Codehighlighter1_457_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_457_513_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_457_513_Closed_Text.style.display='none'; Codehighlighter1_457_513_Open_Image.style.display='inline'; Codehighlighter1_457_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setLoginUserMessage(LoginUserMessage&nbsp;loginUserMessage)&nbsp;</span><span id=Codehighlighter1_457_513_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 