原创文章,转载请注明出处
本文地址:http://www.yshjava.cn/post/430.html
Spring MVC3的注解灵活强大,支持完全注解驱动,当放弃配置文件而完全采用注解配置时,你会被代码的简洁性深深吸引,这也是作者独立出一个篇幅来介绍其在Spring MVC3中的使用方法的根本原因。本文基于《Spring3_MVC注解教程》学习、总结而来,将从HTTP请求地址映射和通过注解绑定请求数据两个方面来介绍如何使用注解配置MVC,在此感谢作者的无私奉献,同时欢迎各位指点不妥之处。
HTTP请求地址映射
HTTP请求映射原理
Spring MVC进行映射的依据
请求路径映射表达式
@RequestMapping注解用于声明请求映射路径,除了标准的URL,还支持Ant风格(即?、*和**的字符)的和带{xxx}占位符的URL。如下所示
/user/*/createUser
*号代表一层任意内容的目录,匹配/user/aaa/createUser、/user/bbb/createUser等URL
/user/**/createUser
**代表0到多层任意内容的目录,匹配/user/createUser、/user/aaa/bbb/createUser等URL
/user/createUser??
??代表两个任意字符(特殊字符需要转码,转码后作为一个字符,如空格,转码为%20仍认为是一个字符,?的数量即为字符的数量),匹配/user/createUseraa、/user/createUserbb等URL
/user/{userId}
{userId}代表一个字符串或数字的变量,匹配user/123、user/abc等URL
/user/**/{userId}
匹配user/aaa/bbb/123、user/aaa/456等URL
company/{companyId}/user/{userId}/detail
匹配company/123/user/456/detail等的URL
@RequestMapping的用法比较灵活,有如下几种仅供参考:
- @RequestMapping(value="/delete")映射一个路径,且不限制HTTP请求方式
- @RequestMapping(value="/delete", method = RequestMethod.GET)映射一个路径,且只允许通过Get方式请求
- @RequestMapping(value={"/delete", "/del"}, method = {RequestMethod.GET, RequestMethod.POST})映射多个路径,且只允许通过Get方式请求
- @RequestMapping("/delete")映射一个路径,且不限制HTTP请求方式
- @RequestMapping({"/delete", "/del"})映射多个路径,且不限制HTTP请求方式
- @RequestMapping(value="/delete", method = {RequestMethod.GET, RequestMethod.POST})映射多个路径,且只允许通过Get或POST方式请求
对于@RequestMapping来说,除了上述通过value限定HTTP请求路径、通过method限定HTTP请求方式外,还可以:
通过params注解限定请求参数
@RequestMapping(value="/delete", params="userId") public String delete(@RequestParam("userId") String userId){ //删除用户 }
通过headers注解限定请求标头(报文头)参数
@RequestMapping(value="/show",headers="content-type=text/*") public String show(@RequestParam("userId") String userId){ //显示用户详情 }
在上述两个例子中,params和headers分别对请求参数及报文头属性进行限定,它们支持简单的表达式,下面以params表达式为例说明,headers可以参照params进行理解之:
- "userId"表示请求必须包含名为userId的请求参数
- "!userId":表示请求不能包含名为userId的请求参数
- "userId!=value1":表示请求包含名为userId的请求参数,但其值不能为value1
- {"userId=value1","userName"}:请求必须包含名为userId和userName的两个请求参数,且param1参数的值必须为value1
通过注解绑定请求数据
绑定请求参数:
@RequestMapping(value="/rename") public String rename(@RequestParam("userName") String userName, @RequestParam("password") String password, @RequestParam("rename") String rename){ //具体处理代码 }
绑定Cookies参数
@RequestMapping(value="/cookies") public String cookies(@CookieValue("JSESSIONID") String sessionId){ //具体处理代码 }
绑定请求标头(报文头)参数
@RequestMapping(value="/index") public String index(@RequestHeader("Accept-Language") String accpetLanguage){ //具体处理代码 }
@RequestParam有以下三个参数:
value:参数名
required:是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常
defaultValue:默认参数名,设置该参数时,自动将required设为false。极少情况需要使用该参数,也不推荐使用该参数。
@RequestMapping(value="/getUser") public String getUser(@RequestParam("userName") String userName,){ //根据用户名获取用户信息 }
上面所示代码的处理方法是不安全的:如果HTTP请求不包含"userName"参数,将会导致异常!因此,如果不能保证"userName"参数一定存在,为了安全起见,请使用:
@RequestParam(value = "userName", required = false)
替代!
使用命令/表单对象绑定
所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的POJO。Spring MVC按:“HTTP请求参数名 = 命令/表单对象的属性名”的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。
示意图如下:
范例代码如下:
@RequestMapping(value = {"/show", "view"}, method = {RequestMethod.GET, RequestMethod.POST}) public String show(User user, Model model) { model.addAttribute("username", "springmvc"); model.addAttribute("password", "类型非常灵活"); return "show"; }
总结:
通过注解配置MVC非常的方便和快捷,个人尤其喜欢Controller和RequestMapping以及参数绑定。
在Spring MVC3中用的比较多的(同时也是个人认为比较好用的)注解有如下几个:
@Controller将一个JavaBean声明为一个Controller控制器
@RequestMapping将一个普通的JavaBean方法声明为一个请求映射路径
@RequestParam将请求报文中的参数绑定到操作方法的入参中
@PathVariable将URL中的占位符绑定到操作方法的入参中
@RequestHeader将请求标头中的参数绑定到操作方法的入参中
@CookieValue将cookies中的参数绑定到操作方法的入参中
掌握了他们几个的用法,基本上就能应付80%以上的需要了。
原创文章,转载请注明出处:http://www.yshjava.cn/post/431.html