一:什么是Restful?
Restful就是开发人员都默认和准守的一种对于url请求的一种规范;因为随着HTML5的兴起,数据的提交已经不仅仅局限在表单了,如果需要多个终端来公用一个后端,一般来说主流的设计方案就是使用json数据来传递。
在Restful中:
1,一个url操作一个资源;
2,使用http的请求方式来描述请求的行为;例如:
GET(查) http://localhost:8080/book/1 查询id为1的书
POST(增) http://localhost:8080/book/1 添加一本书,书的id为1
DELETE(删) http://localhost:8080/book/1 删除id为1的书
PUT(改) http://localhost:8080/book/1 修改id为1的书
在RESTful接口中,所有的方法都是返回JSON,没有返回页面的(ModelAndView),因此,所有的方法上都需要添加@ResponseBody注解。一个替代的简化方案,是使用 @RestController 代替@Controller。@RestController实际上是一个组合注解,是@Controller和@ResponseBody的组合:
使用Restful规范需要注意的地方是:
第一:可以不使用通过的映射@RequestMapping;而使用专门的映射来处理不同的请求;例如
@GetMapping专门来处理get请求的
@PostMapping专门处理post请求的
@DeleteMapping
@PutMapping;功能与上面的规范相对应。
第二:请求的参数如何获取;这个与利用通用的映射处理有一点区别:这里还需要用到一个@PathVariable的注解
在获取请求参数的时候要注意两点:一是在形参中的定义,而是在映射中的定义要获取的参数
当有一个请求的参数时:
1 /** 2 * 演示利用Restful规范请求数据;这里是单个的,如果有多个数据 3 * @return 4 */ 5 @GetMapping("/book/{id}") 6 @ResponseBody 7 public Map<String, Object> fun1(@PathVariable int id){ 8 System.out.println(id+"--->"); 9 Map<String, Object> map=new HashMap<>(); 10 map.put("id", 1); 11 map.put("name", "张三"); 12 map.put("age", 20); 13 map.put("address", "深圳尚学堂"); 14 return map; 15 }
当有多个请求的时候:
1 /** 2 * 演示利用Restful规范请求数据;多个数据的时候,可以在请求处理后面进行拼接多个 3 * @return 4 */ 5 @GetMapping("/book/{id}/{book}") 6 @ResponseBody 7 public Map<String, Object> fun2(@PathVariable int id,@PathVariable String book){ 8 System.out.println(id+"--->"+book); 9 Map<String, Object> map=new HashMap<>(); 10 map.put("id", 1); 11 map.put("name", "张三"); 12 map.put("age", 20); 13 map.put("address", "深圳尚学堂"); 14 return map; 15 }
第三:要注意的是利用Restful规范之后在get请求的时候地址已经发生了变化
原来的get请求的地址输入的参数为:http://localhost:8080/web-3-springmvc-restful/book/?id=1&username=java
利用Restful的get请求的地址输入的参数为:http://localhost:8080/web-3-springmvc-restful/book/199/java
第四:其他的请求与get请求的改变大同小异。
二:拦截器
拦截器和过滤器的区别?
1,一般来说在springmvc框架中建议使用拦截器而不是过滤器,
2,过滤器依赖servlet,而拦截器是springmvc自带的,不依赖容器
3,拦截器的功能更为强大,体现了AOP的设计思想
拦截器的使用:
第一步:先创建一个拦截器实现HandlerInterceptor,这个接口里面有三个方法可以供我们使用
代码如下:
1 /** 2 * 3 */ 4 package com.sxt.interceptor; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.springframework.web.servlet.HandlerInterceptor; 10 import org.springframework.web.servlet.ModelAndView; 11 12 /** 13 * @author ASUS 14 * 第一步创建的拦截器实现了HandlerInterceptor 15 * 第二步:配置拦截器 16 * 17 */ 18 public class MyInterceptor implements HandlerInterceptor{ 19 20 /** 21 * 该方法是在处理器适配器执行之前执行的,所以请求没有被处理 22 * false:表示是在适配器执行之前执行 23 * true:否,就是放过 24 * handler:表示的地址是java.lang.String com.sxt.controller.MyController.query();该请求 25 */ 26 @Override 27 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 28 throws Exception { 29 // TODO Auto-generated method stub 30 System.out.println("preHandle"+handler); 31 return true; 32 } 33 34 /** 35 * 该方法是在返回ModelAndView之前执行的;因此可以在该方法中对返回的ModelAndView做出改变 36 * 包括返回的数据和页面 37 */ 38 @Override 39 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 40 ModelAndView modelAndView) throws Exception { 41 // TODO Auto-generated method stub 42 if(modelAndView !=null) { 43 modelAndView.setViewName("/user.jsp"); 44 } 45 System.out.println("postHandle"); 46 } 47 /** 48 * 该方法是在ModelAndView返回之后执行的,因此只能做一些页面的装饰和渲染,资源的释放,日志管理等 49 */ 50 51 @Override 52 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 53 throws Exception { 54 // TODO Auto-generated method stub 55 System.out.println("afterCompletion"); 56 } 57 58 }
第二步:在springmvc配置文件中配置拦截器
1 <!-- 配置拦截器 组--> 2 <mvc:interceptors> 3 <!-- 配置拦截器 --> 4 <mvc:interceptor> 5 <!-- 配置拦截的映射 拦截当前目录以及子目录--> 6 <mvc:mapping path="/**"/> 7 <!-- 注入自定义额拦截器 --> 8 <bean class="com.sxt.interceptor.MyInterceptor"> </bean> 9 </mvc:interceptor> 10 </mvc:interceptors>
第三步:测试三个方法的功能:
1 /** 2 * 3 */ 4 package com.sxt.controller; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 @Controller 8 public class MyController { 9 @RequestMapping("/query") 10 public String query() { 11 System.out.println("------------"); 12 return "/index.jsp"; 13 } 14 }
拦截器使用的方法:
一搞清楚三个方法的作用:可以类比AOP代理的通知的实现
二,拦截器的配置文件
原文地址:https://www.cnblogs.com/liyunfeng-deng/p/10289542.html