??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲日韩在线三区,亚洲欧洲AV无码专区,亚洲精品亚洲人成在线观看麻豆 http://www.tkk7.com/wangajing/archive/2009/12/31/307899.htmlq求无止?/dc:creator>q求无止?/author>Thu, 31 Dec 2009 04:55:00 GMThttp://www.tkk7.com/wangajing/archive/2009/12/31/307899.htmlhttp://www.tkk7.com/wangajing/comments/307899.htmlhttp://www.tkk7.com/wangajing/archive/2009/12/31/307899.html#Feedback0http://www.tkk7.com/wangajing/comments/commentRss/307899.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/307899.html       2009q?2?1日,站在2009q的ַ上,不禁感到旉飞逝?009q_匆匆而过。在q去?009q_收获何多Q失M多?009q_Ҏ来说Q是一个重要的转折炏V渐渐的发现自己应该长大了,也发现自q实长大了Q更发现自己实际上还是需要l长大?/p>

      每年的这个时候,各个新闻媒体都会评出什么十大之cȝQ我也落一会俗Q当然自己本w就很俗Q,来看看今q发生在我n上的几大事gQ?/p>

先大体罗列一下吧Q?/p>

  1. 订婚
  2. q京
  3. 工作
  4. 毕业
  5. ȝ
  6. 买笔记本

     从时间跨度上来说Q?1月到2月在家过q_2月和3月在青岛某公司实习,4月和5月在北京某公司实习,6月在中国xa大学享受毕业之前的时光,7月到8月l在北京某公司实习,9月到12月在上学+实习?009q最q福的事情发生在1?月,快也有不快Q最q_的日子在2月和3月,C4月和5月或许是我最U结的日子吧Q?月或许是最快乐的日子的吧;7月和8月让我体会到了工作的滋味Q?月到12月,整天在公怸学校之间奔跑Q知道了工作+上课两者要做到兼顾的滋呻I虽然q没有做到兼?/p>

     2009q大体经历如此?009q对我最大的关键字或许就是“改变”,q一q我订婚了,在这一点上Q改变了我的准非单n状态;在这一q_我实习了Q而且大量的时间都在于此,改变了我仅仅是学生的状态;在这一q_我毕业了Q我d了生zd习四q的中国xa大学Q离开了让我毕生难忘的日子Q在q一q_我来北京了,从对北京的一无所知,到开始的彷LQ然后渐渐熟悉和适应Q在q一q_我的l济渐渐独立Q尽每个月只有不到1000的收入,但能满的我的基本需求;在这一q_我买了笔记本Q虽然对其他人来_q不是一件特别的事,Ҏ来说Q因采用了分期付ƾ,而用接下来一q中q半个月的工资来q,但我不觉得后悔,在这个过E中Q我的经观念和理胦观念开始渐渐改变;在这一q_工作成了我的核心Q工作教会我很多东西Q在与h交流、在工作态度、在技术上Q都有一定的提高?/p>

     回忆2009q_收获颇多Q也失去不少。但日子L向前的,有得必有失。希望在以后?009q_自己能够渐渐提高自己的能力。无论是在生zMQ在工作上,q是在心理上?/p>

 

    2009q?0大大事:

       与老婆订婚Q?/p>

       2009q_



]]>
Spring web MVC 框架学习W记 ?ViewResolver技?/title><link>http://www.tkk7.com/wangajing/archive/2009/11/27/303880.html</link><dc:creator>q求无止?/dc:creator><author>q求无止?/author><pubDate>Fri, 27 Nov 2009 04:11:00 GMT</pubDate><guid>http://www.tkk7.com/wangajing/archive/2009/11/27/303880.html</guid><wfw:comment>http://www.tkk7.com/wangajing/comments/303880.html</wfw:comment><comments>http://www.tkk7.com/wangajing/archive/2009/11/27/303880.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/wangajing/comments/commentRss/303880.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/wangajing/services/trackbacks/303880.html</trackback:ping><description><![CDATA[<p>上次的文章中介绍了ModelAndView对象中的view对象Q可以用字W串来让Spring框架q行解析获得适合的视图。而解析View的就是ViewResolver技术?/p> <p>ViewResolver的定义如下:</p> <pre class="csharpcode"><span id="ltnnrnx" class="kwrd">public</span> <span id="hfvznfv" class="kwrd">interface</span> ViewResolver {<br /> View resolveViewName(String viewName, Locale locale) throws Exception;<br /> }</pre> <pre class="csharpcode"> </pre> <pre class="csharpcode">在[spring-dispatcher-name]-servlet.xml中,可以定义viewResolverQ?/pre> <p><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><br />         <property name="prefix" value="/jsp/"/><br />         <property name="suffix" value=".jsp"/><br />     </bean> </p> <p><font face="Consolas" size="3">来让DispacherServletq行加蝲默认的viewResolverQ如果没有设|viewResolverQspring使用InternalResourceViewResolverq行解析?/font></p> <p><font face="Consolas" size="3">Spring实现ViewResolver的非抽象cM我们l常使用的viewResolver有以下四U:</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">逻辑视图名字解析Z个\?/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一P只不q定义的view-bean都在一个properties文g中,用这个类q行加蝲q个properties文g</td> </tr> <tr> <td valign="top" width="350">XmlViewResolver</td> <td valign="top" width="350">和ResourceBundleResolver一P只不q定义的view-bean在一个xml文g中,用这个类来加载xml文g</td> </tr> </tbody> </table> <p> </p> <p>使用多视图解析器Q?/p> <p>我们不想只用一U视图解析器的话Q可以在[spring-dispatcher-name]-servlet.xml定义多个viewResolverQ?/p> <div class="zvbflvf" id="codeSnippetWrapper"> <pre id="codeSnippet" class="csharpcode"><bean id=<span id="txjflrp" class="str">"viewResolver"</span> <span id="blxzjhh" class="kwrd">class</span>=<span id="rtnhrxx" class="str">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>><br /> <property name=<span id="rlfpvfd" class="str">"prefix"</span> value=<span id="pjptflr" class="str">"/jsp/"</span>/><br /> <property name=<span id="nhrvxdl" class="str">"suffix"</span> value=<span id="fxblxvb" class="str">".jsp"</span>/><br /> </bean><br /> <br /> <bean id=”beanNameViewResolver” <span id="hjlfrnl" class="kwrd">class</span>=”...BeanNameViewResolver”><br /> <property name=<span id="rbdxbzx" class="str">"order"</span> value=<span id="xxjvxvt" class="str">"1"</span>></property><br /> </bean><br /> <br /> <bean id=”beanNameViewResolver” <span id="bdprjrx" class="kwrd">class</span>=”...XmlViewResolver”><br /> <property name=<span id="ttnjtrp" class="str">"order"</span> value=<span id="nhjbxll" class="str">"0"</span>></property><br /> </bean></pre> <br /> </div> <p>DispatcherServlet会加载所有的viewResolverC个list中,q按照优先q行解析。注意order中的D,优先U越高。而id为viewResolver</p> <p>的viewResolver的优先是最低的?/p> <img src ="http://www.tkk7.com/wangajing/aggbug/303880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wangajing/" target="_blank">q求无止?/a> 2009-11-27 12:11 <a href="http://www.tkk7.com/wangajing/archive/2009/11/27/303880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC框架学习W记 ?View技?/title><link>http://www.tkk7.com/wangajing/archive/2009/11/26/303759.html</link><dc:creator>q求无止?/dc:creator><author>q求无止?/author><pubDate>Thu, 26 Nov 2009 05:25:00 GMT</pubDate><guid>http://www.tkk7.com/wangajing/archive/2009/11/26/303759.html</guid><wfw:comment>http://www.tkk7.com/wangajing/comments/303759.html</wfw:comment><comments>http://www.tkk7.com/wangajing/archive/2009/11/26/303759.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/wangajing/comments/commentRss/303759.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/wangajing/services/trackbacks/303759.html</trackback:ping><description><![CDATA[<p>以前Q我们详l介l了Spring的Controller技术。Spring的面向接口编E,使Controller的实现多U多栗View技术也一栗今天的分析先从在Controller中的ModelAndView开始?/p> <div><pre class="csharpcode"><span id="dfrtlbh" class="kwrd">public</span> <span id="dfjlpnt" class="kwrd">class</span> ModelAndView { <span id="vxjtfnl" class="kwrd">private</span> Object view; <span id="hztlfvl" class="rem">//View实例或者view的字W串 </span> <span id="tdhjlhh" class="rem">/** Model Map */</span> <span id="dxztvlj" class="kwrd">private</span> ModelMap model; <span id="fzbtfvj" class="rem">//model</span> <span id="jblphpv" class="rem">/* * Convenient constructor when there is no model data to expose. * Can also be used in conjunction with <code>addObject</code>. </span> <span id="zjdnpxl" class="rem"> * @param view View object to render </span> <span id="bvhzbrh" class="rem"> * @see #addObject */</span> <span id="jvhjdjr" class="kwrd">public</span> ModelAndView(View view) { <span id="jtdpzxv" class="kwrd">this</span>.view = view; } <span id="fhlvhfv" class="kwrd">public</span> ModelAndView(String viewName){ <span id="vxpbdbr" 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> </pre></div> <div>可以看到view实例可以指向一个View对象或者字W串。现在先看看View接口Q?/div><pre class="csharpcode"><span id="vxprvjp" class="kwrd">public</span> <span id="ptlnjfn" class="kwrd">interface</span> View { <span id="xjtfpvd" class="rem">/**</span> <span id="fzbdpdr" class="rem"> * Return the content type of the view, if predetermined.</span> <span id="bvnpjzr" class="rem"> * <p>Can be used to check the content type upfront,</span> <span id="frlvxnl" class="rem"> * before the actual rendering process.</span> <span id="ztlnhpn" class="rem"> * @return the content type String (optionally including a character set),</span> <span id="nptdhfl" class="rem"> * or <code>null</code> if not predetermined.</span> <span id="tdxrltr" class="rem"> */</span> String getContentType(); <span id="zjvpbzx" class="rem">/**</span> <span id="rlprbph" class="rem"> * l制视图</span></pre><pre class="csharpcode"><span id="jdxhtrx" class="rem"></span><span id="prdprrh" class="rem"> * l制视图的第一步是准备h: 如果是JSP的视图技?/span></pre><pre class="csharpcode"><span id="zrdfhnl" class="rem"></span><span id="drbvzfl" class="rem"> * 首先会把model设ؓrequest的属性?/span></pre><pre class="csharpcode"><span id="lfxjlbp" class="rem"></span><span id="rrvxhfv" class="rem"> * W二步则是真正的l制视图</span></pre><pre class="csharpcode"><span id="pjdpjpn" class="rem"> * @param model Map with name Strings as keys and corresponding model</span> <span id="dxjbnvj" class="rem"> * objects as values (Map can also be <code>null</code> in case of empty model)</span> <span id="xhdfzvd" class="rem"> * @param request current HTTP request</span> <span id="tvfzlbz" class="rem"> * @param response HTTP response we are building</span> <span id="dxjdnlb" class="rem"> * @throws Exception if rendering failed</span> <span id="rvfhjpf" class="rem"> */</span> <span id="rtlpzzf" class="kwrd">void</span> render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; } 在这之后Q我们再来看看View的实现承类图,可以看到Spring支持多种cd视图Q?/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"> </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一PView的第一个实C是AbstractView。所以先让我们看看AbstractView对render函数的实玎ͼ</div> <p>  <div class="blvxrpf" id="codeSnippetWrapper"><pre id="codeSnippet" class="csharpcode"><span id="bjvnrxn" class="kwrd">public</span> <span id="zjtprxx" class="kwrd">void</span> render(Map model, HttpServletRequest request, HttpServletResponse response) <span id="llphdbh" class="kwrd">throws</span> Exception {<br> <span id="fhrdvlb" class="kwrd">if</span> (logger.isTraceEnabled()) {<br> logger.trace(<span id="xrvfppv" class="str">"Rendering view with name '"</span> + <span id="jnfjtrp" class="kwrd">this</span>.beanName + <span id="rtdnhfn" class="str">"' with model "</span> + model +<br> <span id="vprtvtj" class="str">" and static attributes "</span> + <span id="frtnznv" class="kwrd">this</span>.staticAttributes);<br> } <br><br> <span id="jvnrjzx" class="rem">// Consolidate static and dynamic model attributes.</span><br> Map mergedModel = <span id="jjnxrzx" class="kwrd">new</span> HashMap(<span id="fpjvxtj" class="kwrd">this</span>.staticAttributes.size() + (model != null ? model.size() : 0));<br> mergedModel.putAll(<span id="xhtdfvv" class="kwrd">this</span>.staticAttributes);<br> <span id="dppbltb" class="kwrd">if</span> (model != null) {<br> mergedModel.putAll(model);<br> } <br><br> <span id="hrbvzfd" class="rem">// Expose RequestContext?</span><br> <span id="fpptllz" class="kwrd">if</span> (<span id="xfztndd" class="kwrd">this</span>.requestContextAttribute != null) {<br> mergedModel.put(<span id="pbdfpxv" 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>W一步,静态属性和model的属性都d到mergedModel里面。如果需要请求上下文Q则请求上下文d到model中?/p> <p>静态属性是l承AbstractViewq行讄的属性。而请求上下文如果讄的名字就会创Z个request上下文。在requestContext中定义了一些包括本地化和主题的处理工具?/p> <p>W二步,对响应进行预处理。最后调用子c需要实现的函数renderMergedOutputModel?/p> <p>对PDF和EXCEL格式我们暂且不管Q且Spring支持多种视图技术,q里我们主要xJSTL技术,</p> <p>接着我们来看<b>AbstractUrlBasedView</b> cR在<b>AbstractUrlBasedView</b> 只定义了一个url属性。别的没有什么特D处理?/p> <p>接着l承<b>AbstractUrlBasedView</b> 的是<b>InternalResourceView</b>。他对renderMergedOutputModelq行实现Q实现如?</p> <div><pre class="csharpcode"><span id="pztnhdd" class="rem">/**</span><br><span id="pptvpxd" class="rem"> * Render the internal resource given the specified model.</span><br><span id="hrlpzxd" class="rem"> * This includes setting the model as request attributes.</span><br><span id="lxzblbr" class="rem"> */</span><br> <span id="jtdfrpn" class="kwrd">protected</span> <span id="tvzjfdb" class="kwrd">void</span> renderMergedOutputModel(<br> Map model, HttpServletRequest request, HttpServletResponse response) <span id="pzlnrpd" class="kwrd">throws</span> Exception {<br><br> <span id="vztlflj" class="rem">// 获取要暴露的requestQ一般都是传入的参数request</span><br> HttpServletRequest requestToExpose = getRequestToExpose(request);<br><br> <span id="nvhtdjr" class="rem">// model的数据添加到request属性中</span></pre></div> <div><pre class="csharpcode"><span id="fprvxnj" class="rem"></span> exposeModelAsRequestAttributes(model, requestToExpose);<br><br> <span id="fzlvxvn" class="rem">// 讄helperQ如果存在的?/span><br> exposeHelpers(requestToExpose);<br><br> <span id="zbtfpnv" class="rem">// 对绘制进行预处理Q从而获得到要分发的url</span><br> String dispatcherPath = prepareForRendering(requestToExpose, response);<br><br> <span id="jdvzbzp" class="rem">// 获取h分发对象</span><br> RequestDispatcher rd = requestToExpose.getRequestDispatcher(dispatcherPath);<br> <span id="zhbfpnl" class="kwrd">if</span> (rd == null) {<br> <span id="rttnrhb" class="kwrd">throw</span> <span id="rlnpbzh" class="kwrd">new</span> ServletException(<br> <span id="pldhrpv" class="str">"Could not get RequestDispatcher for ["</span> + getUrl() + <span id="jlnxbrx" class="str">"]: check that this file exists within your WAR"</span>);<br> }<br><br> <span id="ldnxjrp" class="rem">// 军_使用RequestDispatcher的includeҎq是forwardҎ</span><br> <span id="jtvrthn" class="kwrd">if</span> (useInclude(requestToExpose, response)) {<br> response.setContentType(getContentType());<br> <span id="fprdxdl" class="kwrd">if</span> (logger.isDebugEnabled()) {<br> logger.debug(<span id="blxbdbj" class="str">"Including resource ["</span> + getUrl() + <span id="bnxjlrp" class="str">"] in InternalResourceView '"</span> + getBeanName() + <span id="nfhrdbh" class="str">"'"</span>);<br> }<br> rd.include(requestToExpose, response);<br> }<br><br> <span id="xhbnfnl" class="kwrd">else</span> {<br> <span id="jtvhtzh" class="rem">// Note: The forwarded resource is supposed to determine the content type itself.</span><br> exposeForwardRequestAttributes(requestToExpose);<br> <span id="hrdnppv" class="kwrd">if</span> (logger.isDebugEnabled()) {<br> logger.debug(<span id="pjbfxfv" class="str">"Forwarding to resource ["</span> + getUrl() + <span id="zrvfppv" class="str">"] in InternalResourceView '"</span> + getBeanName() + <span id="bldhrhv" class="str">"'"</span>);<br> }<br> rd.forward(requestToExpose, response);<br> }<br> }</pre></div> <div>可以看到<b>InternalResourceView对请求进行了转发。{发到url上。最后我们看看JSTLView的实玎ͼ</b></div> <div><strong></strong><br> </div><pre class="csharpcode"><span id="nxrlfnt" class="kwrd">public</span> <span id="pjbdhxd" class="kwrd">class</span> JstlView extends InternalResourceView { <span id="fhzlfdb" class="kwrd">private</span> MessageSource messageSource; <span id="lvxrlbh" class="kwrd">public</span> JstlView() { } <span id="zrlfrxd" class="kwrd">public</span> JstlView(String url) { super(url); } <span id="zzddxfl" class="kwrd">public</span> JstlView(String url, MessageSource messageSource) { <span id="vdfhlzz" class="kwrd">this</span>(url); <span id="tvhbndb" class="kwrd">this</span>.messageSource = messageSource; } <span id="zzdnxxl" class="kwrd">protected</span> <span id="bdpjnxj" class="kwrd">void</span> initServletContext(ServletContext servletContext) { <span id="tvnzdbj" class="kwrd">if</span> (<span id="htdfrzp" class="kwrd">this</span>.messageSource != <span id="lxzlvlr" class="kwrd">null</span>) { <span id="bdrtdbt" class="kwrd">this</span>.messageSource = JstlUtils.getJstlAwareMessageSource(servletContext, <span id="jjlprff" class="kwrd">this</span>.messageSource); } super.initServletContext(servletContext); } <span id="lvfhjhf" class="kwrd">protected</span> <span id="lvxhjjh" class="kwrd">void</span> exposeHelpers(HttpServletRequest request) throws Exception { <span id="ppbnxdb" class="kwrd">if</span> (<span id="hztxpfd" class="kwrd">this</span>.messageSource != <span id="bdnpjpn" class="kwrd">null</span>) { JstlUtils.exposeLocalizationContext(request, <span id="pjlvhpl" class="kwrd">this</span>.messageSource); } <span id="vvzrvtz" class="kwrd">else</span> { JstlUtils.exposeLocalizationContext(<span id="zrlfrxl" 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> </p> <p><b>在InternalResourceView  中,基本上所有的处理都差不多了。在JSTLView对两个方法进行了覆盖。第一个initServletContextQ主要初始化了MessageResource</b></p> <p><strong>W二个exposeHelpersmessageSource攑֜了request里面?/strong></p> <p><strong>q样view的解析就l束了。接下来容器对jspq行解析Qƈq行tag{的处理。然后将生成的页面返回给客户端?/strong></p><img src ="http://www.tkk7.com/wangajing/aggbug/303759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wangajing/" target="_blank">q求无止?/a> 2009-11-26 13:25 <a href="http://www.tkk7.com/wangajing/archive/2009/11/26/303759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringMVC web框架学习 Controller 分析http://www.tkk7.com/wangajing/archive/2009/11/26/303714.htmlq求无止?/dc:creator>q求无止?/author>Thu, 26 Nov 2009 01:35:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/26/303714.htmlhttp://www.tkk7.com/wangajing/comments/303714.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/26/303714.html#Feedback0http://www.tkk7.com/wangajing/comments/commentRss/303714.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/303714.htmlorg.springframework.web.servlet.mvc.AbstractController (implements org.springframework.web.servlet.mvc.Controller)

Spring MVC框架中的Controller对请求进行处理:所有的Controller都实现接口ControllerQ?/p>

public interface Controller { 

    /**
     * Process the request and return a ModelAndView object which the DispatcherServlet
     * will render. A <code>null</code> return value is not an error: It indicates that
     * this object completed request processing itself, thus there is no ModelAndView
     * to render.
     * @param request current HTTP request
     * @param response current HTTP response
     * @return a ModelAndView to render, or <code>null</code> if handled directly
     * @throws Exception in case of errors
     */
    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; 

}
上面的doc表明Controllerq回的modelandview可以使空Q表明请求都是该函数中处理完成了Q不需要modeland来进行渲染?/pre>
 
在l之前先介绍一个有用的工具c:WebUtils。用q个可以化sessionQrequest的处理。具体的内容可以参考文档?/pre>
 
Controller的第一个实现是QAbstractController。他是一个Abstractc,除了实现了Controller接口Q它q承了WebContentGenerator?/pre>
 
WebContentGenerator的作用是什么?参考文档可以发玎ͼ该类主要对Cache和Sessionq行理?/pre>
 
cacheSeconds 指定内容~存的时_默认?
requireSession 是否需要会话,默认支持
supportedMethods 支持的方法,默认是GET\post\Head
useCacheControlHeader 指定是否使用http1.1的cache控制头信息,默认使用
useCacheControlNoStore 指定是否讄http1.1的cache控制头信息ؓno-store。默认?/td>
useExpiresHeader 指定是否使用http1.0的expire头信息。默认?/td>
用户可以对这些参数进行测?cache和expire信息涉及Chttp协议信息Q更多信息可以参考http协议文档。这里不再说明?/pre>
 
再看AbstractController的代码:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {

// Delegate to WebContentGenerator for checking and preparing.
checkAndPrepare(request, response, this instanceof LastModified);

// Execute handleRequestInternal in synchronized block if required.
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
return handleRequestInternal(request, response);
}
}
}
return handleRequestInternal(request, response);
}
checkandPrepare的目的就是用用于进行的配置来对requestq行预处理和准备?/pre>
他会查支持的ҎQ和会话Q然后应用cache讄?/pre>
如果需要session同步Q就q行同步处理。session同步应用于有session的情况下。如果没有sessionQsession同步是没有用的?/pre>
AbstractController会调用handleRequestInternalҎq行处理Q承AbstractController的类需要实现该Ҏ?br>
下面我们再看?b>AbstractUrlViewController 的代码实现和文档Q先看handleRequestInternal的实玎ͼ

 
/**
* Retrieves the URL path to use for lookup and delegates to
* {@link #getViewNameForRequest}.
*/
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
String viewName = getViewNameForRequest(request);
if (logger.isDebugEnabled()) {
logger.debug("Returning view name '" + viewName + "' for lookup path [" + lookupPath + "]");
}
return new ModelAndView(viewName);
}

可以看到Q它使用了getViewNameForRequest获取需要的viewName。而getViewNameForRequest是一个抽象函敎ͼ需要子cd现。lookupPath是我们h的URL中的一部分。如我们使用UrlFilenameViewController来进行如下的配置Q?/b>
<bean name="/index.do" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"></bean>?/div>
09-11-25 11:56:06 - DEBUG [http-8200-1] - Returning view name 'index' for lookup path [/index.do]
该Controller?index.do解析成indexQ然后再通过viewResolver对indexq行扩展?jsp/index.jsp。从而找到该面?/div>
可以看到q个cȝ主要是用于对urlq行解析Q然后{到合适的面上,而在转到q个面之前不需要进行特别的处理?/div>
明白了该cȝ作用自然也就知道了UrlFilenameViewController的作用。这里不再进行详l分析?/div>
 
 


]]>Spring MVC 框架学习之AbstractFormController以及AbstractFormControllhttp://www.tkk7.com/wangajing/archive/2009/11/25/303665.htmlq求无止?/dc:creator>q求无止?/author>Wed, 25 Nov 2009 09:31:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/25/303665.htmlhttp://www.tkk7.com/wangajing/comments/303665.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/25/303665.html#Feedback0http://www.tkk7.com/wangajing/comments/commentRss/303665.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/303665.html在看完BaseCommandController和AbstractCommandController之后Q我们再看BaseCommandController的另一个实现AbstractFormControllerQ以及AbstractFormController的具体实现SimpleFormController?/p>

先看看AbstractFormController对handleRequestInternal的实玎ͼ

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Form submission or new form to show?
if (isFormSubmission(request)) {
// Fetch form object from HTTP session, bind, validate, process submission.
try {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = new BindException(binder.getBindingResult());
return processFormSubmission(request, response, command, errors);
}
catch (HttpSessionRequiredException ex) {
// Cannot submit a session form if no form object is in the session.
if (logger.isDebugEnabled()) {
logger.debug("Invalid submit detected: " + ex.getMessage());
}
return handleInvalidSubmit(request, response);
}
}
else {
// New form to show: render form view.
return showNewForm(request, response);
}
}
q个ҎQ首先判断是不是Form提交Q判断方法是Q?/pre>
protected boolean isFormSubmission(HttpServletRequest request) {
return "POST".equals(request.getMethod());
}
如果是form提交的话Q系l首先创Z个CommandQ然后对数据q行l定和验证,之后调用processFormSubmissionҎ。showNewForm则调用showForm?/div>
在AbstractFormController中里面有两个抽象ҎQ?/div>

protected abstract ModelAndView processFormSubmission(
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception;
protected abstract ModelAndView showForm(
HttpServletRequest request, HttpServletResponse response, BindException errors)
throws Exception;



 

 

好了Q看完AbstractFormController之后Q再看看SimpleFormController是如何实玎ͼ

protected ModelAndView processFormSubmission(
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {

if (errors.hasErrors()) {
if (logger.isDebugEnabled()) {
logger.debug("Data binding errors: " + errors.getErrorCount());
}
return showForm(request, response, errors);
}
else if (isFormChangeRequest(request, command)) {
logger.debug("Detected form change request -> routing request to onFormChange");
onFormChange(request, response, command, errors);
return showForm(request, response, errors);
}
else {
logger.debug("No errors -> processing submit");
return onSubmit(request, response, command, errors);
}
}
在上面的Ҏ中,如果有错误,调用showFormQ来昄form。没有错误的话,则调用onSubmitҎ?br />
protected final ModelAndView showForm(
HttpServletRequest request, BindException errors, String viewName, Map controlModel)
throws Exception {

// In session form mode, re-expose form object as HTTP session attribute.
// Re-binding is necessary for proper state handling in a cluster,
// to notify other nodes of changes in the form object.
if (isSessionForm()) {
String formAttrName = getFormSessionAttributeName(request);
if (logger.isDebugEnabled()) {
logger.debug("Setting form session attribute [" + formAttrName + "] to: " + errors.getTarget());
}
request.getSession().setAttribute(formAttrName, errors.getTarget());
}

// Fetch errors model as starting point, containing form object under
// "commandName", and corresponding Errors instance under internal key.
Map model = errors.getModel();

// Merge reference data into model, if any.
Map referenceData = referenceData(request, errors.getTarget(), errors);
if (referenceData != null) {
model.putAll(referenceData);
}

// Merge control attributes into model, if any.
if (controlModel != null) {
model.putAll(controlModel);
}

// Trigger rendering of the specified view, using the final model.
return new ModelAndView(viewName, model);
}
在showForm中,讄属性,攑֜model中,然后在viewNameq行讄?/div>
FormController是上面的过E。具体的执行q程和详l信息会在以后的博客中具体介l?br />



]]>Spring MVC 框架学习W记之BaseCommandController和AbstractCommandControllerhttp://www.tkk7.com/wangajing/archive/2009/11/25/303652.htmlq求无止?/dc:creator>q求无止?/author>Wed, 25 Nov 2009 08:25:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/25/303652.htmlhttp://www.tkk7.com/wangajing/comments/303652.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/25/303652.html#Feedback0http://www.tkk7.com/wangajing/comments/commentRss/303652.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/303652.html 

Spring的BaseCommandControllerl承自AbstractController。在看BaseCommandController之前先看他的l承cAbstractCommandController是如何实?/p>

AbstractController的handleInternalRequestҎ的:

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = new BindException(binder.getBindingResult());
return handle(request, response, command, errors);
}

getCommand是BaseCommandController中的Ҏ?/p>

protected Object getCommand(HttpServletRequest request) throws Exception {
return createCommand();
}
protected final Object createCommand() throws Exception {
if (this.commandClass == null) {
throw new IllegalStateException("Cannot create command without commandClass being set - " +
"either set commandClass or (in a form controller) override formBackingObject");
}
if (logger.isDebugEnabled()) {
logger.debug("Creating new command of class [" + this.commandClass.getName() + "]");
}
return BeanUtils.instantiateClass(this.commandClass);
}

createCommand创徏了一个CommandClass的对象?/p>

然后再看bindAndValidateҎQ?/p>

protected final ServletRequestDataBinder bindAndValidate(HttpServletRequest request, Object command)
throws Exception {
ServletRequestDataBinder binder = createBinder(request, command);
BindException errors = new BindException(binder.getBindingResult());
if (!suppressBinding(request)) {
binder.bind(request);
onBind(request, command, errors);
if (this.validators != null && isValidateOnBinding() && !suppressValidation(request, command, errors)) {
for (int i = 0; i < this.validators.length; i++) {
ValidationUtils.invokeValidator(this.validators[i], command, errors);
}
}
onBindAndValidate(request, command, errors);
}
return binder;
}

q个Ҏ首先创徏? DataBinder对象Q然后,获取创徏l定对象时发生的错误。报错在errors。接下来l定对象Q调用onBind处理l定事gQ接下来应用Validator。然后调用onBindAndValidate来处理绑定和验证事g。最后返回binder?/p>

处理完之后调用handleҎq行处理?/p>

lg所qͼAbstractCommandControllerh两个功能:

1、将h参数转换为Command对象。在该Controller中,我们讄一个object对象。然后BaseCommandController请求的参数q行转换。如果请求参数有value|׃调用object的的setValue对象来设|对象里的倹{如果请求参C有address.city.׃调用object中getAddress().setCity()Ҏ来赋倹{这个object可以是Q意的objectQ唯一的要求就是这个objectcL有参数?/p>

2、对数据q行验证。在转换和验证时发生错误Ӟ需要在handle(request, response, command, errors)中进行处理?/p>

]]>
Spring的MVC web框架学习W记http://www.tkk7.com/wangajing/archive/2009/11/25/303590.htmlq求无止?/dc:creator>q求无止?/author>Wed, 25 Nov 2009 03:09:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/25/303590.htmlhttp://www.tkk7.com/wangajing/comments/303590.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/25/303590.html#Feedback2http://www.tkk7.com/wangajing/comments/commentRss/303590.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/303590.html1、Spring web 框架的核心:DispatcherServlet

DispatcherServlet 用于接收h。是使用Spring框架的入口。在web.xml中,需要配|该servlet。在配置该Servlet的时候url-pattern你可以用你自己想用的形式Q如*.aspx,*.do,*.htm,*.actionQ用以؜淆客LҎ务器架构的认识?/p>

另外Q该Servlet在容器中q会加蝲一个APPlicationContext的xml文g。默认加载的是[servlet-name]-servlet.xml。例如,你在web.xml中配|的servlet如下Q?/p>

<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
该Servlet׃在服务器启动Ӟ加蝲example-servlet.xml。当Ӟ你也可以自己来指定加载文件?/pre>
要看看DispatcherServlet真面目,打开源文Ӟ发现定义了很多BeanName的常量,如本地化解析器beannameQ主题解析器beannameQ视图解析器beannameQ上传文件解析的multipart解析器beanname?/pre>
{:
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
public static final String LOCALE_RESOLVER_BEAN_NAME = "localeResolver";
public static final String THEME_RESOLVER_BEAN_NAME = "themeResolver";
public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = "handlerExceptionResolver";
public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";
public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
q个cL么使用q些bean呢?以上面的exexample-servlet.xmlZQ我们定义的名字为example的DispatcherServlet使用example-servlet.xml的配|。在example-servlet.xml里,我们可以配置名字上面的beanName的beanQ来让servlet加蝲q些bean?/pre>
q下明白了,servlet.xml该怎么配置Q该配置什么了?/pre>
好了Q看完了最重要的servlet的配|问题,我们再看下一个重要的接口:Controller。至于上面servlet要用的什么什么解析器啦,我们E后在分析?/pre>
 
2、Controller
我们的请求提交到DispacherServlet后,会{lController。怎么找ControllerQ通过使用handlerMapping。如果没有设|handlerMappingQspring使用默认的BeanNameUrlHandlerMapping来找Controller?/pre>
BeanNameUrlHandlerMappingQ顾名思义Q就是通过bean的name属性来映射controller。bean的nameh是一个urlQ如果请求的是logout.doQ在example-servlet.xml中定义一个名字(nameQؓlogin.do的Controller.

<bean name="/logout.do" class="com.jy.bookshop.web.spring.LogoutController">
    </bean>

再插一句话Q在handlerMapping中,我们可以使用h拦截器来对请求进行拦截处理。该拦截器怎么使用q里暂且不表Q有Z再讨论?/p>

okQ现在我们创Z个LogoutController来让他处理请求,让他实现Controller吧:

public class LogOutController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest req,
            HttpServletResponse res) throws Exception {
          ?
        return new ModelAndView(new RedirectView("login.do"));
    }
}
看看q个Controller接口的定义,发现q个接口只定义了一个handleRequestҎ。在q个Ҏ中,q回一个ModelAndView?/pre>
先说ModelAndView。我们知道MVCQ那么ModelAndView是 MV了。Controller是C。这样MVC全了。呵c?/pre>
l箋说ModelAndViewQ要了解他的l构Q那自然要看看他的源代码了:
/** View instance or view name String */
private Object view; 

/** Model Map */
private ModelMap model;

   

    只关注我们关注的Q里面包含了一个View对象和model对象。model对象是一个MapQ这里不再说了。关键看看viewQ奇怪,怎么是一个ObjectQ太抽象了。再l箋看源代码的话Q会更加明白Q?/p>

 

public ModelAndView(String viewName, String modelName, Object modelObject) {
        this.view = viewName;
        addObject(modelName, modelObject);
    }
public void setViewName(String viewName) {
        this.view = viewName;
    }

原来q个view可以指向一个View对象Q也可以指向String对象啊。View一个接口,如果看doc的话Q他的实现类有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, XsltViewQ诚实的_q些View是拷doc的)?/p>

现在可以知道Q我们的Controllerq回一个View和ModelQ来让Spring框架来创Z个回应?/p>

现在奇怪的q有一点,我吧view讄为字W串QSpring框架怎么处理Q在ModelAndView中,如果view是一个字W串Q则会将q个glDispatcherServlet的viewResovler来处理。记得上面提到的viewResovler了吗Q呵呵,z上用场了?/p>

view的问题解决了Q然后再说model吧。在ModelAndViewd了一些对象,Spring是怎么处理的呢Qd该把q些对象l弄到request对象里,让jsp面来用吧。让View使用Q那么看看View接口吧:

public interface View {

    String getContentType();

    void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;

}
render函数需要带一个model变量。再找找view的实现类Q看看是怎么工作的。不qview有那么多Q对于一些像什么pdf啦,excel了他们都不需要在request中添加这个model?/pre>
最l呢Q我们在jstlView的父cInternalResourceView中的renderMergedOutputModel函数发现他把model攑֜了request里面了?/pre>
 
OKQ现在我们明白了Qcontrollerq回的modelandview交给Servletq行处理Q来生成一个页面?/pre>
最单的Controller介绍完毕。现在看看Spring提供的一些controller的实玎ͼSpring提供了很多controller的实玎ͼl承的结构如下:

 

org.springframework.web.servlet.mvc.AbstractController (implements org.springframework.web.servlet.mvc.Controller)

  • org.springframework.web.servlet.mvc.AbstractUrlViewController
    • org.springframework.web.servlet.mvc.UrlFilenameViewController
  • org.springframework.web.servlet.mvc.BaseCommandController
    • org.springframework.web.servlet.mvc.AbstractCommandController
    • org.springframework.web.servlet.mvc.AbstractFormController
      • org.springframework.web.servlet.mvc.AbstractWizardFormController
      • org.springframework.web.servlet.mvc.SimpleFormController
        • org.springframework.web.servlet.mvc.CancellableFormController
  • org.springframework.web.servlet.mvc.ParameterizableViewController
  • org.springframework.web.servlet.mvc.ServletForwardingController (implements org.springframework.beans.factory.BeanNameAware)
  • org.springframework.web.servlet.mvc.ServletWrappingController (implements org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.DisposableBean, org.springframework.beans.factory.InitializingBean)
    AbstractController是Controller的第一个实现。其他的Controller都是l承q个Controller的。我们先看比较重要的Controller?/pre>
    先说UrlFilenameViewController。不如我们自己来部v一个吧?/b>
    在example-servlet.xml中增加如下的配置Q?/strong>

    <bean name="/error.do"  class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
        </bean>

    OKQ当/error.do的请求上来后QurlFileNameViewController他变成/error。然后返回个ViewQ这个view的name是/errorQ然后用viewresolver来进行解析,可以解析?jsp/error.jsp?/pre>
    另外q有比较重要的controller是baseCommandControllerQ将h参数转换Z个对象,q对对象参数合法性进行验证。另?SimpleFormController可以对表单进行处理?/pre>
    关于各个controller的分析。未完待l。?br>
     

     

     



    ]]>[转] java.beans.PropertyEditor(属性编辑器)单应?http://www.tkk7.com/wangajing/archive/2009/11/20/303110.htmlq求无止?/dc:creator>q求无止?/author>Fri, 20 Nov 2009 14:07:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/20/303110.htmlhttp://www.tkk7.com/wangajing/comments/303110.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/20/303110.html#Feedback0http://www.tkk7.com/wangajing/comments/commentRss/303110.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/303110.html原文Qhttp://www.tkk7.com/orangewhy/archive/2007/06/26/126371.html

    java.beans.PropertyEditor的从字义来看是一个属性编辑器Q但总觉得它的作用更像一个{换器Q-从字W串转换为类对象的属性?/p>

    java.beans.PropertyEditor接口定义的方法有好几个,但是最重要Z面两个:

     void setValue(Object value)

     void setAsText(String text) throws java.lang.IllegalArgumentException;

    一般地Q我们要使用PropertyEditorӞq不直接实现此接口,而是通过l承实现此接口的java.beans.PropertyEditorSupport来简化我们的工作Q在子类覆盖setAsTextҎ可以了QsetValueҎ一般不直接使用Q在setAsTextҎ中将字符串进行{换ƈ产生目标对象以后Q由调setAsText调用setValue来把目标对象注入到编辑器中。当Ӟ你可用覆盖更多的Ҏ来满你的特D要求。JavaBean的类和接口,被大部分spring包用,可以从spring中学习更成熟的JavaBean使用Ҏ?/p>

    单的例子Q?/p>

    实体cPersonQ?/p>

    public class Person
    {
        
    private String name;
        
    private String sex;
        
    private int age;
        
        
    public Person(String name, String sex, int age)
        
    {
            
    this.name = name;
            
    this.sex = sex;
            
    this.age = age;
        }

        
        
    public int getAge()
        
    {
            
    return age;
        }

        
    public void setAge(int age)
        
    {
            
    this.age = age;
        }

        
    public String getName()
        
    {
            
    return name;
        }

        
    public void setName(String name)
        
    {
            
    this.name = name;
        }

        
    public String getSex()
        
    {
            
    return sex;
        }

        
    public void setSex(String sex)
        
    {
            
    this.sex = sex;
        }

        
        @Override
        
    public String toString()
        
    {
            
    return "Person["+name+""+sex+""+age+"]";
        }

    }

     

    Person的属性编辑器Q?/p>

    public class PersonPropertyEditor extends PropertyEditorSupport
    {
        
    public void setAsText(String text)
        
    {
            setValue(parseString(text));
        }


        
    private Object parseString(String text)
        
    {
            String[] parts 
    = tokenizeToStringArray(text, ""falsefalse);
            String name 
    = (parts.length > 0 ? parts[0] : "undefine");
            String sex 
    = (parts.length > 1 ? parts[1] : "undefine");
            
    int age = (parts.length > 2 ? Integer.valueOf(parts[2]) : 0);
            
    return (text.length() > 0 ? new Person(name, sex, age) : null);
        }


        
    private  String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens,
                                                        
    boolean ignoreEmptyTokens)
        
    {
            StringTokenizer st 
    = new StringTokenizer(str, delimiters);
            List tokens 
    = new ArrayList();
            
    while(st.hasMoreTokens())
            
    {
                String token 
    = st.nextToken();
                
    if(trimTokens)
                
    {
                    token 
    = token.trim();
                }

                
    if(!ignoreEmptyTokens || token.length() > 0)
                
    {
                    tokens.add(token);
                }

            }

            
    return toStringArray(tokens);
        }


        
    private  String[] toStringArray(Collection collection)
        
    {
            
    if(collection == null)
            
    {
                
    return null;
            }

            
    return (String[])collection.toArray(new String[collection.size()]);
        }

    }

     

    试代码Q?/p>

        public static void main(String[] args)
        
    {
            PersonPropertyEditor editor 
    = new PersonPropertyEditor();
            editor.setAsText(
    "aSam,man,22");
            System.out.println(editor.getValue());
        }

     

    l果输出Q?/p>

    Person[aSam, man, 22]


    ]]>提高开发技术的Tiphttp://www.tkk7.com/wangajing/archive/2009/11/16/302558.htmlq求无止?/dc:creator>q求无止?/author>Mon, 16 Nov 2009 07:11:00 GMThttp://www.tkk7.com/wangajing/archive/2009/11/16/302558.htmlhttp://www.tkk7.com/wangajing/comments/302558.htmlhttp://www.tkk7.com/wangajing/archive/2009/11/16/302558.html#Feedback6http://www.tkk7.com/wangajing/comments/commentRss/302558.htmlhttp://www.tkk7.com/wangajing/services/trackbacks/302558.html 

      以下Tip和学习\U从自己w上出发q行ȝQ仅代表个h观点。你可以留言q行讨论?/p>

    1.有计划的学习

           学习是一个@序渐q的q程。如果没有一个计划,学习变得没有规律,我们也无法提高自q能力。想起上学的时候,学校每个学期都会制定一个教学大U来指导老师的教学和我们的学习。是的,如果没有计划Q今天突然想学这个,明天H然惛_那个Q朝三暮四,我们永远也无法学到自己想学的东西。所以我们需要制定一个学习计划。有计划的学习才能提高自q能力。Java web目的开发是需要很多知识的U篏的,包括Java SEQ数据库QJDBCQLinuxQLog4jQHtml/CSS/JavascriptQ持久层框架QJUNIT及其他测试框ӞIOC框架Qweb MVC框架{等Q如果我们没有一个良好的计划Q今天学习Log4jQ明天学习JunitQ这些东襉K不会掌握好ƈ学习好?/p>

          如果l自己做计划。计划可以按照时间段来进行。例如本q度的工作,本季度要辑ֈ的水qI本月要学习的东西Q本周学习的计划安排Q以及每一天的安排。每天晚上睡觉前Q想想今天的计划安排是否完成Q明天该学习什么;每周到结束的时候,ȝ一下本周完成了什么,下周要学习什么。根据自己对计划的实行情况可以改变自q计划。M要有计划的学习。可以用google 日历?qq mail 邮箱{来理自己的计划?/p>

    2. 同一D|间只学习一U技?nbsp; 

           我是一个什么都惛_的h。我不想把自q旉都用在学习Java上,我还惛_习C++Q还惛_?web 设计Q还惛_好windows~程Q想学Linux~程Q想学习计算机网l编E,惛_习\由器、网l的配置……。于是,今天看了VC++深入详解Q明天学习Linux shell~程。计机技术包含了太多技术。我们无法一一他们都掌握。所以不要想什么都学会。至在一D|间内学习一U技术。我l自己制定了q样的计划,今年要把所有的_֊都致力ؓ java EE 开发技术上。一q后Q努力学习C/C++~程?/p>

          是的。我们学习的东西可以q一点,但一定要有自׃的方面。学专了一个方面,你就可以接着学习其他的技术。一个什么都会的人,很可能什么都不会Q所以,_于一Q而博于广?/p>

    3.学会休息

         我们都很忙,上学的时候学好各U,臛_不能挂科Q然后在译֤学习自己喜欢的java ~程Q工作的时候,需要做好工作,然后在工作之余多学一些东西;旉长了Q我们就可能倦了Q篏了。所以我们需要学会休息来改变自己的精状态?/p>

         整天在电脑前q行软g开发的我们Q要学会放松自己和休息。作为程序员整天在电脑前Q极ҎL工作和休息都M开电脑的习惯。休息的时候,也是在电脑前看电影,玩游戏。我惻I在我们工作篏了之后,应该d电脑Q走向户外来放松和休息。或到大街上转{Q或到商场里购物Q或L泳馆游泳Q或dw房健nQ或和朋友一h台球。等{等{。M要学会放松自己,走出户外Q不要整天在电脑前?/p>

         以上3Ҏ自己对自己工作学习的ȝ和提醒,特别写出来和大家一起分享?/p>


      感谢HiMagic!分n自己的观炏V值得学习?/span>

    提高开发技?>如何学习Q这个{换ƈ不完全对{。对于学习来_最重要的不是计划和q程Q而是l果Q没有成果的学习{于白费旉。对于提高技术来_必须要有W傲江湖唯我独尊的气势,以及持之以恒的定力?
    2009-11-17 08:54 | HiMagic!


    感谢CoderCream分n自己的观点,没错Q执行和l果更加重要Q?br />


    ]]>
    վ֩ģ壺 һɪ| ˿Ƶ| ޾Ʒպ?V| һĻ| վС˵| ŮƵ77777| ɫƨƨ߹ۿƵ| AVר߲| ѿĿһ| Ƶվ߹ۿ| av벻һ| avվëƬ| ֻѵAVߵӰ| ޻ɫ߹ۿվ| ޸߲| һƵ| aëƬѹۿվ| ӰԺ߲| Ƶһ| +ɫ++| ɫƬѿ| ޹պƵۿ| þþƷƵ| mm1313޾Ʒ| 91þó| ɫҹƵ| AVר߳| 91޹˾þþƷ| ޾ƷҾþþþþ| ձÿӰѿ| 2019ĻߵӰ| һëƬѹۿ| ޾ƷҺһ| ޾ƷƵ߹ۿƵ| ޾Ʒþþþȥq| ƵĻ| ޾ƷѶ| þþþþùƷ| ѹۿ| պëƬһƵ| WWW޾Ʒþ鶹|