Restful风格
Restful是一种软件设计规范,是客户端和服务端进行数据交互的一个规范。早期使用jsp页面开发网页,数据交互基本都是通过表单提交,然后通过内置对像传递,当HTML5兴起,移动互联网兴起,网站后端服务,不仅要考虑PC端的网页,也要考虑移动端数据的展示、小程序、HTML5页面等。如果需要多个终端(Android、iOS、小程序、Pad、HTML5页面)共用一个后端,一般来说主流方案就是使用JSON进行传递。RESTful则规范了请求的URL,注意RESTful只是一个规范,不是一个技术。
在Restful中:
1.一个URL操作一个资源
2.请求的URL不能有动词
3.使用HTTP的请求方式来描述请求行为
在restful接口中,所有的方法都是返回json数据,没有返回页面(modelandview),因此,所有的方法上面都要添加@restponsebody注解。一个代替的简单方案,是使用@RestController代替@Controller,@RestController是一个组合注解,是@Controller和@ResponseBody的组合:
案例
package com.sxt;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.sxt.bean.Book;
@RestController
public class Conreoller {
@PostMapping("/book")
@ResponseBody
public void getbook(@RequestBody Book book){
System.out.println(book);
}
@GetMapping("/book/{id}")
@ResponseBody
public void getbookid(@PathVariable Integer id){
System.out.println(id);
}
@DeleteMapping("/book/{id}")
@ResponseBody
public void getbookid1(@PathVariable Integer id){
System.out.println(id);
}
@PutMapping("/book")
@ResponseBody
public void getbookid1(@RequestBody Book book){
System.out.println(book);
}
}
二,拦截器
1.简介
SpringMVC中的拦截器对应了Web基础中的过滤器,过滤器和拦截器的区别:
序号 | 区别 |
---|---|
1 | 一般来说,如果使用了SpringMVC框架,然后有拦截的需求,建议使用拦截器而不是过滤器 |
2 | 过滤器依赖于Servlet容器,而拦截器是SpringMVC自带的,不依赖于容器 |
3 | 拦截器的功能更加强大,因为拦截器是一种AOP风格的过滤器 |
使用(定义拦截器)
package com.sxt.fifle;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义拦截器
* @author Administrator
*
*/
public class MyFifle implements HandlerInterceptor{
/**
* 进入Handler之前调用的方法
* 处理:
* 用于身份确认和授权
* 比如确认当前请求是否登陆,如果登陆就方法,否则拦截跳回登陆界面
* @return
* true 放过
* false 拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行了");
return true;
}
/**
* 进入Handler之后,返回ModelAndView对象之前执行
* 可以修改调整的视图
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("中间执行了");
modelAndView.setViewName("/user.jsp");
}
/**
* 执行完成Handler之后执行此方法,
* 应用场景:
* 统一异常处理,统一日志处理,资源释放
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("末尾执行了");
}
}
第一个拦截器的preHandle方法返回false(后面方法都没有执行了):
preHandle
第一个拦截器的preHandle方法返回true,
第二个拦截器的preHandle方法返回false,此时,第一个拦截器的afterCompletion方法执行了,第二个拦截器的preHandle方法执行了。
规则:1. 所有拦截器的preHandle方法返回true时,postHandle方法才会执行。
2. 拦截器自己的preHandle方法返回true时,后面的拦截器才会执行,同时他自己的afterCompletion也会执行。
3. 拦截器的执行顺序和xml中的定义顺序有关。(preHandle按照定义的顺序执行,postHandle和afterCompletion执行顺序与定义顺序相反)
配置拦截条件
<!-- 开启SpringMVC注解的方式 -->
<mvc:annotation-driven >
</mvc:annotation-driven>
<!-- 开启扫描 -->
<context:component-scan base-package="com.sxt"/>
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- ** 表示当前目录及其子目录路径 -->
<mvc:mapping path="/**"/>
<!-- 自定义拦截器的全路径 -->
<bean class="com.sxt.fifle.MyFifle"/>
</mvc:interceptor>
</mvc:interceptors>
测试
但是在拦截器修改了页面