SpringMVC3.0实战指南参考《Spring3.x企业应用开发实战》上海浦东软件园·职业技能培训目录SpringMVC框架简介1HTTP请求地址映射2HTTP请求数据的绑定3数据转换、格式化、校验4数据模型控制5视图及解析器6其它7SpringMVC3.0新特性•支持REST风格的URL•添加更多注解,可完全注解驱动•引入HTTP输入输出转换器(HttpMessageConverter)•和数据转换、格式化、验证框架无缝集成•对静态资源处理提供特殊支持•更加灵活的控制器方法签名,可完全独立于ServletAPI参考《Spring3.x企业应用开发实战》SpringMVC框架结构DispatcherServletHandlerMappingHandlerAdapterHandlerView (JSP/XML/PDF,...)23ModelAndView54ViewResolver6Model7servletName-servlet.xml81参考《Spring3.x企业应用开发实战》SpringMVC框架结构packagecom.baobaotao.web;...@Controller①将UserController变成一个Handler@RequestMapping(“/user”)②指定控制器映射的URLpublicclassUserController{@RequestMapping(value=“/register”)③处理方法对应的URL,相对于②处的URLpublicStringregister(){return“user/register”;④返回逻辑视图名}}参考《Spring3.x企业应用开发实战》框架的实现者DispatcherServletDefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapterUserControllerregister.jsp23ModelAndViewuser/register54InternalResourceViewResolver6Model7servletName-servlet.xml81参考《Spring3.x企业应用开发实战》目录SpringMVC框架简介1HTTP请求地址映射2HTTP请求数据的绑定3数据转换、格式化、校验4数据模型控制5视图及解析器6其它7HTTP请求映射原理HTTP请求报文Handler处理方法SpringMVC框架WEB容器参考《Spring3.x企业应用开发实战》SpringMVC进行映射的依据①请求方法②请求URL③HTTP协议及版本④报文头⑤报文体参考《Spring3.x企业应用开发实战》通过URL限定:URL表达式@RequestMapping不但支持标准的URL,还支持Ant风格(即?、*和**的字符,参见3.3.2节的内容)的和带{xxx}占位符的URL。以下URL都是合法的:/user/*/createUser匹配/user/aaa/createUser、/user/bbb/createUser等URL。/user/**/createUser匹配/user/createUser、/user/aaa/bbb/createUser等URL。/user/createUser??匹配/user/createUseraa、/user/createUserbb等URL。/user/{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。参考《Spring3.x企业应用开发实战》通过URL限定:绑定{xxx}中的值@RequestMapping(/{userId})publicModelAndViewshowDetail(@PathVariable(userId)StringuserId){ModelAndViewmav=newModelAndView();mav.setViewName(user/showDetail);mav.addObject(user,userService.getUserById(userId));returnmav;}@Controller@RequestMapping(/owners/{ownerId})publicclassRelativePathUriTemplateController{@RequestMapping(/pets/{petId})publicvoidfindPet(@PathVariableStringownerId,@PathVariableStringpetId,Modelmodel){…}}URL中的{xxx}占位符可以通过@PathVariable(xxx)绑定到操作方法的入参中。如果@PathVariable不指定参数名,只有在编译时打开debug开关(javac-debug=no)时才可行!!(不建议)参考《Spring3.x企业应用开发实战》通过请求方法限定:请求方法序号请求方法说明1GET使用GET方法检索一个表述(representation)——也就是对资源的描述。多次执行同一GET请求,不会对系统造成影响,GET方法具有幂等性[指多个相同请求返回相同的结果]。GET请求可以充分使用客户端的缓存。2POSTPOST方法,通常表示“创建一个新资源”,但它既不安全也不具有幂等性(多次操作会产生多个新资源)。3DELETEDELETE,表示删除一个资源,你也可以一遍又一遍地操作它,直到得出结果:删除不存在的东西没有任何问题4PUT幂等性同样适用于PUT(基本的含义是“更新资源数据,如果资源不存在的话,则根据此URI创建一个新的资源”)请求方法,在HTTP中这被叫做动词(verb),除了两个大家熟知的(GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD和OPTIONS。这些方法的含义连同行为许诺都一起定义在HTTP规范之中。一般浏览器只支持GET和POST方法。参考《Spring3.x企业应用开发实战》通过请求方法限定:代码示例示例1:@RequestMapping(value=“/delete”)publicStringtest1(@RequestParam(userId)StringuserId){returnuser/test1;}所有URL为controllerURI/delete的请求由test1处理(任何请求方法)示例2:@RequestMapping(value=/delete,method=RequestMethod.POST)publicStringtest1(@RequestParam(userId)StringuserId){returnuser/test1;}所有URL为controllerURI/delete且请求方法为POST的请求由test1处理参考《Spring3.x企业应用开发实战》通过请求方法限定:模拟请求方法通过在web.xml中配置一个org.springframework.web.filter.HiddenHttpMethodFilter通过POST请求的_method参数指定请求方法,HiddenHttpMethodFilter动态更改HTTP头信息。HiddenHttpMethodFilterPOSTHTTP请求method=PUT&...SpringMVCPUTHTTP请求参考《Spring3.x企业应用开发实战》通过请求/请求头参数限定:示例@RequestMapping(value=/delete,params=userId)publicStringtest1(@RequestParam(userId)StringuserId){...}@RequestMapping(value=/show,headers=content-type=text/*)②publicStringtest2(@RequestParam(userId)StringuserId){...}通过请求参数限定:通过请求头参数限定:参考《Spring3.x企业应用开发实战》通过请求/请求头参数限定:更多params和headers分别通过请求参数及报文头属性进行映射,它们支持简单的表达式,下面以params表达式为例说明,headers可以参照params进行理解之。param1:表示请求必须包含名为param1的请求参数。!param1:表示请求不能包含名为param1的请求参数。param1!=value1:表示请求包含名为param1的请求参数,但其值不能为value1。{param1=value1,param2}:请求必须包含名为param1和param2的两个请求参数,且param1参数的值必须为value1。参考《Spring3.x企业应用开发实战》目录SpringMVC框架简介1HTTP请求地址映射2HTTP请求数据的绑定3数据转换、格式化、校验4数据模型控制5视图及解析器6其它7通过注解绑定:示意图①请求方法②请求URL③HTTP协议及版本④报文头⑤报文体publicStringhandle1(...)@RequestParam绑定请求参数@RequestHeader绑定请求头参数@CookieValue绑定Cookie的值@PathVariable绑定URL中的变量参考《Spring3.x企业应用开发实战》通过注解绑定:示例@RequestMapping(value=/handle1)publicStringhandle1(@RequestParam(userName)StringuserName,@RequestParam(password)Stringpassword,@RequestParam(realName)StringrealName){...}@RequestMapping(value=/handle2)publicStringhandle2(@CookieValue(JSESSIONID)StringsessionId,@RequestHeader(Accept-Language)StringaccpetLanguage){...}参考《Spring3.x企业应用开发实战》通过注解绑定:小心抛出异常@RequestParam有以下三个参数。value:参数名。required:是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常。defaultValue:默认参数名,设置该参数时,自动将required设为false。极少情况需要使用该参数,也不推荐使用该参数。@RequestMapping(value=/handle1)publicStringhandle1(@RequestParam(userName)StringuserName,){...}上面的处理方法,如果HTTP请求不包含“userName”参数时,将产生异常!!因此,如果不能保证存在”userName”的参数,必须使用:@RequestParam(value=userName,required=false)参考《Spring3.x企业应用开发实战》使用命令/表单对象绑定所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干属性的POJO。SpringMVC按:“HTTP请求参数名=命令/表单对象的属性名”的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。@RequestMapping(value=/handle14)publicStringhandle14(Useruser){…}user