<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>颠覆软件 &#187; java开发技术</title>
	<atom:link href="http://www.foxlog.org/category/java%e5%bc%80%e5%8f%91%e6%8a%80%e6%9c%af/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.foxlog.org</link>
	<description>关注 : 架构与设计,敏捷,快速开发,项目管理,执行力,SSH,RoR</description>
	<lastBuildDate>Tue, 26 Jan 2010 15:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>谈谈方法中的返回值类型和参数类型</title>
		<link>http://www.foxlog.org/2007/05/13/%e8%b0%88%e8%b0%88%e6%96%b9%e6%b3%95%e4%b8%ad%e7%9a%84%e8%bf%94%e5%9b%9e%e5%80%bc%e7%b1%bb%e5%9e%8b%e5%92%8c%e5%8f%82%e6%95%b0%e7%b1%bb%e5%9e%8b/</link>
		<comments>http://www.foxlog.org/2007/05/13/%e8%b0%88%e8%b0%88%e6%96%b9%e6%b3%95%e4%b8%ad%e7%9a%84%e8%bf%94%e5%9b%9e%e5%80%bc%e7%b1%bb%e5%9e%8b%e5%92%8c%e5%8f%82%e6%95%b0%e7%b1%bb%e5%9e%8b/#comments</comments>
		<pubDate>Sun, 13 May 2007 13:47:13 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/15</guid>
		<description><![CDATA[和大家谈谈方法中的返回值类型和参数类型。 大多数时候我们用具体的返回类型，比如要么是一个具体的对象，要么是一个Collection作为返回类型，对于参数同样如此， 现在我看到另一种做法，即参数和返回类型都是HashMap,大家以为此种做法是否可取？ 代码如下: public BeanValue saveMyPo(RequestMap rMap) {         BeanValue value = new BeanValue();         try {             MyPo mypo= (MyPo) BeanUtil.convertObject(MyPo.class,                     rMap.getMap());             mypo.setTtime(new Date());             dao.saveObject(mypo);             value.addRequestMap(&#8220;hi&#8220;, mypo);         } catch (Exception e) {             value.addErrorMap(Constants.MyException, e);             value.setForword(&#8220;fail&#8220;);         }         return value;     } 目前这个做法看得到的好处有几点： 1。返回的类型可以存放更多的内容，包括错误信息以及更多的其他内容 2。参数传递的内容更丰富，可以减少不必要的重载，减少代码量。 不过，如果说有什么缺点的话可能就是语义不够明确，那么除了这一点还有什么别的问题么？ 请大家拍砖。 Related posts:简单就是美 &#8212; 简化hibernate,简化daoworkshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]


Related posts:<ol><li><a href='http://www.foxlog.org/2007/05/13/%e7%ae%80%e5%8d%95%e5%b0%b1%e6%98%af%e7%be%8e-%e7%ae%80%e5%8c%96hibernate%e7%ae%80%e5%8c%96dao/' rel='bookmark' title='Permanent Link: 简单就是美 &#8212; 简化hibernate,简化dao'>简单就是美 &#8212; 简化hibernate,简化dao</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>和大家谈谈方法中的返回值类型和参数类型。</p>
<p>大多数时候我们用具体的返回类型，比如要么是一个具体的对象，要么是一个Collection作为返回类型，对于参数同样如此，<br />
现在我看到另一种做法，即参数和返回类型都是HashMap,大家以为此种做法是否可取？</p>
<p>代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_41_400_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_400_Open_Text.style.display='none'; Codehighlighter1_41_400_Closed_Image.style.display='inline'; Codehighlighter1_41_400_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_41_400_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_400_Closed_Text.style.display='none'; Codehighlighter1_41_400_Open_Image.style.display='inline'; Codehighlighter1_41_400_Open_Text.style.display='inline';" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000"> BeanValue saveMyPo(RequestMap rMap) </span><span id="Codehighlighter1_41_400_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_41_400_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        BeanValue value </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BeanValue();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_88_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_268_Open_Text.style.display='none'; Codehighlighter1_88_268_Closed_Image.style.display='inline'; Codehighlighter1_88_268_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_88_268_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_88_268_Closed_Text.style.display='none'; Codehighlighter1_88_268_Open_Image.style.display='inline'; Codehighlighter1_88_268_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_88_268_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_88_268_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            MyPo mypo</span><span style="color: #000000">=</span><span style="color: #000000"> (MyPo) BeanUtil.convertObject(MyPo.</span><span style="color: #0000ff">class</span><span style="color: #000000">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                    rMap.getMap());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            mypo.setTtime(</span><span style="color: #0000ff">new</span><span style="color: #000000"> Date());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            dao.saveObject(mypo);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            value.addRequestMap(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">hi</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, mypo);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_290_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_379_Open_Text.style.display='none'; Codehighlighter1_290_379_Closed_Image.style.display='inline'; Codehighlighter1_290_379_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_290_379_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_379_Closed_Text.style.display='none'; Codehighlighter1_290_379_Open_Image.style.display='inline'; Codehighlighter1_290_379_Open_Text.style.display='inline';" align="top" />        }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_290_379_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_290_379_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            value.addErrorMap(Constants.MyException, e);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            value.setForword(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">fail</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> value;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></p>
<p>目前这个做法看得到的好处有几点：<br />
1。返回的类型可以存放更多的内容，包括错误信息以及更多的其他内容<br />
2。参数传递的内容更丰富，可以减少不必要的重载，减少代码量。</p>
<p>不过，如果说有什么缺点的话可能就是语义不够明确，那么除了这一点还有什么别的问题么？  请大家拍砖。</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2007/05/13/%e7%ae%80%e5%8d%95%e5%b0%b1%e6%98%af%e7%be%8e-%e7%ae%80%e5%8c%96hibernate%e7%ae%80%e5%8c%96dao/' rel='bookmark' title='Permanent Link: 简单就是美 &#8212; 简化hibernate,简化dao'>简单就是美 &#8212; 简化hibernate,简化dao</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/05/13/%e8%b0%88%e8%b0%88%e6%96%b9%e6%b3%95%e4%b8%ad%e7%9a%84%e8%bf%94%e5%9b%9e%e5%80%bc%e7%b1%bb%e5%9e%8b%e5%92%8c%e5%8f%82%e6%95%b0%e7%b1%bb%e5%9e%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]插入图片到数据库(BLOB大字段保存对象)</title>
		<link>http://www.foxlog.org/2007/03/28/zt%e6%8f%92%e5%85%a5%e5%9b%be%e7%89%87%e5%88%b0%e6%95%b0%e6%8d%ae%e5%ba%93blob%e5%a4%a7%e5%ad%97%e6%ae%b5%e4%bf%9d%e5%ad%98%e5%af%b9%e8%b1%a1/</link>
		<comments>http://www.foxlog.org/2007/03/28/zt%e6%8f%92%e5%85%a5%e5%9b%be%e7%89%87%e5%88%b0%e6%95%b0%e6%8d%ae%e5%ba%93blob%e5%a4%a7%e5%ad%97%e6%ae%b5%e4%bf%9d%e5%ad%98%e5%af%b9%e8%b1%a1/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 14:02:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/21</guid>
		<description><![CDATA[key words : blob , oracle ,插入图片 come from  here 显示blob try { Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver&#8220;).newInstance(); Connection con=DriverManager.getConnection(&#8220;jdbc:odbc:Multimedia&#8220;,&#8220;samp&#8220;,&#8220;samp&#8220;); Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery(&#8220;select frame from MULTIMEDIA_TAB where clip_id=1&#8220;); if(rs.next()){ try { InputStream dis=rs.getBinaryStream(1); byte[] x = new byte [10*1024]; //creare byte array to hold the blob data int lengthRead = 0; // Number of bytes read String fileToWriteBlob = &#8220;./default-app/MyProgs/ImageRetrieval/ganpati.jpg&#8220;; FileOutputStream outputStream = new FileOutputStream(fileToWriteBlob); while( (lengthRead =dis.read(x)) != -1){ outputStream.write(x); } dis.close(); outputStream.close(); } catch(Exception e) { System.out.println (&#8220;Error is : &#8220; + e); } } } catch(Exception ex) { System.out.println(&#8220;Error &#8220; + ex); }  If you are inserting a row: 1.Insert the row with all values, but insert an empty blob into [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li><li><a href='http://www.foxlog.org/2006/08/10/poi%e7%9a%84%e4%b8%80%e4%b8%aabug%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: POI的一个bug问题'>POI的一个bug问题</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words : blob , oracle ,插入图片</p>
<p>come from <a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=java&amp;Number=121432&amp;page=21&amp;view=collapsed&amp;sb=1&amp;o=&amp;fpart"> </a><a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=java&amp;Number=121432&amp;page=21&amp;view=collapsed&amp;sb=1&amp;o=&amp;fpart=">here</a></p>
<p>显示blob</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_4_764_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_764_Open_Text.style.display='none'; Codehighlighter1_4_764_Closed_Image.style.display='inline'; Codehighlighter1_4_764_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_4_764_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_764_Closed_Text.style.display='none'; Codehighlighter1_4_764_Open_Image.style.display='inline'; Codehighlighter1_4_764_Open_Text.style.display='inline';" align="top" /><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_4_764_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4_764_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />Class.forName(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">sun.jdbc.odbc.JdbcOdbcDriver</span><span style="color: #000000">&#8220;</span><span style="color: #000000">).newInstance();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />Connection con</span><span style="color: #000000">=</span><span style="color: #000000">DriverManager.getConnection(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">jdbc:odbc:Multimedia</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">samp</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">samp</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />Statement stmt</span><span style="color: #000000">=</span><span style="color: #000000">con.createStatement();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />ResultSet rs</span><span style="color: #000000">=</span><span style="color: #000000">stmt.executeQuery(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">select frame from MULTIMEDIA_TAB where clip_id=1</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_284_762_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_762_Open_Text.style.display='none'; Codehighlighter1_284_762_Closed_Image.style.display='inline'; Codehighlighter1_284_762_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_284_762_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_762_Closed_Text.style.display='none'; Codehighlighter1_284_762_Open_Image.style.display='inline'; Codehighlighter1_284_762_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(rs.next())</span><span id="Codehighlighter1_284_762_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_284_762_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_290_697_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_697_Open_Text.style.display='none'; Codehighlighter1_290_697_Closed_Image.style.display='inline'; Codehighlighter1_290_697_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_290_697_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_697_Closed_Text.style.display='none'; Codehighlighter1_290_697_Open_Image.style.display='inline'; Codehighlighter1_290_697_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_290_697_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_290_697_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />InputStream dis</span><span style="color: #000000">=</span><span style="color: #000000">rs.getBinaryStream(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">byte</span><span style="color: #000000">[] x </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000"> [</span><span style="color: #000000">10</span><span style="color: #000000">*</span><span style="color: #000000">1024</span><span style="color: #000000">]; </span><span style="color: #008000">//</span><span style="color: #008000">creare byte array to hold the blob data</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000"> lengthRead </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000"> Number of bytes read</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">String fileToWriteBlob </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">./default-app/MyProgs/ImageRetrieval/ganpati.jpg</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />FileOutputStream outputStream </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileOutputStream(fileToWriteBlob);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_635_660_Open_Image" onclick="this.style.display='none'; Codehighlighter1_635_660_Open_Text.style.display='none'; Codehighlighter1_635_660_Closed_Image.style.display='inline'; Codehighlighter1_635_660_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_635_660_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_635_660_Closed_Text.style.display='none'; Codehighlighter1_635_660_Open_Image.style.display='inline'; Codehighlighter1_635_660_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000">( (lengthRead </span><span style="color: #000000">=</span><span style="color: #000000">dis.read(x)) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span id="Codehighlighter1_635_660_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_635_660_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />outputStream.write(x);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />dis.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />outputStream.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_718_760_Open_Image" onclick="this.style.display='none'; Codehighlighter1_718_760_Open_Text.style.display='none'; Codehighlighter1_718_760_Closed_Image.style.display='inline'; Codehighlighter1_718_760_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_718_760_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_718_760_Closed_Text.style.display='none'; Codehighlighter1_718_760_Open_Image.style.display='inline'; Codehighlighter1_718_760_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception e) </span><span id="Codehighlighter1_718_760_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_718_760_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.out.println (</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Error is : </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> e);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</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/ExpandedBlockStart.gif" id="Codehighlighter1_786_823_Open_Image" onclick="this.style.display='none'; Codehighlighter1_786_823_Open_Text.style.display='none'; Codehighlighter1_786_823_Closed_Image.style.display='inline'; Codehighlighter1_786_823_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_786_823_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_786_823_Closed_Text.style.display='none'; Codehighlighter1_786_823_Open_Image.style.display='inline'; Codehighlighter1_786_823_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception ex) </span><span id="Codehighlighter1_786_823_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_786_823_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Error </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> ex);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"> </span></p>
<p>If  you are inserting a row:</p>
<p>1.Insert the row with all values, but insert an  empty blob into the blob column:<br />
&#8220;INSERT INTO yourtable (id,blob_value)  VALUES (?,empty_blob())&#8221;</p>
<p>2. Select the empty blob you created:<br />
&#8220;SELECT blob_value FROM yourtable WHERE id=?&#8221;<br />
oracle.sql.BLOB blob =  rs.getBLOB(&#8220;blob_value&#8221;);<br />
(some code is of course missing, but this should  give you the idea)<br />
3. Write the bytes into the blob:</p>
<p>try {<br />
OutputStream outstream = blob.getBinaryOutputStream();<br />
outstream.write(blobValue);<br />
outstream.flush();<br />
outstream.close();<br />
} catch (IOException e) {<br />
// handle exception<br />
}<br />
Where blobValue  is the byte array containing the image data.</p>
<p>4. Update the row:<br />
&#8220;UPDATE yourtable SET blob_value=? WHERE id=?&#8221;<br />
pstmt.setBLOB(1, blob);<br />
pstmt.setInt(2, id);<br />
(NOTE: the setBLOB is an Oracle specific method,  you can probably also use the setBlob method).<br />
Again, some essential code  concerning the prepared statements is missing, but this should give you an  idea&#8230;</p>
<p>That&#8217;s that. If you just need to update the row, you just go  through steps 2-4 above.</p>
<p>Here is an example:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000"> java.sql.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_59_1198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_59_1198_Open_Text.style.display='none'; Codehighlighter1_59_1198_Closed_Image.style.display='inline'; Codehighlighter1_59_1198_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_59_1198_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_59_1198_Closed_Text.style.display='none'; Codehighlighter1_59_1198_Open_Image.style.display='inline'; Codehighlighter1_59_1198_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> imgtest </span><span id="Codehighlighter1_59_1198_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_59_1198_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">private</span><span style="color: #000000"> PreparedStatement ps </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">private</span><span style="color: #000000"> Connection conn </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_157_653_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_653_Open_Text.style.display='none'; Codehighlighter1_157_653_Closed_Image.style.display='inline'; Codehighlighter1_157_653_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_157_653_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_157_653_Closed_Text.style.display='none'; Codehighlighter1_157_653_Open_Image.style.display='inline'; Codehighlighter1_157_653_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> initialise() </span><span id="Codehighlighter1_157_653_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_157_653_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />String URL </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">jdbc:oracle:thin:@localhost:1521:SID</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />String userid </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">user</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />String passwd </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">pass</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000"> register the JDBC driver</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_292_576_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_576_Open_Text.style.display='none'; Codehighlighter1_292_576_Closed_Image.style.display='inline'; Codehighlighter1_292_576_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_292_576_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_292_576_Closed_Text.style.display='none'; Codehighlighter1_292_576_Open_Image.style.display='inline'; Codehighlighter1_292_576_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_292_576_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_292_576_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />DriverManager.registerDriver(</span><span style="color: #0000ff">new</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />oracle.jdbc.driver.OracleDriver());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000"> get a connection</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">Connection conn </span><span style="color: #000000">=</span><span style="color: #000000"> DriverManager.getConnection(URL, userid, passwd);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.conn </span><span style="color: #000000">=</span><span style="color: #000000"> conn;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000"> create a prepared statement</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">ps </span><span style="color: #000000">=</span><span style="color: #000000"> conn.prepareStatement(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">INSERT INTO images (NAME,IMAGE) VALUES (?,?)</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_598_651_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_651_Open_Text.style.display='none'; Codehighlighter1_598_651_Closed_Image.style.display='inline'; Codehighlighter1_598_651_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_598_651_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_598_651_Closed_Text.style.display='none'; Codehighlighter1_598_651_Open_Image.style.display='inline'; Codehighlighter1_598_651_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_598_651_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_598_651_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Error: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> e);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_673_1137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_673_1137_Open_Text.style.display='none'; Codehighlighter1_673_1137_Closed_Image.style.display='inline'; Codehighlighter1_673_1137_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_673_1137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_673_1137_Closed_Text.style.display='none'; Codehighlighter1_673_1137_Open_Image.style.display='inline'; Codehighlighter1_673_1137_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> imgtest() </span><span id="Codehighlighter1_673_1137_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_673_1137_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />initialise();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />File fImage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />FileInputStream isImage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_746_823_Open_Image" onclick="this.style.display='none'; Codehighlighter1_746_823_Open_Text.style.display='none'; Codehighlighter1_746_823_Closed_Image.style.display='inline'; Codehighlighter1_746_823_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_746_823_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_746_823_Closed_Text.style.display='none'; Codehighlighter1_746_823_Open_Image.style.display='inline'; Codehighlighter1_746_823_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_746_823_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_746_823_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />fImage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File( </span><span style="color: #000000">&#8220;</span><span style="color: #000000">fileo.gif</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> );<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />isImage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream( fImage );<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_859_923_Open_Image" onclick="this.style.display='none'; Codehighlighter1_859_923_Open_Text.style.display='none'; Codehighlighter1_859_923_Closed_Image.style.display='inline'; Codehighlighter1_859_923_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_859_923_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_859_923_Closed_Text.style.display='none'; Codehighlighter1_859_923_Open_Image.style.display='inline'; Codehighlighter1_859_923_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000"> (FileNotFoundException fnf) </span><span id="Codehighlighter1_859_923_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_859_923_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">File not found: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> fnf);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_929_1060_Open_Image" onclick="this.style.display='none'; Codehighlighter1_929_1060_Open_Text.style.display='none'; Codehighlighter1_929_1060_Closed_Image.style.display='inline'; Codehighlighter1_929_1060_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_929_1060_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_929_1060_Closed_Text.style.display='none'; Codehighlighter1_929_1060_Open_Image.style.display='inline'; Codehighlighter1_929_1060_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_929_1060_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_929_1060_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />ps.setString(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Open File</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />ps.setBinaryStream(</span><span style="color: #000000">2</span><span style="color: #000000">,isImage,(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(fImage.length()));<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />ps.executeUpdate();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />ps.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />conn.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1082_1135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1082_1135_Open_Text.style.display='none'; Codehighlighter1_1082_1135_Closed_Image.style.display='inline'; Codehighlighter1_1082_1135_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1082_1135_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1082_1135_Closed_Text.style.display='none'; Codehighlighter1_1082_1135_Open_Image.style.display='inline'; Codehighlighter1_1082_1135_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_1082_1135_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1082_1135_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Error: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> e);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />System.exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1179_1196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1179_1196_Open_Text.style.display='none'; Codehighlighter1_1179_1196_Closed_Image.style.display='inline'; Codehighlighter1_1179_1196_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1179_1196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1179_1196_Closed_Text.style.display='none'; Codehighlighter1_1179_1196_Open_Image.style.display='inline'; Codehighlighter1_1179_1196_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span id="Codehighlighter1_1179_1196_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1179_1196_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">new</span><span style="color: #000000"> imgtest();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</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"> </span></p>
<p>My  table looks like this:<br />
// &#8212;-&gt;%&#8212;-<br />
CREATE TABLE images<br />
(NAME  VARCHAR2(16) primary key not null,<br />
IMAGE BLOB(64k));<br />
commit;<br />
quit;<br />
// &#8212;-&gt;%&#8212;-</p>
<p><span style="color: red">update(2007-5-13)</span></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_0_78_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_78_Open_Text.style.display='none'; Codehighlighter1_0_78_Closed_Image.style.display='inline'; Codehighlighter1_0_78_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_0_78_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_78_Closed_Text.style.display='none'; Codehighlighter1_0_78_Open_Image.style.display='inline'; Codehighlighter1_0_78_Open_Text.style.display='inline';" align="top" /><span id="Codehighlighter1_0_78_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_0_78_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> * Oracle中的Blob类型字段操作<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> * User: Alex<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> * Date: 2007-5-9<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /> * Time: 16:42:43<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_102_4927_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_4927_Open_Text.style.display='none'; Codehighlighter1_102_4927_Closed_Image.style.display='inline'; Codehighlighter1_102_4927_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_102_4927_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_4927_Closed_Text.style.display='none'; Codehighlighter1_102_4927_Open_Image.style.display='inline'; Codehighlighter1_102_4927_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> BlobUtil </span><span id="Codehighlighter1_102_4927_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_102_4927_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_109_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_221_Open_Text.style.display='none'; Codehighlighter1_109_221_Closed_Image.style.display='inline'; Codehighlighter1_109_221_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_109_221_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_109_221_Closed_Text.style.display='none'; Codehighlighter1_109_221_Open_Image.style.display='inline'; Codehighlighter1_109_221_Open_Text.style.display='inline';" align="top" />    </span><span id="Codehighlighter1_109_221_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_109_221_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * 获得blob内容<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     *<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> documentId : 文档编号<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> response   : HttpServletResponse<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_312_1560_Open_Image" onclick="this.style.display='none'; Codehighlighter1_312_1560_Open_Text.style.display='none'; Codehighlighter1_312_1560_Closed_Image.style.display='inline'; Codehighlighter1_312_1560_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_312_1560_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_312_1560_Closed_Text.style.display='none'; Codehighlighter1_312_1560_Open_Image.style.display='inline'; Codehighlighter1_312_1560_Open_Text.style.display='inline';" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> downloadDocument(String documentId, HttpServletResponse response) </span><span id="Codehighlighter1_312_1560_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_312_1560_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">==</span><span style="color: #000000"> documentId) </span><span style="color: #0000ff">throw</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> JyhdException(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">文档编号为空，请检查</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        DbDao db </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        ResultSet rs </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        BLOB blob </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        OutputStream out </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_511_1121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_511_1121_Open_Text.style.display='none'; Codehighlighter1_511_1121_Closed_Image.style.display='inline'; Codehighlighter1_511_1121_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_511_1121_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_511_1121_Closed_Text.style.display='none'; Codehighlighter1_511_1121_Open_Image.style.display='inline'; Codehighlighter1_511_1121_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_511_1121_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_511_1121_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            String sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">select id,file_blob from tbl_blob_document where id = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> documentId;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            db </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> DbDaoImpl();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            rs </span><span style="color: #000000">=</span><span style="color: #000000"> db.query(sql);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_703_1111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_703_1111_Open_Text.style.display='none'; Codehighlighter1_703_1111_Closed_Image.style.display='inline'; Codehighlighter1_703_1111_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_703_1111_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_703_1111_Closed_Text.style.display='none'; Codehighlighter1_703_1111_Open_Image.style.display='inline'; Codehighlighter1_703_1111_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (rs.next()) </span><span id="Codehighlighter1_703_1111_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_703_1111_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                blob </span><span style="color: #000000">=</span><span style="color: #000000"> (BLOB) rs.getBlob(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">file_blob</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                InputStream in </span><span style="color: #000000">=</span><span style="color: #000000"> blob.getBinaryStream();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                out </span><span style="color: #000000">=</span><span style="color: #000000"> response.getOutputStream();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">int</span><span style="color: #000000"> size </span><span style="color: #000000">=</span><span style="color: #000000"> blob.getBufferSize();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[size]; </span><span style="color: #008000">//</span><span style="color: #008000"> 建立缓冲区</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">                </span><span style="color: #0000ff">int</span><span style="color: #000000"> len;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">while</span><span style="color: #000000"> ((len </span><span style="color: #000000">=</span><span style="color: #000000"> in.read(buffer)) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                    out.write(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, len);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1151_1248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1248_Open_Text.style.display='none'; Codehighlighter1_1151_1248_Closed_Image.style.display='inline'; Codehighlighter1_1151_1248_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1151_1248_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1151_1248_Closed_Text.style.display='none'; Codehighlighter1_1151_1248_Open_Image.style.display='inline'; Codehighlighter1_1151_1248_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_1151_1248_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1151_1248_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            e.printStackTrace();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">throw</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> JyhdException(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">===&gt;&gt;&gt;table非法</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1266_1553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1266_1553_Open_Text.style.display='none'; Codehighlighter1_1266_1553_Closed_Image.style.display='inline'; Codehighlighter1_1266_1553_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1266_1553_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1266_1553_Closed_Text.style.display='none'; Codehighlighter1_1266_1553_Open_Image.style.display='inline'; Codehighlighter1_1266_1553_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">finally</span><span style="color: #000000"> </span><span id="Codehighlighter1_1266_1553_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1266_1553_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1284_1468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1284_1468_Open_Text.style.display='none'; Codehighlighter1_1284_1468_Closed_Image.style.display='inline'; Codehighlighter1_1284_1468_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1284_1468_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1284_1468_Closed_Text.style.display='none'; Codehighlighter1_1284_1468_Open_Image.style.display='inline'; Codehighlighter1_1284_1468_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_1284_1468_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1284_1468_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1319_1370_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1319_1370_Open_Text.style.display='none'; Codehighlighter1_1319_1370_Closed_Image.style.display='inline'; Codehighlighter1_1319_1370_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1319_1370_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1319_1370_Closed_Text.style.display='none'; Codehighlighter1_1319_1370_Open_Image.style.display='inline'; Codehighlighter1_1319_1370_Open_Text.style.display='inline';" align="top" />                </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> out) </span><span id="Codehighlighter1_1319_1370_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1319_1370_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                    out.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1404_1454_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1404_1454_Open_Text.style.display='none'; Codehighlighter1_1404_1454_Closed_Image.style.display='inline'; Codehighlighter1_1404_1454_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1404_1454_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1404_1454_Closed_Text.style.display='none'; Codehighlighter1_1404_1454_Open_Image.style.display='inline'; Codehighlighter1_1404_1454_Open_Text.style.display='inline';" align="top" />                </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> db) </span><span id="Codehighlighter1_1404_1454_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1404_1454_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                    db.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1491_1543_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1491_1543_Open_Text.style.display='none'; Codehighlighter1_1491_1543_Closed_Image.style.display='inline'; Codehighlighter1_1491_1543_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1491_1543_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1491_1543_Closed_Text.style.display='none'; Codehighlighter1_1491_1543_Open_Image.style.display='inline'; Codehighlighter1_1491_1543_Open_Text.style.display='inline';" align="top" />            }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ee) </span><span id="Codehighlighter1_1491_1543_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1491_1543_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                ee.printStackTrace();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1567_1773_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1567_1773_Open_Text.style.display='none'; Codehighlighter1_1567_1773_Closed_Image.style.display='inline'; Codehighlighter1_1567_1773_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1567_1773_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1567_1773_Closed_Text.style.display='none'; Codehighlighter1_1567_1773_Open_Image.style.display='inline'; Codehighlighter1_1567_1773_Open_Text.style.display='inline';" align="top" />    </span><span id="Codehighlighter1_1567_1773_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_1567_1773_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * 插入blob内容<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * updated: 支持update,动态判断documentId是否已经存在，若已经存在则修改<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     *<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> inputStream : 读取输入流<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> documentId  :  请从WellsoonUtil.getSequence(&#8220;TBL_BLOB_DOCUMENT_SEQ&#8221;) 获取<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1857_3523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1857_3523_Open_Text.style.display='none'; Codehighlighter1_1857_3523_Closed_Image.style.display='inline'; Codehighlighter1_1857_3523_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1857_3523_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1857_3523_Closed_Text.style.display='none'; Codehighlighter1_1857_3523_Open_Image.style.display='inline'; Codehighlighter1_1857_3523_Open_Text.style.display='inline';" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> uploadDocument(InputStream inputStream, String documentId) </span><span id="Codehighlighter1_1857_3523_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1857_3523_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        DbDao db </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        ResultSet rs </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        Connection conn </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        String sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1984_3227_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1984_3227_Open_Text.style.display='none'; Codehighlighter1_1984_3227_Closed_Image.style.display='inline'; Codehighlighter1_1984_3227_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1984_3227_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1984_3227_Closed_Text.style.display='none'; Codehighlighter1_1984_3227_Open_Image.style.display='inline'; Codehighlighter1_1984_3227_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_1984_3227_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1984_3227_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            db </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> DbDaoImpl();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            conn </span><span style="color: #000000">=</span><span style="color: #000000"> db.getConnection();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            conn.setAutoCommit(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            Statement stmt </span><span style="color: #000000">=</span><span style="color: #000000"> conn.createStatement();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #008000">//</span><span style="color: #008000">如果已经存在则更新</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">            String hasOldRecord </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">select id from tbl_blob_document where id =</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> documentId;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_2319_2496_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2319_2496_Open_Text.style.display='none'; Codehighlighter1_2319_2496_Closed_Image.style.display='inline'; Codehighlighter1_2319_2496_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_2319_2496_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2319_2496_Closed_Text.style.display='none'; Codehighlighter1_2319_2496_Open_Image.style.display='inline'; Codehighlighter1_2319_2496_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">DbUtil.hasRecord(hasOldRecord)) </span><span id="Codehighlighter1_2319_2496_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2319_2496_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">insert into tbl_blob_document( id,file_blob) values(</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> documentId </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">,EMPTY_BLOB())</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">int</span><span style="color: #000000"> count </span><span style="color: #000000">=</span><span style="color: #000000"> stmt.executeUpdate(sql);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #008000">//</span><span style="color: #008000">select for update</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">            sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">select id,file_blob from tbl_blob_document where id = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> documentId </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> for update</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            rs </span><span style="color: #000000">=</span><span style="color: #000000"> stmt.executeQuery(sql);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_2704_3189_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2704_3189_Open_Text.style.display='none'; Codehighlighter1_2704_3189_Closed_Image.style.display='inline'; Codehighlighter1_2704_3189_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_2704_3189_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2704_3189_Closed_Text.style.display='none'; Codehighlighter1_2704_3189_Open_Image.style.display='inline'; Codehighlighter1_2704_3189_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (rs.next()) </span><span id="Codehighlighter1_2704_3189_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2704_3189_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                BLOB blob </span><span style="color: #000000">=</span><span style="color: #000000"> ((OracleResultSet) rs).getBLOB(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">file_blob</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);  </span><span style="color: #008000">//</span><span style="color: #008000"> 得到BLOB对象</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">                OutputStream out </span><span style="color: #000000">=</span><span style="color: #000000"> blob.getBinaryOutputStream();  </span><span style="color: #008000">//</span><span style="color: #008000"> 建立输出流</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">                </span><span style="color: #0000ff">int</span><span style="color: #000000"> size </span><span style="color: #000000">=</span><span style="color: #000000"> blob.getBufferSize();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[size];  </span><span style="color: #008000">//</span><span style="color: #008000"> 建立缓冲区</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">                </span><span style="color: #0000ff">int</span><span style="color: #000000"> len;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                </span><span style="color: #0000ff">while</span><span style="color: #000000"> ((len </span><span style="color: #000000">=</span><span style="color: #000000"> inputStream.read(buffer)) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                    out.write(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, len);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                inputStream.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                out.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            conn.commit();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3257_3354_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3257_3354_Open_Text.style.display='none'; Codehighlighter1_3257_3354_Closed_Image.style.display='inline'; Codehighlighter1_3257_3354_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3257_3354_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3257_3354_Closed_Text.style.display='none'; Codehighlighter1_3257_3354_Open_Image.style.display='inline'; Codehighlighter1_3257_3354_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_3257_3354_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3257_3354_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            e.printStackTrace();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">throw</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> JyhdException(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">===&gt;&gt;&gt;table非法</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3372_3517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3372_3517_Open_Text.style.display='none'; Codehighlighter1_3372_3517_Closed_Image.style.display='inline'; Codehighlighter1_3372_3517_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3372_3517_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3372_3517_Closed_Text.style.display='none'; Codehighlighter1_3372_3517_Open_Image.style.display='inline'; Codehighlighter1_3372_3517_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">finally</span><span style="color: #000000"> </span><span id="Codehighlighter1_3372_3517_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3372_3517_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3390_3432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3390_3432_Open_Text.style.display='none'; Codehighlighter1_3390_3432_Closed_Image.style.display='inline'; Codehighlighter1_3390_3432_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3390_3432_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3390_3432_Closed_Text.style.display='none'; Codehighlighter1_3390_3432_Open_Image.style.display='inline'; Codehighlighter1_3390_3432_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_3390_3432_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3390_3432_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                db.close();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3455_3507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3455_3507_Open_Text.style.display='none'; Codehighlighter1_3455_3507_Closed_Image.style.display='inline'; Codehighlighter1_3455_3507_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3455_3507_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3455_3507_Closed_Text.style.display='none'; Codehighlighter1_3455_3507_Open_Image.style.display='inline'; Codehighlighter1_3455_3507_Open_Text.style.display='inline';" align="top" />            }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ee) </span><span id="Codehighlighter1_3455_3507_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3455_3507_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                ee.printStackTrace();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3530_3554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3530_3554_Open_Text.style.display='none'; Codehighlighter1_3530_3554_Closed_Image.style.display='inline'; Codehighlighter1_3530_3554_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3530_3554_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3530_3554_Closed_Text.style.display='none'; Codehighlighter1_3530_3554_Open_Image.style.display='inline'; Codehighlighter1_3530_3554_Open_Text.style.display='inline';" align="top" />    </span><span id="Codehighlighter1_3530_3554_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_3530_3554_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * 填充Blob<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3644_4058_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3644_4058_Open_Text.style.display='none'; Codehighlighter1_3644_4058_Closed_Image.style.display='inline'; Codehighlighter1_3644_4058_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3644_4058_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3644_4058_Closed_Text.style.display='none'; Codehighlighter1_3644_4058_Open_Image.style.display='inline'; Codehighlighter1_3644_4058_Open_Text.style.display='inline';" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> fillBlob(oracle.sql.BLOB blob, </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] btaData) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception </span><span id="Codehighlighter1_3644_4058_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3644_4058_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">int</span><span style="color: #000000"> len </span><span style="color: #000000">=</span><span style="color: #000000"> btaData.length;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">long</span><span style="color: #000000"> num </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] btBlockData;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3773_4052_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3773_4052_Open_Text.style.display='none'; Codehighlighter1_3773_4052_Closed_Image.style.display='inline'; Codehighlighter1_3773_4052_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3773_4052_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3773_4052_Closed_Text.style.display='none'; Codehighlighter1_3773_4052_Open_Image.style.display='inline'; Codehighlighter1_3773_4052_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> len; i </span><span style="color: #000000">+=</span><span style="color: #000000"> num) </span><span id="Codehighlighter1_3773_4052_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3773_4052_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (i </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                btBlockData </span><span style="color: #000000">=</span><span style="color: #000000"> btaData;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_3855_3989_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3855_3989_Open_Text.style.display='none'; Codehighlighter1_3855_3989_Closed_Image.style.display='inline'; Codehighlighter1_3855_3989_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_3855_3989_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3855_3989_Closed_Text.style.display='none'; Codehighlighter1_3855_3989_Open_Image.style.display='inline'; Codehighlighter1_3855_3989_Open_Text.style.display='inline';" align="top" />            </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span id="Codehighlighter1_3855_3989_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_3855_3989_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                btBlockData </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[len </span><span style="color: #000000">-</span><span style="color: #000000"> i];<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />                System.arraycopy(btaData, i, btBlockData, </span><span style="color: #000000">0</span><span style="color: #000000">, len </span><span style="color: #000000">-</span><span style="color: #000000"> i);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            num </span><span style="color: #000000">=</span><span style="color: #000000"> blob.putBytes(i </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">, btBlockData);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_4065_4158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4065_4158_Open_Text.style.display='none'; Codehighlighter1_4065_4158_Closed_Image.style.display='inline'; Codehighlighter1_4065_4158_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_4065_4158_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4065_4158_Closed_Text.style.display='none'; Codehighlighter1_4065_4158_Open_Image.style.display='inline'; Codehighlighter1_4065_4158_Open_Text.style.display='inline';" align="top" />    </span><span id="Codehighlighter1_4065_4158_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_4065_4158_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * dump Blob<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     *<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> blob<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@return</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="color: #808080">@throws</span><span style="color: #008000"> Exception<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_4234_4595_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4234_4595_Open_Text.style.display='none'; Codehighlighter1_4234_4595_Closed_Image.style.display='inline'; Codehighlighter1_4234_4595_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_4234_4595_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4234_4595_Closed_Text.style.display='none'; Codehighlighter1_4234_4595_Open_Image.style.display='inline'; Codehighlighter1_4234_4595_Open_Text.style.display='inline';" align="top" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] dumpBlob(oracle.sql.BLOB blob) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception </span><span id="Codehighlighter1_4234_4595_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4234_4595_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">long</span><span style="color: #000000"> len </span><span style="color: #000000">=</span><span style="color: #000000"> blob.length();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] byte0 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[(</span><span style="color: #0000ff">int</span><span style="color: #000000">) len];<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] byte1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">32512</span><span style="color: #000000">];<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">int</span><span style="color: #000000"> num </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_4418_4545_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4418_4545_Open_Text.style.display='none'; Codehighlighter1_4418_4545_Closed_Image.style.display='inline'; Codehighlighter1_4418_4545_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_4418_4545_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4418_4545_Closed_Text.style.display='none'; Codehighlighter1_4418_4545_Open_Image.style.display='inline'; Codehighlighter1_4418_4545_Open_Text.style.display='inline';" align="top" />        </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> len; i </span><span style="color: #000000">+=</span><span style="color: #000000"> num) </span><span id="Codehighlighter1_4418_4545_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4418_4545_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            num </span><span style="color: #000000">=</span><span style="color: #000000"> blob.getBytes(i </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">, (</span><span style="color: #0000ff">int</span><span style="color: #000000">) len </span><span style="color: #000000">-</span><span style="color: #000000"> i, byte1);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />            System.arraycopy(byte1, </span><span style="color: #000000">0</span><span style="color: #000000">, byte0, i, num);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        byte1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> byte0;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_4659_4924_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4659_4924_Open_Text.style.display='none'; Codehighlighter1_4659_4924_Closed_Image.style.display='inline'; Codehighlighter1_4659_4924_Closed_Text.style.display='inline';" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_4659_4924_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4659_4924_Closed_Text.style.display='none'; Codehighlighter1_4659_4924_Open_Image.style.display='inline'; Codehighlighter1_4659_4924_Open_Text.style.display='inline';" align="top" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception </span><span id="Codehighlighter1_4659_4924_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4659_4924_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #008000">//</span><span style="color: #008000">文件上传</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">        File file </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Y:\\我的照片\\Palm\\Photo_121306_013.jpg</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        InputStream in </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(file);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        String sequence </span><span style="color: #000000">=</span><span style="color: #000000"> SequenceUtil.getSequence(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">TBL_BLOB_DOCUMENT_SEQ</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />        uploadDocument(in, sequence);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li><li><a href='http://www.foxlog.org/2006/08/10/poi%e7%9a%84%e4%b8%80%e4%b8%aabug%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: POI的一个bug问题'>POI的一个bug问题</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/03/28/zt%e6%8f%92%e5%85%a5%e5%9b%be%e7%89%87%e5%88%b0%e6%95%b0%e6%8d%ae%e5%ba%93blob%e5%a4%a7%e5%ad%97%e6%ae%b5%e4%bf%9d%e5%ad%98%e5%af%b9%e8%b1%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]用JSP实现上传文件的两种方法</title>
		<link>http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/</link>
		<comments>http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 14:03:55 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/22</guid>
		<description><![CDATA[key words: 文件上传，upload, cos.jar + uploadbean.jar + filemover.jar 以前用cos作文件上传，但是对于文件上传后的改名还需要借助其他的工具。 摘录如下: 在用Java开发企业器系统的使用,特别是涉及到与办公相关的软件开发的时候,文件的上传是客户经常要提到的要求.因此有 一套很好文件上传的解决办法也能方便大家在这一块的开发. 首先申明,该文章是为了自己记录一备以后开发需要的时候,不用手忙脚乱哈哈&#8230;&#8230;.. 现在在国内用的非常多的一般是两种方法解决来解决文件上传. cos.jar + uploadbean.jar + filemover.jar 这个是用的非常普遍的,原因是因为他操作方便,是我们不必再去关注,那些文件的输入和输出流,使我们从底层的流中解脱出来. UploadFile,UploadBean,MultipartFormDataRequest &#60;％@ page contentType=&#8221;text/html;charset=gb2312&#8243; ％&#62; &#60;head&#62; &#60;title&#62;fbysss UploadBean 示例&#60;/title&#62; &#60;!&#8211;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=iso-8859-1&#8243;&#8211;&#62; &#60;!&#8211;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&#8211;&#62; &#60;/head&#62; &#60;FORM name=&#8221;form1&#8243; METHOD=&#8221;POST&#8221; ACTION=&#8221;sssupload.jsp&#8221; ENCTYPE=&#8221;multipart/form-data&#8221;&#62; &#60;input name=&#8221;title&#8221; type= &#8221;text&#8221; value=&#8221;中文字&#8221;&#62; &#60;td class=&#8221;bodystyle&#8221;&#62;附件&#60;/td&#62; &#60;td class=&#8221;bodystyle&#8221;&#62; &#60;input name=&#8221;attach&#8221; type=&#8221;FILE&#8221; id=&#8221;attach&#8221; size=&#8221;50&#8243; &#62; &#60;/td&#62; &#60;input name=&#8221;ok&#8221; type= &#8221;submit&#8221; value=&#8221;提交&#8221;&#62; &#60;/form&#62; 2.读取表单页面sssgetdata.jsp &#60;!&#8211; //========================================================================== //文件：UploadBean上传实例 //功能：解决中文乱码，完成文件上传，并提供上传改名解决方案 //作者：fbysss //msn:jameslastchina@hotmail.com //========================================================================== &#8211;&#62; &#60;％@ page contentType=&#8221;text/html;charset=GBK&#8221; ％&#62; &#60;％@ page language=&#8221;java&#8221; import=&#8221;com.jspsmart.upload.*&#8221;％&#62; &#60;％@ page import=&#8221;java.text.SimpleDateFormat&#8221;％&#62; &#60;％@ page import=&#8221;java.io.File&#8221;％&#62; &#60;％@ page import=&#8221;java.util.*&#8221;％&#62; &#60;％@ page import=&#8221;javazoom.upload.*&#8221;％&#62; &#60;％@ page import=&#8221;uploadutilities.FileMover&#8221;％&#62; &#60;head&#62; &#60;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&#62; &#60;/head&#62; &#60;％ request.setCharacterEncoding(&#8220;GBK&#8221;);//设置编码格式，就不用一个个转码了。 FileMover fileMover = new FileMover();//你也可以使用自带的实例中jsp:useBean的形式。 [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: [zt]可编程的热部署问题'>[zt]可编程的热部署问题</a></li><li><a href='http://www.foxlog.org/2006/05/08/ztstruts%e4%b8%ad%e9%98%b2%e6%ad%a2%e4%bb%bb%e6%84%8f%e5%bd%a2%e5%bc%8f%e7%9a%84%e9%87%8d%e5%a4%8d%e6%8f%90%e4%ba%a4/' rel='bookmark' title='Permanent Link: [zt]Struts中防止任意形式的重复提交'>[zt]Struts中防止任意形式的重复提交</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words: 文件上传，upload,<font face="宋体"> cos.jar +  uploadbean.jar +  filemover.jar</p>
<p>以前用cos作文件上传，但是对于文件上传后的改名还需要借助其他的工具。</p>
<p>摘录如下:</p>
<p>在用Java开发企业器系统的使用,特别是涉及到与办公相关的软件开发的时候,文件的上传是客户经常要提到的要求.因此有  一套很好文件上传的解决办法也能方便大家在这一块的开发.</p>
<p>首先申明,该文章是为了自己记录一备以后开发需要的时候,不用手忙脚乱哈哈&#8230;&#8230;..</p>
<p>现在在国内用的非常多的一般是两种方法解决来解决文件上传.</p>
<p>cos.jar  + uploadbean.jar +  filemover.jar<br />
这个是用的非常普遍的,原因是因为他操作方便,是我们不必再去关注,那些文件的输入和输出流,使我们从底层的流中解脱出来.<br />
UploadFile,UploadBean,MultipartFormDataRequest</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">contentType</span><span style="color: #0000ff">=&#8221;text/html;charset=gb2312&#8243;</span><span style="color: #ff0000"> ％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">fbysss UploadBean 示例</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!&#8211;</span><span style="color: #008000">meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=iso-8859-1&#8243;</span><span style="color: #008000">&#8211;&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!&#8211;</span><span style="color: #008000">meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;</span><span style="color: #008000">&#8211;&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">FORM </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;form1&#8243;</span><span style="color: #ff0000"> METHOD</span><span style="color: #0000ff">=&#8221;POST&#8221;</span><span style="color: #ff0000"> ACTION</span><span style="color: #0000ff">=&#8221;sssupload.jsp&#8221;</span><span style="color: #ff0000"> ENCTYPE</span><span style="color: #0000ff">=&#8221;multipart/form-data&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;title&#8221;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">= &#8221;text&#8221;</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">=&#8221;中文字&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td </span><span style="color: #ff0000">class</span><span style="color: #0000ff">=&#8221;bodystyle&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">附件</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td </span><span style="color: #ff0000">class</span><span style="color: #0000ff">=&#8221;bodystyle&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;attach&#8221;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">=&#8221;FILE&#8221;</span><span style="color: #ff0000"> id</span><span style="color: #0000ff">=&#8221;attach&#8221;</span><span style="color: #ff0000"> size</span><span style="color: #0000ff">=&#8221;50&#8243;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;ok&#8221;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">= &#8221;submit&#8221;</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">=&#8221;提交&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><br />
2.读取表单页面sssgetdata.jsp</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">&lt;!&#8211;</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//==========================================================================<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//文件：UploadBean上传实例<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//功能：解决中文乱码，完成文件上传，并提供上传改名解决方案<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//作者：fbysss<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//msn:jameslastchina@hotmail.com<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//==========================================================================<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&#8211;&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">contentType</span><span style="color: #0000ff">=&#8221;text/html;charset=GBK&#8221;</span><span style="color: #ff0000"> ％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">language</span><span style="color: #0000ff">=&#8221;java&#8221;</span><span style="color: #ff0000"> import</span><span style="color: #0000ff">=&#8221;com.jspsmart.upload.*&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">import</span><span style="color: #0000ff">=&#8221;java.text.SimpleDateFormat&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">import</span><span style="color: #0000ff">=&#8221;java.io.File&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">import</span><span style="color: #0000ff">=&#8221;java.util.*&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">import</span><span style="color: #0000ff">=&#8221;javazoom.upload.*&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％@ page </span><span style="color: #ff0000">import</span><span style="color: #0000ff">=&#8221;uploadutilities.FileMover&#8221;</span><span style="color: #ff0000">％</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta </span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">=&#8221;Content-Type&#8221;</span><span style="color: #ff0000"> content</span><span style="color: #0000ff">=&#8221;text/html; charset=gb2312&#8243;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">％<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />request</span><span style="color: #ff0000">.setCharacterEncoding(&#8220;GBK&#8221;);//设置编码格式，就不用一个个转码了。<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />FileMover fileMover </span><span style="color: #0000ff">= new </span><span style="color: #ff0000">FileMover();//你也可以使用自带的实例中jsp:useBean的形式。<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />UploadBean upBean </span><span style="color: #0000ff">= new </span><span style="color: #ff0000">UploadBean();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />MultipartFormDataRequest mrequest </span><span style="color: #0000ff">= null;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #ff0000">Hashtable files </span><span style="color: #0000ff">= null;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #ff0000">if (MultipartFormDataRequest.isMultipartFormData(request))<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />{<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />mrequest </span><span style="color: #0000ff">= new </span><span style="color: #ff0000">MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,&#8221;GBK&#8221;);//注意这里也要设置编码参数<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sTt0 </span><span style="color: #0000ff">= mrequest.getParameter(&#8220;title&#8221;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #ff0000">out.println(&#8220;&lt;br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Title0是：&#8221;+sTt0+&#8221;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&#8220;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sTt1 = new String(sTt0.getBytes(&#8220;ISO-8859-1&#8243;),&#8221;GBK&#8221;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />out.println(&#8220;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Title1是：&#8221;+sTt1+&#8221;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&#8220;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//这里用来测试title参数是否正确。调试的时候，加一句if (true)return;即可。<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />files = mrequest.getFiles();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />}<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//获取修改前的文件名<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sOldFileName =mrequest.getParameter(&#8220;oldfilename&#8221;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />out.println(&#8220;sOldFileName:&#8221;+sOldFileName);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sWebRootPath = request.getRealPath(&#8220;/&#8221;);//得到你的web应用的根。<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sPath=sWebRootPath+&#8221;attach&#8221;;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />int iFileCount = 0;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sServerFileName=&#8221;";<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sLocalFileName = &#8221;";<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//文件获取<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />if ( (files != null) || (!files.isEmpty()) ) {<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />iFileCount = files.size();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />UploadFile file = (UploadFile) files.get(&#8220;attach&#8221;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />sLocalFileName=file.getFileName();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />out.println(&#8220;sLocalFileName:&#8221;+sLocalFileName);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />int ii= sLocalFileName.indexOf(&#8220;.&#8221;); //取文件名的后缀<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />String sExt = sLocalFileName.substring(ii,sLocalFileName.length());<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//得到不重复的文件名<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />java.util.Date dt = new java.util.Date(System.currentTimeMillis());<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />SimpleDateFormat fmt = new SimpleDateFormat(&#8220;yyyyMMddHHmmssSSS&#8221;);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />sServerFileName= fmt.format(dt);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />sServerFileName =sServerFileName + sExt;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />//如果不存在该目录，则新建一个<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />File dir =new File(sPath);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />if (!dir.exists()){<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />dir.mkdirs();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />}<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />upBean.setFolderstore(sPath);//设置要上传的目录<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />upBean.addUploadListener(fileMover);//增加filMover监听<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />upBean.store(mrequest, &#8221;attach&#8221;);//上传<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />out.println(&#8220;file path is &#8221;+sPath+&#8221;/&#8221;+sServerFileName);<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />}<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />％&gt;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span></p>
<p>Demo注意事项：cos.jar，uploadbean.jar，filemover.jar这几个包必须有。<br />
必备下载地址：<br />
UploadBean1.5：<a href="http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip" target="_blank">http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip</a><br />
FileMover1.3：<a href="http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip" target="_blank">http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip</a><br />
参考下载地址：<br />
ChinesUpload例子：<a href="http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip" target="_blank">http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip</a><br />
参考了fbysss的一篇文章<br />
2.  org.apache.struts.upload.FormFile<br />
Struts1.1的org.apache.struts.upload.FormFile类。很方便，不用自己写。也不用写一个jsp调用jspsmartupload就可以搞定。</p>
<p>选择上传文件页面：selfile.jsp</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
&lt;％@  taglib uri=&#8221;/WEB-INF/struts-html.tld&#8221;  prefix=&#8221;html&#8221;％&gt;<br />
&lt;html:html&gt;<br />
&lt;html:form  action=&#8221;/uploadsAction.do&#8221; enctype=&#8221;multipart/form-data&#8221;&gt;<br />
&lt;html:file  property=&#8221;theFile&#8221;/&gt;<br />
&lt;html:submit/&gt;<br />
&lt;/html:form&gt;<br />
&lt;/html:html&gt;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
UpLoadAction.java<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.struts.action.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.struts.upload.FormFile;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_125_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_300_Open_Text.style.display='none'; Codehighlighter1_125_300_Closed_Image.style.display='inline'; Codehighlighter1_125_300_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_125_300_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_125_300_Closed_Text.style.display='none'; Codehighlighter1_125_300_Open_Image.style.display='inline'; Codehighlighter1_125_300_Open_Text.style.display='inline';" align="top" /></span><span id="Codehighlighter1_125_300_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_125_300_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Title:UpLoadAction&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Description: QRRSMMS &lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Copyright: Copyright (c) 2004 jiahansoft&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Company: jiahansoft&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* </span><span style="color: #808080">@author</span><span style="color: #008000"> wanghw<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* </span><span style="color: #808080">@version</span><span style="color: #008000"> 1.0<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_344_1479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_344_1479_Open_Text.style.display='none'; Codehighlighter1_344_1479_Closed_Image.style.display='inline'; Codehighlighter1_344_1479_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_344_1479_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_344_1479_Closed_Text.style.display='none'; Codehighlighter1_344_1479_Open_Image.style.display='inline'; Codehighlighter1_344_1479_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> UpLoadAction </span><span style="color: #0000ff">extends</span><span style="color: #000000"> Action </span><span id="Codehighlighter1_344_1479_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_344_1479_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionForward execute(ActionMapping mapping,<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />ActionForm form,<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />HttpServletRequest request,<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />HttpServletResponse response)<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_490_1477_Open_Image" onclick="this.style.display='none'; Codehighlighter1_490_1477_Open_Text.style.display='none'; Codehighlighter1_490_1477_Closed_Image.style.display='inline'; Codehighlighter1_490_1477_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_490_1477_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_490_1477_Closed_Text.style.display='none'; Codehighlighter1_490_1477_Open_Image.style.display='inline'; Codehighlighter1_490_1477_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception </span><span id="Codehighlighter1_490_1477_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_490_1477_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_525_1462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_525_1462_Open_Text.style.display='none'; Codehighlighter1_525_1462_Closed_Image.style.display='inline'; Codehighlighter1_525_1462_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_525_1462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_525_1462_Closed_Text.style.display='none'; Codehighlighter1_525_1462_Open_Image.style.display='inline'; Codehighlighter1_525_1462_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> (form </span><span style="color: #0000ff">instanceof</span><span style="color: #000000"> uploadsForm) </span><span id="Codehighlighter1_525_1462_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_525_1462_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">如果form是uploadsForm</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">String encoding </span><span style="color: #000000">=</span><span style="color: #000000"> request.getCharacterEncoding();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> ((encoding </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> (encoding.equalsIgnoreCase(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">utf-8</span><span style="color: #000000">&#8220;</span><span style="color: #000000">)))<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_661_739_Open_Image" onclick="this.style.display='none'; Codehighlighter1_661_739_Open_Text.style.display='none'; Codehighlighter1_661_739_Closed_Image.style.display='inline'; Codehighlighter1_661_739_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_661_739_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_661_739_Closed_Text.style.display='none'; Codehighlighter1_661_739_Open_Image.style.display='inline'; Codehighlighter1_661_739_Open_Text.style.display='inline';" align="top" /></span><span id="Codehighlighter1_661_739_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_661_739_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />response.setContentType(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">text/html; charset=gb2312</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">如果没有指定编码，编码格式为gb2312</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />UpLoadForm theForm </span><span style="color: #000000">=</span><span style="color: #000000"> (UpLoadForm ) form;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />FormFile file </span><span style="color: #000000">=</span><span style="color: #000000"> theForm.getTheFile();</span><span style="color: #008000">//</span><span style="color: #008000">取得上传的文件</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_833_1329_Open_Image" onclick="this.style.display='none'; Codehighlighter1_833_1329_Open_Text.style.display='none'; Codehighlighter1_833_1329_Closed_Image.style.display='inline'; Codehighlighter1_833_1329_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_833_1329_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_833_1329_Closed_Text.style.display='none'; Codehighlighter1_833_1329_Open_Image.style.display='inline'; Codehighlighter1_833_1329_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_833_1329_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_833_1329_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />InputStream stream </span><span style="color: #000000">=</span><span style="color: #000000"> file.getInputStream();</span><span style="color: #008000">//</span><span style="color: #008000">把文件读入</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">String filePath </span><span style="color: #000000">=</span><span style="color: #000000"> request.getRealPath(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">/</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">取当前系统路径</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">ByteArrayOutputStream baos </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ByteArrayOutputStream();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />OutputStream bos </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileOutputStream(filePath </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">/</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />file.getFileName());</span><span style="color: #008000">//</span><span style="color: #008000">建立一个上传文件的输出流<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">System.out.println(filePath+&#8221;/&#8221;+file.getFileName());</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000"> bytesRead </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">byte</span><span style="color: #000000">[] buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">8192</span><span style="color: #000000">];<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1253_1298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1253_1298_Open_Text.style.display='none'; Codehighlighter1_1253_1298_Closed_Image.style.display='inline'; Codehighlighter1_1253_1298_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1253_1298_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1253_1298_Closed_Text.style.display='none'; Codehighlighter1_1253_1298_Open_Image.style.display='inline'; Codehighlighter1_1253_1298_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000"> ( (bytesRead </span><span style="color: #000000">=</span><span style="color: #000000"> stream.read(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, </span><span style="color: #000000">8192</span><span style="color: #000000">)) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) </span><span id="Codehighlighter1_1253_1298_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_1253_1298_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />bos.write(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, bytesRead);</span><span style="color: #008000">//</span><span style="color: #008000">将文件写入服务器</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />bos.close();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />stream.close();<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1348_1371_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1348_1371_Open_Text.style.display='none'; Codehighlighter1_1348_1371_Closed_Image.style.display='inline'; Codehighlighter1_1348_1371_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1348_1371_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1348_1371_Closed_Text.style.display='none'; Codehighlighter1_1348_1371_Open_Image.style.display='inline'; Codehighlighter1_1348_1371_Open_Text.style.display='inline';" align="top" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception e)</span><span id="Codehighlighter1_1348_1371_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_1348_1371_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />System.err.print(e);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">request.setAttribute(&#8220;dat&#8221;,file.getFileName());</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> mapping.findForward(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">display</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>UpLoadForm.java</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletRequest;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.struts.action.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.struts.upload.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_117_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_290_Open_Text.style.display='none'; Codehighlighter1_117_290_Closed_Image.style.display='inline'; Codehighlighter1_117_290_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_117_290_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_117_290_Closed_Text.style.display='none'; Codehighlighter1_117_290_Open_Image.style.display='inline'; Codehighlighter1_117_290_Open_Text.style.display='inline';" align="top" /></span><span id="Codehighlighter1_117_290_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff">/** */</span><span id="Codehighlighter1_117_290_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Title:UpLoadForm&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Description: QRRSMMS &lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Copyright: Copyright (c) 2004 jiahansoft&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* &lt;p&gt;Company: jiahansoft&lt;/p&gt;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* </span><span style="color: #808080">@author</span><span style="color: #008000"> wanghw<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />* </span><span style="color: #808080">@version</span><span style="color: #008000"> 1.0<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_336_1074_Open_Image" onclick="this.style.display='none'; Codehighlighter1_336_1074_Open_Text.style.display='none'; Codehighlighter1_336_1074_Closed_Image.style.display='inline'; Codehighlighter1_336_1074_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_336_1074_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_336_1074_Closed_Text.style.display='none'; Codehighlighter1_336_1074_Open_Image.style.display='inline'; Codehighlighter1_336_1074_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> UpLoadForm </span><span style="color: #0000ff">extends</span><span style="color: #000000"> ActionForm </span><span id="Codehighlighter1_336_1074_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_336_1074_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">final</span><span style="color: #000000"> String ERROR_PROPERTY_MAX_LENGTH_EXCEEDED </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">org.apache.struts.webapp.upload.MaxLengthExceeded</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">protected</span><span style="color: #000000"> FormFile theFile;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_512_530_Open_Image" onclick="this.style.display='none'; Codehighlighter1_512_530_Open_Text.style.display='none'; Codehighlighter1_512_530_Closed_Image.style.display='inline'; Codehighlighter1_512_530_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_512_530_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_512_530_Closed_Text.style.display='none'; Codehighlighter1_512_530_Open_Image.style.display='inline'; Codehighlighter1_512_530_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> FormFile getTheFile() </span><span id="Codehighlighter1_512_530_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_512_530_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> theFile;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_573_599_Open_Image" onclick="this.style.display='none'; Codehighlighter1_573_599_Open_Text.style.display='none'; Codehighlighter1_573_599_Closed_Image.style.display='inline'; Codehighlighter1_573_599_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_573_599_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_573_599_Closed_Text.style.display='none'; Codehighlighter1_573_599_Open_Image.style.display='inline'; Codehighlighter1_573_599_Open_Text.style.display='inline';" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setTheFile(FormFile theFile) </span><span id="Codehighlighter1_573_599_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_573_599_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.theFile </span><span style="color: #000000">=</span><span style="color: #000000"> theFile;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> ActionErrors validate(ActionMapping mapping, HttpServletRequest request)<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_681_1072_Open_Image" onclick="this.style.display='none'; Codehighlighter1_681_1072_Open_Text.style.display='none'; Codehighlighter1_681_1072_Closed_Image.style.display='inline'; Codehighlighter1_681_1072_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_681_1072_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_681_1072_Closed_Text.style.display='none'; Codehighlighter1_681_1072_Open_Image.style.display='inline'; Codehighlighter1_681_1072_Open_Text.style.display='inline';" align="top" /></span><span id="Codehighlighter1_681_1072_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_681_1072_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />ActionErrors errors </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">has the maximum length been exceeded?</span><span style="color: #008000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">Boolean maxLengthExceeded </span><span style="color: #000000">=</span><span style="color: #000000"> (Boolean)<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />request.getAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> ((maxLengthExceeded </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> (maxLengthExceeded.booleanValue()))<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_937_1054_Open_Image" onclick="this.style.display='none'; Codehighlighter1_937_1054_Open_Text.style.display='none'; Codehighlighter1_937_1054_Closed_Image.style.display='inline'; Codehighlighter1_937_1054_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_937_1054_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_937_1054_Closed_Text.style.display='none'; Codehighlighter1_937_1054_Open_Image.style.display='inline'; Codehighlighter1_937_1054_Open_Text.style.display='inline';" align="top" /></span><span id="Codehighlighter1_937_1054_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_937_1054_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />errors </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ActionErrors();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />errors.add(ERROR_PROPERTY_MAX_LENGTH_EXCEEDED, </span><span style="color: #0000ff">new</span><span style="color: #000000"> ActionError(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">maxLengthExceeded</span><span style="color: #000000">&#8220;</span><span style="color: #000000">));<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> errors;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">这是相对应的form，还有其他属性可以设置，具体可以参考struts的上传例子。<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>struts-config.xml</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>&lt;?xml  version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC  &#8220;-//Apache Software Foundation//DTD Struts Configuration 1.1//EN&#8221; &#8220;<a href="http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd%22" target="_blank">http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd&#8221;</a>;&gt;<br />
&lt;struts-config&gt;<br />
&lt;form-beans&gt;<br />
&lt;form-bean  name=&#8221;uploadsForm&#8221; type=&#8221;UpLoadForm&#8221;  /&gt;<br />
&lt;/form-beans&gt;<br />
&lt;action-mappings&gt;<br />
&lt;action  name=&#8221;uploadsForm&#8221; type=&#8221;UpLoadAction&#8221; path=&#8221;/uploadsAction&#8221;&gt;<br />
&lt;forward  name=&#8221;display&#8221; path=&#8221;/display.jsp&#8221;  /&gt;<br />
&lt;/action&gt;<br />
&lt;/action-mappings&gt;<br />
&lt;/struts-config&gt;<br />
&lt;!&#8211;display.jsp就是随便写一个成功页&#8211;&gt;</font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: [zt]可编程的热部署问题'>[zt]可编程的热部署问题</a></li><li><a href='http://www.foxlog.org/2006/05/08/ztstruts%e4%b8%ad%e9%98%b2%e6%ad%a2%e4%bb%bb%e6%84%8f%e5%bd%a2%e5%bc%8f%e7%9a%84%e9%87%8d%e5%a4%8d%e6%8f%90%e4%ba%a4/' rel='bookmark' title='Permanent Link: [zt]Struts中防止任意形式的重复提交'>[zt]Struts中防止任意形式的重复提交</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jsp防盗链</title>
		<link>http://www.foxlog.org/2007/03/13/jsp%e9%98%b2%e7%9b%97%e9%93%be/</link>
		<comments>http://www.foxlog.org/2007/03/13/jsp%e9%98%b2%e7%9b%97%e9%93%be/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 14:05:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/23</guid>
		<description><![CDATA[key words : jsp防盗链 header 最近碰到盗链的问题，即复制一个url地址，在另一个地方也能访问。 index.jsp页面 &#60;html&#62;   &#60;head&#62;&#60;title&#62;Simple jsp page&#60;/title&#62;&#60;/head&#62;   &#60;body&#62;Place your content here   here is index jsp     get header info   &#60;a href=&#8221;a.jsp&#8221;&#62;a.jsp&#60;/a&#62;   &#60;/body&#62; &#60;/html&#62; a.jsp页面 &#60;html&#62;   &#60;head&#62;&#60;title&#62;Simple jsp page&#60;/title&#62;&#60;/head&#62;   &#60;body&#62;Place your content here   here is a. jsp     get header info   &#60;%=request.getHeader(&#8220;Referer&#8220;)%&#62;   &#60;%if(null == request.getHeader(&#8220;Referer&#8220;) &#124;&#124; request.getHeader(&#8220;Referer&#8220;).indexOf(&#8220;yourdomain.com&#8220;) &#60; 0){%&#62;      做人要厚道   &#60;%}else{%&#62;   合法访问   &#60;%}%&#62;   &#60;/body&#62; &#60;/html&#62; 即从内部访问可以，直接粘贴地址在另一个浏览器里访问禁止 Related posts:文件上传:用O’Reilly公司的cos实现文件上传[zt]Meta标签详解javascript两则:树与eval函数


Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/03/02/ztmeta%e6%a0%87%e7%ad%be%e8%af%a6%e8%a7%a3/' rel='bookmark' title='Permanent Link: [zt]Meta标签详解'>[zt]Meta标签详解</a></li><li><a href='http://www.foxlog.org/2006/05/16/javascript%e4%b8%a4%e5%88%99%e6%a0%91%e4%b8%8eeval%e5%87%bd%e6%95%b0/' rel='bookmark' title='Permanent Link: javascript两则:树与eval函数'>javascript两则:树与eval函数</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words : jsp防盗链  header</p>
<p>最近碰到盗链的问题，即复制一个url地址，在另一个地方也能访问。</p>
<p>index.jsp页面</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Simple jsp page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Place your content here<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  here is index jsp<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    get header info<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a </span><span style="color: #ff0000">href</span><span style="color: #0000ff">=&#8221;a.jsp&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">a.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><br />
a.jsp页面</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Simple jsp page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Place your content here<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  here is a. jsp<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    get header info<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">request.getHeader(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">Referer</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_163_265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_265_Open_Text.style.display='none'; Codehighlighter1_163_265_Closed_Image.style.display='inline'; Codehighlighter1_163_265_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_163_265_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_163_265_Closed_Text.style.display='none'; Codehighlighter1_163_265_Open_Image.style.display='inline'; Codehighlighter1_163_265_Open_Text.style.display='inline';" align="top" />  </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_163_265_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_163_265_Open_Text"><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">==</span><span style="color: #000000; background-color: #f5f5f5"> request.getHeader(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">Referer</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">) || request.getHeader(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">Referer</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">).indexOf(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">yourdomain.com</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">) </span><span style="color: #000000; background-color: #f5f5f5">&lt;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">){</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />     做人要厚道<br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_283_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_283_288_Open_Text.style.display='none'; Codehighlighter1_283_288_Closed_Image.style.display='inline'; Codehighlighter1_283_288_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_283_288_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_283_288_Closed_Text.style.display='none'; Codehighlighter1_283_288_Open_Image.style.display='inline'; Codehighlighter1_283_288_Open_Text.style.display='inline';" align="top" />  </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_283_288_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_283_288_Open_Text"><span style="color: #000000; background-color: #f5f5f5">}</span><span style="color: #0000ff; background-color: #f5f5f5">else</span><span style="color: #000000; background-color: #f5f5f5">{</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  合法访问<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">}</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />  </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></p>
<p>即从内部访问可以，直接粘贴地址在另一个浏览器里访问禁止</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/03/02/ztmeta%e6%a0%87%e7%ad%be%e8%af%a6%e8%a7%a3/' rel='bookmark' title='Permanent Link: [zt]Meta标签详解'>[zt]Meta标签详解</a></li><li><a href='http://www.foxlog.org/2006/05/16/javascript%e4%b8%a4%e5%88%99%e6%a0%91%e4%b8%8eeval%e5%87%bd%e6%95%b0/' rel='bookmark' title='Permanent Link: javascript两则:树与eval函数'>javascript两则:树与eval函数</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/03/13/jsp%e9%98%b2%e7%9b%97%e9%93%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>真正理解面向接口编程</title>
		<link>http://www.foxlog.org/2007/03/12/%e7%9c%9f%e6%ad%a3%e7%90%86%e8%a7%a3%e9%9d%a2%e5%90%91%e6%8e%a5%e5%8f%a3%e7%bc%96%e7%a8%8b/</link>
		<comments>http://www.foxlog.org/2007/03/12/%e7%9c%9f%e6%ad%a3%e7%90%86%e8%a7%a3%e9%9d%a2%e5%90%91%e6%8e%a5%e5%8f%a3%e7%bc%96%e7%a8%8b/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 14:06:27 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/24</guid>
		<description><![CDATA[key words ：面向接口编程 面向对象设计里有一点大家已基本形成共识，就是面向接口编程，我想大多数人对这个是没有什么觉得需要怀疑的。 问题是在实际的项目开发中我们是怎么体现的呢？ 难道就是每一个实现都提供一个接口就了事了？反过来说，你有时候有没有觉得接口是多余的事？ 又或者，你仅仅是觉得现在类似spring这样的框架已习惯用接口这种方式而心存当然。 设计模式解析里提到了面向对象设计考虑的几个视角，一个是概念层，一个是规约层，一个是实现层。我如果没有猜错的话，实际上我们大多数人的眼睛一直是盯着实现层的，而这正是面向对象设计所极力避免的，即你不要在一开始就关注这些细节，你要关注的是规约（接口）. 对于实际项目开发来说，如果我们把实现的过程分为多个阶段的话我们不妨这么划分，第一阶段，根据client端的需要去设计我们的规约(interface),在这个阶段任何实现都没有，所有的任务就是定义接口所需要的职责，以及所需要的一些po,vo;第二阶段，实现前面定义的规约。而以前我是怎么做的呢？ 我是交叉作的，即假模假样的定义一个接口（其实我心里在想这个东西有屁用）,然后定义了一个方法，然后就立即去实现这个方法，再然后我又定义一个方法，继续去实现，我现在终于想通了，这样好累，效率很低，最重要的是，这不属于真正的设计。 现在我是怎么做的呢？比如一个list.jsp里需要查询，列表，然后看明细信息，然后增加信息，我会第一步在接口里定义完(这个过程会有整体设计的意识),毫不关心底层实现(数据库、事务)，我的目标就是&#8221;我想要这个功能，我想要那个功能&#8221;，至于那个功能怎么实现在第一阶段我认为那不是我的事情(尽管这个事情最终还是由我来做) .大家看这个过程和前面的过程有什么本质的不同呢？ 就是分层的概念更加明显，你的工作更有层次，每次都有先设计再实现的步骤，而前面那个过程很容易就让你不知不觉地陷入纯实现的陷阱中。 一点感想，欢迎大家拍砖。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>key words  ：面向接口编程</p>
<p>面向对象设计里有一点大家已基本形成共识，就是面向接口编程，我想大多数人对这个是没有什么觉得需要怀疑的。</p>
<p>问题是在实际的项目开发中我们是怎么体现的呢？  难道就是每一个实现都提供一个接口就了事了？反过来说，你有时候有没有觉得接口是多余的事？  又或者，你仅仅是觉得现在类似spring这样的框架已习惯用接口这种方式而心存当然。</p>
<p>设计模式解析里提到了面向对象设计考虑的几个视角，一个是概念层，一个是规约层，一个是实现层。我如果没有猜错的话，实际上我们大多数人的眼睛一直是盯着实现层的，而这正是面向对象设计所极力避免的，即你不要在一开始就关注这些细节，你要关注的是规约（接口）.</p>
<p>对于实际项目开发来说，如果我们把实现的过程分为多个阶段的话我们不妨这么划分，第一阶段，根据client端的需要去设计我们的规约(interface),在这个阶段任何实现都没有，所有的任务就是定义接口所需要的职责，以及所需要的一些po,vo;第二阶段，实现前面定义的规约。而以前我是怎么做的呢？  我是交叉作的，即假模假样的定义一个接口（其实我心里在想这个东西有屁用）,然后定义了一个方法，然后就立即去实现这个方法，再然后我又定义一个方法，继续去实现，我现在终于想通了，这样好累，效率很低，最重要的是，这不属于真正的设计。<br />
现在我是怎么做的呢？比如一个list.jsp里需要查询，列表，然后看明细信息，然后增加信息，我会第一步在接口里定义完(这个过程会有整体设计的意识),毫不关心底层实现(数据库、事务)，我的目标就是&#8221;我想要这个功能，我想要那个功能&#8221;，至于那个功能怎么实现在第一阶段我认为那不是我的事情(尽管这个事情最终还是由我来做)  .大家看这个过程和前面的过程有什么本质的不同呢？  就是分层的概念更加明显，你的工作更有层次，每次都有先设计再实现的步骤，而前面那个过程很容易就让你不知不觉地陷入纯实现的陷阱中。</p>
<p>一点感想，欢迎大家拍砖。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/03/12/%e7%9c%9f%e6%ad%a3%e7%90%86%e8%a7%a3%e9%9d%a2%e5%90%91%e6%8e%a5%e5%8f%a3%e7%bc%96%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>上传文件放在哪里比较合适?</title>
		<link>http://www.foxlog.org/2007/01/31/%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e6%94%be%e5%9c%a8%e5%93%aa%e9%87%8c%e6%af%94%e8%be%83%e5%90%88%e9%80%82/</link>
		<comments>http://www.foxlog.org/2007/01/31/%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e6%94%be%e5%9c%a8%e5%93%aa%e9%87%8c%e6%af%94%e8%be%83%e5%90%88%e9%80%82/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 14:10:27 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/28</guid>
		<description><![CDATA[目里面有上传文件的需求,我想了一下不外乎下面两种处理方法: 1. 在数据库表中建立一个blob字段存放用户上传文件. 2. 在服务器上建立一个文件夹保存用户上传文件,数据库表中只存放该文件的url地址. 我本人现在比较倾向于第2种方案, 主要原因是担心方案1的效率（我用的是mysql数据库）。 但是处理过程中除了维护数据库中表的字段还要维护上传的文件,稍微麻烦一点。 大家在项目里面又是怎么做呢？ 给我点建议！谢谢 讨论内容见: javaeye robin更建议第二种方案，放在数据库中主要的问题是 AppServer吃不消，开销比较大. 上面是摘录，不过我们这里用的是Oracle9i AS,在Oracle的协作套间里一般文档或者上传的文件都是保存在数据库里，还把这个特性作为Oracle 与别的协作套件之间不同的卖点。 大家以为如何? 我直觉是Oracle的DB和oc4j的AppServer对付这个似乎没有开销上的担心，但是没有实际检测过。 换句话说，文件的管理是放在文件夹里方便还是数据库里方便? 有点为难 update (2007-5-13): 还有一种方案结合了数据库和IO，我认为比较可行，就是文件存在数据库，但是下载的时候第一次从数据库下载，然后第一次这个文件保存在一个临时文件夹下面，以后每次下载的时候总是先检查此临时文件夹，如果已经存在则直接下载，如果没有则从数据库重复这个动作。当然，保存在临时文件夹下的文件的命名需要唯一，这个应该没有问题。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>目里面有上传文件的需求,我想了一下不外乎下面两种处理方法:  1. 在数据库表中建立一个blob字段存放用户上传文件.  2. 在服务器上建立一个文件夹保存用户上传文件,数据库表中只存放该文件的url地址.  我本人现在比较倾向于第2种方案, 主要原因是担心方案1的效率（我用的是mysql数据库）。 但是处理过程中除了维护数据库中表的字段还要维护上传的文件,稍微麻烦一点。  大家在项目里面又是怎么做呢？ 给我点建议！谢谢   讨论内容见: javaeye  robin更建议第二种方案，放在数据库中主要的问题是 AppServer吃不消，开销比较大.  上面是摘录，不过我们这里用的是Oracle9i AS,在Oracle的协作套间里一般文档或者上传的文件都是保存在数据库里，还把这个特性作为Oracle 与别的协作套件之间不同的卖点。  大家以为如何? 我直觉是Oracle的DB和oc4j的AppServer对付这个似乎没有开销上的担心，但是没有实际检测过。   换句话说，文件的管理是放在文件夹里方便还是数据库里方便? 有点为难   update (2007-5-13): 还有一种方案结合了数据库和IO，我认为比较可行，就是文件存在数据库，但是下载的时候第一次从数据库下载，然后第一次这个文件保存在一个临时文件夹下面，以后每次下载的时候总是先检查此临时文件夹，如果已经存在则直接下载，如果没有则从数据库重复这个动作。当然，保存在临时文件夹下的文件的命名需要唯一，这个应该没有问题。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/01/31/%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e6%94%be%e5%9c%a8%e5%93%aa%e9%87%8c%e6%af%94%e8%be%83%e5%90%88%e9%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web快速开发相关技术和产品</title>
		<link>http://www.foxlog.org/2007/01/20/web%e5%bf%ab%e9%80%9f%e5%bc%80%e5%8f%91%e7%9b%b8%e5%85%b3%e6%8a%80%e6%9c%af%e5%92%8c%e4%ba%a7%e5%93%81/</link>
		<comments>http://www.foxlog.org/2007/01/20/web%e5%bf%ab%e9%80%9f%e5%bc%80%e5%8f%91%e7%9b%b8%e5%85%b3%e6%8a%80%e6%9c%af%e5%92%8c%e4%ba%a7%e5%93%81/#comments</comments>
		<pubDate>Sat, 20 Jan 2007 14:14:07 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[RoR]]></category>
		<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/33</guid>
		<description><![CDATA[key words : web快速开发 web快速开发是一个值得期待的东西，最早我接触过codecharge,是一个商业软件，功能据说很强大，我试用过，支持php,asp,jsp等多语言，但是感觉对java的支持不是很顺手，接着就是asp,这个好也不好，原因就不说了，因为我对java关注。 2. 接着就是dorado ,刚看到的，感觉也不错,有asp的风格，不过更适合j2ee的环境 ,这里是他们的在线演示demo,有兴趣的可以看一下 3. 最后，刚google了一下，Oracle也有一个基于Oracle数据库的快速开发产品  : APEX,基于浏览器做DB 开发,原来的名字叫做HTML DB,名字很直观，据说Oracle的metalink就是用这个实现的，应该功能不赖。 4.对了，再补充一个现在很热的，Ror,听说javaeye的网站要重新用ruby1.2开发，试用过一点，感觉确实令人震惊，值得关注。 java的技术其实是看着很热闹，比较大的东西也不少，但是真正关注web这一块的其实不多，无论是struts还是webwork,离我们所说的真正的“快速开发”的距离很远，而以上一些工具的出现也许会逐步改善j2ee在这一领域的现状。 我之所以对这个目前有点兴趣，确实有一种强烈的反差在折磨着我，因为我相信在j2ee的web开发里确实存在本来要开发1周多的工作量很可能用一个好的工具几个小时就搞定了，这是一件多么荒唐搞笑的事情？如果dorado在它的产品中真的能做到这样那我们的java开发那么坑吃坑吃的折腾个什么劲啊? 也许真的有奇迹，我宁愿相信有这样的奇迹。 大家有什么好的想法可以讨论一下。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText">key words : web快速开发</p>
<p>web快速开发是一个值得期待的东西，最早我接触过<span style="font-weight: bold">codecharge</span>,是一个商业软件，功能据说很强大，我试用过，支持php<wbr></wbr>,asp,jsp等多语言，但是感觉对java的支持不是很顺手<wbr></wbr>，接着就是asp,这个好也不好，原因就不说了，因为我对java<wbr></wbr>关注。</p>
<p>2.  接着就是<span style="font-weight: bold">dorado</span>  ,刚看到的，感觉也不错,有asp的风格，不过更适合j2ee的环<wbr></wbr>境 ,<a href="http://61.151.239.187/dorado5/main.jsp" target="_blank">这里</a>是他们的在线演示demo,有兴趣的可以看一下</p>
<p>3.  最后，刚google了一下，Oracle也有一个基于Oracl<wbr></wbr>e数据库的快速开发产品  : <span style="font-weight: bold">APEX</span>,基于浏览器做DB 开发,原来的名字叫做HTML  DB,名字很直观，据说Oracle的metalink就是用这个实现的，应该功能不赖。</p>
<p>4.对了，再补充一个现在很热的，Ror,听说javaeye的网站要重新用ruby1.2开发，试用过一点，感觉确实令人震惊，值得关注。</p>
<p>java的技术其实是看着很热闹，比较大的东西也不少，但是真正关注web这一块的其实不多，无论是struts还是webwork,离我们所说的真正的“快速开发”的距离很远，而以上一些工具的出现也许会逐步改善j2ee在这一领域的现状。</p>
<p>我之所以对这个目前有点兴趣，确实有一种强烈的反差在折磨着我，因为我相信在j2ee的web开发里确实存在本来要开发1周多的工作量很可能用一个好的工具几个小时就搞定了，这是一件多么荒唐搞笑的事情？如果dorado在它的产品中真的能做到这样那我们的java开发那么坑吃坑吃的折腾个什么劲啊?  也许真的有奇迹，我宁愿相信有这样的奇迹。</p>
<p>大家有什么好的想法可以讨论一下。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2007/01/20/web%e5%bf%ab%e9%80%9f%e5%bc%80%e5%8f%91%e7%9b%b8%e5%85%b3%e6%8a%80%e6%9c%af%e5%92%8c%e4%ba%a7%e5%93%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]关于commons logging</title>
		<link>http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/</link>
		<comments>http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/#comments</comments>
		<pubDate>Mon, 18 Dec 2006 14:27:22 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/42</guid>
		<description><![CDATA[key words: commons log,log4j,apache log 前言: 对于log4j虽然在用，但是也存在一个疑问，怎么有的用apache的commons logging有的直接用log4j,下面的这篇文章解释了我的疑问. 转自 here Apache组织开发了一套用于支持Logging的Log4J，Java 1.4版本也引入了一套内置的 Logging框架，如果开发者想在这两套Logging系统之间自由的切换，该怎么办呢？答案就是，使用Commons Logging。 Commons Logging定义了一套抽象的Logging接口，用户可以通过配置，使这些接口指向任何一个已存在的Logging系统。 •使用抽象Logging接口 问题： 你在编写一个可以重复使用的库，需要写入Log信息，但你不想使你的Logging功能绑定在Apache Log4J或者JDK 1.4 Logging框架上。 解决方案： public static void main(String［］ args) {//自己替换［］ System.setProperty(&#8220;org.apache.commons.logging.Log&#8221;, &#8220;org.apache.commons.logging.impl.Jdk14Logger&#8221;); Log log = LogFactory.getLog(&#8220;com.discursive.jccook.SomeApp&#8221;); if (log.isTraceEnabled()) { log.trace(&#8220;This is a trace message&#8221;); } if (log.isDebugEnabled()) { log.debug(&#8220;This is a debug message&#8221;); } log.info(&#8220;This is an informational message&#8221;);   log.warn(&#8220;This is a warning&#8221;); log.error(&#8220;This is an error&#8221;); log.fatal(&#8220;This is fatal&#8221;); } LogFactory.getLog方法会根据底层环境返回一个适当的Log实现。如果用户想指定一个具体的Logging系统实现，可以设置org.apache.commons.logging.Log系统属性。例如： System.setProperty(&#8220;org.apache.commons.logging.Log&#8221;, &#8220;org.apache.commons.logging.impl.Log4JLogger&#8221;); 这样就会使用Log4J作为Logging系统。 org.apache.commons.logging.Log可以设定为： •org.apache.commons.logging.impl.Log4JLogger  使用Log4J •org.apache.commons.logging.impl.Jdk14Logger  使用JDK 1.4 Logging框架 •org.apache.commons.logging.impl.SimpleLog  使用Commons Logging内置的简单Log实现 其他： 总结一下，Commons Logging会按照下列顺序来指定具体的Log实现。 •如果定义了org.apache.commons.logging.Log系统参数，实用指定的Logging实现。 •如果在CLASSPATH里发现了Log4J，使用Log4J。 •如果使用的是JDK1.4，使用JDK1.4内置的Logging框架。 •如果都没有找到，则使用Commons Logging内置的简单Log实现。 Related posts:log4j配置Spring的listener启动异常


Related posts:<ol><li><a href='http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/' rel='bookmark' title='Permanent Link: log4j配置'>log4j配置</a></li><li><a href='http://www.foxlog.org/2006/10/23/spring%e7%9a%84listener%e5%90%af%e5%8a%a8%e5%bc%82%e5%b8%b8/' rel='bookmark' title='Permanent Link: Spring的listener启动异常'>Spring的listener启动异常</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words: commons log,log4j,apache log</p>
<p>前言:  对于log4j虽然在用，但是也存在一个疑问，怎么有的用apache的commons  logging有的直接用log4j,下面的这篇文章解释了我的疑问.</p>
<p>转自 <a href="/relax/archive/2005/04/14/3281.html" target="_blank">here</a></p>
<p><font face="宋体">Apache组织开发了一套用于支持Logging的Log4J，Java 1.4版本也引入了一套内置的 Logging框架，<font color="#ff0000">如果开发者想在这两套Logging系统之间自由的切换，该怎么办呢？答案就是，使用Commons Logging。</font>  Commons Logging定义了一套抽象的Logging接口，用户可以通过配置，使这些接口指向任何一个已存在的Logging系统。</p>
<p><strong>•使用抽象Logging接口</strong><br />
问题：<br />
你在编写一个可以重复使用的库，需要写入Log信息，但你不想使你的Logging功能绑定在Apache Log4J或者JDK 1.4 Logging框架上。<br />
解决方案：</p>
<table style="table-layout: fixed" bordercolordark="#ffffff" bordercolorlight="#009ace" align="center" bgcolor="#e6e6e6" border="1" cellpadding="4" cellspacing="0" width="98%">
<tr>
<td>public static void main(String［］ args) {//自己替换［］</p>
<p>System.setProperty(&#8220;org.apache.commons.logging.Log&#8221;,<br />
&#8220;org.apache.commons.logging.impl.Jdk14Logger&#8221;);<br />
Log log = LogFactory.getLog(&#8220;com.discursive.jccook.SomeApp&#8221;);</p>
<p>if (log.isTraceEnabled()) {<br />
log.trace(&#8220;This is a trace message&#8221;);<br />
}</p>
<p><font color="#0000ff">if (log.isDebugEnabled()) {<br />
log.debug(&#8220;This is a debug message&#8221;);<br />
}</p>
<p>log.info(&#8220;This is an informational message&#8221;);<br />
</font>  log.warn(&#8220;This is a warning&#8221;);<br />
log.error(&#8220;This is an error&#8221;);<br />
log.fatal(&#8220;This is fatal&#8221;);</p>
<p>}</td>
</tr>
</table>
<p>LogFactory.getLog方法会根据底层环境返回一个适当的Log实现。如果用户想指定一个具体的Logging系统实现，可以设置org.apache.commons.logging.Log系统属性。例如：<br />
System.setProperty(&#8220;org.apache.commons.logging.Log&#8221;,<br />
&#8220;org.apache.commons.logging.impl.Log4JLogger&#8221;);<br />
这样就会使用Log4J作为Logging系统。<br />
org.apache.commons.logging.Log可以设定为：<br />
•org.apache.commons.logging.impl.Log4JLogger  使用Log4J<br />
•org.apache.commons.logging.impl.Jdk14Logger  使用JDK 1.4 Logging框架<br />
•org.apache.commons.logging.impl.SimpleLog  使用Commons Logging内置的简单Log实现<br />
其他：<br />
总结一下，Commons Logging会按照下列顺序来指定具体的Log实现。<br />
•如果定义了org.apache.commons.logging.Log系统参数，实用指定的Logging实现。<br />
•如果在CLASSPATH里发现了Log4J，使用Log4J。<br />
•如果使用的是JDK1.4，使用JDK1.4内置的Logging框架。<br />
•如果都没有找到，则使用Commons Logging内置的简单Log实现。</font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/' rel='bookmark' title='Permanent Link: log4j配置'>log4j配置</a></li><li><a href='http://www.foxlog.org/2006/10/23/spring%e7%9a%84listener%e5%90%af%e5%8a%a8%e5%bc%82%e5%b8%b8/' rel='bookmark' title='Permanent Link: Spring的listener启动异常'>Spring的listener启动异常</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jstl标签注意问题</title>
		<link>http://www.foxlog.org/2006/12/11/jstl%e6%a0%87%e7%ad%be%e6%b3%a8%e6%84%8f%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.foxlog.org/2006/12/11/jstl%e6%a0%87%e7%ad%be%e6%b3%a8%e6%84%8f%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 14:29:16 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/44</guid>
		<description><![CDATA[key words: jsp,jstl,1.0,1.1,fn函数 原来一直用struts,最近项目里有人用jstl,我也就顺便拿来用，感觉还是不错。 过程中碰到一些小的问题总结如下: 一。版本问题 jstl存在1.0和1.1的差异问题，用EL建议需要在1.1的版本下，1.1的URI的标志为: &#60;%@ taglib uri=&#8220;http://java.sun.com/jsp/jstl/core&#8220; prefix=&#8220;c&#8220;%&#62; &#60;%@ taglib uri=&#8220;http://java.sun.com/jsp/jstl/functions&#8220; prefix=&#8220;fn&#8220;%&#62; 注意，1.0版本没有/jsp/. 如果用的1.0会出现如下异常 org.apache.jasper.JasperException: /public/left_tree.jsp(100,24) According to TLD or attribute directive in tag file, attribute items does not accept any expressions org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77) com.wellsoon.zfzw.webapp.common.VabAccessFilter.doFilter(VabAccessFilter.java:43) root cause 二。打开ＥＬ &#60;%@ page contentType=&#8220;text/html;charset=gb2312&#8220; language=&#8220;java&#8220; isELIgnored=&#8220;false&#8220; %&#62; 前提是容器支持２．０，即使支持默认也未必打开，最安全的方式就是显示打开 isELIgnored=&#8220;false&#8220; 三.fn的用法 对于Vo里的一个List作length的计算或判断很方便 &#60;table width=&#8221;160&#8243; border=&#8221;0&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;4&#8243;&#62; &#60;c:forEach items=&#8221;${menuInfos}&#8221; var=&#8221;m&#8221;&#62; &#60;c:if test=&#8221;${fn:length(m.subMenus)&#62;0}&#8221;&#62; &#60;tr&#62; &#60;td&#62; &#60;script language=&#8221;JavaScript&#8221;&#62; var tObj = new treeClass(&#8220;A1&#8220;) tObj.start(); tObj.m_start(&#8220;&#60;c:out value=&#8220;${m.menuModule}&#8220;/&#62;&#8220;,0); &#60;c:forEach items=&#8220;${m.subMenus}&#8220; var=&#8220;sub&#8220;&#62; tObj.add_Sub(&#8220;&#60;c:out value=&#8220;${sub.menuName}&#8220;/&#62;&#8220;,&#8220;&#60;%=path%&#62; &#60;c:out value=&#8220;${sub.url}&#8220;/&#62;&#8220;,&#8220;mymain&#8220;); &#60;/c:forEach&#62; tObj.m_end(); tObj.end(); tObj.print(); &#60;/script&#62; &#60;/td&#62; &#60;/tr&#62; &#60;/c:if&#62; &#60;/c:forEach&#62; &#60;/table&#62; 四.tld的声明可以在web.xml作显式声明也可以用http作直接URL声明 推荐用本地的方式. Related posts:用开源组件jcaptcha做jsp彩色验证码[zt]关于commons logging


Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words:  jsp,jstl,1.0,1.1,fn函数</p>
<p>原来一直用struts,最近项目里有人用jstl,我也就顺便拿来用，感觉还是不错。</p>
<p>过程中碰到一些小的问题总结如下:</p>
<p>一。版本问题<br />
jstl存在1.0和1.1的差异问题，用EL建议需要在1.1的版本下，1.1的URI的标志为:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">&lt;%</span><span style="color: #000000">@ taglib uri</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">http://java.sun.com/jsp/jstl/core</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> prefix</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">c</span><span style="color: #000000">&#8220;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;%</span><span style="color: #000000">@ taglib uri</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">http://java.sun.com/jsp/jstl/functions</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> prefix</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">fn</span><span style="color: #000000">&#8220;</span><span style="color: #000000">%&gt;</span><br />
注意，1.0版本没有/jsp/.</p>
<p>如果用的1.0会出现如下异常</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">org.apache.jasper.JasperException: </span><span style="color: #000000">/</span><span style="color: #0000ff">public</span><span style="color: #000000">/</span><span style="color: #000000">left_tree.jsp(</span><span style="color: #000000">100</span><span style="color: #000000">,</span><span style="color: #000000">24</span><span style="color: #000000">) According to TLD or attribute directive in tag file, attribute items does not accept any expressions<br />
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:</span><span style="color: #000000">510</span><span style="color: #000000">)<br />
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:</span><span style="color: #000000">375</span><span style="color: #000000">)<br />
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:</span><span style="color: #000000">314</span><span style="color: #000000">)<br />
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:</span><span style="color: #000000">264</span><span style="color: #000000">)<br />
javax.servlet.http.HttpServlet.service(HttpServlet.java:</span><span style="color: #000000">802</span><span style="color: #000000">)<br />
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:</span><span style="color: #000000">75</span><span style="color: #000000">)<br />
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:</span><span style="color: #000000">77</span><span style="color: #000000">)<br />
com.wellsoon.zfzw.webapp.common.VabAccessFilter.doFilter(VabAccessFilter.java:</span><span style="color: #000000">43</span><span style="color: #000000">)</p>
<p>root cause</p>
<p></span></p>
<p>二。打开ＥＬ</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">&lt;%</span><span style="color: #000000">@ page contentType</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">text/html;charset=gb2312</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> language</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">java</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> isELIgnored</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">false</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">%&gt;</span><br />
前提是容器支持２．０，即使支持默认也未必打开，最安全的方式就是显示打开  <span style="color: #000000">isELIgnored</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">false</span><span style="color: #000000">&#8220;</span><span style="color: #000000"></span><span style="color: #000000"></p>
<p>三.fn的用法<br />
对于Vo里的一个List作length的计算或判断很方便</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">table </span><span style="color: #ff0000">width</span><span style="color: #0000ff">=&#8221;160&#8243;</span><span style="color: #ff0000"> border</span><span style="color: #0000ff">=&#8221;0&#8243;</span><span style="color: #ff0000"> cellspacing</span><span style="color: #0000ff">=&#8221;0&#8243;</span><span style="color: #ff0000"> cellpadding</span><span style="color: #0000ff">=&#8221;4&#8243;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">c:forEach </span><span style="color: #ff0000">items</span><span style="color: #0000ff">=&#8221;${menuInfos}&#8221;</span><span style="color: #ff0000"> var</span><span style="color: #0000ff">=&#8221;m&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">c:if </span><span style="color: #ff0000">test</span><span style="color: #0000ff">=&#8221;${fn:length(m.subMenus)&gt;0}&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script </span><span style="color: #ff0000">language</span><span style="color: #0000ff">=&#8221;JavaScript&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #0000ff; background-color: #f5f5f5">var</span><span style="color: #000000; background-color: #f5f5f5"> tObj </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> treeClass(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">A1</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">)<br />
tObj.start();<br />
tObj.m_start(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">&lt;c:out value=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">${m.menuModule}</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">/&gt;</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">);<br />
</span><span style="color: #000000; background-color: #f5f5f5">&lt;</span><span style="color: #000000; background-color: #f5f5f5">c:forEach items</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">${m.subMenus}</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">var</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">sub</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
tObj.add_Sub(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">&lt;c:out value=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">${sub.menuName}</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">/&gt;</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">&lt;%=path%&gt;<br />
&lt;c:out value=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">${sub.url}</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">/&gt;</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">mymain</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);<br />
</span><span style="color: #000000; background-color: #f5f5f5">&lt;/</span><span style="color: #000000; background-color: #f5f5f5">c:forEach</span><span style="color: #000000; background-color: #f5f5f5">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
tObj.m_end();<br />
tObj.end();<br />
tObj.print();<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">c:if</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">c:forEach</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span><br />
四.tld的声明可以在web.xml作显式声明也可以用http作直接URL声明<br />
推荐用本地的方式.<br />
</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/12/11/jstl%e6%a0%87%e7%ad%be%e6%b3%a8%e6%84%8f%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unsupported major.minor version 49.0错误</title>
		<link>http://www.foxlog.org/2006/11/08/unsupported-majorminor-version-490%e9%94%99%e8%af%af/</link>
		<comments>http://www.foxlog.org/2006/11/08/unsupported-majorminor-version-490%e9%94%99%e8%af%af/#comments</comments>
		<pubDate>Wed, 08 Nov 2006 14:38:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/52</guid>
		<description><![CDATA[key words:jdk错误，Unsupported major.minor version 今天用一个工作流的产品，非要用jdk1.4的版本，没办法，只好切换回来，但是换回来后打开页面jsp出错，提示Unsupported major.minor version 49.0错误,到网上查了一下，49.0错误属于jdk1.5的错误，但是我的jdk1.5已经删除了啊？怎么回事呢? 最后想起来，可能是jboss中的1.5 版本产生临时文件class文件删除，删除后ＯＫ 资料:Unsupported major.minor version 49.0 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText">key words:jdk错误，Unsupported major.minor  version</p>
<p>今天用一个工作流的产品，非要用jdk1.4的版本，没办法，只好切换回来，但是换回来后打开页面jsp出错，提示Unsupported  major.minor version  49.0错误,到网上查了一下，49.0错误属于jdk1.5的错误，但是我的jdk1.5已经删除了啊？怎么回事呢?</p>
<p>最后想起来，可能是jboss中的1.5  版本产生临时文件class文件删除，删除后ＯＫ</p>
<p>资料:<a href="http://blog.csdn.net/seave/archive/2006/06/05/774943.aspx">Unsupported  major.minor version 49.0</a></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/11/08/unsupported-majorminor-version-490%e9%94%99%e8%af%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决response.sendRedirect(&#8220;mypage.jsp&#8221;)的问题</title>
		<link>http://www.foxlog.org/2006/10/31/%e8%a7%a3%e5%86%b3responsesendredirectmypagejsp%e7%9a%84%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.foxlog.org/2006/10/31/%e8%a7%a3%e5%86%b3responsesendredirectmypagejsp%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Tue, 31 Oct 2006 14:40:54 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/55</guid>
		<description><![CDATA[key word: response.sendRedirect() 页面转向 在jsp里经常要碰到页面的跳转，但是有一个问题，就是跳转的时候有些信息无法携带，比如 response.sendRedirect(&#8220;myPage.jsp?method=save&#8221;)通过URL携带信息没问题，但是request.setAttribute(&#8220;message&#8221;,myObject);就无法携带. 以前碰到这个问题我都回避了，改用session存放信息，但是显然不足取。 察看了一下，在servlet里的途径好办，jsp里必须调用&#60;jsp:forward&#62;标签 &#60;jsp:forward page=&#8220;myPage.jsp&#8220;/&#62; No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>key word: response.sendRedirect()  页面转向</p>
<p>在jsp里经常要碰到页面的跳转，但是有一个问题，就是跳转的时候有些信息无法携带，比如<br />
response.sendRedirect(&#8220;myPage.jsp?method=save&#8221;)通过URL携带信息没问题，但是request.setAttribute(&#8220;message&#8221;,myObject);就无法携带.  以前碰到这个问题我都回避了，改用session存放信息，但是显然不足取。</p>
<p>察看了一下，在servlet里的途径好办，jsp里必须调用&lt;jsp:forward&gt;标签</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">&lt;</span><span style="color: #000000">jsp:forward page</span><span style="color: #000000">=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">myPage.jsp</span><span style="color: #000000">&#8220;</span><span style="color: #000000">/&gt;</span></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/10/31/%e8%a7%a3%e5%86%b3responsesendredirectmypagejsp%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]关于用户角色权限的一点想法</title>
		<link>http://www.foxlog.org/2006/10/26/zt%e5%85%b3%e4%ba%8e%e7%94%a8%e6%88%b7%e8%a7%92%e8%89%b2%e6%9d%83%e9%99%90%e7%9a%84%e4%b8%80%e7%82%b9%e6%83%b3%e6%b3%95/</link>
		<comments>http://www.foxlog.org/2006/10/26/zt%e5%85%b3%e4%ba%8e%e7%94%a8%e6%88%b7%e8%a7%92%e8%89%b2%e6%9d%83%e9%99%90%e7%9a%84%e4%b8%80%e7%82%b9%e6%83%b3%e6%b3%95/#comments</comments>
		<pubDate>Thu, 26 Oct 2006 14:44:09 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/58</guid>
		<description><![CDATA[前言 ： 权限往往是一个极其复杂的问题，但也可简单表述为这样的逻辑表达式：判断“ Who 对 What(Which) 进行 How 的操作”的逻辑表达式是否为真。针对不同的应用，需要根据项目的实际情况和具体架构，在维护性、灵活性、完整性等 N 多个方案之间比较权衡，选择符合的方案。 目标 ： 直观，因为系统最终会由最终用户来维护，权限分配的直观和容易理解，显得比较重要，系统不辞劳苦的实现了组的继承，除了功能的必须，更主要的就是因为它足够直观。 简单，包括概念数量上的简单和意义上的简单还有功能上的简单。想用一个权限系统解决所有的权限问题是不现实的。设计中将常常变化的“定制”特点比较强的部分判断为业务逻辑，而将常常相同的“通用”特点比较强的部分判断为权限逻辑就是基于这样的思路。 扩展，采用可继承在扩展上的困难。的 Group 概念在支持权限以组方式定义的同时有效避免了重定义时 现状 ： 对于在企业环境中的访问控制方法，一般有三种： 1. 自主型访问控制方法。目前在我国的大多数的信息系统中的访问控制模块中基本是借助于自主型访问控制方法中的访问控制列表 (ACLs) 。 2. 强制型访问控制方法。用于多层次安全级别的军事应用。 3. 基于角色的访问控制方法（ RBAC ）。是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是： 1. 减小授权管理的复杂性，降低管理开销。 2. 灵活地支持企业的安全策略，并对企业的变化有很大的伸缩性。 名词 ： 粗粒度：表示类别级，即仅考虑对象的类别 (the type of object) ，不考虑对象的某个特 定实例。比如，用户管理中，创建、删除，对所有的用户都一视同仁，并不区分操作的具体对象实例。 细粒度：表示实例级，即需要考虑具体对象的实例 (the instance of object) ，当然，细 粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如，合同管理中，列表、删除，需要区分该合同实例是否为当前用户所创建。 原则 ： 权限逻辑配合业务逻辑。即权限系统以为业务逻辑提供服务为目标。相当多细粒度的权限问题因其极其独特而不具通用意义，它们也能被理解为是“业务逻辑”的一部分。比如，要求：“合同资源只能被它的创建者删除，与创建者同组的用户可以修改，所有的用户能够浏览”。这既可以认为是一个细粒度的权限问题，也可以认为是一个业务逻辑问题。在这里它是业务逻辑问题，在整个权限系统的架构设计之中不予过多考虑。当然，权限系统的架构也必须要能支持这样的控制判断。或者说，系统提供足够多但不是完全的控制能力。即，设计原则归结为：“系统只提供粗粒度的权限，细粒度的权限被认为是业务逻辑的职责”。 需要再次强调的是，这里表述的权限系统仅是一个“不完全”的权限系统，即，它不提供所有关于权限的问题的解决方法。它提供一个基础，并解决那些具有“共性”的 [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/07/middlegen%e4%b8%ad%e9%85%8d%e7%bd%aehibernate%e7%9a%84many-to-many%e5%b1%9e%e6%80%a7/' rel='bookmark' title='Permanent Link: MiddleGen中配置hibernate的many to many属性'>MiddleGen中配置hibernate的many to many属性</a></li><li><a href='http://www.foxlog.org/2006/10/26/ztrbac-%e6%a8%a1%e5%9e%8b%e5%88%9d%e6%8e%a2/' rel='bookmark' title='Permanent Link: [zt]RBAC 模型初探'>[zt]RBAC 模型初探</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><span id="ArticleContent1_ArticleContent1_lblContent"></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">前言</span> </strong><font size="3"><span style="color: black; font-family: 宋体">：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限往往是一个极其复杂的问题，但也可简单表述为这样的逻辑表达式：判断“</span>  <span style="color: black; font-family: Arial" lang="EN-US">Who</span> <span style="color: black; font-family: 宋体">对</span> <span style="color: black; font-family: Arial" lang="EN-US">What(Which)</span> <span style="color: black; font-family: 宋体">进行</span> <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">的操作”的逻辑表达式是否为真。针对不同的应用，需要根据项目的实际情况和具体架构，在维护性、灵活性、完整性等</span>  <span style="color: black; font-family: Arial" lang="EN-US">N</span> <span style="color: black; font-family: 宋体">多个方案之间比较权衡，选择符合的方案。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">目标</span> </strong><font size="3"><span style="color: black; font-family: 宋体">：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoBodyTextIndent" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">直观，因为系统最终会由最终用户来维护，权限分配的直观和容易理解，显得比较重要，系统不辞劳苦的实现了组的继承，除了功能的必须，更主要的就是因为它足够直观。</font>  </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">简单，包括概念数量上的简单和意义上的简单还有功能上的简单。想用一个权限系统解决所有的权限问题是不现实的。设计中将常常变化的“定制”特点比较强的部分判断为业务逻辑，而将常常相同的“通用”特点比较强的部分判断为权限逻辑就是基于这样的思路。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">扩展，采用可继承在扩展上的困难。的</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">概念在支持权限以组方式定义的同时有效避免了重定义时</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">现状</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">对于在企业环境中的访问控制方法，一般有三种：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">1.</span> <span style="color: black; font-family: 宋体">自主型访问控制方法。目前在我国的大多数的信息系统中的访问控制模块中基本是借助于自主型访问控制方法中的访问控制列表</span>  <span style="color: black; font-family: Arial" lang="EN-US">(ACLs)</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">2.</span> <span style="color: black; font-family: 宋体">强制型访问控制方法。用于多层次安全级别的军事应用。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">3.</span> <span style="color: black; font-family: 宋体">基于角色的访问控制方法（</span> <span style="color: black; font-family: Arial" lang="EN-US">RBAC</span> <span style="color: black; font-family: 宋体">）。是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是：</span>  <span style="color: black; font-family: Arial" lang="EN-US">1.</span> <span style="color: black; font-family: 宋体">减小授权管理的复杂性，降低管理开销。</span> <span style="color: black; font-family: Arial" lang="EN-US">2.</span> <span style="color: black; font-family: 宋体">灵活地支持企业的安全策略，并对企业的变化有很大的伸缩性。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">名词</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">粗粒度：表示类别级，即仅考虑对象的类别</span> <span style="color: black; font-family: Arial" lang="EN-US">(the type of object)</span>  <span style="color: black; font-family: 宋体">，不考虑对象的某个特</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">定实例。比如，用户管理中，创建、删除，对所有的用户都一视同仁，并不区分操作的具体对象实例。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">细粒度：表示实例级，即需要考虑具体对象的实例</span> <span style="color: black; font-family: Arial" lang="EN-US">(the instance of  object)</span> <span style="color: black; font-family: 宋体">，当然，细</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如，合同管理中，列表、删除，需要区分该合同实例是否为当前用户所创建。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">原则</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限逻辑配合业务逻辑。即权限系统以为业务逻辑提供服务为目标。相当多细粒度的权限问题因其极其独特而不具通用意义，它们也能被理解为是“业务逻辑”的一部分。比如，要求：“合同资源只能被它的创建者删除，与创建者同组的用户可以修改，所有的用户能够浏览”。这既可以认为是一个细粒度的权限问题，也可以认为是一个业务逻辑问题。在这里它是业务逻辑问题，在整个权限系统的架构设计之中不予过多考虑。当然，权限系统的架构也必须要能支持这样的控制判断。或者说，系统提供足够多但不是完全的控制能力。即，设计原则归结为：“系统只提供粗粒度的权限，细粒度的权限被认为是业务逻辑的职责”。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">需要再次强调的是，这里表述的权限系统仅是一个“不完全”的权限系统，即，它不提供所有关于权限的问题的解决方法。它提供一个基础，并解决那些具有“共性”的</span>  <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">或者说粗粒度的</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">部分。在这个基础之上，根据“业务逻辑”的独特权限需求，编码实现剩余部分</span>  <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">或者说细粒度的</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">部分，才算完整。回到权限的问题公式，通用的设计仅解决了</span> <span style="color: black; font-family: Arial" lang="EN-US">Who+What+How </span><span style="color: black; font-family: 宋体">的问题，其他的权限问题留给业务逻辑解决。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">概念</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Who</span> <span style="color: black; font-family: 宋体">：权限的拥用者或主体（</span> <span style="color: black; font-family: Arial" lang="EN-US">Principal</span> <span style="color: black; font-family: 宋体">、</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">、</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">、</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">、</span> <span style="color: black; font-family: Arial" lang="EN-US">Actor</span> <span style="color: black; font-family: 宋体">等等）</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">：权限针对的对象或资源（</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">、</span> <span style="color: black; font-family: Arial" lang="EN-US">Class</span> <span style="color: black; font-family: 宋体">）。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">：具体的权限（</span> <span style="color: black; font-family: Arial" lang="EN-US">Privilege, </span><span style="color: black; font-family: 宋体">正向授权与负向授权）。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">Role</span> <span style="font-family: 宋体">：是角色，拥有一定数量的权限。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">：操作。表明对</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">的</span> <span style="color: black; font-family: Arial" lang="EN-US">How </span><span style="color: black; font-family: 宋体">操作。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">说明</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">：</span> <span style="font-family: 宋体">与</span> <span style="font-family: Arial" lang="EN-US">Role </span><span style="font-family: 宋体">相关，</span>  <span style="color: black; font-family: 宋体">用户仅仅是纯粹的用户，权限是被分离出去了的。</span> <span style="font-family: Arial" lang="EN-US">User</span> <span style="font-family: 宋体">是不能与</span> <span style="font-family: Arial" lang="EN-US">Privilege </span><span style="font-family: 宋体">直接相关的，</span> <span style="font-family: Arial" lang="EN-US">User </span><span style="font-family: 宋体">要拥有对某种资源的权限，必须通过</span> <span style="font-family: Arial" lang="EN-US">Role</span> <span style="font-family: 宋体">去关联。</span>  <span style="color: black; font-family: 宋体">解决</span> <span style="color: black; font-family: Arial" lang="EN-US">Who </span><span style="color: black; font-family: 宋体">的问题。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">Resource</span> <span style="font-family: 宋体">：就是系统的资源，比如部门新闻，文档等各种可以被提供给用户访问的对象。资源可以反向包含自身，即树状结构，每一个资源节点可以与若干指定权限类别相关可定义是否将其权限应用于子节点。</span>  <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">：是</span> <span style="font-family: Arial" lang="EN-US">Resource Related</span> <span style="font-family: 宋体">的权限。就是指，这个权限是绑定在特定的资源实例上的。比如说部门新闻的发布权限，叫做</span> <span style="font-family: Arial" lang="EN-US">&#8220;</span> <span style="font-family: 宋体">部门新闻发布权限</span> <span style="font-family: Arial" lang="EN-US">&#8220;</span> <span style="font-family: 宋体">。这就表明，该</span>  <span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">是一个发布权限，而且是针对部门新闻这种资源的一种发布权限。</span> <span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">是由</span> <span style="font-family: Arial" lang="EN-US">Creator</span> <span style="font-family: 宋体">在做开发时就确定的。权限，包括系统定义权限和用户自定义权限用户自定义权限之间可以指定排斥和包含关系</span>  <span style="font-family: Arial" lang="EN-US">(</span> <span style="font-family: 宋体">如：读取，修改，管理三个权限，管理</span> <span style="font-family: Arial"></span><span style="font-family: 宋体">权限</span> <span style="font-family: Arial"></span><span style="font-family: 宋体">包含</span> <span style="font-family: Arial"></span><span style="font-family: 宋体">前两种权限</span>  <span style="font-family: Arial" lang="EN-US">)</span> <span style="font-family: 宋体">。</span> <span style="font-family: Arial" lang="EN-US">Privilege </span><span style="font-family: 宋体">如</span> <span style="font-family: Arial" lang="EN-US">&#8220;</span> <span style="font-family: 宋体">删除</span>  <span style="font-family: Arial" lang="EN-US">&#8221; </span><span style="font-family: 宋体">是一个抽象的名词，当它不与任何具体的</span> <span style="font-family: Arial" lang="EN-US">Object </span><span style="font-family: 宋体">或</span>  <span style="font-family: Arial" lang="EN-US">Resource </span><span style="font-family: 宋体">绑定在一起时是没有任何意义的。拿新闻发布来说，发布是一种权限，但是只说发布它是毫无意义的。因为不知道发布可以操作的对象是什么。只有当发布与新闻结合在一起时，才会产生真正的</span>  <span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">。这就是</span> <span style="font-family: Arial" lang="EN-US">Privilege Instance</span> <span style="font-family: 宋体">。权限系统根据需求的不同可以延伸生很多不同的版本。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Role</span>  <span style="color: black; font-family: 宋体">：是粗粒度和细粒度</span> <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">业务逻辑</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">的接口，一个基于粗粒度控制的权限框架软件，对外的接口应该是</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">，具体业务实现可以直接继承或拓展丰富</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">的内容，</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">不是如同</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">或</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">的具体实体，它是接口概念，抽象的通称。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">Group</span> <span style="font-family: 宋体">：用户组，</span> <span style="color: black; font-family: 宋体">权限分配的单位与载体。权限不考虑分配给特定的用户。组可以包括组</span>  <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">以实现权限的继承</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">。</span> <span style="font-family: 宋体">组可以包含用户，组内用户继承组的权限。</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">要实现继承。即在创建时必须要指定该</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">的</span> <span style="color: black; font-family: Arial" lang="EN-US">Parent</span> <span style="color: black; font-family: 宋体">是什么</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">。在粗粒度控制上，可以认为，只要某用户直接或者间接的属于某个</span>  <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">那么它就具备这个</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">的所有操作许可。细粒度控制上，在业务逻辑的判断中，</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">仅应关注其直接属于的</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">，用来判断是否“同组”</span> <span style="color: black; font-family: Arial"></span><span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">是可继承的，对于一个分级的权限实现，某个</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">通过“继承”就已经直接获得了其父</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">所拥有的所有“权限集合”，对这个</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">而言，需要与权限建立直接关联的，仅是它比起其父</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">需要“扩展”的那部分权限。子组继承父组的所有权限，规则来得更简单，同时意味着管理更容易。为了更进一步实现权限的继承，最直接的就是在</span>  <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">上引入“父子关系”。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p><span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">User</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">与</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">是多对多的关系。即一个</span>  <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">User</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">可以属于多个</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">之中，一个</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">可以包括多个</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">User</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">。子</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">与父</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">是多对一的关系。</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Operator</span>  <span style="font-size: 10.5pt; color: black; font-family: 宋体">某种意义上类似于</span>  <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Resource +  Privilege</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">概念，但这里的</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Resource</span>  <span style="font-size: 10.5pt; color: black; font-family: 宋体">仅包括</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Resource  Type</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">不表示</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Resource  Instance</span> <span style="font-size: 10.5pt; color: black; font-family: 宋体">。</span> <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Group  </span><span style="font-size: 10.5pt; color: black; font-family: 宋体">可以直接映射组织结构，</span>  <span style="font-size: 10.5pt; color: black; font-family: Arial" lang="EN-US">Role </span><span style="font-size: 10.5pt; color: black; font-family: 宋体">可以直接映射组织结构中的业务角色，比</span></p>
<p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">较直观，而且也足够灵活。</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">对系统的贡献实质上就是提供了一个比较粗颗粒的分配单位。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">与</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">是多对多的关系。各概念的关系图示如下：</span> </font><span style="font-family: Arial" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:formulas><font size="2">  <v:f eqn="sum @10 21600 0"></v:f><br />
</font> </v:formulas><br />
<font size="2"> <v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><br />
<o:lock aspectratio="t" v:ext="edit"></o:lock><br />
</font></v:shapetype><v:shape id="_x0000_i1025" style="width: 414pt; height: 117.75pt" type="#_x0000_t75"><br />
<font size="2"><img src="http://dev.csdn.net/Develop/ArticleImages/19/19753/CSDN_Dev_Image_2003-7-171114050.wmz" /><br />
</font></v:shape></span><strong><span style="font-size: 14pt; font-family: 宋体">解释</span> </strong><font size="2"><font face="黑体"><span>：</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">的定义包括了</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource Type</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">Method</span> <span style="color: black; font-family: 宋体">概念。即，</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">的概念。之所以将</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">绑定在一起作为一个</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">概念而不是分开建模再建立关联，这是因为很多的</span> <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">对于某</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">才有意义。比如，发布操作对新闻对象才有意义，对用户对象则没有意义。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">本身的意义也有所不同，具体来说，对于每一个</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">可以定义</span> <span style="color: black; font-family: Arial" lang="EN-US">N</span> <span style="color: black; font-family: 宋体">种操作。比如，对于合同这类对象，可以定义创建操作、提交操作、检查冲突操作等。可以认为，</span>  <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">概念对应于每一个商业方法。其中，与具体用户身份相关的操作既可以定义在操作的业务逻辑之中，也可以定义在操作级别。比如，创建者的浏览视图与普通用户的浏览视图要求内容不同。既可以在外部定义两个操作方法，也可以在一个操作方法的内部根据具体逻辑进行处理。具体应用哪一种方式应依据实际情况进行处理。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">这样的架构，应能在易于理解和管理的情况下，满足绝大部分粗粒度权限控制的功能需要。但是除了粗粒度权限，系统中必然还会包括无数对具体</span>  <span style="color: black; font-family: Arial" lang="EN-US">Instance</span> <span style="color: black; font-family: 宋体">的细粒度权限。这些问题，被留给业务逻辑来解决，这样的考虑基于以下两点：</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoBodyTextIndent" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><font size="3">一方面，细粒度的权限判断必须要在资源上建模权限分配的支持信息才可能得以实现。比如，如果要求创建者和普通用户看到不同的信息内容，那么，资源本身应该有其创建者的信息。另一方面，细粒度的权限常常具有相当大的业务逻辑相关性。对不同的业务逻辑，常常意味着完全不同的权限判定原则和策略。相比之下，粗粒度的权限更具通用性，将其实现为一个架构，更有重用价值；而将细粒度的权限判断实现为一个架构级别的东西就显得繁琐，而且不是那么的有必要，用定制的代码来实现就更简洁，更灵活。</font>  </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">所以细粒度控制应该在底层解决，</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">在实例化的时候，必需指定</span> <span style="color: black; font-family: Arial" lang="EN-US">Owner</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">GroupPrivilege</span> <span style="color: black; font-family: 宋体">在对</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">进行操作时也必然会确定约束类型：究竟是</span> <span style="color: black; font-family: Arial" lang="EN-US">OwnerOK</span> <span style="color: black; font-family: 宋体">还是</span> <span style="color: black; font-family: Arial" lang="EN-US">GroupOK</span> <span style="color: black; font-family: 宋体">还是</span> <span style="color: black; font-family: Arial" lang="EN-US">AllOK</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">应和</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">严格分离</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">是多对多的关系，</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">只用于对用户分类，不包含任何</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">的意义；</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">只授予</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">，而不是</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">。如果用户需要还没有的多种</span> <span style="color: black; font-family: Arial" lang="EN-US">Privilege</span> <span style="color: black; font-family: 宋体">的组合，必须新增</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US">Privilege</span> <span style="color: black; font-family: 宋体">必须能够访问</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">，同时带</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">参数，这样权限控制就完备了。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">思想</span> </strong><span style="font-size: 14pt; color: black; font-family: 宋体">：</span> <span style="font-size: 14pt; color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限系统的核心由以下三部分构成：</span> <span style="color: black; font-family: Arial" lang="EN-US">1.</span> <span style="color: black; font-family: 宋体">创造权限，</span> <span style="color: black; font-family: Arial" lang="EN-US">2.</span> <span style="color: black; font-family: 宋体">分配权限，</span> <span style="color: black; font-family: Arial" lang="EN-US">3.</span> <span style="color: black; font-family: 宋体">使用权限，然后，系统各部分的主要参与者对照如下：</span> <span style="color: black; font-family: Arial" lang="EN-US">1.</span> <span style="color: black; font-family: 宋体">创造权限</span> <span style="color: black; font-family: Arial" lang="EN-US">- </span><span style="font-family: Arial" lang="EN-US">Creator</span> <span style="color: black; font-family: 宋体">创造，</span> <span style="color: black; font-family: Arial" lang="EN-US">2.</span> <span style="color: black; font-family: 宋体">分配权限</span> <span style="color: black; font-family: Arial" lang="EN-US">- Administrator </span><span style="color: black; font-family: 宋体">分配，</span> <span style="color: black; font-family: Arial" lang="EN-US">3.</span> <span style="color: black; font-family: 宋体">使用权限</span> <span style="color: black; font-family: Arial" lang="EN-US">- User</span> <span style="font-family: 宋体">：</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">1. Creator </span><span style="font-family: 宋体">创造</span> <span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">，</span> <span style="font-family: Arial" lang="EN-US">Creator </span><span style="font-family: 宋体">在设计和实现系统时会划分，一个子系统或称为模块，应该有哪些权限。这里完成的是</span> <span style="font-family: Arial"><span lang="EN-US">Privilege </span></span><span style="font-family: 宋体">与</span> <span style="font-family: Arial" lang="EN-US">Resource </span><span style="font-family: 宋体">的对象声明，并没有真正将</span> <span style="font-family: Arial" lang="EN-US">Privilege </span><span style="font-family: 宋体">与具体</span> <span style="font-family: Arial" lang="EN-US">Resource </span><span style="font-family: 宋体">实例联系在一起，形成</span> <span style="font-family: Arial" lang="EN-US">Operator</span> <span style="font-family: 宋体">。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">2. Administrator </span><span style="font-family: 宋体">指定</span> <span style="font-family: Arial" lang="EN-US">Privilege </span><span style="font-family: 宋体">与</span> <span style="font-family: Arial" lang="EN-US">Resource Instance </span><span style="font-family: 宋体">的关联。在这一步，</span> <span style="font-family: Arial"></span><span style="font-family: 宋体">权限真正与资源实例联系到了一起，</span> <span style="font-family: Arial"></span><span style="font-family: 宋体">产生了</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="font-family: 宋体">（</span> <span style="font-family: Arial" lang="EN-US">Privilege Instance</span> <span style="font-family: 宋体">）。</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator</span> <span style="color: black; font-family: 宋体">利用</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">这个基本元素，来创造他理想中的权限模型。如，创建角色，创建用户组，给用户组分配用户，将用户组与角色关联等等</span>  <span style="color: black; font-family: Arial" lang="EN-US">&#8230;</span> <span style="color: black; font-family: 宋体">这些操作都是由</span> <span style="color: black; font-family: Arial"><span lang="EN-US">Administrator  </span></span><span style="color: black; font-family: 宋体">来完成的。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">3. User  </span><span style="color: black; font-family: 宋体">使用</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator </span><span style="color: black; font-family: 宋体">分配给的权限去使用各个子系统。</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator </span><span style="color: black; font-family: 宋体">是用户，在他的心目中有一个比较适合他管理和维护的权限模型。于是，程序员只要回答一个问题，就是什么权限可以访问什么资源，也就是前面说的</span>  <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">。程序员提供</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator </span><span style="color: black; font-family: 宋体">就意味着给系统穿上了盔甲。</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator </span><span style="color: black; font-family: 宋体">就可以按照他的意愿来建立他所希望的权限框架</span> <span style="font-family: 宋体">可以自行增加，删除，管理</span> <span style="font-family: Arial" lang="EN-US">Resource</span> <span style="font-family: 宋体">和</span> <span style="font-family: Arial" lang="EN-US">Privilege</span> <span style="font-family: 宋体">之间关系。可以自行设定用户</span> <span style="font-family: Arial" lang="EN-US">User</span> <span style="font-family: 宋体">和角色</span>  <span style="font-family: Arial" lang="EN-US">Role</span> <span style="font-family: 宋体">的对应关系。</span> <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">如果将</span> <span style="color: black; font-family: Arial"></span><span style="font-family: Arial" lang="EN-US">Creator</span> <span style="color: black; font-family: 宋体">看作是</span> <span style="color: black; font-family: Arial"><span lang="EN-US">Basic  </span></span><span style="color: black; font-family: 宋体">的发明者，</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator </span><span style="color: black; font-family: 宋体">就是</span> <span style="color: black; font-family: Arial" lang="EN-US">Basic </span><span style="color: black; font-family: 宋体">的使用者，他可以做一些脚本式的编程</span> <span style="color: black; font-family: Arial" lang="EN-US">) Operator</span> <span style="color: black; font-family: 宋体">是这个系统中最关键的部分，它是一个纽带，一个系在</span> <span style="color: black; font-family: Arial" lang="EN-US">Programmer</span> <span style="color: black; font-family: 宋体">，</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrator</span> <span style="color: black; font-family: 宋体">，</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">之间的纽带。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">用一个功能模块来举例子。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">一．建立角色功能并做分配：</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">1</span> <span style="font-family: 宋体">．如果现在要做一个员工管理的模块</span> <span style="font-family: Arial" lang="EN-US">(</span> <span style="font-family: 宋体">即</span> <span style="font-family: Arial" lang="EN-US">Resources)</span> <span style="font-family: 宋体">，这个模块有三个功能，分别是：增加，修改，删除。给这三个功能各自分配一个</span> <span style="font-family: Arial" lang="EN-US">ID</span> <span style="font-family: 宋体">，这个</span> <span style="font-family: Arial" lang="EN-US">ID</span> <span style="font-family: 宋体">叫做功能代号：</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: Arial" lang="EN-US">Emp_addEmp</span> <span style="font-family: 宋体">，</span> <span style="font-family: Arial" lang="EN-US">Emp_deleteEmp</span> <span style="font-family: 宋体">，</span> <span style="font-family: Arial" lang="EN-US">Emp_updateEmp</span> <span style="font-family: 宋体">。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">2</span> <span style="font-family: 宋体">．建立一个角色</span> <span style="font-family: Arial" lang="EN-US">(Role)</span> <span style="font-family: 宋体">，把上面的功能代码加到这个角色拥有的权限中，并保存到数据库中。角色包括系统管理员，测试人员等。</span>  <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: Arial" lang="EN-US">3</span> <span style="font-family: 宋体">．建立一个员工的账号，并把一种或几种角色赋给这个员工。比如说这个员工既可以是公司管理人员，也可以是测试人员等。这样他登录到系统中将会只看到他拥有权限的那些模块。</span>  <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">二．把身份信息加到</span> <span style="font-family: Arial" lang="EN-US">Session</span> <span style="font-family: 宋体">中。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">登录时，先到数据库中查找是否存在这个员工，如果存在，再根据员工的</span>  <span style="font-family: Arial" lang="EN-US">sn</span> <span style="font-family: 宋体">查找员工的权限信息，把员工所有的权限信息都入到一个</span> <span style="font-family: Arial" lang="EN-US">Hashmap</span> <span style="font-family: 宋体">中，比如就把上面的</span> <span style="font-family: Arial" lang="EN-US">Emp_addEmp</span> <span style="font-family: 宋体">等放到这个</span> <span style="font-family: Arial" lang="EN-US">Hashmap</span> <span style="font-family: 宋体">中。然后把</span> <span style="font-family: Arial" lang="EN-US">Hashmap</span> <span style="font-family: 宋体">保存在一个</span> <span style="font-family: Arial" lang="EN-US">UserInfoBean</span> <span style="font-family: 宋体">中。最后把这个</span> <span style="font-family: Arial" lang="EN-US">UserInfoBean</span> <span style="font-family: 宋体">放到</span> <span style="font-family: Arial" lang="EN-US">Session</span> <span style="font-family: 宋体">中，这样在整个程序的运行过程中，系统随时都可以取得这个用户的身份信息。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">三．根据用户的权限做出不同的显示。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">可以对比当前员工的权限和给这个菜单分配的“功能</span> <span style="font-family: Arial" lang="EN-US">ID</span> <span style="font-family: 宋体">”判断当前用户是否有打开这个菜单的权限。</span> <span style="font-family: 宋体">例如：如果保存员工权限的</span> <span style="font-family: Arial" lang="EN-US">Hashmap</span> <span style="font-family: 宋体">中没有这三个</span> <span style="font-family: Arial" lang="EN-US">ID</span> <span style="font-family: 宋体">的任何一个，那这个</span> <span style="font-family: 宋体">菜</span>  <span style="font-family: 宋体">单就不会显示，如果</span> <span style="font-family: 宋体">员工</span> <span style="font-family: 宋体">的</span> <span style="font-family: Arial" lang="EN-US">Hashmap</span> <span style="font-family: 宋体">中有任何一个</span> <span style="font-family: Arial" lang="EN-US">ID</span> <span style="font-family: 宋体">，那这个</span>  <span style="font-family: 宋体">菜</span> <span style="font-family: 宋体">单都会显示。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">对于一个新闻系统</span> <span style="font-family: Arial" lang="EN-US">(Resouce)</span> <span style="font-family: 宋体">，假设它有这样的功能</span> <span style="font-family: Arial" lang="EN-US">(Privilege)</span> <span style="font-family: 宋体">：查看，发布，删除，修改；假设对于删除，有</span> <span style="font-family: Arial" lang="EN-US">&#8220;</span> <span style="font-family: 宋体">新闻系统管理者只能删除一月前发布的，而超级管理员可删除所有的这样的限制，这属于业务逻辑</span> <span style="font-family: Arial" lang="EN-US">(Business logic)</span> <span style="font-family: 宋体">，而不属于用户权限范围。也就是说权限负责有没有删除的</span> <span style="font-family: Arial" lang="EN-US">Permission</span> <span style="font-family: 宋体">，至于能删除哪些内容应该根据</span> <span style="font-family: Arial" lang="EN-US">UserRole or UserGroup</span> <span style="font-family: 宋体">来决定</span> <span style="font-family: Arial" lang="EN-US">(</span> <span style="font-family: 宋体">当然给</span>  <span style="font-family: Arial" lang="EN-US">UserRole or UserGroup</span> <span style="font-family: 宋体">分配权限时就应该包含上面两条业务逻辑</span> <span style="font-family: Arial" lang="EN-US">)</span> <span style="font-family: 宋体">。</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">一个用户可以拥有多种角色，但同一时刻用户只能用一种角色进入系统。角色的划分方法可以根据实际情况划分，按部门或机构进行划分的，至于角色拥有多少权限，这就看系统管理员赋给他多少的权限了。用户—角色—权限的关键是角色。用户登录时是以用户和角色两种属性进行登录的（因为一个用户可以拥有多种角色，但同一时刻只能扮演一种角色），根据角色得到用户的权限，登录后进行初始化。这其中的技巧是同一时刻某一用户只能用一种角色进行登录。</span>  <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">针对不同的“角色”动态的建立不同的组，</span> <span style="color: black; font-family: 宋体">每个项目建立一个单独的</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">，对于新的项目，建立新的</span> <span style="color: black; font-family: Arial" lang="EN-US">Group </span><span style="color: black; font-family: 宋体">即可。在权限判断部分，应在商业方法上予以控制。比如：不同用户的“操作能力”是不同的</span>  <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">粗粒度的控制应能满足要求</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">，不同用户的“可视区域”是不同的</span> <span style="color: black; font-family: Arial" lang="EN-US">(</span> <span style="color: black; font-family: 宋体">体现在对被操作的对象的权限数据，是否允许当前用户访问，这需要对业务数据建模的时候考虑权限控制需要</span>  <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 14pt; font-family: 宋体">扩展性：</span> </strong><strong><span style="font-size: 14pt; font-family: Arial" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">有了用户</span>  <span style="color: black; font-family: Arial" lang="EN-US">/</span> <span style="color: black; font-family: 宋体">权限管理的基本框架，</span> <span style="color: black; font-family: Arial" lang="EN-US">Who(User/Group)</span> <span style="color: black; font-family: 宋体">的概念是不会经常需要扩展的。变化的可能是系统中引入新的</span> <span style="color: black; font-family: Arial" lang="EN-US">What (</span> <span style="color: black; font-family: 宋体">新的</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">类型</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">或者新的</span> <span style="color: black; font-family: Arial" lang="EN-US">How(</span> <span style="color: black; font-family: 宋体">新的操作方式</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">。那在三个基本概念中，仅在</span> <span style="color: black; font-family: Arial" lang="EN-US">Permission</span> <span style="color: black; font-family: 宋体">上进行扩展是不够的。这样的设计中</span> <span style="color: black; font-family: Arial" lang="EN-US">Permission</span> <span style="color: black; font-family: 宋体">实质上解决了</span> <span style="color: black; font-family: Arial" lang="EN-US">How </span><span style="color: black; font-family: 宋体">的问题，即表示了“怎样”的操作。那么这个“怎样”是在哪一个层次上的定义呢？将</span>  <span style="color: black; font-family: Arial" lang="EN-US">Permission</span>  <span style="color: black; font-family: 宋体">定义在“商业方法”级别比较合适。比如，发布、购买、取消。每一个商业方法可以意味着用户进行的一个“动作”。定义在商业逻辑的层次上，一方面保证了数据访问代码的“纯洁性”，另一方面在功能上也是“足够”的。也就是说，对更低层次，能自由的访问数据，对更高层次，也能比较精细的控制权限。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">确定了</span>  <span style="color: black; font-family: Arial" lang="EN-US">Permission</span>  <span style="color: black; font-family: 宋体">定义的合适层次，更进一步，能够发现</span> <span style="color: black; font-family: Arial" lang="EN-US">Permission</span> <span style="color: black; font-family: 宋体">实际上还隐含了</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">的概念。也就是说，对于</span> <span style="color: black; font-family: Arial" lang="EN-US">What</span> <span style="color: black; font-family: 宋体">的</span> <span style="color: black; font-family: Arial" lang="EN-US">How</span> <span style="color: black; font-family: 宋体">操作才会是一个完整的</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">。比如，“发布”操作，隐含了“信息”的“发布”概念，而对于“商品”而言发布操作是没有意义的。同样的，“购买”操作，隐含了“商品”的“购买”概念。这里的绑定还体现在大量通用的同名的操作上，比如，需要区分“商品的删除”与“信息的删除”这两个同名为“删除”的不同操作。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">提供权限系统的扩展能力是在</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator (Resource + Permission)</span>  <span style="color: black; font-family: 宋体">的概念上进行扩展。</span> <span style="color: black; font-family: Arial" lang="EN-US">Proxy </span><span style="color: black; font-family: 宋体">模式是一个非常合适的实现方式。实现大致如下：在业务逻辑层</span> <span style="color: black; font-family: Arial" lang="EN-US">(EJB Session Facade  [Stateful SessionBean]</span> <span style="color: black; font-family: 宋体">中</span> <span style="color: black; font-family: Arial" lang="EN-US">)</span> <span style="color: black; font-family: 宋体">，取得该商业方法的</span> <span style="color: black; font-family: Arial" lang="EN-US">Methodname</span> <span style="color: black; font-family: 宋体">，再根据</span> <span style="color: black; font-family: Arial" lang="EN-US">Classname</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">Methodname </span><span style="color: black; font-family: 宋体">检索</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator </span><span style="color: black; font-family: 宋体">数据，然后依据这个</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">信息和</span> <span style="color: black; font-family: Arial" lang="EN-US">Stateful</span> <span style="color: black; font-family: 宋体">中保存的</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">信息判断当前用户是否具备该方法的操作权限。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">应用在</span>  <span style="color: black; font-family: Arial" lang="EN-US">EJB </span><span style="color: black; font-family: 宋体">模式下，可以定义一个很明确的</span> <span style="color: black; font-family: Arial" lang="EN-US">Business</span> <span style="color: black; font-family: 宋体">层次，而一个</span> <span style="color: black; font-family: Arial" lang="EN-US">Business </span><span style="color: black; font-family: 宋体">可能意味着不同的视图，当多个视图都对应于一个业务逻辑的时候，比如，</span>  <span style="color: black; font-family: Arial" lang="EN-US">Swing Client</span>  <span style="color: black; font-family: 宋体">以及</span> <span style="color: black; font-family: Arial" lang="EN-US">Jsp Client </span><span style="color: black; font-family: 宋体">访问的是同一个</span> <span style="color: black; font-family: Arial" lang="EN-US">EJB </span><span style="color: black; font-family: 宋体">实现的</span> <span style="color: black; font-family: Arial" lang="EN-US">Business</span> <span style="color: black; font-family: 宋体">。在</span> <span style="color: black; font-family: Arial" lang="EN-US">Business </span><span style="color: black; font-family: 宋体">层上应用权限较能提供集中的控制能力。实际上，如果权限系统提供了查询能力，那么会发现，在视图层次已经可以不去理解权限，它只需要根据查询结果控制界面就可以了。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><strong><span style="font-size: 14pt; color: black; font-family: 宋体">灵活性</span> </strong><font size="3"><span style="color: black; font-family: 宋体">：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">和</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">，只是一种辅助实现的手段，不是必需的。如果系统的</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">很多，逐个授权违背了“简单，方便”的目的，那就引入</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">，将权限相同的</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">组成一个</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">进行集中授权。</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">也一样，是某一类</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">的集合，是为了简化针对多个</span> <span style="color: black; font-family: Arial" lang="EN-US">Operator</span> <span style="color: black; font-family: 宋体">的操作。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">把具体的用户和组从权限中解放出来。一个用户可以承担不同的角色，从而实现授权的灵活性。当然，</span>  <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">也可以实现类似的功能。但实际业务中，</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">划分多以行政组织结构或业务功能划分；如果为了权限管理强行将一个用户加入不同的组，会导致管理的复杂性。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Domain</span> <span style="color: black; font-family: 宋体">的应用。为了授权更灵活，可以将</span> <span style="color: black; font-family: Arial" lang="EN-US">Where</span> <span style="color: black; font-family: 宋体">或者</span> <span style="color: black; font-family: Arial" lang="EN-US">Scope</span> <span style="color: black; font-family: 宋体">抽象出来，称之为</span> <span style="color: black; font-family: Arial" lang="EN-US">Domain</span> <span style="color: black; font-family: 宋体">，真正的授权是在</span> <span style="color: black; font-family: Arial" lang="EN-US">Domain</span> <span style="color: black; font-family: 宋体">的范围内进行，具体的</span> <span style="color: black; font-family: Arial" lang="EN-US">Resource</span> <span style="color: black; font-family: 宋体">将分属于不同的</span> <span style="color: black; font-family: Arial" lang="EN-US">Domain</span> <span style="color: black; font-family: 宋体">。比如：一个新闻机构有国内与国外两大分支，两大分支内又都有不同的资源（体育类、生活类、时事政治类）。假如所有国内新闻的权限规则都是一样的，所有国外新闻的权限规则也相同。则可以建立两个域，分别授权，然后只要将各类新闻与不同的域关联，受域上的权限控制，从而使之简化。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限系统还应该考虑将功能性的授权与资源性的授权分开。很多系统都只有对系统中的数据（资源）的维护有权限控制，但没有对系统功能的权限控制。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限系统最好是可以分层管理而不是集中管理。大多客户希望不同的部门能且仅能管理其部门内部的事务，而不是什么都需要一个集中的</span>  <span style="color: black; font-family: Arial" lang="EN-US">Administrator</span>  <span style="color: black; font-family: 宋体">或</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrators</span> <span style="color: black; font-family: 宋体">组来管理。虽然你可以将不同部门的人都加入</span> <span style="color: black; font-family: Arial" lang="EN-US">Administrators</span> <span style="color: black; font-family: 宋体">组，但他们的权限过大，可以管理整个系统资源而不是该部门资源。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">正向授权与负向授权：正向授权在开始时假定主体没有任何权限，然后根据需要授予权限，适合于权限要求严格的系统。负向授权在开始时假定主体有所有权限，然后将某些特殊权限收回。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">权限计算策略：系统中</span> <span style="color: black; font-family: Arial" lang="EN-US">User</span> <span style="color: black; font-family: 宋体">，</span> <span style="color: black; font-family: Arial" lang="EN-US">Group</span> <span style="color: black; font-family: 宋体">，</span> <span style="color: black; font-family: Arial" lang="EN-US">Role</span> <span style="color: black; font-family: 宋体">都可以授权，权限可以有正负向之分，在计算用户的净权限时定义一套策略。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">系统中应该有一个集中管理权限的</span> <span style="color: black; font-family: Arial" lang="EN-US">AccessService</span> <span style="color: black; font-family: 宋体">，负责权限的维护（业务管理员、安全管理模块）与使用（最终用户、各功能模块），该</span>  <span style="color: black; font-family: Arial" lang="EN-US">AccessService</span>  <span style="color: black; font-family: 宋体">在实现时要同时考虑一般权限与特殊权限。虽然在具体实现上可以有很多，比如用</span>  <span style="color: black; font-family: Arial" lang="EN-US">Proxy</span> <span style="color: black; font-family: 宋体">模式，但应该使这些</span> <span style="color: black; font-family: Arial" lang="EN-US">Proxy</span> <span style="color: black; font-family: 宋体">依赖于</span> <span style="color: black; font-family: Arial" lang="EN-US">AccessService</span> <span style="color: black; font-family: 宋体">。各模块功能中调用</span> <span style="color: black; font-family: Arial" lang="EN-US">AccessService</span> <span style="color: black; font-family: 宋体">来检查是否有相应的权限。所以说，权限管理不是安全管理模块自己一个人的事情，而是与系统各功能模块都有关系。每个功能模块的开发人员都应该熟悉安全管理模块，当然，也要从业务上熟悉本模块的安全规则。</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 14pt; font-family: 宋体">技术实现</span> </strong><font size="3"><span style="font-family: 宋体">：</span> <span style="font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">1</span> <span style="color: black; font-family: 宋体">．表单式认证，这是常用的，但用户到达一个不被授权访问的资源时，</span>  <span style="color: black; font-family: Arial" lang="EN-US">Web</span> <span style="color: black; font-family: 宋体">容器就发</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: black; font-family: 宋体">出一个</span> <span style="color: black; font-family: Arial" lang="EN-US">html</span> <span style="color: black; font-family: 宋体">页面，要求输入用户名和密码。</span> <span style="color: black; font-family: Arial"><span lang="EN-US"><o:p></o:p></span></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">2</span> <span style="color: black; font-family: 宋体">．一个基于</span> <span style="color: black; font-family: Arial" lang="EN-US">Servlet Sign in/Sign out</span> <span style="color: black; font-family: 宋体">来集中处理所有的</span> <span style="color: black; font-family: Arial" lang="EN-US">Request</span> <span style="color: black; font-family: 宋体">，缺点是必须由应用程序自己来处理。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">3</span> <span style="color: black; font-family: 宋体">．用</span> <span style="color: black; font-family: Arial" lang="EN-US">Filter</span> <span style="color: black; font-family: 宋体">防止用户访问一些未被授权的资源，</span> <span style="color: black; font-family: Arial" lang="EN-US">Filter</span> <span style="color: black; font-family: 宋体">会截取所有</span> <span style="color: black; font-family: Arial" lang="EN-US">Request/Response</span> <span style="color: black; font-family: 宋体">，</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left" align="left"><font size="3"><span style="color: black; font-family: 宋体">然后放置一个验证通过的标识在用户的</span> <span style="color: black; font-family: Arial" lang="EN-US">Session</span> <span style="color: black; font-family: 宋体">中，然后</span> <span style="color: black; font-family: Arial" lang="EN-US">Filter</span> <span style="color: black; font-family: 宋体">每次依靠这个标识来决定是否放行</span> <span style="color: black; font-family: Arial" lang="EN-US">Response</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: 宋体">这个模式分为：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Gatekeeper </span><span style="color: black; font-family: 宋体">：采取</span> <span style="color: black; font-family: Arial" lang="EN-US">Filter</span> <span style="color: black; font-family: 宋体">或统一</span> <span style="color: black; font-family: Arial" lang="EN-US">Servlet</span> <span style="color: black; font-family: 宋体">的方式。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Authenticator</span> <span style="color: black; font-family: 宋体">：</span> <span style="color: black; font-family: Arial"></span><span style="color: black; font-family: 宋体">在</span> <span style="color: black; font-family: Arial" lang="EN-US">Web</span> <span style="color: black; font-family: 宋体">中使用</span> <span style="color: black; font-family: Arial" lang="EN-US">JAAS</span> <span style="color: black; font-family: 宋体">自己来实现。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: 宋体">用户资格存储</span> <span style="color: black; font-family: Arial" lang="EN-US">LDAP</span> <span style="color: black; font-family: 宋体">或数据库：</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span style="color: black; font-family: Arial" lang="EN-US"><font size="3">1.</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">       </span></span><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Gatekeeper</span> <span style="color: black; font-family: 宋体">拦截检查每个到达受保护的资源。首先检查这个用户是否有已经创建</span>  <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: black; font-family: 宋体">好的</span> <span style="color: black; font-family: Arial" lang="EN-US">Login Session</span> <span style="color: black; font-family: 宋体">，如果没有，</span> <span style="color: black; font-family: Arial" lang="EN-US">Gatekeeper </span><span style="color: black; font-family: 宋体">检查是否有一个全局的和</span> <span style="color: black; font-family: Arial" lang="EN-US">Authenticator</span> <span style="color: black; font-family: 宋体">相关的</span> <span style="color: black; font-family: Arial" lang="EN-US">session</span> <span style="color: black; font-family: 宋体">？</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span style="color: black; font-family: Arial" lang="EN-US"><font size="3">2.</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">       </span></span><font size="3"><span style="color: black; font-family: 宋体">如果没有全局的</span> <span style="color: black; font-family: Arial" lang="EN-US">session</span> <span style="color: black; font-family: 宋体">，这个用户被导向到</span> <span style="color: black; font-family: Arial" lang="EN-US">Authenticator</span> <span style="color: black; font-family: 宋体">的</span> <span style="color: black; font-family: Arial" lang="EN-US">Sign-on </span><span style="color: black; font-family: 宋体">页面，</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: black; font-family: 宋体">要求提供用户名和密码。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span style="color: black; font-family: Arial" lang="EN-US"><font size="3">3.</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">       </span></span><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">Authenticator</span> <span style="color: black; font-family: 宋体">接受用户名和密码，通过用户的资格系统验证用户。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span style="color: black; font-family: Arial" lang="EN-US"><font size="3">4.</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">       </span></span><font size="3"><span style="color: black; font-family: 宋体">如果验证成功，</span> <span style="color: black; font-family: Arial" lang="EN-US">Authenticator</span> <span style="color: black; font-family: 宋体">将创建一个全局</span> <span style="color: black; font-family: Arial" lang="EN-US">Login session</span> <span style="color: black; font-family: 宋体">，并且导向</span> <span style="color: black; font-family: Arial" lang="EN-US">Gatekeeper<o:p></o:p></span>  </font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="color: black; font-family: 宋体">来为这个用户在他的</span> <span style="color: black; font-family: Arial" lang="EN-US">web</span> <span style="color: black; font-family: 宋体">应用中创建一个</span> <span style="color: black; font-family: Arial" lang="EN-US">Login Session</span> <span style="color: black; font-family: 宋体">。</span> <span style="color: black; font-family: Arial" lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="color: black; font-family: Arial" lang="EN-US">5.<span>     </span>Authenticator</span> <span style="color: black; font-family: 宋体">和</span>  <span style="color: black; font-family: Arial" lang="EN-US">Gatekeepers</span>  <span style="color: black; font-family: 宋体">联合分享</span> <span style="color: black; font-family: Arial" lang="EN-US">Cookie</span> <span style="color: black; font-family: 宋体">，或者使用</span> <span style="color: black; font-family: Arial" lang="EN-US">Tokens</span> <span style="color: black; font-family: 宋体">在</span> <span style="color: black; font-family: Arial" lang="EN-US">Query</span> <span style="color: black; font-family: 宋体">字符里。</span> </font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/07/middlegen%e4%b8%ad%e9%85%8d%e7%bd%aehibernate%e7%9a%84many-to-many%e5%b1%9e%e6%80%a7/' rel='bookmark' title='Permanent Link: MiddleGen中配置hibernate的many to many属性'>MiddleGen中配置hibernate的many to many属性</a></li><li><a href='http://www.foxlog.org/2006/10/26/ztrbac-%e6%a8%a1%e5%9e%8b%e5%88%9d%e6%8e%a2/' rel='bookmark' title='Permanent Link: [zt]RBAC 模型初探'>[zt]RBAC 模型初探</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/10/26/zt%e5%85%b3%e4%ba%8e%e7%94%a8%e6%88%b7%e8%a7%92%e8%89%b2%e6%9d%83%e9%99%90%e7%9a%84%e4%b8%80%e7%82%b9%e6%83%b3%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]RBAC 模型初探</title>
		<link>http://www.foxlog.org/2006/10/26/ztrbac-%e6%a8%a1%e5%9e%8b%e5%88%9d%e6%8e%a2/</link>
		<comments>http://www.foxlog.org/2006/10/26/ztrbac-%e6%a8%a1%e5%9e%8b%e5%88%9d%e6%8e%a2/#comments</comments>
		<pubDate>Thu, 26 Oct 2006 14:43:08 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/57</guid>
		<description><![CDATA[访问控制背景 访问控制技术是由美国国防部（Department of Defense, DoD）资助的研究和开发成果演变而来的。这一研究导致两种基本类型访问控制的产生：自主访问控制（Discretionary Access Control, DAC）和强制访问控制（Mandatory Access Control, MAC）。最初的研究和应用主要是为了防止机密信息被未经授权者访问，近期的应用主要是把这些策略应用到为商业领域。 自主访问控制，允许把访问控制权的授予和取消留给个体用户来判断。为没有访问控制权的个体用户授予和废除许可。自主访问控制机制允许用户被授权和 取消访问其控制之下的任何客体（object），换句话说，用户就是他们控制下的客体的拥有者。然而，对于多数组织来说，最终用户对所访问的信息没有拥有权。对于这些组织，公司或代理机构是事实上的系统客体和处理他们的程序的拥有者。访问优先权受组织控制，而且也常常基于雇员功能而不是数据所有权。 强制访问控制，在美国国防部 Trusted Computer Security Evaluation Criteria (TCSEC) 中定义如下：“一种限制访问客体的手段，它以包含在这些客体中的信息敏感性和访问这些敏感性信息的主体的正式授权信息（如清除）为基础”。 以上访问控制策略对于处理一些无需保密但又敏感的信息的政府和行业组织的需求并不是特别的适合。在这样的环境下，安全目标支持产生于现有法律、道德规范、规章、或一般惯例的高端组织策略。这些环境通常需要控制个体行为的能力，而不仅仅是如何根据信息的敏感性为其设置标签从而访问这一信息的个人能力。 什么是基于角色访问控制（Role-Based Access Control, RBAC）？NIST 有如下定义。 访问是一种利用计算机资源去做某件事情的的能力，访问控制是一种手段，通过它这种能力在某些情况下被允许或者受限制（通常是通过物理上和基于系统的控制）。基于计算机的访问控制不仅可规定是“谁”或某个操作有权使用特定系统资源，而且也能规定被允许的访问类型。这些控制方式可在计算机系统或者外部设备中实现。 就基于角色访问控制而言，访问决策是基于角色的，个体用户是某个组织的一部分。用户具有指派的角色（比如医生、护士、出纳、经理）。定义角色的过程应该基于对组织运转的彻底分析，应该包括来自一个组织中更广范围用户的输入。 访问权按角色名分组，资源的使用受限于授权给假定关联角色的个体。例如，在一个医院系统中，医生角色可能包括进行诊断、开据处方、指示实验室化验等；而研究员的角色则被限制在收集用于研究的匿名临床信息工作上。 控制访问角色的运用可能是一种开发和加强企业特殊安全策略，进行安全管理过程流程化的有效手段。 用户（User）和角色（Role） 用户指访问系统中的资源的主体，一般为人，也可为 Agent 等智能程序。角色指应用领域内一种权力和责任的语义综合体，可以是一个抽象概念，也可以是对应于实际系统中的特定语义体，比如组织内部的职务等。针对角色属性的不同，某些模型中将角色进一步细分为普通角色和管理员角色（可理解为全局角色）。 许可（Permissions）和权限（Permission） 许可描述了角色对计算机资源的访问和操作所具有的权限，其反映的是授权的结果。比如授予某个角色对计算机资源有读的权限，则代表了一个许可的存在，这个许可表示：角色获取了对计算机资源的读许可。针对操作来说，其描述的是许可和操作之间的一种关联关系，而这层关系则表示了某一角色对某一操作所具有的权限及权限状态。 角色和指派（Assignment） 指派包含两个方面，用户指派和许可指派。用户指派表示的是，将用户指派给特定的角色。许可指派表示的是为角色指派计算机资源的访问和操作许可。 会话（session） 会话表示的是用户和角色之间的关系。用户每次必须通过建立会话来激活角色，得到相应的访问权限。 角色和角色等级（Role Hierarchies） 角色本身仅仅只是一个名词，其本身并不能代表权限的大小。比如，我们可以定一个“Director”的角色，也可以定一个“Project Leader”的角色。对于现实中我们来说，看到这样两个角色，就清楚 DIR 的权限要比一个 PL 的权限级别高。但是对计算机来说，这两个角色仅仅是两个“词语”，是等同的。可以采用分等级角色，在角色上实现层次化来解决这些问题。也可以采用复合角色（其表示的就是一个角色组的概念），对角色实现一定的分组和复合，以便于权限指派。在一些 OA 产品中经常出现分等级角色。 限制（Constraints） 模型中的职责分离关系（Separation of Duty），用于控制冲突（Conflict）。静态职责分离（Static [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText"><strong><font size="3">访问控制背景</font> </strong></p>
<p>访问控制技术是由美国国防部（Department of Defense,  DoD）资助的研究和开发成果演变而来的。这一研究导致两种基本类型访问控制的产生：自主访问控制（Discretionary Access Control,  DAC）和强制访问控制（Mandatory Access Control,  MAC）。最初的研究和应用主要是为了防止机密信息被未经授权者访问，近期的应用主要是把这些策略应用到为商业领域。</p>
<p>自主访问控制，允许把访问控制权的授予和取消留给个体用户来判断。为没有访问控制权的个体用户授予和废除许可。自主访问控制机制允许用户被授权和<br />
取消访问其控制之下的任何客体（object），换句话说，用户就是他们控制下的客体的拥有者。然而，对于多数组织来说，最终用户对所访问的信息没有拥有权。对于这些组织，公司或代理机构是事实上的系统客体和处理他们的程序的拥有者。访问优先权受组织控制，而且也常常基于雇员功能而不是数据所有权。</p>
<p>强制访问控制，在美国国防部 Trusted Computer Security Evaluation Criteria (TCSEC)  中定义如下：“一种限制访问客体的手段，它以包含在这些客体中的信息敏感性和访问这些敏感性信息的主体的正式授权信息（如清除）为基础”。</p>
<p>以上访问控制策略对于处理一些无需保密但又敏感的信息的政府和行业组织的需求并不是特别的适合。在这样的环境下，安全目标支持产生于现有法律、道德规范、规章、或一般惯例的高端组织策略。这些环境通常需要控制个体行为的能力，而不仅仅是如何根据信息的敏感性为其设置标签从而访问这一信息的个人能力。</p>
<p><strong><font size="3">什么是基于角色访问控制（Role-Based Access Control, RBAC）？NIST  有如下定义。<br />
</font></strong><br />
访问是一种利用计算机资源去做某件事情的的能力，访问控制是一种手段，通过它这种能力在某些情况下被允许或者受限制（通常是通过物理上和基于系统的控制）。基于计算机的访问控制不仅可规定是“谁”或某个操作有权使用特定系统资源，而且也能规定被允许的访问类型。这些控制方式可在计算机系统或者外部设备中实现。</p>
<p>就基于角色访问控制而言，访问决策是基于角色的，个体用户是某个组织的一部分。用户具有指派的角色（比如医生、护士、出纳、经理）。定义角色的过程应该基于对组织运转的彻底分析，应该包括来自一个组织中更广范围用户的输入。</p>
<p>访问权按角色名分组，资源的使用受限于授权给假定关联角色的个体。例如，在一个医院系统中，医生角色可能包括进行诊断、开据处方、指示实验室化验等；而研究员的角色则被限制在收集用于研究的匿名临床信息工作上。</p>
<p>控制访问角色的运用可能是一种开发和加强企业特殊安全策略，进行安全管理过程流程化的有效手段。</p>
<p><strong><font size="3">用户（User）和角色（Role）</font> </strong></p>
<p>用户指访问系统中的资源的主体，一般为人，也可为 Agent  等智能程序。角色指应用领域内一种权力和责任的语义综合体，可以是一个抽象概念，也可以是对应于实际系统中的特定语义体，比如组织内部的职务等。针对角色属性的不同，某些模型中将角色进一步细分为普通角色和管理员角色（可理解为全局角色）。</p>
<p><font size="3"><strong>许可（Permissions）和权限（Permission）</strong> </font></p>
<p>许可描述了角色对计算机资源的访问和操作所具有的权限，其反映的是授权的结果。比如授予某个角色对计算机资源有读的权限，则代表了一个许可的存在，这个许可表示：角色获取了对计算机资源的读许可。针对操作来说，其描述的是许可和操作之间的一种关联关系，而这层关系则表示了某一角色对某一操作所具有的权限及权限状态。</p>
<p><strong><font size="3">角色和指派（Assignment）</font></strong></p>
<p>指派包含两个方面，用户指派和许可指派。用户指派表示的是，将用户指派给特定的角色。许可指派表示的是为角色指派计算机资源的访问和操作许可。</p>
<p><strong><font size="3">会话（session）</font> </strong></p>
<p>会话表示的是用户和角色之间的关系。用户每次必须通过建立会话来激活角色，得到相应的访问权限。</p>
<p><strong><font size="3">角色和角色等级（Role Hierarchies）</font> </strong></p>
<p>角色本身仅仅只是一个名词，其本身并不能代表权限的大小。比如，我们可以定一个“Director”的角色，也可以定一个“Project  Leader”的角色。对于现实中我们来说，看到这样两个角色，就清楚 DIR 的权限要比一个 PL  的权限级别高。但是对计算机来说，这两个角色仅仅是两个“词语”，是等同的。可以采用分等级角色，在角色上实现层次化来解决这些问题。也可以采用复合角色（其表示的就是一个角色组的概念），对角色实现一定的分组和复合，以便于权限指派。在一些  OA 产品中经常出现分等级角色。</p>
<p><font size="3"><strong>限制（Constraints）</strong> </font></p>
<p>模型中的职责分离关系（Separation of Duty），用于控制冲突（Conflict）。静态职责分离（Static  SD）指定角色的互斥关系，用于用户指派阶段。避免同一用户拥有互斥的角色。实现简单，角色互斥语义关系清楚，便于管理不够灵活，不能处理某些实际情况。动态职责分离（Dynamic  SD）指定角色的互斥关系，用于角色激活阶段。允许同一用户拥有某些互斥的角色，但是不允许该用户同时激活互斥的角色。更灵活，直接与会话挂钩，适应实际管理需要，实现复杂，不易管理。</p>
<p><font size="3"><strong>  </strong></font></p>
<p><font size="3"><strong>参考文献</strong> </font></p>
<p>《AN INTRODUCTION TO ROLE-BASED  ACCESS CONTROL》 NIST《工作流授权控制模型》        胡长城</p>
<p>《基于角色的权限管理综述》 俞诗鹏</p>
<p>最后，感谢宏云博士对本文翻译提供的指导。</p>
<p><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="http://www.foxlog.org/rosen"><strong><font color="#ff0000" size="2">http://www.blogjava.net/rosen</font></strong></a></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/10/26/ztrbac-%e6%a8%a1%e5%9e%8b%e5%88%9d%e6%8e%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>谈谈 Facade与Proxy的联系与区别</title>
		<link>http://www.foxlog.org/2006/10/10/%e8%b0%88%e8%b0%88-facade%e4%b8%8eproxy%e7%9a%84%e8%81%94%e7%b3%bb%e4%b8%8e%e5%8c%ba%e5%88%ab/</link>
		<comments>http://www.foxlog.org/2006/10/10/%e8%b0%88%e8%b0%88-facade%e4%b8%8eproxy%e7%9a%84%e8%81%94%e7%b3%bb%e4%b8%8e%e5%8c%ba%e5%88%ab/#comments</comments>
		<pubDate>Tue, 10 Oct 2006 03:40:17 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/64</guid>
		<description><![CDATA[key words:  门面与代理,设计模式 这两组内容没有联系，只是今天在路上的时候突然一下子想到了，就放在一起说说吧 Facade与proxy大多数人应该很熟悉，也接触了不少，但是放在一起比较问他们有什么具体区别的时候好像一下子也说得很含糊。 Facade 意为门面，proxy意为代理,中文的解释也很通俗，但是有时候感觉Facade也有代理的味道，有人认为二者都属于proxy这个大概念，但是问题是他们总得有不同的用途吧，否则发明这两个词岂不是浪费? google了一些说法，下面这个说法比较到位: Facade: 用于隐藏调用的复杂性 proxy: 放在服务期端保护被访问的对象 我个人的理解是: 对于客户端掉用来说，Facade是一定可见的，proxy是不可见的 . 比如，一个报刊亭卖报纸，可能有人民日报，新华日报等多家送报纸给他们的人，但是我们直接到他的店面就可以取到我们想要的报纸，而不是买人民日报的时候到人民日报社去取，以此类推. 而proxy对我们是隐藏的，比如Jive论坛里的权限验证，我们发帖子的时候客户端是透明访问的，压根实际在服务端后台作了isAdmin和isGuest的判断 Facade仅仅是提供了你一个方便的 &#8220;门面&#8221;,你可以把它理解为超市，你只要到他那里就可以取到你想要的东西，但是他所调用的后台仍然可以根据策略开放给客户端，比如我们完全可以不去报刊亭买报纸，我们自己去人民日报社去取，但是这种做法显然在如今的现代化潮流下是没什么提倡的，现在更提倡分工. 对于proxy我们仍有一个误解，比如问你&#8221;中介公司是proxy吗？&#8221; 请思考一下 很多人认为中介公司是代理，因为我们生活中有时候就直接称中介公司为代理商或代理公司等，但是此代理非彼代理也!  为什么？ 参照我们上面所说的proxy的特征，proxy是隐藏的，难道我们联系代理公司的地址时他会说 : &#8220;打一枪换一个地方&#8221; 么?  显然不是，恰恰相反，中介公司事实上反而是我们java里的Facade模式,因为它是可见的. 好，关于facade 与proxy就说到这里，应该很清楚了. No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>key words:   门面与代理,设计模式</p>
<p>这两组内容没有联系，只是今天在路上的时候突然一下子想到了，就放在一起说说吧</p>
<p>Facade与proxy大多数人应该很熟悉，也接触了不少，但是放在一起比较问他们有什么具体区别的时候好像一下子也说得很含糊。<br />
Facade  意为门面，proxy意为代理,中文的解释也很通俗，但是有时候感觉Facade也有代理的味道，有人认为二者都属于proxy这个大概念，但是问题是他们总得有不同的用途吧，否则发明这两个词岂不是浪费?</p>
<p>google了一些说法，下面这个说法比较到位:</p>
<p>Facade:  用于<strong>隐藏</strong>调用的复杂性<br />
proxy: 放在服务期端<strong>保护</strong>被访问的对象</p>
<p>我个人的理解是:<br />
<font color="#0000ff">对于客户端掉用来说，Facade是一定可见的，proxy是不可见的 .</font></p>
<p>比如，一个报刊亭卖报纸，可能有人民日报，新华日报等多家送报纸给他们的人，但是我们直接到他的店面就可以取到我们想要的报纸，而不是买人民日报的时候到人民日报社去取，以此类推.<br />
而proxy对我们是隐藏的，比如Jive论坛里的权限验证，我们发帖子的时候客户端是透明访问的，压根实际在服务端后台作了isAdmin和isGuest的判断</p>
<p>Facade仅仅是提供了你一个方便的  &#8220;门面&#8221;,你可以把它理解为超市，你只要到他那里就可以取到你想要的东西，但是他所调用的后台仍然可以根据策略开放给客户端，比如我们完全可以不去报刊亭买报纸，我们自己去人民日报社去取，但是这种做法显然在如今的现代化潮流下是没什么提倡的，现在更提倡分工.</p>
<p>对于proxy我们仍有一个误解，比如问你&#8221;中介公司是proxy吗？&#8221; 请思考一下</p>
<p>很多人认为中介公司是代理，因为我们生活中有时候就直接称中介公司为代理商或代理公司等，但是此代理非彼代理也!  为什么？  参照我们上面所说的proxy的特征，proxy是隐藏的，难道我们联系代理公司的地址时他会说 : &#8220;打一枪换一个地方&#8221; 么?  显然不是，恰恰相反，<font color="#ff1493">中介公司事实上反而是我们java里的Facade模式</font>,因为它是可见的.</p>
<p>好，关于facade  与proxy就说到这里，应该很清楚了.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/10/10/%e8%b0%88%e8%b0%88-facade%e4%b8%8eproxy%e7%9a%84%e8%81%94%e7%b3%bb%e4%b8%8e%e5%8c%ba%e5%88%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于Facade的应用</title>
		<link>http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/</link>
		<comments>http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/#comments</comments>
		<pubDate>Mon, 09 Oct 2006 03:41:13 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/66</guid>
		<description><![CDATA[Facade用的非常的广了，以前刚接触的时候有个误解，总觉得Facade是简单的，而它后面的支撑服务是复杂的，对于客户来说却是简单的，现在来看，不完全对，或者说只是说对了一半，因为有时候恰恰是Facade是复杂的. 我们举一个例子，比如发送短信，我们一般就定义一个MessageService的服务类，里面只提供一个方法就行了，sendToUser(String phone,String content) 但是到了客户端的时候有了自己的 &#8220;方言&#8221;,比如它不是关心一个抽象的用户，它只知道向教师发送短信，或者向学生发送短信，或者向家长发送短信。 示例如下: 由图中可以看到，Facade的内容非常丰富，而支撑它的服务类却很简单，在开发过程中我们一般先实现通用的ServiceA,然后根据进一步的需求做一个面向具体复杂的Facade. 在Spring提供的sample里发现一个小技巧，就是Facade和ServiceA都是接口，然后提供一个实现二者的支撑类: public class PetStoreAnnotationImpl implements PetStoreFacade, OrderService { private AccountDao accountDao; private CategoryDao categoryDao; private ProductDao productDao; private ItemDao itemDao; private OrderDao orderDao; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- // Setter methods for dependency injection //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public void setCategoryDao(CategoryDao categoryDao) { this.categoryDao = categoryDao; } public void setProductDao(ProductDao productDao) { this.productDao = productDao; } public void setItemDao(ItemDao itemDao) { this.itemDao = itemDao; } public void setOrderDao(OrderDao orderDao) { this.orderDao = orderDao; } //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- // Operation methods, implementing the PetStoreFacade interface //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- public Account getAccount(String username) { return this.accountDao.getAccount(username); } public Account getAccount(String username, String password) { return this.accountDao.getAccount(username, password); } public void insertAccount(Account account) { this.accountDao.insertAccount(account); } public void updateAccount(Account account) { this.accountDao.updateAccount(account); } public List getUsernameList() { return this.accountDao.getUsernameList(); } public List getCategoryList() { return this.categoryDao.getCategoryList(); } public Category getCategory(String categoryId) { [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>Facade用的非常的广了，以前刚接触的时候有个误解，总觉得Facade是简单的，而它后面的支撑服务是复杂的，对于客户来说却是简单的，现在来看，不完全对，或者说只是说对了一半，因为有时候恰恰是Facade是复杂的.</p>
<p>我们举一个例子，比如发送短信，我们一般就定义一个MessageService的服务类，里面只提供一个方法就行了，sendToUser(String  phone,String content)<br />
但是到了客户端的时候有了自己的  &#8220;方言&#8221;,比如它不是关心一个抽象的用户，它只知道向教师发送短信，或者向学生发送短信，或者向家长发送短信。</p>
<p>示例如下:</p>
<p><a href="http://www.foxlog.org/wp-content/uploads/2007/07/facade.png" onclick="return false;" title="Direct link to file"><img src="http://www.foxlog.org/wp-content/uploads/2007/07/facade.thumbnail.png" alt="facade" height="132" width="152" /></a><br />
由图中可以看到，Facade的内容非常丰富，而支撑它的服务类却很简单，在开发过程中我们一般先实现通用的ServiceA,然后根据进一步的需求做一个面向具体复杂的Facade.</p>
<p>在Spring提供的sample里发现一个小技巧，就是Facade和ServiceA都是接口，然后提供一个实现二者的支撑类:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> PetStoreAnnotationImpl </span><span style="color: #0000ff">implements</span><span style="color: #000000"> PetStoreFacade, OrderService {</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> AccountDao accountDao;</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> CategoryDao categoryDao;</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> ProductDao productDao;</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> ItemDao itemDao;</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> OrderDao orderDao;</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> Setter methods for dependency injection<br />
</span><span style="color: #008000">//</span><span style="color: #008000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setAccountDao(AccountDao accountDao) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao </span><span style="color: #000000">=</span><span style="color: #000000"> accountDao;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setCategoryDao(CategoryDao categoryDao) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.categoryDao </span><span style="color: #000000">=</span><span style="color: #000000"> categoryDao;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setProductDao(ProductDao productDao) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.productDao </span><span style="color: #000000">=</span><span style="color: #000000"> productDao;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setItemDao(ItemDao itemDao) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.itemDao </span><span style="color: #000000">=</span><span style="color: #000000"> itemDao;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setOrderDao(OrderDao orderDao) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.orderDao </span><span style="color: #000000">=</span><span style="color: #000000"> orderDao;<br />
}</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> Operation methods, implementing the PetStoreFacade interface<br />
</span><span style="color: #008000">//</span><span style="color: #008000">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> Account getAccount(String username) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao.getAccount(username);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> Account getAccount(String username, String password) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao.getAccount(username, password);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> insertAccount(Account account) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao.insertAccount(account);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> updateAccount(Account account) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao.updateAccount(account);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getUsernameList() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.accountDao.getUsernameList();<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getCategoryList() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.categoryDao.getCategoryList();<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> Category getCategory(String categoryId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.categoryDao.getCategory(categoryId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getProductListByCategory(String categoryId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.productDao.getProductListByCategory(categoryId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List searchProductList(String keywords) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.productDao.searchProductList(keywords);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> Product getProduct(String productId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.productDao.getProduct(productId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getItemListByProduct(String productId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.itemDao.getItemListByProduct(productId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> Item getItem(String itemId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.itemDao.getItem(itemId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isItemInStock(String itemId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.itemDao.isItemInStock(itemId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> insertOrder(Order order) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.orderDao.insertOrder(order);<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.itemDao.updateQuantity(order);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> Order getOrder(</span><span style="color: #0000ff">int</span><span style="color: #000000"> orderId) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.orderDao.getOrder(orderId);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getOrdersByUsername(String username) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.orderDao.getOrdersByUsername(username);<br />
}</p>
<p>}</span></p>
<p>看起来似乎不错，不过仔细想想个人认为还是不是太好,总的感觉就是层次不清晰，因为很多时候Facade和Service之间是被服务与服务的关系，所以理当分开。  同时，这个类有点倾向于&#8221;万能类&#8221;了，能分还是分开好.这和我们以前提到的dao又背离过来了（以前我们提倡一个业务一个dao,现在觉得只用一个通用的dao更合适）,这个并不矛盾，具体问题具体看待.</p>
<p>欢迎各位拍砖.</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]设计模式之Visitor 访问者模式</title>
		<link>http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 28 Sep 2006 03:44:31 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/67</guid>
		<description><![CDATA[设计模式之Visitor 板桥里人 http://www.jdon.com 2002/05/05（转载请保留） 模式实战书籍《Java实用系统开发指南》 Visitor访问者模式定义 作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为. 为何使用Visitor? Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了.那么我们势必要用If来判断,如: Iterator iterator = collection.iterator() while (iterator.hasNext()) { Object o = iterator.next(); if (o instanceof Collection) messyPrintCollection((Collection)o); else if (o instanceof String) System.out.println(&#8220;&#8216;&#8221;+o.toString()+&#8221;&#8216;&#8221;); else if (o instanceof Float) System.out.println(o.toString()+&#8221;f&#8221;); else System.out.println(o.toString()); } 在上例中,我们使用了 instanceof来判断 o的类型. 很显然,这样做的缺点代码If else if 很繁琐.我们就可以使用Visitor模式解决它. 如何使用Visitor? 针对上例,定义接口叫Visitable,用来定义一个Accept操作,也就是说让Collection每个元素具备可访问性. 被访问者是我们Collection的每个元素Element,我们要为这些Element定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者,被访问者如果表示不欢迎,访问者就不能访问),取名为Visitable，也可取名为Element。 public interface Visitable [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">
<h3 align="center">设计模式之Visitor</h3>
<p align="center"><a href="http://www.jdon.com/aboutme.htm">板桥里人</a>  http://www.jdon.com 2002/05/05（转载请保留）</p>
<p align="center"><a href="http://www.jdon.com/mybook/index.htm" target="_blank"><strong>模式实战书籍《Java实用系统开发指南》</strong> </a></p>
<p><strong>Visitor访问者模式定义</strong><br />
作用于某个对象群中各个对象的操作.  它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.</p>
<p>在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作的行为.</p>
<p><strong>为何使用Visitor?</strong><br />
Java的Collection(包括Vector和Hashtable)是我们最经常使用的技术,可是Collection好象是个黑色大染缸,本来有各种鲜明类型特征的对象一旦放入后,再取出时,这些类型就消失了.那么我们势必要用If来判断,如:<br />
Iterator iterator = collection.iterator()<br />
while (iterator.hasNext())  {<br />
Object o = iterator.next();<br />
if (o instanceof Collection)<br />
messyPrintCollection((Collection)o);<br />
else if (o instanceof String)<br />
System.out.println(&#8220;&#8216;&#8221;+o.toString()+&#8221;&#8216;&#8221;);<br />
else if (o instanceof  Float)<br />
System.out.println(o.toString()+&#8221;f&#8221;);<br />
else<br />
System.out.println(o.toString());<br />
}<br />
在上例中,我们使用了 instanceof来判断 o的类型.</p>
<p>很显然,这样做的缺点代码If else if 很繁琐.我们就可以使用Visitor模式解决它.</p>
<p><strong>如何使用Visitor?</strong><br />
针对上例,定义接口叫Visitable,用来定义一个Accept操作,也就是说让Collection每个元素具备可访问性.</p>
<p>被访问者是我们Collection的每个元素Element,我们要为这些Element定义一个可以接受访问的接口(访问和被访问是互动的,只有访问者,被访问者如果表示不欢迎,访问者就不能访问),取名为Visitable，也可取名为Element。</p>
<table border="0" cellpadding="3" cellspacing="3" width="80%">
<tr>
<td bgcolor="#cccccc">public interface Visitable<br />
{<br />
public void  accept(Visitor visitor);<br />
}</td>
</tr>
</table>
<p>被访问的具体元素继承这个新的接口Visitable：</p>
<table border="0" cellpadding="3" cellspacing="3" width="80%">
<tr>
<td bgcolor="#cccccc">public class StringElement implements Visitable<br />
{<br />
private String  value;<br />
public StringElement(String string) {<br />
value =  string;<br />
}</p>
<p>public String getValue(){<br />
return value;<br />
}<br />
//定义accept的具体内容 这里是很简单的一句调用<br />
public void accept(Visitor visitor)  {<br />
visitor.visitString(this);<br />
}<br />
}</td>
</tr>
</table>
<p>上面是被访问者是字符串类型，下面再建立一个Float类型的：</p>
<table border="0" cellpadding="3" cellspacing="3" width="80%">
<tr>
<td bgcolor="#cccccc">public class FloatElement implements Visitable<br />
{<br />
private Float  value;<br />
public FloatElement(Float value) {<br />
this.value =  value;<br />
}</p>
<p>public Float getValue(){<br />
return value;<br />
}<br />
//定义accept的具体内容 这里是很简单的一句调用<br />
public void accept(Visitor visitor)  {<br />
visitor.visitFloat(this);<br />
}<br />
}</td>
</tr>
</table>
<p>我们设计一个接口visitor访问者，在这个接口中,有一些访问操作，这些访问操作是专门访问对象集合Collection中有可能的所有类，目前我们假定有三个行为：访问对象集合中的字符串类型；访问对象集合中的Float类型；访问对象集合中的对象集合类型。注意最后一个类型是集合嵌套，通过这个嵌套实现可以看出使用访问模式的一个优点。</p>
<p>接口visitor访问者如下：</p>
<table border="0" cellpadding="3" cellspacing="3" width="80%">
<tr>
<td bgcolor="#cccccc">public interface Visitor<br />
{</p>
<p>public void visitString(StringElement  stringE);<br />
public void visitFloat(FloatElement floatE);<br />
public void  visitCollection(Collection collection);</p>
<p>}</td>
</tr>
</table>
<p>访问者的实现:</p>
<table border="0" cellpadding="3" cellspacing="3" width="80%">
<tr>
<td bgcolor="#cccccc">public class ConcreteVisitor implements Visitor<br />
{<br />
//在本方法中,我们实现了对Collection的元素的成功访问<br />
public void visitCollection(Collection  collection) {<br />
Iterator iterator = collection.iterator()<br />
while  (iterator.hasNext()) {<br />
Object o = iterator.next();<br />
if (o  instanceof Visitable)<br />
((Visitable)o).accept(this);<br />
}<br />
｝</p>
<p>public void visitString(StringElement stringE) {<br />
System.out.println(&#8220;&#8216;&#8221;+stringE.getValue()+&#8221;&#8216;&#8221;);<br />
}<br />
public void  visitFloat(FloatElement floatE){<br />
System.out.println(floatE.getValue().toString()+&#8221;f&#8221;);<br />
}</p>
<p>}</td>
</tr>
</table>
<p>在上面的visitCollection我们实现了对Collection每个元素访问,只使用了一个判断语句,只要判断其是否可以访问.</p>
<p>StringElement只是一个实现，可以拓展为更多的实现，整个核心奥妙在accept方法中，在遍历Collection时，通过相应的accept方法调用具体类型的被访问者。这一步确定了被访问者类型，</p>
<p>如果是StringElement，而StringElement则回调访问者的visiteString方法，这一步实现了行为操作方法。</p>
<p>客户端代码：</p>
<table bgcolor="#cccccc" border="0" cellpadding="2" cellspacing="2" width="80%">
<tr>
<td>Visitor visitor = new ConcreteVisitor();</p>
<p>StringElement stringE = new  StringElement(&#8220;I am a String&#8221;);<br />
visitor.visitString(stringE);</p>
<p>Collection list = new ArrayList();<br />
list.add(new StringElement(&#8220;I am a  String1&#8243;));<br />
list.add(new StringElement(&#8220;I am a String2&#8243;));<br />
list.add(new  FloatElement(new Float(12)));<br />
list.add(new StringElement(&#8220;I am a String3&#8243;));<br />
visitor.visitCollection(list);</td>
</tr>
</table>
<p>客户端代码中的list对象集合中放置了多种数据类型，对对象集合中的访问不必象一开始那样，使用instance  of逐个判断，而是通过访问者模式巧妙实现了。</p>
<p>至此,我们完成了Visitor模式基本结构.</p>
<p><strong>使用Visitor模式的前提</strong><br />
使用访问者模式是对象群结构中(Collection) 中的对象类型很少改变。</p>
<p>在两个接口Visitor和Visitable中,确保Visitable很少变化,也就是说，确保不能老有新的Element元素类型加进来，可以变化的是访问者行为或操作，也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便.</p>
<p>如果对象集合中的对象集合经常有变化,  那么不但Visitor实现要变化，Visistable也要增加相应行为，GOF建议是,不如在这些对象类中直接逐个定义操作，无需使用访问者设计模式。</p>
<p>但是在Java中，Java的Reflect技术解决了这个问题，因此结合reflect反射机制，可以使得访问者模式适用范围更广了。</p>
<p>Reflect技术是在运行期间动态获取对象类型和方法的一种技术,具体实现参考Javaworld的<a href="http://www.javaworld.com/javaworld/javatips/jw-javatip98.html" target="_blank">英文原文</a>.</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DAO模式演变</title>
		<link>http://www.foxlog.org/2006/09/21/dao%e6%a8%a1%e5%bc%8f%e6%bc%94%e5%8f%98/</link>
		<comments>http://www.foxlog.org/2006/09/21/dao%e6%a8%a1%e5%bc%8f%e6%bc%94%e5%8f%98/#comments</comments>
		<pubDate>Thu, 21 Sep 2006 03:49:37 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/70</guid>
		<description><![CDATA[key words: DAO模式 今天在看一篇文章时提到了DAO，这个东西以前也经常接触，突然想回顾一下，于是打开Appfuse里看看dao模式（记忆中appfuse里就是很多的dao） 截图如下: 很清楚，左边的部分是基础模块，原意是想让右边的DAO和实现能够重用左边的，可是我找了半天也没看到需要重用左边的东西，因为在client调用的所有方法中都是明确的getUser或removeUser,就是没有getObject或者removeObject,那么不禁要问，左边的基础dao和它的实现还有什么意义呢？所以我的第一想法就是把左边的去掉得了，还好，果然有支持我想法的做法，打开springside,我们看到如下的结构: 截图2 &#160; 这里的做法更厉害，连interface也不要了，不过效果确实是很简洁，在bookmanager里完全重用了左边的基本方法 ： public Book get(Integer id) { return (Book) super.get(id); } public void save(Book book) { super.save(book); logger.info(&#8220;保存图书.图书详情:&#8220; + book.toString()); } public void remove(Integer id) { super.remove(id); logger.info(&#8220;删除图书.图书ID:&#8220; + id); } 这是一个更务实的做法，如果你的项目并不是那么那么的复杂完全可以这么做，当然要说其有什么缺点显然和没有了interface的天生属性决定了的，不可强求，若你对测试隔离面向接口以及你能想到的所有关于interface的好处，那就用你自己的方式吧。 现在我在想一个问题，难道appfuse里的继承的基本关于object的做法就没有地方可用了么？ 其时正好碰到java视线这一篇文章有点相关，你可以参考一下: 用DAO模式有什么好处？ ps: 以前是一个基本的dao,然后n个业务dao继承于这个基本dao,现在提供一个通用dao,每个要用到的地方直接继承用就是了，更务实了! 不过，有一个小小的瑕疵，就是对于service中类似getUserByName或者getPeopleByEmail方法中需要提供给dao一个sql语句，从mvc的角度看，在service中看到了db层，有点不雅，不过综合来看这个还是可以或略，不要专牛角尖嘛  Related posts:workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]log4j配置用Digester解析xml到bean


Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li><li><a href='http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/' rel='bookmark' title='Permanent Link: log4j配置'>log4j配置</a></li><li><a href='http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/' rel='bookmark' title='Permanent Link: 用Digester解析xml到bean'>用Digester解析xml到bean</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words:  DAO模式</p>
<p>今天在看一篇文章时提到了DAO，这个东西以前也经常接触，突然想回顾一下，于是打开Appfuse里看看dao模式（记忆中appfuse里就是很多的dao）</p>
<p>截图如下:<br />
<a href="http://www.foxlog.org/wp-content/uploads/2007/07/appfusedao.png" title="appfusedao.png"><img src="http://www.foxlog.org/wp-content/uploads/2007/07/appfusedao.png" alt="appfusedao.png" /></a></p>
<p>很清楚，左边的部分是基础模块，原意是想让右边的DAO和实现能够重用左边的，可是我找了半天也没看到需要重用左边的东西，因为在client调用的所有方法中都是明确的getUser或removeUser,就是没有getObject或者removeObject,那么不禁要问，左边的基础dao和它的实现还有什么意义呢？所以我的第一想法就是把左边的去掉得了，还好，果然有支持我想法的做法，打开springside,我们看到如下的结构:<br />
截图2</p>
<p class="postText">&nbsp;</p>
<p class="postText"><a href="http://www.foxlog.org/wp-content/uploads/2007/07/springside.png" title="springside.png"><img src="http://www.foxlog.org/wp-content/uploads/2007/07/springside.png" alt="springside.png" /></a><br />
这里的做法更厉害，连interface也不要了，不过效果确实是很简洁，在bookmanager里完全重用了左边的基本方法 ：</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> Book get(Integer id) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> (Book) </span><span style="color: #0000ff">super</span><span style="color: #000000">.get(id);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> save(Book book) {<br />
</span><span style="color: #0000ff">super</span><span style="color: #000000">.save(book);<br />
logger.info(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">保存图书.图书详情:</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> book.toString());<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> remove(Integer id) {<br />
</span><span style="color: #0000ff">super</span><span style="color: #000000">.remove(id);<br />
logger.info(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">删除图书.图书ID:</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> id);<br />
}</span><br />
这是一个更务实的做法，如果你的项目并不是那么那么的复杂完全可以这么做，当然要说其有什么缺点显然和没有了interface的天生属性决定了的，不可强求，若你对测试隔离面向接口以及你能想到的所有关于interface的好处，那就用你自己的方式吧。</p>
<p>现在我在想一个问题，难道appfuse里的继承的基本关于object的做法就没有地方可用了么？</p>
<hr size="2" width="100%" /> 其时正好碰到java视线这一篇文章有点相关，你可以参考一下:<br />
<a href="http://www.javaeye.com/topic/20216" target="_blank"><span style="font-weight: bold; font-size: 10pt; color: #006699">用DAO模式有什么好处？</span></a></p>
<hr size="2" width="100%" />
<font color="#ff0000">ps:<br />
以前是一个基本的dao,然后n个业务dao继承于这个基本dao,现在提供一个通用dao,每个要用到的地方直接继承用就是了，更务实了!<br />
不过，有一个小小的瑕疵，就是对于service中类似getUserByName或者getPeopleByEmail方法中需要提供给dao一个sql语句，从mvc的角度看，在service中看到了db层，有点不雅，不过综合来看这个还是可以或略，不要专牛角尖嘛   <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li><li><a href='http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/' rel='bookmark' title='Permanent Link: log4j配置'>log4j配置</a></li><li><a href='http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/' rel='bookmark' title='Permanent Link: 用Digester解析xml到bean'>用Digester解析xml到bean</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/21/dao%e6%a8%a1%e5%bc%8f%e6%bc%94%e5%8f%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]Java 学习方法浅谈</title>
		<link>http://www.foxlog.org/2006/09/20/ztjava-%e5%ad%a6%e4%b9%a0%e6%96%b9%e6%b3%95%e6%b5%85%e8%b0%88/</link>
		<comments>http://www.foxlog.org/2006/09/20/ztjava-%e5%ad%a6%e4%b9%a0%e6%96%b9%e6%b3%95%e6%b5%85%e8%b0%88/#comments</comments>
		<pubDate>Wed, 20 Sep 2006 03:59:07 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>
		<category><![CDATA[杂谈]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/77</guid>
		<description><![CDATA[转自 robin Java本身是一种设计的非常简单，非常精巧的语言，所以Java背后的原理也很简单，归结起来就是两点： 1、JVM的内存管理 理解了这一点，所有和对象相关的问题统统都能解决 2、JVM Class Loader 理解了这一点，所有和Java相关的配置问题，包括各种App Server的配置，应用的发布问题统统都能解决 就像张无忌学太极剑，本质就是一圈一圈的画圆，你要是懂得了太极剑的本质，那么太极剑就那么一招而已，本身是很容易学的，只是难度在于你要能够举一反三，化一式剑意为无穷无尽的剑招，这就需要一点悟性和不断的实践了；反过来说，如果学剑不学本质，光学剑招，你就是学会了1万招，碰到了第1万零1招，还是不会招架，败下阵来。 技术世界本来就是丰富多彩，企图统一标准，实际上也做不到，但是世界本质其实并不复杂。学习技术，特别是某种具体的软件工具的时候，应该学会迅速把握事物的本质，不要过多搅缠细节。软件工具应该为我所用，而不是我被工具所驾驭。当你具备了对整个J2EE架构的设计和实施的能力，你还会被具体的工具束缚吗？哪种工具适合你的架构，你就用什么，哪种不适合你，你就抛弃它，软件皆臣服于你的脚下，而不是你被什么软件牵着鼻子走，到了这种程度，你难道还害怕学习什么新的软件？ 我自己也在一直朝着这个方向努力，在我心中，设计软件，架构是第一位的，采用什么技术要为架构服务。如果我发现什么技术对我的架构来说很重要，那么我会花时间去学习，去钻研，就像我花时间去钻研ORM一样，如果我觉得什么技术对我的架构来说没有用，即使技术再火爆，我也不去碰它。 总之要学会抓住本质，驾驭技术，而不是被技术所驾驭。当你掌握了本质原理，其实学什么都很快，毕竟都是相通的，我先看JDO，后看 Hibernate，其实两者就很类似，所以学得很快，以后如果有工作需要，要我学习别的ORM，那我也不会觉得有什么困难的，一样手到拿来。 更有说服力的是Unix类的操作系统，那就更相似了，只要抓住了Unix最本质的几点，例如shell命令和编程，文件系统结构和配置，系统启动原理和过程，所有的Unix都是无师自通的。我自己会用Linux，FreeBSD，SCO Unix， Solaris，HP-UX 和 AIX等6种Unix，更体会到一通百通的道理。 拿刚出了光明顶密道的张无忌来说吧，(我很喜欢张无忌这个角色)，他也没有练过什么武功，但是他已经把天下武学之本质：九阳神功 + 乾坤大挪移学会了，所以不管什么功夫，他都是看一遍就会，马上为我所用，看了空性用了一遍龙爪手，就会用龙爪手来破对方；和昆仑派打了一架，就会用昆仑剑法和灭绝师太过招；七伤拳更是无师自通；太极拳也是看一遍就会。 总之，学习方法还是很重要，别被五花八门的技术给搞不清学习方向了。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText">转自 <a href="http://www.javaeye.com/topic/42">robin</a></p>
<p>Java本身是一种设计的非常简单，非常精巧的语言，所以Java背后的原理也很简单，归结起来就是两点：</p>
<p>1、JVM的内存管理</p>
<p>理解了这一点，所有和对象相关的问题统统都能解决</p>
<p>2、JVM Class Loader</p>
<p>理解了这一点，所有和Java相关的配置问题，包括各种App Server的配置，应用的发布问题统统都能解决</p>
<p>就像张无忌学太极剑，本质就是一圈一圈的画圆，你要是懂得了太极剑的本质，那么太极剑就那么一招而已，本身是很容易学的，只是难度在于你要能够举一反三，化一式剑意为无穷无尽的剑招，这就需要一点悟性和不断的实践了；反过来说，如果学剑不学本质，光学剑招，你就是学会了1万招，碰到了第1万零1招，还是不会招架，败下阵来。</p>
<p>技术世界本来就是丰富多彩，企图统一标准，实际上也做不到，但是世界本质其实并不复杂。学习技术，特别是某种具体的软件工具的时候，<strong>应该学会迅速把握事物的本质</strong>，不要过多搅缠细节。软件工具应该为我所用，而不是我被工具所驾驭。当你具备了对整个J2EE架构的设计和实施的能力，你还会被具体的工具束缚吗？哪种工具适合你的架构，你就用什么，哪种不适合你，你就抛弃它，软件皆臣服于你的脚下，而不是你被什么软件牵着鼻子走，到了这种程度，你难道还害怕学习什么新的软件？</p>
<p>我自己也在一直朝着这个方向努力，在我心中，<font color="#ff1493">设计软件，架构是第一位的，采用什么技术要为架构服务</font>。如果我发现什么技术对我的架构来说很重要，那么我会花时间去学习，去钻研，就像我花时间去钻研ORM一样，<font color="#0000ff">如果我觉得什么技术对我的架构来说没有用，即使技术再火爆，我也不去碰它</font>。</p>
<p>总之要学会抓住本质，驾驭技术，而不是被技术所驾驭。当你掌握了本质原理，其实学什么都很快，毕竟都是相通的，我先看JDO，后看  Hibernate，其实两者就很类似，所以学得很快，以后如果有工作需要，要我学习别的ORM，那我也不会觉得有什么困难的，一样手到拿来。</p>
<p>更有说服力的是Unix类的操作系统，那就更相似了，只要抓住了Unix最本质的几点，例如shell命令和编程，文件系统结构和配置，系统启动原理和过程，所有的Unix都是无师自通的。我自己会用Linux，FreeBSD，SCO  Unix， Solaris，HP-UX 和 AIX等6种Unix，更体会到一通百通的道理。</p>
<p>拿刚出了光明顶密道的张无忌来说吧，(我很喜欢张无忌这个角色)，他也没有练过什么武功，但是他已经把天下武学之本质：九阳神功 +  乾坤大挪移学会了，所以不管什么功夫，他都是看一遍就会，马上为我所用，看了空性用了一遍龙爪手，就会用龙爪手来破对方；和昆仑派打了一架，就会用昆仑剑法和灭绝师太过招；七伤拳更是无师自通；太极拳也是看一遍就会。</p>
<p>总之，学习方法还是很重要，别被五花八门的技术给搞不清学习方向了。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/20/ztjava-%e5%ad%a6%e4%b9%a0%e6%96%b9%e6%b3%95%e6%b5%85%e8%b0%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle分页的一个问题</title>
		<link>http://www.foxlog.org/2006/09/20/oracle%e5%88%86%e9%a1%b5%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.foxlog.org/2006/09/20/oracle%e5%88%86%e9%a1%b5%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Wed, 20 Sep 2006 03:57:25 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/76</guid>
		<description><![CDATA[key words :Oracle分页 视图 google了一下关于Oracle的分页方法，方法还不少，大多数效果差不多-有点恶心. 恶心也要作，不过后来就是大家都用得这种方式在我这里出现了新问题，奇怪的是怎么没有别人碰到? String condition = &#8220; teacher_id = &#8220; + userId + &#8220; and school_id=&#8220;+siteId; sql = &#8220; select * &#8220; + &#8220; from your_table where &#8220; + condition + &#8220; and rowid not in ( select rowid from your_table where&#8220; + condition + &#8220; and rownum &#60;= &#8220; + (pageIndex - 1) * Constants.PAGE_NUMS + &#8220;) &#8220; + &#8220; and rownum &#60;= &#8220; + Constants.PAGE_NUMS ; 现在的问题是我需要按照table的某个字段排序，于是改成如下: String condition = &#8220; teacher_id = &#8220; + userId + &#8220; and school_id=&#8220;+siteId; sql = &#8220; select * &#8220; + &#8220; from your_table where &#8220; + condition + &#8220; and rowid not in ( select rowid from your_table where&#8220; + condition + &#8220; and rownum &#60;= &#8220; + (pageIndex - 1) * Constants.PAGE_NUMS + &#8220;order by id desc) &#8220; + &#8220; and rownum &#60;= &#8220; + Constants.PAGE_NUMS + &#8221; order by id desc&#8220;; 这个sql有问题么? 答案是可能有问题，也可能没有问题，因为据说在8i的Oracle版本之前都不行，实际上也不尽然，在我的9i和10g我得到的是同样的错误 &#8220;missing right parenthesis&#8220;,还有一位兄弟估计是DBA建议我去metalink打一个patch,埃，动作太大了，不敢动。 问题还是要解决，试了下类似于select a.*,rownum r from (select * from table where &#8230;) a [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/12/ztoracle%e5%b8%b8%e7%94%a8%e6%95%b0%e6%8d%ae%e5%ad%97%e5%85%b8%e6%9f%a5%e8%af%a2/' rel='bookmark' title='Permanent Link: [zt]Oracle常用数据字典查询'>[zt]Oracle常用数据字典查询</a></li><li><a href='http://www.foxlog.org/2006/05/08/%e5%88%86%e9%a1%b5%e7%bb%a7%e7%bb%ad%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e9%a1%b5%e5%92%8cpagebean%e7%9a%84%e6%94%b9%e8%bf%9b/' rel='bookmark' title='Permanent Link: 分页继续[数据库分页和PageBean的改进]'>分页继续[数据库分页和PageBean的改进]</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words :Oracle分页 视图</p>
<p>google了一下关于Oracle的分页方法，方法还不少，大多数效果差不多-有点恶心.  恶心也要作，不过后来就是大家都用得这种方式在我这里出现了新问题，奇怪的是怎么没有别人碰到?</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">String condition </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> teacher_id = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> userId </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and school_id=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">+</span><span style="color: #000000">siteId;<br />
sql </span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> select * </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> from your_table where </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rowid not in ( select rowid from your_table  where</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> (pageIndex </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) </span><span style="color: #000000">*</span><span style="color: #000000"> Constants.PAGE_NUMS </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">) </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> Constants.PAGE_NUMS  ;</span><br />
现在的问题是我需要按照table的某个字段排序，于是改成如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">String condition </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> teacher_id = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> userId </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and school_id=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">+</span><span style="color: #000000">siteId;<br />
sql </span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> select * </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> from your_table where </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rowid not in ( select rowid from your_table where</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> (pageIndex </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) </span><span style="color: #000000">*</span><span style="color: #000000"> Constants.PAGE_NUMS </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"><font color="#ff1493">order by id desc</font>) </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> Constants.PAGE_NUMS + &#8221; <font color="#ff1493">order by  id  desc</font>&#8220;;</span><br />
这个sql有问题么?<br />
答案是可能有问题，也可能没有问题，因为据说在8i的Oracle版本之前都不行，实际上也不尽然，在我的9i和10g我得到的是同样的错误  &#8220;<strong>missing right  parenthesis</strong>&#8220;,还有一位兄弟估计是DBA建议我去metalink打一个patch,埃，动作太大了，不敢动。</p>
<p>问题还是要解决，试了下类似于select  a.*,rownum r from (select * from table where &#8230;) a where rownum &lt; 10  等的方法，效果一样，就是不能加嵌套的order  by<br />
最后，用视图的方法间接解决问题，因为我要解决的问题实际就是按某个字段排序，那么在视图里先对table进行排序，再在视图的基础上作操作就OK了.</p>
<p>另，还有一种不错的实现方法，即用OracleCachedRowSet,分页也比较简单，有点类似于hibernate,由于时间关系没有时间去看，感兴趣的朋友可以看一下.</p>
<p>BTW:  对于视图可能rowid有问题，可以改成视图的某个主键替换</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String condition </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> teacher_id = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> userId </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and school_id=</span><span style="color: #000000">&#8220;</span><span style="color: #000000">+</span><span style="color: #000000">siteId;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />sql </span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> select * </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> from your_table where </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and <strong>id</strong> not in ( select <strong>id</strong> from your_table where</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> condition </span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> (pageIndex </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) </span><span style="color: #000000">*</span><span style="color: #000000"> Constants.PAGE_NUMS </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">order by id desc) </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" />    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> and rownum &lt;= </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> Constants.PAGE_NUMS </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> order by id desc</span><span style="color: #000000">&#8220;</span><span style="color: #000000">;</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/12/ztoracle%e5%b8%b8%e7%94%a8%e6%95%b0%e6%8d%ae%e5%ad%97%e5%85%b8%e6%9f%a5%e8%af%a2/' rel='bookmark' title='Permanent Link: [zt]Oracle常用数据字典查询'>[zt]Oracle常用数据字典查询</a></li><li><a href='http://www.foxlog.org/2006/05/08/%e5%88%86%e9%a1%b5%e7%bb%a7%e7%bb%ad%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e9%a1%b5%e5%92%8cpagebean%e7%9a%84%e6%94%b9%e8%bf%9b/' rel='bookmark' title='Permanent Link: 分页继续[数据库分页和PageBean的改进]'>分页继续[数据库分页和PageBean的改进]</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/20/oracle%e5%88%86%e9%a1%b5%e7%9a%84%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]领域相关的模型里面需要3种对象</title>
		<link>http://www.foxlog.org/2006/09/19/zt%e9%a2%86%e5%9f%9f%e7%9b%b8%e5%85%b3%e7%9a%84%e6%a8%a1%e5%9e%8b%e9%87%8c%e9%9d%a2%e9%9c%80%e8%a6%813%e7%a7%8d%e5%af%b9%e8%b1%a1/</link>
		<comments>http://www.foxlog.org/2006/09/19/zt%e9%a2%86%e5%9f%9f%e7%9b%b8%e5%85%b3%e7%9a%84%e6%a8%a1%e5%9e%8b%e9%87%8c%e9%9d%a2%e9%9c%80%e8%a6%813%e7%a7%8d%e5%af%b9%e8%b1%a1/#comments</comments>
		<pubDate>Tue, 19 Sep 2006 04:00:13 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/78</guid>
		<description><![CDATA[key words :  模型，vo,po &#160; 转自portian 基本上一个应用程序里面的领域相关的模型里面需要3种对象： 1。值对象(Value Object)，没有身份，内容表示一切，譬如我和weihello都去银行里面存取100大洋，那这个100RMB是一个值对象 2。实体对象（Entity)，需要持久，不是按照内容，而是按照它的身份来区分，也就是说即使内容完全一样，也不是同一个对象。这个身份在内存里面是它的实例地址，在数据库里面是关键字，最常见的就是OID.这个实体对象并不是纯数据，它处理本身的实体模型，例如Accout，它的 withDraw,它的子Account等等，它也处理自己和其他实体对象之间的关系，例如订单里面的订单行，都是应该在这个Account里面实现的，而不应该有一个什么控制类。在一个Web应用程序里面，涉及到对象关系的一般只需要一个（或几个）DTOFactory负责所有对象的DTO和 Entity之间的组装和拆份，不需要专门的管理，这一部分也是和数据建模最相近的地方。 3。服务对象(Service)，这是为我们提供服务的类，譬如银行里面服务员，她帮助我们把钱从一个账户转到另外一个账户，并记录相应的交易。 对象的作用是对它自己的内部状态负责，如果它需要存取很多其它对象的状态进行运算，那叫做特性忌妒，是要重构的。应该把这些代码移到那个持有这些状态的类里面 辨别一些名词： 1。VO：实际上很模糊，通常指ValueObject和ViewObject 2. ViewObject，界面展现需要的对象，如Struts的FormBean 3。Value Object，早期被作为ValueObject和Transfer Object的总称。实际上Value Object的真正意义在于它的内容，而不是身份 4。Transfer Object：数据传输对象，在应用程序不同层次之间传书对象，在一个分布式应用程序中，通常可以提高整体的性能 5。PO：也许就是Persistent Object，基本上就是Entity了 在不同的体系结构和实现方式里面，这些对象有可能重复，也有可能不重叠。如果你要做一个对所有的体系都能够方便移植的框架，那么每一种对象都需要严格区分。例如JDO的PO不能作为TO，应为它不能脱离PM，譬如你可以选择用ViewObject（如Struts的FOrmBean)直接作为 TO，但在tapestry和Webwork里面就不合适了。但在很多时候，能够方便实用是最重要的，不要过度设计就是了。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText">key words :  模型，vo,po</p>
<p class="postText">&nbsp;</p>
<p class="postText">转自<a href="http://www.javaeye.com/topic/1464?page=5">portian</a></p>
<p>基本上一个应用程序里面的领域相关的模型里面需要3种对象：<br />
1。值对象(Value Object)，<font color="#0000ff">没有身份，内容表示一切</font>，譬如我和weihello都去银行里面存取100大洋，那这个100RMB是一个值对象</p>
<p>2。实体对象（Entity)，<font color="#0000ff">需要持久</font>，不是按照内容，<font color="#0000ff">而是按照它的身份来区分</font>，也就是说即使内容完全一样，也不是同一个对象。这个身份在内存里面是它的实例地址，在数据库里面是关键字，最常见的就是OID.这个实体对象并不是纯数据，它处理本身的实体模型，例如Accout，它的  withDraw,它的子Account等等，<font color="#0000ff">它也处理自己和其他实体对象之间的关系，例如订单里面的订单行，都是应该在这个Account里面实现的，而不应该有一个什么控制类</font>。在一个Web应用程序里面，涉及到对象关系的一般只需要一个（或几个）DTOFactory负责所有对象的DTO和  Entity之间的组装和拆份，不需要专门的管理，这一部分也是和数据建模最相近的地方。</p>
<p>3。服务对象(Service)，这是为我们提供服务的类，譬如银行里面服务员，她帮助我们把钱从一个账户转到另外一个账户，并记录相应的交易。</p>
<p>对象的作用是对它自己的内部状态负责，如果它需要存取很多其它对象的状态进行运算，那叫做特性忌妒，是要重构的。应该把这些代码移到那个持有这些状态的类里面</p>
<hr size="2" width="100%" />
辨别一些名词：<br />
1。VO：实际上很模糊，通常指ValueObject和ViewObject<br />
2.  ViewObject，界面展现需要的对象，如Struts的FormBean<br />
3。Value  Object，早期被作为ValueObject和Transfer Object的总称。实际上Value Object的真正意义在于它的内容，而不是身份<br />
4。Transfer Object：数据传输对象，在应用程序不同层次之间传书对象，在一个分布式应用程序中，通常可以提高整体的性能<br />
5。PO：也许就是Persistent Object，基本上就是Entity了<br />
在不同的体系结构和实现方式里面，这些对象有可能重复，也有可能不重叠。如果你要做一个对所有的体系都能够方便移植的框架，那么每一种对象都需要严格区分。例如JDO的PO不能作为TO，应为它不能脱离PM，譬如你可以选择用ViewObject（如Struts的FOrmBean)直接作为  TO，但在tapestry和Webwork里面就不合适了。但在很多时候，能够方便实用是最重要的，不要过度设计就是了。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/19/zt%e9%a2%86%e5%9f%9f%e7%9b%b8%e5%85%b3%e7%9a%84%e6%a8%a1%e5%9e%8b%e9%87%8c%e9%9d%a2%e9%9c%80%e8%a6%813%e7%a7%8d%e5%af%b9%e8%b1%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]关于Cookie跨域操作遇到的问题及解决方法</title>
		<link>http://www.foxlog.org/2006/09/18/zt%e5%85%b3%e4%ba%8ecookie%e8%b7%a8%e5%9f%9f%e6%93%8d%e4%bd%9c%e9%81%87%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/</link>
		<comments>http://www.foxlog.org/2006/09/18/zt%e5%85%b3%e4%ba%8ecookie%e8%b7%a8%e5%9f%9f%e6%93%8d%e4%bd%9c%e9%81%87%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Mon, 18 Sep 2006 04:03:50 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/80</guid>
		<description><![CDATA[注:关于跨域登陆cookie的问题在网上搜索了一下，没看到有java下的示例，这个asp的也可以参照一下，有空再在java下测一下. key words:单点登陆 SSO 跨域cookie 摘要：当你有一个Cookie组（或叫Cookie字典）使用Domain属性指定域名之后，当你在对该组的成员进行修改或新增的时候，一定要在操作之后加上Resonse.Cookies(CookieName).Domain属性。如果没有必要，请不要修改已设置Domain的Cookie组. 关键字： 正文： Cookie跨域操作看来是个简单的问题,因为只要指定Domain属性为指定网站的根域名就可以了.但是笔者在实际使用过程中却遇到了一些问题，的确值得注意. 2、如果没有必要，请不要修改已设置Domain的Cookie组，直接使用Response.Cookies(&#8220;CookieText&#8221;) = CookieValue 来创建一个新的Cookie。 Related posts:


Related posts:<ol><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText"><span style="font-weight: bold">注:关于跨域登陆cookie的问题在网上搜索了一下，没看到有java下的示例，这个asp的也可以参照一下，有空再在java下测一下.</p>
<p>key  words:单点登陆 SSO  跨域cookie</p>
<p></span>摘要：<strong>当你有一个Cookie组（或叫Cookie字典）使用Domain属性指定域名之后，当你在对该组的成员进行修改或新增的时候，一定要在操作之后加上Resonse.Cookies(CookieName).Domain属性。如果没有必要，请不要修改已设置Domain的Cookie组.</strong><br />
关键字：<br />
正文：<br />
Cookie跨域操作看来是个简单的问题,因为只要指定Domain属性为指定网站的根域名就可以了.但是笔者在实际使用过程中却遇到了一些问题，的确值得注意.</p>
<p'>  　　</p'></p>
<p class="postText">
<p'></p'>
<p'>cookie在www主域名下创建，并写入Domain属性，</p'></p>
<p class="postText">
<p'>如：(为方便调试以下代码皆为asp代码)</p'>
<p'>  　　Write.asp</p'>
<p'>  &lt;%<br />
Response.Cookies(CookieName)(&#8220;UserName&#8221;) = &#8221;SunBird&#8221;<br />
Response.Cookies(CookieName)(&#8220;Password&#8221;) = &#8221;xyz1234&#8243;<br />
Response.Cookies(CookieName).Domain = &#8221;xxxx.com&#8221;<br />
%&gt;</p'>
<p'>  　　上面文件放在www主域名下，同时在同目录下放置一个读取cookie的Read.asp</p'>
<p'> 　　Read.asp</p'>
<p'>  &lt;%<br />
Response.Write Request.Cookies(CookieName)(&#8220;UserName&#8221;)<br />
Response.Write Request.Cookies(CookieName)(&#8220;Password&#8221;)<br />
%&gt;</p'>
<p'>  　　再放一个Read.asp文件到另外一个子域名站点里，代码同上。最后我们再做一个清除cookie的Clear.asp放在主域名下</p'>
<p'>  　　Clear.asp</p'>
<p'>  &lt;%<br />
Response.Cookies(CookieName)(&#8220;UserName&#8221;) = &#8221;"<br />
Response.Cookies(CookieName)(&#8220;Password&#8221;) = &#8221;"<br />
Response.Cookies(CookieName).Domain = &#8221;xxxx.com&#8221;<br />
%&gt;</p'>
<p'>  　　</p'></p>
<p class="postText">
<p'>现在可以通过下面的执行顺序来测试，Write.asp&#8211;&gt;主域名的Read.asp&#8211;&gt;子域名的Read.asp 所有  Read.asp页面都可以读取到Write.asp创建的cookie的值，然后再运行Clear.asp进行清除，一切都Ok，看上去没有什么问题。</p'>
<p'>  　　但是把这种方法运用到实际的站点时却出现问题了。</p'>
<p'> 　　问题描述：</p'>
<p'>  　　第一次登录一切ok，所有子域名都可以访问到主域名存储的cookie，但是，一旦退出之后，子域名的cookie被清除了，但是主域名的  cookie仍然保留着，强行清除主域名的cookie之后，无论怎样登录主域名下都无法保存cookie了，除非关掉浏览器重新打开。</p'>
<p'>  　　经过多次尝试之后，无意中发现问题所在，以下是测试经过。</p'>
<p'> 　　创建一个Write2.asp的页面放在主域名下</p'>
<p'>  &lt;%<br />
Response.Cookies(CookieName)(&#8220;TEST_COOKIE&#8221;) = &#8221;TEST_COOKIE&#8221;<br />
%&gt;</p'>
<p'>  　　</p'></p>
<p class="postText">
<p'>第一步：关闭浏览器后，按以下顺序执行，Write.asp&#8211;&gt;主域名的Read.asp&#8211;&gt;子域名的Read.asp 到这里所有Read.asp读取正常。</p'>
<p'>  　　</p'></p>
<p class="postText">
<p'>第二步：Clear.asp&#8211;&gt;主域名的Read.asp&#8211;&gt;子域名的Read.asp 到这里清除操作是成功的。</p'>
<p'> 第三步：Write.asp&#8211;&gt; Write2.asp &#8211;&gt; 主域名Read.asp &#8211;&gt; 子域名Read.asp 到这里两个Read.asp都可以读取到cookie的值。</p'>
<p'>  　　</p'></p>
<p class="postText">
<p'>第四步：重新执行第二步，发现主域名Read.asp仍然输出了值，而子域名下的Read.asp的值已经被清空了。</p'>
<p'>  　　根据以上测试总结以下几点再跨域使用cookie时需要注意的地方</p'>
<p'>  　　1、当你有一个Cookie组（或叫Cookie字典）使用Domain属性指定域名之后，当你在对该组的成员进行修改或新增的时候，一定要在操作之后加上Resonse.Cookies(CookieName).Domain属性。</p'></p>
<p class="postText">2、如果没有必要，请不要修改已设置Domain的Cookie组，直接使用Response.Cookies(&#8220;CookieText&#8221;) = CookieValue 来创建一个新的Cookie。</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/18/zt%e5%85%b3%e4%ba%8ecookie%e8%b7%a8%e5%9f%9f%e6%93%8d%e4%bd%9c%e9%81%87%e5%88%b0%e7%9a%84%e9%97%ae%e9%a2%98%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]做设计的步骤</title>
		<link>http://www.foxlog.org/2006/09/16/zt%e5%81%9a%e8%ae%be%e8%ae%a1%e7%9a%84%e6%ad%a5%e9%aa%a4/</link>
		<comments>http://www.foxlog.org/2006/09/16/zt%e5%81%9a%e8%ae%be%e8%ae%a1%e7%9a%84%e6%ad%a5%e9%aa%a4/#comments</comments>
		<pubDate>Sat, 16 Sep 2006 04:02:07 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/79</guid>
		<description><![CDATA[key words: 如何做设计 设计步骤 转自robin 一。需求分析(抽象Use case + 分析Use case之间的关系) 分析软件需求，以用户的角度来使用软件，找出发生的scenerio，抽象成为一个一个Use Case，分析出Use Case之间的关系，这一步是非常重要的，这一步做好了，设计就成功了一半。Use Case的抽象有一些可以遵循的原则，这里不详细谈。 然后用语言描述每一个Use Case，描述用户使用一个Use Case发生的主事件流以及异常流。 这样就完成了需求分析阶段。 二。概要设计(找出实体 + 分析实体类之间的关系 + 提取控制类 + 画序列图) 接下来做概要设计，针对每个Use Case，读Use Case的描述，看事件流，找出所有的实体类，这也有一些可以遵循的原则，例如找出所有的名词，画表格排除等等方法。 然后分析实体类之间的关系，是包含，聚合还是依赖，是1：1，还是1：n，还是其他&#8230;.，根据这些关系，就可以得出实体类和别的实体类想关联的属性，然后再找出每个实体类本身重要的属性。 然后再次分析Use Case的事件流，一方面check实体类的设计是否合理，另一方面你可以找出动词，分析对实体类的控制逻辑，这样就可以可以设计出业务控制类，一般你可以一个实体类一个控制类，也可以业务逻辑相关的实体类由一个Facade Session Bean(非EJB含义)来统一控制，这里面的控制类的颗粒度就由你自己来掌握了。一般来说先可以设计一些细颗粒度的控制类，然后再按照模块，用粗粒度封装细颗粒度的控制类，提供给Web层一个Facade。 然后你可以画序列图，就是用序列图来表达事件流，在这个过程中，你需要不断回到类图，给控制类添加方法，而序列图就是控制类的方法调用。 至此，你已经在Rose里面完成了概要设计，当然你不可能一次设计完善，会有很多次迭代，因此你不能一开始把类设计的太详细，只抓住主要的属性和方法，特别需要注意的是，是抽象的设计，不要用具体的编程语言来表达类。 三。实施(结合xdoclet和Schema工具自动生成代码) 然后你就可以抛开Rose了，转到Eclipse+Togehter里面，根据那些类，规划一下package层次，然后在Together里面进行类的详细设计，所有需要的属性一一写上，当然你还是不可能一下把所有的属性方法写全，不过没有关系，把重要的写好就行了。 然后类框架已经生成好了，给所有的实体类加上xdoclet，然后生成hbm，然后用Hibernate的ExportScheme生成DDL，运行一遍自动创建好所有的表。这样所有的实体相关类全部做好了。 你现在就集中精力把控制类那些方法里面的代码填写上就OK了，在这个过程，你会发现有些实体类缺属性，没有关系，加上属性，然后写好xdoclet，运行一遍，自动生成hbm，自动创建好表，然后继续写你的方法，也有可能你发现控制类缺方法，那么就加上。 基本上实体类就是getter/setter，和少量的实体相关方法，所有的控制逻辑都写在控制类里面。 最后你的软件就基本写好了，用Eclipse生成好一堆你的testCase运行测试，反复修改，除bug。 看看使用OOAD的设计思路，是多么的爽的事情阿！你只需要把精力放到Use Case的抽象，实体类的关系总结，控制类的归纳。而当你使用Eclipse＋Together之后，你所需要写的代码只不过是控制类的方法实现代码，其他的都已经生成好了。另外可能需要写少量工具类。 No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>key words: 如何做设计 设计步骤<br />
转自robin</p>
<p>一。需求分析(抽象Use case + 分析Use case之间的关系)</p>
<p>分析软件需求，以用户的角度来使用软件，找出发生的scenerio，抽象成为一个一个Use Case，分析出Use Case之间的关系，这一步是非常重要的，这一步做好了，设计就成功了一半。Use Case的抽象有一些可以遵循的原则，这里不详细谈。</p>
<p>然后用语言描述每一个Use Case，描述用户使用一个Use Case发生的主事件流以及异常流。</p>
<p>这样就完成了需求分析阶段。</p>
<p>二。概要设计(找出实体 + 分析实体类之间的关系 + 提取控制类 + 画序列图)</p>
<p>接下来做概要设计，针对每个Use Case，读Use Case的描述，看事件流，找出所有的实体类，这也有一些可以遵循的原则，例如找出所有的名词，画表格排除等等方法。</p>
<p>然后分析实体类之间的关系，是包含，聚合还是依赖，是1：1，还是1：n，还是其他&#8230;.，根据这些关系，就可以得出实体类和别的实体类想关联的属性，然后再找出每个实体类本身重要的属性。</p>
<p>然后再次分析Use Case的事件流，一方面check实体类的设计是否合理，另一方面你可以找出动词，分析对实体类的控制逻辑，这样就可以可以设计出业务控制类，一般你可以一个实体类一个控制类，也可以业务逻辑相关的实体类由一个Facade Session Bean(非EJB含义)来统一控制，这里面的控制类的颗粒度就由你自己来掌握了。一般来说先可以设计一些细颗粒度的控制类，然后再按照模块，用粗粒度封装细颗粒度的控制类，提供给Web层一个Facade。</p>
<p>然后你可以画序列图，就是用序列图来表达事件流，在这个过程中，你需要不断回到类图，给控制类添加方法，而序列图就是控制类的方法调用。</p>
<p>至此，你已经在Rose里面完成了概要设计，当然你不可能一次设计完善，会有很多次迭代，因此你不能一开始把类设计的太详细，只抓住主要的属性和方法，特别需要注意的是，是抽象的设计，不要用具体的编程语言来表达类。</p>
<p>三。实施(结合xdoclet和Schema工具自动生成代码)</p>
<p>然后你就可以抛开Rose了，转到Eclipse+Togehter里面，根据那些类，规划一下package层次，然后在Together里面进行类的详细设计，所有需要的属性一一写上，当然你还是不可能一下把所有的属性方法写全，不过没有关系，把重要的写好就行了。</p>
<p>然后类框架已经生成好了，给所有的实体类加上xdoclet，然后生成hbm，然后用Hibernate的ExportScheme生成DDL，运行一遍自动创建好所有的表。这样所有的实体相关类全部做好了。</p>
<p>你现在就集中精力把控制类那些方法里面的代码填写上就OK了，在这个过程，你会发现有些实体类缺属性，没有关系，加上属性，然后写好xdoclet，运行一遍，自动生成hbm，自动创建好表，然后继续写你的方法，也有可能你发现控制类缺方法，那么就加上。</p>
<p>基本上实体类就是getter/setter，和少量的实体相关方法，所有的控制逻辑都写在控制类里面。</p>
<p>最后你的软件就基本写好了，用Eclipse生成好一堆你的testCase运行测试，反复修改，除bug。</p>
<p>看看使用OOAD的设计思路，是多么的爽的事情阿！你只需要把精力放到Use Case的抽象，实体类的关系总结，控制类的归纳。而当你使用Eclipse＋Together之后，你所需要写的代码只不过是控制类的方法实现代码，其他的都已经生成好了。另外可能需要写少量工具类。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/16/zt%e5%81%9a%e8%ae%be%e8%ae%a1%e7%9a%84%e6%ad%a5%e9%aa%a4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]从工作流状态机实践中总结状态模式使用心得</title>
		<link>http://www.foxlog.org/2006/09/09/zt%e4%bb%8e%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%8a%b6%e6%80%81%e6%9c%ba%e5%ae%9e%e8%b7%b5%e4%b8%ad%e6%80%bb%e7%bb%93%e7%8a%b6%e6%80%81%e6%a8%a1%e5%bc%8f%e4%bd%bf%e7%94%a8%e5%bf%83%e5%be%97/</link>
		<comments>http://www.foxlog.org/2006/09/09/zt%e4%bb%8e%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%8a%b6%e6%80%81%e6%9c%ba%e5%ae%9e%e8%b7%b5%e4%b8%ad%e6%80%bb%e7%bb%93%e7%8a%b6%e6%80%81%e6%a8%a1%e5%bc%8f%e4%bd%bf%e7%94%a8%e5%bf%83%e5%be%97/#comments</comments>
		<pubDate>Sat, 09 Sep 2006 04:08:21 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/82</guid>
		<description><![CDATA[从工作流状态机实践中总结状态模式使用心得 banq http://www.jdon.com Dec 7, 2003 12:10 AM 回复 状态模式好像是很简单的模式，正因为状态好像是个简单的对象，想复杂化实现设计模式就不是容易，误用情况很多。 我个人曾经设计过一个大型游戏系统的游戏状态机，游戏状态可以说是游戏设计的主要架构，但是由于系统过分复杂 和时间仓促，并没有真正实现状态模式。 目前在实现一个电子政务项目中，需要进行流程状态变化，在电子政务设计中，我发现，如果一开始完全按照工作流 规范开发，难度很大，它和具体项目实践结合无法把握，而且工作流规范现在有wfmc，还有bpml，选择也比较难。因 此，我决定走自创的中间道路。 因为，我需要做一个状态机API，或者说状态机框架，供具体系统调用：类如公文流转应用或信息发报送应用等。 好的状态模式必须做到两点： 1. 状态变化必须从外界其它逻辑划分出来。 2. 状态必须可方便拓展，对其它代码影响非常小。 要做到这两点，必须先明确状态变化机制，状态变化实际是由Event事件驱动的，可以认为是Event-condition-State， 在MVC模式一般是Event-condition-Action实现。状态模式需要封装的是Event-condition-State中的condition-State 部分。 清晰理解状态和流程的关系也非常重要，因为状态不是孤立的，可以说和流程是点和线的关系，状态从一个方面说明 了流程，流程是随时间而改变，状态是截取流程某个时间片。因此，必须明白使用状态模式实现状态机实际是为了更 好地表达和说明流程。 状态和流程以及事件的关系如下： &#124;Event ___currentState__&#124;______newState___ 图中表示了是事件改变了流程的状态，在业务逻辑中，经常发生的是事件，如果不使用状态模式，需要在很多业务逻 辑处实现事件到状态判定和转换，这有很多危险性。 最大的危险是系统没有一个一抓就灵的主体结构，以那个游戏系统为例，在没有状态模式对状态提炼的情况下，状态 改变由每个程序员想当然实现，导致每个程序员开发的功能在整合时就无法调试，因为这个程序员可能不知道那个程 序员的代码在什么运行条件下改变了游戏状态，结果导致自己的代码无法运行。 这种现象实际上拒绝了项目管理的协作性，大大地拖延项目进度（程序员之间要反复商量讨论对方代码设计）。从这 一点也说明，一个好的架构设计是一个项目快速成功完成的基础技术保证，没有这个技术基础，再先进的项目管理手 段也是没有效率的，或者是笨拙的。 状态模式对于很多系统来说，确实是架构组成一个重要部分。 下面继续讨论如何实现一个好的状态模式，为了实现好的状态模式，必须在状态模式中封装下面两个部分： 1. 状态转换规则（行为） 2. 状态属性（属性） 状态转换行为有两种划分标准： 1. run和next两个行为，run是当前状态运行行为，next是指在Event参与下，几种可能转向的下一个状态。 2. stateEnter和stateExit， 状态进入和状态退出。 如果用进入一个个房间来表示状态流程的话， 第一种分析是只重视着“在房间里”和“如何转入下一个房间”，这两种行 为一旦确定，可以被反复使用，进而一个流程的状态切换可以全部表达出来。 第二中分析方法有所区别，只重视进入房间和离开房间这个两个行为，同样，这种模型也可以被反复利用在其它房间， 一个流程的状态切换也可以全部表达出来。 [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p class="postText">
<h3 align="center">从工作流状态机实践中总结状态模式使用心得</h3>
<p align="center"><a href="http://www.jdon.com/jive/profile.jsp?user=2" title="彭晨阳(网名: 板桥里人)"><strong>banq</strong>  </a>http://www.jdon.com Dec 7, 2003 12:10 AM <a href="http://www.jdon.com/jive/post.jsp?forum=91&amp;thread=10981&amp;message=4743784&amp;reply=true"><img src="http://www.jdon.com/jive/images/reply.gif" alt="回复此消息" border="0" height="17" hspace="3" width="17" /></a><font size="-0"><a href="http://www.jdon.com/jive/post.jsp?forum=91&amp;thread=10981&amp;message=4743784&amp;reply=true" title="回复此消息">回复</a></font></p>
<p>状态模式好像是很简单的模式，正因为状态好像是个简单的对象，想复杂化实现设计模式就不是容易，误用情况很多。</p>
<p>我个人曾经设计过一个大型游戏系统的游戏状态机，游戏状态可以说是游戏设计的主要架构，但是由于系统过分复杂<br />
和时间仓促，并没有真正实现状态模式。</p>
<p>目前在实现一个电子政务项目中，需要进行流程状态变化，在电子政务设计中，我发现，如果一开始完全按照工作流<br />
规范开发，难度很大，它和具体项目实践结合无法把握，而且工作流规范现在有wfmc，还有bpml，选择也比较难。因<br />
此，我决定走自创的中间道路。</p>
<p>因为，我需要做一个状态机API，或者说状态机框架，供具体系统调用：类如公文流转应用或信息发报送应用等。</p>
<p>好的状态模式必须做到两点：<br />
1.  状态变化必须从外界其它逻辑划分出来。<br />
2.  状态必须可方便拓展，对其它代码影响非常小。</p>
<p>要做到这两点，必须先明确状态变化机制，状态变化实际是由Event事件驱动的，可以认为是Event-condition-State，<br />
在MVC模式一般是Event-condition-Action实现。状态模式需要封装的是Event-condition-State中的condition-State<br />
部分。</p>
<p>清晰理解状态和流程的关系也非常重要，因为状态不是孤立的，可以说和流程是点和线的关系，状态从一个方面说明<br />
了流程，流程是随时间而改变，状态是截取流程某个时间片。因此，必须明白使用状态模式实现状态机实际是为了更<br />
好地表达和说明流程。</p>
<p>状态和流程以及事件的关系如下：</p>
<p>|Event<br />
___currentState__|______newState___</p>
<p>图中表示了是事件改变了流程的状态，在业务逻辑中，经常发生的是事件，如果不使用状态模式，需要在很多业务逻<br />
辑处实现事件到状态判定和转换，这有很多危险性。</p>
<p>最大的危险是系统没有一个一抓就灵的主体结构，以那个游戏系统为例，在没有状态模式对状态提炼的情况下，状态<br />
改变由每个程序员想当然实现，导致每个程序员开发的功能在整合时就无法调试，因为这个程序员可能不知道那个程<br />
序员的代码在什么运行条件下改变了游戏状态，结果导致自己的代码无法运行。</p>
<p>这种现象实际上拒绝了项目管理的协作性，大大地拖延项目进度（程序员之间要反复商量讨论对方代码设计）。从这<br />
一点也说明，一个好的架构设计是一个项目快速成功完成的基础技术保证，没有这个技术基础，再先进的项目管理手<br />
段也是没有效率的，或者是笨拙的。</p>
<p>状态模式对于很多系统来说，确实是架构组成一个重要部分。</p>
<p>下面继续讨论如何实现一个好的状态模式，为了实现好的状态模式，必须在状态模式中封装下面两个部分：<br />
1.  状态转换规则（行为）<br />
2. 状态属性（属性）</p>
<p>状态转换行为有两种划分标准：<br />
1.  run和next两个行为，run是当前状态运行行为，next是指在Event参与下，几种可能转向的下一个状态。<br />
2.  stateEnter和stateExit， 状态进入和状态退出。</p>
<p>如果用进入一个个房间来表示状态流程的话，  第一种分析是只重视着“在房间里”和“如何转入下一个房间”，这两种行<br />
为一旦确定，可以被反复使用，进而一个流程的状态切换可以全部表达出来。</p>
<p>第二中分析方法有所区别，只重视进入房间和离开房间这个两个行为，同样，这种模型也可以被反复利用在其它房间，<br />
一个流程的状态切换也可以全部表达出来。</p>
<p>具体选择取决于你的需求，比如，如果你在进入一个状态开始，要做很多初始化工作，那么第二种模型就很适合。</p>
<p>状态变化都离不开一个主体对象，主体对象可以说包含状态变化（行为）和状态属性（属性），假设为StateOwner，<br />
StateOwner有两个部分组成：Task/事情和状态。任何一个Task/事情都会对应一个状态。</p>
<p>这样，我们已经抽象出两个主要对象：状态State和StateOwner。</p>
<p>为了封装状态变化细节，我们可以抽象出一个状态机StateMachine来专门实现状态根据事情实现转换。</p>
<p>这样，客户端外界通过状态机可访问状态模式这个匣子。在实践中，外界客户端需要和状态机实现数据交换，我们把<br />
它也分为两种：属性和行为。</p>
<p>其中属性可能需要外界告诉状态状态变化的主体对象Task，解决状态的主人问题，是谁的问题；行为可能是需要持久<br />
化当前这个主体对象的状态到数据库。</p>
<p>这两种数据交换可以分别通过StateOwner和StateMachine与整个状态机实现数据交换，这样，具体状态和状态切换也<br />
和外界实现了解耦隔离。</p>
<p>因此好的状态模式实现必须有下列步骤：<br />
（1）将每个状态变成State的子类，实现每个状态对象化。<br />
（2）在每个状态中，封装着进入下一个状态可能规则，这些规则是状态变化的核心，换句话说，统一了状态转换的规则。<br />
具体可采取run和next这样的转换行为。</p>
<p>下面是一个子状态代码：</p>
<p><strong>public</strong><strong>class</strong>  Running <strong>extends</strong> StateT{</p>
<p><font color="#0000aa">//</font><font color="black"><br />
<strong>public</strong><strong>void</strong> run(StateOwner  stateOwner){<br />
stateOwner.setCurrentState(<strong>this</strong>);<br />
}</p>
<p></font><font color="#0000aa">//转换到下一个状态的规则</font><font color="black"><br />
</font><font color="#0000aa">//当前是Running状态，下一个状态可能是暂停、结束或者强制退出等</font><font color="black"><br />
</font><font color="#0000aa">//状态，但是绝对不会是Not_Started这样的状态</font><font color="black"><br />
</font><font color="#0000aa">//转换规则在这里得到了体现。</font><font color="black"><br />
<strong>public</strong> State next(Event e) {<br />
<strong>if</strong>(transitions ==  <strong>null</strong>){<br />
addEventState(<strong>new</strong> EventImp(</font><font color="#00bb00">&#8220;PAUSE&#8221;</font><font color="black">), <strong>new</strong>  Suspended());<br />
addEventState(<strong>new</strong> EventImp(</font><font color="#00bb00">&#8220;END&#8221;</font><font color="black">), <strong>new</strong>  Completed());<br />
addEventState(<strong>new</strong> EventImp(</font><font color="#00bb00">&#8220;STOP&#8221;</font><font color="black">), <strong>new</strong>  Aborted());<br />
}<br />
<strong>return</strong><strong>super</strong>.next(e);<br />
}</p>
<p>}</p>
<p>外界直接调用 StateMachine的关键方法transition；实行状态的自动转变。</p>
<p><strong>public</strong><strong>class</strong> StateMachine {</p>
<p></font><font color="#0000aa">/**<br />
* 状态切换<br />
* 根据Event参数，运行相应的状态。<br />
* 1. 获得当前状态<br />
* 2.  使用当前状态的next()转换<br />
* |Event<br />
* ___currentState__|______newState___<br />
*<br />
*  @param inputs<br />
*/</font><font color="black"><br />
<strong>public</strong><strong>final</strong><strong>void</strong> transition(String taskid,  Event e) throws Exception {<br />
State currentState = readCurrentState(taskid);  </font><font color="#0000aa">//从数据库获得当前状态</font><font color="black"><br />
StateOwner  stateOwner = <strong>new</strong> StateOwner(taskid, currentState);<br />
</font><font color="#0000aa">//转换状态</font><font color="black"><br />
currentState =  currentState.next(e);<br />
<strong>if</strong> (currentState != <strong>null</strong>)  {<br />
currentState.run(stateOwner);<br />
saveCurrentState(stateOwner); </font><font color="#0000aa">//保存当前状态</font><font color="black"><br />
}<br />
}</p>
<p>} </font></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/09/zt%e4%bb%8e%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%8a%b6%e6%80%81%e6%9c%ba%e5%ae%9e%e8%b7%b5%e4%b8%ad%e6%80%bb%e7%bb%93%e7%8a%b6%e6%80%81%e6%a8%a1%e5%bc%8f%e4%bd%bf%e7%94%a8%e5%bf%83%e5%be%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web开发的瑞士军刀 javawebparts</title>
		<link>http://www.foxlog.org/2006/09/08/web%e5%bc%80%e5%8f%91%e7%9a%84%e7%91%9e%e5%a3%ab%e5%86%9b%e5%88%80-javawebparts/</link>
		<comments>http://www.foxlog.org/2006/09/08/web%e5%bc%80%e5%8f%91%e7%9a%84%e7%91%9e%e5%a3%ab%e5%86%9b%e5%88%80-javawebparts/#comments</comments>
		<pubDate>Fri, 08 Sep 2006 04:09:20 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/85</guid>
		<description><![CDATA[引言:最近在看一个开源的聊天室AjaxChat 时看到一个被引用的包:javawebparts,处于好奇去看了一下，突然发现这么好的一个常用web组件不去用实在是太可惜了，下面逐一介绍，详细文档大家可以去官方文档看看，最好看它的Demo,很直观。 javawebparts的口号是:不用重新发明轮子 ! 对这点我是严重支持啊，在我的身边看到N多所谓的牛人来到项目组作的第一件事就是把以前的项目推倒，重新实现自己的所谓一套先进的东西，靠，你有多先进啊，你的自己&#8221;方言&#8221;一边自我欣赏，一边还让别人接受，再来一个人又把这个推倒，循环。。。。无语. 所以,用开源吧 ,是不是绕的太远了? 让我们言归正传吧. 一。管理你的web配置文件信息 web的配置文件是我们经常要用到的，配置信息我们可以分为两大类，一类是最简单的&#8221;平板&#8221;型的,比如: For an XML config file like this: &#60; config &#62; &#60; firstName &#62; Frank &#60;/ firstName &#62; &#60;/ config &#62; The following bean could be used: public   class  MyConfigBean { private   static  String firstName; public   void  setFirstName(String inFirstName) { firstName  =  inFirstName; } public  String getFirstName() { return [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>引言:最近在看一个开源的聊天室<a href="http://struts.sourceforge.net/ajaxchat/index.html" target="_blank">AjaxChat</a>  时看到一个被引用的包:javawebparts,处于好奇去看了一下，突然发现这么好的一个常用web组件不去用实在是太可惜了，下面逐一介绍，详细文档大家可以去官方文档看看，最好看它的Demo,很直观。</p>
<p>javawebparts的口号是:不用重新发明轮子 !</p>
<p><a href="http://www.foxlog.org/wp-content/uploads/2007/07/header1.gif" title="header1.gif"><img src="http://www.foxlog.org/wp-content/uploads/2007/07/header1.gif" alt="header1.gif" /></a></p>
<p>对这点我是严重支持啊，在我的身边看到N多所谓的牛人来到项目组作的第一件事就是把以前的项目推倒，重新实现自己的所谓一套先进的东西，靠，你有多先进啊，你的自己&#8221;方言&#8221;一边自我欣赏，一边还让别人接受，再来一个人又把这个推倒，循环。。。。无语.</p>
<p>所以,用开源吧 ,是不是绕的太远了? <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  让我们言归正传吧.</p>
<p>一。管理你的web配置文件信息</p>
<p>web的配置文件是我们经常要用到的，配置信息我们可以分为两大类，一类是最简单的&#8221;平板&#8221;型的,比如:</p>
<p><span style="text-decoration: underline">For an XML config file like  this:<br />
</span></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span> <span style="color: #800000">config</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span> <span style="color: #800000">firstName</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000">Frank</span> <span style="color: #0000ff">&lt;/</span> <span style="color: #800000">firstName</span> <span style="color: #0000ff">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span> <span style="color: #800000">config</span> <span style="color: #0000ff">&gt;</span></p>
<p><span style="text-decoration: underline">The following bean could be used:</span></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span> <span style="color: #000000"> </span> <span style="color: #0000ff">class</span> <span style="color: #000000"> MyConfigBean {<br />
</span><span style="color: #0000ff">private</span> <span style="color: #000000"> </span> <span style="color: #0000ff">static</span> <span style="color: #000000"> String firstName;<br />
</span><span style="color: #0000ff">public</span> <span style="color: #000000"> </span> <span style="color: #0000ff">void</span>  <span style="color: #000000"> setFirstName(String inFirstName) {<br />
firstName </span>  <span style="color: #000000">=</span> <span style="color: #000000"> inFirstName;<br />
}<br />
</span><span style="color: #0000ff">public</span> <span style="color: #000000"> String getFirstName() {<br />
</span><span style="color: #0000ff">return</span> <span style="color: #000000"> firstName;<br />
}<br />
}</span></p>
<p>在应用中你不用去自己解析xml了，javawebparts已经帮你做好了，你只要getFirstName()就可以了，是不是很方便?你所要做的工作就是在web.xml中引用一个listener,配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">configFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/app_config.xml</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /param-value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">rootElement</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">config</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">configClass</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.sampleapp. SampleAppConfigBean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AjaxPartsTaglibConfig</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/ajax_config.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.listener. AppConfigContextListener</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><br />
这种平板型结构的数据这样就已经OK了，还有一种是复杂一点的，有层次结构，比如在Bean中可能还有collection,需要自己实现一下，也不复杂直接调用apache的Digester就可以了（实际上在javawebparts到处都有Digester的影子）,需要了解的请参看  <a href="/alex/archive/2006/09/06/68148.html" title="_36fd6a8cb6cd_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" id="_36fd6a8cb6cd_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" name="_36fd6a8cb6cd_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl">用Digester解析xml到bean</a></p>
<p>二。缓存页面</p>
<p>比如，我想缓存所有的gif图片，但是jpg的不缓存，web.xml中配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter. CacheControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*/header1.gif, *.jpg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CacheControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
它的后台实现机制很简单，内部部分代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">((HttpServletResponse)response).setHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Pragma</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">No-cache</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
((HttpServletResponse)response).setHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,<br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000">no-cache,no-store,max-age=0</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
((HttpServletResponse)response).setDateHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Expires</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">1</span><span style="color: #000000">);</span><br />
三。图片压缩<br />
是不是对gzip压缩很亲切？  对的，就是传说中可以压缩图片减少网络传输体积的玩意，现在你只要在web.xml中增加以下内容就可以轻松实现了:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CompressionFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter. CompressionFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*/bigimage2.gif</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000"> param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">compressType</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">gzip_first</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CompressionFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
上面的配置表示只对bigimage2.gif的文件进行压缩，其他不用,pathSpec的属性有两种include,exclude,意思已经很明确了，相反地意思,而pathList得内部实现也是用正则表达式实现的，支持*等用法.这些内部实现你觉得复杂的话就不用管它了，反正人家已经给你实现好了，你只要说&#8221;给我压缩&#8217;美女与野兽.JPG&#8217;&#8221;就可以了</p>
<p>四.控制只在设定的时间范围内访问应用</p>
<p>比如说只允许在工作时间内可以访问应用，其他时间禁止访问，虽然不是很普遍不过这种需求还是有的,如果自己实现还是比较麻烦的，我们用现成的，配置如下：(怎么都是配置阿？对，全部是配置就可以了，难道不好吗?太爽了啊，乖乖龙地动)</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AppAvailabilityFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter. AppAvailabilityFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*/AAFTestTarget.jsp </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">monday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">tuesday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">wednesday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">thursday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">friday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">saturday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">sunday</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0600-2359</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">redirectTo</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AAFReject.jsp</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">bypassCheckClass</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.sampleapp. AAFBypassCheck</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AppAvailabilityFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
上面的配置很明确了吧，表示在访问AAFTestTarget.jsp 文件的时候必须在设定的时间内，其他则无限制，很清楚了哦.</p>
<p>五。统一重定向</p>
<p>redirect或者forward大家都再熟悉不过了，不过这个是基于配置的，不用你写代码，比如，你希望在访问某个目录的时候自动重订向到其他文件，或者直接转到其他网站比如google.com,配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">URLRedirectFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter.URLRedirectFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000"> filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">configFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/redirect_config.xml </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">URLRedirectFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
其中redirect_config.xml配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">redirect </span><span style="color: #ff0000">from</span><span style="color: #0000ff">=&#8221;*/app/redirect_test/*&#8221;</span><span style="color: #ff0000"> to</span><span style="color: #0000ff">=&#8221;http://www.google.com&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward </span><span style="color: #ff0000">from</span><span style="color: #0000ff">=&#8221;*/app/forward/test.htm&#8221;</span><span style="color: #ff0000"> to</span><span style="color: #0000ff">=&#8221;/index.jsp&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">config</span><span style="color: #0000ff">&gt;</span><br />
很直观吧?凡是访问/app/redirect_test下的所有应用都重订向到google,太简单了,我就不多说了.<br />
六.估算每个请求所花费的时间</p>
<p>这个对性能调整是很有好处的,性能的调整的前提是你了解你的系统的瓶颈在什么地方,更具体的说是你的应用哪些地方花费的资源较多,一个是监控sql的执行情况,这里推荐jdbmonitor,大家可以去看看,另一种就是本文所说的查看每个请求的执行时间,他会告诉你本请求花费了多少秒,很直观了.</p>
<p>配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">ElapsedTimeFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter.ElapsedTimeFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000"> filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">ElapsedTimeFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
上面的一个include  ,一个pathList的*就代表了所有的应用都过滤,反之,你想暂时取消这个功能就直接把include换成exclude就行了</p>
<p>应用在启动后你直接观察后台日志就可以了,就这么就OK了,还要你做什么呢? 没有.</p>
<p>七.监控session的会话</p>
<p>经常碰到这样的一个情况,用户在登陆系统一段时间后session实效,但是他接着点击里面的连接,结果报异常,因为session里已经取不到数据了,常常是空指针错误,在每一个页面里都进行这种低级问题的判断是很烦人的,现在我们有新的方式可以一次性解决所有的问题,还是一段简单的配置:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SessionInactivityFilter</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter. SessionInactivityFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">forwardTo</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/login.jsp</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SessionInactivityFilter</span><span style="color: #0000ff">&lt;</span><span style="color: #800000"> /filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
表示会话失效后直接重定向到登陆界面,让用户重新登陆.</p>
<p>八.控制访问应用的IP</p>
<p>出于安全考虑,过滤某些IP能或不能访问,配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">IPAccessControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.filter. IPAccessControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">pathList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*/IACTestTarget.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000"> param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">addressSpec</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">include</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">addressList</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">localhost</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">forwardTo</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/IACReject.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">IPAccessControlFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><br />
以上的配置效果就是只允许是从服务器上访问应用的来源(太苛刻了吧? <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p>九.随机显示文字</p>
<p>比如每日一语,随机广告,很实用的,配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">TextReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.servlet. TextReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">order</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">random</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">itemsFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/text_returner_items.xml </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">TextReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/textReturner</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><br />
上面的配置表示随机显示text_returner_items.xml 中的文字,text_returner_items.xml 内容如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextReturnerServletItems</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0 - It&#8217;s always darkest before the dawn</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1 - A journey of a thousand miles begins with a single step</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">2 - The universe is like stupidity: both are infinite<img src="/Images/dot.gif" /> and actually, I&#8217;m not sure about the universe</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3 - I believe there is intelligent life in the universe, except for some parts of New Jersey</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">4 - If your falling of a cliff, you might as well try and fly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5 - The cost of life is to chance the consequence</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">TextReturnerServletItems</span><span style="color: #0000ff">&gt;</span><br />
十.随机显示图片</p>
<p>和上面有点类似,只是显示的内容可以是图片</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">RedirectReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.servlet. RedirectReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">order</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">random</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">itemsFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> /WEB-INF/redirect_returner_items.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">RedirectReturnerServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/redirectReturner</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p>redirect_returner_items.xml的内容如下:</p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">RedirectReturnerServletItems</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.google.com/intl/en/images/logo.gif</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/img/header1.gif</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/img/mouse.gif</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://javawebparts.sourceforge.net/logo.jpg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">item</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">RedirectReturnerServletItems</span><span style="color: #0000ff">&gt;</span><br />
我就不用解释了吧</p>
<p>十一.生成文字图片</p>
<p>你提供文字,系统帮你生成对应的图片,是不是很有用? 比如验证码里经常需要用到,生成的效果如下:</p>
<p><a href="http://www.foxlog.org/wp-content/uploads/2007/07/renderfong.png" title="renderfong.png"><img src="http://www.foxlog.org/wp-content/uploads/2007/07/renderfong.png" alt="renderfong.png" /></a></p>
<p>配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">TextRendererServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javawebparts.servlet. TextRendererServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">fontName</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">arial</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">fontPoint</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">24</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">color</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">255,0,0 </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">backColor</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">255,255,0 </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">stylePlain</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">false</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">styleBold</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">styleItalic</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">TextRendererServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/textRenderer</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><br />
好了，基本介绍到这里，基本感觉web常碰到的东西都有所涉及，另外还有Ajax的封装，但我个人感觉没什么大用，如果需要可以考虑别的开源产品，比如prototype或者DWR等，感觉更方便.</p>
<p>好东西不敢独享,如果你觉得有点用我就很开心了 <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/08/web%e5%bc%80%e5%8f%91%e7%9a%84%e7%91%9e%e5%a3%ab%e5%86%9b%e5%88%80-javawebparts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Digester解析xml到bean</title>
		<link>http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/</link>
		<comments>http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/#comments</comments>
		<pubDate>Wed, 06 Sep 2006 04:11:45 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/86</guid>
		<description><![CDATA[key words: Digester  解析xml 假设有下列xml文件: &#60;?xml version=&#8217;1.0&#8242; encoding=&#8217;utf-8&#8242;?&#62; &#60;address-book&#62; &#60;contact myType=&#8221;individual&#8221;&#62; &#60;name&#62;Zane Pasolini&#60;/name&#62; &#60;address&#62;999 W. Prince St.&#60;/address&#62; &#60;city&#62;New York&#60;/city&#62; &#60;province&#62;NY&#60;/province&#62; &#60;postalcode&#62;10013&#60;/postalcode&#62; &#60;country&#62;USA&#60;/country&#62; &#60;telephone&#62;1-212-345-6789&#60;/telephone&#62; &#60;/contact&#62; &#60;contact myType=&#8221;business&#8221;&#62; &#60;name&#62;SAMOFIX d.o.o.&#60;/name&#62; &#60;address&#62;Ilica 47-2&#60;/address&#62; &#60;city&#62;Zagreb&#60;/city&#62; &#60;province&#62;&#60;/province&#62; &#60;postalcode&#62;10000&#60;/postalcode&#62; &#60;country from=&#8221;cn&#8221;&#62;Croatia&#60;/country&#62; &#60;telephone&#62;385-1-123-4567&#60;/telephone&#62; &#60;/contact&#62; &#60;/address-book&#62; 这是一份常用到的文件，现在我们需要将之映射到java bean,用Digester解析显得非常简单 public class AddressBookParser { /** * Prints the contact information to standard output. * * @param contact the &#60;code&#62;Contact&#60;/code&#62; to print out */ public void addContact(Contact contact) { System.out.println(&#8220;TYPE: &#8220; + contact.getType()); System.out.println(&#8220;NAME: &#8220; + contact.getName()); System.out.println(&#8220;    ADDRESS:    &#8220; + contact.getAddress()); System.out.println(&#8220;    CITY:       &#8220; + contact.getCity()); System.out.println(&#8220;    PROVINCE:   &#8220; + contact.getProvince()); System.out.println(&#8220;    POSTALCODE: &#8220; + contact.getPostalcode()); System.out.println(&#8220;    COUNTRY:    &#8220; + contact.getCountry()); System.out.println(&#8220;    COUNTRY-From:    &#8220; + contact.getCountryFrom()); System.out.println(&#8220;    TELEPHONE:  &#8220; + contact.getTelephone()); } /** * Configures Digester rules and actions, parses the XML file specified * as the first argument. * * @param args command line arguments */ public static void main(String[] args) throws IOException, SAXException { [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/09/21/dao%e6%a8%a1%e5%bc%8f%e6%bc%94%e5%8f%98/' rel='bookmark' title='Permanent Link: DAO模式演变'>DAO模式演变</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words: Digester  解析xml</p>
<p>假设有下列xml文件:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml version=&#8217;1.0&#8242; encoding=&#8217;utf-8&#8242;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">address-book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">contact </span><span style="color: #ff0000">myType</span><span style="color: #0000ff">=&#8221;individual&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Zane Pasolini</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">999 W. Prince St.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">city</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">New York</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">city</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">province</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">NY</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">province</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">postalcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">10013</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">postalcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">country</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">USA</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">country</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1-212-345-6789</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">contact</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">contact </span><span style="color: #ff0000">myType</span><span style="color: #0000ff">=&#8221;business&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SAMOFIX d.o.o.</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Ilica 47-2</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">address</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">city</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Zagreb</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">city</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">province</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">province</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">postalcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">10000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">postalcode</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">country </span><span style="color: #ff0000">from</span><span style="color: #0000ff">=&#8221;cn&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Croatia</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">country</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">385-1-123-4567</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">contact</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">address-book</span><span style="color: #0000ff">&gt;</span><br />
这是一份常用到的文件，现在我们需要将之映射到java  bean,用Digester解析显得非常简单</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> AddressBookParser<br />
{<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* Prints the contact information to standard output.<br />
*<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> contact the &lt;code&gt;Contact&lt;/code&gt; to print out<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> addContact(Contact contact)<br />
{<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">TYPE: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getType());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">NAME: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getName());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    ADDRESS:    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getAddress());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    CITY:       </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getCity());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    PROVINCE:   </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getProvince());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    POSTALCODE: </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getPostalcode());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    COUNTRY:    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getCountry());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    COUNTRY-From:    </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getCountryFrom());<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">    TELEPHONE:  </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> contact.getTelephone());<br />
}</p>
<p></span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* Configures Digester rules and actions, parses the XML file specified<br />
* as the first argument.<br />
*<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> args command line arguments<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> IOException, SAXException<br />
{<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> instantiate Digester and disable XML validation</span><span style="color: #008000"><br />
</span><span style="color: #000000">        Digester digester </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Digester();<br />
digester.setValidating(</span><span style="color: #0000ff">false</span><span style="color: #000000">);</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> instantiate AddressBookParser class</span><span style="color: #008000"><br />
</span><span style="color: #000000">        digester.addObjectCreate(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, AddressBookParser.</span><span style="color: #0000ff">class</span><span style="color: #000000"> );<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> instantiate Contact class</span><span style="color: #008000"><br />
</span><span style="color: #000000">        digester.addObjectCreate(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, Contact.</span><span style="color: #0000ff">class</span><span style="color: #000000"> );</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> set type property of Contact instance when &#8217;type&#8217; attribute is found<br />
</span><span style="color: #008000">//</span><span style="color: #008000">对有属性的值通过setProperties方法</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
digester.addSetProperties(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,         </span><strong><font color="#ff0000"><span style="color: #000000">&#8220;</span><span style="color: #000000">myType</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">type</span><span style="color: #000000">&#8220;</span></font></strong><span style="color: #000000"><font color="#ff0000"> </font>);</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> set different properties of Contact instance using specified methods<br />
</span><span style="color: #008000">//</span><span style="color: #008000">addCallMethod与addBeanPropertySetter等价<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> 参数 0代表一个参数，默认就是当前读的数据</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/name</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,       </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setName</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/address</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,    </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setAddress</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/address</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,    </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setAddress</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/city</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,       </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setCity</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/province</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,   </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setProvince</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/postalcode</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setPostalcode</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/country</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,    </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setCountry</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">增加country的属性 : from</span><span style="color: #008000"><br />
</span><span style="color: #000000">        digester.addSetProperties(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/country</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><u><span style="color: #000000">&#8220;</span><span style="color: #000000">from</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">countryFrom</span><span style="color: #000000">&#8220;</span></u><span style="color: #000000">);<br />
digester.addCallMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact/telephone</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,  </span><span style="color: #000000">&#8220;</span><span style="color: #000000">setTelephone</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> call &#8217;addContact&#8217; method when the next &#8217;address-book/contact&#8217; pattern is seen</span><span style="color: #008000"><br />
</span><span style="color: #000000">        digester.addSetNext(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">address-book/contact</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,               </span><span style="color: #000000">&#8220;</span><span style="color: #000000">addContact</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> );</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> now that rules and actions are configured, start the parsing process</span><span style="color: #008000"><br />
</span><span style="color: #000000">        AddressBookParser abp </span><span style="color: #000000">=</span><span style="color: #000000"> (AddressBookParser) digester.parse(</span><span style="color: #0000ff">new</span><span style="color: #000000"> File(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">c:\\addressbook.xml</span><span style="color: #000000">&#8220;</span><span style="color: #000000">));<br />
}</p>
<p></span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* JavaBean class that holds properties of each Contact entry.<br />
* It is important that this class be public and static, in order for<br />
* Digester to be able to instantiate it.<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Contact<br />
{<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String type;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String name;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String address;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String city;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String province;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String postalcode;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> String country;<br />
</span><span style="color: #008000">        //</span><span style="color: #008000">增加一个country的属性: from</span><br />
<span style="color: #000000">        </span><span style="color: #0000ff">private</span><span style="color: #000000"> String countryFrom;</span><span style="color: #008000"></span><span style="color: #008000"></span><span style="color: #008000"><br />
</span><span style="color: #000000">        </span><span style="color: #0000ff">private</span><span style="color: #000000"> String telephone;</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setType(String newType)<br />
{<br />
type </span><span style="color: #000000">=</span><span style="color: #000000"> newType;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getType()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> type;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setName(String newName)<br />
{<br />
name </span><span style="color: #000000">=</span><span style="color: #000000"> newName;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getName()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> name;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setAddress(String newAddress)<br />
{<br />
address </span><span style="color: #000000">=</span><span style="color: #000000"> newAddress;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getAddress()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> address;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setCity(String newCity)<br />
{<br />
city </span><span style="color: #000000">=</span><span style="color: #000000"> newCity;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getCity()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> city;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setProvince(String newProvince)<br />
{<br />
province </span><span style="color: #000000">=</span><span style="color: #000000"> newProvince;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getProvince()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> province;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setPostalcode(String newPostalcode)<br />
{<br />
postalcode </span><span style="color: #000000">=</span><span style="color: #000000"> newPostalcode;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getPostalcode()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> postalcode;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setCountry(String newCountry)<br />
{<br />
country </span><span style="color: #000000">=</span><span style="color: #000000"> newCountry;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getCountry()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> country;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setTelephone(String newTelephone)<br />
{<br />
telephone </span><span style="color: #000000">=</span><span style="color: #000000"> newTelephone;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getTelephone()<br />
{<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> telephone;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> String getCountryFrom() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> countryFrom;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setCountryFrom(String countryFrom) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.countryFrom </span><span style="color: #000000">=</span><span style="color: #000000"> countryFrom;<br />
}<br />
}<br />
}</span></p>
<p>在  <a href="http://struts.sourceforge.net/ajaxchat/index.html">AjaxChat</a>  中的读取房间信息的方式显得更简洁<br />
房间的xml配置文件如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">rooms</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;1&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;General Topics&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;2&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Programming&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;3&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Movies&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;4&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Music&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;5&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Television&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">rooms</span><span style="color: #0000ff">&gt;</span><br />
解析代码如下 :</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">synchronized</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> init(InputStream isConfigFile) {</p>
<p>log.debug(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">init()</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (isConfigFile </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) {<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> Read in rooms config and create beans, hand off to DAO.</span><span style="color: #008000"><br />
</span><span style="color: #000000">            Digester digester </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Digester();<br />
digester.setValidating(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
digester.push(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
digester.addObjectCreate(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,<br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000">org.apache.struts.apps.ajaxchat.dto.RoomDTO</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
//注意这里，如果xl的属性名称和bean的属性名称完全对应，则直接提供xml的位置即可<br />
digester.addSetProperties(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);</span><span style="color: #000000"></span><span style="color: #000000"><br />
digester.addSetNext(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">addRoom</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
digester.parse(isConfigFile);<br />
log.info(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">***** Rooms = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> rooms);<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException ioe) {<br />
ioe.printStackTrace();<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SAXException se) {<br />
se.printStackTrace();<br />
}<br />
}</p>
<p>} </span><span style="color: #008000">//</span><span style="color: #008000"> End init().</span><br />
如果在xml文件中增加非attribute则更改后的配置文件如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">rooms</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;1&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;General Topics&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;2&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Programming&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;3&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Movies&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;4&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Music&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;5&#8243;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Television&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">6</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">shit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">room</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">room</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">haha</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">room</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">rooms</span><span style="color: #0000ff">&gt;</span></p>
<p>对应的解析如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">synchronized</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> init(InputStream isConfigFile) {</p>
<p>log.debug(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">init()<img src="/Images/dot.gif" /></span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (isConfigFile </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) {<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> Read in rooms config and create beans, hand off to DAO.</span><span style="color: #008000"><br />
</span><span style="color: #000000">            Digester digester </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Digester();<br />
digester.setValidating(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
digester.push(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
digester.addObjectCreate(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,<br />
</span><span style="color: #000000">&#8220;</span><span style="color: #000000">org.apache.struts.apps.ajaxchat.dto.RoomDTO</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
digester.addSetProperties(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
//增加addCallMethod方法<br />
<strong>digester.addCallMethod(</strong></span><strong><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room/id</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">setId</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">0</span></strong><span style="color: #000000"><strong>);</strong><br />
<strong>digester.addCallMethod(</strong></span><strong><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room/name</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">setName</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">0</span></strong><span style="color: #000000"><strong>);</strong><br />
digester.addSetNext(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">rooms/room</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">addRoom</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
digester.parse(isConfigFile);<br />
log.info(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">***** Rooms = </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> rooms);<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException ioe) {<br />
ioe.printStackTrace();<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SAXException se) {<br />
se.printStackTrace();<br />
}<br />
}</p>
<p>} </span><span style="color: #008000">//</span><span style="color: #008000"> End init().</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/09/21/dao%e6%a8%a1%e5%bc%8f%e6%bc%94%e5%8f%98/' rel='bookmark' title='Permanent Link: DAO模式演变'>DAO模式演变</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]JDBMonitor全攻略</title>
		<link>http://www.foxlog.org/2006/08/31/ztjdbmonitor%e5%85%a8%e6%94%bb%e7%95%a5/</link>
		<comments>http://www.foxlog.org/2006/08/31/ztjdbmonitor%e5%85%a8%e6%94%bb%e7%95%a5/#comments</comments>
		<pubDate>Thu, 31 Aug 2006 04:13:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/88</guid>
		<description><![CDATA[key words: dbmonitor,sql跟踪，sql监控 &#160; JDBMonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便，您所需要做的唯一事情就是在您系统的JDBC连接字符串前增加类似于 &#8220;listenerconfig=/config.xml:url=&#8221; 的字符即可，不用写任何代码。 使用 JDBMonitor，您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的，您可以扩展它来将执行情况通过其他方式记录下来，您所需要做的就是写一个实现IDBListener接口的类即可。 JDBMonitor遵守 GNU Lesser General Public Licence (LGPL)协议。此协议包含在发行包中。 入门 几乎所有大型数据库应用都包含有自己的SQL执行日志功能，此功能不仅能帮助开发人员调试，而且可以为DBA（数据库管理员）提供系统的运行信息。 （1）很难将业务逻辑同日志代码分离 （2）降低了代码的可读性。 （3）降低了系统的运行速度。在记录日志的时候，程序会暂停运行等待直到记录完成，而I/O操作是相当耗时的。 （4）很难记录运行耗时、语句参数等其他信息 （5）很难为我们无法修改代码的系统（例如没有源代码的系统）或者很难增加记录日志功能代码的系统（比如系统使用了ORMapping）增加日志功能。 JDBMonitor 则不同： （1）您最多只需要修改一行代码。您需要修改的代码就是这一行:Class.forName(&#8220;com.cownew.JDBMonitor.jdbc.DBDriver&#8221;) ,然后再修改一下 JDBC连接字符串，只要从 “jdbc:db2://10.74.198.247:50000/app”修改成” listenerconfig=config.xml:url= jdbc:db2://10.74.198.247:50000/app”就可以了。在您使用WebLogic ,Tomcat或其他服务器的数据源功能的时候，连修改代码这一步都是无需的。 （2）JDBMonitor另起一个线程来记录SQL，所以它不会对程序运行速度有任何影响。 （3）它是高度可扩展的，所以您可以扩展它来把执行情况通过其他方式记录。比如，您可以写一个扩展类，来通过电子邮件将日志发送出去。 取得 JDBMonitor JDBMonitor的最新稳定版本可以在JDBMonitor的网站上取得： http://www.cownew.com/JDBMonitor 使用 JDBMonitor 1 将 jdbmonitor.jar放到您系统的类路径下。 2 让系统加载 JDBMonitor的JDBC驱动。 这一步将会依您系统加载JDBC驱动的方式的不同而不同。 （1）如果您通过代码的形式加载JDBC驱动，例如： Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”); Connection cn = DriverManager.getConnection(……); 在这种情况下 ，您必须修改 [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/22/tomcat45%e7%9a%84%e6%95%b0%e6%8d%ae%e6%ba%90%e9%85%8d%e7%bd%ae%e5%b7%ae%e5%bc%82/' rel='bookmark' title='Permanent Link: tomcat4,5的数据源配置差异'>tomcat4,5的数据源配置差异</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words: dbmonitor,sql跟踪，sql监控</p>
<p class="postText">&nbsp;</p>
<p class="postText">JDBMonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便，您所需要做的唯一事情就是在您系统的JDBC连接字符串前增加类似于  &#8220;listenerconfig=/config.xml:url=&#8221; 的字符即可，不用写任何代码。</p>
<p class="postText">使用  JDBMonitor，您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的，您可以扩展它来将执行情况通过其他方式记录下来，您所需要做的就是写一个实现IDBListener接口的类即可。</p>
<p>JDBMonitor遵守 GNU Lesser General Public Licence (LGPL)协议。此协议包含在发行包中。</p>
<h2>入门</h2>
<p>几乎所有大型数据库应用都包含有自己的SQL执行日志功能，此功能不仅能帮助开发人员调试，而且可以为DBA（数据库管理员）提供系统的运行信息。</p>
<p>（1）很难将业务逻辑同日志代码分离</p>
<p>（2）降低了代码的可读性。</p>
<p>（3）降低了系统的运行速度。在记录日志的时候，程序会暂停运行等待直到记录完成，而I/O操作是相当耗时的。</p>
<p>（4）很难记录运行耗时、语句参数等其他信息</p>
<p>（5）很难为我们无法修改代码的系统（例如没有源代码的系统）或者很难增加记录日志功能代码的系统（比如系统使用了ORMapping）增加日志功能。</p>
<p>JDBMonitor 则不同：</p>
<p>（1）您最多只需要修改一行代码。您需要修改的代码就是这一行:Class.forName(&#8220;com.cownew.JDBMonitor.jdbc.DBDriver&#8221;)  ,然后再修改一下 JDBC连接字符串，只要从 “jdbc:db2://10.74.198.247:50000/app”修改成”  listenerconfig=config.xml:url=  jdbc:db2://10.74.198.247:50000/app”就可以了。在您使用WebLogic  ,Tomcat或其他服务器的数据源功能的时候，连修改代码这一步都是无需的。</p>
<p>（2）JDBMonitor另起一个线程来记录SQL，所以它不会对程序运行速度有任何影响。</p>
<p>（3）它是高度可扩展的，所以您可以扩展它来把执行情况通过其他方式记录。比如，您可以写一个扩展类，来通过电子邮件将日志发送出去。</p>
<h2>取得 JDBMonitor</h2>
<p>JDBMonitor的最新稳定版本可以在JDBMonitor的网站上取得：</p>
<p>http://www.cownew.com/JDBMonitor</p>
<h2>使用 JDBMonitor</h2>
<p>1 将 jdbmonitor.jar放到您系统的类路径下。</p>
<p>2 让系统加载 JDBMonitor的JDBC驱动。</p>
<p>这一步将会依您系统加载JDBC驱动的方式的不同而不同。</p>
<p>（1）如果您通过代码的形式加载JDBC驱动，例如：</p>
<p>Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);<br />
Connection cn = DriverManager.getConnection(……);</p>
<p>在这种情况下 ，您必须修改  “Class.forName”这一句来加载JDBMonitor的JDBC驱动（“com.cownew.JDBMonitor.jdbc.DBDriver”），而非以前的数据库JDBC驱动。</p>
<p>例如：</p>
<p>Class.forName(“com.cownew.JDBMonitor.jdbc.DBDriver”);<br />
Connection cn =  DriverManager.getConnection(……);</p>
<p>（2）如果您在配置文件中指定JDBC驱动，比如，数据源配置文件或者其他类似的文件。</p>
<p>请修改原来的  JDBC驱动类为 “com.cownew.JDBMonitor.jdbc.DBDriver” 。</p>
<p>3 让 JDBMonitor加载能够加载原来的JDBC驱动</p>
<p>JDBMonitor的工作原理就是截获JDBC驱动的SQL语句调用、记录SQL语句，然后将SQL语句重新转发给原来的JDBC驱动，所以JDBMonitor必须首先向DriverManager注册JDBC驱动。</p>
<p>原来的JDBC驱动定义在配置文件的“JdbcDrivers” 段中。<br />
&lt;JdbcDrivers&gt;<br />
&lt;JdbcDriver class=&#8221; com.mysql.jdbc.Driver&#8221;/&gt;<br />
&lt;/JdbcDrivers&gt;</p>
<p>4 在原来的JDBC连接字符串前增加 JDBMonitor所需的信息。</p>
<p>您所需要做的就是将” listenerconfig=&lt;configfilepath&gt;:url=”  增加到原来的JDBC连接字符串前。“&lt;configfilepath&gt;”代表配置文件的路径，下面集中路径都是合法的：</p>
<p>/com/jdbmonitor/config.xml<br />
com/jdbmonitor/config.xml<br />
c:/ jdbmonitor  /config.xml</p>
<p>JDBMoinitor使用getClass().getResourceAsStream加载类似于“/com/jdbmonitor/config.xml”  and “com/jdbmonitor/config.xml” 的类路径文件，使用 FileInputStream加载类似于 “c:/ jdbmonitor  /config.xml”的配置文件。</p>
<p>5 指定您要使用监听器：</p>
<p>您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。</p>
<p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、  SocketDBListene、DataBaseDBListener。当然您也可以开发满足您要求的监听器。<br />
监听器定义在配置文件的  “Listeners”段中：</p>
<p>&lt;Listeners&gt;<br />
&lt;!&#8211;ConsoleDBListener no arguments&#8211;&gt;<br />
&lt;Listener class=&#8221;com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener&#8221;  arg=&#8221;"/&gt;</p>
<p>&lt;!&#8211;the arguments of FileDBListener is the file to  log the SQL statement &#8211;&gt;<br />
&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.FileDBListener&#8221;  arg=&#8221;c:/aaa.txt&#8221;/&gt;</p>
<p>&lt;!&#8211;the arguments of SocketDBListener is  the bound socket port of the listener server &#8211;&gt;<br />
&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.SocketDBListener&#8221; arg=&#8221;9527&#8243;/&gt;<br />
&lt;/Listeners&gt;</p>
<p>搞定！启动您的系统。耶！SQL语句被记录下来了，我们可以在控制台、文件甚至远程监视器中看到日志了。</p>
<h2>举例</h2>
<h3>mvnforum的例子：</h3>
<p>您可以从http://www.mvnForum.com得到mvnforum。我演示用的版本是1.0。</p>
<p>(1)打开webapp\WEB-INF\classes\ mvncore.xml，重新配置：</p>
<p>修改之前：</p>
<p>&lt;driver_class_name&gt;com.mysql.jdbc.Driver&lt;/driver_class_name&gt;<br />
&lt;database_url&gt;listenerconfig=c:/log/jdbmonitor/config.xml:url=  jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p>
<p>修改之后：<br />
&lt;driver_class_name&gt; com.cownew.JDBMonitor.jdbc.DBDriver  &lt;/driver_class_name&gt;<br />
&lt;database_url&gt;jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p>
<p>(2)创建文件 c:/log/jdbmonitor/config.xml。我只想将SQL语句记录到文本文件中，所以我做如下配置：<br />
&lt;config&gt;<br />
&lt;Listeners&gt;<br />
&lt;!&#8211;the arguments of  FileDBListener is the file to log the SQL statement &#8211;&gt;<br />
&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.FileDBListener&#8221;  arg=&#8221;c:/log.txt&#8221;/&gt;<br />
&lt;/Listeners&gt;<br />
&lt;JdbcDrivers&gt;<br />
&lt;JdbcDriver class=&#8221;com.mysql.jdbc.Driver&#8221;/&gt;<br />
&lt;/JdbcDrivers&gt;<br />
&lt;/config&gt;<br />
(3) 将  jdbmonitor.jar放到webapp\WEB-INF\lib下。<br />
(4) 搞定！</p>
<p>Jive的例子：</p>
<p>您可以从http://www.jivesoftware.com得到Jive。我演示用的版本是 Jive 2.0 beta版。</p>
<h3>(1)打开<a href="http://localhost:8080/jive/admin/">http://localhost:8080/jive/admin/</a></h3>
<h3>“jdbc” 填为：com.cownew.JDBMonitor.jdbc.DBDriver</h3>
<h3>“server”  填为：c:/log/jdbmonitor/config.xml:url=jdbc:mysql://locahost/jive<br />
(2)将  jdbmonitor.jar放到WEB-INF\lib下<br />
(3) 象mvnforum中一样创建同样的  c:/log/jdbmonitor/config.xml 文件.<br />
(4) 搞定!</h3>
<p>代码方式的例子：</p>
<p>尽管直接在代码中指定系统所用的JDBC驱动类名和JDBC连接字符串是不推荐的，但是仍然有系统是这么做的。</p>
<p>比如：</p>
<p><strong>               Class.forName(&#8220;sun.jdbc.odbc.JdbcOdbcDriver&#8221;);</strong><br />
<strong>               Connection conn = null;</strong><br />
<strong>              PreparedStatement ps =  null;</strong><br />
<strong>              try</strong><br />
<strong>               {</strong><br />
<strong>                     conn =  DriverManager</strong><br />
<strong>                                    .getConnection(&#8220;jdbc:odbc:MQIS&#8221;);</strong><br />
<strong>                     for  (int i = 0; i &lt; 1000; i++)</strong><br />
<strong>                      {                    </strong><br />
<strong>                            ps =  conn.prepareStatement(&#8220;update T_Material set  fid=fid&#8221;);</strong><br />
<strong>                             ps.execute();</strong><br />
<strong>                             ps.close();</strong><br />
<strong>                      }</strong><br />
<strong>              } finally</strong><br />
<strong>               {</strong><br />
<strong>                     &#8230;.           </strong><br />
<strong>              }</strong></p>
<p>（1）修改一下代码为：<br />
<strong>               Class.forName(&#8220;com.cownew.JDBMonitor.jdbc.DBDriver&#8221;);</strong><br />
<strong>               Connection conn = null;</strong><br />
<strong>              PreparedStatement ps =  null;</strong><br />
<strong>              try</strong><br />
<strong>               {</strong><br />
<strong>                     conn =  DriverManager.getConnection(&#8220;listenerconfig=  c:/log/jdbmonitor/config.xml:url=jdbc:odbc:MQIS&#8221;);</strong><br />
<strong>                      for (int i = 0; i &lt; 1000; i++)</strong><br />
<strong>                      {</strong><br />
<strong>                            ps =  conn.prepareStatement(&#8220;update T_Material set  fid=fid&#8221;);</strong><br />
<strong>                             ps.execute();</strong><br />
<strong>                             ps.close();</strong><br />
<strong>                      }</strong><br />
<strong>              } finally</strong><br />
<strong>               {</strong><br />
<strong>                     &#8230;.           </strong><br />
<strong>              }</strong></p>
<p>（2）创建c:/log/jdbmonitor/config.xml文件。我想记录SQL语句到文本文件中同时输出到控制台，这样可以辅助我进行调试，所以我配置如下：<br />
&lt;config&gt;<br />
&lt;Listeners&gt;<br />
&lt;!&#8211;the arguments of  FileDBListener is the file to log the SQL statement &#8211;&gt;<br />
&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.FileDBListener&#8221;  arg=&#8221;c:/log.txt&#8221;/&gt;</p>
<p>&lt;!&#8211;ConsoleDBListener no arguments&#8211;&gt;<br />
&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener&#8221; arg=&#8221;"/&gt;<br />
&lt;/Listeners&gt;<br />
&lt;JdbcDrivers&gt;<br />
&lt;JdbcDriver  class=&#8221;com.mysql.jdbc.Driver&#8221;/&gt;<br />
&lt;/JdbcDrivers&gt;<br />
&lt;/config&gt;<br />
(3) 将 jdbmonitor.jar放到类路径下。<br />
(4)  搞定!</p>
<h2>监听器</h2>
<p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、  SocketDBListener、DataBaseDBListener。</p>
<p><strong>1、ConsoleDBListener 控制台监听器</strong></p>
<p>ConsoleDBListener会将SQL语句打印到控制台中。</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113131636.jpg" twffan="done" height="113" width="579" /></p>
<p>这个监听器很容易配置：</p>
<p>&lt;Listener class=&#8221;com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener&#8221;  arg=&#8221;"/&gt;</p>
<p><strong>2、FileDBListener 文件监听器</strong></p>
<p>FileDBListener 会将SQL语句保存到文本文件中。</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136883.jpg" twffan="done" height="347" width="316" /></p>
<p>如下配置：</p>
<p>&lt;Listener class=&#8221;com.cownew.JDBMonitor.listenerImpl.FileDBListener&#8221;  arg=&#8221;c:/aaa.txt&#8221;/&gt;</p>
<p><strong><em>arg=&#8221;c:/aaa.txt&#8221;</em></strong>表示日志将保存到文件<strong><em>c:/aaa.txt</em></strong>中。</p>
<p><strong>3、SocketDBListener Socket监听器</strong></p>
<p>SocketDBListener是一个socket服务器，客户端连接到它上边以后就可以接收到它发出的SQL语句。</p>
<p>如下配置：</p>
<p>&lt;Listener class=&#8221;com.cownew.JDBMonitor.listenerImpl.SocketDBListener&#8221;  arg=&#8221;9527&#8243;/&gt;</p>
<p><em><strong>arg=&#8221;9527&#8243;</strong></em>表示服务器将在9527端口监听。</p>
<p>我们已经开发了如下两种客户端：SocketConsoleClient（Socket控制台客户端） 和 SocketSwingClient（Socket  Swing客户端）。</p>
<p>SocketConsoleClient工作在控制台中：</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136805.jpg" twffan="done" height="223" width="665" /></p>
<p>SocketSwingClient是一个Swing GUI客户端：</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137863.jpg" twffan="done" height="300" width="495" /></p>
<p>您可以运行<em><strong>&#8220;java -classpath jdbmonitor.jar  com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketConsoleClient&#8221;  </strong></em>来启动<em><strong>SocketConsoleClient</strong></em>，运行<em><strong>&#8220;java  -classpath jdbmonitor.jar  com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketSwingClient&#8221;</strong></em>启动<em><strong>SocketSwingClient</strong></em>。</p>
<p>您可以编写符合您自己要求的客户端，具体细节请参考<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.ListenerClient</strong></em>和<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.IDBSocketClientListener</strong></em>.</p>
<p><strong>4、DataBaseDBListener</strong></p>
<p>DataBaseDBListener将会把SQL语句记录到数据库中：</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137930.jpg" twffan="done" height="194" width="851" /></p>
<p>如下配置：</p>
<p><em><strong>&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener&#8221;<br />
arg=&#8221;dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog&#8221;/&gt;  </strong></em></p>
<p><em><strong>&#8220;dburl=jdbc:odbc:MQIS;user=;password=;&#8221;</strong></em>表示目标数据库的JDBC连接字符串。<em><strong>&#8220;logtable=T_Log_SQLLog&#8221;</strong></em>  表示SQL记录将被保存到哪个表中，默认的是<em><strong>T_Log_SQLLog</strong></em>。</p>
<p>如果目标数据库用的JDBC驱动与被监控的数据库不同，请将它加入配置文件的 &#8220;JdbcDrivers&#8221; 部分，例如：</p>
<p><em><strong>&lt;config&gt;<br />
&lt;Active&gt;true&lt;/Active&gt;<br />
&lt;Listeners&gt;</strong></em></p>
<p><em><strong>&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener&#8221;  arg=&#8221;"/&gt;</p>
<p>&lt;Listener  class=&#8221;com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener&#8221;<br />
arg=&#8221;dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog&#8221;/&gt;<br />
&lt;/Listeners&gt;<br />
&lt;JdbcDrivers&gt;<br />
&lt;JdbcDriver  class=&#8221;com.microsoft.jdbc.sqlserver.SQLServerDriver&#8221;/&gt;<br />
&lt;JdbcDriver  class=&#8221;sun.jdbc.odbc.JdbcOdbcDriver&#8221;/&gt;<br />
&lt;/JdbcDrivers&gt;<br />
&lt;/config&gt;</strong></em></p>
<p>&#8220;<em><strong>T_Log_SQLLog</strong></em>&#8220;的结构是：</p>
<p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137716.jpg" twffan="done" height="110" width="243" /></p>
<p>&#8220;<em><strong>T_Log_SQLLog</strong></em>&#8220;的建库脚本在<em><strong>com/cownew/JDBMonitor/listenerImpl/dataBaseListener</strong></em>,(db2.sql,mssqlserver.sql,oracle.sql)。</p>
<p>DataBaseDBListener是跨数据库的，你可以把记录SQL到任何关系数据库中。</p>
<h2>FAQ:</h2>
<p>1 如果我暂时不想记录SQL语句执行怎么办？难道我要重新修改成原来的样子？</p>
<p>答：无须如此。您只要修改config.xml，增加<strong><em>&lt;Active&gt;false&lt;/Active&gt;</em></strong>到文件中即可。</p>
<p>如下：</p>
<p><strong><em>&lt;config&gt;</em></strong><br />
<strong><em>  &lt;Active&gt;  false &lt;/Active&gt;</em></strong><br />
<strong><em>   &lt;Listeners&gt;</em></strong><br />
<strong><em>&#8230;&#8230;</em></strong><br />
<strong><em>&lt;/config&gt;</em></strong></p>
<h2>如何扩展JDBMonitor？</h2>
<p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、  SocketDBListener、DataBaseDBListener。当然您也可以开发满足您要求的监听器。所有的监听器必须实现接口：com.cownew.JDBMonitor.commo.  IDBListener。IDBListener有两个方法需要实现：</p>
<p><strong><em>public void init(String arg);</em></strong><br />
<strong><em>public  void logSql(SQLInfo info);</em></strong></p>
<p>JDBMonitor会将配置文件中监听器定义中“arg”的值传递给  “init”方法、将代表SQL语句执行信息的SQLInfo传递给“logSql”方法。</p>
<p>更多信息请参考API文档。</p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/12/22/tomcat45%e7%9a%84%e6%95%b0%e6%8d%ae%e6%ba%90%e9%85%8d%e7%bd%ae%e5%b7%ae%e5%bc%82/' rel='bookmark' title='Permanent Link: tomcat4,5的数据源配置差异'>tomcat4,5的数据源配置差异</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/08/31/ztjdbmonitor%e5%85%a8%e6%94%bb%e7%95%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于java与javaScript的互相访问</title>
		<link>http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/</link>
		<comments>http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/#comments</comments>
		<pubDate>Sat, 19 Aug 2006 04:21:01 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/95</guid>
		<description><![CDATA[key words: 脚本编码 中文乱码 js 在jsp中，通过js访问java代码比较容易(不过，也有缺陷，比如java代码的声明必须先于js),反过来则不方便,网上看到有通过其他组件的方式来做，感觉也不是很好，其实平时用的更多的是在js中有中文编码，而需要到下一个jsp页面中得到这个对应的值。 js中有函数escape和unescape,可惜的是java.net.*中的编码和解码与js的不一致，所以他们不能协同工作，有一个方法就是在java中重新实现一遍js里对应的方法,代码如下: /** * java版本的escape和 unescape[对应javaScript里的函数] */ public class EscapeUnescape { /** * escape ==&#62; escape * @param src * @return String */ public static String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length() * 6); for (i = 0; i &#60; src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) &#124;&#124; Character.isLowerCase(j) &#124;&#124; Character.isUpperCase(j)) tmp.append(j); else if (j &#60; 256) { tmp.append(&#8220;%&#8220;); if (j &#60; 16) tmp.append(&#8220;0&#8220;); tmp.append(Integer.toString(j, 16)); } else { tmp.append(&#8220;%u&#8220;); tmp.append(Integer.toString(j, 16)); } } return tmp.toString(); } /** * unescape ===&#62;js * @param src * @return String */ public static String unescape(String src) { StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length()); int lastPos = 0, pos = 0; char ch; while (lastPos &#60; src.length()) { pos = src.indexOf(&#8220;%&#8220;, lastPos); if (pos == lastPos) { if (src.charAt(pos + 1) == &#8216;u&#8216;) { ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16); tmp.append(ch); lastPos = pos + 6; [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/07/03/%e4%b8%a4%e5%88%99%e5%88%87%e5%89%b2%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%9b%e7%94%a8decimalformat%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%ad%97%e7%ac%a6/' rel='bookmark' title='Permanent Link: 两则:切割字符串；用DecimalFormat格式化字符'>两则:切割字符串；用DecimalFormat格式化字符</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/11/09/zthibernate%e5%a4%8d%e5%90%88%e4%b8%bb%e9%94%ae/' rel='bookmark' title='Permanent Link: [zt]hibernate复合主键'>[zt]hibernate复合主键</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words: 脚本编码 中文乱码 js<br />
在jsp中，通过js访问java代码比较容易(不过，也有缺陷，比如java代码的声明必须先于js),反过来则不方便,网上看到有通过其他组件的方式来做，感觉也不是很好，其实平时用的更多的是在js中有中文编码，而需要到下一个jsp页面中得到这个对应的值。</p>
<p>js中有函数escape和unescape,可惜的是java.net.*中的编码和解码与js的不一致，所以他们不能协同工作，有一个方法就是在java中重新实现一遍js里对应的方法,代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #008000">/**</span><span style="color: #008000"><br />
* java版本的escape和 unescape[对应javaScript里的函数]<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> EscapeUnescape {<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* escape ==&gt; escape<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> src<br />
* </span><span style="color: #808080">@return</span><span style="color: #008000"> String<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> String escape(String src) {<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> i;<br />
</span><span style="color: #0000ff">char</span><span style="color: #000000"> j;<br />
StringBuffer tmp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> StringBuffer();<br />
tmp.ensureCapacity(src.length() </span><span style="color: #000000">*</span><span style="color: #000000"> </span><span style="color: #000000">6</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> src.length(); i</span><span style="color: #000000">++</span><span style="color: #000000">) {<br />
j </span><span style="color: #000000">=</span><span style="color: #000000"> src.charAt(i);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (Character.isDigit(j) </span><span style="color: #000000">||</span><span style="color: #000000"> Character.isLowerCase(j)<br />
</span><span style="color: #000000">||</span><span style="color: #000000"> Character.isUpperCase(j))<br />
tmp.append(j);<br />
</span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (j </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #000000">256</span><span style="color: #000000">) {<br />
tmp.append(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">%</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (j </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #000000">16</span><span style="color: #000000">)<br />
tmp.append(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">0</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
tmp.append(Integer.toString(j, </span><span style="color: #000000">16</span><span style="color: #000000">));<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
tmp.append(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">%u</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
tmp.append(Integer.toString(j, </span><span style="color: #000000">16</span><span style="color: #000000">));<br />
}<br />
}<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> tmp.toString();<br />
}</p>
<p></span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* unescape ===&gt;js<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> src<br />
* </span><span style="color: #808080">@return</span><span style="color: #008000"> String<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> String unescape(String src) {<br />
StringBuffer tmp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> StringBuffer();<br />
tmp.ensureCapacity(src.length());<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> lastPos </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">, pos </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">char</span><span style="color: #000000"> ch;<br />
</span><span style="color: #0000ff">while</span><span style="color: #000000"> (lastPos </span><span style="color: #000000">&lt;</span><span style="color: #000000"> src.length()) {<br />
pos </span><span style="color: #000000">=</span><span style="color: #000000"> src.indexOf(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">%</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, lastPos);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (pos </span><span style="color: #000000">==</span><span style="color: #000000"> lastPos) {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (src.charAt(pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">&#8216;</span><span style="color: #000000">u</span><span style="color: #000000">&#8216;</span><span style="color: #000000">) {<br />
ch </span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">char</span><span style="color: #000000">) Integer.parseInt(src.substring(pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">2</span><span style="color: #000000">, pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">6</span><span style="color: #000000">), </span><span style="color: #000000">16</span><span style="color: #000000">);<br />
tmp.append(ch);<br />
lastPos </span><span style="color: #000000">=</span><span style="color: #000000"> pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">6</span><span style="color: #000000">;<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
ch </span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">char</span><span style="color: #000000">) Integer.parseInt(src.substring(pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">, pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">3</span><span style="color: #000000">), </span><span style="color: #000000">16</span><span style="color: #000000">);<br />
tmp.append(ch);<br />
lastPos </span><span style="color: #000000">=</span><span style="color: #000000"> pos </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">3</span><span style="color: #000000">;<br />
}<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (pos </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) {<br />
tmp.append(src.substring(lastPos));<br />
lastPos </span><span style="color: #000000">=</span><span style="color: #000000"> src.length();<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
tmp.append(src.substring(lastPos, pos));<br />
lastPos </span><span style="color: #000000">=</span><span style="color: #000000"> pos;<br />
}<br />
}<br />
}<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> tmp.toString();<br />
}<br />
}</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/07/03/%e4%b8%a4%e5%88%99%e5%88%87%e5%89%b2%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%9b%e7%94%a8decimalformat%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%ad%97%e7%ac%a6/' rel='bookmark' title='Permanent Link: 两则:切割字符串；用DecimalFormat格式化字符'>两则:切割字符串；用DecimalFormat格式化字符</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/11/09/zthibernate%e5%a4%8d%e5%90%88%e4%b8%bb%e9%94%ae/' rel='bookmark' title='Permanent Link: [zt]hibernate复合主键'>[zt]hibernate复合主键</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>POI的一个bug问题</title>
		<link>http://www.foxlog.org/2006/08/10/poi%e7%9a%84%e4%b8%80%e4%b8%aabug%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.foxlog.org/2006/08/10/poi%e7%9a%84%e4%b8%80%e4%b8%aabug%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Thu, 10 Aug 2006 05:24:15 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/96</guid>
		<description><![CDATA[key words : POI java读取Excel  java.io.IOException Unable to read entire block 版本:2.5.1final 错误提示: java.io.IOException Unable to read entire block 出这个问题具有随机性，有时候没问题，有时候将Excel里的CellType改一下好像就没问题，但也不总是这样，真是莫名其妙. Google了一下是一个bug,重新下载src文件，将RawDataBlock.java文件的RawDataBlock(final InputStream stream)constructor覆盖: public RawDataBlock(final InputStream stream) throws IOException { _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ]; int count = 0; int totalBytesRead = 0; while ((totalBytesRead &#60; POIFSConstants.BIG_BLOCK_SIZE) &#38;&#38; (count != -1)) { count = stream.read(_data, totalBytesRead, POIFSConstants.BIG_BLOCK_SIZE - totalBytesRead); if (count != -1) { totalBytesRead += count; } } if (count == -1) { _eof = true; } else { _eof = false; } if ((totalBytesRead != POIFSConstants.BIG_BLOCK_SIZE) &#38;&#38; (totalBytesRead != 0)) { String type = &#8220; byte&#8220; + ((totalBytesRead == 1) ? (&#8220;&#8221;): (&#8220;s&#8220;)); throw new IOException(&#8220;Unable to read entire block; &#8220; + totalBytesRead + type + &#8220; read; expected &#8220; + POIFSConstants.BIG_BLOCK_SIZE + &#8220;bytes&#8220;); } } 打包: ant jar 重启app，OK! 说明: 主要问题出在 InputStream的read上，原来的实现用ReadFully方法： public static int readFully(InputStream in, byte[] b, int off, int len) throws IOException [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li><li><a href='http://www.foxlog.org/2007/03/28/zt%e6%8f%92%e5%85%a5%e5%9b%be%e7%89%87%e5%88%b0%e6%95%b0%e6%8d%ae%e5%ba%93blob%e5%a4%a7%e5%ad%97%e6%ae%b5%e4%bf%9d%e5%ad%98%e5%af%b9%e8%b1%a1/' rel='bookmark' title='Permanent Link: [zt]插入图片到数据库(BLOB大字段保存对象)'>[zt]插入图片到数据库(BLOB大字段保存对象)</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words : POI java读取Excel  <font face="Verdana, Arial" size="2">java.io.IOException Unable to read entire  block</font></p>
<p>版本:2.5.1final<br />
错误提示:<br />
<font face="Verdana, Arial" size="2">java.io.IOException Unable to read entire  block</p>
<p>出这个问题具有随机性，有时候没问题，有时候将Excel里的CellType改一下好像就没问题，但也不总是这样，真是莫名其妙.</p>
<p>Google了一下是一个bug,重新下载src文件，将RawDataBlock.java文件的RawDataBlock(final  InputStream stream)constructor覆盖:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> RawDataBlock(</span><span style="color: #0000ff">final</span><span style="color: #000000"> InputStream stream) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> IOException<br />
{<br />
_data </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[ POIFSConstants.BIG_BLOCK_SIZE ];<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> count </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> totalBytesRead </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">while</span><span style="color: #000000"> ((totalBytesRead </span><span style="color: #000000">&lt;</span><span style="color: #000000"> POIFSConstants.BIG_BLOCK_SIZE) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br />
(count </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)) {<br />
count </span><span style="color: #000000">=</span><span style="color: #000000"> stream.read(_data, totalBytesRead,<br />
POIFSConstants.BIG_BLOCK_SIZE </span><span style="color: #000000">-</span><span style="color: #000000"> totalBytesRead);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (count </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) {<br />
totalBytesRead </span><span style="color: #000000">+=</span><span style="color: #000000"> count;<br />
}<br />
}<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (count </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) {<br />
_eof </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
_eof </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
}<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> ((totalBytesRead </span><span style="color: #000000">!=</span><span style="color: #000000"> POIFSConstants.BIG_BLOCK_SIZE) </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> (totalBytesRead </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">)) {<br />
String type </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> byte</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> ((totalBytesRead </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) </span><span style="color: #000000">?</span><span style="color: #000000"> (</span><span style="color: #000000">&#8220;&#8221;</span><span style="color: #000000">): (</span><span style="color: #000000">&#8220;</span><span style="color: #000000">s</span><span style="color: #000000">&#8220;</span><span style="color: #000000">));<br />
</span><span style="color: #0000ff">throw</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> IOException(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Unable to read entire block; </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"><br />
totalBytesRead </span><span style="color: #000000">+</span><span style="color: #000000"> type </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> read; expected </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> POIFSConstants.BIG_BLOCK_SIZE </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">bytes</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
}<br />
}</p>
<p></span><br />
打包:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">ant jar</span><br />
重启app，OK!</p>
<p>说明:<br />
主要问题出在  InputStream的read上，原来的实现用ReadFully方法：</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> readFully(InputStream in, </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] b, </span><span style="color: #0000ff">int</span><span style="color: #000000"> off, </span><span style="color: #0000ff">int</span><span style="color: #000000"> len)<br />
</span><span style="color: #0000ff">throws</span><span style="color: #000000"> IOException<br />
{<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> total </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (;;) {<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> got </span><span style="color: #000000">=</span><span style="color: #000000"> in.read(b, off </span><span style="color: #000000">+</span><span style="color: #000000"> total, len </span><span style="color: #000000">-</span><span style="color: #000000"> total);<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (got </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> (total </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> : total;<br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"> {<br />
total </span><span style="color: #000000">+=</span><span style="color: #000000"> got;<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (total </span><span style="color: #000000">==</span><span style="color: #000000"> len)<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> total;<br />
}<br />
}<br />
}</span><br />
InputStream的read不能确保返回的是最大字节数,但是另一个实现却可以:</font><font face="Verdana, Arial" size="2">ByteInputStream<br />
所以，下面的方法也可以修改这个问题:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000"> </span><span style="color: #008000">//</span><span style="color: #008000"> read entire stream into byte array:</span><span style="color: #008000"><br />
</span><span style="color: #000000">    ByteArrayOutputStream byteOS </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ByteArrayOutputStream();<br />
</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">1024</span><span style="color: #000000">];<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> count;<br />
</span><span style="color: #0000ff">while</span><span style="color: #000000"> (count </span><span style="color: #000000">=</span><span style="color: #000000"> inputStream.read(buffer)) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
byteOS.append(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, count);<br />
byteOS.close();<br />
</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] allBytes </span><span style="color: #000000">=</span><span style="color: #000000"> byteOS.betByteArray();</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> create workbook from array:</span><span style="color: #008000"><br />
</span><span style="color: #000000">InputStream byteIS </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ByteArrayInputStream(allBytes);<br />
HSSFWorkbook wb </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> HSSFWorkbook(byteIS);</span><br />
</font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li><li><a href='http://www.foxlog.org/2007/03/28/zt%e6%8f%92%e5%85%a5%e5%9b%be%e7%89%87%e5%88%b0%e6%95%b0%e6%8d%ae%e5%ba%93blob%e5%a4%a7%e5%ad%97%e6%ae%b5%e4%bf%9d%e5%ad%98%e5%af%b9%e8%b1%a1/' rel='bookmark' title='Permanent Link: [zt]插入图片到数据库(BLOB大字段保存对象)'>[zt]插入图片到数据库(BLOB大字段保存对象)</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/08/10/poi%e7%9a%84%e4%b8%80%e4%b8%aabug%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]可编程的热部署问题</title>
		<link>http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Tue, 08 Aug 2006 05:27:08 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/98</guid>
		<description><![CDATA[key words : 热部署 动态读取配置文件 动态读取properties文件 come from here package com.javaeye.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.util.Properties; /** * @author Robbin Fan * */ public class ConfigUtil { private static Properties props = null; private static File configFile = null; private static long fileLastModified = 0L; private static void init() { URL url = ConfigUtil.class.getClassLoader().getResource(&#8220;global.properties&#8220;); configFile = new File(url.getFile()); fileLastModified = configFile.lastModified(); props = new Properties(); load(); } private static void load() { try { props.load(new FileInputStream(configFile)); fileLastModified = configFile.lastModified(); } catch (IOException e) { throw new RuntimeException(e); } } public static String getConfig(String key) { if ((configFile == null) &#124;&#124; (props == null)) init(); if (configFile.lastModified() &#62; fileLastModified) load(); return props.getProperty(key); } } Related posts:用Digester解析xml到bean[zt]hibernate复合主键用开源组件jcaptcha做jsp彩色验证码


Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/' rel='bookmark' title='Permanent Link: 用Digester解析xml到bean'>用Digester解析xml到bean</a></li><li><a href='http://www.foxlog.org/2006/11/09/zthibernate%e5%a4%8d%e5%90%88%e4%b8%bb%e9%94%ae/' rel='bookmark' title='Permanent Link: [zt]hibernate复合主键'>[zt]hibernate复合主键</a></li><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">key words : 热部署 动态读取配置文件 动态读取properties文件</p>
<p>come from  <a href="http://forum.javaeye.com/viewtopic.php?t=10993">here</a></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">package</span><span style="color: #000000"> com.javaeye.util;</p>
<p></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.File;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.FileInputStream;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.IOException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.net.URL;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Properties;</p>
<p></span><span style="color: #008000">/**</span><span style="color: #008000"><br />
* </span><span style="color: #808080">@author</span><span style="color: #008000"> Robbin Fan<br />
*<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> ConfigUtil {</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> Properties props </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> File configFile </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> fileLastModified </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0L</span><span style="color: #000000">;</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> init() {<br />
URL url </span><span style="color: #000000">=</span><span style="color: #000000"> ConfigUtil.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getClassLoader().getResource(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">global.properties</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
configFile </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(url.getFile());<br />
fileLastModified </span><span style="color: #000000">=</span><span style="color: #000000"> configFile.lastModified();<br />
props </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Properties();<br />
load();<br />
}</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> load() {<br />
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
props.load(</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(configFile));<br />
fileLastModified </span><span style="color: #000000">=</span><span style="color: #000000"> configFile.lastModified();<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException e) {<br />
</span><span style="color: #0000ff">throw</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> RuntimeException(e);<br />
}<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> String getConfig(String key) {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> ((configFile </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) </span><span style="color: #000000">||</span><span style="color: #000000"> (props </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">)) init();<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (configFile.lastModified() </span><span style="color: #000000">&gt;</span><span style="color: #000000"> fileLastModified) load();<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> props.getProperty(key);<br />
}</p>
<p>}<br />
</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/06/%e7%94%a8digester%e8%a7%a3%e6%9e%90xml%e5%88%b0bean/' rel='bookmark' title='Permanent Link: 用Digester解析xml到bean'>用Digester解析xml到bean</a></li><li><a href='http://www.foxlog.org/2006/11/09/zthibernate%e5%a4%8d%e5%90%88%e4%b8%bb%e9%94%ae/' rel='bookmark' title='Permanent Link: [zt]hibernate复合主键'>[zt]hibernate复合主键</a></li><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>两则:切割字符串；用DecimalFormat格式化字符</title>
		<link>http://www.foxlog.org/2006/07/03/%e4%b8%a4%e5%88%99%e5%88%87%e5%89%b2%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%9b%e7%94%a8decimalformat%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%ad%97%e7%ac%a6/</link>
		<comments>http://www.foxlog.org/2006/07/03/%e4%b8%a4%e5%88%99%e5%88%87%e5%89%b2%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%9b%e7%94%a8decimalformat%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%ad%97%e7%ac%a6/#comments</comments>
		<pubDate>Mon, 03 Jul 2006 05:59:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/109</guid>
		<description><![CDATA[key words: 切割字符串 切割中文字符 DecimalFormat 格式化字符 科学计数法 一.切割字符串的前几个字符 在首页，有时候会因为table列表里的某个内容比较长而使得页面撑得很难看，一般做法就是截取前几个字符 /** * 截取前几个字符串 * @param src  被截取的字符 * @param num  截取的长度 * @param append 附加的字符 * @return String */ public static String splitStr(String src, int num, String append) { if (null == src &#124;&#124; num &#60; 0) return &#8220;&#8221;; if (src.length() &#60; num) return src; char[] rtnChar = src.toCharArray(); StringBuffer sb = new StringBuffer(); for (int i = 0; i &#60; num; i++) { sb.append(rtnChar[i]); } sb.append(append); return sb.toString(); } toCharArray会把一个汉字当作一个char(java中一个char两个字节) 二.用DecimalFormat格式化字符 这次用POI读取Excel碰到的一个问题，即，如果Excel里的格式不同，比如同样的20060623，有可能是字符型的格式，也可能是普通数字型的，而且在数字型的时候如果比较长会给你返回科学计数法的格式,如:2.002623E7,而这个不是我希望出现的，所以后来只好碰到这种格式的就自己给转换一下: if (null != row.getCell((short) i)) { switch (row.getCell((short) i).getCellType()) { case HSSFCell.CELL_TYPE_FORMULA : strExcelLine[i] = &#8220;FORMULA &#8220;; break; case HSSFCell.CELL_TYPE_NUMERIC : strExcelLine[i] = String.valueOf(row.getCell((short) i).getNumericCellValue()); break; case HSSFCell.CELL_TYPE_STRING : strExcelLine[i] = row.getCell((short) i).getStringCellValue(); break; case HSSFCell.CELL_TYPE_BLANK : strExcelLine[i] = &#8220;&#8221;; break; default : strExcelLine[i] = &#8220;&#8221;; break; } //如果读取的是科学计数法的格式，则转换为普通格式 //added by Alex at 20060626                     if(null != strExcelLine[i] &#38;&#38; strExcelLine[i].indexOf(&#8220;.&#8220;) != -1 &#38;&#38; strExcelLine[i].indexOf(&#8220;E&#8220;) != -1){ [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li><li><a href='http://www.foxlog.org/2006/07/21/zt%e8%87%aa%e5%8a%a8%e4%bb%a3%e7%90%86%e8%84%9a%e6%9c%ac%e7%9a%84%e5%87%bd%e6%95%b0%e8%af%b4%e6%98%8e%e4%b8%8e%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: [zt]自动代理脚本的函数说明与应用'>[zt]自动代理脚本的函数说明与应用</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words: 切割字符串 切割中文字符 DecimalFormat 格式化字符  科学计数法</p>
<p><strong>一.切割字符串的前几个字符</strong><br />
在首页，有时候会因为table列表里的某个内容比较长而使得页面撑得很难看，一般做法就是截取前几个字符</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #008000">/**</span><span style="color: #008000"><br />
* 截取前几个字符串<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> src  被截取的字符<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> num  截取的长度<br />
* </span><span style="color: #808080">@param</span><span style="color: #008000"> append 附加的字符<br />
* </span><span style="color: #808080">@return</span><span style="color: #008000"> String<br />
</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> String splitStr(String src, </span><span style="color: #0000ff">int</span><span style="color: #000000"> num, String append) {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">==</span><span style="color: #000000"> src </span><span style="color: #000000">||</span><span style="color: #000000"> num </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;&#8221;</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (src.length() </span><span style="color: #000000">&lt;</span><span style="color: #000000"> num) </span><span style="color: #0000ff">return</span><span style="color: #000000"> src;<br />
</span><span style="color: #0000ff">char</span><span style="color: #000000">[] rtnChar </span><span style="color: #000000">=</span><span style="color: #000000"> src.toCharArray();<br />
StringBuffer sb </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> StringBuffer();<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> num; i</span><span style="color: #000000">++</span><span style="color: #000000">) {<br />
sb.append(rtnChar[i]);<br />
}<br />
sb.append(append);<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> sb.toString();<br />
}</span><br />
<em><strong>toCharArray会把一个汉字当作一个char(java中一个char两个字节)</strong></em></p>
<p><strong>二.用DecimalFormat格式化字符</strong><br />
这次用POI读取Excel碰到的一个问题，即，如果Excel里的格式不同，比如同样的20060623，有可能是字符型的格式，也可能是普通数字型的，而且在数字型的时候如果比较长会给你返回科学计数法的格式,如:2.002623E7,而这个不是我希望出现的，所以后来只好碰到这种格式的就自己给转换一下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> row.getCell((</span><span style="color: #0000ff">short</span><span style="color: #000000">) i)) {<br />
</span><span style="color: #0000ff">switch</span><span style="color: #000000"> (row.getCell((</span><span style="color: #0000ff">short</span><span style="color: #000000">) i).getCellType()) {<br />
</span><span style="color: #0000ff">case</span><span style="color: #000000"> HSSFCell.CELL_TYPE_FORMULA :<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">FORMULA </span><span style="color: #000000">&#8220;</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">case</span><span style="color: #000000"> HSSFCell.CELL_TYPE_NUMERIC :<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> String.valueOf(row.getCell((</span><span style="color: #0000ff">short</span><span style="color: #000000">) i).getNumericCellValue());<br />
</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">case</span><span style="color: #000000"> HSSFCell.CELL_TYPE_STRING :<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> row.getCell((</span><span style="color: #0000ff">short</span><span style="color: #000000">) i).getStringCellValue();<br />
</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">case</span><span style="color: #000000"> HSSFCell.CELL_TYPE_BLANK :<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;&#8221;</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">default</span><span style="color: #000000"> :<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;&#8221;</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
}<br />
</span><span style="color: #008000">//</span><span style="color: #008000">如果读取的是科学计数法的格式，则转换为普通格式<br />
</span><span style="color: #008000">//</span><span style="color: #008000">added by  Alex at 20060626</span><span style="color: #008000"><br />
</span><span style="color: #000000">                    </span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> strExcelLine[i] </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br />
strExcelLine[i].indexOf(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">.</span><span style="color: #000000">&#8220;</span><span style="color: #000000">) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br />
strExcelLine[i].indexOf(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">E</span><span style="color: #000000">&#8220;</span><span style="color: #000000">) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">){<br />
DecimalFormat df </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat();<br />
strExcelLine[i] </span><span style="color: #000000">=</span><span style="color: #000000"> df.parse(strExcelLine[i]).toString();<br />
}<br />
}</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li><li><a href='http://www.foxlog.org/2006/07/21/zt%e8%87%aa%e5%8a%a8%e4%bb%a3%e7%90%86%e8%84%9a%e6%9c%ac%e7%9a%84%e5%87%bd%e6%95%b0%e8%af%b4%e6%98%8e%e4%b8%8e%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: [zt]自动代理脚本的函数说明与应用'>[zt]自动代理脚本的函数说明与应用</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/07/03/%e4%b8%a4%e5%88%99%e5%88%87%e5%89%b2%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%9b%e7%94%a8decimalformat%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%ad%97%e7%ac%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jsp实现文件下载与中文文件名乱码问题解决</title>
		<link>http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/</link>
		<comments>http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/#comments</comments>
		<pubDate>Wed, 14 Jun 2006 06:04:36 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/112</guid>
		<description><![CDATA[key words: jsp文件下载 中文乱码 文件名乱码 文件上传参看: 这里 碰到文件乱码，google了一下，发现这篇文章还不赖 摘录如下: 之前,写过一个Download.jsp文件,可以解决下载文件乱码问题(诸如:DOC,XSL文件等等). 后来发现,遇到中文名的文件的时候,文件下载将会报错~~~~ 今天,通过改写原Download.jsp文件已经彻底解决了这个问题~ 现在,把一整套的文件上传下载的方法给贴出来~~~以便大家借鉴!~!~!~!~! 作者:古埃及法老 download.jsp文件 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#60;% java.io.BufferedInputStream bis=null; java.io.BufferedOutputStream  bos=null; try{ String filename=request.getParameter(&#8220;filename&#8220;); filename=new String(filename.getBytes(&#8220;iso8859-1&#8220;),&#8220;gb2312&#8220;); response.setContentType(&#8220;application/x-msdownload&#8220;); response.setHeader(&#8220;Content-disposition&#8220;,&#8220;attachment; filename=&#8220;+new String(filename.getBytes(&#8220;gb2312&#8220;),&#8220;iso8859-1&#8220;)); bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath(&#8220;files/&#8220; + filename))); bos=new java.io.BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff,0,bytesRead); } } catch(Exception e){ e.printStackTrace(); } finally { if (bis != null)bis.close(); if (bos != null)bos.close(); } %&#62;  注意，关键就是setHeader里的filename需要重新编码,格式是ISO-8859-1就ＯＫ了 以下是我自己项目中用到的代码片断，供参考: list.jsp: 显示附件名称的页面 &#60;tr&#62; &#60;td height=&#8221;25&#8243; class=&#8221;tdcor&#8221;&#62;附&#38;nbsp;&#38;nbsp;件&#38;nbsp;&#60;/td&#62; &#60;td colspan=&#8221;3&#8243; height=50&#62; &#60;% if (null != publish.getAttatchFilename() &#38;&#38; publish.getAttatchFilename().length() &#62; 0) { %&#62; &#60;a href=&#8221;publish_do.jsp?method=download&#38;fileName= &#60;%=URLEncoder.encode(publish.getAttatchFilename(),&#8221;GBK&#8221;)%&#62;&#8220;&#62; &#60;%=URLDecoder.decode(publish.getAttatchFilename(),&#8220;GBK&#8220;)%&#62;&#60;/a&#62; &#60;% [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2007/08/18/%e4%bb%8e%e6%95%b0%e6%8d%ae%e5%ba%93%e5%af%bc%e5%87%ba%e5%a4%a7%e6%95%b0%e6%8d%ae%e9%87%8f%e7%9a%84%e6%96%87%e4%bb%b6%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/' rel='bookmark' title='Permanent Link: 从数据库导出大数据量的文件的解决方案'>从数据库导出大数据量的文件的解决方案</a></li><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words: jsp文件下载 中文乱码 文件名乱码</p>
<p>文件上传参看: <a href="/alex/archive/2006/05/22/47528.html">这里</a></p>
<p>碰到文件乱码，google了一下，发现<a href="http://duduwolf.360doc.com/showWeb/0/0/17613.aspx">这篇文章</a>还不赖</p>
<p>摘录如下:</p>
<p>之前,写过一个Download.jsp文件,可以解决下载文件乱码问题(诸如:DOC,XSL文件等等).<br />
后来发现,遇到中文名的文件的时候,文件下载将会报错~~~~<br />
今天,通过改写原Download.jsp文件已经彻底解决了这个问题~<br />
现在,把一整套的文件上传下载的方法给贴出来~~~以便大家借鉴!~!~!~!~!<br />
作者:古埃及法老</p>
<p><strong><em>download.jsp文件</em></strong><br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5"><br />
java.io.BufferedInputStream bis</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">;<br />
java.io.BufferedOutputStream  bos</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">;<br />
try{<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5"> filename</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">request.getParameter(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">filename</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);<br />
filename</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">(filename.getBytes(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">iso8859-1</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">),</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">gb2312</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);<br />
response.setContentType(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">application/x-msdownload</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);<br />
response.setHeader(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">Content-disposition</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">,</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">attachment; filename=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">(filename.getBytes(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">gb2312</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">),</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">iso8859-1</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">));<br />
bis </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> java.io.BufferedInputStream(</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> java.io.FileInputStream(config.getServletContext().getRealPath(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">files/</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5"> filename)));<br />
bos</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> java.io.BufferedOutputStream(response.getOutputStream());<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">byte</span><span style="color: #000000; background-color: #f5f5f5">[] buff </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">byte</span><span style="color: #000000; background-color: #f5f5f5">[</span><span style="color: #000000; background-color: #f5f5f5">2048</span><span style="color: #000000; background-color: #f5f5f5">];<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">int</span><span style="color: #000000; background-color: #f5f5f5"> bytesRead;<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">while</span><span style="color: #000000; background-color: #f5f5f5">(</span><span style="color: #000000; background-color: #f5f5f5">-</span><span style="color: #000000; background-color: #f5f5f5">1</span><span style="color: #000000; background-color: #f5f5f5"> !</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> (bytesRead </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> bis.read(buff, </span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">, buff.length))) {<br />
bos.write(buff,</span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">,bytesRead);<br />
}<br />
}<br />
catch(Exception e){<br />
e.printStackTrace();<br />
}<br />
finally {<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5"> (bis !</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)bis.close();<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5"> (bos !</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)bos.close();<br />
}<br />
</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"> </span></p>
<p>注意，关键就是<span style="color: #000000; background-color: #f5f5f5">setHeader里的</span><span style="color: #000000; background-color: #f5f5f5">filename需要重新编码,格式是ISO-8859-1就ＯＫ了</p>
<p>以下是我自己项目中用到的代码片断，供参考:</p>
<p>list.jsp:  显示附件名称的页面</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td </span><span style="color: #ff0000">height</span><span style="color: #0000ff">=&#8221;25&#8243;</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">=&#8221;tdcor&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">附</span><span style="color: #ff0000">&amp;nbsp;&amp;nbsp;</span><span style="color: #000000">件</span><span style="color: #ff0000">&amp;nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td </span><span style="color: #ff0000">colspan</span><span style="color: #0000ff">=&#8221;3&#8243;</span><span style="color: #ff0000"> height</span><span style="color: #0000ff">=50</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5"> (</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5"> !</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> publish.getAttatchFilename() </span><span style="color: #000000; background-color: #f5f5f5">&amp;&amp;</span><span style="color: #000000; background-color: #f5f5f5"><br />
publish.getAttatchFilename().length() </span><span style="color: #000000; background-color: #f5f5f5">&gt;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">0</span><span style="color: #000000; background-color: #f5f5f5">) {<br />
</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a </span><span style="color: #ff0000">href</span><span style="color: #0000ff">=&#8221;publish_do.jsp?method=download&amp;fileName=<br />
&lt;%=URLEncoder.encode(publish.getAttatchFilename(),&#8221;</span><span style="color: #ff0000">GBK&#8221;)%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&#8220;&gt;</span><span style="color: #000000; background-color: #ffff00"><br />
&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">URLDecoder.decode(publish.getAttatchFilename(),</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">GBK</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">)</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5"><br />
}<br />
</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><br />
download.jsp:下载页面</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> method </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> method.equals(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">download</span><span style="color: #000000">&#8220;</span><span style="color: #000000">)) {</span><span style="color: #008000">//</span><span style="color: #008000">下载附件</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
String fileName </span><span style="color: #000000">=</span><span style="color: #000000"> request.getParameter(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">fileName</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);</span><span style="color: #000000"></span><span style="color: #000000"><br />
File file </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(Constants.PUBLISH_FILE_PATH </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">/</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> URLDecoder.decode(fileName,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">GBK</span><span style="color: #000000">&#8220;</span><span style="color: #000000">));<br />
response.reset();<br />
response.setContentType(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">application/octet-stream; charset=GBK</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
response.addHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Content-Disposition</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">attachment; filename=</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> CourseDetailBusiness.transfer(URLDecoder.decode(fileName,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">GBK</span><span style="color: #000000">&#8220;</span><span style="color: #000000">),</span><span style="color: #000000">&#8220;</span><span style="color: #000000">GBK</span><span style="color: #000000">&#8220;</span><span style="color: #000000">,</span><span style="color: #000000">&#8220;</span><span style="color: #000000">ISO-8859-1</span><span style="color: #000000">&#8220;</span><span style="color: #000000">));<br />
response.setContentLength((</span><span style="color: #0000ff">int</span><span style="color: #000000">) file.length());</p>
<p></span><span style="color: #0000ff">byte</span><span style="color: #000000">[] buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">4096</span><span style="color: #000000">];<br />
BufferedOutputStream output </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
BufferedInputStream input </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> 写缓冲区：</span><span style="color: #008000"><br />
</span><span style="color: #000000">        </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
output </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BufferedOutputStream(response.getOutputStream());<br />
input </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BufferedInputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(file));</p>
<p></span><span style="color: #0000ff">int</span><span style="color: #000000"> n </span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">while</span><span style="color: #000000"> ((n </span><span style="color: #000000">=</span><span style="color: #000000"> input.read(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, </span><span style="color: #000000">4096</span><span style="color: #000000">)) </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) {<br />
output.write(buffer, </span><span style="color: #000000">0</span><span style="color: #000000">, n);<br />
}<br />
response.flushBuffer();<br />
}<br />
</span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) {<br />
} </span><span style="color: #008000">//</span><span style="color: #008000"> maybe user cancelled download</span><span style="color: #008000"><br />
</span><span style="color: #000000">        </span><span style="color: #0000ff">finally</span><span style="color: #000000"> {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (input </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) input.close();<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (output </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) output.close();<br />
}</span></p>
<p>说明:<br />
１。文件名在数据库中保存的编码为URLEncode<br />
2.在list.jsp显示的时候多了一次encode,不知为什么，不encode一次还不行，实际上是第二次编码了</p>
<p></span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2007/08/18/%e4%bb%8e%e6%95%b0%e6%8d%ae%e5%ba%93%e5%af%bc%e5%87%ba%e5%a4%a7%e6%95%b0%e6%8d%ae%e9%87%8f%e7%9a%84%e6%96%87%e4%bb%b6%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/' rel='bookmark' title='Permanent Link: 从数据库导出大数据量的文件的解决方案'>从数据库导出大数据量的文件的解决方案</a></li><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HttpClient通过ldap验证</title>
		<link>http://www.foxlog.org/2006/06/11/httpclient%e9%80%9a%e8%bf%87ldap%e9%aa%8c%e8%af%81/</link>
		<comments>http://www.foxlog.org/2006/06/11/httpclient%e9%80%9a%e8%bf%87ldap%e9%aa%8c%e8%af%81/#comments</comments>
		<pubDate>Sun, 11 Jun 2006 06:08:20 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/115</guid>
		<description><![CDATA[key words: HttpClient LDAP LDAP验证 LDAP目前应用得非常广泛，在企业环境里可以供各种应用统一用户验证数据。 以下是一个客户端在正常访问的时候插入验证代码，将用户提交的用户名和密码提交给ldap验证 HttpClient hc = new HttpClient(); GetMethod method = new GetMethod(&#8220;http://www.yoursite.com/auth/your_auth.html&#8220;); String inputUserName = JOptionPane.showInputDialog(&#8220;Input your User Name:&#8220;); String inputPassWord = JOptionPane.showInputDialog(&#8220;Input your password:&#8220;); UsernamePasswordCredentials upc = new UsernamePasswordCredentials(inputUserName, inputPassWord); hc.getState().setCredentials(null, null, upc); int status = hc.executeMethod(method); method.releaseConnection(); if(status == 200) { System.out.println(&#8220;login successful!&#8220;); //do your business things } else { System.out.println(&#8220;Login failed!  Please check your userName and Password!&#8220;); } http://www.yoursite.com/auth/your_auth.html如果直接访问会弹出对话框让你输入用户名密码 Related posts:文件上传:用O’Reilly公司的cos实现文件上传jsp实现文件下载与中文文件名乱码问题解决


Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words: HttpClient LDAP  LDAP验证</p>
<p>LDAP目前应用得非常广泛，在企业环境里可以供各种应用统一用户验证数据。</p>
<p>以下是一个客户端在正常访问的时候插入验证代码，将用户提交的用户名和密码提交给ldap验证</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">HttpClient hc </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> HttpClient();<br />
GetMethod method </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> GetMethod(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">http://www.yoursite.com/auth/your_auth.html</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
String inputUserName </span><span style="color: #000000">=</span><span style="color: #000000"> JOptionPane.showInputDialog(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Input your User Name:</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
String inputPassWord </span><span style="color: #000000">=</span><span style="color: #000000"> JOptionPane.showInputDialog(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Input your password:</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
UsernamePasswordCredentials upc </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> UsernamePasswordCredentials(inputUserName, inputPassWord);<br />
hc.getState().setCredentials(</span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">null</span><span style="color: #000000">, upc);<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> status </span><span style="color: #000000">=</span><span style="color: #000000"> hc.executeMethod(method);<br />
method.releaseConnection();<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000">(status </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">200</span><span style="color: #000000">)<br />
{<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">login successful!</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
//do your business  things</span><span style="color: #000000"><br />
} </span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
{<br />
System.out.println(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Login failed!  Please check your userName and Password!</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
}</span></p>
<p><span style="color: #000000"></span><u><span style="color: #000000">http://www.yoursite.com/auth/your_auth.html如果直接访问会弹出对话框让你输入用户名密码<br />
</span></u></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/' rel='bookmark' title='Permanent Link: 文件上传:用O’Reilly公司的cos实现文件上传'>文件上传:用O’Reilly公司的cos实现文件上传</a></li><li><a href='http://www.foxlog.org/2006/06/14/jsp%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e4%b8%8e%e4%b8%ad%e6%96%87%e6%96%87%e4%bb%b6%e5%90%8d%e4%b9%b1%e7%a0%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/' rel='bookmark' title='Permanent Link: jsp实现文件下载与中文文件名乱码问题解决'>jsp实现文件下载与中文文件名乱码问题解决</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/06/11/httpclient%e9%80%9a%e8%bf%87ldap%e9%aa%8c%e8%af%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用开源组件jcaptcha做jsp彩色验证码</title>
		<link>http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/</link>
		<comments>http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/#comments</comments>
		<pubDate>Sun, 11 Jun 2006 06:07:34 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/114</guid>
		<description><![CDATA[key words: jsp验证码 jcaptcha 原文参考 这里 安装 Add jcaptcha-all.jar (provided in bin-distribution) and ehcache.jar (not provided see ehcache site) to your application class path, ie in you WEB-INF/lib folder. 实例一个jcaptcha服务，注意，必须是单例模式的 import com.octo.captcha.service.image.ImageCaptchaService; import com.octo.captcha.service.image.DefaultManageableImageCaptchaService; public class CaptchaServiceSingleton { private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService(); public static ImageCaptchaService getInstance(){ return instance; } } 注:以上是默认的一个实现，下面是其他更多的实现 SimpleListSoundCaptchaEngine   //还可以用声音，真爽哦 SpellerSoundCaptchaEngine SpellerSoundCaptchaEngine DefaultGimpyEngineCaptcha BaffleListGimpyEngineCaptcha BasicListGimpyEngineCaptcha DeformedBaffleListGimpyEngineCaptcha DoubleRandomListGimpyEngineCaptcha SimpleListImageCaptchaEngineCaptcha SimpleFishEyeEngineCaptcha 具体请参考官方说明 编写一个产生图片的servlet import com.octo.captcha.service.CaptchaServiceException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2007/03/29/ztresponsecontenttype-%e8%af%a6%e7%bb%86%e5%88%97%e8%a1%a8/' rel='bookmark' title='Permanent Link: [zt]Response.ContentType 详细列表'>[zt]Response.ContentType 详细列表</a></li><li><a href='http://www.foxlog.org/2006/12/11/jstl%e6%a0%87%e7%ad%be%e6%b3%a8%e6%84%8f%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: jstl标签注意问题'>jstl标签注意问题</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>key words: jsp验证码 jcaptcha</p>
<p>原文参考 <a href="http://forge.octo.com/jcaptcha/confluence/display/general/5+minutes+application+integration+tutorial">这里</a></p>
<p><strong>安装</strong></p>
<p>Add  jcaptcha-all.jar (provided in <span class="nobr"><a href="http://prdownloads.sourceforge.net/jcaptcha/jcaptcha-bin-1.0-RC2.0.1.zip?download" title="Visit page outside Confluence" rel="nofollow">bin-distribution<sup><img src="http://forge.octo.com/jcaptcha/confluence/images/icons/linkext7.gif" class="rendericon" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>) and ehcache.jar (not  provided see <span class="nobr"><a href="http://ehcache.sourceforge.net/" title="Visit page outside Confluence" rel="nofollow">ehcache site<sup><img src="http://forge.octo.com/jcaptcha/confluence/images/icons/linkext7.gif" class="rendericon" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>) to your application class  path, ie in you WEB-INF/lib folder.</p>
<p><strong>实例一个jcaptcha服务，注意，必须是单例模式的</strong></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">import</span><span style="color: #000000"> com.octo.captcha.service.image.ImageCaptchaService;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> com.octo.captcha.service.image.DefaultManageableImageCaptchaService;</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> CaptchaServiceSingleton {</p>
<p></span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> ImageCaptchaService instance </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> DefaultManageableImageCaptchaService();</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> ImageCaptchaService getInstance(){<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> instance;<br />
}<br />
}</span><br />
注:以上是默认的一个实现，下面是其他更多的实现</p>
<ul>
<li>SimpleListSoundCaptchaEngine   //还可以用声音，真爽哦</li>
<li>SpellerSoundCaptchaEngine</li>
<li>SpellerSoundCaptchaEngine</li>
<li>DefaultGimpyEngineCaptcha</li>
<li>BaffleListGimpyEngineCaptcha</li>
<li>BasicListGimpyEngineCaptcha</li>
<li>DeformedBaffleListGimpyEngineCaptcha</li>
<li>DoubleRandomListGimpyEngineCaptcha</li>
<li>SimpleListImageCaptchaEngineCaptcha</li>
<li>SimpleFishEyeEngineCaptcha</li>
</ul>
<p>具体请参考<a href="http://jcaptcha.sourceforge.net/">官方说明</a></p>
<p><strong>编写一个产生图片的servlet</strong></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">import</span><span style="color: #000000"> com.octo.captcha.service.CaptchaServiceException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> com.sun.image.codec.jpeg.JPEGCodec;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> com.sun.image.codec.jpeg.JPEGImageEncoder;</p>
<p></span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.ServletConfig;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.ServletException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.ServletOutputStream;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServlet;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletResponse;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.awt.image.BufferedImage;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.ByteArrayOutputStream;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.IOException;</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> ImageCaptchaServlet </span><span style="color: #0000ff">extends</span><span style="color: #000000"> HttpServlet {</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> init(ServletConfig servletConfig) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> ServletException {</p>
<p></span><span style="color: #0000ff">super</span><span style="color: #000000">.init(servletConfig);</p>
<p>}</p>
<p></span><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> ServletException, IOException {</p>
<p></span><span style="color: #0000ff">byte</span><span style="color: #000000">[] captchaChallengeAsJpeg </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> the output stream to render the captcha image as jpeg into</span><span style="color: #008000"><br />
</span><span style="color: #000000">        ByteArrayOutputStream jpegOutputStream </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ByteArrayOutputStream();<br />
</span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> get the session id that will identify the generated captcha.<br />
</span><span style="color: #008000">//</span><span style="color: #008000">the same id must be used to validate the response, the session id is a good candidate!</span><span style="color: #008000"><br />
</span><span style="color: #000000">        String captchaId </span><span style="color: #000000">=</span><span style="color: #000000"> httpServletRequest.getSession().getId();<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> call the ImageCaptchaService getChallenge method</span><span style="color: #008000"><br />
</span><span style="color: #000000">            BufferedImage challenge </span><span style="color: #000000">=</span><span style="color: #000000"><br />
CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,<br />
httpServletRequest.getLocale());</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> a jpeg encoder</span><span style="color: #008000"><br />
</span><span style="color: #000000">            JPEGImageEncoder jpegEncoder </span><span style="color: #000000">=</span><span style="color: #000000"><br />
JPEGCodec.createJPEGEncoder(jpegOutputStream);<br />
jpegEncoder.encode(challenge);<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IllegalArgumentException e) {<br />
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (CaptchaServiceException e) {<br />
httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
}</p>
<p>captchaChallengeAsJpeg </span><span style="color: #000000">=</span><span style="color: #000000"> jpegOutputStream.toByteArray();</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000"> flush it in the response</span><span style="color: #008000"><br />
</span><span style="color: #000000">        httpServletResponse.setHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">no-store</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
httpServletResponse.setHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Pragma</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">&#8220;</span><span style="color: #000000">no-cache</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
httpServletResponse.setDateHeader(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">Expires</span><span style="color: #000000">&#8220;</span><span style="color: #000000">, </span><span style="color: #000000">0</span><span style="color: #000000">);<br />
httpServletResponse.setContentType(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">image/jpeg</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
ServletOutputStream responseOutputStream </span><span style="color: #000000">=</span><span style="color: #000000"><br />
httpServletResponse.getOutputStream();<br />
responseOutputStream.write(captchaChallengeAsJpeg);<br />
responseOutputStream.flush();<br />
responseOutputStream.close();<br />
}<br />
}</span></p>
<p><strong>为servlet修改web.xml配置文件</strong></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jcaptcha</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">ImageCaptchaServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jcaptcha</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/jcaptcha</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><br />
<strong>编写你的客户端的展示</strong></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">img </span><span style="color: #ff0000">src</span><span style="color: #0000ff">=&#8221;jcaptcha&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">=&#8217;text&#8217; </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8217;j_captcha_response&#8217; </span><span style="color: #ff0000">value</span><span style="color: #0000ff">=&#8221;</span><span style="color: #0000ff">&gt;</span><br />
上面的src=&#8221;jcaptcha&#8221;   就是调用了上面的servlet,text里是用户填写的确认验证码</p>
<p><strong>后台逻辑验证</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">Boolean isResponseCorrect </span><span style="color: #000000">=</span><span style="color: #000000">Boolean.FALSE;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">remenber that we need an id to validate!</span><span style="color: #008000"><br />
</span><span style="color: #000000">           String captchaId </span><span style="color: #000000">=</span><span style="color: #000000"> httpServletRequest.getSession().getId();<br />
</span><span style="color: #008000">//</span><span style="color: #008000">retrieve the response</span><span style="color: #008000"><br />
</span><span style="color: #000000">           String response </span><span style="color: #000000">=</span><span style="color: #000000"> httpServletRequest.getParameter(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">j_captcha_response</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #008000">//</span><span style="color: #008000"> Call the Service method</span><span style="color: #008000"><br />
</span><span style="color: #000000">            </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br />
isResponseCorrect </span><span style="color: #000000">=</span><span style="color: #000000"> CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,<br />
response);<br />
} </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (CaptchaServiceException e) {<br />
</span><span style="color: #008000">//</span><span style="color: #008000">should not happen, may be thrown if the id is not valid </span><span style="color: #008000"><br />
</span><span style="color: #000000">            }</span></p>
<p>OK,大功告成了.<br />
</strong></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2007/03/29/ztresponsecontenttype-%e8%af%a6%e7%bb%86%e5%88%97%e8%a1%a8/' rel='bookmark' title='Permanent Link: [zt]Response.ContentType 详细列表'>[zt]Response.ContentType 详细列表</a></li><li><a href='http://www.foxlog.org/2006/12/11/jstl%e6%a0%87%e7%ad%be%e6%b3%a8%e6%84%8f%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: jstl标签注意问题'>jstl标签注意问题</a></li><li><a href='http://www.foxlog.org/2006/07/05/108/' rel='bookmark' title='Permanent Link: '></a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javamail整理</title>
		<link>http://www.foxlog.org/2006/05/23/javamail%e6%95%b4%e7%90%86/</link>
		<comments>http://www.foxlog.org/2006/05/23/javamail%e6%95%b4%e7%90%86/#comments</comments>
		<pubDate>Tue, 23 May 2006 06:13:27 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/119</guid>
		<description><![CDATA[kew words: javamail 这几天项目里涉及到javamail,顺便看了下. 现在都习惯在blogjava上搜索一番了  XXX in site:blogjava.net是我常用的搜索方式了,呵呵,大多数时候发现blogjava没让我失望,也说明这里的高手很多啊 感觉 Bromon的两篇文章很实用: JavaMail使用指南(一) 和 Javamail使用指南(二) 还有 morcble的 javamail发送邮件 和 javamail接受邮件 在测试的时候有几个问题值得一提: 第一就是一定要加上activation.jar 库文件,否则会报下面的异常: NoClassDefFoundError: javax/activation/DataSource 另外,发现用yahoo的smtp会报535的验证错误,把验证的方式换为morcble的下面的内部类的方式验证也不行: Session session = Session.getDefaultInstance(props, new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(mymail.username, mymail.password); } }); 最后换了个smtp服务器没问题,不知道各位兄弟有没有碰到这样的问题,可以确认的是我的yahoo配置信息应该是正确的,因为我用foxmail收发信件都是可以的. 后来到yahoo中国里面看了一下帮助,里面说 我们目前正在对雅虎邮箱该项服务进行相关的调整，因此我们暂时停止了在页面上POP服务设置的相关介绍。目前雅虎邮箱暂时不提供POP服务，敬请关注雅虎邮箱的近期活动。 应该就是这个原因了   另外,还有一些基于javamail封装的工具类: 可以参考这篇 :  简化JavaMail：小巧 Jakarta Commons-Email 简单教程 Related posts:关于Facade的应用[zt]关于commons logging[zt]可编程的热部署问题


Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li><li><a href='http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: [zt]可编程的热部署问题'>[zt]可编程的热部署问题</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>kew words: javamail</p>
<p>这几天项目里涉及到javamail,顺便看了下.</p>
<p>现在都习惯在blogjava上搜索一番了   XXX in site:blogjava.net是我常用的搜索方式了,呵呵,大多数时候发现blogjava没让我失望,也说明这里的高手很多啊  <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>感觉 Bromon的两篇文章很实用:<br />
<a href="http://www.foxlog.org/bromon/archive/2005/03/28/2536.html" class="postTitle2" id="viewpost1_TitleUrl">JavaMail使用指南(一)</a> 和 <a href="http://www.foxlog.org/bromon/archive/2005/03/28/2537.html" class="postTitle2" id="viewpost1_TitleUrl">Javamail使用指南(二)</a></p>
<p>还有  morcble的 <a href="/fengliangjun/articles/5652.html">javamail发送邮件</a> 和 <a href="/fengliangjun/articles/5740.html">javamail接受邮件  </a></p>
<p>在测试的时候有几个问题值得一提:</p>
<ul>
<li>第一就是一定要加上activation.jar 库文件,否则会报下面的异常:</li>
</ul>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">NoClassDefFoundError: javax</span><span style="color: #000000">/</span><span style="color: #000000">activation</span><span style="color: #000000">/</span><span style="color: #000000">DataSource</span></p>
<ul>
<li>另外,发现用yahoo的smtp会报535的验证错误,把验证的方式换为morcble的下面的内部类的方式验证也不行:</li>
</ul>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">Session session </span><span style="color: #000000">=</span><span style="color: #000000"> Session.getDefaultInstance(props,<br />
</span><span style="color: #0000ff">new</span><span style="color: #000000"> Authenticator() {<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000"> PasswordAuthentication getPasswordAuthentication() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> PasswordAuthentication(mymail.username,<br />
mymail.password);<br />
}<br />
});</span><br />
<strike>最后换了个smtp服务器没问题,不知道各位兄弟有没有碰到这样的问题,可以确认的是我的yahoo配置信息应该是正确的,因为我用foxmail收发信件都是可以的.</p>
<p></strike>后来到yahoo中国里面看了一下帮助,里面说<strike><br />
</strike></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000"></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">我们目前正在对雅虎邮箱该项服务进行相关的调整，因此我们暂时停止了在页面上POP服务设置的相关介绍。目前雅虎邮箱暂时不提供POP服务，敬请关注雅虎邮箱的近期活动。</span></p>
<p></span></p>
<p><strike><br />
</strike><br />
应该就是这个原因了    <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>另外,还有一些基于javamail封装的工具类:</li>
</ul>
<p>可以参考这篇 :  <a href="/martinx/archive/2005/09/29/14386.html">简化JavaMail：小巧 Jakarta  Commons-Email 简单教程</a></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li><li><a href='http://www.foxlog.org/2006/08/08/zt%e5%8f%af%e7%bc%96%e7%a8%8b%e7%9a%84%e7%83%ad%e9%83%a8%e7%bd%b2%e9%97%ae%e9%a2%98/' rel='bookmark' title='Permanent Link: [zt]可编程的热部署问题'>[zt]可编程的热部署问题</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/05/23/javamail%e6%95%b4%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文件上传:用O’Reilly公司的cos实现文件上传</title>
		<link>http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/</link>
		<comments>http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/#comments</comments>
		<pubDate>Mon, 22 May 2006 06:14:33 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/120</guid>
		<description><![CDATA[出处:codeChina key words: cos 文件上传 jsp上传 index.html文件: &#60;html&#62; &#60;head&#62; &#60;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html;charset=gb2312&#8243;&#62; &#60;title&#62;无标题文档&#60;/title&#62; &#60;/head&#62; &#60;body&#62; &#60;!&#8211; enctype的值很重要,upload.jsp为处理上传的jsp&#8211;&#62; &#60;form name=&#8221;form1&#8243;  method=&#8221;post&#8221; enctype=&#8221;multipart/form-data&#8221; action=&#8221;upload.jsp&#8221;&#62; &#60;p&#62; &#60;input name=&#8221;file1&#8243; type=&#8221;file&#8221;&#62; &#60;/p&#62; &#60;p&#62; &#60;input name=&#8221;file2&#8243; type=&#8221;file&#8221;&#62; &#60;/p&#62; &#60;p&#62;  &#60;input name=&#8221;file3&#8243; type=&#8221;file&#8221;&#62; &#60;/p&#62; &#60;p&#62; &#60;input type=&#8221;submit&#8221; name=&#8221;Submit&#8221; value=&#8221;上传&#8221;&#62; &#60;/p&#62; &#60;/form &#62; &#60;/body&#62; &#60;/html&#62;  upload.jsp文件 : &#60;%@page import=&#8220;java.io.*&#8220;%&#62; &#60;%@page import=&#8220;com.oreilly.servlet.MultipartRequest&#8220;%&#62; &#60;%@page import=&#8220;com.oreilly.servlet.multipart.CoverFileRenamePolicy&#8220;%&#62; &#60;%@page contentType=&#8220;text/html; charset=gb2312&#8220; %&#62; &#60;% //文件上传后，保存在c:\\upload String saveDirectory =&#8220;c:\\upload&#8220;; //每个文件最大5m,最多3个文件,所以 int maxPostSize =3 * 5 * 1024 * 1024 ; //response的编码为&#8220;gb2312&#8220;,同时采用缺省的文件名冲突解决策略,实现上传 //就这一句就完成上传了,真是很爽 MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,&#8220;gb2312&#8220;); //输出反馈信息 Enumeration files = multi.getFileNames(); while (files.hasMoreElements()) { System.err.println(&#8220;ccc&#8220;); String name = (String)files.nextElement(); File f = multi.getFile(name); if(f!=null){ String fileName = multi.getFilesystemName(name); String lastFileName= saveDirectory+&#8220;\\&#8220; + fileName; out.println(&#8220;上传的文件:&#8220;+lastFileName); [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: [zt]用JSP实现上传文件的两种方法'>[zt]用JSP实现上传文件的两种方法</a></li><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li><li><a href='http://www.foxlog.org/2006/05/05/%e7%94%a8javascript%e6%93%8d%e4%bd%9c%e4%b8%a4%e4%b8%aa%e9%a1%b5%e9%9d%a2/' rel='bookmark' title='Permanent Link: 用javaScript操作两个页面'>用javaScript操作两个页面</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">出处:<a href="http://www.codechina.net/resource/html/2005-04/10/15893.html">codeChina</a></p>
<p>key  words: cos 文件上传 jsp上传</p>
<p>index.html文件:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta </span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">=&#8221;Content-Type&#8221;</span><span style="color: #ff0000"> content</span><span style="color: #0000ff">=&#8221;text/html;charset=gb2312&#8243;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">无标题文档</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008000">&lt;!&#8211;</span><span style="color: #008000"> enctype的值很重要,upload.jsp为处理上传的jsp</span><span style="color: #008000">&#8211;&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;form1&#8243;</span><span style="color: #ff0000">  method</span><span style="color: #0000ff">=&#8221;post&#8221;</span><span style="color: #ff0000"> enctype</span><span style="color: #0000ff">=&#8221;multipart/form-data&#8221;</span><span style="color: #ff0000"><br />
action</span><span style="color: #0000ff">=&#8221;upload.jsp&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;file1&#8243;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">=&#8221;file&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;file2&#8243;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">=&#8221;file&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">name</span><span style="color: #0000ff">=&#8221;file3&#8243;</span><span style="color: #ff0000"> type</span><span style="color: #0000ff">=&#8221;file&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">=&#8221;submit&#8221;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;Submit&#8221;</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">=&#8221;上传&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"></p>
<p></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><br />
upload.jsp文件 :</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@page import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">java.io.*</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@page import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">com.oreilly.servlet.MultipartRequest</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@page import</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">com.oreilly.servlet.multipart.CoverFileRenamePolicy</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@page contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=gb2312</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">文件上传后，保存在c:</span><span style="color: #000000; background-color: #f5f5f5">\\</span><span style="color: #000000; background-color: #f5f5f5">upload<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5"> saveDirectory </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">c:\\upload</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">;<br />
</span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">每个文件最大5m,最多3个文件,所以<img src="/Images/dot.gif" /><br />
</span><span style="color: #0000ff; background-color: #f5f5f5">int</span><span style="color: #000000; background-color: #f5f5f5"> maxPostSize </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">3</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">*</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">5</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">*</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">1024</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">*</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">1024</span><span style="color: #000000; background-color: #f5f5f5"> ;<br />
</span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">response的编码为</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">gb2312</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">,同时采用缺省的文件名冲突解决策略,实现上传<br />
//<font color="#ff0000">就这一句就完成上传了,真是很爽</font><br />
<font color="#009900">MultipartRequest multi </font></span><font color="#009900"><span style="color: #000000; background-color: #f5f5f5">= </span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5"> MultipartRequest(request, saveDirectory, maxPostSize,</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">gb2312</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span></font><span style="color: #000000; background-color: #f5f5f5"><font color="#009900">);</font></p>
<p></span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">输出反馈信息<br />
Enumeration files </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> multi.getFileNames();<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">while</span><span style="color: #000000; background-color: #f5f5f5"> (files.hasMoreElements()) {<br />
System.err.println(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">ccc</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5"> name </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> (</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">)files.nextElement();<br />
File f </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> multi.getFile(name);<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(f!</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">){<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5"> fileName </span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> <font color="#ff0000">multi.getFilesystemName(name)</font>;<br />
</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5"> lastFileName</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5"> saveDirectory</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">\\</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5"> fileName;<br />
out.println(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">上传的文件:</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">+</span><span style="color: #000000; background-color: #f5f5f5">lastFileName);<br />
out.println(</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">&lt;hr&gt;</span><span style="color: #000000; background-color: #f5f5f5">&#8220;</span><span style="color: #000000; background-color: #f5f5f5">);</p>
<p>}<br />
}</p>
<p></span><span style="color: #000000; background-color: #ffff00">%&gt;</span></p>
<p>相关链接:<a href="/alex/archive/2006/05/16/46508.html">几种上传方法介绍和比较</a></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: [zt]用JSP实现上传文件的两种方法'>[zt]用JSP实现上传文件的两种方法</a></li><li><a href='http://www.foxlog.org/2006/06/11/%e7%94%a8%e5%bc%80%e6%ba%90%e7%bb%84%e4%bb%b6jcaptcha%e5%81%9ajsp%e5%bd%a9%e8%89%b2%e9%aa%8c%e8%af%81%e7%a0%81/' rel='bookmark' title='Permanent Link: 用开源组件jcaptcha做jsp彩色验证码'>用开源组件jcaptcha做jsp彩色验证码</a></li><li><a href='http://www.foxlog.org/2006/05/05/%e7%94%a8javascript%e6%93%8d%e4%bd%9c%e4%b8%a4%e4%b8%aa%e9%a1%b5%e9%9d%a2/' rel='bookmark' title='Permanent Link: 用javaScript操作两个页面'>用javaScript操作两个页面</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/05/22/%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%94%a8o%e2%80%99reilly%e5%85%ac%e5%8f%b8%e7%9a%84cos%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[zt]Struts中防止任意形式的重复提交</title>
		<link>http://www.foxlog.org/2006/05/08/ztstruts%e4%b8%ad%e9%98%b2%e6%ad%a2%e4%bb%bb%e6%84%8f%e5%bd%a2%e5%bc%8f%e7%9a%84%e9%87%8d%e5%a4%8d%e6%8f%90%e4%ba%a4/</link>
		<comments>http://www.foxlog.org/2006/05/08/ztstruts%e4%b8%ad%e9%98%b2%e6%ad%a2%e4%bb%bb%e6%84%8f%e5%bd%a2%e5%bc%8f%e7%9a%84%e9%87%8d%e5%a4%8d%e6%8f%90%e4%ba%a4/#comments</comments>
		<pubDate>Mon, 08 May 2006 06:18:58 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/124</guid>
		<description><![CDATA[注:这个说的挺全面,考虑到了两种情况,一个是超连接,一个是表单 原文是这里 Struts 的 Token 机制可以解决这个问题。 1．   防止通过超链接重复访问 Struts Action 。 如果我们要防止 A 的默认页面 J 中指向 K 的超链接重复提交数据，按照下列步骤即可： a．   如果 J 是从 Struts Action 转发而来，我们要在该 Struts Action 的 execute 方法中添加下面的一行：     saveToken(request); b．   如果 J 不是从 Struts Action 转发而来，那么新建一个 Struts Action ，在该 Struts Action 的 excute 方法中增加上面的一行，然后再从该 action 转到 J 页面。 c． [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2007/10/15/links-for-2007-10-15/' rel='bookmark' title='Permanent Link: links for 2007-10-15'>links for 2007-10-15</a></li><li><a href='http://www.foxlog.org/2007/05/08/%e5%9c%a8oracle-application-server%e4%b8%ad%e9%83%a8%e7%bd%b2jstl%e5%92%8cstruts%e4%bb%a5%e5%8f%8alog4j/' rel='bookmark' title='Permanent Link: 在oracle application server中部署jstl和struts,以及log4j'>在oracle application server中部署jstl和struts,以及log4j</a></li><li><a href='http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: [zt]用JSP实现上传文件的两种方法'>[zt]用JSP实现上传文件的两种方法</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">注:这个说的挺全面,考虑到了两种情况,一个是超连接,一个是表单</font>  </span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">原文是<a href="/landy/archive/2006/05/06/44749.html">这里</a><br />
</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><br />
</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">Struts</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">Token</font> </span><span style="font-family: 宋体">机制可以解决这个问题。</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">1．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">防止通过超链接重复访问</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">。</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span style="font-family: 宋体">如果我们要防止</span> <span lang="EN-US"><font face="Times New Roman">A</font> </span><span style="font-family: 宋体">的默认页面</span> <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">中指向</span>  <span lang="EN-US"><font face="Times New Roman">K</font> </span><span style="font-family: 宋体">的超链接重复提交数据，按照下列步骤即可：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">a．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">如果</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">是从</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">转发而来，我们要在该</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">execute</font> </span><span style="font-family: 宋体">方法中添加下面的一行：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span>    </span><span style="color: blue">saveToken(request);<o:p></o:p></span>  </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">b．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">如果</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">不是从</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">转发而来，那么新建一个</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">，在该</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">excute</font> </span><span style="font-family: 宋体">方法中增加上面的一行，然后再从该</span> <span lang="EN-US"><font face="Times New Roman">action</font> </span><span style="font-family: 宋体">转到</span> <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">页面。</span>  <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">c．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">在</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">页面中使用</span> <span lang="EN-US"><font face="Times New Roman">Struts</font> </span><span style="font-family: 宋体">标签生成指向</span> <span lang="EN-US"><font face="Times New Roman">K</font> </span><span style="font-family: 宋体">的超链接，如：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span lang="EN-US"><span><font face="Times New Roman" size="3">   </font></span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'" lang="EN-US">&lt;html:link  action=&#8221;/deleteLayoutAction?layoutId=0&#8243; </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'" lang="EN-US">transaction=&#8221;true&#8221;</span>  <span style="font-size: 10pt; color: blue; font-family: 'Courier New'" lang="EN-US">&gt;delete&lt;/html:link&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'" lang="EN-US"><span>    </span></span><span style="font-size: 10pt; color: blue; font-family: 宋体">注意红色字体部分。</span> <span style="font-size: 10pt; color: blue; font-family: 'Courier New'" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">d．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">在</span>  <span lang="EN-US"><font face="Times New Roman">&lt;html:link&gt;</font>  </span><span style="font-family: 宋体">标签指向的</span> <span lang="EN-US"><font face="Times New Roman">action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">excute</font> </span><span style="font-family: 宋体">方法中加入下面的代码：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>   </span><span style="color: blue">if  (!isTokenValid(request)) {<o:p></o:p></span> </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><span>                     </span>return  mapping.findForward(&#8220;</font> </span><span style="color: blue; font-family: 宋体">这种情况下就是重复提交，转到相应的页面</span> <span style="color: blue" lang="EN-US"><font face="Times New Roman">&#8220;);<o:p></o:p></font>  </span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><font size="3"><span>              </span>}<o:p></o:p></font> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">e</font> </span><span style="font-family: 宋体">．</span> <span lang="EN-US"><font face="Times New Roman">All Done.<o:p></o:p></font> </span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">2．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">防止通过表单重复提交数据。</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">a．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">如果</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">是从</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">转发而来，我们要在该</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">execute</font> </span><span style="font-family: 宋体">方法中添加下面的一行：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span>    </span><span style="color: blue">saveToken(request);<o:p></o:p></span>  </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">b．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">如果</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">不是从</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">转发而来，那么新建一个</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">，在该</span> <span lang="EN-US"><font face="Times New Roman">Struts Action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">excute</font> </span><span style="font-family: 宋体">方法中增加上面的一行，然后再从该</span> <span lang="EN-US"><font face="Times New Roman">action</font> </span><span style="font-family: 宋体">转到</span> <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">页面。</span>  <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt"><span lang="EN-US"><span><font face="Times New Roman"><font size="3">c．</font> <span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal">   </span></font></span></span><font size="3"><span style="font-family: 宋体">在</span>  <span lang="EN-US"><font face="Times New Roman">J</font> </span><span style="font-family: 宋体">页面中表单</span> <span lang="EN-US"><font face="Times New Roman">Action</font> </span><span style="font-family: 宋体">属性指向的</span> <span lang="EN-US"><font face="Times New Roman">Struts action</font> </span><span style="font-family: 宋体">的</span> <span lang="EN-US"><font face="Times New Roman">excute</font> </span><span style="font-family: 宋体">方法中加入下面的代码：</span> <span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman"><font size="3"><span>   </span><span style="color: blue">if  (!isTokenValid(request)) {<o:p></o:p></span> </font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><font size="3"><span>            </span>saveToken(request);<o:p></o:p></font> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><span>                     </span>return  mapping.findForward(&#8220;</font> </span><span style="color: blue; font-family: 宋体">这种情况下就是重复提交，转到相应的页面</span> <span style="color: blue" lang="EN-US"><font face="Times New Roman">&#8220;);<o:p></o:p></font>  </span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><font size="3"><span>    </span>saveToken(request);<o:p></o:p></font> </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="color: blue" lang="EN-US"><font face="Times New Roman"><font size="3"><span>              </span>}<o:p></o:p></font> </font></span></p>
<p><font size="3"><span lang="EN-US"><font face="Times New Roman">e</font> </span><span style="font-family: 宋体">．</span> <span lang="EN-US"><font face="Times New Roman">All Done.</font> </span></font></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2007/10/15/links-for-2007-10-15/' rel='bookmark' title='Permanent Link: links for 2007-10-15'>links for 2007-10-15</a></li><li><a href='http://www.foxlog.org/2007/05/08/%e5%9c%a8oracle-application-server%e4%b8%ad%e9%83%a8%e7%bd%b2jstl%e5%92%8cstruts%e4%bb%a5%e5%8f%8alog4j/' rel='bookmark' title='Permanent Link: 在oracle application server中部署jstl和struts,以及log4j'>在oracle application server中部署jstl和struts,以及log4j</a></li><li><a href='http://www.foxlog.org/2007/03/26/zt%e7%94%a8jsp%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%a4%e7%a7%8d%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: [zt]用JSP实现上传文件的两种方法'>[zt]用JSP实现上传文件的两种方法</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/05/08/ztstruts%e4%b8%ad%e9%98%b2%e6%ad%a2%e4%bb%bb%e6%84%8f%e5%bd%a2%e5%bc%8f%e7%9a%84%e9%87%8d%e5%a4%8d%e6%8f%90%e4%ba%a4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分页继续[数据库分页和PageBean的改进]</title>
		<link>http://www.foxlog.org/2006/05/08/%e5%88%86%e9%a1%b5%e7%bb%a7%e7%bb%ad%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e9%a1%b5%e5%92%8cpagebean%e7%9a%84%e6%94%b9%e8%bf%9b/</link>
		<comments>http://www.foxlog.org/2006/05/08/%e5%88%86%e9%a1%b5%e7%bb%a7%e7%bb%ad%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e9%a1%b5%e5%92%8cpagebean%e7%9a%84%e6%94%b9%e8%bf%9b/#comments</comments>
		<pubDate>Mon, 08 May 2006 06:17:01 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/123</guid>
		<description><![CDATA[注:本文继续分页的上一篇 关于分页,标签,缓存 hibernate分页有现成的支持: query.setFirstResult(start); query.setMaxResults(rowNum);  MySql如下: select * from table where  limit start,rowNum; Oracle如下 select * from table where  and rowid not in(select rowid from t_table where  &#8230;. and  rownum&#60;= (pageIndex-1) * size) and rownum &#60;= size; PageBean以前是设置currentPage,然后在页面里自己判断上一页下一页是什么,后来发现纯粹多余,完全可以把目标页写进去,而且参数也统一了,以前页面传到Action有好几个参数: if(method.equals(&#8220;lastPage&#8220;)){ }else if(method.equals(&#8220;nextPage&#8220;)){ }else if(method.equals(&#8220;targetPage&#8220;)){ //. } 现在统一一个参数就是pageIndex,爽多了  PageBean代码如下: int currentPage = 1;//当前页:Action控制     int totalPages = 0;//总页数 :自己运算     public static int pageRecorders = 10; //每页记录数,默认为10,可以在初始化的时候修改//总数据数     int pageStartRow = 0; //每页的起始数  [这个字段可以去掉]     int pageEndRow = 0; //每页显示数据的终止数  [这个字段也可以去掉]     boolean hasNextPage = false; //是否有下一页:自己运算     boolean hasPreviousPage = false; //是否有前一页 :自己运算     List objList = new ArrayList();//存放欲展示的对象列表     int totalRows;//总记录数,由底层service提供 //增加上一页索引 [directly to target page]     private int lastPageIndex = 1; //增加下一页索引 [directly to target page]     private int nextPageIndex = 1; public int getLastPageIndex() { return currentPage - 1; } public int getNextPageIndex() { return currentPage + 1; } //是否有上一页     public boolean isHasPreviousPage() { return (currentPage &#62; 1 ? true : false); } //共有多少页,service只提供有多少条记录,多少页数由PageBean自己运算     public int getTotalPages() { if (totalRows &#60;= pageRecorders) return 1; return (totalRows % pageRecorders == 0 ? totalRows / pageRecorders : totalRows / pageRecorders + 1); } public int getCurrentPage() { return currentPage; } public int getPageEndRow() { [...]


Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">注:本文继续分页的上一篇 <a href="/alex/archive/2006/02/25/32433.html" id="viewpost1_TitleUrl">关于分页,标签,缓存</a><br />
hibernate分页有现成的支持:</p>
<p><span class="postbody"></p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000">query.setFirstResult(start);<br />
query.setMaxResults(rowNum); </span></p>
<p>MySql如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #808080">*</span><span style="color: #000000"> </span><span style="color: #0000ff">from</span><span style="color: #000000"> </span><span style="color: #0000ff">table</span><span style="color: #000000"> </span><span style="color: #0000ff">where</span><span style="color: #000000"> <img src="/Images/dot.gif" /> limit start,rowNum;</span></p>
<p>Oracle如下</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #808080">*</span><span style="color: #000000"> </span><span style="color: #0000ff">from</span><span style="color: #000000"> </span><span style="color: #0000ff">table</span><span style="color: #000000"> </span><span style="color: #0000ff">where</span><span style="color: #000000"> <img src="/Images/dot.gif" /> </span><span style="color: #808080">and</span><span style="color: #000000"> rowid </span><span style="color: #808080">not</span><span style="color: #000000"> </span><span style="color: #808080">in</span><span style="color: #000000">(</span><span style="color: #0000ff">select</span><span style="color: #000000"> rowid </span><span style="color: #0000ff">from</span><span style="color: #000000"> t_table </span><span style="color: #0000ff">where</span><span style="color: #000000">  &#8230;.  and  rownum</span><span style="color: #808080">&lt;=</span><span style="color: #000000"> (pageIndex</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">) </span><span style="color: #808080">*</span><span style="color: #000000"> size)<br />
</span><span style="color: #808080">and</span><span style="color: #000000"> rownum </span><span style="color: #808080">&lt;=</span><span style="color: #000000"> size;</span><br />
PageBean以前是设置currentPage,然后在页面里自己判断上一页下一页是什么,后来发现纯粹多余,完全可以把目标页写进去,而且参数也统一了,以前页面传到Action有好几个参数:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">if</span><span style="color: #000000">(method.equals(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">lastPage</span><span style="color: #000000">&#8220;</span><span style="color: #000000">)){</p>
<p>}</span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000">(method.equals(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">nextPage</span><span style="color: #000000">&#8220;</span><span style="color: #000000">)){</p>
<p>}</span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000">(method.equals(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">targetPage</span><span style="color: #000000">&#8220;</span><span style="color: #000000">)){<br />
</span><span style="color: #008000">//</span><span style="color: #008000"><img src="/Images/dot.gif" />.</span><span style="color: #008000"><br />
</span><span style="color: #000000">}</span></p>
<p>现在统一一个参数就是pageIndex,爽多了   <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
PageBean代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">int</span><span style="color: #000000"> currentPage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">当前页:Action控制</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> totalPages </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">总页数 :自己运算</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> pageRecorders </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">10</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">每页记录数,默认为10,可以在初始化的时候修改</span><span style="color: #008000">//</span><span style="color: #008000">总数据数</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> pageStartRow </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">每页的起始数   [这个字段可以去掉]</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> pageEndRow </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">每页显示数据的终止数  [这个字段也可以去掉]</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasNextPage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">是否有下一页:自己运算</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasPreviousPage </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">; </span><span style="color: #008000">//</span><span style="color: #008000">是否有前一页 :自己运算</span><span style="color: #008000"><br />
</span><span style="color: #000000">    List objList </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList();</span><span style="color: #008000">//</span><span style="color: #008000">存放欲展示的对象列表</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> totalRows;</span><span style="color: #008000">//</span><span style="color: #008000">总记录数,由底层service提供</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">增加上一页索引 [directly to target page]</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> lastPageIndex </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">增加下一页索引 [directly to target page]</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> nextPageIndex </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getLastPageIndex() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> currentPage </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getNextPageIndex() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> currentPage </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;<br />
}</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">是否有上一页</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isHasPreviousPage() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> (currentPage </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000"> </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000"> : </span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
}</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">共有多少页,service只提供有多少条记录,多少页数由PageBean自己运算</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getTotalPages() {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (totalRows </span><span style="color: #000000">&lt;=</span><span style="color: #000000"> pageRecorders) </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> (totalRows </span><span style="color: #000000">%</span><span style="color: #000000"> pageRecorders </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000"> </span><span style="color: #000000">?</span><span style="color: #000000"> totalRows </span><span style="color: #000000">/</span><span style="color: #000000"> pageRecorders : totalRows </span><span style="color: #000000">/</span><span style="color: #000000"> pageRecorders </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getCurrentPage() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> currentPage;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getPageEndRow() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> pageEndRow;<br />
}</p>
<p></span><span style="color: #008000">//</span><span style="color: #008000">是否有下一页</span><span style="color: #008000"><br />
</span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isHasNextPage() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> (currentPage </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.getTotalPages() </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000"> : </span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getTotalRows() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> totalRows;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getPageStartRow() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> pageStartRow;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getPageRecorders() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> pageRecorders;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setObjList(List objList) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.objList </span><span style="color: #000000">=</span><span style="color: #000000"> objList;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setHasPreviousPage(</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasPreviousPage) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.hasPreviousPage </span><span style="color: #000000">=</span><span style="color: #000000"> hasPreviousPage;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setTotalPages(</span><span style="color: #0000ff">int</span><span style="color: #000000"> totalPages) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.totalPages </span><span style="color: #000000">=</span><span style="color: #000000"> totalPages;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setCurrentPage(</span><span style="color: #0000ff">int</span><span style="color: #000000"> currentPage) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.currentPage </span><span style="color: #000000">=</span><span style="color: #000000"> currentPage;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setPageEndRow(</span><span style="color: #0000ff">int</span><span style="color: #000000"> pageEndRow) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.pageEndRow </span><span style="color: #000000">=</span><span style="color: #000000"> pageEndRow;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setHasNextPage(</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasNextPage) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.hasNextPage </span><span style="color: #000000">=</span><span style="color: #000000"> hasNextPage;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setTotalRows(</span><span style="color: #0000ff">int</span><span style="color: #000000"> totalRows) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.totalRows </span><span style="color: #000000">=</span><span style="color: #000000"> totalRows;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setPageStartRow(</span><span style="color: #0000ff">int</span><span style="color: #000000"> pageStartRow) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.pageStartRow </span><span style="color: #000000">=</span><span style="color: #000000"> pageStartRow;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setPageRecorders(</span><span style="color: #0000ff">int</span><span style="color: #000000"> pageRecorders) {<br />
</span><span style="color: #0000ff">this</span><span style="color: #000000">.pageRecorders </span><span style="color: #000000">=</span><span style="color: #000000"> pageRecorders;<br />
}</p>
<p></span><span style="color: #0000ff">public</span><span style="color: #000000"> List getObjList() {<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> objList;<br />
}<br />
}</span><br />
</span><span class="unnamed3">在action中负责把pageIndex传给PageBean,以及通过service得到的记录总数传给pageBean就OK了</p>
<p>补充:另,在IDEA中文站上看到一篇文章   </span><a href="http://www.jetmaven.net/documents/j_page.php" target="_blank">分页，心中的痛？ </a><span class="unnamed3">       提到用一个统一的接口来规范:<br />
代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> Page {<br />
</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isFirstPage();<br />
</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isLastPage();<br />
</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasNextPage();<br />
</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> hasPreviousPage();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getLastPageNumber();<br />
Object getThisPageElements();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getTotalNumberOfElements();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getThisPageFirstElementNumber();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getThisPageLastElementNumber();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getNextPageNumber();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getPreviousPageNumber();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getPageSize();<br />
</span><span style="color: #0000ff">int</span><span style="color: #000000"> getThisPageNumber ();<br />
}</span><br />
个人感觉思想挺好,不过我还是喜欢用一个PageBean类就足够了,没必要搞复杂了,在PageBean中其实是currentPage为核心.</p>
<p>一个工具能够在任何地方都能容易的嵌入进去,这就很小巧了,也就够用了.   <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/09/%e5%85%b3%e4%ba%8efacade%e7%9a%84%e5%ba%94%e7%94%a8/' rel='bookmark' title='Permanent Link: 关于Facade的应用'>关于Facade的应用</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li><li><a href='http://www.foxlog.org/2006/12/20/workshop-studio%e9%9c%87%e6%92%bc%e4%bd%a0%e7%9a%84%e5%bc%80%e5%8f%91%e6%95%88%e7%8e%87-bea-world2006-%e5%bd%92%e6%9d%a5%e8%b0%88%e6%84%9f%e5%8f%97%ef%bc%8c%e5%8f%91%e7%89%a2%e9%aa%9a/' rel='bookmark' title='Permanent Link: workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]'>workshop studio震撼你的开发效率 [bea world2006 归来,谈感受，发牢骚]</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/05/08/%e5%88%86%e9%a1%b5%e7%bb%a7%e7%bb%ad%e6%95%b0%e6%8d%ae%e5%ba%93%e5%88%86%e9%a1%b5%e5%92%8cpagebean%e7%9a%84%e6%94%b9%e8%bf%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单的错误</title>
		<link>http://www.foxlog.org/2006/03/30/%e7%ae%80%e5%8d%95%e7%9a%84%e9%94%99%e8%af%af/</link>
		<comments>http://www.foxlog.org/2006/03/30/%e7%ae%80%e5%8d%95%e7%9a%84%e9%94%99%e8%af%af/#comments</comments>
		<pubDate>Thu, 30 Mar 2006 06:20:23 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/126</guid>
		<description><![CDATA[想用缓存又不想用oscache觉得 麻烦,自己写了个简单的缓存,不小心发现getAllCity结果总是在第一次进去的时候数量加倍,第二次就好了,真实怪事. 代码如下: public static List getAllCity(boolean bInit) throws XXException { List cityList = new ArrayList(); if (null == CityInfos &#124;&#124; CityInfos.size() == 0) bInit = true; synchronized (CityInfos) { if (bInit) { //retrieve city info from database                 CityService service = new CityService(); cityList = service.getAllCitys(); CityInfos.clear(); if (null != cityList &#38;&#38; cityList.size() &#62; 0) { log.info(&#8220;========&#8220; + &#8220;cityList size : &#8220; + cityList.size() + &#8220;========&#8220;); for (Iterator it = cityList.iterator(); it.hasNext();) { CityVo cityVo = (CityVo) it.next(); CityInfos.put(cityVo.getId(), cityVo); } } } cityList.addAll(CityInfos.values()); } return cityList; } CityInfos是一个static Hashtable,查了下原来是共用了cityList,将synchronized 里面的cityList 改成 List tmpCityList 就可以了    为什么会犯低级错误呢?  Related posts:[zt]设计模式之Visitor 访问者模式[zt] Hibernate+Spring 对DAO的处理实列!Hibernate的load错误，你碰到过这样的问题么?


Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2007/01/25/zt-hibernatespring-%e5%af%b9dao%e7%9a%84%e5%a4%84%e7%90%86%e5%ae%9e%e5%88%97/' rel='bookmark' title='Permanent Link: [zt] Hibernate+Spring 对DAO的处理实列!'>[zt] Hibernate+Spring 对DAO的处理实列!</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">想用缓存又不想用oscache觉得<br />
麻烦,自己写了个简单的缓存,不小心发现getAllCity结果总是在第一次进去的时候数量加倍,第二次就好了,真实怪事.</p>
<p>代码如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> List getAllCity(</span><span style="color: #0000ff">boolean</span><span style="color: #000000"> bInit) </span><span style="color: #0000ff">throws</span><span style="color: #000000">  XXException {<br />
List cityList </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList();<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">==</span><span style="color: #000000"> CityInfos </span><span style="color: #000000">||</span><span style="color: #000000"> CityInfos.size() </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) bInit </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">synchronized</span><span style="color: #000000"> (CityInfos) {<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (bInit) { </span><span style="color: #008000">//</span><span style="color: #008000">retrieve city info from database</span><span style="color: #008000"><br />
</span><span style="color: #000000">                CityService service </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> CityService();<br />
cityList </span><span style="color: #000000">=</span><span style="color: #000000"> service.getAllCitys();<br />
CityInfos.clear();<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">!=</span><span style="color: #000000"> cityList </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> cityList.size() </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) {<br />
log.info(</span><span style="color: #000000">&#8220;</span><span style="color: #000000">========</span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">cityList size : </span><span style="color: #000000">&#8220;</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> cityList.size() </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">&#8220;</span><span style="color: #000000">========</span><span style="color: #000000">&#8220;</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (Iterator it </span><span style="color: #000000">=</span><span style="color: #000000"> cityList.iterator(); it.hasNext();) {<br />
CityVo cityVo </span><span style="color: #000000">=</span><span style="color: #000000"> (CityVo) it.next();<br />
CityInfos.put(cityVo.getId(), cityVo);<br />
}<br />
}<br />
}</p>
<p>cityList.addAll(CityInfos.values());<br />
}<br />
</span><span style="color: #0000ff">return</span><span style="color: #000000"> cityList;<br />
}</span><br />
CityInfos是一个static  Hashtable,查了下原来是共用了cityList,将<span style="color: #000000"></span><span style="color: #0000ff">synchronized</span><span style="color: #000000">  里面的cityList 改成<br />
List tmpCityList 就可以了  <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   为什么会犯低级错误呢?  <img src='http://www.foxlog.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2007/01/25/zt-hibernatespring-%e5%af%b9dao%e7%9a%84%e5%a4%84%e7%90%86%e5%ae%9e%e5%88%97/' rel='bookmark' title='Permanent Link: [zt] Hibernate+Spring 对DAO的处理实列!'>[zt] Hibernate+Spring 对DAO的处理实列!</a></li><li><a href='http://www.foxlog.org/2006/11/07/hibernate%e7%9a%84load%e9%94%99%e8%af%af%ef%bc%8c%e4%bd%a0%e7%a2%b0%e5%88%b0%e8%bf%87%e8%bf%99%e6%a0%b7%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%88/' rel='bookmark' title='Permanent Link: Hibernate的load错误，你碰到过这样的问题么?'>Hibernate的load错误，你碰到过这样的问题么?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/03/30/%e7%ae%80%e5%8d%95%e7%9a%84%e9%94%99%e8%af%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts中Action的一个笔误造成莫名的错误.</title>
		<link>http://www.foxlog.org/2006/03/05/struts%e4%b8%adaction%e7%9a%84%e4%b8%80%e4%b8%aa%e7%ac%94%e8%af%af%e9%80%a0%e6%88%90%e8%8e%ab%e5%90%8d%e7%9a%84%e9%94%99%e8%af%af/</link>
		<comments>http://www.foxlog.org/2006/03/05/struts%e4%b8%adaction%e7%9a%84%e4%b8%80%e4%b8%aa%e7%ac%94%e8%af%af%e9%80%a0%e6%88%90%e8%8e%ab%e5%90%8d%e7%9a%84%e9%94%99%e8%af%af/#comments</comments>
		<pubDate>Sun, 05 Mar 2006 06:24:14 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/128</guid>
		<description><![CDATA[keyword: struts错误,持续构建,checkbox 前天在运行应用时有一个页面一点button就转到系统错误页面,折腾了好半天,在Action里打桩调试连调试信息都见不到,还以为时log4j配置出了问题,改来改去也不知道原因在哪,最后检查居然时在Action里用错了Form,哎,真是要命.回忆了一下,以前这个地方一直正常,怎么这次修改了别的地方就影响到这了呢,记忆中好像是因为做了一次重构不小心在批量修改的时候把这里给改了. 现在总结一下Struts里可能常出现的错误的原因: 1.配置文件里的input或者forward写错 2.jsp里的Action对应的.do写错,实际就是对应的Form也错了 3.Action里Form写错,或者forward为空 4.还有Form里的属性和jsp页面的属性不一致 经过这次的教训也让我有了一个以前不怎么重视的想法要实现,就是持续构建,如果有了持续构建我的每一次的提交都有报告和分析结果出来,防患于未然,也不至于让我折腾半天为了一行代码. 方案就选maven + cc . 目前国内用的多么?没有调查过,不过就我目前了解到的情况,好多公司的做法真是让人觉得有点shit,但愿越来越好,越来越规范. 写到这里又想起一个关于jsp的checkbox问题,例如,在一个产品删除的页面里,每条记录前面有一个checkbox,我们一般的做法是给checkbox的value赋值为产品ID的值,然后Action根据ID就可以直接删除产品了,但是问题是有时候我除了需要删除这个产品,同时还需要在下一个页面里再将当前页面的东西显示一次,让用户确认,就还需要除产品ID以外的信息了,该怎么办呢?  我以前有一个比较笨的办法就是在value里拼数据, 比如id &#124; name &#124; quantity &#124; other,最后在Action里再解析,现在想来其实没有必要,可以用&#60;logic:iterator/&#62;里的indexId属性来做。 具体请参看这里: 这里贴下关键部分的代码: jsp代码: &#60;logic:iterate id=&#8221;testqclist&#8221; name=&#8221;testQCActionForm&#8221; property=&#8221;result&#8221; indexId=&#8221;index&#8221; &#62; &#60;tr bgcolor=&#8221;#FFFFFF&#8221;&#62; &#60;td height=&#8221;26&#8243; bgcolor=&#8221;#EEEEEE&#8221;&#62; &#60;div align= &#8221;center&#8221; &#62; &#60;input type=&#8221;checkbox&#8221; name=&#8221;checkboxVal&#8221; value=&#8221;&#60;%=index%&#62;&#8221; &#62;&#60;/div&#62; &#60;/td&#62; &#60;/tr&#62; &#60;/logic:iterate&#62; Action代码: [原文作者写在Form里实现，不过我个人喜欢在Action里做，看你情况了] if (checkboxVal != null &#38;&#38; checkboxVal.length &#62; 0){       for (int i = 0; i &#60; checkboxVal.length; i++){         int chkVal = Integer.parseInt(checkboxVal[i]); //取得checkbox的index值         //&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..         checkform.setSaamsampleid (datesampledVal[chkVal].toString());//取得和checkbox为true的其他属性的值         checkform.setSaamsampleid(saamsampleidVal[chkVal].toString());         //&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;       }     } Related posts:[zt]设计模式之Visitor 访问者模式关于java与javaScript的互相访问


Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p style="margin-right: 0px">keyword:  struts错误,持续构建,checkbox</p>
<p>前天在运行应用时有一个页面一点button就转到系统错误页面,折腾了好半天,在Action里打桩调试连调试信息都见不到,还以为时log4j配置出了问题,改来改去也不知道原因在哪,最后检查居然时在Action里用错了Form,哎,真是要命.回忆了一下,以前这个地方一直正常,怎么这次修改了别的地方就影响到这了呢,记忆中好像是因为做了一次重构不小心在批量修改的时候把这里给改了.</p>
<p>现在总结一下Struts里可能常出现的错误的原因:</p>
<p>1.配置文件里的input或者forward写错<br />
2.jsp里的Action对应的.do写错,实际就是对应的Form也错了<br />
3.Action里Form写错,或者forward为空<br />
4.还有Form里的属性和jsp页面的属性不一致</p>
<p>经过这次的教训也让我有了一个以前不怎么重视的想法要实现,就是持续构建,如果有了持续构建我的每一次的提交都有报告和分析结果出来,防患于未然,也不至于让我折腾半天为了一行代码.<br />
方案就选<a href="http://maven.apache.org/">maven </a>+ <a href="http://cruisecontrol.sourceforge.net/">cc</a>  .</p>
<p>目前国内用的多么?没有调查过,不过就我目前了解到的情况,好多公司的做法真是让人觉得有点shit,但愿越来越好,越来越规范.</p>
<p>写到这里又想起一个关于jsp的checkbox问题,例如,在一个产品删除的页面里,每条记录前面有一个checkbox,我们一般的做法是给checkbox的value赋值为产品ID的值,然后Action根据ID就可以直接删除产品了,但是问题是有时候我除了需要删除这个产品,同时还需要在下一个页面里再将当前页面的东西显示一次,让用户确认,就还需要除产品ID以外的信息了,该怎么办呢?   我以前有一个比较笨的办法就是在value里拼数据,<br />
比如id | name | quantity |  other,最后在Action里再解析,现在想来其实没有必要,可以用&lt;logic:iterator/&gt;里的indexId属性来做。<br />
具体请参看<a href="http://www.zahui.com/html/6/11892.htm">这里</a>:<br />
这里贴下关键部分的代码:<br />
jsp代码:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">logic:iterate </span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;testqclist&#8221;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;testQCActionForm&#8221;</span><span style="color: #ff0000"> property</span><span style="color: #0000ff">=&#8221;result&#8221;</span><span style="color: #ff0000"> indexId</span><span style="color: #0000ff">=&#8221;index&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr </span><span style="color: #ff0000">bgcolor</span><span style="color: #0000ff">=&#8221;#FFFFFF&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td </span><span style="color: #ff0000">height</span><span style="color: #0000ff">=&#8221;26&#8243;</span><span style="color: #ff0000"> bgcolor</span><span style="color: #0000ff">=&#8221;#EEEEEE&#8221;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div </span><span style="color: #ff0000">align</span><span style="color: #0000ff">= &#8221;center&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">=&#8221;checkbox&#8221;</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">=&#8221;checkboxVal&#8221;</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">=&#8221;&lt;%=index%&gt;&#8221;</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">logic:iterate</span><span style="color: #0000ff">&gt;</span></p>
<p style="margin-right: 0px">Action代码:  [<u>原文作者写在Form里实现，不过我个人喜欢在Action里做，看你情况了</u>]</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_50_813_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_813_Open_Text.style.display='none'; Codehighlighter1_50_813_Closed_Image.style.display='inline'; Codehighlighter1_50_813_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_50_813_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_813_Closed_Text.style.display='none'; Codehighlighter1_50_813_Open_Image.style.display='inline'; Codehighlighter1_50_813_Open_Text.style.display='inline';" align="top" /><span style="color: #0000ff">if</span><span style="color: #000000"> (checkboxVal </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> checkboxVal.length </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">)</span><span id="Codehighlighter1_50_813_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_50_813_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_103_806_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_806_Open_Text.style.display='none'; Codehighlighter1_103_806_Closed_Image.style.display='inline'; Codehighlighter1_103_806_Closed_Text.style.display='inline';" align="top" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_103_806_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_806_Closed_Text.style.display='none'; Codehighlighter1_103_806_Open_Image.style.display='inline'; Codehighlighter1_103_806_Open_Text.style.display='inline';" align="top" />      </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> checkboxVal.length; i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_103_806_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff"><img src="/Images/dot.gif" /></span><span id="Codehighlighter1_103_806_Open_Text"><span style="color: #000000">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="color: #0000ff">int</span><span style="color: #000000"> chkVal </span><span style="color: #000000">=</span><span style="color: #000000"> Integer.parseInt(checkboxVal[i]); <font color="#ffa500"><font color="#ff0000">//取得checkbox的index值</font><br />
</font><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />        //&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</span><span style="color: #000000"><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />        checkform.setSaamsampleid (datesampledVal[chkVal].toString());<font color="#ff0000">//取得和checkbox为true的其他属性的值<br />
</font><img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />        checkform.setSaamsampleid(saamsampleidVal[chkVal].toString());<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" />        //&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="color: #000000"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></p>
<p style="margin-right: 0px">


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/09/28/zt%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bvisitor-%e8%ae%bf%e9%97%ae%e8%80%85%e6%a8%a1%e5%bc%8f/' rel='bookmark' title='Permanent Link: [zt]设计模式之Visitor 访问者模式'>[zt]设计模式之Visitor 访问者模式</a></li><li><a href='http://www.foxlog.org/2006/08/19/%e5%85%b3%e4%ba%8ejava%e4%b8%8ejavascript%e7%9a%84%e4%ba%92%e7%9b%b8%e8%ae%bf%e9%97%ae/' rel='bookmark' title='Permanent Link: 关于java与javaScript的互相访问'>关于java与javaScript的互相访问</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/03/05/struts%e4%b8%adaction%e7%9a%84%e4%b8%80%e4%b8%aa%e7%ac%94%e8%af%af%e9%80%a0%e6%88%90%e8%8e%ab%e5%90%8d%e7%9a%84%e9%94%99%e8%af%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>log4j配置</title>
		<link>http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/</link>
		<comments>http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Thu, 16 Feb 2006 06:38:20 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[java开发技术]]></category>

		<guid isPermaLink="false">http://www.foxlog.org/archives/132</guid>
		<description><![CDATA[log4j配置,原来以为需要程序种写config,实际上不用,只要提供配置文件放到classpath下即可,示例配置如下: ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=hibernate.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change &#8217;info&#8217; to &#8217;debug&#8217; ### log4j.rootLogger=info,stdout,file log4j.logger.net.sf.hibernate=info ### log just the SQL #log4j.logger.net.sf.hibernate.SQL=debug ### log JDBC bind parameters ### log4j.logger.net.sf.hibernate.type=info ### log schema export/update ### log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug ### log cache activity ### #log4j.logger.net.sf.hibernate.cache=debug ### enable the following line if you want to track down connection ### ### leakages when using DriverManagerConnectionProvider ### #log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace Related posts:Spring的listener启动异常[zt]关于commons logging


Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/23/spring%e7%9a%84listener%e5%90%af%e5%8a%a8%e5%bc%82%e5%b8%b8/' rel='bookmark' title='Permanent Link: Spring的listener启动异常'>Spring的listener启动异常</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p class="postText">log4j配置,原来以为需要程序种写config,实际上不用,只要提供配置文件放到classpath下即可,示例配置如下:</p>
<p style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee"><!--</p>
<p>Code highlighting produced by Actipro CodeHighlighter (freeware)</p>
<p>http://www.CodeHighlighter.com/</p>
<p>--><span style="color: #000000"></span><span style="color: #000000">### direct log messages to stdout ###<br />
log4j.appender.stdout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.ConsoleAppender<br />
log4j.appender.stdout.Target</span><span style="color: #000000">=</span><span style="color: #000000">System.out<br />
log4j.appender.stdout.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
log4j.appender.stdout.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="color: #000000">%d{ABSOLUTE} %5p %c{</span><span style="color: #000000">1</span><span style="color: #000000">}:%L - %m%n</p>
<p>### direct messages to file hibernate.log ###<br />
log4j.appender.file</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.FileAppender<br />
log4j.appender.file.File</span><span style="color: #000000">=</span><span style="color: #000000">hibernate.log<br />
log4j.appender.file.layout</span><span style="color: #000000">=</span><span style="color: #000000">org.apache.log4j.PatternLayout<br />
log4j.appender.file.layout.ConversionPattern</span><span style="color: #000000">=</span><span style="color: #000000">%d{ABSOLUTE} %5p %c{</span><span style="color: #000000">1</span><span style="color: #000000">}:%L - %m%n</p>
<p>### set log levels - for more verbose logging change &#8217;info&#8217; to &#8217;debug&#8217; ###</p>
<p>log4j.rootLogger</span><span style="color: #000000">=</span><span style="color: #000000">info</span><span style="color: #000000">,</span><span style="color: #000000">stdout</span><span style="color: #000000">,</span><span style="color: #000000">file</p>
<p>log4j.logger.net.sf.hibernate</span><span style="color: #000000">=</span><span style="color: #000000">info</p>
<p>### log just the SQL<br />
#log4j.logger.net.sf.hibernate.SQL</span><span style="color: #000000">=</span><span style="color: #000000">debug</p>
<p>### log JDBC bind parameters ###<br />
log4j.logger.net.sf.hibernate.type</span><span style="color: #000000">=</span><span style="color: #000000">info</p>
<p>### log schema export/update ###<br />
log4j.logger.net.sf.hibernate.tool.hbm2ddl</span><span style="color: #000000">=</span><span style="color: #000000">debug</p>
<p>### log cache activity ###<br />
#log4j.logger.net.sf.hibernate.cache</span><span style="color: #000000">=</span><span style="color: #000000">debug</p>
<p>### enable the following line if you want to track down connection ###<br />
### leakages when using DriverManagerConnectionProvider ###<br />
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider</span><span style="color: #000000">=</span><span style="color: #000000">trace<br />
</span></p>


<p>Related posts:<ol><li><a href='http://www.foxlog.org/2006/10/23/spring%e7%9a%84listener%e5%90%af%e5%8a%a8%e5%bc%82%e5%b8%b8/' rel='bookmark' title='Permanent Link: Spring的listener启动异常'>Spring的listener启动异常</a></li><li><a href='http://www.foxlog.org/2006/12/18/zt%e5%85%b3%e4%ba%8ecommons-logging/' rel='bookmark' title='Permanent Link: [zt]关于commons logging'>[zt]关于commons logging</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.foxlog.org/2006/02/16/log4j%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
