|
02
|
之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同样的功能,而且比之以前更简单。另外,还省掉了整合两个框架带来的不稳定因素。
|
03
|
对于Spring
|
04
|
一、Spring
|
05
|
@Controller
|
06
|
在类上面定义,表明该类为控制器,返回字符串与redirect:xxx
|
07
|
@RequestMapping
|
08
|
在类或方法上面使用此注解,设置URL访问地址。它有两个属性,value指定访问路径,method指定指定请求方式,请求方式在RequestMethod这个类中,全部以常量形式定义,它默认使用GET请求。
|
09
|
@RequestParam
|
10
|
指定Request请求参数,在方法参数中定义,相当于传统的request.getParameter()。
|
11
|
@PathVariable
|
12
|
获取URL访问路径变量,这是Spring 3.0 框架才加入的特性,基于RESTful风格的URL访问路径。
|
13
|
@ModelAttribute
|
14
|
全局式的方法,在一组URL访问路径中,每次都会执行,方法返回结果保存在module会话中。
|
15
|
@Service
|
16
|
在类上面定义,指定被注解的类是业务逻辑组件,如果不指定具体的Bean @Repository ,本例只有业务层,所以就只用 @Service 注解。
|
17
|
@Autowired
|
18
|
IoC自动注入功能,替换以前的set写法,在SSH2中就已经开始使用了。
|
19
|
@Qualifier
|
20
|
对同一接口类有不同实现指定具体的实现类。
|
21
|
@ResponseBody
|
22
|
同样定义在方法上,Ajax调用声明,指定方法返回结果为Ajax回调函数结果。这是Spring 3.0 框架中增加的一个新特性。
|
23
|
@InitBinder
|
24
|
初始化数据绑定与类型转换,将传入的参数转换为自定义类型,或者对参数进行自定义处理。
|
25
|
二、示例
|
26
|
|
27
|
@RequestMapping 在类名上面定义,相当于指定的URL是此控制器内的所有其它访问路径的父路径。如果在某个方法上面定义 @RequestMapping 注解,则相对于父路径来说,是其子路径。如果不定义value值,那么按父路径访问就会被默认执行。但请注意,默认的访问方式只能有一个。
|
28
|
对于UserController的list方法REST访问URL为http: //localhost:8080/ssm3/user,而且它同时接收GET和POST两种请求。另外,Spring
|
29
|
如果一个类还要定义其它资源访问怎么办呢?请看下面的RoleController
|
30
|
|
31
|
在RoleController上定义了全局路径/role,这样一来,对于和角色相关的资源都会以/role开头,比如创建角色/role/ new ;编辑角色/role/edit/{id}等等。
|
32
|
上图edit方法中的{id}写法,就是RESTful @PathVariable 搭配来一起实现该功能。它表示所请求的URL中,可以将变量值作为参数进行动态的传递。例如:http: //localhost:8080/ssm3/role/edit/1,另外,除了可以用数字,还可以用字符串,还可以多定义几个变量:/role/edit/{id}/{type}等等。
|
33
|
每个方法的返回值,其实都对应着一个结果页面,这一点和struts2-convention这个插件很相像。本例使用FreeMarker模板引擎作为展示层,页面的后缀为.html,页面中除了标准的HTML之外,其余的数据填充,条件判断之类,都要用到FreeMarker指令。
|
34
|
对于save方法返回值写法表示的是重定向,相当于执行http: //localhost:8080/ssm3/role,而这个URL对应的其实就是RoleController这个类里面list方法。如果要带上参数之类的,一定要符合所定义的REST资源路径才可以。
|
35
|
|
36
|
|
37
|
@ResponseBody 用来标识Ajax方法调用,在上面这个方法中,用到了 @RequestParam 注解,它的作用就和request.getParameter( "name" )一样。Spring
|
38
|
|
39
|
对于拥有相同的一组访问规则的URL,如果都需要获得相同的数据,则使用 @ModelAttribute 注解。以RoleController为例,上面这个注解与方法的含义,相当于是在它里面所有的访问路径方法中都调用这个写法:module.addAttribute(“allRoles”,roleService.getRoles())。也即,不管是访问create还是edit,都会执行preperList,都会获得allRoles这个List。
|
40
|
|
41
|
注册自定义类型编辑器,在Spring @InitBinder 注解的方法中进行。如果所有的Controller都需要注册相同的属性编辑器,则可以实现WebBindingInitializer接口,定义一个全局的属性编辑器。
|
42
|
三、在web容器中部署
|
43
|
想要让Spring
|
44
|
|
45
|
DispatcherServlet是Spring
|
46
|
Spring
|
47
|
四、MVC配置
|
48
|
Spring 3.0 对使用和配置作了较大的改进,除了提供注解来简化控制器的开发之外,在配置文件上面也进行了简化。
|
49
|
|
50
|
基于Spring
|
51
|
DefaultAnnotationHandlerMapping这个类是将所有标注了 @RequestMapping 注解的Controller类,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配的路径,AnnotationMethodHandlerAdapter是管理所有 @RequestMapping 注解的方法。
详解:
@RestController :首先我们使用的是Spring 4的新注解 @RestController注解. 此注解避免了每个方法都要加上@ResponseBody注解。也就是说@RestController 自己戴上了 @ResponseBody注解,看以看作是 @Controller 和 @ResponseBody的结合体。 @RequestBody : 如果方法参数被 @RequestBody注解,Spring将绑定HTTP请求体到那个参数上。如果那样做,Spring将根据请求中的ACCEPT或者 Content-Type @ResponseBody : 如果方法加上了@ResponseBody注解,Spring返回值到响应体。如果这样做的话,Spring将根据请求中的 Content-Type ResponseEntity 是一个真实数据.它代表了整个 HTTP 响应(response). 你可以指定状态码、头信息和响应体。它包含你想要构建HTTP Response 的信息。 @PathVariable 此注解意味着一个方法参数应该绑定到一个url模板变量[在'{}'里的一个]中 一般来说你,要实现REST API in Spring 4 需要了解@RestController , @RequestBody, ResponseEntity 和 @PathVariable 这些注解 .另外, spring 也提供了一些支持类帮助你实现一些可定制化的东西。 MediaType : 带着 @RequestMapping 注解,通过特殊的控制器方法你可以额外指定,MediaType来生产或者消耗。 |