1. RESTful

RESTful 全称为:representational state transfer,即表现层状态转移,它只是一种风格,而非其他什么的,符合 RESTful 风格的 API 就可以成为 RESTful API。具体关于该概念的解释可以参考本文

比如说对于以下定义的 Controller截屏2021-12-12 下午10.16.27.png如果不使用 @PathVariable 注解,那么通过请求 localhost:10086/commit?p1=1&p2=2 就可以跳转到视图 hello 进行结果的展示。如果使用了 @PathVariable 注解,那么 url 就可以变为 localhost:10086/commit/1/2 这种风格。

此外,对于资源的操作,在 RESTful 风格中是不允许存在的,比如说 HTTP 请求方法中的 POST/DELETE/PUT/GET 分别代表着对资源的 CRUD 操作,而操作的具体方法是不允许出现在 RESTful 风格的 api 中的,只出现名次,不能出现动词是符合 RESTful 风格的基本。而在 SpringMVC 中,提供了对应不同请求方法的注解。

  • GetMapping:等价于 RequestMapping(method=RequestMethod.GET)
  • PostMapping
  • PutMapping
  • DeleteMapping
  • PatchMapping


2. 结果跳转

2.1 ModelAndView

设置 ModelAndView 对象,根据 view 的名称与视图解析器跳转到指定的页面。
页面:prefix + viewname + suffix

2.2 Servlet API

通过设置 ServletApi,就不需要视图解析器了。

  1. 通过 HttpServletResponse 进行输出
  2. 通过 HttpServletResponse 进行重定向
  3. 通过 HttpServletRequest 进行转发

2.3 SpringMVC

通过SpringMVC来实现转发与重定向,同样也不需要视图解析器。只需要在路径前加上 forwardredirect 即代表转发或重定向。
截屏2021-12-12 下午10.53.51.png

3. 数据处理

3.1 处理提交数据

  • 前端提交的属性名称与后端方法参数名一致(localhost:10086/hello?name=tianyichen),控制台输出:tianyichen

截屏2021-12-13 上午1.31.41.png

  • 前端提交的属性名称与后端方法参数名不一致,需要后端给方法参数添加 @RequestParam,其目的就是使得在参数名不一致的情况下,能够成功匹配

截屏2021-12-13 上午1.36.41.png

  • 前端提供的是一个对象,可以分别将对象的属性作为参数传递给后端,后端会根据参数的情况来构造对象,比如前端请求了如下 url:http://localhost:10086/user?id=1&age=26&name=xiaotian,后端代码如下图,那么后台输出:User(id=1, name=xiaotian, age=26)。使用这种方式,要保证参数名与对象的属性名一致,否则就拿不到传过来的值

截屏2021-12-13 上午1.48.57.png截屏2021-12-13 上午1.45.02.png

3.2 数据展示到前端

  • Model:只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解
  • ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性
  • ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

3.3 乱码问题

乱码问题的解决很简单,只需要在 web.xml 中导入一个 SpringMVC 提供的过滤器即可。

  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>encoding</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>