??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品第一国产精品,日韩欧美自拍,国产欧美一区二区精品久久久http://www.aygfsteel.com/SSailYang/archive/2009/04/04/263932.html阉K阉KSat, 04 Apr 2009 13:45:00 GMThttp://www.aygfsteel.com/SSailYang/archive/2009/04/04/263932.htmlhttp://www.aygfsteel.com/SSailYang/comments/263932.htmlhttp://www.aygfsteel.com/SSailYang/archive/2009/04/04/263932.html#Feedback0http://www.aygfsteel.com/SSailYang/comments/commentRss/263932.htmlhttp://www.aygfsteel.com/SSailYang/services/trackbacks/263932.html阅读全文

阉K 2009-04-04 21:45 发表评论
]]>
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>

   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 发表评论
]]>
Hibernate ?getCurrentSession ?/title><link>http://www.aygfsteel.com/SSailYang/archive/2008/07/16/215231.html</link><dc:creator>阉K</dc:creator><author>阉K</author><pubDate>Wed, 16 Jul 2008 07:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/SSailYang/archive/2008/07/16/215231.html</guid><wfw:comment>http://www.aygfsteel.com/SSailYang/comments/215231.html</wfw:comment><comments>http://www.aygfsteel.com/SSailYang/archive/2008/07/16/215231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/SSailYang/comments/commentRss/215231.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/SSailYang/services/trackbacks/215231.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: 宋体;">SessionFactory.getCurrentSession() ?Hibernate 应用获取 Session 的常用方法。在调用该方法时QHibernate 会从 interface CurrentSessionContext 获取当前? SessionQ这是Hibernate 在不同组件中传?Session 的方法?br id="rx2v" /> <br id="rx2v0" /> CurrentSessionContext 有三个实玎ͼ分别? ThreadLocalSessionContext、JTASessionContext ? ManagedSessionContext。ThreadLocalSessionContext ?Session 与当前线E绑定,是用较多的一U方案;JTASessionContext ?Session ?JTA 事务l定Q在 JTA 环境中用;ManagedSessionContext 使应用可以通过 bind() ?unbind() Ҏ控制 Session 的绑定,主要在有 Conversation 的应用中使用Q如果? ManagedSessionContextQ开发h员要做的事情q是很多的)。CurrentSessionContext 实现的选择可以通过 hibernate.current_session_context_class 来配|?br id="v:ca" /> <br id="v:ca0" /> 另一U更常见的创?Session 的方法是 openSession()。openSession() ? getCurrentSession() 有何不同和关联呢Q在 SessionFactory 启动的时候,Hibernate 会根据配|创建相应的 CurrentSessionContextQ在 getCurrentSession() 被调用的时候,实际被执行的Ҏ? CurrentSessionContext.currentSession() 。在 currentSession() 执行Ӟ如果当前 Session 为空QcurrentSession 会调?SessionFactory ?openSession。所? getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法?br id="gr:f" /> <br id="gr:f0" /> 再说 ManagedSessionContextQ它提供了更灉|的绑?Session 的方式,但是使用hM单。在 Hibernate ?CaveatEmptor 实例中有关于使用 ManagedSessionContext 的例子,但更好的选择是?Seam Framework?br id="y31y" /> </span></span> <img src ="http://www.aygfsteel.com/SSailYang/aggbug/215231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/SSailYang/" target="_blank">阉K</a> 2008-07-16 15:48 <a href="http://www.aygfsteel.com/SSailYang/archive/2008/07/16/215231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB 3.0 ?Seam-managed Persistence Contexthttp://www.aygfsteel.com/SSailYang/archive/2008/06/14/207944.html阉K阉KSat, 14 Jun 2008 13:59:00 GMThttp://www.aygfsteel.com/SSailYang/archive/2008/06/14/207944.htmlhttp://www.aygfsteel.com/SSailYang/comments/207944.htmlhttp://www.aygfsteel.com/SSailYang/archive/2008/06/14/207944.html#Feedback0http://www.aygfsteel.com/SSailYang/comments/commentRss/207944.htmlhttp://www.aygfsteel.com/SSailYang/services/trackbacks/207944.html

本文简单谈谈我?EJB 3.0 的两U?Persistence Context ?Seam-managed Persistence Context 的不同点的理解、所要解决的问题和我自己所疑惑的问题?br />
EJB 3.0 (JPA) ?Persistence Context

    大家在?EJB 3.0 的时候会注意?EJB 3.0 中的容器理 Persistence Context 有两U类型,一U是 TransactionQ另一U是 Extended。这是一个较 Hibernate ?Session 所没有的概念,Session 没有两种不同的类型,而且最重要的是 Session 不是容器理的,q里的容器指的是 App Server 容器。这里暂时不谈论 Persistence Context ?Session 之间的异同,主要谈谈两种 Persistence Context 之间的不同。学q?ORM 的同学都知道Q当 Persistence Context 是打开状态的时候,Model 处于被理的状态中Q当 Persistence Context 关闭之后QModel 处于了 Detached 状态?br />
    上面q些Ҏ对?Transaction ?Extended ?Persistence Context 都是一LQ不同的地方在于 Persistence Context 何时被打开关闭。由于绝大多数情况下 Persistence Context 是被容器理的(如果你不嫌篏也可以自己控?Persistence ContextQ,所以在 EJB 3.0 应用中看不到打开或关? Persistence Context 的代码(Spring + Hibernate 的应用也同样如此QHibernate Session 的管理工作可以交l?Spring 来做Q?/p>


    其实QTransaction ?Extended Persistence Context 的不同之处也在于容器何时打开或关?Persistence Context。Transaction cd?Persistence Context 的打开和关闭是和事务的打开和关闭是同步的。也是说在一个事务开始之后,Persistence Context 才会开始;在事务关闭的时候,相应?Persistence Context 也会被关闭?br />

   Extended cd?Persistence Context 的打开和关闭是?Stateful Session Bean 的生命周期同步的Q是跨越事务的。也是_?SFSB 的初始化开始,直到销毁,Persistence Context 都是存在的。你可以在事务之外执行写操作Q但是这是ƈ不会执行真正的数据库操作Q写操作只是攑օ了队列,直到下一个事务,写操作才会真正地被执行。两者的 不同单说来就?Extended Persistence Context 存在的时间更ѝ那Z么要有两U不同的 Persistence Context 呢?

    当一?Web h到来Ӟ服务器会打开一个线E,q个U程可能会调用一个事务方法,q是一个事务便开始了Q当q个hl束ӞU程关闭Q事务也随之l束。由? Transaction cd?Persistence Context 的生存周期是在事务范围之内的Q所以一?Web h的结束也意味着相应?Persistence Context 的关闭。由于多?Web 应用在一?Web h内即可完成一个独立的操作Q所以大部分情况?Transaction ?Persistence Context 是适用的。但是对于一些复杂的应用Q一ơ操作需要跨多ơ请求。这U情况下Q如果依旧?Transcation ?Persistence ContextQ由于每ơ请求结束后Q相应的 Persistence Context 都被关闭Q相应的 Model 也就变ؓ Detached 状态。如果接下来的请求仍焉要这些已l变?Detached 状态的 Model 需要重?loadQ?merge() Ҏ来持久化。稍有不适就会?LazyInitializationException ? NonUniqueObjectException。同Ӟq也提高了操作的复杂E度?br />
    如果使用 Extended Persistence Context p解决q些问题。由?Extended Persistence Context 的生命周期是?SFSB 的生命周期同步的Q所以只要多ơ请求调用的都是同一?SFSB 中的ҎQ有多少ơ的hQPersistence Context L同一个,其中?Model 也始l是被管理的。很好地解决? Persistence Context 在线E之间传递的问题Q也不会?LazyInitializationException ? NonUniqueObjectException 问题的发生?br />
Seam-managed Persistence Context

    EJB 3.0 容器理之下?Persistence Context 很不错,能解军_多问题,但是q是有些问题无法解决。Seam 很强大,如果有些问题 EJB 容器解决不了了,没关p,?Persistence Context 交由 Seam 来管理就 OK 了。那 Seam 都能解决哪些 EJB 不能解决的问题呢Q先考虑下面两个问题Q?/p>

  1. Extended Persistence Context 虽然可以跨越多个事务Q但是每个事务照旧调教不误,q对于想在想让整个操作作Zơ事务的话,该如何去?/li>
  2. 如果一个业务的一l请求只是调用同一?SFSB 的话Q那?EJB ?Extended Persistence Context 可以在线E之间传递,?SFSB 的整个生命周期都使用同一?Persistence Context。但如果业务需要调用不同的 SFSB 的话Q如何在 SFSB 之间传递?/li>
    对于W一个问题,׃ Seam ?JPA 实现提供者是 HibernateQ而且 Hibernate 提供了一个扩展的 FlushModeType - "Manual"。通过使用q个 FlushModeTypeQ我们可以手工控制何时执?flush() 操作。在 Seam 的文档中有关于这部分的介l??a target="_blank">Seam-managed persistence contexts and atomic conversations 》。文档中使用了一D늮单的代码展示 Seam 如何实现所谓的 "atomic conversations"Q关于代码的内容我就不介l了Q大安过我提供的链接来浏?Seam 的文档)。通过q种方式Q事务貌似是跨越了整个事务,但我认ؓ SFSB 中除了调?flush() 的方法以外的其它Ҏ不是事务的。其实也没有必要Q因些方法ƈ没有执行数据库操作,所以没有必要用事务。当Ӟ如果是乐观事物的话,使用了对性能? 响也不大Q这只是我的一Ҏ薄的理解Q欢q指出错误)。只有最后的调用?flush() 的方法有事务的必要?br />
    q就引发了一个o我不解的问题。请先看q篇文章?a target="_blank">Extended Persistence Context in Stateful Session Beans 》。在q篇文章介绍了如何只使用 EJB 3.0 去解?#8220;问题1”。文中的 SFSB 的默认事务属性是 "NOT_SUPPORTED"Q也是说这?SFSB 中的Ҏ默认不是事务的。只有最后的调用 flush() 的方法用了 "REQUIRED" 的事务属性去覆盖默认讄。也是最后的Ҏ是事务的Q其它的不是。这?Seam 所做的有区别吗Q感觉没有区别。但我认为像 Gavin King q样的大牛绝不会做无用功的,那问题就?Seam 实现 "atomic conversations" 的内部细节到底是什么呢Q欢q大家回{这个问题?br />
    对于W二个问题,可以通过使用 Seam-Managed Persistence Context 来解冟뀂Seam-manged Persistence Context 需要在 components.xml 文g中进行配|,q?@In 注入?Seam 的组件中。由?Seam 是一个比较新的框架技术,所以关?Seam 是如何 Persistence Context 在组件中传递ƈ没有详细的介l。应该只是声明,然后透明C用即可。在一?jBPM 程中被使用到的 Seam lgQ其中的 Persistence Context 应该是可以很Ҏ地被传递。(本不应该使用不确定的和模p的词语Q但无奈现在关于 Seam 的文章资料还是有限,所以我也没有找到关?Persistence Context 在组件之间调用的例子Q?br />
l束语:q篇文章解释的问题不多,不过都是我自q理解。可能有错误 的地方,Ƣ迎大家指出。同Ӟ又有一些新问题产生了,应该可以通过阅读 Seam 提供的例子和源代码得到解释。但 Seam 的例子只看过三个Q更多的q没有看。看q的 Seam 的源代码更可以忽略不计。l努力吧Q!

阉K 2008-06-14 21:59 发表评论
]]>
վ֩ģ壺 | ̨| | ɽ| | ľ| | ˮ| Ұ| | | | Ϫ| Ҧ| ά| | ֯| Դ| ػʵ| ¡| | ͩ®| ͼľ| | ҳ| | °Ͷ| | | | | ֽ| | | | | Դ| | ʤ| ɽ| ײ|