这一章大象将详细分析web层代码,以及使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能。     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同样的功能,而且比之以前更简单。另外,还省掉了整合两个框架带来的不稳定因素。     对于Spring MVC框架,我主要讲一下它的常用注解,再结合一些示例进行说明,方便大家能够快速理解。     一、Spring MVC常用注解说明     @Controller     在类上面定义,表明该类为控制器,返回字符串与redirect:xxx     @RequestMapping     在类或方法上面使用此注解,设置URL访问地址。它有两个属性,value指定访问路径,method指定指定请求方式,请求方式在RequestMethod这个类中,全部以常量形式定义,它默认使用GET请求。     @RequestParam     指定Request请求参数,在方法参数中定义,相当于传统的request.getParameter()。     @PathVariable     获取URL访问路径变量,这是Spring MVC 3.0框架才加入的特性,基于RESTful风格的URL访问路径。     @ModelAttribute 全局式的方法,在一组URL访问路径中,每次都会执行,方法返回结果保存在module会话中。     @Service     在类上面定义,指定被注解的类是业务逻辑组件,如果不指定具体的Bean ID,则采用默认命名方式,即类名的首字母小写。之前在SSH2中,大象曾对Dao组件使用@Repository,本例只有业务层,所以就只用@Service注解。     @Autowired     IoC自动注入功能,替换以前的set写法,在SSH2中就已经开始使用了。     @Qualifier     对同一接口类有不同实现指定具体的实现类。     @ResponseBody     同样定义在方法上,Ajax调用声明,指定方法返回结果为Ajax回调函数结果。这是Spring MVC 3.0框架中增加的一个新特性。     @InitBinder     初始化数据绑定与类型转换,将传入的参数转换为自定义类型,或者对参数进行自定义处理。     二、示例          @RequestMapping在类名上面定义,相当于指定的URL是此控制器内的所有其它访问路径的父路径。如果在某个方法上面定义@RequestMapping注解,则相对于父路径来说,是其子路径。如果不定义value值,那么按父路径访问就会被默认执行。但请注意,默认的访问方式只能有一个。     对于UserController的list方法REST访问URL为http://localhost:8080/ssm3/user,而且它同时接收GET和POST两种请求。另外,Spring MVC 3.0有一个很灵活的特性,可以自定义方法参数。看看list方法,我设定了两个参数,一个Model,一个User对象。Model是用来渲染数据,生成页面用的。相当于request.setAttribute,你可以这样理解,但不能就这样认为,Model以及另一个ModelMap,都是作为视图模型传递参数的,它们的作用域为request。除此之外,你还可以定义HttpServletRequest、HttpServletResponse等等各种各样的参数。 如果一个类还要定义其它资源访问怎么办呢?请看下面的RoleController          在RoleController上定义了全局路径/role,这样一来,对于和角色相关的资源都会以/role开头,比如创建角色/role/new;编辑角色/role/edit/{id}等等。     上图edit方法中的{id}写法,就是RESTful URL风格,与@PathVariable搭配来一起实现该功能。它表示所请求的URL中,可以将变量值作为参数进行动态的传递。例如:http://localhost:8080/ssm3/role/edit/1,另外,除了可以用数字,还可以用字符串,还可以多定义几个变量:/role/edit/{id}/{type}等等。     每个方法的返回值,其实都对应着一个结果页面,这一点和struts2-convention这个插件很相像。本例使用FreeMarker模板引擎作为展示层,页面的后缀为.html,页面中除了标准的HTML之外,其余的数据填充,条件判断之类,都要用到FreeMarker指令。     对于save方法返回值写法表示的是重定向,相当于执行http://localhost:8080/ssm3/role,而这个URL对应的其实就是RoleController这个类里面list方法。如果要带上参数之类的,一定要符合所定义的REST资源路径才可以。     
    @ResponseBody用来标识Ajax方法调用,在上面这个方法中,用到了@RequestParam注解,它的作用就和request.getParameter("name")一样。Spring MVC框架支持好几种返回格式,例如:String/JSON/XML等等。不过以这种格式的字符串值形式返回是最简便的一种方式,而且利用JavaScript解析也十分方便。页面调用的时候请用jQuery的$.ajax()这种原生方式来定义,这种写法不会出问题,也很灵活,而且其它几种方式最终也是调用它来完成请求。     

对于拥有相同的一组访问规则的URL,如果都需要获得相同的数据,则使用@ModelAttribute注解。以RoleController为例,上面这个注解与方法的含义,相当于是在它里面所有的访问路径方法中都调用这个写法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是访问create还是edit,都会执行preperList,都会获得allRoles这个List。          注册自定义类型编辑器,在Spring MVC中,对于时间类型,框架不会自动帮你转换绑定,需要你自己来定义属性编辑器。除此之外,还可以对某些特殊字符进行转义符处理,都可以放在@InitBinder注解的方法中进行。如果所有的Controller都需要注册相同的属性编辑器,则可以实现WebBindingInitializer接口,定义一个全局的属性编辑器。     三、在web容器中部署     想要让Spring MVC框架帮助我们完成工作,就需要在Web容器中配置好它。          DispatcherServlet是Spring MVC的核心,是处理一切请求转发的核心控制器。大象曾在本系列的第二篇文章中就详细描述了Spring MVC的流程结构,如果没什么印象的话请再去看看。     Spring MVC有一个默认规则,Web容器启动之后,会自动查找/WEB-INF/<servlet-name>.xml这个Spring类型的配置文件。如果想自定义配置文件路径,就按上面的写法,指定contextConfiglocation这个属性,大象采用maven构建项目,所以servlet-context.xml这个配置文件放在resource目录下。     四、MVC配置     Spring MVC 3.0对使用和配置作了较大的改进,除了提供注解来简化控制器的开发之外,在配置文件上面也进行了简化。          基于Spring MVC注解的配置就是上面这两行,还有一种更简化的配置写法是只写这一句:<mvc:annotation-driven/>就可以了,Spring启动的时候会自动注册上面这两个bean。为什么大象要在这里显示的注册两个bean呢?因为,我们在真正使用的时候,一般来说,使用默认的方式满足不了我们的系统或业务要求。比如拦截器,比如数据验证,比如返回消息格式转换等等一些自定义设置。他们都需要配置在这两个bean里面。因为本例是用来作为入门教程,所以这些东西都没有加进来。     DefaultAnnotationHandlerMapping这个类是将所有标注了@RequestMapping注解的Controller类,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配的路径,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。     这部分的内容到这里就讲完了,下一篇将对本例使用的展示层FreeMarker进行一下简单介绍。

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)的更多相关文章

  1. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

    前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及M ...

  2. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

    在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些 ...

  3. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)

    Spring更新到3.0之后,其MVC框架加入了一个非常不错的东西——那就是REST.它的开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,使得现在很多公司将其作为新的系统开发框架 ...

  4. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)

    这是本系列的最后一篇,主要讲一下FreeMarker模板引擎的基本概念与常用指令的使用方式.     一.FreemMarker基本概念     FreemMarker是一个用Java语言编写的模板引 ...

  5. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  6. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  7. Spring MVC(3)Spring MVC 高级应用

    一.Spring MVC 的数据转换和格式化 前面的应用,都只是用HandlerAdapter去执行处理器. 处理器和控制器不是一个概念,处理器是在控制器功能的基础上加上了一层包装,有了这层包装,在H ...

  8. Spring MVC(2)Spring MVC 组件开发

    一.控制器接收各类请求参数 代码测试环境: 接收各类参数的控制器--ParamsController package com.ssm.chapter15.controller; @Controller ...

  9. centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解

    centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...

随机推荐

  1. 【HDOJ】1022 Train Problem I

    栈和队列训练题目. #include <stdio.h> #include <string.h> #define MAXNUM 1005 char in[MAXNUM]; ch ...

  2. Android开发UI之补间动画-布局添加动画

    布局添加动画 使用步骤: 1.获取到布局的id RelativeLayout ly=(RelativeLayout)findViewById(R.id.layout); 2.设置动画样式 ScaleA ...

  3. Oracle系列之序列

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 语法结构:创建序列 create sequence sequence_name start with num increment by ...

  4. ADDED_TO_STAGE 多次被调用

    var mca:MovieClip=new MCA(); mca.addEventListener(Event.ADDED_TO_STAGE,addStageEvent); function addS ...

  5. poj2187

    求最远点对,这是一道经典的旋转卡壳的题目话说由于是前年写的,之后就没怎么研究过计算几何了……感觉都不大记得清了,来稍微回忆一下……首先最远点对一定出现在凸包上显然,然后穷举肯定不行,这时候就需要旋转卡 ...

  6. 【转】Ubuntu更改语言环境设置

    原文网址:http://studiogang.blog.51cto.com/505887/385199 上午装了下Ubuntu 10.4,默认安装时选择的语言是english的,结果由于英语水平太次, ...

  7. MongoDB之四( 索引操作)

    我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们 又会花费50%的时间在R上面,因为Read操作对用户来说是非常敏感的,处理不好就会被人唾弃,呵呵. 从算法上来说有 ...

  8. POJ 2240 Arbitrage spfa 判正环

    d[i]代表从起点出发可以获得最多的钱数,松弛是d[v]=r*d[u],求最长路,看有没有正环 然后这题输入有毒,千万别用cin 因为是大输入,组数比较多,然后找字符串用strcmp就好,千万不要用m ...

  9. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  10. [King.yue]Ext.NET相比WebForm的优势

    1)更好的用户体验.(生产力++) 虽然WebForm可以使用微软的Ajax以及Ajax控件进行开发,但是用户体验还是远远不及extjs.而且你可以跟客户忽悠,这个功能多么滴难做,多么好,但是我们做出 ...