﻿<?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/jason61719/</link><description>爱吃饭</description><language>zh-cn</language><lastBuildDate>Thu, 14 May 2026 22:16:33 GMT</lastBuildDate><pubDate>Thu, 14 May 2026 22:16:33 GMT</pubDate><ttl>60</ttl><item><title>查询无修改的模型处理</title><link>http://www.blogjava.net/jason61719/articles/348201.html</link><dc:creator>森</dc:creator><author>森</author><pubDate>Wed, 13 Apr 2011 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/jason61719/articles/348201.html</guid><wfw:comment>http://www.blogjava.net/jason61719/comments/348201.html</wfw:comment><comments>http://www.blogjava.net/jason61719/articles/348201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jason61719/comments/commentRss/348201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jason61719/services/trackbacks/348201.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">在业务中经常把类型给抽象出来作为一个表，这样的表有一个特点就是需要经常查到，但是基本不用修改到。而这种做法很致命的一点就是作为写业务的程序员必须了解数据库的某条记录的编号，然后写进去代码里面，这是完全违反开闭原则的，一旦有修改需要找出所有的代码并修改。</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">像下面的代码：</span></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<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;String&nbsp;getFilePath(String&nbsp;fileType)&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;type&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">57</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;fileType&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">""</span><span style="color: #000000; ">.equals(fileType))&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Integer.parseInt(fileType);<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">&nbsp;(type)&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">53</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">userfiles/images</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">54</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">userfiles/video</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">55</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">userfiles/audio</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">56</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">userfiles/document</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">57</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">userfiles/others</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;filePath;<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">真正的做法应该是将这些脱离于数据库，保存在文件。好处有</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">1.</span><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">查询效率提高N多倍；</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">2.</span><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">一旦修改了记录不用修改源代码，而源代码要查找文件，完全符合开闭 原则；</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">3.</span><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">让程序员更容易理清楚关系，用XML或者其他文件在表示树等结构上面明显有优势；</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">4.</span><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">修改记录的成本变得很低，甚至都不用开发一个软件来修改了，只要直接编辑文件就是了（当然不赞成这样，不利于权限管理等）</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">当然，这样就还有一个问题，程序员需要关注什么。这里建议用工厂模式。</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">首先建立一个抽象工厂封装，将几种产品的调用做个封装，对外提供一个方法，这个方法只需要一个&#8220;类型参数&#8221;。就按照上面的例子，可以对外提供images，video，audio等几个类型参数，所有程序员编程的时候就按照这个分类写代码，调用封装类以后在进行switch条件分支处理。</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">具体代码写多了烦，不写了。</span></p>
<img src ="http://www.blogjava.net/jason61719/aggbug/348201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jason61719/" target="_blank">森</a> 2011-04-13 16:10 <a href="http://www.blogjava.net/jason61719/articles/348201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails入门1</title><link>http://www.blogjava.net/jason61719/articles/348085.html</link><dc:creator>森</dc:creator><author>森</author><pubDate>Mon, 11 Apr 2011 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/jason61719/articles/348085.html</guid><wfw:comment>http://www.blogjava.net/jason61719/comments/348085.html</wfw:comment><comments>http://www.blogjava.net/jason61719/articles/348085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jason61719/comments/commentRss/348085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jason61719/services/trackbacks/348085.html</trackback:ping><description><![CDATA[<!--[if !mso]>
<style>
v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><xml>
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="margin-top:0cm;margin-right:0cm;margin-bottom:0cm;margin-left:21.0pt;
margin-bottom:.0001pt;text-indent:-21.0pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><span>1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">用NetBeans作为开发工具，安装了Groovy之后就能够开发Grails程序，新建一个Grails程序&#8220;addrBook&#8221;，如图</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-align:center" align="center"><span><img src="http://www.blogjava.net/images/blogjava_net/jason61719/2011.04.11.1.png" alt="说明: 计算机生成了可选文字: ：项目面而下文件一云addrB00k国铂配置国厂白控制器困口域类十口消息包十口服务白标记库口实用程序类由｛扣视图和布局国L自库l｛扫脚本国｛自Groo叮源包国｛自」ava源包由汤Target国肋集成测试国t自单元测试由肋Web应用程序服务" height="349" width="281" /></span></p>
<p style="margin-top:0cm;margin-right:0cm;margin-bottom:0cm;margin-left:21.0pt;
margin-bottom:.0001pt;text-indent:-21.0pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><span>2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">配置</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-align:center" align="center"><span><img src="http://www.blogjava.net/images/blogjava_net/jason61719/2011.04.11.2.png" alt="说明: 计算机生成了可选文字: 口配置hibernate11尹，pring：国resources.groo叮国Bootstr。p.groo叮国Buildcon石g.groo叮：圃con'g.gr。。vy圃oat。source.groo叮：固urIM。pping、．groo叮" height="174" width="217" /></span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">配置文件不再是XML，因为在Groovy看来，groovy文件不一定就是要编译的文件，打开几个来看发现其形式结构跟json格式类似。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">就目前所知，BootStrap.groovy是启动时要运行的一些脚本。（命名因为遵从&#8220;约定优于配置&#8221;，所以看不到关于配置启动顺序的文件）。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">BuildConfig.groovy</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">是配置生成项目的信息，在里面发现了类似Maven的术语&#8220;依赖（dependencies）&#8221;。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">Config</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">是全局的配置，包括文件编码，文件的存取规则，发布地址和访问地址等等。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">DataSource.groovy</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">是配置数据源的，跟spring的DataSource类似，有关于数据库的信息和缓存的配置就在这里。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">UrlMappings.groovy</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">是URL和MVC的映射规则描述文件，因为在GSP文件中配置一个链接是很灵活的采用g:link，而controller需要将页面a标签的具体访问地址按照规则映射到对应的控制器上面，所以有定义这个规则的必要。</span></p>
<p style="margin-top:0cm;margin-right:0cm;margin-bottom:0cm;margin-left:21.0pt;
margin-bottom:.0001pt;text-indent:-21.0pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><span>3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">控制器、领域模型和消息</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-align:center" align="center"><span><img src="http://www.blogjava.net/images/blogjava_net/jason61719/2011.04.11.3.png" alt="说明: 计算机生成了可选文字: 控制器域类消息包mes,ages.propertiesme::age,_da.propertle:messages一e.propertiesmessages一s.propertiesmes、age、一r.properties国国国田国国：国&#183;由；：白&#183;；&#183;；&#183;；&#183;；&#183;&#8230;me,sages_it.propertiesmessagesja.propertiesmessages_nl.propertiesmessages一t--BR.propertiesmessages一t-pT.propertiesme,,ages_ru.propertie、messages一h.properties阶阶阶阶阶阶阶阶阶阶圃阶叫潞申田申田由田申田申田园：&#183;&#183;&#183;&#183;&#183;；&#183;&#183;；:;：&#183;国二" height="325" width="261" /></span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">很明显可以看出Grails风格是三层架构：领域模型-服务-控制器</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">消息包：是国际化（I18N）的配置，其中最后一个反黑的就是中文。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">域类：ORM的模型类，在Grails中占很大一部分，因为弱化了数据库的作用，在数据存储方面完全由领域模型来定义，这让程序员能更好的发挥OO思想。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">服务：其实并不作为Grails的中间层，如果按照Grails默认架构方法，用命令行grails generate-all XXX的方法生成一套流程的话，可以发现是没有服务层的，有控制器直接控制对域模型的操作。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">控制器：根据Grails的方法已经能生成大量的可用方法，当然还得根据自己的实际需要对该类进行修改。</span></p>
<p style="margin-top:0cm;margin-right:0cm;margin-bottom:0cm;margin-left:21.0pt;
margin-bottom:.0001pt;text-indent:-21.0pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><span>4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">其他</span></p>
<p style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"><span><img src="http://www.blogjava.net/images/blogjava_net/jason61719/2011.04.11.4.png" alt="说明: 计算机生成了可选文字: 白长蔽己库国L妇实用程序类困白视图扣布局序白库口脚本白Gr00Vy源包&#183;｝自Java源包由白丁arget国白集成测试国白单元测试田尸白Web应用程序" height="211" width="181" /></span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">标记库：各种taglib</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">实用程序类：可以放各种工具，比方说自动测试，数据生成，jetty服务器启动等等工具类</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">视图和布局：当用generate的时候自动生成的页面文件就在这个目录下</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">库：引用的除了Grails之外的库，比如数据库驱动等</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">脚本：目前还不知道这个脚本指的是本地系统的运行脚本还是Groovy脚本</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">Groovy</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">源包和Java源包：这里是Groovy项目的风格，在Groovy项目中一般将Groovy和Java的源文件分开两个源文件夹</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">target</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">：类似Maven生成最终程序的目录，里面存放着程序运行以后生成的二进制文件和日志文件。估计最终打包也是在这个目录下。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">集成测试和单元测试：都是放测试类的文件夹，没做过测试不了解。</span></p>
<p style="margin:0cm;margin-bottom:.0001pt;text-indent:21.2pt;"><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">Web</span><span style="font-size:10.5pt;font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">应用程序：应用程序的根目录。</span></p>
<img src ="http://www.blogjava.net/jason61719/aggbug/348085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jason61719/" target="_blank">森</a> 2011-04-11 19:42 <a href="http://www.blogjava.net/jason61719/articles/348085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java集合类</title><link>http://www.blogjava.net/jason61719/articles/347099.html</link><dc:creator>森</dc:creator><author>森</author><pubDate>Sun, 27 Mar 2011 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/jason61719/articles/347099.html</guid><wfw:comment>http://www.blogjava.net/jason61719/comments/347099.html</wfw:comment><comments>http://www.blogjava.net/jason61719/articles/347099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jason61719/comments/commentRss/347099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jason61719/services/trackbacks/347099.html</trackback:ping><description><![CDATA[<!--[if !mso]>
<style>
v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><xml>
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">关于Java集合类的文章介绍不少了，这里给个链接，还有上个图。</span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;"><a href="http://blog.csdn.net/softwave/archive/2009/05/11/4166598.aspx">http://blog.csdn.net/softwave/archive/2009/05/11/4166598.aspx</a></span></p>
<p style="text-indent:21.2pt;"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">Collection</span></p>
<p style="text-align:center" align="center"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><img src="http://www.blogjava.net/images/blogjava_net/jason61719/1.png" alt="" height="503" width="983" border="0" /></span></p>
<p style="text-align:left;text-indent:21.2pt;" align="left"><span style="font-family:&quot;微软雅黑&quot;,&quot;sans-serif&quot;">Map</span></p>
<p style="text-align: center;" align="center"><span style="font-family: &quot;微软雅黑&quot;,&quot;sans-serif&quot;;"><img src="http://www.blogjava.net/images/blogjava_net/jason61719/2.png" alt="" height="346" width="858" border="0" /></span></p>
<img src ="http://www.blogjava.net/jason61719/aggbug/347099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jason61719/" target="_blank">森</a> 2011-03-27 12:56 <a href="http://www.blogjava.net/jason61719/articles/347099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>