component-scan/>的base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。
8.4.2Spring2.5基于注解驱动的MVC
Spring2.5也为SpringMVC引入了注释驱动功能。
现在我们无须让Controller继承任何接口,无需在XML配置文件中定义请求和Controller的映射关系,仅仅使用注释就可以让一个POJO具有Controller的绝大部分功能——SpringMVC框架的易用性得到了进一步的增强。
1) 基于注解的Controller
由于SpringMVC的Controller必须事先是一个Bean,所以@Controller注解是不可缺少的。
请看下面的代码清单
代码清单1
@Controller//将这个类标注为Controller
publicclassFooController{
@Autowired
privateFooServicefooService;
@RequestMapping("/list.do")//URL请求映射
publicString[]list(){
String[]list=fooService.getAll();
;
returnlist;
}
@RequestMapping("/del.do")//URL请求映射
publicvoiddel(HttpServletRequestrequest,HttpServletResponseresponse){
fooService.doDel(request.getParameter("id"));
}
}
标注为一个控制器,而不需继承或者实现任何类和接口,就使FooController.java拥有了控制器的功能。
代码清单1中使用了两个链接分别访问了不同的方法,在实际应用中我们也许有另外一种需求一个控制器只接受一个URL请求,而控制器中不同的方法来处理URL请求中携带的不同的参数,请看下面的代码清单。
2) 一个Controller对应一个URL,由请求参数决定请求处理方法
代码清单2
@Controller
@RequestMapping("/doFoo.do")//指定控制器对应URL请求
publicclassFooController{
@Autowired
privateFooServicefooService;
//list方法对应URL/doFoo.do?
mode=list
@RequestMapping(params="mode=list")
publicString[]list(){
String[]list=fooService.getAll();
;
returnlist;
}
//del方法对应URL/doFoo.do?
mode=del
@RequestMapping(params="mode=del")
publicvoiddel(HttpServletRequestrequest,
HttpServletResponseresponse){
fooService.doDel(request.getParameter("id"));
}
}
代码清单2中满足了针对不同粒度程序设计的需要。
我们还可以让请求处理方法处理特定的HTTP请求如POST类型的,请看下面的代码清单。
3) 让请求处理方法处理特定的HTTP请求方法
代码清单3
@Controller
@RequestMapping("/doFoo.do")//指定控制器对应URL请求
publicclassFooController{
//只针对POST请求
@RequestMapping(params="mode=submit",
method=RequestMethod.POST)
publicStringsubmit(HttpServletRequestrequest,
HttpServletResponseresponse){
"调用submit方法.");
return"success";
}
}
方法submit只处理类型为POST的URL请求
4) 处理方法入参绑定URL参数
代码清单4
@Controller
@RequestMapping("/doFoo.do")//指定控制器对应URL请求
publicclassFooController{
@Autowired
privateFooServicefooService;
//del方法对应URL/doFoo.do?
mode=del&id=10
@RequestMapping(params="mode=del")
publicStringdel(intid){
fooService.doDel(id);
return"success";
}
}
当我们发送/doFoo.do?
mode=del&id=10的URL请求时,
Spring不但让del()方法处理这个请求,而且还将id请求参数在类型转换后绑定到del()方法的id入参上。
而del()方法的返回类型是String,它将被解析为逻辑视图的名称。
也就是说Spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelAndView中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方法,因此了解这个潜在规则无疑成为理解SpringMVC框架基于注解功能的核心问题。
代码清单4还可以写成下面这种形式
代码清单5
@Controller
@RequestMapping("/doFoo.do")//指定控制器对应URL请求
publicclassFooController{
@Autowired
privateFooServicefooService;
//del方法对应URL/doFoo.do?
mode=del&id=10
@RequestMapping(params="mode=del")
publicStringdel(@RequestParam("id")intid){
fooService.doDel(id);
return"success";
}
}
代码清单5中对del()请求处理方法的id入参标注了@RequestParam("id")注释,所以它将和id的URL参数绑定。
我的其它Spring文章,也许会对您有帮助
Spring的任务调度和邮件发送
Spring应用的单元测试
Spring的数据库支持
Spring的MVC框架
Spring的IoC容器
Spring对AOP的支持
Spring2.5注释驱动与基于注释的MVC