springmvc之RestFul和拦截器

一:什么是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代理的通知的实现

二,拦截器的配置文件

猜你喜欢

转载自www.cnblogs.com/liyunfeng-deng/p/10289542.html