Spring3 MVC详解二

每个域设定Controller,做好URI规划
Spring MVC 3.x是完全支持Restful的,我们把URI做好规划,对于诸如ACL的实现会有很大的帮助。建议的URI规划如下:{Domain}[/{SubDomain}]/{BusinessAction}/{ID}。比如:hotels/bookings/cancel/{id} ——表示此URI匹配hotels域的bookings子域,将要进行的是取消某项booking的操作。

  1. @Controller  
  2. @RequestMapping(value = "/hotels")  
  3. public class HotelsController extends AbstractController {  
  4. ...  
  5.     @RequestMapping(value = "/bookings/cancel/{id}", method = RequestMethod.POST)  
  6.     public String deleteBooking(@PathVariable long id) {  
  7.         bookingService.cancelBooking(id);  
  8.         //use prefix 'redirect' to avoid duplicate submission  
  9.         return "redirect:../../search";  
  10.     }  
  11. ...  

另外还有几个重要原因:
1、由于Spring的DefaultAnnotationHandlerMapping.java在做Mapping的时候,先做是否有类匹配,再找方法,把基本的mapping放在类上面,可以加速匹配效率;
2、后续可以通过更细腻的支持Ant path style的AntPathMatcher来规划URI Template资源,做ACL控制(请参考后面的心得体会)。

转发与重定向

可以通过redirect/forward:url方式转到另一个Action进行连续的处理。

可以通过redirect:url 防止表单重复提交 

写法如下:

return "forward:/order/add";

return "redirect:/index.jsp";



Spring MVC注解
  • Spring自带的@Component注解及扩展@Repository、@Service、@Controller 
     
  • JSR-250 1.1版本中中定义的@ManagedBean注解,是Java EE 6标准规范之一,不包括在JDK中,需要在应用服务器环境使用(如Jboss)  


  • JSR-330的@Named注解




@Component注解及扩展



  1. @Component("标识符")     
  2. POJO类    
@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。

@Repository:

@Repository注解的POJO类表示DAO层实现,从而见到该注解就想到DAO层实现,使用方式和@Component相同;

  1. @Repository("testHibernateDao")     
  2. public class TestHibernateDaoImpl {}<span style="white-space:pre">  </span>  


@Service
@Service注解的POJO类表示Service层实现,从而见到该注解就想到Service层实现,使用方式和@Component相同;
  1. @Service("testService")    
  2. public class TestServiceImpl {    
  3.     @Autowired    
  4.     @Qualifier("testHibernateDao")    
  5.     private TestHibernateDaoImpl dao;    
  6.     public TestHibernateDaoImpl getDao() {    
  7.         return dao;    
  8.     }    
  9. }  

@Controller

@Controller注解的类表示Web层实现,从而见到该注解就想到Web层实现,使用方式和@Component相同;

  1. <pre name="code" class="java">@Controller    
  2. public class TestAction {    
  3.     @Autowired    
  4.     private TestServiceImpl testService;</pre>}  

自定义扩展
Spring内置了三种通用的扩展注解@Repository、@Service、@Controller ,大多数情况下没必要定义自己的扩展,在此我们演示下如何扩展@Component注解来满足某些特殊规约的需要;
在此我们可能需要一个缓存层用于定义缓存Bean,因此我们需要自定义一个@Cache的注解来表示缓存类。只需要在扩展的注解上注解@Component即可。可以使用@Cache来表示被注解的类是Cache层Bean。

  1. @Target({ElementType.TYPE})     
  2. @Retention(RetentionPolicy.RUNTIME)     
  3. @Documented    
  4. @Component    
  5. public @interface Cache{     
  6.        String value() default "";     
  7. }    


细粒度控制Bean定义扫描

  1. <context:component-scan     
  2.         base-package=""    
  3.         resource-pattern="**/*.class"    
  4.         name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"    
  5.         use-default-filters="true"    
  6.         annotation-config="true">     
  7.                 <context:include-filter type="aspectj" expression=""/>     
  8.                 <context:exclude-filter type="regex" expression=""/>     
  9. </context:component-scan>  


  • base-package:表示扫描注解类的开始位置,即将在指定的包中扫描,其他包中的注解类将不被扫描,默认将扫描所有类路径;
  • resource-pattern:表示扫描注解类的后缀匹配模式,即“base-package+resource-pattern”将组成匹配模式用于匹配类路径中的组件,默认后缀为“**/*.class”,即指定包下的所有以.class结尾的类文件;
  • name-generator:默认情况下的Bean标识符生成策略,默认是AnnotationBeanNameGenerator,其将生成以小写开头的类名(不包括包名);可以自定义自己的标识符生成策略;
  • use-default-filters:默认为true表示过滤@Component、@ManagedBean、@Named注解的类,如果改为false默认将不过滤这些默认的注解来定义Bean,即这些注解类不能被过滤到,即不能通过这些注解进行Bean定义;
  • annotation-config:表示是否自动支持注解实现Bean依赖注入,默认支持,如果设置为false,将关闭支持注解的依赖注入,需要通过<context:annotation-config/>开启。
  • <context:include-filter>:表示过滤到的类将被注册为Spring管理Bean;
  • <context:exclude-filter>:表示过滤到的类将不被注册为Spring管理Bean,它比<context:include-filter>具有更高优先级;
  • type:表示过滤器类型,目前支持注解类型、类类型、正则表达式、aspectj表达式过滤器,当然也可以自定义自己的过滤器,实现org.springframework.core.type.filter.TypeFilter即可;
  • expression:表示过滤器表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值