﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-phyeas</title><link>http://www.blogjava.net/phyeas/</link><description>我是程序员？我是程序员！</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 01:19:51 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 01:19:51 GMT</pubDate><ttl>60</ttl><item><title>JAVA之理解break label;</title><link>http://www.blogjava.net/phyeas/archive/2009/03/19/260787.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Thu, 19 Mar 2009 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2009/03/19/260787.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/260787.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2009/03/19/260787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/260787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/260787.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_31_320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_320_Open_Text.style.display='none'; Codehighlighter1_31_320_Closed_Image.style.display='inline'; Codehighlighter1_31_320_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_31_320_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_320_Closed_Text.style.display='none'; Codehighlighter1_31_320_Open_Image.style.display='inline'; Codehighlighter1_31_320_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label:&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(x)&nbsp;</span><span id="Codehighlighter1_31_320_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_320_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">X&nbsp;==&nbsp;1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">X&nbsp;is&nbsp;2&nbsp;or&nbsp;3&nbsp;or&nbsp;4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">X&lt;1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">x&gt;4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">&nbsp;label;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(x);</span></div>
以上代码将会输出什么？<br />
当然是输出一个"5"了。<br />
但是等等，程序中有一个 break label;有什么用呢，不是跳到label的位置吗。当然不是了！<br />
为了解释这个，我们需要了解这个label的作用，这个label其实是定义一个有名称代码段，而在该程序中label指定的代码段就是switch，所以break label;其实就是跳出这个代码段的意思。<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/260787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2009-03-19 15:07 <a href="http://www.blogjava.net/phyeas/archive/2009/03/19/260787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文本比较算法的实现2</title><link>http://www.blogjava.net/phyeas/archive/2009/02/15/254743.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sun, 15 Feb 2009 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2009/02/15/254743.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/254743.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2009/02/15/254743.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/254743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/254743.html</trackback:ping><description><![CDATA[由于本人对算法理解的重大失误，造成原来写的程序有重大BUG。特此向各位道歉来了，呵呵<br />
今天又将算法看了一遍，终于理解其精髓<br />
下面是主要的实现代码，献丑了<br />
首先是初始化一个boolean数组，存放各个字符是否匹配的：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;getCompareBooleanArray(String&nbsp;source,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;compareTo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;comps;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(compareTo&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;source&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalArgumentException(</span><span style="color: #000000;">"</span><span style="color: #000000;">必须设置完两个文本后再进行初始化</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comps&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[compareTo.length()][source.length()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;compareTo.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;source.length();&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comps[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;compareTo.charAt(i)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;source.charAt(j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;System.out.print(comps[i][j]&nbsp;+&nbsp;"\t");</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;System.out.println();</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;comps;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
这个实现基本上没什么说的，就这样<br />
<br />
接着是一个根据这个boolean数组初始化一个int矩阵的函数，这个函数就对应寻找最大匹配路径的函数<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;getSetpPathArr(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;barr)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;iarr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[barr.length][barr[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;barr.length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;barr[i].length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v_i_j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;barr[i][j]&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n_i_1_j_1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;iarr.length&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;iarr[i].length&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;iarr[i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">][j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n_i_1_j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;iarr.length&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;iarr[i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">][j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n_i_j_1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;iarr[i].length&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;:&nbsp;iarr[i][j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;v_n_1_1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v_i_j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;n_i_1_j_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iarr[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v_n_1_1&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;n_i_1_j&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;v_n_1_1&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;n_i_j_1&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;v_n_1_1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;n_i_j_1&nbsp;:&nbsp;n_i_1_j&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;n_i_j_1&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;n_i_1_j&nbsp;:&nbsp;n_i_j_1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;iarr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
根据算法的解释，从下往上，从右向左计算每个格子<br />
<br />
对应寻找最优路径的函数，也是初始化一个int[][]<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;getMinSetpArr(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;miarr,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;barr)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;iarr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[miarr.length][miarr[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;iarr.length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;iarr[i].length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j</span><span style="color: #000000;">--</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(barr[i][j])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iarr[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getV(iarr,&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(getV(miarr,&nbsp;i,&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;getV(miarr,&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;j))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iarr[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getV(iarr,&nbsp;i,&nbsp;j&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iarr[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getV(iarr,&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;j)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;iarr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
这样就相应对应了算法中讲的那三个矩阵。<br />
当然了，上面有调用到一个叫getV的方法，方法很简单<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getV(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;arr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;arr.length&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;arr[i].length)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;arr[i][j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
分别初始化完这三个数组后对结果进行计算。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;barr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getCompareBooleanArray(source,&nbsp;compareTo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;miarr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getSetpPathArr(barr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[][]&nbsp;diarr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getMinSetpArr(miarr,&nbsp;barr);</span></div>
先找出从顶点出发，下一步该走的那几个点：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Point</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;points&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Point</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxJ&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;barr.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;tempMaxJ&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;barr[i].length;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;maxJ&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;maxJ&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(barr[i][j])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(tempMaxJ&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempMaxJ&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;points.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Point(i,&nbsp;j));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(tempMaxJ&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxJ&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tempMaxJ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
找出可能的最大最优匹配路径，这个可能会有几条路径，核心代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;minSetp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Point&nbsp;point&nbsp;:&nbsp;points)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(miarr[point.getX()][point.getY()]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;max)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;miarr[point.getX()][point.getY()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Point&nbsp;point&nbsp;:&nbsp;points)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(minSetp&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minSetp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;diarr[point.getX()][point.getY()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(miarr[point.getX()][point.getY()]&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;max<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;diarr[point.getX()][point.getY()]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;minSetp)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minSetp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;diarr[point.getX()][point.getY()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Point</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;willRemove&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Point</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Point&nbsp;point&nbsp;:&nbsp;points)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(miarr[point.getX()][point.getY()]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;max<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;diarr[point.getX()][point.getY()]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;minSetp)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;willRemove.add(point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;points.removeAll(willRemove);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;willRemove.clear();</span></div>
找到这里，最大匹配并且最优匹配的路径就找到了<br />
下面就是要计算差异了，基本和我上次写的计算差异的方法差不多<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TextDiff</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;diffs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">TextDiff</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(points.size()&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;startPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;points.get(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;points.clear();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(startPoint.getX()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_INSERTED,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getX()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(startPoint.getY()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_DELETED,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getY()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getNext(startPoint,&nbsp;miarr,&nbsp;diarr,&nbsp;barr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(next&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">barr[startPoint.getX()][startPoint.getY()])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Point(startPoint.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(startPoint.getX()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;next.getX()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;startPoint.getY()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;next.getY()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_INSERTED,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getX(),&nbsp;next.getX()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;startPoint.getX()));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_DELETED,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getY(),&nbsp;next.getY()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;startPoint.getY()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getNext(startPoint,&nbsp;miarr,&nbsp;diarr,&nbsp;barr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(startPoint.getX()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;barr.length)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_INSERTED,&nbsp;startPoint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getX(),&nbsp;barr.length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;startPoint.getX()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(startPoint.getY()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;barr[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_DELETED,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startPoint.getY(),&nbsp;barr[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;startPoint.getY()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
大功告成。。。。。<br />
源码：<a href="/Files/phyeas/src.zip">http://www.blogjava.net/Files/phyeas/src.zip</a>
<img src ="http://www.blogjava.net/phyeas/aggbug/254743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2009-02-15 13:22 <a href="http://www.blogjava.net/phyeas/archive/2009/02/15/254743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文本比较算法的实现</title><link>http://www.blogjava.net/phyeas/archive/2009/01/10/250807.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sat, 10 Jan 2009 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2009/01/10/250807.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/250807.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2009/01/10/250807.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/250807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/250807.html</trackback:ping><description><![CDATA[这段时间很忙，呵呵，没时间写blog。<br />
<br />
前两天看了一个文本比较的算法，算法的思路我就不多说了，主要说下我的实现。算法参考：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a title="文本比较算法剖析（1）-如何确定最大匹配率" href="http://blog.csdn.net/clariones/archive/2006/11/19/1396880.aspx">文本比较算法剖析（1）-如何确定最大匹配率</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a title="文本比较算法剖析（2）-如何确定最优匹配路径" href="http://blog.csdn.net/clariones/archive/2006/11/24/1412394.aspx">文本比较算法剖析（2）-如何确定最优匹配路径</a><br />
我的实现步骤是：<br />
1、计算出所有可行的路径<br />
如下图中，N(l,r)所在的位置如果该位置匹配，则肯定要走A区。在扫描A区所有的可行路径，可行路径的标准是下一个可行并且匹配的点，在这一步先不考虑不普配的点。<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/clariones/Picture1.jpg" width="757" height="272" /><br />
关键代码 ：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CharPoint</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getNextPoints(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;comps,&nbsp;CharPoint&nbsp;p)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(comps&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalArgumentException(</span><span style="color: #000000;">"</span><span style="color: #000000;">参数不能为空。</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CharPoint</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;cps&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CharPoint</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;comps.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(maxY&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;p.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;comps[i].length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxJ&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;maxY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;bo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p.getY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;maxJ;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(comps[i][j])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">bo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharPoint&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CharPoint(i,&nbsp;j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp.setFromPoint(p);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cps.add(cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cps;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
2、计算出最大匹配的路径<br />
获得所有可行的路径后再对所有路径的节点数进行判断，节点最多的则是最大匹配路径。但有可能有几个最大匹配路径。<br />
关键代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(CharPoint&nbsp;cp&nbsp;:&nbsp;map.keySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;System.out.println(map.get(cp));</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(map.get(cp)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;max)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cps.add(cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(CharPoint&nbsp;cp&nbsp;:&nbsp;cps)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;TextComparerUtil.copyCharPoint(cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(cp.getFromPoint()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp.getFromPoint().setNext(cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getFromPoint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cps2.add(cp);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
在计算完最大匹配路径后在对路径进行补充。使路径完整<br />
关键代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CharPoint</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;applySetpBySetpPath(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;comps,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CharPoint</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;cps)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(CharPoint&nbsp;cp&nbsp;:&nbsp;cps)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharPoint&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applySetpPath(comps,&nbsp;cp,&nbsp;next);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cps;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;applySetpPath(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;comps,&nbsp;CharPoint&nbsp;cp,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharPoint&nbsp;next)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(next&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cp.getX()&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;cp.getY()&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;cp.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;comps.length<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;cp.getY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;comps[cp.getX()].length<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;comps[cp.getX()][cp.getY()])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp.setNext(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CharPoint(cp.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;cp.getY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getX()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;next.getX();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp.setNext(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CharPoint(i,&nbsp;cp.getY()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getY()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;next.getY();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp.setNext(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CharPoint(cp.getX(),&nbsp;i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;CharPoint&nbsp;applyToEnd(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">[][]&nbsp;comps,&nbsp;CharPoint&nbsp;cp)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(cp.getNext()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cp.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharPoint&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CharPoint(comps.length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;comps[</span><span style="color: #000000;">0</span><span style="color: #000000;">].length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applySetpPath(comps,&nbsp;cp,&nbsp;next);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
3、计算最优路径<br />
计算最优路径的方法很简单，按照作者的算法的介绍，计算最优路径的方法就是最后匹配的节点离root(0,0)点最近的那条路径<br />
<br />
4、计算差异<br />
计算差异也很简单，就不介绍了，直接上代码<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">TextDiff&nbsp;diffdel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextDiff&nbsp;diffins&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root.getNext()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharPoint&nbsp;next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root.getX()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;next.getX()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;root.getY()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;next.getY())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffdel&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root.getY();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(comps[root.getX()][root.getY()])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next.getY();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffdel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_DELETED,&nbsp;start,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffdel.setDiffLength(diffdel.getDiffLength()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root.getY()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;next.getY()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;root.getX()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;next.getX())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffins&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root.getX();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(comps[root.getX()][root.getY()])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next.getX();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffins&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextDiff(TextDiff.TYPE_INSERTED,&nbsp;start,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffins.setDiffLength(diffins.getDiffLength()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root.getX()&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;comps.length<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;root.getY()&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;comps[root.getX()].length<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;comps[next.getX()][next.getY()])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffdel&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;diffdel.getDiffLength()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(diffdel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffins&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;diffins.getDiffLength()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(diffins);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffdel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffins&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;root.getNext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(root&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;root.getNext()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffdel&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;diffdel.getDiffLength()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(diffdel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(diffins&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;diffins.getDiffLength()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffs.add(diffins);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
（代码有BUG。。。。暂停下载）<br />
顺便提前祝各位新春快乐，新年吉祥，和家安康<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/250807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2009-01-10 14:17 <a href="http://www.blogjava.net/phyeas/archive/2009/01/10/250807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(4)：外键</title><link>http://www.blogjava.net/phyeas/articles/248165.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Wed, 24 Dec 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/248165.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/248165.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/248165.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/248165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/248165.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;"><br />
</span></div>
<br />
一个图书管理系统中的两个对象：Book(书籍),BookType(书籍类型)。Book和BookType之间是多对一关系。<br />
<br />
说到主从表的关联关系，自然而然地想起的一种实现方式就是选择框，比如在Book的编辑界面是使用一个类型的下拉选择框，选择一个类型，然后保存。于是就有下例代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:selectOneMenu&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="type"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.instance.bookType.typeId}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:selectItems&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="#{bookTypeList.typeSelectItems}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:selectOneMenu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
这段代码的作者（我）原本的想法是让这个下拉框与bookHome.instance里的<span style="color: #0000ff;">bookType.</span>typeId帮定。比如当前的book类型id是1，修改后将book类型的id改为2，更新到数据库。但是很不幸。这段代码并不能执行预期的行为，或者说它还附加了其他行为。即Seam已经觉察到了在这个book中的类型的一个属性（主键值）已经改变了。于是，试图更新这个类型。但是JPA的规范中是不允许更改主键的，这就引起了一个错误。不信可以试下哦，呵呵。（以上描述我已经尽可能说清楚我的想法，但可能还是不怎么清楚，希望大家看不懂的说说哪里看不懂，我好改正）。我想说的是，不要直接帮定到外键，而是现帮定到一个临时变量，比如在bookHome中多写一个变量：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookHome&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;EntityHome</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">{<br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;typeId;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">..getter&nbsp;setter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}</span></div>
然后将下拉框邦定到这个变量上，比如：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:selectOneMenu&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="type"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.typeId}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:selectItems&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="#{bookTypeList.typeSelectItems}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:selectOneMenu</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
。然后在重载的persist或者update方法中写上：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">BookType&nbsp;newType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getEntityManager().find(BookType.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;typeId);<br />
instance.setType(newType);<br />
return super.persist();<br />
</span></div>
就完成了。我叫它&#8220;转移邦定&#8221;，呵呵<br />
<br />
Seam的解决方案：<br />
其实Seam有另一种解决方案。比如如果你是自动生成代码的方式，在BookEdit.xhtml中就会看到这样的代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="association"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="bookTypeParent"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:outputText&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="There&nbsp;is&nbsp;no&nbsp;bookType&nbsp;associated&nbsp;with&nbsp;this&nbsp;book."</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rendered</span><span style="color: #0000ff;">="#{bookHome.instance.bookType&nbsp;==&nbsp;null}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">rich:dataTable&nbsp;</span><span style="color: #ff0000;">var</span><span style="color: #0000ff;">="bookType"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.instance.bookType}"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rendered</span><span style="color: #0000ff;">="#{bookHome.instance.bookType&nbsp;!=&nbsp;null}"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowClasses</span><span style="color: #0000ff;">="rvgRowOne,rvgRowTwo"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="bookTypeTable"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">typeId</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.typeId}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">bookType&nbsp;typeId</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.bookType.typeId}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">typeName</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{bookType.typeName}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:facet&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="header"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">action</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">f:facet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:link&nbsp;</span><span style="color: #ff0000;">view</span><span style="color: #0000ff;">="/BookType.xhtml"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="viewbookType"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="View"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propagation</span><span style="color: #0000ff;">="none"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookType.typeId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:link</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h:column</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">rich:dataTable</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="actionButtons"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:button&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="Select&nbsp;bookType"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span style="color: #0000ff;">="/BookTypeList.xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="from"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="BookEdit"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:button</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></div>
点击&#8220;Select bookType&#8221;页面就自动跳转到BookTypeList页面，列出所有的类型，每个类型后面都有一个select连接，点击这个连接就可选中这个类型。然后回到BookEdit.xhtml。很Seam很强大吧，呵呵。其实为何这样能完成一个选择都是在BookEdit.page.xml里配置的。配置大概如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">begin-conversation&nbsp;</span><span style="color: #ff0000;">join</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">execute</span><span style="color: #0000ff;">="#{bookHome.wire}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookFrom"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookBookId"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookHome.bookBookId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeFrom"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="#{bookTypeHome.bookTypeTypeId}"</span><span style="color: #0000ff;">/&gt;</span></div>
<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">begin-conversation&nbsp;</span><span style="color: #ff0000;">join</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp; ：开始一个</span><span style="color: #800000;">conversation（我暂称之为&#8220;页面流&#8221;）</span>，如果已存在，就加入。而不重新创建。<br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">execute</span><span style="color: #0000ff;">="#{bookHome.wire}"</span><span style="color: #0000ff;">/&gt;&nbsp; ：</span><span style="color: #000000;">一最重要的这个。如果没有执行这个方法这段跳转就没有任何效果了。，先来看下这个方法是怎么写的吧：<br />
<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;wire()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInstance();</span><span style="color: #008000;">//</span><span style="color: #008000;">获取instance，放在这里是为了加在instance</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BookType&nbsp;bookType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bookTypeHome.getDefinedInstance();</span><span style="color: #008000;">//</span><span style="color: #008000;">获取类型。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bookType&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">如果选择的类型不为null</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInstance().setBookType(bookType);</span><span style="color: #008000;">//</span><span style="color: #008000;">设置书籍类型</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span></div>
那bookTypeHome从哪来的呢？天上掉下的？呵呵，当然不是。就在BookHome的上部分：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@In(create&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;BookTypeHome&nbsp;bookTypeHome;</span></div>
<br />
前面我说过了。这个@In就是拿来做双向注入的。<span style="color: #000000;">bookTypeHome是要注入的组件名称。</span><br />
其他的都是参数了，没啥好解释的。<br />
但为什么在BookTypeList页面点select，怎么就会自动跳转到BookEdit.xhtml呢？奥秘就在这段代码里（BookTypeList.xhtml）：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:link&nbsp;</span><span style="color: #ff0000;">view</span><span style="color: #0000ff;">="/#{empty&nbsp;from&nbsp;?&nbsp;'BookType'&nbsp;:&nbsp;from}.xhtml"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="Select"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</span><span style="color: #0000ff;">="bookType"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookTypeTypeId"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{bookType.typeId}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:link</span><span style="color: #0000ff;">&gt;</span></div>
从BookEdit里传来一个from。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:button&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="Select&nbsp;bookType"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view</span><span style="color: #0000ff;">="/BookTypeList.xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">f:param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="from"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="BookEdit"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:button</span><span style="color: #0000ff;">&gt;</span></div>
就告诉了BookTypeList，是从BookEdit里来的，点Select的时候就不要去其他地方了。直接回去。<br />
<br />
好了，今天到这，困了，上面讲的不明白的欢迎email或qq联系我。。<br />
<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/248165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-24 23:02 <a href="http://www.blogjava.net/phyeas/articles/248165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(3)：entities</title><link>http://www.blogjava.net/phyeas/articles/247416.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 19 Dec 2008 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/247416.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/247416.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/247416.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/247416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/247416.html</trackback:ping><description><![CDATA[对于一个应用来说，实体对象即是这个应用的数据基础，一开始设计都是从数据模型设计开始的。那我们就从这个Seam的entities开始吧。<br />
<br />
在Seam中你有两种方式创建你的实体对象，一是从数据库生成，二是自己创建，再由seam帮你将对应的数据表建起来。从应用的角度来说，两种方式没有啥区别，但从开发的角度讲，推荐使用生成的方式。因为这样可以剩下很多敲代码的时间。呵呵。好戏放后面，让我们先看自己创建entity的过程。<br />
<br />
前提是你的工程已经创建完毕（如何创建过程请看本系列《1》）。<br />
<br />
一般实体类都放在src/model下。便于辨别那些是业务对象，哪些是数据对象（关于Seam的分层网上很多地方有说，这里就不说了）。在src/model文件夹上右键－》new-&gt;Seam Entity。就可以看到如下界面：<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/a.png" width="622" height="273" /></div>
<br />
这里就只需要填写名称即可。解释一下它们的意思：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam Project:即属于那个工程<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Seam entity class name:即这个类的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Package name:属于那个包的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Master page name:这个会自动生成的家伙是说你的列表页面和业务动作处理（action）的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page name：这个也会自动生成，是指明细页面的名称和业务动作处理的名称（两个是相同名称的）<br />
<br />
随便起个名字，点Finish，可能需要等待一段时间，这是因为Seam自动创建了一个xhtml页面，正在试图打开。打开这个东西需要一点时间<br />
创建成功后。在你所选的包下就会多一个类。里面只有三个属性：id,version,name。以我创建的User类为例：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
@Entity<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;User&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">seam-gen&nbsp;attributes&nbsp;(you&nbsp;should&nbsp;probably&nbsp;edit&nbsp;these)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">add&nbsp;additional&nbsp;entity&nbsp;attributes<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">seam-gen&nbsp;attribute&nbsp;getters/setters&nbsp;with&nbsp;annotations&nbsp;(you&nbsp;probably&nbsp;should&nbsp;edit)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id&nbsp;@GeneratedValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Long&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(Long&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Version<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getVersion()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setVersion(Integer&nbsp;version)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.version&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Length(max</span><span style="color: #000000;">=</span><span style="color: #000000;">20</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
这个类实现自Serializable是因为这个类需要被序列化，当遇到特殊情况时可以起写作用。先解释下这些注解吧。<br />
<span style="color: #000000;">@Entity：标注这是一个实体对象 </span>这是JPA的标记。表明即是类名，当然，你也可以让这两个东西不是对应关系，在<span style="color: #000000;">@Entity下加个＠Table注解即可。比如<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Table(name = "BookType", catalog = "test")</span><br />
<span style="color: #000000;">@Id 主键标识，为了确保对象的唯一性，建议每个entity都加一个主键，否则你就等着出错吧。呵呵<br />
@GeneratedValue&nbsp; 表示主键值为自动生成值<br />
</span><span style="color: #000000;">@Version&nbsp; 这个是jpa的乐观锁机制。有兴趣了解乐观锁及悲观锁的可以看hibernate的资料，篇幅太长，这里就不介绍了。<br />
@Length(max=20)&nbsp; 限制长度为最大20，这个在作验证时有用。<br />
恩。这个实体类就这么简单。呵呵，你还需要其他字段就再加上去吧。。<br />
其实到这个，整个CRUD的页面和处理方法都写好了。这时只要将项目部署到服务器，然后访问列表页面即可。忘了说了，我这里生成的页面是userList.xhtml和user.xhtml。工程名为SeamTest。所以我要访问http://localhost:8080/SeamTest/userList.seam，一个增删改查就出来了哦。还有比这更快的吗。呵呵，现在要在页面上添加东西就照葫芦画瓢。Ctrl+C and Ctrl+v就出来了。如果页面不符合规则，再调也可以，这里简单说下seam的帮定机制，还是已我的user为例：</span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h:inputText&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;required</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="#{userHome.instance.name}"</span><span style="color: #0000ff;">/&gt;</span></div>
<span style="color: #000000;">seam 的帮定机制是根据value进行的。也就是说，无论你的id写的是什么。这个文本框的东西最终都要赋值到name上。这就是seam的邦定机制。这样邦定会有一个问题。等以后介绍，现在先接着看<br />
<br />
生成entities。用数据库表生成entities就更简单了。在src/model文件夹上右键，然后选择new-&gt;Seam Generate entities。会弹出这样的窗口：<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/b.png" width="722" height="317" /></div>
不用修改什么选项，直接finish就可以了。这样entity就会生成了，就连页面什么的都生成了。增删改查也写好了。呵呵，你就做下微调就可以了。这里需要注意的是，你刚刚通过Seam创建的表也被当作普通表生成到你的应用程序里。这样如果你使用的是linux平台，就会多一个UserList.xhtml（刚才那个是userList.xhtml）。如果是windows平台不知道会怎么样哦(windows文件名不分大小写)。<br />
<br />
可能的错误：有几个网友跟我说他们生成entities时发生了错误。错误大意是找不到模板或session包。这个是由于使用的版本太新造成的。JBoss Tools3.0仅支持Seam2.0，不要使用2.1哦。过写时候我把那个错误信息贴上来，供大家参考。<br />
<br />
大概就这些了。有什么问题欢迎讨论。<br />
<br />
</span>
<img src ="http://www.blogjava.net/phyeas/aggbug/247416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-19 23:51 <a href="http://www.blogjava.net/phyeas/articles/247416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(2)：自动生成的代码2-xhtml文件</title><link>http://www.blogjava.net/phyeas/articles/246311.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Mon, 15 Dec 2008 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/246311.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/246311.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/246311.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/246311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/246311.html</trackback:ping><description><![CDATA[在Eclipse生成的代码中页面是使用facelets、richFaces等编写的，所以页面使用的文件格式是xhtml。而非jsp。当然了，你也可以是用jsp编写。这些生成的xhtml全部都在WebContent下
<p>&nbsp;&nbsp; 首先看home.xhtml。</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">ui:composition</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:rich</span><span>=</span><span class="attribute-value">"http://richfaces.org/rich"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">template</span><span>=</span><span class="attribute-value">"layout/template.xhtml"</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">ui:composition</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p>ui:composition元素：UI组件，使用这个元素做根元素表示这个页面并不是一个完整的页面，而是需要一个template页面作为摸版的内容页面。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="attribute">xmlns：根元素命名空间。就是那些不带前缀标签比如&lt;div&gt;</span></p>
<p><span class="attribute">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">&nbsp;</font><span class="attribute"><font color="#ff0000">xmlns:s：Seam元素的命名空间。</font></span></span></p>
<p><span class="attribute"><span class="attribute">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute"><font color="#ff0000">template：摸版页面</font></span></span></span></p>
<p><span class="attribute"><span class="attribute"><span class="attribute"><font color="#000000">摸版页面：</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">"Content-Type"</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html;&nbsp;charset=UTF-8"</span><span>&nbsp;</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>SeamTest</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">"stylesheet/theme.css"</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">"stylesheet"</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/css"</span><span>&nbsp;</span><span class="tag">/&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:include</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">"menu.xhtml"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"projectName"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"SeamTest"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">ui:include</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"body"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"body"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"footer"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Powered&nbsp;by&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam"</span><span class="tag">&gt;</span><span>Seam</span><span class="tag">&lt;/</span><span class="tag-name">a</span><span class="tag">&gt;</span><span>.</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generated&nbsp;by&nbsp;seam-gen.</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p><span>ui:include：与&lt;jsp:include&gt;差不多。但这里没有引入jsp命名空间。所以使用&lt;ui:include&gt;。</span></p>
<p><span>&lt;ui:insert/&gt;：这个是一个template页面。这个标签表示插入一个名为body的内容块。在内容页面--home.xhtml--与此对应的是：&lt;ui:define name="body"&gt;&lt;/ui:define&gt;。在Seam-gen生成的页面中几乎所有的页面都将template指向template.xhtml。还有另一种使用摸板的方式。比如layout/edit.xhtml。</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span class="tag">&lt;</span><span class="tag-name">ui:composition</span><span>&nbsp;&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:ui</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/facelets"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:h</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/html"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:f</span><span>=</span><span class="attribute-value">"http://java.sun.com/jsf/core"</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xmlns:s</span><span>=</span><span class="attribute-value">"http://jboss.com/products/seam/taglib"</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"prop"</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:label</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"name&nbsp;#{invalid?'errors':''}"</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"label"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:span</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"required"</span><span>&nbsp;</span><span class="attribute">rendered</span><span>=</span><span class="attribute-value">"#{required}"</span><span class="tag">&gt;</span><span>*</span><span class="tag">&lt;/</span><span class="tag-name">s:span</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:label</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"value&nbsp;#{invalid?'errors':''}"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:validateAll</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:insert</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:validateAll</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span>
    <li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"error"</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">h:graphicImage</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"/img/error.gif"</span><span>&nbsp;</span><span class="attribute">rendered</span><span>=</span><span class="attribute-value">"#{invalid}"</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"errors"</span><span class="tag">/&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:message</span><span>&nbsp;</span><span class="attribute">styleClass</span><span>=</span><span class="attribute-value">"errors"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span>
    <li class="alt">
    <li><span class="tag">&lt;/</span><span class="tag-name">ui:composition</span><span class="tag">&gt;</span>
    <li class="alt"></li>
</ol>
</div>
<p>&nbsp;</p>
<p>这里依然是使用&lt;ui:insert /&gt;作为内容页面的插入块。这里有两块&lt;ui:insert /&gt;第一块是有name属性的，第二块则是没有name属性的。如果没有name属性，表示在插入块中没有放在&lt;ui:defind/》里的东西都放在没有name的插入块中。。。比如</p>
<div class="highlighter">
<ol class="highlighter-xml">
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:decorate</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"nameDecoration"</span><span>&nbsp;</span><span class="attribute">template</span><span>=</span><span class="attribute-value">"layout/edit.xhtml"</span><span class="tag">&gt;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ui:define</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"label"</span><span class="tag">&gt;</span><span>Name</span><span class="tag">&lt;/</span><span class="tag-name">ui:define</span><span class="tag">&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">h:inputText</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"name"</span><span>&nbsp;</span><span class="attribute">required</span><span>=</span><span class="attribute-value">"true"</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"#{bookHome.instance.name}"</span><span class="tag">/&gt;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">s:decorate</span><span class="tag">&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>这里&lt;ui:defind name="label"&gt;这就是定义那个有名字的插入块。而接下来的&lt;h:inputText ...&nbsp;/&gt;则是放在了下面没有名字的&lt;ui:insert /&gt;中。上面的代码也展示了使用摸板的另一种方式。使用&lt;s:decorate/&gt;使用摸板块，摸板页面的根需要是一个&lt;ui:composition&gt;元素。s:decorate是一个seam元素。必须在seam的管理的页面中使用。</p>
<p>其他：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; jsf中的form是不需要action的。比如&lt;h:form id="login"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 标签的rendered属性表示在什么情况下显示。html标签没有rendered属性，比如div标签没有rendered。</p>
<p>其他的jsf标签我们可以通过学习jsf学习。因为jsf标签，richFaces标签，faceslet标签太多了。这里就不一一介绍了。。。。大家有什么好的资料也麻烦告诉我哦。</span></font></span></span></span></p>
 <img src ="http://www.blogjava.net/phyeas/aggbug/246311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-15 09:15 <a href="http://www.blogjava.net/phyeas/articles/246311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(2)：自动生成的代码</title><link>http://www.blogjava.net/phyeas/articles/244853.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Tue, 09 Dec 2008 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/244853.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/244853.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/244853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/244853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/244853.html</trackback:ping><description><![CDATA[<p>&nbsp; 创建工程后会生成一大堆代码。基本上都是配置文件。而在做 Seam 开发的过程中是不需要整天修改配置文件的。最多写写pages.xml或者faces-config.xml。Seam生成的文件夹如下面的结构：<br />
<img height="290" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/1.jpg" width="180" border="0" /></p>
其中。build文件夹存放的是Ant编译后的东西。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resources文件夹里就一个文件。XXXX-ds.xml。是用于存放数据源(DataSource)配置文件的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src下有两个文件夹：action和modal。即存放页面动作与领域模型。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在modal中有个META-INF文件夹，JPA的配置文件persistence.xml就存放在这个文件夹里。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Modal文件夹里还有几个值得注意的文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如messages_en.properties和security.drl。messages_en.properties是存放系统消息的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想让Seam的系统消息显示中文就需要翻译这个文件。而security.drl则是定义安全规则的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在action文件夹中。有一个包：org\domain\SeamTest\session。其中Authenticator.java会自动生成。用于做登陆验证的。在这里简单介绍下，先看代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">@Name(</span><span style="color: #000000">"</span><span style="color: #000000">authenticator</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Authenticator<br />
<img id="Codehighlighter1_50_408_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_408_Open_Text.style.display='none'; Codehighlighter1_50_408_Closed_Image.style.display='inline'; Codehighlighter1_50_408_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_50_408_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_408_Closed_Text.style.display='none'; Codehighlighter1_50_408_Open_Image.style.display='inline'; Codehighlighter1_50_408_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_50_408_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_50_408_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@Logger&nbsp;Log&nbsp;log;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@In&nbsp;Identity&nbsp;identity;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;authenticate()<br />
<img id="Codehighlighter1_147_406_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_406_Open_Text.style.display='none'; Codehighlighter1_147_406_Closed_Image.style.display='inline'; Codehighlighter1_147_406_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_147_406_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_406_Closed_Text.style.display='none'; Codehighlighter1_147_406_Open_Image.style.display='inline'; Codehighlighter1_147_406_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_147_406_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_147_406_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">authenticating&nbsp;#0</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;identity.getUsername());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">write&nbsp;your&nbsp;authentication&nbsp;logic&nbsp;here,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">return&nbsp;true&nbsp;if&nbsp;the&nbsp;authentication&nbsp;was<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">successful,&nbsp;false&nbsp;otherwise</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;identity.addRole(</span><span style="color: #000000">"</span><span style="color: #000000">admin</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Name 是用于定义Seam组件。这样定义的Seam组件可用于双向注入和其他页面操作。如果你没有这个注释。则表示这个并不是Seam组件，所以也起了一个标识Seam组件的目的。在这里Seam组件被命名为"authenticator"，在页面上要调用这个组件的authenticate方法需要这样写：#{authenticator.authenticate}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Logger用于注入日志组件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@In&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于双向注入。在注入时Seam会寻找当前容器中与该变量名相符的组件。当然了。也可以注入变量名不同的组件。需要指定组件名称，例如：@In("ident")。这样的意思就是在容器中寻找名为"ident"的组件将其注入到该类中。（Seam的作用域比较复杂，本篇暂不介绍）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来便是authenticate方法，这个方法中其实最重要的是后面两句。log.info(....)的意思即保存日志信息，最后那句意思即通过验证。如果验证的用户名密码不符合则return false;来表示拒绝登陆。比较复杂的是identity.addRole。这个方法是为当前用户添加一个角色。单如果该方法最终返回false。那么这些添加的角色将不保存。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么。如何让Seam知道当用户登陆时调用这个方法验证呢？在/WebContent/WEB-INF/components.xml中有这样一段配置：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security:identity&nbsp;</span><span style="color: #ff0000">authenticate-method</span><span style="color: #0000ff">="#{authenticator.authenticate}"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;security-rules</span><span style="color: #0000ff">="#{securityRules}"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remember-me</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span></div>
其中authenticate-method即验证的方法。是以组件形式调用。还有一个security-rules属性则是安全规则。在哪里配置的？就在上面。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">drools:rule-base&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="securityRules"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">drools:rule-files</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/security.drl</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">drools:rule-files</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">drools:rule-base</span><span style="color: #0000ff">&gt;</span></div>
<br />
这就是刚刚说的那个文件。<br />
既然说到components.xml，那我们就来看下这个文件里还有些什么东西。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">core:init&nbsp;</span><span style="color: #ff0000">debug</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;jndi-pattern</span><span style="color: #0000ff">="@jndiPattern@"</span><span style="color: #0000ff">/&gt;</span></div>
这段代码是定义jndi查找规则的。@jndiPattern@的定义是在/src/modal/components.properties里的这样一段配置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#Fri&nbsp;Dec&nbsp;</span><span style="color: #000000">05</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">03</span><span style="color: #000000">&nbsp;CST&nbsp;</span><span style="color: #000000">2008</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />jndiPattern</span><span style="color: #000000">=</span><span style="color: #000000">\#{ejbName}/local<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />embeddedEjb</span><span style="color: #000000">=</span><span style="color: #000000">false<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
这段配置的意思是开启jndi查找规则是ejb组件名称/local。即使用本地EJB组件。而非远程EJB组件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">core:manager&nbsp;</span><span style="color: #ff0000">concurrent-request-timeout</span><span style="color: #0000ff">="500"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation-timeout</span><span style="color: #0000ff">="120000"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation-id-parameter</span><span style="color: #0000ff">="cid"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-conversation-id-parameter</span><span style="color: #0000ff">="pid"</span><span style="color: #0000ff">/&gt;</span></div>
conversation-timeout&nbsp; conversation(页面流)过期时间。我将conversation称为页面流可能不太合适。可以根据你的理解去称呼它。它是一段页面流转的过程定义。Seam中定义了一conversation作用域<br />
conversation-id-parameter用于定义conversation的reuqest parameter name。即因为用户现在在哪个页面流中需要浏览器回传一个参数才知道。<br />
parent-conversation-id-parameter。conversation允许定义子页面流。这个属性定义浏览器回传父conversation的参数名<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">persistence:managed-persistence-context&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="entityManager"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto-create</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity-manager-factory</span><span style="color: #0000ff">="#{SeamTestEntityManagerFactory}"</span><span style="color: #0000ff">/&gt;</span></div>
这个就是jpa的entityManager组件的定义了。在Seam组件中使用@In("entityManager")将会自动注入这个组件
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">event&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="org.jboss.seam.security.notLoggedIn"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">execute</span><span style="color: #0000ff">="#{redirect.captureCurrentView}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">event</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">event&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="org.jboss.seam.security.loginSuccessful"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">execute</span><span style="color: #0000ff">="#{redirect.returnToCapturedView}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">event</span><span style="color: #0000ff">&gt;</span></div>
这个是对于登陆用的。当客户访问一个页面需要登陆。但用户又没有登陆。这时会转到一个登陆页面。登陆完毕后又转会用户要进入的页面。如果有这样的需求就要加上这两句配置。不过Seam已经自动生成了<br />
其他：默认生成的 face-config.xml里没有支持中文。可以加入<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">view-handler</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.sun.facelets.FaceletViewHandler</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">view-handler</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">locale-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">default-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">en</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">default-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">bg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">de</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">en</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">fr</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">tr</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">locale-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">application</span><span style="color: #0000ff">&gt;</span></div>
代码:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">zh_CN</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">supported-locale</span><span style="color: #0000ff">&gt;</span></div>
 <img src ="http://www.blogjava.net/phyeas/aggbug/244853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-09 12:03 <a href="http://www.blogjava.net/phyeas/articles/244853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam新手实战(1)：环境搭建</title><link>http://www.blogjava.net/phyeas/articles/244502.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 05 Dec 2008 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/articles/244502.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/244502.html</wfw:comment><comments>http://www.blogjava.net/phyeas/articles/244502.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/244502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/244502.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px" align="left">&nbsp; 首先说下我使用的环境：JDK1.6,JBOSS4.2,JBOSS TOOLS 3.0,Eclipse with wtp3.4,JBOSS SEAM2.0 <br />
Eclipse下载地址：<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip</a><br />
JBOSS Tools下载地址：<a href="http://www.jboss.org/tools/download/index.html">http://www.jboss.org/tools/download/index.html</a><br />
其他JBOSS的东西都可以在这找到：<a href="http://www.jboss.org/download/">http://www.jboss.org/download/</a><br />
下载完毕后配置环境：<br />
&nbsp;&nbsp; JDK：这个网上大把。不说了<br />
&nbsp;&nbsp; Eclipse：这个就不用说了，直接解压就可以用。<br />
&nbsp; JBossTools：如果你的环境和我的一样，那就在dropins下新建一个文件夹。然后将解压后的features和 plugins文件夹拷贝到里面，这样JBoss Tools就安装好了&nbsp;。安装完后启动Eclipse。将视图转到Seam视图下。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="66" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/perspective.jpg" width="139" border="0" /><br />
&nbsp;&nbsp; 配置Seam：下载JBoss Seam后随便解压到一个位置。然后在Eclipse中选择菜单：Windows-&gt;Preferences。在左边的树中选择JBoss Tools-&gt;Web-&gt;Seam。在右边会出现一个表格和一个add按钮。点Add跳出一个窗口。点Browser选择你刚刚解压出来的Seam的路径。点finish就配置好了。<br />
&nbsp; 配置JBoos Server：配置JBOSS服务器。还是选择Windows-&gt;Preferences。在左边的树中选择Server-&gt;runtime Environments。add-&gt;选择Jboss AS解压路径。finish。还有。。。。在工具栏中有个这个图标<img height="29" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/servers.jpg" width="45" border="0" />。点旁边的下拉框。选择New Server。选择路径，下一步时会让你填用户名密码，初始用户名和密码都是admin。<br />
OK，配置好了<br />
<br />
试下先。<br />
将视图转到Seam视图下。不会的就先看前面。然后再 File -&gt; New -&gt; Seam Project<br />
<img height="423" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newproject.jpg" width="541" border="0" /><br />
需要选的地方是Configureation。默认是1.2的。选择2.0</p>
<p>然后Next -&gt; Next&nbsp; -&gt; Next -&gt; Next到配置数据库连接的位置<br />
&nbsp;选择 new 一个<img height="22" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdatabase.jpg" width="43" border="0" />。进入配置界面。我现在用的是sqlserver。以下以sqlserver为例：<br />
<img height="261" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/editsqlserver.jpg" width="484" border="0" /><br />
选择要配置的数据库类型后填写Name；然后Next<br />
配置驱动，New一个<img height="31" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdriver.jpg" width="27" border="0" />&nbsp;<br />
<img height="160" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/newdriver2.jpg" width="468" border="0" /><br />
配置Jar List后就FINISH了。</p>
<p>然后后面的步骤就简单了。直接可以finish。这样会新建两个工程。一个是主工程。一个是测试用的。<br />
JBoss Tools已经帮你部署到了你选择的Jboos服务器里。<br />
现在直接运行JBoss就OK了。如果你配置了Jboos Server。在工具栏中有个这样的东西<img height="26" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/jbosstoolbar.jpg" width="107" border="0" />第一个是运行Jboss服务器，第二个是用Debug模式运行，第三个是停止。直接点绿色的箭头。启动时可能会报一个错误：java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'information_schema.system_sequences' 无效。这是因为Seam启动时需要这个东西。单数据库里却没有。。不要以为information_schema是库名，而system_sequences是表名哦。因为就算你在数据库里建了这样一个库和表也是没用的。解决办法是修改src/module/META-INF/下的persistence.xml。将里面的hibernate.hbm2ddl.auto设置为create-update。让seam自己去创建对象。但又不自动删除。不能用create-drop。因为如果用create-drop在服务器关闭时Seam会自动将它删除。下次重新创建。而这也会秧及你的数据表。。。只要用create-update启动一次即可。也可以只create，后面每次就可以用update了。其实可以不换成只update。用create-update也挺好。因为如果数据库中存在该数据表。Seam就不会再重新create<br />
如果数据库中的表与将要创建的表结构一致。Seam就不会更新表结构<br />
重新启动服务器。</p>
启动完毕后访问<a href="http://localhost:8080/SeamTest/home.seam">http://localhost:8080/SeamTest/home.seam</a><br />
如果出现如下页面就说明所有配置都已完成。让我们开始Seam吧。<br />
<img height="381" alt="" src="http://www.blogjava.net/images/blogjava_net/phyeas/home.jpg" width="583" border="0" />
 <img src ="http://www.blogjava.net/phyeas/aggbug/244502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-12-05 11:21 <a href="http://www.blogjava.net/phyeas/articles/244502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Seam &amp;lt;s:fileUpload&amp;gt;标签的用法</title><link>http://www.blogjava.net/phyeas/archive/2008/11/30/243547.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sun, 30 Nov 2008 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/11/30/243547.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/243547.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/11/30/243547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/243547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/243547.html</trackback:ping><description><![CDATA[<p>
渲染一个文件上载控件。这个控件必须通过在form中使用 <tt class="literal">multipart/form-data</tt> 的编码类型，例如：
</p>
<pre class="programlisting">&lt;h:form enctype="multipart/form-data"&gt;</pre>
<p>
对于多部分请求，也必须在 <tt class="literal">web.xml</tt> 中配置Seam Multipart Servlet过滤器：
</p>
<pre class="programlisting">&lt;filter&gt;<br />
<br />
&lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;<br />
<br />
&lt;filter-class&gt;org.jboss.seam.servlet.SeamFilter&lt;/filter-class&gt;<br />
<br />
&lt;/filter&gt;<br />
<br />
<br />
<br />
&lt;filter-mapping&gt;<br />
<br />
&lt;filter-name&gt;Seam Filter&lt;/filter-name&gt;<br />
<br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
<br />
&lt;/filter-mapping&gt;</pre>
<p><span class="emphasis"><em>配置</em></span></p>
<p>
下列多部分请求的配置选项可以在 components.xml 中进行配置：
</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p>
    <tt class="literal">createTempFiles</tt> — 如果这个选择设置为true，上载好的文件就流向一个临时文件，而不是流向内存。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">maxRequestSize</tt> — 允许上载文件的最大字节数。
    </p>
    </li>
</ul>
</div>
<p>
下面是一个例子：
</p>
<pre class="programlisting">&lt;component class="org.jboss.seam.web.MultipartFilter"&gt;<br />
<br />
&lt;property name="createTempFiles"&gt;true&lt;/property&gt;<br />
<br />
&lt;property name="maxRequestSize"&gt;1000000&lt;/property&gt;<br />
<br />
&lt;/component&gt;</pre>
<p><span class="emphasis"><em>属性</em></span></p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p>
    <tt class="literal">data</tt> — 这个值绑定接收二进制文件数据。
    接收域应该声明为一个 <tt class="literal">byte[]</tt>  或者 <tt class="literal">InputStream</tt> （必要）。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">contentType</tt> — 这个值绑定接收文件的内容类型（可选）。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">fileName</tt> — 这个值绑定接收的文件名（可选）。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">fileSize</tt> — 这个值绑定接收的文件大小（可选）。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">accept</tt> — 可以接受的一个以逗号分隔的内容类型列表，可能浏览器不支持。
    例如 <tt class="literal">"images/png,images/jpg"</tt>、<tt class="literal">"images/"</tt>。
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">style</tt> — 控件的样式，即CSS之类的
    </p>
    </li>
    <li>
    <p>
    <tt class="literal">styleClass</tt> — 控件的样式类
    </p>
    </li>
</ul>
</div>
<p><span class="emphasis"><em>用法</em></span></p>
<pre class="programlisting">&lt;s:fileUpload id="picture" data="#{register.picture}"<br />
<br />
accept="image/png"<br />
<br />
contentType="#{register.pictureContentType}" /&gt;<br />
<br />
<br />
<br />
转自：http://docs.jboss.org/seam/2.0.0.GA/reference/zh/html/controls.html<br />
<br />
</pre>
<img src ="http://www.blogjava.net/phyeas/aggbug/243547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-11-30 15:43 <a href="http://www.blogjava.net/phyeas/archive/2008/11/30/243547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jpa实现表自连</title><link>http://www.blogjava.net/phyeas/archive/2008/11/30/243545.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sun, 30 Nov 2008 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/11/30/243545.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/243545.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/11/30/243545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/243545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/243545.html</trackback:ping><description><![CDATA[表自连实际上就是one to one的关系。比如书籍类型。类型有父类型。那父类型如何表示呢。在java中应当这样写：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookType&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;BookType&nbsp;parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">getter&nbsp;&amp;&amp;&nbsp;setter<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}</span></div>
但如果这个是一个JPA类就出问题了。因为parent没有写注释。在jpa自动创建表是会认为这是一个字节类型的。所以还应该为parent些上一个注释。既然是自连。应该写@OneToOne<br />
这里就要注意了。OneToOne不能写其他属性，比如不能这样写<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">@OneToOne(targetClass</span><span style="color: #000000;">=</span><span style="color: #000000;">BookType.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)</span></div>
这样的话在系统自动生成数据表时会报错。也不能加 @JoinColumn。唯一的办法就是只要@OneToOne。其他什么都不写。这样就不会报错了。<br />
代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookType&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@OneToOne<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;BookType&nbsp;parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">getter&nbsp;&amp;&amp;&nbsp;setter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}</span></div>
<br />
另外：如果想不让某个属性不被转换成数据库字段。需要在此属性的getter方法上加@Transient注释。比如BookType的fullName属性。<br />
例子：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取包括父节点名称的全部路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Transient<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getFullName(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer(</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(parent</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(parent.getFullName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(</span><span style="color: #000000;">"</span><span style="color: #000000;">-</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;buffer.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.blogjava.net/phyeas/aggbug/243545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-11-30 15:34 <a href="http://www.blogjava.net/phyeas/archive/2008/11/30/243545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu8下构建jdk6+Tomcat+eclipse+MySQL环境</title><link>http://www.blogjava.net/phyeas/archive/2008/11/09/239502.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sun, 09 Nov 2008 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/11/09/239502.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/239502.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/11/09/239502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/239502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/239502.html</trackback:ping><description><![CDATA[JDK：<br />
未安装JDK的时候在命令行输入javac将得到如下提示：<br />
<br />
程序 'javac' 已包含在以下软件包中：<br />
&nbsp;* java-gcj-compat-dev<br />
&nbsp;* openjdk-6-jdk<br />
&nbsp;* gcj-4.2<br />
&nbsp;* kaffe<br />
&nbsp;* ecj<br />
&nbsp;* jikes-sun<br />
&nbsp;* jikes-sablevm<br />
&nbsp;* j2sdk1.4<br />
&nbsp;* jikes-classpath<br />
&nbsp;* jikes-gij<br />
&nbsp;* gcj-4.1<br />
&nbsp;* sun-java5-jdk<br />
&nbsp;* jikes-kaffe<br />
&nbsp;* sun-java6-jdk<br />
试试：sudo apt-get install &lt;选定的软件包&gt;<br />
bash: javac：找不到命令<br />
<br />
。按照提示。输入sudo apt-get install openjdk-6-jdk，在问是否继续时输入y。等下载安装完毕之后javac命令便可以用了。也可以选择其他的JDK比如sun-java6-jdk，命令sudo apt-get install sun-jdk6-jdk，其实都是一样的。选择合适你的即可。<br />
<br />
Tomcat：下载一个Tomcat的版本。将其解压到你的任意文件夹内即可。<br />
测试：用户abc。解压路径用户文件夹下apache-tomcat-6.0.18/<br />
启动命令行。默认启动命令行路径是用户文件夹所在路径。<br />
在命令行输入：./apache-tomcat-6.0.18/bin/startup.sh<br />
如果配置成功将出现Using CATALINA_BASE: <br />
/home/abc/apache-tomcat-6.0.18<br />
Using CATALINA_HOME:&nbsp;&nbsp; /home/abc/apache-tomcat-6.0.18<br />
Using CATALINA_TMPDIR: /home/abc/apache-tomcat-6.0.18/temp<br />
Using JRE_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr<br />
启动浏览器，输入http://localhost:8080/就可以看到可爱的猫了<br />
<br />
Eclipse：Eclipse的安装也可通过apt-get install执行。命令：sudo apt-get install eclipse。但个人建议还是自己下载的好。eclipse不需安装。解压即可运行。给出一个下载地址：<br />
<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-linux-gtk.tar.gz">http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-linux-gtk.tar.gz</a><br />
这是带有wtp的。当然，也可以下不带wtp的。地址在<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a><br />
选择一个合适的下下来。解压到任意文件夹。<br />
测试：双击eclipse文件夹内的eclipse文件。即可启动Eclipse。<br />
<br />
MySQL:MySQL推荐使用apt-get install安装，命令为：<br />
sudo apt-get install mysql-server-5.0<br />
这是服务端的。还有客户端。命令可想而知是sudo apt-get install mysql-client-5.0<br />
mysql图形界面查询工具：sudo apt-get install mysql-query-browser<br />
mysql图形管理器:sudo apt-get install mysql-admin<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/239502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-11-09 11:51 <a href="http://www.blogjava.net/phyeas/archive/2008/11/09/239502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seam获取request</title><link>http://www.blogjava.net/phyeas/archive/2008/11/02/238137.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sat, 01 Nov 2008 17:16:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/11/02/238137.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/238137.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/11/02/238137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/238137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/238137.html</trackback:ping><description><![CDATA[今天看了一下在Seam的组件内获取request。<br />
主要方式有：通过org.jboss.web.ServletContexts.getRequest()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ：通过FaceContext.instance().getEx...Context().getRequest()<br />
但第一种方式不知道为什么返回null。所以只好采用第二种方式<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/238137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-11-02 01:16 <a href="http://www.blogjava.net/phyeas/archive/2008/11/02/238137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EL表达式中的字符串与数字相加</title><link>http://www.blogjava.net/phyeas/archive/2008/10/18/235238.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sat, 18 Oct 2008 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/10/18/235238.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/235238.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/10/18/235238.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/235238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/235238.html</trackback:ping><description><![CDATA[在Tomcat5.0.x中：<br />
当某字符串的值为null或""使。在EL中都会返回0<br />
在Tomcat6.0.x中：<br />
只有当字符串值为null时才返回0<br />
<br />
这就导致了表达式&nbsp; ${someValue + 5} 在someValue的值为""时在两个服务器上的表现不一样<br />
在Tomcat6.0中会报错，而在Tomcat5.0.x中则不会。<br />
<br />
本人猜测应该是实行的规范不一样导致的。在Tomcat5.0.x中实行的是Java EE1.4的规范，Tomcat6.0.x中则是Java EE1.5<br />
所以在使用 "+" 运算符时必先清楚运算符两边的值<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/235238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-10-18 23:01 <a href="http://www.blogjava.net/phyeas/archive/2008/10/18/235238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Ubuntu8.0下装好JBossTools2.0后出现无法打开xhtml文件的情况</title><link>http://www.blogjava.net/phyeas/archive/2008/10/12/233918.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sun, 12 Oct 2008 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/10/12/233918.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/233918.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/10/12/233918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/233918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/233918.html</trackback:ping><description><![CDATA[出现的错误是：<span style="color: rgb(255, 0, 0);">......eclipse/plugins/org.mozilla.xulrunner.gtk.linux.x86_1.8.1.3-20070904/xulrunner/libjavaxpcomglue.so:
libstdc++.so.5: cannot open shared object file: No such file or
directory<br />
<span style="color: rgb(4, 0, 0);">解决办法：<span style="color: rgb(252, 0, 0);"><span style="color: rgb(4, 0, 0);"><span style="color: rgb(252, 0, 0);">sudo apt-get install libstdc++5 <br />
<br />
<span style="color: rgb(2, 0, 0);"><span style="color: rgb(2, 0, 0);">参考资料：</span></span><a href="http://reyjexter.blogspot.com/2008/04/jboss-tools-on-ubuntu-804.html">http://reyjexter.blogspot.com/2008/04/jboss-tools-on-ubuntu-804.html</a><br />
</span></span></span></span></span>
<img src ="http://www.blogjava.net/phyeas/aggbug/233918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-10-12 23:12 <a href="http://www.blogjava.net/phyeas/archive/2008/10/12/233918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一般的数据管理系统中是否有“真正的对象”？</title><link>http://www.blogjava.net/phyeas/archive/2008/10/05/232428.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sat, 04 Oct 2008 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/10/05/232428.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/232428.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/10/05/232428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/232428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/232428.html</trackback:ping><description><![CDATA[这里先说一下在本文中&#8220;真正的对象&#8221;的定义。对象在本文中指：有属性，有行为（方法）的对象。<br />
<br />
一般在面向对象的描述中，对象被描述为有属性有行为的<br />
&nbsp;&nbsp;
我在用JAVA语言写程序。但我觉得大多数时候对象总被置之一边。我所写的大部分都是在写如何处理请求。处理过程，返回结果。这是明显的面向过程。要说最
能体现我在用面向对象的语言的就是偶尔使用一下继承，使用一下多态，来完成复杂一点的过程。仅此而已。面向对象的设计被抛到一边。<br />
<br />
&nbsp;&nbsp; 在一般的数据管理系统中（我所见过的）都是以数据库为中心。然后对数据库表进行增删改查操作。就是所谓的CRUD。在这样的系统中。几乎所有的操作都是围绕数据展开。比如一个BBS。最简单的就是设计一个板块表，一个用户表，一个帖子表，一个回帖表。这样看来系统中应存在四种对象：板块，帖子，回帖，用户。而这些对象有属性。但有行为吗？帖子，有什么行为呢？更新？自己更新自己？自己保存自己？这些在现实中看来都好像不是帖子本身应具有的行为。<br />
<br />
&nbsp;&nbsp; 再从编码来看。一般的编码应该需要一个DAO来执行数据库操作。但这个DAO是一个&#8221;真正的对象&#8220;吗。不尽然。因为DAO本身没有什么属性可言的。当然了。因为它是无状态的。它是用来进行数据库操作的。虽然被称为数据访问<span style="color: red;">对象</span>。但其实并不是真正意义上的对象。只是一个过程。对。只是一个在与数据库交互时不可避免的一个过程。 <br />
<br />
&nbsp; 而系统中是否真的有真正的对象。是个问题。 现在有了Hibernate，有了Spring。各个层次分工更加明确。在实体类中是没有行为的。成了纯粹的数据对象。人们通过写那些写了上百遍的业务代码去实现功能。每天都在作增删改查。。不厌其烦。。。每天写的代码都类似。。不能说不是个问题。。。可能只是个人感觉。。<br />
&nbsp; <br />
&nbsp; 再说说刚刚BBS的例子。要真要说这个例子中有对象。我觉得应该是用户。用户该有行为。也有属性。用户可以操作其他对象。比如：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;User{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;userName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">..其他属性</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;更新自己的帖子(帖子对象){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">..作更新</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
这就是本系统的唯一对象了吗？<br />
各位看官。你们的系统都是怎么设计的？<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/232428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-10-05 00:56 <a href="http://www.blogjava.net/phyeas/archive/2008/10/05/232428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源消息平台的构想（初始阶段）</title><link>http://www.blogjava.net/phyeas/archive/2008/09/13/228814.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Sat, 13 Sep 2008 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/09/13/228814.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/228814.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/09/13/228814.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/228814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/228814.html</trackback:ping><description><![CDATA[突然觉得需要一个开源的消息平台。就是类似QQ的软件。但是是开源的。支持插件的东东。这样就可以自己定制组件了。可惜类似的消息传送都没有这种形式的。所有的东西都必须官方提供。这对我这个开发人员来说很不爽。在Linux下的QQ啥都没有。很是郁闷。<br />
今天坐车的时候突然想起。其实我们可以做这样的东西。统一标准的开源的消息平台。作成可支持插件的。那么开发人员就可以自己开发自己需要的插件。也可以共享出来。<br />
再不如。需要一个远程任务调度的插件。发送远程命令使远程机器执行一系列的操作。可以用插件的方式完成开发。这样就可以不依赖于官方的实现。<br />
我们可以开发一个开源的内核出来。就跟Linux一样。开发内核。然后让发行商开发出发行版本。或者内部使用版本。省去很多开发人员的麻烦。<br />
希望大家多提提意见。这个计划也是今天才想到的。很不成熟。各位看官别只顾着看阿<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/228814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-09-13 23:55 <a href="http://www.blogjava.net/phyeas/archive/2008/09/13/228814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans安装Facelet插件失败的原因及解决方案</title><link>http://www.blogjava.net/phyeas/archive/2008/09/05/227328.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 05 Sep 2008 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/09/05/227328.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/227328.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/09/05/227328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/227328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/227328.html</trackback:ping><description><![CDATA[今天本来想复习下Seam来着。奈何只装了NetBeans。于是想看下有没关于Seam的NetBeans插件。发现竟然没有。好不容易找到一个。竟然还只支持1.2。没办法。不想做之际。发现原来有Facelet插件。于是兴致勃勃地下了下来准备安装。Oh.My god.竟然安装不上。说缺少模块<br />
<font size="2">Missing required modules for Plugin Facelets Support:<br />
JSP Parser [module org.netbeans.modules.web.jspparser/3 = 200805300101]<br />
对付这种错误。我一般的做法就上网找资料。没想到baidu上啥也查不到。于是抓住最后一根救命稻草。上Google。原来baidu查不到的原因是因为都所E文的资料。英文我一看就想睡觉。更别说正经地看上一会了。可是这次没办法。。查到一些资料。给下连接。<a href="http://blogs.sun.com/poting/entry/build_and_install_facelets_support">http://blogs.sun.com/poting/entry/build_and_install_facelets_support</a></font> , <a href="http://jj-blogger.blogspot.com/2008/03/netbeans-61-beta.html?showComment=1217485920000#c2560067507997452663">http://jj-blogger.blogspot.com/2008/03/netbeans-61-beta.html?showComment=1217485920000#c2560067507997452663</a><br />
在这两个地方找到了解决方案。翻译就免了。写下主要的解决步骤给像我这样一看英文就想睡觉的。。<br />
首先下载下来的Facelet插件是一个zip文件。里面包含了Facelet Library,Facelet Support，等。我就不一一列举了。一共四个nbm文件，其中安装不上的所那个org-netbeans-modules-web-frameworks-facelets.nbm，这个就所Facelet Support的插件文件。也就这个文件里的内容需要修改。首先。说下。该文件其实是个解压文件（好像地球人都知道了。呵呵），把里面的info/info.xml提取出来。搜索 "jspparser" ，它后面跟着日期。将日期该为"200807041025"，然后。再从nbm文件里的netbeans/modules/提取到一个jar文件。再从jar文件中提取META-INF/MANIFEST.MF。将里面的"jspparser"跟着的日期也改成一样的。最后将改动的文件都打包回去。安装。大功告成。有啥不明白的以上面两个网址的内容为准。本人英文不是很好。关于Facelet使用就要自己查拉。欢迎各位交流<br />
<br />
补充：（竟然没说原因。呵呵。发的时候忘记了），发生这个错误的原因是因为NetBeans6.0升级后。jspparser的模块升级了。日期被改了。但是Facelet插件中依赖的插件却没有改。所以会导致该错误。其实这个改动对Facelet应该是没影响的。 Over<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/227328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-09-05 21:52 <a href="http://www.blogjava.net/phyeas/archive/2008/09/05/227328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB3转换错误(Cannot case to...)</title><link>http://www.blogjava.net/phyeas/archive/2008/09/04/227031.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Thu, 04 Sep 2008 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/09/04/227031.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/227031.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/09/04/227031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/227031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/227031.html</trackback:ping><description><![CDATA[今天又温习EJB3。用Netbeans作了一遍。发现竟然运行不了。靠。难道写了几百遍的东西竟然写错了？检查了一遍，好像没什么错。主要所在Client端lookup的时候能找到jndi资源。但是说我类型转换错误。查资料。看以前的代码。没发现什么异常。代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">InitialContext&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InitialContext();<br />
</span><span style="color: #000000;">Local</span><span style="color: #000000;">Interface&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">(LocalInterface)ctx.lookup(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean/local</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">..执行调用</span></div>
<span style="color: #000000;">Local</span>nterface是随便起的。代表本地接口。根据EJB3教程上说的。在同一JVM上调用，创建InitialContext时可不用传如Properties。检查了N遍也不知道哪错。于是。很无奈地复制原先的测试程序过来。竟然成功了。靠。程序如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Properties prop=new Properties();<br />
prop.put(Context.PROVIDER_URL,"localhost");<br />
InitialContext&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InitialContext(prop);<br />
LocalInterface&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">(LocalInterface)ctx.lookup(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean/local</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">..执行调用</span></div>
这让我想到了传于不传Properties的区别。原来如果不传Properties。它会去读取服务器上一个叫jndi.properties的文件。该文件默认所没有java.naming.provider.url的定义的。于是我在该文件内定义了java.naming.provider.url=localhost。第一段代码可以运行了。<br />
不过还是有问题。不知道如果不定义的话默认是什么。为什么默认的不行。不得而知。没有帮助文档。各位有资料的话请告诉我阿。<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/227031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-09-04 18:09 <a href="http://www.blogjava.net/phyeas/archive/2008/09/04/227031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装了openSUSE11.0</title><link>http://www.blogjava.net/phyeas/archive/2008/09/03/226540.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Tue, 02 Sep 2008 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/09/03/226540.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/226540.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/09/03/226540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/226540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/226540.html</trackback:ping><description><![CDATA[最近闲得发荒。突然想装个Linux来玩下。于是出门寻找Linux安装光盘。没想到整个珠海就都没有多少张卖。有还所Red Hat,Red flag的。不喜欢这两个版本。于是下决心自己刻了个Kubuntu和Ubuntu的(openSUSE的刚开始没刻成功。刻了N遍才成功的)。开始格式化硬盘。本以为一切可以顺顺利利。没想到阿没想到。第一次装的所Kubuntu。装完重启却发现说GRUB引导失败：GRUB Loading stage1.5...Error 21。网上说要修复Grub。按照网上的方法作了一遍。重启。还不行。郁闷。开始怀疑是不是自己刻的盘有问题。于是再装Ubuntu，问题依旧。。于是开始查Grub的Error21是什么意思。意思是：&#8220;指定的分区未找到&#8221;？于是想到我的硬盘所SATA的。主板设置为RIAD。于是换了个硬盘。装openSUSE。成功了。哈哈。再用原来的硬盘装openSUSE。问题依旧。可以确定是硬盘(SATA)跟主板(ASUS P5VD2)搭配的问题。<br />
<br />
装完系统后遇到的第一个问题是上不了网。这可郁闷了。回想系统还是Windows时的情景。在Windows下我的网卡也要驱动才能用。并且驱动装起来还很麻烦。于是怀疑所不是驱动的问题。插上个独立网卡。能上网了。想上网找驱动。可是没找到。郁闷<br />
<br />
第二个问题就是启动不了Eclipse3.4。郁闷。又上网查了一下。没人能说这是怎么回事。换了个版本,Eclipse3.3。启动成功。看来所Eclipse 的 Bug了。齐活。收工<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/226540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-09-03 01:06 <a href="http://www.blogjava.net/phyeas/archive/2008/09/03/226540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA语音聊天程序 - 服务器的设计(二)</title><link>http://www.blogjava.net/phyeas/archive/2008/08/15/222334.html</link><dc:creator>phyeas</dc:creator><author>phyeas</author><pubDate>Fri, 15 Aug 2008 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/phyeas/archive/2008/08/15/222334.html</guid><wfw:comment>http://www.blogjava.net/phyeas/comments/222334.html</wfw:comment><comments>http://www.blogjava.net/phyeas/archive/2008/08/15/222334.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/phyeas/comments/commentRss/222334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/phyeas/services/trackbacks/222334.html</trackback:ping><description><![CDATA[试了一天。终于成功了。数据[-128,127...]开头的未服务器预设服务。其他为语音内容或其他信息。<br />
比如：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;{&nbsp;Byte.MIN_VALUE,&nbsp;Byte.MAX_VALUE,&nbsp;</span><span style="color: #000000;">0x01</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x01</span><span style="color: #000000;">&nbsp;};</span></div>
表示加入一个ID未0x01的组。<br />
废话不多说。附上程序。<br />
<br />
<a href="/Files/phyeas/Server.rar">http://www.blogjava.net/Files/phyeas/Server.rar</a><br />
<br />
内附测试。<br />
<br />
<img src ="http://www.blogjava.net/phyeas/aggbug/222334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/phyeas/" target="_blank">phyeas</a> 2008-08-15 20:38 <a href="http://www.blogjava.net/phyeas/archive/2008/08/15/222334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>