﻿<?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-成长中的记忆-文章分类-Struts</title><link>http://www.blogjava.net/aiyoyoyo/category/7532.html</link><description>这是我的成长，这是我的天地，学习JAVA，只因快乐。</description><language>zh-cn</language><lastBuildDate>Wed, 07 Mar 2007 11:24:59 GMT</lastBuildDate><pubDate>Wed, 07 Mar 2007 11:24:59 GMT</pubDate><ttl>60</ttl><item><title>Struts过滤器的使用,已解决中文问题</title><link>http://www.blogjava.net/aiyoyoyo/articles/32982.html</link><dc:creator>aiyoyoyo</dc:creator><author>aiyoyoyo</author><pubDate>Wed, 01 Mar 2006 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/aiyoyoyo/articles/32982.html</guid><wfw:comment>http://www.blogjava.net/aiyoyoyo/comments/32982.html</wfw:comment><comments>http://www.blogjava.net/aiyoyoyo/articles/32982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aiyoyoyo/comments/commentRss/32982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aiyoyoyo/services/trackbacks/32982.html</trackback:ping><description><![CDATA[web.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" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Set Character Encoding</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">mypack.Charset</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">encoding</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">UTF</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">ignore</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Set Character Encoding</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">action</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">servlet</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span></div>过滤的类 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />package mypack;<span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.io.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_108_1182_Open_Image" onclick="this.style.display='none'; Codehighlighter1_108_1182_Open_Text.style.display='none'; Codehighlighter1_108_1182_Closed_Image.style.display='inline'; Codehighlighter1_108_1182_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_108_1182_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_108_1182_Closed_Text.style.display='none'; Codehighlighter1_108_1182_Open_Image.style.display='inline'; Codehighlighter1_108_1182_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Charset </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> Filter </span><span id="Codehighlighter1_108_1182_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_108_1182_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> String encoding </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> FilterConfig filterConfig </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> ignore </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_248_303_Open_Image" onclick="this.style.display='none'; Codehighlighter1_248_303_Open_Text.style.display='none'; Codehighlighter1_248_303_Closed_Image.style.display='inline'; Codehighlighter1_248_303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_248_303_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_303_Closed_Text.style.display='none'; Codehighlighter1_248_303_Open_Image.style.display='inline'; Codehighlighter1_248_303_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> destroy() </span><span id="Codehighlighter1_248_303_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_248_303_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.encoding </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.filterConfig </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> doFilter(ServletRequest request, ServletResponse response,<br /><img id="Codehighlighter1_436_655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_436_655_Open_Text.style.display='none'; Codehighlighter1_436_655_Closed_Image.style.display='inline'; Codehighlighter1_436_655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_436_655_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_436_655_Closed_Text.style.display='none'; Codehighlighter1_436_655_Open_Image.style.display='inline'; Codehighlighter1_436_655_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            FilterChain chain)</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> IOException, ServletException </span><span id="Codehighlighter1_436_655_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_436_655_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_496_615_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_615_Open_Text.style.display='none'; Codehighlighter1_496_615_Closed_Image.style.display='inline'; Codehighlighter1_496_615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_496_615_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_496_615_Closed_Text.style.display='none'; Codehighlighter1_496_615_Open_Image.style.display='inline'; Codehighlighter1_496_615_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (ignore </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> (request.getCharacterEncoding() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)) </span><span id="Codehighlighter1_496_615_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_496_615_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String encoding </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> selectEncoding(request);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (encoding </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                request.setCharacterEncoding(encoding);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        chain.doFilter(request, response);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_727_1091_Open_Image" onclick="this.style.display='none'; Codehighlighter1_727_1091_Open_Text.style.display='none'; Codehighlighter1_727_1091_Closed_Image.style.display='inline'; Codehighlighter1_727_1091_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_727_1091_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_727_1091_Closed_Text.style.display='none'; Codehighlighter1_727_1091_Open_Image.style.display='inline'; Codehighlighter1_727_1091_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(FilterConfig filterConfig) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> ServletException </span><span id="Codehighlighter1_727_1091_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_727_1091_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.filterConfig </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> filterConfig;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.encoding </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> filterConfig.getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">encoding</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String value </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> filterConfig.getInitParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ignore</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (value </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ignore </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (value.equalsIgnoreCase(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ignore </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (value.equalsIgnoreCase(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yes</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ignore </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.ignore </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1151_1180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1151_1180_Open_Text.style.display='none'; Codehighlighter1_1151_1180_Closed_Image.style.display='inline'; Codehighlighter1_1151_1180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1151_1180_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1151_1180_Closed_Text.style.display='none'; Codehighlighter1_1151_1180_Open_Image.style.display='inline'; Codehighlighter1_1151_1180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> String selectEncoding(ServletRequest request) </span><span id="Codehighlighter1_1151_1180_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1151_1180_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.encoding);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />这2个加进工程里，就可以直接运行了。不用在设置什么。<br />至于数据库最好设置为UTF-8.<br />从此以后远离中文出现乱码的烦恼。哈哈哈<img src ="http://www.blogjava.net/aiyoyoyo/aggbug/32982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aiyoyoyo/" target="_blank">aiyoyoyo</a> 2006-03-01 11:16 <a href="http://www.blogjava.net/aiyoyoyo/articles/32982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RegExp 正则表达式</title><link>http://www.blogjava.net/aiyoyoyo/articles/31352.html</link><dc:creator>aiyoyoyo</dc:creator><author>aiyoyoyo</author><pubDate>Sat, 18 Feb 2006 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/aiyoyoyo/articles/31352.html</guid><wfw:comment>http://www.blogjava.net/aiyoyoyo/comments/31352.html</wfw:comment><comments>http://www.blogjava.net/aiyoyoyo/articles/31352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aiyoyoyo/comments/commentRss/31352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aiyoyoyo/services/trackbacks/31352.html</trackback:ping><description><![CDATA[<B>
<P><FONT size=2>[原创文章，转载请保留或注明出处：</FONT><A href="http://www.regexlab.com/zh/regref.htm"><FONT color=#ff1493 size=2>http://www.regexlab.com/zh/regref.htm</FONT></A></P>
<P><BR><FONT size=2>引言</FONT></B><BR><BR><FONT size=2>&nbsp;&nbsp;&nbsp; 正则表达式（regular expression）描述了一种字符串匹配的模式，可以用来：（1）检查一个串中是否含有符合某个规则的子串，并且可以得到这个子串；（2）根据匹配规则对字符串进行灵活的替换操作。<BR><BR>&nbsp;&nbsp;&nbsp; 正则表达式学习起来其实是很简单的，不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂，一方面是因为大多数的文档没有做到由浅入深地讲解，概念上没有注意先后顺序，给读者的理解带来困难；另一方面，各种引擎自带的文档一般都要介绍它特有的功能，然而这部分特有的功能并不是我们首先要理解的。<BR><BR>&nbsp;&nbsp;&nbsp; 文章中的每一个举例，都可以点击进入到测试页面进行测试。闲话少说，开始。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1. 正则表达式规则</FONT></B></P>
<P><B><FONT size=2>1.1 普通字符</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号，都是"普通字符"。表达式中的普通字符，在匹配一个字符串的时候，匹配与之相同的一个字符。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=c&amp;txt=abcde"><FONT size=2>举例1：表达式 "c"，在匹配字符串 "abcde" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："c"；匹配到的位置是：开始于2，结束于3。（注：下标从0开始还是从1开始，因当前编程语言的不同而可能不同）<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=bcd&amp;txt=abcde"><FONT size=2>举例2：表达式 "bcd"，在匹配字符串 "abcde" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："bcd"；匹配到的位置是：开始于1，结束于4。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1.2 简单的转义字符</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 一些不便书写的字符，采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=70>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>可匹配</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\r, \n</FONT></P></TD>
<TD>
<P><FONT size=2>代表回车和换行符</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\t</FONT></P></TD>
<TD>
<P><FONT size=2>制表符</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\\</FONT></P></TD>
<TD>
<P><FONT size=2>代表 "\" 本身</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 还有其他一些在后边章节中有特殊用处的标点符号，在前面加 "\" 后，就代表该符号本身。比如：^, $ 都有特殊意义，如果要想匹配字符串中 "^" 和 "$" 字符，则表达式就需要写成 "\^" 和 "\$"。</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=66>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>可匹配</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\^</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 ^ 符号本身</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\$</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 $ 符号本身</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\.</FONT></P></TD>
<TD>
<P><FONT size=2>匹配小数点（.）本身</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5C$d&amp;txt=abc$de"><FONT size=2>举例1：表达式 "\$d"，在匹配字符串 "abc$de" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："$d"；匹配到的位置是：开始于3，结束于5。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1.3 能够与 '多种字符' 匹配的表达式</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 正则表达式中的一些表示方法，可以匹配 '多种字符' 其中的任意一个字符。比如，表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符，但是只能是一个，不是多个。这就好比玩扑克牌时候，大小王可以代替任意一张牌，但是只能代替一张牌。</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=66>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>可匹配</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\d</FONT></P></TD>
<TD>
<P><FONT size=2>任意一个数字，0~9 中的任意一个</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\w</FONT></P></TD>
<TD>
<P><FONT size=2>任意一个字母或数字或下划线，也就是 A~Z,a~z,0~9,_ 中任意一个</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\s</FONT></P></TD>
<TD>
<P><FONT size=2>包括空格、制表符、换页符等空白字符的其中任意一个</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>.</FONT></P></TD>
<TD>
<P><FONT size=2>小数点可以匹配除了换行符（\n）以外的任意一个字符</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%5Cd&amp;txt=abc123"><FONT size=2>举例1：表达式 "\d\d"，在匹配 "abc123" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："12"；匹配到的位置是：开始于3，结束于5。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=a.%5Cd&amp;txt=aaa100"><FONT size=2>举例2：表达式 "a.\d"，在匹配 "aaa100" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："aa1"；匹配到的位置是：开始于1，结束于4。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1.4 自定义能够匹配 '多种字符' 的表达式</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 使用方括号 [ ] 包含一系列字符，能够匹配其中任意一个字符。用 [^ ] 包含一系列字符，则能够匹配其中字符之外的任意一个字符。同样的道理，虽然可以匹配其中任意一个，但是只能是一个，不是多个。</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=80>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>可匹配</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>[ab5@]</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 "a" 或 "b" 或 "5" 或 "@"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>[^abc]</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 "a","b","c" 之外的任意一个字符</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>[f-k]</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 "f"~"k" 之间的任意一个字母</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>[^A-F0-3]</FONT></P></TD>
<TD>
<P><FONT size=2>匹配 "A"~"F","0"~"3" 之外的任意一个字符</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=[bcd][bcd]&amp;txt=abc123"><FONT size=2>举例1：表达式 "[bcd][bcd]" 匹配 "abc123" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："bc"；匹配到的位置是：开始于1，结束于3。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5B%5Eabc%5D&amp;txt=abc123"><FONT size=2>举例2：表达式 "[^abc]" 匹配 "abc123" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："1"；匹配到的位置是：开始于3，结束于4。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1.5 修饰匹配次数的特殊符号</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 前面章节中讲到的表达式，无论是只能匹配一种字符的表达式，还是可以匹配多种字符其中任意一个的表达式，都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号，那么不用重复书写表达式就可以重复匹配。<BR><BR>&nbsp;&nbsp;&nbsp; 使用方法是："次数修饰"放在"被修饰的表达式"后边。比如："[bcd][bcd]" 可以写成 "[bcd]{2}"。</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=67>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>作用</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>{n}</FONT></P></TD>
<TD>
<P><FONT size=2>表达式重复n次，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=\w{2}&amp;txt=ab+c6"><FONT size=2>"\w{2}" 相当于 "\w\w"</FONT></A><FONT size=2>；</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=a{5}&amp;txt=bbaaaaaddee"><FONT size=2>"a{5}" 相当于 "aaaaa"</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>{m,n}</FONT></P></TD>
<TD>
<P><FONT size=2>表达式至少重复m次，最多重复n次，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=ba{1,3}&amp;txt=a,baaa,baa,b,ba"><FONT size=2>"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>{m,}</FONT></P></TD>
<TD>
<P><FONT size=2>表达式至少重复m次，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=\w\d{2,}&amp;txt=b1,a12,_456,_4AA,M12344,12346546547446534543543"><FONT size=2>"\w\d{2,}"可以匹配 "a12","_456","M12344"...</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>?</FONT></P></TD>
<TD>
<P><FONT size=2>匹配表达式0次或者1次，相当于 {0,1}，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=a[cd]%3F&amp;txt=a,c,d,ac,ad"><FONT size=2>"a[cd]?"可以匹配 "a","ac","ad"</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>+</FONT></P></TD>
<TD>
<P><FONT size=2>表达式至少出现1次，相当于 {1,}，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=a%2Bb&amp;txt=a%2Cb%2Cab%2Caab%2Caaab"><FONT size=2>"a+b"可以匹配 "ab","aab","aaab"...</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>*</FONT></P></TD>
<TD>
<P><FONT size=2>表达式不出现或出现任意次，相当于 {0,}，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5C%5E*b&amp;txt=%5E%2Cb%2C%5E%5E%5Eb%2C%5E%5E%5E%5E%5E%5E%5Eb"><FONT size=2>"\^*b"可以匹配 "b","^^^b"...</FONT></A></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C.%3F%5Cd*&amp;txt=It%20costs%20%2412.5"><FONT size=2>举例1：表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："12.5"；匹配到的位置是：开始于10，结束于14。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=go{2,8}gle&amp;txt=Ads%20by%20goooooogle%2C%20or%20gooogle"><FONT size=2>举例2：表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："goooooogle"；匹配到的位置是：开始于7，结束于17。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>1.6 其他一些代表抽象意义的特殊符号</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 一些符号在表达式中代表抽象的特殊意义：</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=67>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>作用</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>^</FONT></P></TD>
<TD>
<P><FONT size=2>与字符串开始的地方匹配，不匹配任何字符</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>$</FONT></P></TD>
<TD>
<P><FONT size=2>与字符串结束的地方匹配，不匹配任何字符</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\b</FONT></P></TD>
<TD>
<P><FONT size=2>匹配一个单词边界，也就是单词和空格之间的位置，不匹配任何字符</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 进一步的文字说明仍然比较抽象，因此，举例帮助大家理解。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=xxx+aaa+xxx"><FONT size=2>举例1：表达式 "^aaa" 在匹配 "xxx aaa xxx" 时</FONT></A><FONT size=2>，匹配结果是：失败。因为 "^" 要求与字符串开始的地方匹配，因此，只有当 "aaa" 位于字符串的开头的时候，"^aaa" 才能匹配，</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=aaa+xxx+xxx"><FONT size=2>比如："aaa xxx xxx"</FONT></A><FONT size=2>。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+aaa+xxx"><FONT size=2>举例2：表达式 "aaa$" 在匹配 "xxx aaa xxx" 时</FONT></A><FONT size=2>，匹配结果是：失败。因为 "$" 要求与字符串结束的地方匹配，因此，只有当 "aaa" 位于字符串的结尾的时候，"aaa$" 才能匹配，</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+xxx+aaa"><FONT size=2>比如："xxx xxx aaa"</FONT></A><FONT size=2>。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=.%5Cb.&amp;txt=@@@abc"><FONT size=2>举例3：表达式 ".\b." 在匹配 "@@@abc" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："@a"；匹配到的位置是：开始于2，结束于4。<BR>&nbsp;&nbsp;&nbsp; 进一步说明："\b" 与 "^" 和 "$" 类似，本身不匹配任何字符，但是它要求它在匹配结果中所处位置的左右两边，其中一边是 "\w" 范围，另一边是 非"\w" 的范围。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cbend%5Cb&amp;txt=weekend,endfor,end"><FONT size=2>举例4：表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："end"；匹配到的位置是：开始于15，结束于18。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 一些符号可以影响表达式内部的子表达式之间的关系：</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=65>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>作用</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>|</FONT></P></TD>
<TD>
<P><FONT size=2>左右两边表达式之间 "或" 关系，匹配左边或者右边</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>( )</FONT></P></TD>
<TD>
<P><FONT size=2>(1). 在被修饰匹配次数的时候，括号中的表达式可以作为整体被修饰<BR>(2). 取匹配结果的时候，括号中的表达式匹配到的内容可以被单独得到</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=Tom%7CJack&amp;txt=I%27m+Tom%2C+he+is+Jack"><FONT size=2>举例5：表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是："Tom"；匹配到的位置是：开始于4，结束于7。匹配下一个时，匹配结果是：成功；匹配到的内容是："Jack"；匹配到的位置时：开始于15，结束于19。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28go%5Cs*%29%2B&amp;txt=Let%27s%20go%20go%20go%21"><FONT size=2>举例6：表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到内容是："go go go"；匹配到的位置是：开始于6，结束于14。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%uFFE5%28%5Cd%2B%5C.%3F%5Cd*%29&amp;txt=%uFF0410.9%2C%uFFE520.5"><FONT size=2>举例7：表达式 "￥(\d+\.?\d*)" 在匹配 "＄10.9,￥20.5" 时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是："￥20.5"；匹配到的位置是：开始于6，结束于10。单独获取括号范围匹配到的内容是："20.5"。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>2. 正则表达式中的一些高级规则</FONT></B></P>
<P><B><FONT size=2>2.1 匹配次数中的贪婪与非贪婪</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 在使用修饰匹配次数的特殊符号时，有几种表示方法可以使同一个表达式能够匹配不同的次数，比如："{m,n}", "{m,}", "?", "*", "+"，具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中，总是尽可能多的匹配。比如，针对文本 "dxxxdxxxd"，举例如下：</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=93>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>匹配结果</FONT></P></TD></TR>
<TR>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)&amp;txt=dxxxdxxxd"><FONT size=2>(d)(\w+)</FONT></A></P></TD>
<TD>
<P><FONT size=2>"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"</FONT></P></TD></TR>
<TR>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)(d)&amp;txt=dxxxdxxxd"><FONT size=2>(d)(\w+)(d)</FONT></A></P></TD>
<TD>
<P><FONT size=2>"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d"，但是为了使整个表达式匹配成功，"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 由此可见，"\w+" 在匹配的时候，总是尽可能多的匹配符合它规则的字符。虽然第二个举例中，它没有匹配最后一个 "d"，但那也是为了让整个表达式能够匹配成功。同理，带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配，带 "?" 的表达式在可匹配可不匹配的时候，也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 非贪婪模式：<BR><BR>&nbsp;&nbsp;&nbsp; 在修饰匹配次数的特殊符号后再加上一个 "?" 号，则可以使匹配次数不定的表达式尽可能少的匹配，使可匹配可不匹配的表达式，尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式，也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候，与贪婪模式类似，非贪婪模式会最小限度的再匹配一些，以使整个表达式匹配成功。举例如下，针对文本 "dxxxdxxxd" 举例：</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=93>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>匹配结果</FONT></P></TD></TR>
<TR>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)&amp;txt=dxxxdxxxd"><FONT size=2>(d)(\w+?)</FONT></A></P></TD>
<TD>
<P><FONT size=2>"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符，结果是："\w+?" 只匹配了一个 "x"</FONT></P></TD></TR>
<TR>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)(d)&amp;txt=dxxxdxxxd"><FONT size=2>(d)(\w+?)(d)</FONT></A></P></TD>
<TD>
<P><FONT size=2>为了让整个表达式匹配成功，"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配，从而使整个表达式匹配成功。因此，结果是："\w+?" 匹配 "xxx"</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 更多的情况，举例如下：<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E"><FONT size=2>举例1：表达式 "&lt;td&gt;(.*)&lt;/td&gt;" 与字符串 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 匹配时</FONT></A><FONT size=2>，匹配的结果是：成功；匹配到的内容是 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 整个字符串， 表达式中的 "&lt;/td&gt;" 将与字符串中最后一个 "&lt;/td&gt;" 匹配。 <BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%3F%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E"><FONT size=2>举例2：相比之下，表达式 "&lt;td&gt;(.*?)&lt;/td&gt;" 匹配举例1中同样的字符串时</FONT></A><FONT size=2>，将只得到 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;"， 再次匹配下一个时，可以得到第二个 "&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;"。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>2.2 反向引用 \1, \2...</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 表达式在匹配时，表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候，小括号包含的表达式所匹配到的字符串可以单独获取。这一点，在前面的举例中，已经多次展示了。在实际应用场合中，当用某种边界来查找，而所要获取的内容又不包含边界时，必须使用小括号来指定所要的范围。比如前面的 "&lt;td&gt;(.*?)&lt;/td&gt;"。<BR><BR>&nbsp;&nbsp;&nbsp; 其实，"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用，在匹配过程中也可以使用。表达式后边的部分，可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串，"\2" 引用第2对括号内匹配到的字符串……以此类推，如果一对括号内包含另一对括号，则外层的括号先排序号。换句话说，哪一对的左括号 "(" 在前，那这一对就先排序号。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 举例如下：<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28%27%7C%22%29%28%2E%2A%3F%29%28%5C1%29&amp;txt=%27Hello%27%2C+%22World%22"><FONT size=2>举例1：表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是：" 'Hello' "。再次匹配下一个时，可以匹配到 " "World" "。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%5C1%7B4%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999"><FONT size=2>举例2：表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时</FONT></A><FONT size=2>，匹配结果是：成功；匹配到的内容是 "ccccc"。再次匹配下一个时，将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次，</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cw%7B5%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999"><FONT size=2>注意与 "\w{5,}" 之间的区别</FONT></A><FONT size=2>。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%3C%28%5Cw%2B%29%5Cs%2A%28%5Cw%2B%28%3D%28%27%7C%22%29%2E%2A%3F%5C4%29%3F%5Cs%2A%29%2A%3E%2E%2A%3F%3C%2F%5C1%3E&amp;txt=%3Ctd+id%3D%27td1%27+style%3D%22bgcolor%3Awhite%22%3E%3C%2Ftd%3E%0D%0A%3Cbody+onload%3D%22doit%28%29%22%3E%3C%2Fbody%3E"><FONT size=2>举例3：表达式 "&lt;(\w+)\s*(\w+(=('|").*?\4)?\s*)*&gt;.*?&lt;/\1&gt;" 在匹配 "&lt;td id='td1' style="bgcolor:white"&gt;&lt;/td&gt;" 时</FONT></A><FONT size=2>，匹配结果是成功。如果 "&lt;td&gt;" 与 "&lt;/td&gt;" 不配对，则会匹配失败；如果改成其他配对，也可以匹配成功。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>2.3 预搜索，不匹配；反向预搜索，不匹配</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 前面的章节中，我讲到了几个代表抽象意义的特殊符号："^"，"$"，"\b"。它们都有一个共同点，那就是：它们本身不匹配任何字符，只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后，本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的，更加灵活的表示方法。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 正向预搜索："(?=xxxxx)"，"(?!xxxxx)"<BR><BR>&nbsp;&nbsp;&nbsp; 格式："(?=xxxxx)"，在被匹配的字符串中，它对所处的 "缝隙" 或者 "两头" 附加的条件是：所在缝隙的右侧，必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件，所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b"，本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断，不会影响后边的表达式来真正的匹配。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=Windows+%28%3F%3DNT%7CXP%29&amp;txt=Windows+98%2C+Windows+NT%2C+Windows+2000"><FONT size=2>举例1：表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时</FONT></A><FONT size=2>，将只匹配 "Windows NT" 中的 "Windows "，其他的 "Windows " 字样则不被匹配。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%28%28%3F%3D%5C1%5C1%5C1%29%28%5C1%29%29%2B&amp;txt=aaa+ffffff+999999999"><FONT size=2>举例2：表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时</FONT></A><FONT size=2>，将可以匹配6个"f"的前4个，可以匹配9个"9"的前7个。这个表达式可以读解成：重复4次以上的字母数字，则匹配其剩下最后2位之前的部分。当然，这个表达式可以不这样写，在此的目的是作为演示之用。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 格式："(?!xxxxx)"，所在缝隙的右侧，必须不能匹配 xxxxx 这部分表达式。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28%28%3F%21%5Cbstop%5Cb%29%2E%29%2B&amp;txt=fdjka+ljfdl+stop+fjdsla+fdj"><FONT size=2>举例3：表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时</FONT></A><FONT size=2>，将从头一直匹配到 "stop" 之前的位置，如果字符串中没有 "stop"，则匹配整个字符串。<BR><BR>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=do%28%3F%21%5Cw%29&amp;txt=done%2C+do%2C+dog"><FONT size=2>举例4：表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时</FONT></A><FONT size=2>，只能匹配 "do"。在本条举例中，"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 反向预搜索："(?&lt;=xxxxx)"，"(?&lt;!xxxxx)"<BR><BR>&nbsp;&nbsp;&nbsp; 这两种格式的概念和正向预搜索是类似的，反向预搜索要求的条件是：所在缝隙的 "左侧"，两种格式分别要求必须能够匹配和必须不能够匹配指定表达式，而不是去判断右侧。与 "正向预搜索" 一样的是：它们都是对所在缝隙的一种附加条件，本身都不匹配任何字符。<BR><BR>&nbsp;&nbsp;&nbsp; 举例5：表达式 "(?&lt;=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时，将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索，因此，本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索，比如：Java 1.4 以上的 java.util.regex 包，.NET 中System.Text.RegularExpressions 命名空间，boost::regex 以及 </FONT><A href="http://www29.websamba.com/sswater/zh/greta/index.htm"><FONT size=2>GRETA 正则表达式库</FONT></A><FONT size=2>等。</FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P><B><FONT size=2>3. 其他通用规则</FONT></B></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 还有一些在各个正则表达式引擎之间比较通用的规则，在前面的讲解过程中没有提到。</FONT></P>
<P><FONT size=2>3.1 表达式中，可以使用 "\xXX" 和 "\uXXXX" 表示一个字符（"X" 表示一个十六进制数）</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=63>
<P><FONT size=2>形式</FONT></P></TD>
<TD>
<P><FONT size=2>字符范围</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\xXX</FONT></P></TD>
<TD>
<P><FONT size=2>编号在 0 ~ 255 范围的字符，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cx20&amp;txt=It+is%2E"><FONT size=2>空格可以使用 "\x20" 表示</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\uXXXX</FONT></P></TD>
<TD>
<P><FONT size=2>任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cu4E2D&amp;txt=%D6%D0%B9%FA"><FONT size=2>"\u4E2D"</FONT></A></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>3.2 在表达式 "\s"，"\d"，"\w"，"\b" 表示特殊意义的同时，对应的大写字母表示相反的意义</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=55>
<P><FONT size=2>表达式</FONT></P></TD>
<TD>
<P><FONT size=2>可匹配</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\S</FONT></P></TD>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5CS%2B&amp;txt=abc+123+%40%23%24%25"><FONT size=2>匹配所有非空白字符（"\s" 可匹配各个空白字符）</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\D</FONT></P></TD>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5CD%2B&amp;txt=abc+123+%40%23%24%25"><FONT size=2>匹配所有的非数字字符</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\W</FONT></P></TD>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5CW%2B&amp;txt=abc+123+%40%23%24%25"><FONT size=2>匹配所有的字母、数字、下划线以外的字符</FONT></A></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>\B</FONT></P></TD>
<TD>
<P><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5CB%2E%5CB&amp;txt=abc+123+%40%23%24%25"><FONT size=2>匹配非单词边界，即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙</FONT></A></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>3.3 在表达式中有特殊意义，需要添加 "\" 才能匹配该字符本身的字符汇总</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=55>
<P><FONT size=2>字符</FONT></P></TD>
<TD>
<P><FONT size=2>说明</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>^</FONT></P></TD>
<TD>
<P><FONT size=2>匹配输入字符串的开始位置。要匹配 "^" 字符本身，请使用 "\^"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>$</FONT></P></TD>
<TD>
<P><FONT size=2>匹配输入字符串的结尾位置。要匹配 "$" 字符本身，请使用 "\$"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>( )</FONT></P></TD>
<TD>
<P><FONT size=2>标记一个子表达式的开始和结束位置。要匹配小括号，请使用 "\(" 和 "\)"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>[ ]</FONT></P></TD>
<TD>
<P><FONT size=2>用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号，请使用 "\[" 和 "\]"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>{ }</FONT></P></TD>
<TD>
<P><FONT size=2>修饰匹配次数的符号。要匹配大括号，请使用 "\{" 和 "\}"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>.</FONT></P></TD>
<TD>
<P><FONT size=2>匹配除了换行符（\n）以外的任意一个字符。要匹配小数点本身，请使用 "\."</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>?</FONT></P></TD>
<TD>
<P><FONT size=2>修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身，请使用 "\?"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>+</FONT></P></TD>
<TD>
<P><FONT size=2>修饰匹配次数为至少 1 次。要匹配 "+" 字符本身，请使用 "\+"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>*</FONT></P></TD>
<TD>
<P><FONT size=2>修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身，请使用 "\*"</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>|</FONT></P></TD>
<TD>
<P><FONT size=2>左右两边表达式之间 "或" 关系。匹配 "|" 本身，请使用 "\|"</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2>3.4 括号 "( )" 内的子表达式，如果希望匹配结果不进行记录供以后使用，可以使用 "(?:xxxxx)" 格式</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%3A%28%5Cw%29%5C1%29%2B&amp;txt=a bbccdd efg"><FONT size=2>举例1：表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时</FONT></A><FONT size=2>，结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录，因此 "(\w)" 使用 "\1" 来引用。</FONT></P>
<P><FONT size=2>3.5 常用的表达式属性设置简介：Ignorecase，Singleline，Multiline，Global</FONT></P>
<TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=3 bgColor=#f8f8f8 border=1>
<TBODY>
<TR bgColor=#f0f0f0>
<TD width=80>
<P><FONT size=2>表达式属性</FONT></P></TD>
<TD>
<P><FONT size=2>说明</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>Ignorecase</FONT></P></TD>
<TD>
<P><FONT size=2>默认情况下，表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎，把 "大小写" 概念延伸至 UNICODE 范围的大小写。</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>Singleline</FONT></P></TD>
<TD>
<P><FONT size=2>默认情况下，小数点 "." 匹配除了换行符（\n）以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>Multiline</FONT></P></TD>
<TD>
<P><FONT size=2>默认情况下，表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如：<BR><BR>①xxxxxxxxx②\n<BR>③xxxxxxxxx④<BR><BR>配置为 Multiline 可以使 "^" 还可以匹配换行符之后，下一行开始前 ③ 的位置，使 "$" 还可以匹配换行符之前，一行结束 ② 的位置。</FONT></P></TD></TR>
<TR>
<TD>
<P><FONT size=2>Global</FONT></P></TD>
<TD>
<P><FONT size=2>主要在将表达式用来替换时起作用，配置为 Global 表示替换所有的匹配。</FONT></P></TD></TR></TBODY></TABLE>
<P><FONT size=2></FONT></P><FONT size=2>
<HR color=#fea089 SIZE=1>
</FONT>
<P></P>
<P><B><FONT size=2>4. 综合提示</FONT></B></P>
<P><FONT size=2>4.1 如果要要求表达式所匹配的内容是整个字符串，而不是从字符串中找一部分，那么可以在表达式的首尾使用 "^" 和 "$"，比如："^\d+$" 要求整个字符串只有数字。</FONT></P>
<P><FONT size=2>4.2 如果要求匹配的内容是一个完整的单词，而不会是单词的一部分，那么在表达式首尾使用 "\b"，比如：</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cb%28if%7Cwhile%7Celse%7Cvoid%7Cint%29%5Cb&amp;txt=if%28ifdo%29%0D%0A++++dosome%28%29%3B%0D%0Aelse%0D%0A++++doelse%28%29%3B"><FONT size=2>使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字</FONT></A><FONT size=2>。</FONT></P>
<P><FONT size=2>4.3 表达式不要匹配空字符串。否则会一直得到匹配成功，而结果什么都没有匹配到。比如：准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时，整数、小数点、小数数字都可以省略，但是不要将表达式写成："\d*\.?\d*"，因为如果什么都没有，这个表达式也可以匹配成功。</FONT><A href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C%2E%3F%5Cd%2A%7C%5C%2E%5Cd%2B&amp;txt=123%2C+123%2E%2C+123%2E5%2C+%2E5%2C+%2E"><FONT size=2>更好的写法是："\d+\.?\d*|\.\d+"</FONT></A><FONT size=2>。</FONT></P>
<P><FONT size=2>4.4 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次，而这个括号整体又可以匹配无限次，那么情况可能比上一条所说的更严重，匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了，比如 .NET 的正则表达式，但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环，也可以从这一点入手，查找一下是否是本条所说的原因。</FONT></P>
<P><FONT size=2>4.5 合理选择贪婪模式与非贪婪模式。</FONT></P>
<P><FONT size=2>4.6 或 "|" 的左右两边，对某个字符最好只有一边可以匹配，这样，不会因为 "|" 两边的表达式因为交换位置而有所不同。</FONT></P><img src ="http://www.blogjava.net/aiyoyoyo/aggbug/31352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aiyoyoyo/" target="_blank">aiyoyoyo</a> 2006-02-18 14:54 <a href="http://www.blogjava.net/aiyoyoyo/articles/31352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts中使用Validator框架</title><link>http://www.blogjava.net/aiyoyoyo/articles/31326.html</link><dc:creator>aiyoyoyo</dc:creator><author>aiyoyoyo</author><pubDate>Sat, 18 Feb 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/aiyoyoyo/articles/31326.html</guid><wfw:comment>http://www.blogjava.net/aiyoyoyo/comments/31326.html</wfw:comment><comments>http://www.blogjava.net/aiyoyoyo/articles/31326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aiyoyoyo/comments/commentRss/31326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aiyoyoyo/services/trackbacks/31326.html</trackback:ping><description><![CDATA[<FONT size=2>作者：&nbsp;&nbsp;&nbsp;&nbsp; Chuck Cavaness <BR>原文：&nbsp;&nbsp;&nbsp;&nbsp; http://www.onjava.com/pub/a/onjava/2002/12/11/jakartastruts.html<BR>译者：&nbsp;&nbsp;&nbsp;&nbsp; javaduke<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Email:javaduke@263.net<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QQ:658155<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSN:javaduke@hotmail.com<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个应用程序都有责任确保它们插入到后台资料库的数据是合法有效的，毕竟，如果这些应用程序所依赖的数据一旦遭到了破坏，那将是灾难性的，那应用程序还能拿什么来使自己正常运转呢？比如说，使用正规关系数据库的一个应用程序，数据库中的每个字段都有自己一定的规则和约束，来保证存储在其中的数据在一定程度上的正确性。任何要使用后台资料库数据的应用程序都有责任保护它们提交的数据的完整性。<BR>&nbsp;&nbsp;&nbsp;&nbsp;任何试图插入或更新不符合标准的数据的操作都有可能被发现并拒绝。这种检测可能遍布在整个应用程序的每个角落，在表现层可能进行一些验证，在业务逻辑层，商业逻辑对象一般也有商业逻辑的验证，还有在后台资料库也要对数据进行检查。<BR>&nbsp;&nbsp;&nbsp;&nbsp;不幸的是，由于这种验证在应用程序中无处不在，造成了应用程序在一定程度上的验证数据的代码冗余。这并不是应用程序所希望的，因为这种在多处的重复劳动，使得应用程序的部署和维护要花去更多的时间。如果在整个应用程序中，这些验证规则可以重复使用，将使得应用程序更加富有弹性，换句话说就是，部署更快捷，定制更容易，程序更灵活。<BR><B>Jakarta Commons 项目Validator框架简介</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validator是由David Winterfeldt创建的开源项目，它也是Jakarta Commons的一个子项目。Commons项目主要是提供一些像Validator这样的一些可重用组件。其他著名的Commons组件还有如BeanUtils,Digester,Logging框架等。Validator 1.0版本发布于2002年11月初。<BR><B>使用Validator的好处</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .使用Validator框架比一般的在应用程序的代码中定义验证规则有好多优点，如：<BR>&nbsp;&nbsp;&nbsp;&nbsp; .可以在一处为应用程序定义验证规则；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .验证规则和应用程序是松耦合的；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .服务器端和客户端的验证规则可以在同一处定义；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .配置新验证规则或修改已有验证规则变得更加简单；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .支持国际化；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .支持正则表达式；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .可以用于Web应用程序也可用于标准的Java应用程序；<BR>&nbsp;&nbsp;&nbsp;&nbsp; .采用声明的方法实现而不是编程实现；<BR>除了之外，Validator最大的特征就是自身支持可插性（pluggability）。在文章的后<BR>面你将会看到使用Validator框架内置的验证规则来更好地完成你的工作，而更重要的是，Validator框架允许你自定义验证程序，并插入到框架中。<BR><B>Struts和Validator的关系</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;应该指出的是Validator框架本身是因Struts框架而建立的。Validator的创建者David Winterfeldt在使用Struts的过程中发现，在许多ActionForm类中需要反复使用同一个验证规则，这样造成了大量的代码冗余。于是他决定创建Validator框架来消除这种冗余，这样Validator就诞生了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;尽管Validator架构最初是为Struts架构而生，但它还是被设计和构造成了可以独立于Struts架构而单独使用。这一个特征使得你可以在任何的应用程序中使用这个框架，不必管它是不是Struts架构的。并不会因为你不使用Struts框架而影响Validator架构对你的应用程序作用。事实上，这就是为什么Validator是Jakarta Commons项目的一部分而不直接是Struts项目的一部分。<BR>&nbsp;&nbsp;&nbsp;&nbsp;现在，我们来将这个框架整合应用到像基于Struts构架这样的Web应用程序上。在文章的最后中我们再介绍如何把它应用到其他类型的应用程序中，如基于EJB的应用程序。<BR><B>Validator组件概述</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validator架构有下面这些组件组成：<BR>&nbsp;&nbsp;&nbsp;&nbsp; Validators；<BR>&nbsp;&nbsp;&nbsp;&nbsp; 配置文件；<BR>&nbsp;&nbsp;&nbsp;&nbsp; 资源绑定；<BR>&nbsp;&nbsp;&nbsp;&nbsp; JSP自定义标签；<BR>&nbsp;&nbsp;&nbsp;&nbsp; Validator Form类；<BR><B>什么是Validators?</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个Validator就是，执行一个验证规则时Validator框架调用的一个Java类。框架根据配置文件中定义的方法签名来调用这个Validaotor类。一般情况下，每个Validator类提供一个单独的验证规则，然后这些规则可以组合成更复杂的规则集。<BR><BR><I>注意：有时出于方便，一个Validator类也可以定义多个验证规则，而每个规则是一个静态方法且并不包含任何客户端状态信息。</I><BR>&nbsp;&nbsp;&nbsp;&nbsp;框架提供了14种默认的验证规则，有时候这些规则也被称为Validator框架的“基本规则”，这些基本规则如表一：<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; 描述<BR>byte,short,integer,&nbsp;&nbsp;检验值是否能被转换成对应的基本数据类型<BR>long,float,double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>creditCard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检验输入域是否是一个合法的信用卡号码<BR>date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检验输入域是否是一个合法日期<BR>email&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检验输入是否是一个合法Email地址<BR>mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检验输入域是否能成功匹配一个正则表达式<BR>maxLength&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检验值的长度是否小于等于给定的最大长度<BR>minLength&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检验值的长度是否大于等于给定的最小长度<BR>range&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检验值的范围是否在最大值和最小值之间<BR>required&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检验输入域是否为不为空，或不包含空格值的长度是否大于零<BR>表一<BR>正像你在表一中看到的，Validator框架提供了Web应用程序需要的大多数的验证规则。你可以使用这些现有的验证规则来创建自己验证配置文件。尽管这样，也正如我们前面提到的，和后面要讲到的，你可以根据你的需要随意的增加更多的Validator。<BR>现在，让我们来讨论如何在一个基于Struts架构的应用程序中配置使用这些基本的Validator。<BR>&nbsp;&nbsp;&nbsp;&nbsp;使Validator框架具有弹性的原因在于所有的验证规则和其具体细节都是通过在外部文件中配置声明实现的。你的应用程序并不必要知道这些具体的验证规则。这一特征使得规则集的发生扩展和修改时，你并不用去动你应用程序的源代码。这一点对你要进行每次的个性化安装或当需求发生变化时来说是非常重要的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果你使用Struts1.1的Validator框架，你会用到这样两个配置文件，一个叫validator- rules.xml，另一个叫validation.xml；其实你也可以随意的给他们命名，甚至可以把它们合并成一个XML文件。但是，你还是最好把它们分开，因为它们各有各的用途。<BR><BR><I>注意：如果你从Jakarta网站上下载Validator，并不包含这两个文件。只有在包含的Validator框架的Struts的下载中才可以找到这两个文件。</I><BR><B>validator-rules.xml文件</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validator-rules.xml文件定义应用程序可以使用的Validator。validator-rules.xml充当模板的作用，定义所有应用程序可能要用到的Validator。<BR><BR><I>注意：这个xml文件和我们下面要讨论的另一个xml文件都应该放到类加载器可以找得到的地方。当我们在Web应用程序中使用Validator框架时，正确的位置应该是在WEB-INF下。</I>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;validator-rules.xml文件服从validator- rules_1_1.dtd的管理，validator- rules_1_1.dtd可以在jakarta.apache.org/struts/dtds/validator- rules_1_1.dtd下载到。我们并不想花太多的时间放在研究这个文件的具体细节上，我们在这儿只作一些基本的介绍。<BR>validator-rules.xml文件中最重要的元素包含在&lt;validator&gt;元素中，例如，例一：<BR></FONT><FONT color=#808080><FONT size=2><STRONG><FONT color=#ee82ee>validator-rules.xml :</FONT></STRONG><BR></FONT></FONT>
<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"><FONT size=2><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&lt;</SPAN><SPAN style="COLOR: #000000">form</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">validation</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">global</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">validator&nbsp;name</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">required</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classname</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.apache.struts.util.StrutsValidator</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">validateRequired</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodparams</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">java.lang.Object,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.ValidatorAction,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.Field,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.ActionErrors,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.servlet.http.HttpServletRequest</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">errors.required</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">validator&nbsp;name</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">minlength</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classname</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.apache.struts.util.StrutsValidator</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">validateMinLength</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodparams</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">java.lang.Object,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.ValidatorAction,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.commons.validator.Field,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts.action.ActionErrors,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.http.HttpServletRequest</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; depends</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">required</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">errors.minlength</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">global</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">form</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">validation</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT></DIV><BR><BR><FONT size=2>应用程序使用的每个Validator对应一个&lt;validator&gt;元素。在例一中给大家展示了两个Validator，一个是请求Validator，另一个是最小长度Validator。&lt;validator&gt;元素支持许多属性。这些属性是必要的，用于告知框架这个Validator应当调用哪个正确的类和方法。例如，例一中的请求Validator元素表明这个Validator将调用org.apache.struts.util.StrutsValidator类的validateRequest()方法。Validator也可能要依赖另一个Validator,如例一中的最小长度的Validator就是这样一个例子，它包含一个depends属性，用它来表示这个Validator将依赖于请求Validator。msg属性用一个键值指定一个资源绑定，框架将用它来生成正确的错误信息。资源绑定的使用有益于错误信息的本地化。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;validator&gt;元素还支持&lt;javascript&gt;子元素，允许你指定一个客户端运行的JavaScript函数。这样服务器端和客户端验证可以在同一处指定，这使应用程序的维护变得简单。<BR><BR><B>validation.xml文件</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validator框架的第二个配置文件就是这个叫validation.xml的文件。其实你可以随意把它命名为你喜欢的任何名字，也可以把它放到validator-rules.xml文件中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;validation.xml用于把你在validator-rules.xml中定义的各个Validator和你的应用程序中的组件映射起来。由于我们在这里讨论的是在Struts中使用Validator框架，那么在这里validation.xml就是把这些Validator和Struts的ActionForm类建立映射。ActionForm类其实是一个类似JavaBean一样的类，在Struts中用于捕捉用户输入并帮助传输这些输入到下一级应用程序组件。ActionForm也提供了在用户输入被传到业务逻辑层之前验证这些输入的便利场所。例二是一个简单的validation.xml:<BR></FONT><STRONG><FONT color=#ee82ee><FONT size=2>validation.xml:<BR></FONT>
<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"><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">form</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">validation</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">formset</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">form&nbsp;name</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">checkoutForm</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">field&nbsp;property</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">firstName</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;depends</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">required</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG 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;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">arg0&nbsp;key</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">label.firstName</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">field</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">field&nbsp;property</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">lastName</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;depends</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">required</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG 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;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">arg0&nbsp;key</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">label.lastName</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">field</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">form</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">formset</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">form</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">validation</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></FONT></DIV></FONT></STRONG><FONT size=2>例二向大家展现了一个name属性叫checkoutForm的一个&lt;form&gt;元素。checkoutForm是一个在Struts配置文件中定义的一个ActionForm Bean。所以，例二的XML文件就是把这个ActionForm Bean和请求Validator建立映射，Bean的firstName和lastName属性分别对应XML文件中相应的firstName和lastName&lt;field&gt;元素。<BR>&nbsp;&nbsp;&nbsp;&nbsp;其实它还有许多其它作用，如可以在validation.xml中定义常量和全局变量，用于在整个文件中使用，当你想使时可以方便的反复使用。对于validation.xml的元素和属性更详细的解释，可以下载jakarta.apache.org/struts/dtds/validation_1_1.dtd参阅。<BR><BR><B>资源绑定</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;资源绑定用于帮助消息本地化和一些其它文本信息的本地化处理。由于它减少了应用程序的许多冗余的硬编码，故对应用程序有很大益处。比如，如果你要在JSP页面中要使用一个“Name”标签时，你可以把这个字符串放到一个资源绑定中，然后使用资源绑定的一个逻辑键值引用这个字符串，而不是直接使用这个字符串，这样做的好处在于，当你想把这个字符串改为“First Name”时，你只需在资源绑定中修改一处即可，而不必修改整个应用程序的全部代码。<BR>&nbsp;&nbsp;&nbsp;&nbsp;对于Validator框架，当验证规则失败的时候，可以从资源绑定中创建错误信息。Validator框架提供几种默认消息，同一般的应用程序消息资源放在一起。如下：<BR><FONT color=#ee82ee><STRONG>application.properties:</STRONG></FONT><BR></FONT>
<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"><SPAN style="COLOR: #000000">#Normal&nbsp;resource&nbsp;bundle&nbsp;messageslabel.firstName</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">First&nbsp;Name<BR>label.lastName</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">Last&nbsp;Name<BR>#Error&nbsp;messages&nbsp;used&nbsp;by&nbsp;the&nbsp;Validator<BR>errors.required</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN id=Codehighlighter1_137_139_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;is&nbsp;required.<BR>errors.minlength</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN id=Codehighlighter1_171_173_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;can&nbsp;not&nbsp;be&nbsp;less&nbsp;than&nbsp;</SPAN><SPAN id=Codehighlighter1_196_198_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"></SPAN><SPAN id=Codehighlighter1_196_198_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;characters.<BR>errors.maxlength</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN id=Codehighlighter1_229_231_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"></SPAN><SPAN id=Codehighlighter1_229_231_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;can&nbsp;not&nbsp;be&nbsp;greater&nbsp;than&nbsp;</SPAN><SPAN id=Codehighlighter1_257_259_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"></SPAN><SPAN id=Codehighlighter1_257_259_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;characters.<BR>errors.invalid</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN id=Codehighlighter1_288_290_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"></SPAN><SPAN id=Codehighlighter1_288_290_Open_Text><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;is&nbsp;invalid<BR>.........</SPAN></DIV><BR><FONT size=2>当一个验证规则失败时，这个验证规则创建一个错误信息。框架将自动给消息插入参数。比如说，我们使用例一和例二的验证规则，当checkoutForm的firstName属性为空时，我们会看到这样的错误信息：<BR>First Name is required.<BR>你也可以修改绑定或配置文件来显示你喜欢的消息。<BR><BR><B>“挂”Validator到Struts上</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在我们已经了解了Validator框架，感觉蛮不错吧！下面我们将快速的讲一下我们是如何轻松地在Struts框架中使用Validator框架的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;首先要做的就是让Struts框架认识Validator框架。你可以使用Struts1.1的Plug-in新特性来实现它。只要在Struts配置文件中增加下面代码即可：<BR><STRONG><FONT color=#ee82ee>struts-config.xml:</FONT></STRONG><BR></FONT>
<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"><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">plug</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">in&nbsp;classname</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.apache.struts.validator.ValidatorPlugIn</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</SPAN><SPAN style="COLOR: #000000">set</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">property&nbsp;&nbsp;&nbsp;property</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">pathnames</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/&gt;<BR>&lt;/</SPAN><SPAN style="COLOR: #000000">plug</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">in</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></DIV><BR><FONT size=2>这样Struts就可以自动识别Validator框架了。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 另外一个必需的步骤就是创建ActionForm Bean（标准的或是动态的）和确保Validator框架的配置文件是可用的，这样就搞定了。并不需要作一些调用验证规则或做其他具体的事情，Struts框架会自动完成这些工作，这就是所谓的基于声明的配置。然后当验证规则失败的时候，你就可以用JSP标签看到显示的错误信息了。<BR><BR><B>创建自己的Validator</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尽管Validator框架已为大家提供了Web应用程序需要的大多数验证规则，但有时我们还是需要创建一些自己的验证规则。幸运的，Validator框架的扩展性相当好，为你提供了这种便利，而这样做对程序造成的影响相当小的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;创建自己的Validator并不是一件难事，只要创建一个实现这个规则的Java类即可。比如，（在国外）要去超市买二锅头，要验证顾客是否达到合法饮酒年龄。你可以使用已有的验证规进行验证，但我们觉得创建一个验证规则进行验证要更加直截了一些。验证饮酒年龄规则Validator Java代码如下:</FONT><BR><FONT color=#ee82ee><STRONG><FONT size=2>Validator.Java<BR></FONT>
<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"><SPAN style="COLOR: #0000ff"><BR><BR><BR><BR><FONT size=2>import</FONT></SPAN><FONT size=2><SPAN style="COLOR: #000000">&nbsp;java.io.Serializable;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.commons.validator.Field;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.commons.validator.GenericValidator;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.commons.validator.ValidatorAction;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.commons.validator.ValidatorUtil;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.struts.action.ActionErrors;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;org.apache.struts.util.StrutsValidatorUtil;<BR><IMG id=Codehighlighter1_421_1419_Open_Image onclick="this.style.display='none'; Codehighlighter1_421_1419_Open_Text.style.display='none'; Codehighlighter1_421_1419_Closed_Image.style.display='inline'; Codehighlighter1_421_1419_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_421_1419_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_421_1419_Closed_Text.style.display='none'; Codehighlighter1_421_1419_Open_Image.style.display='inline'; Codehighlighter1_421_1419_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.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;NewValidator&nbsp;</SPAN><SPAN style="COLOR: #0000ff">implements</SPAN><SPAN style="COLOR: #000000">&nbsp;Serializable</SPAN><SPAN id=Codehighlighter1_421_1419_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_421_1419_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_572_1296_Open_Image onclick="this.style.display='none'; Codehighlighter1_572_1296_Open_Text.style.display='none'; Codehighlighter1_572_1296_Closed_Image.style.display='inline'; Codehighlighter1_572_1296_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_572_1296_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_572_1296_Closed_Text.style.display='none'; Codehighlighter1_572_1296_Open_Image.style.display='inline'; Codehighlighter1_572_1296_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&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></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;validateDrinkingAge(&nbsp;Object&nbsp; bean,<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;ValidatorAction&nbsp; va,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionErrors&nbsp;errors,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request)&nbsp;</SPAN><SPAN id=Codehighlighter1_572_1296_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_572_1296_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&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;String&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</SPAN><SPAN style="COLOR: #000000">&nbsp;(isString(bean))&nbsp;</SPAN><SPAN id=Codehighlighter1_621_654_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"></SPAN></FONT><SPAN id=Codehighlighter1_621_654_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&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;&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>&nbsp;(String)&nbsp;bean;&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;}</FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_661_746_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"></SPAN></FONT><SPAN id=Codehighlighter1_661_746_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&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;&nbsp;value&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>&nbsp;ValidatorUtil.getValueAsString(bean,&nbsp;field.getProperty());&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;}</FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #000000">&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;String&nbsp;sMin&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;field.getVarValue(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">drinkingAge</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><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;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">GenericValidator.isBlankOrNull(value))&nbsp;</SPAN><SPAN id=Codehighlighter1_846_1281_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"></SPAN></FONT><SPAN id=Codehighlighter1_846_1281_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_857_1128_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"></SPAN></FONT><SPAN id=Codehighlighter1_857_1128_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int </SPAN><SPAN style="COLOR: #000000">&nbsp;iValue&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(value);<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int</SPAN><SPAN style="COLOR: #000000">&nbsp;drinkingAge&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">&nbsp;Integer.parseInt(sMin);&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;iValue&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;drinkingAge&nbsp;)</SPAN><SPAN id=Codehighlighter1_987_1121_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"></SPAN></FONT><SPAN id=Codehighlighter1_987_1121_Open_Text><FONT size=2><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors.add(field.getKey(), StrutsValidatorUtil.getActionError(request,&nbsp;va,&nbsp;field));<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;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>;<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;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=2>&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;}</FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_1150_1276_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"></SPAN></FONT><SPAN id=Codehighlighter1_1150_1276_Open_Text><FONT size=2><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors.add(field.getKey(),&nbsp;StrutsValidatorUtil.getActionError(request,&nbsp;va,&nbsp;field));<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>;&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;}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private</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;isString(Object&nbsp;o)&nbsp;</SPAN><SPAN id=Codehighlighter1_1339_1418_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"></SPAN></FONT><SPAN id=Codehighlighter1_1339_1418_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</SPAN><SPAN style="COLOR: #000000">&nbsp;(o&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 id=Codehighlighter1_1357_1378_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"></SPAN></FONT><SPAN id=Codehighlighter1_1357_1378_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #0000ff">true</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</FONT></SPAN></SPAN><FONT size=2><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</SPAN><SPAN style="COLOR: #000000">&nbsp;(String.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>.isInstance(o));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><FONT size=2>}</FONT></SPAN></SPAN></DIV></STRONG></FONT><FONT size=2>你创建完新的Validator之后，你只要把他加到现存的Validator框架的validator-rules.xml的列表中，你就可以像使用基本验证规则一样使用你自己创建的验证规则。<BR><BR><B>在非Struts应用程序中使用Validator框架</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正像我们在前面谈到的，Validator框架最初是为在Struts框架中使用而设计的。可是，Validator框架设计的相当灵活，并没有直接把它耦合在Struts框架中，这样你就可以在普通的应用程序中也可以使用Validator框架来进行验证。但是，你必须执行一些必需的步骤。<BR>&nbsp;&nbsp;&nbsp;&nbsp;你可以利用像在Web应用程序中一样使用配置文件。这也是使用Validatoe框架的另一个优点。你可以在Struts框架使用插件的方式来定位和装载这些文件。而在非Struts应用程序中你必须人为地手动的定位和装载这些配置文件。下面就是应用程序在启动时一般要调的方法：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>ValidatorResources&nbsp;resources&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ValidatorResources();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>InputStream&nbsp;rules&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ValidateExample.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">.getResourceAsStream(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">validator-rules.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>ValidatorResourcesInitializer.initialize(resources,&nbsp;in);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>InputStream&nbsp;forms&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ValidateExample.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">.getResourceAsStream(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">validation.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>ValidatorResourcesInitializer.initialize(resources,&nbsp;forms);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN></DIV>这段代码片断创建了一个ValidatorResources实例，并根据两个配置文件进行了初始化。然后你就可以在你应用程序使用这个ValidatorResources对象验证你配置的JavaBean了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;例四向你展示如何使用已初始化的ValidatorResources对象来验证一个Person Bean。<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">假设我们已经创建和装配了一个CheckoutForm&nbsp;Bean对象</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">CheckoutForm&nbsp;form&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CheckoutForm();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">使用chekoutForm创建一个ValidatorValidator&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">validator&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Validator(resources,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">checkoutForm</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">告诉Validator要验证哪个Beanvalidator.addResource(Validator.BEAN_KEY,&nbsp;form);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">验证checkoutForm对象并存储验证结果</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">ValidatorResults&nbsp;results&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;validator.validate();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>在例四中，我们看到我们把checkoutForm JavaBean的名字传给Validator类的构造器，这是为了告诉Validator实例使用哪套验证规则来验证这个Bean。<BR>&nbsp;&nbsp;&nbsp;&nbsp;正如你看到的一样，在非Struts应用程序中使用Validator框架显得有点不自动化，但是它还是提供了比较灵活的解决方案。使用Validator框架的另一个好处就是把验证从源代码中分离到外部的配置文件中。这使我们可以把更多的时间放在我们的业务逻辑开发上。<BR><B>客户端VS服务器端Validator</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后我们简单的阐述一下Validator框架对JavaScript的支持。因为有些应用程序需要执行一些客户端验证，在某些时候使用JavaScript进行一些客户端的验证是很有必要的。这里的客户端我们一般特指Web浏览器。<BR>&nbsp;&nbsp;&nbsp;&nbsp;Validator框架提供使用配置文件中的规则动态和自动生成JavaScript验证规则的支持。对于每个&lt;validator&gt;元素，它可以有一个&lt;javascript&gt;子元素和包含一些JavaScript代码。当包含一些自定义标签的JSP页面被解释时，JavaScript也被解释，并当表单提交时执行这些验证规则。这些叫JavaScriptValidatorTag的标签被包含在Struts的标签集中。这些标签可以像这样进行使用：<BR>&lt;html:javascript formName="checkoutForm"/&gt;<BR>笔者认为在需要时使用一定的JavaScript是可以接受的。当你需要执行一些客户端的验证时，使用Validator框架标签是也是一种不错的选择，而且支持根据用户的区域进行本地化。<BR><B>结束语</B><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到此为止，我给大家简单地介绍了Validator框架，这些其实是框架的一些表面的东西。这个框架的内容深不可测，仅正则表达式就可以写一本小册子。<BR>&nbsp;&nbsp;&nbsp;&nbsp;像任何一个框架一样，Validator框架为大家提供的是一个基础的架构，你可以根据你的需求对其进行扩展和个性化。使用像Validator的框架的最重要的一点就是它们是经过千锤百炼，是技术的精华。。你并不需重蹈前人失败的覆辙，你可以节省下时间把更多的精力集中在对业务逻辑的开发上。<BR><BR><I>作者简介：<BR>Chuck Cavaness：毕业于Georgia Tech，获计算机工程与科学学位，在医疗，银行和B2B领域创建了许多Java企业系统，同时也是O'Reilly的Programming Jakarta Struts 和 Jakarta Struts Pocket Reference两本书的作者。</I><BR></FONT><img src ="http://www.blogjava.net/aiyoyoyo/aggbug/31326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aiyoyoyo/" target="_blank">aiyoyoyo</a> 2006-02-18 10:40 <a href="http://www.blogjava.net/aiyoyoyo/articles/31326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>