每个域设定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. ...
  12. }

另外还有几个重要原因:
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注解及扩展

[java] view plaincopy
  1. @Component("标识符")
  2. POJO类

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

@Repository:

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

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

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

[java] view plaincopy
  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相同;

[java] view plaincopy
  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。

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

细粒度控制Bean定义扫描

[html] view plaincopy
  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:表示过滤器表达式。

Spring3 MVC详解二相关推荐

  1. Spring MVC学习总结(3)——Spring3 MVC详解

    DispatcherServlet 前置控制器 使用Spring MVC,配置DispatcherServlet是第一步.DispatcherServlet是一个Servlet,所以可以配置多个Dis ...

  2. Spring Web MVC详解

    Spring Web MVC详解 原创 2016年03月23日 10:55:57 标签: 421 编辑 删除 2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java ...

  3. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  4. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  5. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  6. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  7. linux 进程间通信 dbus-glib【实例】详解二(下) 消息和消息总线(ListActivatableNames和服务器的自动启动)(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  8. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  9. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

最新文章

  1. 机器学习中的欠拟合与过拟合
  2. jQuery:has()和jQuery:contains()及jQuery:empty
  3. 利用Servlet生成动态验证码
  4. [SPS2010] 使用心得 7 - ebook for Installation
  5. 10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”
  6. 关于单纤与双纤光端机的区别介绍
  7. linux重启memcache_Linux下的Memcache安装方法
  8. arcgis投影数据计算度分秒
  9. linux删除文件_Linux中删除特殊名称文件的多种方式
  10. PHP群发300万,mysql 300万数据查询500多秒如何优化
  11. python windows记事本_pywinauto自动化操作记事本
  12. ffmpeg音频播放代码示例-avcodec_decode_audio4
  13. JavaScript中atEnd函数
  14. z变换解差分方程例题_Z变换解差分方程的思考
  15. 批判性思维-思维遮蔽性
  16. oracle中distance用法,distance的用法总结大全
  17. mysql轮播图表设计_制作一个简单的轮播图
  18. 微信第三方平台之授权流程(三)
  19. 毛永胜计算机教师,做新时代智慧型阳光教师 ——记丁香路小学教师心理健康实训讲座...
  20. APICloud 自定义模块开发的一些坑

热门文章

  1. 大学计算机实验报告答案 南京理工大学,南京理工大学微机实验报告.doc
  2. 全球经济寒冬将至?且看顶级资本大鳄的大数据分析预测
  3. Android社招最全面试题,成功拿下大厂offer
  4. python 最新 毕业设计 选题推荐
  5. linux网络引流工具,gor 引流快速入门
  6. [DonkeyCar][树莓派]基础01 - 首次配置 - WIFI
  7. JVM垃圾回收机制及算法
  8. 重置Windows打印机COM端口USB端口
  9. 二手交易管理系统SSM
  10. vue 中使用axios