??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 GMT60- Grails 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>
1. public 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>

]]>
վ֩ģ壺
|
ƽ|
|
|
¤|
Ͳ|
ʩ|
|
|
|
|
|
㰲|
Ű|
|
|
봨|
|
|
˳|
|
|
|
ˮ|
|
|
|
|
˳|
|
ʯ|
¬|
|
|
Դ|
|
|
ľ|
|
ƽ|
Դ|