一、SpringMVC概述

spring为展现层提供的基于MVC设计理念的优秀Web框架,是目前最主流的MVC框架之一,通过一套MVC注解可以让POJO称为处理请求的控制器,而无需实现任何借口,支持REST风格的URL请求。

二使用 @RequestMapping 映射请求

1Spring MVC 使用 @RequestMapping 注解为控制器指定可
以处理哪些 URL 请求

2 在控制器的类定义及方法定义处都可标注@RequestMapping

– 类定义处:
提供初步的请求映射信息。相对于 WEB 应用的根目录

– 方法处:
提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相 对于WEB 应用的根目录

1 DispatcherServlet 截获请求后,就通过控制器上
@RequestMapping 提供的映射信息确定请求所对应的处理
方法

2 @RequestMapping 除了可以使用请求 URL 映射请求外,
还可以使用请求方法、请求参数及请求头映射请求

3@RequestMapping 的 value、method、params 及 heads 分别表示请求 URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。

springmvc禁止来访ip springmvc可以拦截的请求路径_表单

三、使用@PathVariable映射URL绑定的占位符

1带占位符的 URL 是 Spring3.0 新增的功能,该功能在
SpringMVC 向 REST 目标挺进发展过程中具有里程碑的
意义
2 通过 @PathVariable 可以将 URL 中占位符参数绑定到控
制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。

springmvc禁止来访ip springmvc可以拦截的请求路径_MVC_02

四、REST

即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用

就是 HTTP 协议里面,四个表示操作方式的动 词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获 取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

HiddenHttpMethodFilter:浏览器 form 表单只支持 GET
与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0 添加了一个过滤器,可以将这些请求转换
为标准的 http 方法,使得支持 GET、POST、PUT 与
DELETE 请求。

五、使用 @RequestParam 绑定请求参数值

• 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

– value:参数名

– required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

springmvc禁止来访ip springmvc可以拦截的请求路径_MVC_03


拓展:

使用 @RequestHeader 绑定请求报头的属性值

使用 @CookieValue 绑定请求中的 Cookie 值

六、使用 POJO 对象绑定请求参数值

Spring MVC 会按请求参数名和 POJO 属性名进行自动匹
配,自动为该对象填充属性值。支持级联属性。
如:dept.deptId、dept.address.tel 等

七、使用 Servlet API 作为入参

MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数:
• HttpServletRequest
• HttpServletResponse
• HttpSession
• java.security.Principal
• Locale
• InputStream
• OutputStream
• Reader
• Writer

八、处理模型数据

Spring MVC 提供了以下几种途径输出模型数据:

ModelAndView: 处理方法返回值类型为 ModelAndView时, 则其既包含视图信息,也包含模型数据信息方,法体即可通过该对象添加模型数据

MapModel: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性

@ModelAttribute: 方法入参标注该注解后, 入参的对象
就会放到数据模型中

九、关于重定向

1 一般情况下,控制器方法返回字符串类型的值会被当成逻
辑视图名处理

2如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和redirect: 当成指示符,其后的字符串作为 URL 来处理

– redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
– forward:success.jsp:会完成一个到 success.jsp 的转发操作

十、使用 Spring 的表单标签

1 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显

2一般情况下,通过 GET 请求获取表单页面,而通过POST 请求提交表单页面,因此获取表单页面和提交表单 页面的 URL 是相同的。只要满足该最佳条件的契约,form:form 标签就无需通过 action 属性指定表单提交的 URL

3 可以通过 modelAttribute 属性指定绑定的模型属性,若没有指定该属性,则默认从 request 域对象中读取command 的表单 bean,如果该属性值也不存在,则会 发生错误

十一、数据转换

Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。

自定义类型转换器

1 ConversionService 是 Spring 类型转换体系的核心接口。

2 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出IOC 容器中的ConversionService,并在 Bean 属性配置及Spring MVC 处理方法入参绑定等场合使用它进行数据的转换

3 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

• Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactroyBean 中:

1 Converter<S,T>:将 S 类型对象转为 T 类型对象

2 ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类 (Integer、Long、Double 等)对象)可使用该转换器工厂类

3 GenericConverter:会根据源类对象及目标类对象所在的宿主类 中的上下文信息进行类型转换

十二、JSR 303

JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,
它已经包含在 JavaEE 6.0 中,JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证

springmvc禁止来访ip springmvc可以拦截的请求路径_处理方法_04


Hibernate Validator 扩展注解

Hibernate Validator 是 JSR 303 的一个参考实现,除支持

所有标准的校验注解外,它还支持以下的扩展注解

springmvc禁止来访ip springmvc可以拦截的请求路径_springmvc禁止来访ip_05


Spring 4.0 拥有自己独立的数据校验框架,同时支持 JSR
303 标准的校验框架。Spring 本身并没有提供 JSR303 的实现,所以必须将JSR303 的实现者的 jar 包放到类路径下。

十三、HttpMessageConverter

HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

– 使用 @RequestBody / @ResponseBody 对处理方法进行标注
– 使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值

当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错

十四、自定义拦截器

Spring MVC也可以使用拦截器对请求进行拦截处理,用户
可以自定义拦截器来实现特定的功能,自定义的拦截器必
须实现HandlerInterceptor接口

1 preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对 请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返true;如果程序员决定不需要再调用其他的组件 去处理请求,则返回false。

2 postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对 用户请求request进行处理。

3 afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

课后拓展

Spring 的 IOC 容器不应该扫描 SpringMVC 中的 bean, 对应的SpringMVC 的 IOC 容器不应该扫描 Spring 中的 bean

• 多个 Spring IOC 容器之间可以设置为父子关系,以实现良好的解耦。
• Spring MVC WEB 层容器可作为 “业务层” Spring 容器的子容器:即 WEB 层容器可以引用业务层容器的 Bean,而业务层容器却访问不到 WEB 层容器的 Bean

SpringMVC 对比 Struts2

  1. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
  2. Spring MVC 会稍微比 Struts2 快些. Spring MVC 是基
    于方法设计, 而 Sturts2 是基于类, 每次发一次请求都会实
    例一个 Action.
  3. Spring MVC 使用更加简洁, 开发效率Spring MVC确实
    比 struts2 高: 支持 JSR303, 处理 ajax 的请求更方便
  4. Struts2 的 OGNL 表达式使页面的开发效率相比
    Spring MVC 更高些.