??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区二区三区婷婷月色,在线观看av一区,一区二区三区视频在线http://www.aygfsteel.com/SSailYang/category/38280.htmlimport groovy.*;grails.*zh-cnTue, 17 Mar 2009 03:39:14 GMTTue, 17 Mar 2009 03:39:14 GMT60Grails 1.1 ?PetClinic-MVC 实例的源代码分析http://www.aygfsteel.com/SSailYang/archive/2009/03/14/259700.html阉K阉KSat, 14 Mar 2009 04:33:00 GMThttp://www.aygfsteel.com/SSailYang/archive/2009/03/14/259700.htmlhttp://www.aygfsteel.com/SSailYang/comments/259700.htmlhttp://www.aygfsteel.com/SSailYang/archive/2009/03/14/259700.html#Feedback1http://www.aygfsteel.com/SSailYang/comments/commentRss/259700.htmlhttp://www.aygfsteel.com/SSailYang/services/trackbacks/259700.html本文的主要内Ҏ?Grails 1.1 ?PetClinic-MVC 实例的代码分析。这个实例主要验证了如何在非 Grails 的项目中使用 GORM。此外也演示?Spring MVC 2.5 的一些用法。本文假讑֤家对 Spring、Spring MVC、Groovy ?Grails 有着初步的了解。OK, let's go!

Domain ?/span>

目前 Grails 只提供了在普?Spring 应用中独立?GORM 的方法(现在 Groovy ?Grails 已是 SpringSource 旗下的品了Q自然要首先对自家品提供支持)。不q相信以后在其它 Java EE 框架中也可独立?GORM?

?Grails 以外使用 GORMQ只需?Domain cM使用 grails.persistence.Entity 注释卛_。其它的像?Grails 中的一栗?/p>

在配|方面也很简单,只要使用 <gorm:sessionFactory ... /> 卛_。详l请?Grails ?PetClinicQ这里就不拗qC?/p>

Controller ?/strong>

?Domain 层一PController 层也全部使用 Groovy 实现。主要是因ؓ GORM 的大部分Ҏ都是动态的?

1. ClinicController: ClinicController 实现?InitializingBean 接口。这个接口只有一个方?afterPropertiesSet。这个方法会?Bean 完成属性设|之后执行。PetClinic 用这个方式实CcM Grails ?BootStrap 的部分功能。在q个Ҏ中我们可以看?GORM 中的 save() Ҏ? addTo* 动态方法都是可用的?/p>

   1public void afterPropertiesSet() {  
   
2.     if (!Speciality.count()) {  
   
3.         def rad = new Speciality(name: "radiology").save()  
   
4  
   
5.         new Vet(firstName: "Linda", lastName: "Douglas").  
   
6.             addToSpecialities(sur).save()  
   
7  
   
8.   
   
9.         ['dog''lizard''cat''snake''bird''hamster'].each {  
  
10.             new PetType(name: it).save()  
  
11.         }  
  
12.     }  
  
13. } 


可能有h会问QafterPropertiesSet() q个Ҏ的作用就是增加一些预定义的数据,Z么不使用构造函数来实现。实际上Q在本例中,afterPropertiesSet() 的作用的可以用构造函数来实现Q经q测试)。至于作者是Z什么目的而选择了实?InitializingBean 接口我也说不好?br />
ClinicController 的其它部分就是一些简单的不能再简单的 Http h处理函数了。需要说明的一Ҏ @RequestMapping 中的g表了h?URLQ这个是不用带后~的,也就是说 ".do" 是多余的?br />
2. AddPetForm:

       ?AddPetForm cȝU别上有三个注释Q分别是 @Controller, @RequestMapping ? @SessionAttributes。@Controller 不用多说Q作用是q个cd明ؓ一?Spring ControllerQƈd? Context 中。下面介l一?@RequestMapping ?@SessionAttributes 的功能:

  • @RequestMapping 可以定义处理h的\径和ҎcdQ即可放在类声明上,也可攑֜Ҏ声明上。在 AddPetForm 中,cdҎ上都?@RequestMappingQ类上的 @RequestMapping 用来定义h路径。两? @RequestMapping 的方法分别负责处?get h?post h。但我认为更好的方式是在一?Controller cM定义多个处理h的方法,像 Grails ?Controller 那样。需要注意的是方法上面的 @RequestMapping 上面的值ƈ不会覆盖cM?@RequestMapping 中的倹{?/li>
  • @SessionAttributes 中的g表了 org.springframework.ui.Model 中应该被讄? Session 范围的变量。在 Spring MVC 应用中,q些变量往往是v?ActionForm(Struts) ? CommandObject(Spring MVC) 的作用。之所以要表单对象放?Session 中,是ؓ了其能够在表单昄和之后的表单提交q样q程中不丢失。@SessionAttributes 的这U用法是源于 Spring MVC 2.0 AbstractFormController ?SessionForm 模式?br />
    实际上,使用 @SessionAttributes 是很成问题的Q有时是不可接受的。考虑以下场景Q在 PetClinic 应用中,新徏两个 OwnerQ然后ؓq两?Owner 都添加新? Pet。注意,只要昄出来 Add Pet 的页面即可。这Ӟq两个页面的 URL 应该?addPet.do?ownerId=num1 ? addPet.do?ownerId=num2 。这时将先打开的表?/span> 提交 Q假设是 num1 的那个。你会发C 实际上是?num2 Owner d了一?Pet?br />
    q个问题的原因其实是很简单的Q我׃解释了。从上面q个事实来看Q@SessionAttributes 的缺点还是比较明显。是否采用这U方式还要看q个问题对你的应用的影响是否是致命的了。Spring MVC 有必要改q一下,?Seam 那样可以很方便的使用 Conversation 是解决问题的一个好办法。(当然也可以?hidden 域来保存 idQ?br />
    Spring MVC 之所以要使用q种有较明显~陷的方式的原因是要使用 Spring MVC 的表单数据绑定功能。由于目前还没有扑ֈ更好的方式,所以只能?@SessionAttribute 了。这一块还?Spring MVC 的一个短板,需要在新版本中改进?br />

除此以外QAddPetForm 中还有两个特D的ҎQ一个是注释?@ModelAttribute 的方法;另一个是注释?@InitBinder 的方法。下面分别介l一下:

  • @ModelAttribute 可以用在Ҏ上,也可以用在Ş参上。如果放在方法上Q那它会在进入请求处理方法是准备一些数据,作用? SimpleFormController ?referenceData() 一栗@ModelAttribute 的这U用法可能会让h联想? Seam 中的 @Factory。但?@ModelAttribute 注释的方法只会在同一?Controller 中被注释? @RequestMapping 的方法调用之前被调用Q?@Factory Ҏ则是全局的?br />
    你可以在 setupForm Ҏ中向 request ?session 中设|一些需要显C在面上的数据Q但是如果只攑֜ request 里的话,在表单验证发生时Q数据便会丢失;攑֜ session ~点自不必多说。在 Spring Web Flow 新加入的 flow ?conversation {新?scope 无法很容易地?Spring MVC 中用的情况下,使用 @ModelAttribute 无疑是更好的选择。ƈ且?@ModelAttribute 可以在多? @RequestMapping Ҏ之间实现代码的重用?br />
  • @InitBinder 适用于注册只属于?Controller 的属性编辑器。但?AddPetForm 中,@InitBinder Ҏ只是告诉 Spring MVCQ\径ؓQ?lt;form: input path="id" />Q?id 的g要用属性编辑器。不q页面里也压Ҏ?路径?id 的倹{所以,我觉得这个又是一个多余的代码。(我试q将 @InitBinder Ҏ注释掉,对程序没有媄响)

Controller 层中两个Ҏ的类QClinicBindingInitializer ?PetTypeEditor

  • ClinicBindingInitializer 的作用是注册全句的属性编辑器
  • PetTypeEditor 是用于处?PetType cd数据l定的属性编辑器?strong>对于?PetType q样的实体之间的兌属性,恰当C用属性编辑器可以化程序的开发?/span> Q不?Grails 是否实现了一个动态的属性编辑器Q用于关联属性的数据l定Q?/li>

 

配置

1. applicationContext.xml

        applicationContext 中大部分都是常见?Spring 配置。特D一点的配置除了 <gorm:sessionFactory ... /> 以外Q还?Hibernate StatisticsService JMX 的配|?/p>

2. dispatcher-servlet.xml

        Spring MVC 配置文gQ也是一?Spring 的配|文Ӟ的默认名?dispatcher-servlet.xml?/p>

        从上至下Q第一个配|表明哪?Package 下的 Class 使用?Spring ?@Controller 注释。这?Spring 容器在启动的时候会自动扫描其下?ClassQ将加注?@Controller 注释的类加入?Spring 的容器中?

        W二个配|?DefaultAnnotationHandlerMapping ?HandlerMapping 接口的一个最常用的实现类。用于映?Handler 和请求\径之间的关系。通过q样的配|,Controller 中的 @RequestMapping 中的路径值就可以真正地和 Http h对应h。HandlerMapping 的另外一个常用的实现cL ControllerClassNameHandlerMapping ?/p>

        W三个配|?AnnotationMethodHandlerAdapter 的作用是使处理请求的 Handler 能够真正的具有处理请求的能力而提供一些服务,包括求参数绑定应用相应的属性编辑器Q通过注册 webBindingInitializer 实现Q?/p>

 

==============================l束的分割线==============================

写到q里QPetClinic-MVC 中值得分析学习的代码都提到了。PetClinic-MVC 是一个很的应用Q但是其中演CZ GORM 在普?Spring 中的应用? Spring MVC 2.5 的用。细看的话还是能学到不少东西的。我所写的只是我的理解Q难免会有一些不_错误Q欢q纠正?/span>



阉K 2009-03-14 12:33 发表评论
]]>
վ֩ģ壺 | ƽ| | | ¤| Ͳ| ʩ| | | | | | | Ű| | | | | | ˳| | | | ˮ| | | ԰| | ˳| | ʯ| ¬| | | Դ| | | ľ| | ƽ| Դ|