﻿<?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-追求无止境</title><link>http://www.blogjava.net/wangajing/</link><description>我的程序人生</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:55:07 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:55:07 GMT</pubDate><ttl>60</ttl><item><title>有一天你会长大</title><link>http://www.blogjava.net/wangajing/archive/2010/01/19/310065.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Tue, 19 Jan 2010 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2010/01/19/310065.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/310065.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2010/01/19/310065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/310065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/310065.html</trackback:ping><description><![CDATA[<p>什么话该说，什么话不该说，该说的话该怎么说。谁能告诉我。</p><img src ="http://www.blogjava.net/wangajing/aggbug/310065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2010-01-19 13:21 <a href="http://www.blogjava.net/wangajing/archive/2010/01/19/310065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2009年度盛事 - 总结2009</title><link>http://www.blogjava.net/wangajing/archive/2009/12/31/307899.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Thu, 31 Dec 2009 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/12/31/307899.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/307899.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/12/31/307899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/307899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/307899.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2009年12月31日，站在2009年的尾巴上，不禁感到时间飞逝。2009年，匆匆而过。在过去的2009年，收获何多，失去何多。2009年，对我来说，是一个重要的转折点。渐渐的发现自己应该长大了，也发现自己确实长大了，更发现自己实际上还是需要继续长大。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每年的这个时候，各个新闻媒体都会评出什么十大之类的，我也落一会俗（当然自己本身就很俗），来看看今年发生在我身上的几大事件：</p> <p>先大体罗列一下吧：</p> <ol> <li>订婚</li> <li>进京</li> <li>工作</li> <li>毕业</li> <li>读研</li> <li>买笔记本</li></ol> <p>&nbsp;&nbsp;&nbsp;&nbsp; 从时间跨度上来说， 1月到2月在家过年，2月和3月在青岛某公司实习，4月和5月在北京某公司实习，6月在中国石油大学享受毕业之前的时光，7月到8月继续在北京某公司实习，9月到12月在上学+实习。2009年最幸福的事情发生在1到2月，尽快也有不快；最平常的日子在2月和3月，到了4月和5月或许是我最纠结的日子吧；6月或许是最快乐的日子的吧；7月和8月让我体会到了工作的滋味；而9月到12月，整天在公司与学校之间奔跑，知道了工作+上课两者要做到兼顾的滋味，虽然并没有做到兼顾。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 2009年大体经历如此。2009年对我最大的关键字或许就是“改变”，这一年我订婚了，在这一点上，改变了我的准非单身状态；在这一年，我实习了，而且大量的时间都在于此，改变了我仅仅是学生的状态；在这一年，我毕业了，我离开了生活学习四年的中国石油大学，离开了让我毕生难忘的日子；在这一年，我来北京了，从对北京的一无所知，到开始的彷徨，然后渐渐熟悉和适应；在这一年，我的经济渐渐独立，尽管每个月只有不到1000的收入，但能满足的我的基本需求；在这一年，我买了笔记本，虽然对其他人来说，这不是一件特别的事，对我来说，因采用了分期付款，而用接下来一年中近半个月的工资来还，但我不觉得后悔，在这个过程中，我的经济观念和理财观念开始渐渐改变；在这一年，工作成了我的核心，工作教会我很多东西，在与人交流、在工作态度、在技术上，都有一定的提高。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 回忆2009年，收获颇多，也失去不少。但日子总是向前的，有得必有失。希望在以后的2009年，自己能够渐渐提高自己的能力。无论是在生活上，在工作上，还是在心理上。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp; 2009年10大大事：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与老婆订婚：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2009年，</p><img src ="http://www.blogjava.net/wangajing/aggbug/307899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-12-31 12:55 <a href="http://www.blogjava.net/wangajing/archive/2009/12/31/307899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring web MVC 框架学习笔记 之 ViewResolver技术</title><link>http://www.blogjava.net/wangajing/archive/2009/11/27/303880.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Fri, 27 Nov 2009 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/27/303880.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303880.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/27/303880.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303880.html</trackback:ping><description><![CDATA[<p>上次的文章中介绍了ModelAndView对象中的view对象，可以使用字符串来让Spring框架进行解析获得适合的视图。而解析View的就是ViewResolver技术。</p>
<p>ViewResolver的定义如下：</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> ViewResolver {<br />
View resolveViewName(String viewName, Locale locale) throws Exception;<br />
}</pre>
<pre class="csharpcode">&nbsp;</pre>
<pre class="csharpcode">在[spring-dispatcher-name]-servlet.xml中，可以定义viewResolver：</pre>
<p>&lt;bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;property name="prefix" value="/jsp/"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="suffix" value=".jsp"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;
</p>
<p><font face="Consolas" size="3">来让DispacherServlet进行加载默认的viewResolver，如果没有设置viewResolver，spring使用InternalResourceViewResolver进行解析。</font></p>
<p><font face="Consolas" size="3">Spring实现ViewResolver的非抽象类且我们经常使用的viewResolver有以下四种：</font></p>
<table unselectable="on" border="2" cellpadding="2" cellspacing="1" width="700">
    <tbody>
        <tr>
            <td valign="top" width="350">InternalResourceViewResolver</td>
            <td valign="top" width="350">将逻辑视图名字解析为一个路径</td>
        </tr>
        <tr>
            <td valign="top" width="350">BeanNameViewResolver</td>
            <td valign="top" width="350">将逻辑视图名字解析为bean的Name属性，从而根据name属性，找定义View的bean</td>
        </tr>
        <tr>
            <td valign="top" width="350">ResourceBundleResolver</td>
            <td valign="top" width="350">和BeanNameViewResolver一样，只不过定义的view-bean都在一个properties文件中，用这个类进行加载这个properties文件</td>
        </tr>
        <tr>
            <td valign="top" width="350">XmlViewResolver</td>
            <td valign="top" width="350">和ResourceBundleResolver一样，只不过定义的view-bean在一个xml文件中，用这个类来加载xml文件</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>使用多视图解析器：</p>
<p>我们不想只使用一种视图解析器的话，可以在[spring-dispatcher-name]-servlet.xml定义多个viewResolver：</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode">&lt;bean id=<span class="str">"viewResolver"</span> <span class="kwrd">class</span>=<span class="str">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>&gt;<br />
&lt;property name=<span class="str">"prefix"</span> value=<span class="str">"/jsp/"</span>/&gt;<br />
&lt;property name=<span class="str">"suffix"</span> value=<span class="str">".jsp"</span>/&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id=&#8221;beanNameViewResolver&#8221; <span class="kwrd">class</span>=&#8221;...BeanNameViewResolver&#8221;&gt;<br />
&lt;property name=<span class="str">"order"</span> value=<span class="str">"1"</span>&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id=&#8221;beanNameViewResolver&#8221; <span class="kwrd">class</span>=&#8221;...XmlViewResolver&#8221;&gt;<br />
&lt;property name=<span class="str">"order"</span> value=<span class="str">"0"</span>&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</pre>
<br />
</div>
<p>DispatcherServlet会加载所有的viewResolver到一个list中，并按照优先级进行解析。注意order中的值越小，优先级越高。而id为viewResolver</p>
<p>的viewResolver的优先级是最低的。</p>
<img src ="http://www.blogjava.net/wangajing/aggbug/303880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-27 12:11 <a href="http://www.blogjava.net/wangajing/archive/2009/11/27/303880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC框架学习笔记 之 View技术</title><link>http://www.blogjava.net/wangajing/archive/2009/11/26/303759.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Thu, 26 Nov 2009 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/26/303759.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303759.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/26/303759.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303759.html</trackback:ping><description><![CDATA[<p>以前，我们详细介绍了Spring的Controller技术。Spring的面向接口编程，使Controller的实现多种多样。View技术也一样。今天的分析先从在Controller中的ModelAndView开始。</p> <div><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ModelAndView {     
  <span class="kwrd">private</span> Object view; <span class="rem">//View实例或者view的字符串    </span>
<span class="rem">/** Model Map */</span>  
  <span class="kwrd">private</span> ModelMap model; <span class="rem">//model</span>
 <span class="rem">/* * Convenient constructor when there is no model data to expose.     * Can also be used in conjunction with &lt;code&gt;addObject&lt;/code&gt;.    </span>
<span class="rem"> * @param view View object to render   </span>
<span class="rem">  * @see #addObject     */</span>  
 <span class="kwrd">public</span> ModelAndView(View view) {        
    <span class="kwrd">this</span>.view = view;    
}
<span class="kwrd">public</span> ModelAndView(String viewName){ 
   <span class="kwrd">this</span>.view = viewName;
}</pre></div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<div><pre id="codeSnippet" class="csharpcode"><br>&nbsp;</pre></div>
<div>可以看到view实例可以指向一个View对象或者字符串。现在先看看View接口：</div><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> View { 

    <span class="rem">/**</span>
<span class="rem">     * Return the content type of the view, if predetermined.</span>
<span class="rem">     * &lt;p&gt;Can be used to check the content type upfront,</span>
<span class="rem">     * before the actual rendering process.</span>
<span class="rem">     * @return the content type String (optionally including a character set),</span>
<span class="rem">     * or &lt;code&gt;null&lt;/code&gt; if not predetermined.</span>
<span class="rem">     */</span>
    String getContentType(); 

    <span class="rem">/**</span>
<span class="rem">     * 绘制视图</span></pre><pre class="csharpcode"><span class="rem"></span><span class="rem">     * 绘制视图的第一步是准备请求: 如果是JSP的视图技术</span></pre><pre class="csharpcode"><span class="rem"></span><span class="rem">     * 首先会把model设为request的属性。</span></pre><pre class="csharpcode"><span class="rem"></span><span class="rem">     * 第二步则是真正的绘制视图</span></pre><pre class="csharpcode"><span class="rem">     * @param model Map with name Strings as keys and corresponding model</span>
<span class="rem">     * objects as values (Map can also be &lt;code&gt;null&lt;/code&gt; in case of empty model)</span>
<span class="rem">     * @param request current HTTP request</span>
<span class="rem">     * @param response HTTP response we are building</span>
<span class="rem">     * @throws Exception if rendering failed</span>
<span class="rem">     */</span>
    <span class="kwrd">void</span> render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; 

}
在这之后，我们再来看看View的实现继承类图，可以看到Spring支持多种类型视图：</pre>
<p>org.springframework.web.servlet.view.<b>AbstractView</b> (implements org.springframework.beans.factory.BeanNameAware, org.springframework.web.servlet.<strong>View</strong>) 
<ul>
<li>org.springframework.web.servlet.view.document.<b>AbstractExcelView</b> 
<li>org.springframework.web.servlet.view.document.<b>AbstractJExcelView</b> 
<li>org.springframework.web.servlet.view.document.<b>AbstractPdfView</b> 
<li>org.springframework.web.servlet.view.<b>AbstractUrlBasedView</b> (implements org.springframework.beans.factory.InitializingBean) 
<ul>
<li>org.springframework.web.servlet.view.jasperreports.<b>AbstractJasperReportsView</b> 
<ul>
<li>org.springframework.web.servlet.view.jasperreports.<b>AbstractJasperReportsSingleFormatView</b> 
<ul>
<li>org.springframework.web.servlet.view.jasperreports.<b>ConfigurableJasperReportsView</b> 
<li>org.springframework.web.servlet.view.jasperreports.<b>JasperReportsCsvView</b> 
<li>org.springframework.web.servlet.view.jasperreports.<b>JasperReportsHtmlView</b> 
<li>org.springframework.web.servlet.view.jasperreports.<b>JasperReportsPdfView</b> 
<li>org.springframework.web.servlet.view.jasperreports.<b>JasperReportsXlsView</b></li></ul>
<li>org.springframework.web.servlet.view.jasperreports.<b>JasperReportsMultiFormatView</b></li></ul>
<li>org.springframework.web.servlet.view.document.<b>AbstractPdfStamperView</b> 
<li>org.springframework.web.servlet.view.<b>AbstractTemplateView</b> 
<ul>
<li>org.springframework.web.servlet.view.freemarker.<b>FreeMarkerView</b> 
<li>org.springframework.web.servlet.view.velocity.<b>VelocityView</b> 
<ul>
<li>org.springframework.web.servlet.view.velocity.<b>VelocityToolboxView</b> 
<ul>
<li>org.springframework.web.servlet.view.velocity.<b>VelocityLayoutView</b></li></ul></li></ul></li></ul>
<li>org.springframework.web.servlet.view.<b>InternalResourceView</b> 
<ul>
<li>org.springframework.web.servlet.view.<b>JstlView</b> 
<li>org.springframework.web.servlet.view.tiles.<b>TilesView</b> 
<ul>
<li>org.springframework.web.servlet.view.tiles.<b>TilesJstlView</b></li></ul></li></ul>
<li>org.springframework.web.servlet.view.<b>RedirectView</b> 
<li>org.springframework.web.servlet.view.tiles2.<b>TilesView</b> 
<li>org.springframework.web.servlet.view.xslt.<b>XsltView</b></li></ul>
<li>org.springframework.web.servlet.view.xslt.<b>AbstractXsltView</b></li></ul><pre class="csharpcode">&nbsp;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<div>和Controller一样，View的第一个实现也是AbstractView。所以先让我们看看AbstractView对render函数的实现：</div>
<p>&nbsp; <div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">void</span> render(Map model, HttpServletRequest request, HttpServletResponse response) <span class="kwrd">throws</span> Exception {<br>        <span class="kwrd">if</span> (logger.isTraceEnabled()) {<br>            logger.trace(<span class="str">"Rendering view with name '"</span> + <span class="kwrd">this</span>.beanName + <span class="str">"' with model "</span> + model +<br>                <span class="str">" and static attributes "</span> + <span class="kwrd">this</span>.staticAttributes);<br>        } <br><br>        <span class="rem">// Consolidate static and dynamic model attributes.</span><br>        Map mergedModel = <span class="kwrd">new</span> HashMap(<span class="kwrd">this</span>.staticAttributes.size() + (model != null ? model.size() : 0));<br>        mergedModel.putAll(<span class="kwrd">this</span>.staticAttributes);<br>        <span class="kwrd">if</span> (model != null) {<br>            mergedModel.putAll(model);<br>        } <br><br>        <span class="rem">// Expose RequestContext?</span><br>        <span class="kwrd">if</span> (<span class="kwrd">this</span>.requestContextAttribute != null) {<br>            mergedModel.put(<span class="kwrd">this</span>.requestContextAttribute, createRequestContext(request, mergedModel));<br>        } <br><br>        prepareResponse(request, response);<br>        renderMergedOutputModel(mergedModel, request, response);<br>    }<br></pre><br></div>
<p>第一步，将静态属性和model的属性都添加到mergedModel里面。如果需要请求上下文，则将请求上下文添加到model中。</p>
<p>静态属性是继承AbstractView进行设置的属性。而请求上下文如果设置的名字就会创建一个request上下文。在requestContext中定义了一些包括本地化和主题的处理工具。</p>
<p>第二步，对响应进行预处理。最后调用子类需要实现的函数renderMergedOutputModel。</p>
<p>对PDF和EXCEL格式我们暂且不管，且Spring支持多种视图技术，这里我们主要关注JSTL技术，</p>
<p>接着我们来看<b>AbstractUrlBasedView</b> 类。在<b>AbstractUrlBasedView</b> 只定义了一个url属性。别的没有什么特殊处理。</p>
<p>接着继承<b>AbstractUrlBasedView</b> 的是<b>InternalResourceView</b>。他对renderMergedOutputModel进行实现，实现如下:</p>
<div><pre class="csharpcode"><span class="rem">/**</span><br><span class="rem">     * Render the internal resource given the specified model.</span><br><span class="rem">     * This includes setting the model as request attributes.</span><br><span class="rem">     */</span><br>    <span class="kwrd">protected</span> <span class="kwrd">void</span> renderMergedOutputModel(<br>            Map model, HttpServletRequest request, HttpServletResponse response) <span class="kwrd">throws</span> Exception {<br><br>        <span class="rem">// 获取要暴露的request，一般都是传入的参数request</span><br>        HttpServletRequest requestToExpose = getRequestToExpose(request);<br><br>        <span class="rem">// 将model的数据添加到request属性中</span></pre></div>
<div><pre class="csharpcode"><span class="rem"></span>        exposeModelAsRequestAttributes(model, requestToExpose);<br><br>        <span class="rem">// 设置helper，如果存在的话</span><br>        exposeHelpers(requestToExpose);<br><br>        <span class="rem">// 对绘制进行预处理，从而获得到要分发的url</span><br>        String dispatcherPath = prepareForRendering(requestToExpose, response);<br><br>        <span class="rem">// 获取请求分发对象</span><br>        RequestDispatcher rd = requestToExpose.getRequestDispatcher(dispatcherPath);<br>        <span class="kwrd">if</span> (rd == null) {<br>            <span class="kwrd">throw</span> <span class="kwrd">new</span> ServletException(<br>                    <span class="str">"Could not get RequestDispatcher for ["</span> + getUrl() + <span class="str">"]: check that this file exists within your WAR"</span>);<br>        }<br><br>        <span class="rem">// 决定使用RequestDispatcher的include方法还是forward方法</span><br>        <span class="kwrd">if</span> (useInclude(requestToExpose, response)) {<br>            response.setContentType(getContentType());<br>            <span class="kwrd">if</span> (logger.isDebugEnabled()) {<br>                logger.debug(<span class="str">"Including resource ["</span> + getUrl() + <span class="str">"] in InternalResourceView '"</span> + getBeanName() + <span class="str">"'"</span>);<br>            }<br>            rd.include(requestToExpose, response);<br>        }<br><br>        <span class="kwrd">else</span> {<br>            <span class="rem">// Note: The forwarded resource is supposed to determine the content type itself.</span><br>            exposeForwardRequestAttributes(requestToExpose);<br>            <span class="kwrd">if</span> (logger.isDebugEnabled()) {<br>                logger.debug(<span class="str">"Forwarding to resource ["</span> + getUrl() + <span class="str">"] in InternalResourceView '"</span> + getBeanName() + <span class="str">"'"</span>);<br>            }<br>            rd.forward(requestToExpose, response);<br>        }<br>    }</pre></div>
<div>可以看到<b>InternalResourceView对请求进行了转发。转发到url上。最后我们看看JSTLView的实现：</b></div>
<div><strong></strong><br>&nbsp;</div><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> JstlView extends InternalResourceView {

    <span class="kwrd">private</span> MessageSource messageSource;

    <span class="kwrd">public</span> JstlView() {
    }

    
    <span class="kwrd">public</span> JstlView(String url) {
        super(url);
    }

    <span class="kwrd">public</span> JstlView(String url, MessageSource messageSource) {
        <span class="kwrd">this</span>(url);
        <span class="kwrd">this</span>.messageSource = messageSource;
    }

    <span class="kwrd">protected</span> <span class="kwrd">void</span> initServletContext(ServletContext servletContext) {
        <span class="kwrd">if</span> (<span class="kwrd">this</span>.messageSource != <span class="kwrd">null</span>) {
            <span class="kwrd">this</span>.messageSource = JstlUtils.getJstlAwareMessageSource(servletContext, <span class="kwrd">this</span>.messageSource);
        }
        super.initServletContext(servletContext);
    }

    <span class="kwrd">protected</span> <span class="kwrd">void</span> exposeHelpers(HttpServletRequest request) throws Exception {
        <span class="kwrd">if</span> (<span class="kwrd">this</span>.messageSource != <span class="kwrd">null</span>) {
            JstlUtils.exposeLocalizationContext(request, <span class="kwrd">this</span>.messageSource);
        }
        <span class="kwrd">else</span> {
            JstlUtils.exposeLocalizationContext(<span class="kwrd">new</span> RequestContext(request, getServletContext()));
        }
    }

}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp;</p>
<p><b>在InternalResourceView&nbsp; 中，基本上所有的处理都差不多了。在JSTLView对两个方法进行了覆盖。第一个initServletContext，主要初始化了MessageResource</b></p>
<p><strong>第二个exposeHelpers将messageSource放在了request里面。</strong></p>
<p><strong>这样view的解析就结束了。接下来容器对jsp进行解析，并进行tag等的处理。然后将生成的页面返回给客户端。</strong></p><img src ="http://www.blogjava.net/wangajing/aggbug/303759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-26 13:25 <a href="http://www.blogjava.net/wangajing/archive/2009/11/26/303759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringMVC web框架学习 Controller 分析</title><link>http://www.blogjava.net/wangajing/archive/2009/11/26/303714.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Thu, 26 Nov 2009 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/26/303714.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303714.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/26/303714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303714.html</trackback:ping><description><![CDATA[<p>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/AbstractController.html"><b>AbstractController</b></a> (implements org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/Controller.html">Controller</a>)  <ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/AbstractUrlViewController.html"><b>AbstractUrlViewController</b></a>  <ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/UrlFilenameViewController.html"><b>UrlFilenameViewController</b></a></li></ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/BaseCommandController.html"><b>BaseCommandController</b></a>  <ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/AbstractCommandController.html"><b>AbstractCommandController</b></a>  <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/AbstractFormController.html"><b>AbstractFormController</b></a>  <ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/AbstractWizardFormController.html"><b>AbstractWizardFormController</b></a>  <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/SimpleFormController.html"><b>SimpleFormController</b></a>  <ul> <li>org.springframework.web.servlet.mvc.<a href="../../../../../org/springframework/web/servlet/mvc/CancellableFormController.html"><b>CancellableFormController</b></a></li></ul></li></ul></li></ul></li></ul> <p>Spring MVC框架中的Controller对请求进行处理：所有的Controller都实现接口Controller：</p><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> Controller { 

    <span class="rem">/**</span>
<span class="rem">     * Process the request and return a ModelAndView object which the DispatcherServlet</span>
<span class="rem">     * will render. A &lt;code&gt;null&lt;/code&gt; return value is not an error: It indicates that</span>
<span class="rem">     * this object completed request processing itself, thus there is no ModelAndView</span>
<span class="rem">     * to render.</span>
<span class="rem">     * @param request current HTTP request</span>
<span class="rem">     * @param response current HTTP response</span>
<span class="rem">     * @return a ModelAndView to render, or &lt;code&gt;null&lt;/code&gt; if handled directly</span>
<span class="rem">     * @throws Exception in case of errors</span>
<span class="rem">     */</span>
    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; 

}
上面的doc表明Controller返回的modelandview可以使空，表明请求都是该函数中处理完成了，不需要modeland来进行渲染。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">在继续之前先介绍一个有用的工具类：WebUtils。用这个可以简化session，request的处理。具体的内容可以参考文档。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">Controller的第一个实现是：AbstractController。他是一个Abstract类，除了实现了Controller接口，它还继承了WebContentGenerator。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">WebContentGenerator的作用是什么？参考文档可以发现，该类主要对Cache和Session进行管理。</pre><pre class="csharpcode">&nbsp;</pre>
<table border="2" cellspacing="1" cellpadding="2" width="700">
<tbody>
<tr>
<td valign="top" width="350"><b>cacheSeconds</b></td>
<td valign="top" width="350">指定内容缓存的时间，默认为1</td></tr>
<tr>
<td valign="top" width="350"><b>requireSession</b></td>
<td valign="top" width="350">是否需要会话，默认支持</td></tr>
<tr>
<td valign="top" width="350"><b>supportedMethods</b></td>
<td valign="top" width="350">支持的方法，默认是GET\post\Head</td></tr>
<tr>
<td valign="top" width="350"><b>useCacheControlHeader</b></td>
<td valign="top" width="350">指定是否使用http1.1的cache控制头信息，默认使用</td></tr>
<tr>
<td valign="top" width="350"><b>useCacheControlNoStore</b></td>
<td valign="top" width="350">指定是否设置http1.1的cache控制头信息为no-store。默认使用</td></tr>
<tr>
<td valign="top" width="350"><b>useExpiresHeader</b></td>
<td valign="top" width="350">指定是否使用http1.0的expire头信息。默认使用</td></tr></tbody></table><pre class="csharpcode">用户可以对这些参数进行测试,cache和expire信息涉及到了http协议信息，更多信息可以参考http协议文档。这里不再说明。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">再看AbstractController的代码：</pre>
<div><pre class="csharpcode"><span class="kwrd">public</span> ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)<br>            <span class="kwrd">throws</span> Exception { <br><br>        <span class="rem">// Delegate to WebContentGenerator for checking and preparing.</span><br>        checkAndPrepare(request, response, <span class="kwrd">this</span> <span class="kwrd">instanceof</span> LastModified); <br><br>        <span class="rem">// Execute handleRequestInternal in synchronized block if required.</span><br>        <span class="kwrd">if</span> (<span class="kwrd">this</span>.synchronizeOnSession) {<br>            HttpSession session = request.getSession(false);<br>            <span class="kwrd">if</span> (session != null) {<br>                Object mutex = WebUtils.getSessionMutex(session);<br>                <span class="kwrd">synchronized</span> (mutex) {<br>                    <span class="kwrd">return</span> handleRequestInternal(request, response);<br>                }<br>            }<br>        }<br>        <span class="kwrd">return</span> handleRequestInternal(request, response);<br>    }<br>checkandPrepare的目的就是使用用于进行的配置来对request进行预处理和准备。</pre></div>
<div><pre class="csharpcode">他会检查支持的方法，和会话，然后应用cache设置。</pre></div>
<div><pre class="csharpcode">如果需要session同步，就进行同步处理。session同步应用于有session的情况下。如果没有session，session同步是没有用的。</pre></div>
<div><pre class="csharpcode">AbstractController会调用handleRequestInternal方法进行处理，继承AbstractController的类需要实现该方法。<br></pre></div>
<div>下面我们再看看<b>AbstractUrlViewController</b> 的代码实现和文档，先看handleRequestInternal的实现：</div>
<div><br>&nbsp;</div>
<div id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode"><span class="rem">/**</span><br><span class="rem"> * Retrieves the URL path to use for lookup and delegates to</span><br><span class="rem"> * {@link #getViewNameForRequest}.</span><br><span class="rem"> */</span><br><span class="kwrd">protected</span> ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {<br>    String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);<br>    String viewName = getViewNameForRequest(request);<br>    <span class="kwrd">if</span> (logger.isDebugEnabled()) {<br>        logger.debug(<span class="str">"Returning view name '"</span> + viewName + <span class="str">"' for lookup path ["</span> + lookupPath + <span class="str">"]"</span>);<br>    }<br>    <span class="kwrd">return</span> <span class="kwrd">new</span> ModelAndView(viewName);<br>}<br></pre><br></div>
<div>可以看到，它使用了getViewNameForRequest获取需要的viewName。而getViewNameForRequest是一个抽象函数，需要子类实现。lookupPath就是我们请求的URL中的一部分。如我们使用<b>UrlFilenameViewController来进行如下的配置：</b></div>
<div>&lt;bean name="/index.do" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"&gt;&lt;/bean&gt;、</div>
<div>09-11-25 11:56:06 - DEBUG [http-8200-1] - Returning view name 'index' for lookup path [/index.do]</div>
<div>该Controller对/index.do解析成index，然后再通过viewResolver对index进行扩展为/jsp/index.jsp。从而找到该页面。</div>
<div>可以看到这个类的主要是用于对url进行解析，然后转到合适的页面上，而在转到这个页面之前不需要进行特别的处理。</div>
<div>明白了该类的作用自然也就知道了UrlFilenameViewController的作用。这里不再进行详细分析。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><img src ="http://www.blogjava.net/wangajing/aggbug/303714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-26 09:35 <a href="http://www.blogjava.net/wangajing/archive/2009/11/26/303714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC 框架学习之AbstractFormController以及AbstractFormControll</title><link>http://www.blogjava.net/wangajing/archive/2009/11/25/303665.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Wed, 25 Nov 2009 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/25/303665.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303665.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/25/303665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303665.html</trackback:ping><description><![CDATA[<p>在看完BaseCommandController和AbstractCommandController之后，我们再看BaseCommandController的另一个实现AbstractFormController，以及AbstractFormController的具体实现SimpleFormController。</p>
<p>先看看AbstractFormController对handleRequestInternal的实现：</p>
<pre class="csharpcode"><span class="kwrd">protected</span> ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
<span class="rem">// Form submission or new form to show?</span>
<span class="kwrd">if</span> (isFormSubmission(request)) {
<span class="rem">// Fetch form object from HTTP session, bind, validate, process submission.</span>
<span class="kwrd">try</span> {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = <span class="kwrd">new</span> BindException(binder.getBindingResult());
<span class="kwrd">return</span> processFormSubmission(request, response, command, errors);
}
<span class="kwrd">catch</span> (HttpSessionRequiredException ex) {
<span class="rem">// Cannot submit a session form if no form object is in the session.</span>
<span class="kwrd">if</span> (logger.isDebugEnabled()) {
logger.debug(<span class="str">"Invalid submit detected: "</span> + ex.getMessage());
}
<span class="kwrd">return</span> handleInvalidSubmit(request, response);
}
}
<span class="kwrd">else</span> {
<span class="rem">// New form to show: render form view.</span>
<span class="kwrd">return</span> showNewForm(request, response);
}
}
这个方法，首先判断是不是Form提交，判断方法是：</pre>
<div>
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">boolean</span> isFormSubmission(HttpServletRequest request) {<br />
<span class="kwrd">return</span> <span class="str">"POST"</span>.equals(request.getMethod());<br />
}</pre>
</div>
<div>如果是form提交的话，系统首先创建一个Command，然后对数据进行绑定和验证，之后调用processFormSubmission方法。showNewForm则调用showForm。</div>
<div>在AbstractFormController中里面有两个抽象方法：</div>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" class="csharpcode"><br />
<span class="kwrd">protected</span> <span class="kwrd">abstract</span> ModelAndView processFormSubmission(<br />
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)<br />
<span class="kwrd">throws</span> Exception;<br />
<span class="kwrd">protected</span> <span class="kwrd">abstract</span> ModelAndView showForm(<br />
HttpServletRequest request, HttpServletResponse response, BindException errors)<br />
<span class="kwrd">throws</span> Exception;<br />
<br />
</pre>
<br />
</div>
<div><br />
&nbsp;</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>&nbsp;</p>
<p>好了，看完AbstractFormController之后，再看看SimpleFormController是如何实现：</p>
<div id="codeSnippetWrapper">
<pre class="csharpcode"><span class="kwrd">protected</span> ModelAndView processFormSubmission(<br />
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)<br />
<span class="kwrd">throws</span> Exception { <br />
<br />
<span class="kwrd">if</span> (errors.hasErrors()) {<br />
<span class="kwrd">if</span> (logger.isDebugEnabled()) {<br />
logger.debug(<span class="str">"Data binding errors: "</span> + errors.getErrorCount());<br />
}<br />
<span class="kwrd">return</span> showForm(request, response, errors);<br />
}<br />
<span class="kwrd">else</span> <span class="kwrd">if</span> (isFormChangeRequest(request, command)) {<br />
logger.debug(<span class="str">"Detected form change request -&gt; routing request to onFormChange"</span>);<br />
onFormChange(request, response, command, errors);<br />
<span class="kwrd">return</span> showForm(request, response, errors);<br />
}<br />
<span class="kwrd">else</span> {<br />
logger.debug(<span class="str">"No errors -&gt; processing submit"</span>);<br />
<span class="kwrd">return</span> onSubmit(request, response, command, errors);<br />
}<br />
}</pre>
<pre class="csharpcode">在上面的方法中，如果有错误，调用showForm，来显示form。没有错误的话，则调用onSubmit方法。<br />
</pre>
</div>
<div>
<pre id="codeSnippet" class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">final</span> ModelAndView showForm(<br />
HttpServletRequest request, BindException errors, String viewName, Map controlModel)<br />
<span class="kwrd">throws</span> Exception {<br />
<br />
<span class="rem">// In session form mode, re-expose form object as HTTP session attribute.</span><br />
<span class="rem">// Re-binding is necessary for proper state handling in a cluster,</span><br />
<span class="rem">// to notify other nodes of changes in the form object.</span><br />
<span class="kwrd">if</span> (isSessionForm()) {<br />
String formAttrName = getFormSessionAttributeName(request);<br />
<span class="kwrd">if</span> (logger.isDebugEnabled()) {<br />
logger.debug(<span class="str">"Setting form session attribute ["</span> + formAttrName + <span class="str">"] to: "</span> + errors.getTarget());<br />
}<br />
request.getSession().setAttribute(formAttrName, errors.getTarget());<br />
}<br />
<br />
<span class="rem">// Fetch errors model as starting point, containing form object under</span><br />
<span class="rem">// "commandName", and corresponding Errors instance under internal key.</span><br />
Map model = errors.getModel();<br />
<br />
<span class="rem">// Merge reference data into model, if any.</span><br />
Map referenceData = referenceData(request, errors.getTarget(), errors);<br />
<span class="kwrd">if</span> (referenceData != null) {<br />
model.putAll(referenceData);<br />
}<br />
<br />
<span class="rem">// Merge control attributes into model, if any.</span><br />
<span class="kwrd">if</span> (controlModel != null) {<br />
model.putAll(controlModel);<br />
}<br />
<br />
<span class="rem">// Trigger rendering of the specified view, using the final model.</span><br />
<span class="kwrd">return</span> <span class="kwrd">new</span> ModelAndView(viewName, model);<br />
}</pre>
</div>
<div>在showForm中，设置属性，放在model中，然后在viewName进行设置。</div>
<div>FormController就是上面的过程。具体的执行过程和详细信息会在以后的博客中具体介绍。<br />
</div>
<div id="codeSnippetWrapper"><br />
</div>
<img src ="http://www.blogjava.net/wangajing/aggbug/303665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-25 17:31 <a href="http://www.blogjava.net/wangajing/archive/2009/11/25/303665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC 框架学习笔记之BaseCommandController和AbstractCommandController</title><link>http://www.blogjava.net/wangajing/archive/2009/11/25/303652.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Wed, 25 Nov 2009 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/25/303652.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303652.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/25/303652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303652.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>Spring的BaseCommandController继承自AbstractController。在看BaseCommandController之前先看他的继承类AbstractCommandController是如何实现</p>
<p>AbstractController的handleInternalRequest方法的：</p>
<pre class="csharpcode"><span class="kwrd">protected</span> ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = <span class="kwrd">new</span> BindException(binder.getBindingResult());
<span class="kwrd">return</span> handle(request, response, command, errors);
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>getCommand就是BaseCommandController中的方法。</p>
<pre class="csharpcode"><span class="kwrd">protected</span> Object getCommand(HttpServletRequest request) throws Exception {
<span class="kwrd">return</span> createCommand();
}
<span class="kwrd">protected</span> final Object createCommand() throws Exception {
<span class="kwrd">if</span> (<span class="kwrd">this</span>.commandClass == <span class="kwrd">null</span>) {
<span class="kwrd">throw</span> <span class="kwrd">new</span> IllegalStateException(<span class="str">"Cannot create command without commandClass being set - "</span> +
<span class="str">"either set commandClass or (in a form controller) override formBackingObject"</span>);
}
<span class="kwrd">if</span> (logger.isDebugEnabled()) {
logger.debug(<span class="str">"Creating new command of class ["</span> + <span class="kwrd">this</span>.commandClass.getName() + <span class="str">"]"</span>);
}
<span class="kwrd">return</span> BeanUtils.instantiateClass(<span class="kwrd">this</span>.commandClass);
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>createCommand创建了一个CommandClass的对象。</p>
<p>然后再看bindAndValidate方法：</p>
<pre class="csharpcode"><span class="kwrd">protected</span> final ServletRequestDataBinder bindAndValidate(HttpServletRequest request, Object command)
throws Exception {
ServletRequestDataBinder binder = createBinder(request, command);
BindException errors = <span class="kwrd">new</span> BindException(binder.getBindingResult());
<span class="kwrd">if</span> (!suppressBinding(request)) {
binder.bind(request);
onBind(request, command, errors);
<span class="kwrd">if</span> (<span class="kwrd">this</span>.validators != <span class="kwrd">null</span> &amp;&amp; isValidateOnBinding() &amp;&amp; !suppressValidation(request, command, errors)) {
<span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; <span class="kwrd">this</span>.validators.length; i++) {
ValidationUtils.invokeValidator(<span class="kwrd">this</span>.validators[i], command, errors);
}
}
onBindAndValidate(request, command, errors);
}
<span class="kwrd">return</span> binder;
}
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>这个方法首先创建了
DataBinder对象，然后，获取创建绑定对象时发生的错误。报错在errors。接下来绑定对象，调用onBind处理绑定事件；接下来应用Validator。然后调用onBindAndValidate来处理绑定和验证事件。最后返回binder。</p>
<p>处理完之后调用handle方法进行处理。</p>
<p>综上所述，AbstractCommandController具有两个功能:</p>
<p>1、将请求参数转换为Command对象。在该Controller中，我们设置一个object对象。然后BaseCommandController将请求的参数进行转换。如果请求参数有value值，就会调用object的的setValue对象来设置对象里的值。如果请求参数中有address.city.就会调用object中getAddress().setCity()方法来赋值。这个object可以是任意的object，唯一的要求就是这个object类没有参数。</p>
<p>2、对数据进行验证。在转换和验证时发生错误时，需要在handle(request, response, command,
errors)中进行处理。</p>
<img src ="http://www.blogjava.net/wangajing/aggbug/303652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-25 16:25 <a href="http://www.blogjava.net/wangajing/archive/2009/11/25/303652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的MVC web框架学习笔记</title><link>http://www.blogjava.net/wangajing/archive/2009/11/25/303590.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Wed, 25 Nov 2009 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/25/303590.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303590.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/25/303590.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303590.html</trackback:ping><description><![CDATA[<p>1、Spring web 框架的核心：DispatcherServlet</p> <p>DispatcherServlet 用于接收请求。是使用Spring框架的入口。在web.xml中，需要配置该servlet。在配置该Servlet的时候url-pattern你可以使用你自己想使用的形式，如*.aspx,*.do,*.htm,*.action，用以混淆客户端对服务器架构的认识。</p> <p>另外，该Servlet在容器中还会加载一个APPlicationContext的xml文件。默认加载的是[servlet-name]-servlet.xml。例如，你在web.xml中配置的servlet如下：</p><pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">web-app</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">servlet</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>example<span class="kwrd">&lt;/</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">servlet-class</span><span class="kwrd">&gt;</span>org.springframework.web.servlet.DispatcherServlet<span class="kwrd">&lt;/</span><span class="html">servlet-class</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">load-on-startup</span><span class="kwrd">&gt;</span>1<span class="kwrd">&lt;/</span><span class="html">load-on-startup</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">servlet</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">servlet-mapping</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>example<span class="kwrd">&lt;/</span><span class="html">servlet-name</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>*.form<span class="kwrd">&lt;/</span><span class="html">url-pattern</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">servlet-mapping</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">web-app</span><span class="kwrd">&gt;</span>
</pre><pre class="csharpcode">该Servlet就会在服务器启动时，加载example-servlet.xml。当然，你也可以自己来指定加载文件。</pre><pre class="csharpcode">要看看DispatcherServlet真面目，打开源文件，发现定义了很多BeanName的常量，如本地化解析器beanname，主题解析器beanname，视图解析器beanname，上传文件解析的multipart解析器beanname。</pre><pre class="csharpcode">等：</pre><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> final String MULTIPART_RESOLVER_BEAN_NAME = <span class="str">"multipartResolver"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String LOCALE_RESOLVER_BEAN_NAME = <span class="str">"localeResolver"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String THEME_RESOLVER_BEAN_NAME = <span class="str">"themeResolver"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String HANDLER_MAPPING_BEAN_NAME = <span class="str">"handlerMapping"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String HANDLER_ADAPTER_BEAN_NAME = <span class="str">"handlerAdapter"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = <span class="str">"handlerExceptionResolver"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = <span class="str">"viewNameTranslator"</span>;
<span class="kwrd">public</span> <span class="kwrd">static</span> final String VIEW_RESOLVER_BEAN_NAME = <span class="str">"viewResolver"</span>;
</pre><pre class="csharpcode">这个类怎么使用这些bean呢？以上面的exexample-servlet.xml为例，我们定义的名字为example的DispatcherServlet使用example-servlet.xml的配置。在example-servlet.xml里，我们可以配置名字上面的beanName的bean，来让servlet加载这些bean。</pre><pre class="csharpcode">这下明白了，servlet.xml该怎么配置，该配置什么了。</pre><pre class="csharpcode">好了，看完了最重要的servlet的配置问题，我们再看下一个重要的接口:Controller。至于上面servlet要使用的什么什么解析器啦，我们稍后在分析。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">2、Controller</pre><pre class="csharpcode">我们的请求提交到DispacherServlet后，会转给Controller。怎么找Controller？通过使用handlerMapping。如果没有设置handlerMapping，spring使用默认的BeanNameUrlHandlerMapping来找Controller。</pre><pre class="csharpcode">BeanNameUrlHandlerMapping？顾名思义，就是通过bean的name属性来映射controller。bean的name请求是一个url，如果请求的是logout.do，在example-servlet.xml中定义一个名字（name）为login.do的Controller.</pre>
<p>&lt;bean name="/logout.do" class="com.jy.bookshop.web.spring.LogoutController"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>再插一句话，在handlerMapping中，我们可以使用请求拦截器来对请求进行拦截处理。该拦截器怎么使用这里暂且不表，有机会再讨论。</p>
<p>ok，现在我们创建一个LogoutController来让他处理请求，让他实现Controller吧：</p><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> LogOutController implements Controller {
    <span class="kwrd">public</span> ModelAndView handleRequest(HttpServletRequest req,
            HttpServletResponse res) throws Exception {
          …
        <span class="kwrd">return</span> <span class="kwrd">new</span> ModelAndView(<span class="kwrd">new</span> RedirectView(<span class="str">"login.do"</span>));
    }
}</pre><pre class="csharpcode">看看这个Controller接口的定义，发现这个接口只定义了一个handleRequest方法。在这个方法中，返回一个ModelAndView。</pre><pre class="csharpcode">先说ModelAndView。我们知道MVC，那么ModelAndView就是 MV了。Controller就是C。这样MVC全了。呵呵。</pre><pre class="csharpcode">继续说ModelAndView，要了解他的结构，那自然要看看他的源代码了：</pre><pre class="csharpcode"><span class="rem">/** View instance or view name String */</span>
<span class="kwrd">private</span> Object view; 

<span class="rem">/** Model Map */</span>
<span class="kwrd">private</span> ModelMap model;
</pre>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 只关注我们关注的，里面包含了一个View对象和model对象。model对象是一个Map，这里不再说了。关键看看view，奇怪，怎么是一个Object，太抽象了。再继续看源代码的话，会更加明白：</p>
<p>&nbsp;</p><pre class="csharpcode"><span class="kwrd">public</span> ModelAndView(String viewName, String modelName, Object modelObject) {
        <span class="kwrd">this</span>.view = viewName;
        addObject(modelName, modelObject);
    }
<span class="kwrd">public</span> <span class="kwrd">void</span> setViewName(String viewName) {
        <span class="kwrd">this</span>.view = viewName;
    }</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
原来这个view可以指向一个View对象，也可以指向String对象啊。View一个接口，如果看doc的话，他的实现类有AbstractExcelView, AbstractJasperReportsSingleFormatView, AbstractJasperReportsView, AbstractJExcelView, AbstractPdfStamperView, AbstractPdfView,AbstractTemplateView, AbstractUrlBasedView, AbstractView, AbstractXsltView, ConfigurableJasperReportsView, FreeMarkerView, InternalResourceView,JasperReportsCsvView, JasperReportsHtmlView, JasperReportsMultiFormatView, JasperReportsPdfView, JasperReportsXlsView, JstlView, RedirectView,TilesJstlView, TilesView, TilesView, VelocityLayoutView, VelocityToolboxView, VelocityView, XsltView（诚实的说，这些View是拷doc的）。</p>
<p>现在可以知道，我们的Controller返回一个View和Model，来让Spring框架来创建一个回应。</p>
<p>现在奇怪的还有一点，我吧view设置为字符串，Spring框架怎么处理？在ModelAndView中，如果view是一个字符串，则会将这个值交给DispatcherServlet的viewResovler来处理。记得上面提到的viewResovler了吗？呵呵，派上用场了。</p>
<p>view的问题解决了，然后再说model吧。在ModelAndView添加了一些对象，Spring是怎么处理的呢？总应该把这些对象给弄到request对象里，让jsp页面来使用吧。让View使用？那么看看View接口吧：</p><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">interface</span> View {

    String getContentType();

    <span class="kwrd">void</span> render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;

}</pre><pre class="csharpcode">render函数需要带一个model变量。再找找view的实现类，看看是怎么工作的。不过view有那么多，对于一些像什么pdf啦，excel了他们都不需要在request中添加这个model。</pre><pre class="csharpcode">最终呢，我们在jstlView的父类InternalResourceView中的renderMergedOutputModel函数发现他把model放在了request里面了。</pre><pre class="csharpcode">&nbsp;</pre><pre class="csharpcode">OK，现在我们明白了，controller返回的modelandview交给Servlet进行处理，来生成一个页面。</pre><pre class="csharpcode">最简单的Controller介绍完毕。现在看看Spring提供的一些controller的实现，Spring提供了很多controller的实现，继承的结构如下：</pre>
<p>&nbsp; <p>org.springframework.web.servlet.mvc.<b>AbstractController</b> (implements org.springframework.web.servlet.mvc.Controller) 
<ul>
<li>org.springframework.web.servlet.mvc.<b>AbstractUrlViewController</b> 
<ul>
<li>org.springframework.web.servlet.mvc.<b>UrlFilenameViewController</b></li></ul>
<li>org.springframework.web.servlet.mvc.<b>BaseCommandController</b> 
<ul>
<li>org.springframework.web.servlet.mvc.<b>AbstractCommandController</b> 
<li>org.springframework.web.servlet.mvc.<b>AbstractFormController</b> 
<ul>
<li>org.springframework.web.servlet.mvc.<b>AbstractWizardFormController</b> 
<li>org.springframework.web.servlet.mvc.<b>SimpleFormController</b> 
<ul>
<li>org.springframework.web.servlet.mvc.<b>CancellableFormController</b></li></ul></li></ul></li></ul>
<li>org.springframework.web.servlet.mvc.<b>ParameterizableViewController</b> 
<li>org.springframework.web.servlet.mvc.<b>ServletForwardingController</b> (implements org.springframework.beans.factory.BeanNameAware) 
<li>org.springframework.web.servlet.mvc.<b>ServletWrappingController</b> (implements org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.<a href="../../../../../org/springframework/beans/factory/DisposableBean.html">DisposableBean</a>, org.springframework.beans.factory.<a href="../../../../../org/springframework/beans/factory/InitializingBean.html">InitializingBean</a>)</li></ul>
<ul></ul><pre class="csharpcode">AbstractController是Controller的第一个实现。其他的Controller都是继承这个Controller的。我们先看比较重要的Controller。</pre><pre class="csharpcode">先说<b>UrlFilenameViewController。不如我们自己来部署一个吧。</b></pre><pre class="csharpcode"><strong>在example-servlet.xml中增加如下的配置：</strong></pre>
<p>&lt;bean name="/error.do"&nbsp; class="org.springframework.web.servlet.mvc.UrlFilenameViewController"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<pre class="csharpcode">OK，当/error.do的请求上来后，urlFileNameViewController将他变成/error。然后返回个View，这个view的name就是/error，然后使用viewresolver来进行解析，可以解析成/jsp/error.jsp。</pre><pre class="csharpcode">另外还有比较重要的controller是baseCommandController，将请求参数转换为一个对象，并对对象参数合法性进行验证。另外,SimpleFormController可以对表单进行处理。</pre><pre class="csharpcode">关于各个controller的分析。未完待续。。<br><br>&nbsp;</pre><br><pre class="csharpcode">&nbsp;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp;</p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><img src ="http://www.blogjava.net/wangajing/aggbug/303590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-25 11:09 <a href="http://www.blogjava.net/wangajing/archive/2009/11/25/303590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] java.beans.PropertyEditor(属性编辑器)简单应用 </title><link>http://www.blogjava.net/wangajing/archive/2009/11/20/303110.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Fri, 20 Nov 2009 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/20/303110.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/303110.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/20/303110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/303110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/303110.html</trackback:ping><description><![CDATA[<div class="postTitle">原文：http://www.blogjava.net/orangewhy/archive/2007/06/26/126371.html</div>
<p>java.beans.PropertyEditor的从字义来看是一个属性编辑器，但总觉得它的作用更像一个转换器－－从字符串转换为类对象的属性。</p>
<p>java.beans.PropertyEditor接口定义的方法有好几个，但是最重要为下面两个：</p>
<p>&nbsp;void setValue(Object value)</p>
<p>&nbsp;void setAsText(String text) throws java.lang.IllegalArgumentException;</p>
<p>一般地，我们要使用PropertyEditor时，并不直接实现此接口，而是通过继承实现此接口的java.beans.PropertyEditorSupport来简化我们的工作，在子类覆盖setAsText方法就可以了，setValue方法一般不直接使用，在setAsText方法中将字符串进行转换并产生目标对象以后，由调setAsText调用setValue来把目标对象注入到编辑器中。当然，你可用覆盖更多的方法来满足你的特殊要求。JavaBean的类和接口，被大部分spring包使用，可以从spring中学习更成熟的JavaBean使用方法。</p>
<p>简单的例子：</p>
<p>实体类Person：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person<br />
<img id="Codehighlighter1_20_590_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_590_Open_Text.style.display='none'; Codehighlighter1_20_590_Closed_Image.style.display='inline'; Codehighlighter1_20_590_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_20_590_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_20_590_Closed_Text.style.display='none'; Codehighlighter1_20_590_Open_Image.style.display='inline'; Codehighlighter1_20_590_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_20_590_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_20_590_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;sex;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person(String&nbsp;name,&nbsp;String&nbsp;sex,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)<br />
<img id="Codehighlighter1_135_194_Open_Image" onclick="this.style.display='none'; Codehighlighter1_135_194_Open_Text.style.display='none'; Codehighlighter1_135_194_Closed_Image.style.display='inline'; Codehighlighter1_135_194_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_135_194_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_135_194_Closed_Text.style.display='none'; Codehighlighter1_135_194_Open_Image.style.display='inline'; Codehighlighter1_135_194_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_135_194_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_135_194_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()<br />
<img id="Codehighlighter1_220_237_Open_Image" onclick="this.style.display='none'; Codehighlighter1_220_237_Open_Text.style.display='none'; Codehighlighter1_220_237_Closed_Image.style.display='inline'; Codehighlighter1_220_237_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_220_237_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_220_237_Closed_Text.style.display='none'; Codehighlighter1_220_237_Open_Image.style.display='inline'; Codehighlighter1_220_237_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_220_237_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_220_237_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)<br />
<img id="Codehighlighter1_269_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_269_290_Open_Text.style.display='none'; Codehighlighter1_269_290_Closed_Image.style.display='inline'; Codehighlighter1_269_290_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_269_290_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_269_290_Closed_Text.style.display='none'; Codehighlighter1_269_290_Open_Image.style.display='inline'; Codehighlighter1_269_290_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_269_290_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_269_290_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()<br />
<img id="Codehighlighter1_318_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_336_Open_Text.style.display='none'; Codehighlighter1_318_336_Closed_Image.style.display='inline'; Codehighlighter1_318_336_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_318_336_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_318_336_Closed_Text.style.display='none'; Codehighlighter1_318_336_Open_Image.style.display='inline'; Codehighlighter1_318_336_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_318_336_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_318_336_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setName(String&nbsp;name)<br />
<img id="Codehighlighter1_373_396_Open_Image" onclick="this.style.display='none'; Codehighlighter1_373_396_Open_Text.style.display='none'; Codehighlighter1_373_396_Closed_Image.style.display='inline'; Codehighlighter1_373_396_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_373_396_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_373_396_Closed_Text.style.display='none'; Codehighlighter1_373_396_Open_Image.style.display='inline'; Codehighlighter1_373_396_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_373_396_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_373_396_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getSex()<br />
<img id="Codehighlighter1_423_440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_423_440_Open_Text.style.display='none'; Codehighlighter1_423_440_Closed_Image.style.display='inline'; Codehighlighter1_423_440_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_423_440_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_423_440_Closed_Text.style.display='none'; Codehighlighter1_423_440_Open_Image.style.display='inline'; Codehighlighter1_423_440_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_423_440_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_423_440_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sex;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setSex(String&nbsp;sex)<br />
<img id="Codehighlighter1_475_496_Open_Image" onclick="this.style.display='none'; Codehighlighter1_475_496_Open_Text.style.display='none'; Codehighlighter1_475_496_Closed_Image.style.display='inline'; Codehighlighter1_475_496_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_475_496_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_475_496_Closed_Text.style.display='none'; Codehighlighter1_475_496_Open_Image.style.display='inline'; Codehighlighter1_475_496_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_475_496_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_475_496_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()<br />
<img id="Codehighlighter1_538_588_Open_Image" onclick="this.style.display='none'; Codehighlighter1_538_588_Open_Text.style.display='none'; Codehighlighter1_538_588_Closed_Image.style.display='inline'; Codehighlighter1_538_588_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_538_588_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_538_588_Closed_Text.style.display='none'; Codehighlighter1_538_588_Open_Image.style.display='inline'; Codehighlighter1_538_588_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_538_588_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_538_588_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Person[</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">name</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">sex</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">age</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">]</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p>Person的属性编辑器：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PersonPropertyEditor&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;PropertyEditorSupport<br />
<img id="Codehighlighter1_64_1340_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_1340_Open_Text.style.display='none'; Codehighlighter1_64_1340_Closed_Image.style.display='inline'; Codehighlighter1_64_1340_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_64_1340_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_64_1340_Closed_Text.style.display='none'; Codehighlighter1_64_1340_Open_Image.style.display='inline'; Codehighlighter1_64_1340_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif"  alt="" /></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_64_1340_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_64_1340_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAsText(String&nbsp;text)<br />
<img id="Codehighlighter1_103_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_137_Open_Text.style.display='none'; Codehighlighter1_103_137_Closed_Image.style.display='inline'; Codehighlighter1_103_137_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_103_137_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_103_137_Closed_Text.style.display='none'; Codehighlighter1_103_137_Open_Image.style.display='inline'; Codehighlighter1_103_137_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_103_137_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_103_137_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue(parseString(text));<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;parseString(String&nbsp;text)<br />
<img id="Codehighlighter1_182_502_Open_Image" onclick="this.style.display='none'; Codehighlighter1_182_502_Open_Text.style.display='none'; Codehighlighter1_182_502_Closed_Image.style.display='inline'; Codehighlighter1_182_502_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_182_502_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_182_502_Closed_Text.style.display='none'; Codehighlighter1_182_502_Open_Image.style.display='inline'; Codehighlighter1_182_502_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_182_502_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_182_502_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;parts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tokenizeToStringArray(text,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(parts.length&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;parts[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">undefine</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(parts.length&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;parts[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">undefine</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(parts.length&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;Integer.valueOf(parts[</span><span style="color: #000000">2</span><span style="color: #000000">])&nbsp;:&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(text.length()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Person(name,&nbsp;sex,&nbsp;age)&nbsp;:&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String[]&nbsp;tokenizeToStringArray(String&nbsp;str,&nbsp;String&nbsp;delimiters,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;trimTokens,<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;ignoreEmptyTokens)<br />
<img id="Codehighlighter1_638_972_Open_Image" onclick="this.style.display='none'; Codehighlighter1_638_972_Open_Text.style.display='none'; Codehighlighter1_638_972_Closed_Image.style.display='inline'; Codehighlighter1_638_972_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_638_972_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_638_972_Closed_Text.style.display='none'; Codehighlighter1_638_972_Open_Image.style.display='inline'; Codehighlighter1_638_972_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_638_972_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_638_972_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;st&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringTokenizer(str,&nbsp;delimiters);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;tokens&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(st.hasMoreTokens())<br />
<img id="Codehighlighter1_764_937_Open_Image" onclick="this.style.display='none'; Codehighlighter1_764_937_Open_Text.style.display='none'; Codehighlighter1_764_937_Closed_Image.style.display='inline'; Codehighlighter1_764_937_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_764_937_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_764_937_Closed_Text.style.display='none'; Codehighlighter1_764_937_Open_Image.style.display='inline'; Codehighlighter1_764_937_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_764_937_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_764_937_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;token&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;st.nextToken();<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(trimTokens)<br />
<img id="Codehighlighter1_821_852_Open_Image" onclick="this.style.display='none'; Codehighlighter1_821_852_Open_Text.style.display='none'; Codehighlighter1_821_852_Closed_Image.style.display='inline'; Codehighlighter1_821_852_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_821_852_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_821_852_Closed_Text.style.display='none'; Codehighlighter1_821_852_Open_Image.style.display='inline'; Codehighlighter1_821_852_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_821_852_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_821_852_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;token.trim();<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">ignoreEmptyTokens&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;token.length()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_905_933_Open_Image" onclick="this.style.display='none'; Codehighlighter1_905_933_Open_Text.style.display='none'; Codehighlighter1_905_933_Closed_Image.style.display='inline'; Codehighlighter1_905_933_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_905_933_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_905_933_Closed_Text.style.display='none'; Codehighlighter1_905_933_Open_Image.style.display='inline'; Codehighlighter1_905_933_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_905_933_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_905_933_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens.add(token);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;toStringArray(tokens);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String[]&nbsp;toStringArray(Collection&nbsp;collection)<br />
<img id="Codehighlighter1_1032_1154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1032_1154_Open_Text.style.display='none'; Codehighlighter1_1032_1154_Closed_Image.style.display='inline'; Codehighlighter1_1032_1154_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1032_1154_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1032_1154_Closed_Text.style.display='none'; Codehighlighter1_1032_1154_Open_Image.style.display='inline'; Codehighlighter1_1032_1154_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1032_1154_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1032_1154_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(collection&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_1061_1081_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1061_1081_Open_Text.style.display='none'; Codehighlighter1_1061_1081_Closed_Image.style.display='inline'; Codehighlighter1_1061_1081_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_1061_1081_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1061_1081_Closed_Text.style.display='none'; Codehighlighter1_1061_1081_Open_Image.style.display='inline'; Codehighlighter1_1061_1081_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1061_1081_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1061_1081_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(String[])collection.toArray(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[collection.size()]);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p>测试代码：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_41_180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_180_Open_Text.style.display='none'; Codehighlighter1_41_180_Closed_Image.style.display='inline'; Codehighlighter1_41_180_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_41_180_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_41_180_Closed_Text.style.display='none'; Codehighlighter1_41_180_Open_Image.style.display='inline'; Codehighlighter1_41_180_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_41_180_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_41_180_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PersonPropertyEditor&nbsp;editor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PersonPropertyEditor();<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;editor.setAsText(</span><span style="color: #000000">"</span><span style="color: #000000">aSam,man,22</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(editor.getValue());<br />
<img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>结果输出：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">Person[aSam,&nbsp;man,&nbsp;</span><span style="color: #000000">22</span><span style="color: #000000">]</span></div>
<img src ="http://www.blogjava.net/wangajing/aggbug/303110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-20 22:07 <a href="http://www.blogjava.net/wangajing/archive/2009/11/20/303110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高开发技术的Tip</title><link>http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html</link><dc:creator>追求无止境</dc:creator><author>追求无止境</author><pubDate>Mon, 16 Nov 2009 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html</guid><wfw:comment>http://www.blogjava.net/wangajing/comments/302558.html</wfw:comment><comments>http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/wangajing/comments/commentRss/302558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangajing/services/trackbacks/302558.html</trackback:ping><description><![CDATA[<h2>&nbsp;</h2>
<p>&nbsp; 以下Tip和学习路线从自己身上出发进行总结，仅代表个人观点。你可以留言进行讨论。</p>
<h3>1.有计划的学习</h3>
<h2></h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习是一个循序渐进的过程。如果没有一个计划，学习将变得没有规律，我们也无法提高自己的能力。想起上学的时候，学校每个学期都会制定一个教学大纲来指导老师的教学和我们的学习。是的，如果没有计划，今天突然想学这个，明天突然想学那个，朝三暮四，我们永远也无法学到自己想学的东西。所以我们需要制定一个学习计划。有计划的学习才能提高自己的能力。Java web项目的开发是需要很多知识的积累的，包括Java SE，数据库，JDBC，Linux，Log4j，Html/CSS/Javascript，持久层框架，JUNIT及其他测试框架，IOC框架，web MVC框架等等，如果我们没有一个良好的计划，今天学习Log4j，明天学习Junit，这些东西都不会掌握好并学习好。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果给自己做计划。计划可以按照时间段来进行。例如本年度的工作，本季度要达到的水平，本月要学习的东西，本周学习的计划安排，以及每一天的安排。每天晚上睡觉前，想想今天的计划安排是否完成，明天该学习什么；每周到结束的时候，总结一下本周完成了什么，下周要学习什么。根据自己对计划的实行情况可以改变自己的计划。总之要有计划的学习。可以使用google 日历和 qq mail 邮箱等来管理自己的计划。</p>
<h3>2. 同一段时间只学习一种技术&nbsp;&nbsp; </h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我是一个什么都想学的人。我不想把自己的时间都用在学习Java上，我还想学习C++，还想学习 web 设计，还想学好windows编程，想学Linux编程，想学习计算机网络编程，想学习路由器、网络的配置&#8230;&#8230;。于是，今天看了VC++深入详解，明天学习Linux shell编程。计算机技术包含了太多技术。我们无法一一将他们都掌握。所以不要想什么都学会。至少在一段时间内学习一种技术。我给自己制定了这样的计划，今年要把所有的精力都致力为 java EE 开发技术上。一年后，努力学习C/C++编程。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是的。我们学习的东西可以广一点，但一定要有自己专的方面。学专了一个方面，你就可以接着学习其他的技术。一个什么都会的人，很可能什么都不会；所以，精于一，而博于广。</p>
<h3>3.学会休息</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我们都很忙，上学的时候学好各科，至少不能挂科，然后在课外学习自己喜欢的java 编程；工作的时候，需要做好工作，然后在工作之余多学一些东西；时间长了，我们就可能倦了，累了。所以我们需要学会休息来改变自己的精神状态。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 整天在电脑前进行软件开发的我们，要学会放松自己和休息。作为程序员整天在电脑前，极容易养成工作和休息都离不开电脑的习惯。休息的时候，也是在电脑前看电影，玩游戏。我想，在我们工作累了之后，应该离开电脑，走向户外来放松和休息。或到大街上转转，或到商场里购物，或去游泳馆游泳，或去健身房健身，或和朋友一起打台球。等等等等。总之要学会放松自己，走出户外，不要整天在电脑前。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 以上3点是自己对自己工作学习的总结和提醒，特别写出来和大家一起分享。</p>
<p><br />
</p>
<p>&nbsp;&nbsp;感谢<span style="color: #aaaaaa; font-family: Arial; font-size: 14px; line-height: 21px; "><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.himagic.cn/" target="_blank" style="color: #223355; text-decoration: none; background-color: #f5f5f5; ">HiMagic</a><span style="color: #000000; "><span style="color: #000000; ">!分享自己的观点。值得学习。</span></span></span></p>
<p><span style="font-family: Arial; font-size: 14px; "><a style="color: #223355; text-decoration: none; ">
<table width="100%" class="Framework" cellspacing="0" cellpadding="0" style="background-color: #eeeeee; width: 1161px; ">
    <tbody>
        <tr>
            <td class="MainCell" style="font-family: Arial; font-size: 12px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; background-color: white; vertical-align: top; ">
            <div class="post" style="border-left-color: #cccccc; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 5px; margin-bottom: 28px; font-family: Arial; font-size: 14px; line-height: 21px; ">提高开发技术-&gt;如何学习，这个转换并不完全对等。对于学习来说，最重要的不是计划和过程，而是结果，没有成果的学习等于白费时间。对于提高技术来说，必须要有笑傲江湖唯我独尊的气势，以及持之以恒的定力。
            <div class="postfoot" style="margin-top: 14px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #aaaaaa; font-size: 14px; ">2009-11-17 08:54 |&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.himagic.cn/" target="_blank" style="color: #223355; text-decoration: none; ">HiMagic!</a></div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</a></span></p>
<font  color="#223355" face="Arial" size="4"><span  style="font-size: 14px; ">
<div><font  color="#223355" face="Arial" size="4"><span  style="font-size: 14px;"><br />
</span></font></div>
感谢CoderCream分享自己的观点，没错，执行和结果更加重要！<br />
</span></font>
<div><font  color="#223355" face="Arial" size="4"><span  style="font-size: 14px;"><span  style="color: #000000; "><a style="color: #223355; text-decoration: none; "><br />
<br />
<table width="100%" class="Framework" cellspacing="0" cellpadding="0" style="background-color: #eeeeee; width: 1374px; ">
    <tbody>
        <tr>
            <td class="MainCell" style="font-family: Arial; font-size: 12px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; background-color: white; vertical-align: top; ">
            <div id="main" style="margin-left: 0px; padding-right: 0px; margin-right: 0px; ">
            <div id="AjaxHolder_UpdatePanel1">
            <div id="comments">
            <div class="post" style="border-left-color: #cccccc; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 5px; margin-bottom: 28px; font-family: Arial; font-size: 14px; line-height: 21px; ">
            <h2 style="margin-top: 0px; font-size: 14px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; "><a title="permalink: re: 提高开发技术的Tip" href="http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#302669" style="color: #223355; text-decoration: underline; ">#</a>&nbsp;<a name="302669" style="color: #223355; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a>re: 提高开发技术的Tip<a name="Post" style="color: #223355; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a>&nbsp;&nbsp;<a onclick="return SetReplyAuhor(&quot;CoderDream&quot;)" href="http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#post" style="color: #223355; text-decoration: none; ">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=CoderDream" target="_blank" style="color: #223355; text-decoration: none; ">更多评论</a>&nbsp;<a onclick="return confirm(&quot;Are you sure you want to delete comment 302669?&quot;);" id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')" style="color: #223355; text-decoration: none; ">删除评论</a>&nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">						</span><a id="AjaxHolder_Comments_CommentList_ctl03_EditLink" style="color: #223355; text-decoration: none; "></a></h2>
            计划很重要，是方向；&nbsp;<br />
            执行更重要，否则计划只是一纸空文；&nbsp;<br />
            结果最重要，如果学习（执行）时只是为了完成任务，走过场，自己没有消化/吸收，那就没有意义了！&nbsp;<br />
            <br />
            博主总结的不错，支持一下！
            <div class="postfoot" style="margin-top: 14px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #aaaaaa; font-size: 14px; ">2009-11-17 11:44 |&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="http://www.blogjava.net/coderdream/" target="_blank" style="color: #223355; text-decoration: none; ">CoderDream</a></div>
            </div>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
</a></span></span></font></div>
<div><font  color="#223355" face="Arial" size="4"><span  style="font-size: 14px;"><span  style="color: #000000; "><a style="color: #223355; text-decoration: none; "><span  style="color: #000000; "><a style="color: #223355; text-decoration: none; ">感谢隔离黄莺分享自己的观点。我只是想表达的是在工作之外的那种学习<br />
<table width="100%" class="Framework" cellspacing="0" cellpadding="0" style="background-color: #eeeeee; width: 1374px; ">
    <tbody>
        <tr>
            <td class="MainCell" style="font-family: Arial; font-size: 12px; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; background-color: white; vertical-align: top; ">
            <div id="main" style="margin-left: 0px; padding-right: 0px; margin-right: 0px; ">
            <div id="AjaxHolder_UpdatePanel1">
            <div id="comments">
            <div class="post" style="border-left-color: #cccccc; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 5px; margin-bottom: 28px; font-family: Arial; font-size: 14px; line-height: 21px; ">
            <h2 style="margin-top: 0px; font-size: 14px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; "><br />
            </h2>
            <h2 style="margin-top: 0px; font-size: 14px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; "><a title="permalink: re: 提高开发技术的Tip" href="http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#302655" style="color: #223355; text-decoration: none; ">#</a>&nbsp;<a name="302655" style="color: #223355; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a>re: 提高开发技术的Tip&nbsp;&nbsp;<a onclick="return SetReplyAuhor(&quot;隔叶黄莺&quot;)" href="http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#post" style="color: #223355; text-decoration: none; ">回复</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.blogjava.net/comment?author=%e9%9a%94%e5%8f%b6%e9%bb%84%e8%8e%ba" target="_blank" style="color: #223355; text-decoration: none; ">更多评论</a>&nbsp;<a onclick="return confirm(&quot;Are you sure you want to delete comment 302655?&quot;);" id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')" style="color: #223355; text-decoration: none; ">删除评论</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_EditLink" style="color: #223355; text-decoration: none; "></a></h2>
            楼主所说的只是为学习而学习制定计划，为工作而学习可不一样，比如项目中涉及到了 Linux Shell，涉及了 Perl 或更多的东西，你想要快速的上手的话就得一起学。
            <div class="postfoot" style="margin-top: 14px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #aaaaaa; font-size: 14px; ">2009-11-17 11:05 |&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="http://www.blogjava.net/Unmi/" target="_blank" style="color: #223355; text-decoration: none; ">隔叶黄莺</a></div>
            </div>
            </div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</a></span></a></span></span></font></div>
<img src ="http://www.blogjava.net/wangajing/aggbug/302558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangajing/" target="_blank">追求无止境</a> 2009-11-16 15:11 <a href="http://www.blogjava.net/wangajing/archive/2009/11/16/302558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>