<<上篇 | 首页 | 下篇>>

浅谈 SpringMVC 数据绑定 - Senton - 博客频道 - CSDN.NET

2. 包装类型(以Integer为例,其他类似):
    Controller代码:

  1. @RequestMapping("test.do")  
  2. public void test(Integer num) {  
  3.       
  4. }  


    JSP表单代码:

  1. <form action="test.do" method="post">  
  2.    <input name="num" value="10" type="text"/>  
  3.    ......  
  4. </form>  


和基本数据类型基本一样,不同之处在于,JSP表单传递过来的数据可以为null或"",以上面代码为例,如果jsp中num为""或者表单中无num这个input,那么,Controller方法参数中的num值则为null。

3. 自定义对象类型:
    Model代码:

  1. public class User {  
  2.   
  3.     private String firstName;  
  4.   
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22.   
  23. }  


    Controller代码:

  1. @RequestMapping("test.do")  
  2. public void test(User user) {  
  3.       
  4. }  


    JSP表单代码:

  1. <form action="test.do" method="post">  
  2.    <input name="firstName" value="张" type="text"/>  
  3.    <input name="lastName" value="三" type="text"/>  
  4.    ......  
  5. </form>  


非常简单,只需将对象的属性名和input的name值一一对应即可。

阅读全文……

标签 :

如何进行项目管理才具有执行力 - 心情驿站 - 51CTO技术博客

如何提高项目管理的执行力,一些建议供大家参考:
(1) 执行力是与组织文化密切相关的。
(2) 建立一个清晰的项目管理流程是项目管理部门首要的事情。如果项目管理部想拥有更多的项目控制权,这时候就可以利用一下公司管理层的影响力了。
(3) 在项目计划方面,尽量让项目成员参与项目计划的制订,让他们了解项目的全貌,参与决定就意味着承诺,这样做出的项目计划才是职责明确的、可操作性强。尽量主持召开项目启动会议,邀请一位公司高层参加你的会议就更是锦上添花了。
(4) 在项目工作安排方面,特别注意管理好各个接口,如项目成员之间或部门之间的工作交接,技术交接、资源交接。交接处是最脆弱的、最容易出现问题的地方,就如同一根柑蔗,总是断在有结的地方。
(5) 加强项目沟通,适量增加项目信息收集、整理、分析和发布的频次,这样能及时发现项目问题,利于及时采取纠正措施。可以通过电子邮件等手段,及时将项目进展情况、存在的问题和纠正措施通报给全体项目成员、不要忘记抄送给项目成员所属部门的经理,如果有必要,甚至抄送给公司管理层。对工作交付好的成员要及时表扬,对工作交付差些的成员要督促帮助他们改进,我想没有那一个项目成员愿意看到项目经理在电子邮件中向他提出改进建议了。
(6) 项目结束时,千万不要草草了事,除了收集整理项目文档、作项目总结外,有条件的话,主持召开一个总结会议。没有条件也要发一个电子邮件,宣布项目顺利结束,指名道姓对项目成员和项目职能部门经理对项目工作的贡献和支持表示感谢,如果能从公司管理层争取到一些物质和精神奖励就更好了。如果对达成绩效事先有奖励承诺,就一定要及时兑现。
 
项目管理是一门实践性的学科,没有一个方法能解决所有的项目问题。项目经理只有通过项目的实践,不断提高自身的项目管理能力,形成自己的管理风格和人格魅力,才能逐步提高项目的控制能力和项目的执行力。

阅读全文……

解惑 spring 嵌套事务 - Spring - Java - ITeye论坛

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。 
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 
前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。 
它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager) 

 

 

   PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行. 


    另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务. 潜套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交. 

    由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit, 这个规则同样适用于 roll back. 
    
    
    那么外部事务如何利用嵌套事务的 savepoint 特性呢, 我们用代码来说话 
    

Java代码  收藏代码
  1. ServiceA {  
  2.       
  3.     /** 
  4.      * 事务属性配置为 PROPAGATION_REQUIRED 
  5.      */  
  6.     void methodA() {  
  7.         ServiceB.methodB();  
  8.     }  
  9.   
  10. }  
  11.   
  12. ServiceB {  
  13.       
  14.     /** 
  15.      * 事务属性配置为 PROPAGATION_REQUIRES_NEW 
  16.      */   
  17.     void methodB() {  
  18.     }  
  19.       
  20. }     

    

这种情况下, 因为 ServiceB#methodB 的事务属性为 PROPAGATION_REQUIRES_NEW, 所以两者不会发生任何关系, ServiceA#methodA 和 ServiceB#methodB 不会因为对方的执行情况而影响事务的结果, 因为它们根本就是两个事务, 在 ServiceB#methodB 执行时 ServiceA#methodA 的事务已经挂起了 (关于事务挂起的内容已经超出了本文的讨论范围, 有时间我会再写一些挂起的文章) . 

那么 PROPAGATION_NESTED 又是怎么回事呢? 继续看代码 
 

Java代码  收藏代码
  1. ServiceA {  
  2.       
  3.     /** 
  4.      * 事务属性配置为 PROPAGATION_REQUIRED 
  5.      */  
  6.     void methodA() {  
  7.         ServiceB.methodB();  
  8.     }  
  9.   
  10. }  
  11.   
  12. ServiceB {  
  13.       
  14.     /** 
  15.      * 事务属性配置为 PROPAGATION_NESTED 
  16.      */   
  17.     void methodB() {  
  18.     }  
  19.       
  20. }     



现在的情况就变得比较复杂了, ServiceB#methodB 的事务属性被配置为 PROPAGATION_NESTED, 此时两者之间又将如何协作呢? 从 Juergen Hoeller 的原话中我们可以找到答案, ServiceB#methodB 如果 rollback, 那么内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint(注意, 这是本文中第一次提到它, 潜套事务中最核心的概念), 而外部事务(即 ServiceA#methodA) 可以有以下两种处理方式: 

1. 改写 ServiceA 如下 

Java代码  收藏代码
  1. ServiceA {  
  2.       
  3.     /** 
  4.      * 事务属性配置为 PROPAGATION_REQUIRED 
  5.      */  
  6.     void methodA() {  
  7.         try {  
  8.             ServiceB.methodB();  
  9.         } catch (SomeException) {  
  10.             // 执行其他业务, 如 ServiceC.methodC();  
  11.         }  
  12.     }  
  13.   
  14. }  



这种方式也是潜套事务最有价值的地方, 它起到了分支执行的效果, 如果 ServiceB.methodB 失败, 那么执行 ServiceC.methodC(), 而 ServiceB.methodB 已经回滚到它执行之前的 SavePoint, 所以不会产生脏数据(相当于此方法从未执行过), 这种特性可以用在某些特殊的业务中, 而 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 都没有办法做到这一点. (题外话 : 看到这种代码, 似乎似曾相识, 想起了 prototype.js 中的 Try 函数 ) 

2. 代码不做任何修改, 那么如果内部事务(即 ServiceB#methodB) rollback, 那么首先 ServiceB.methodB 回滚到它执行之前的 SavePoint(在任何情况下都会如此), 
   外部事务(即 ServiceA#methodA) 将根据具体的配置决定自己是 commit 还是 rollback (+MyCheckedException). 
   
   

阅读全文……

标签 :