Spring MVC基础知识回顾(2)

前言

上一篇我们一起入门了Spring MVC的使用,接下来我们将进一步学习Spring MVC的使用,冲冲冲~

学习内容

了解RESTful

RESTful开发风格
  • 传统web开发
    在这里插入图片描述
  • TESTful风格(前后端分离)
    在这里插入图片描述
RESTful开发规范
  • 使用URL作为用户交互入口
  • 明确的语义规范(GET|POST|PUT|DELETE)
  • 只返回数据(JSON|XML),不包含任何展现
RESTful命名要求

在这里插入图片描述

第一个RESTful应用

请添加图片描述
请添加图片描述

@RestController注解与路径变量

请添加图片描述
请添加图片描述

// POST /restful/request/100
@PostMapping("/request/{rid}")
//@ResponseBody
public String doPostRequest(@PathVariable("rid") Integer requestId, Person person){
    System.out.println(person.getName() + ":" + person.getAge());
    return "{\"message\":\"数据新建成功\",\"id\":" + requestId + "}";
}

简单请求与非简单请求

在这里插入图片描述

对于非简单请求,例如PUT或者DELETE,需要在web.xml引入如下代码扩展:

<filter>
    <filter-name>formContentFilter</filter-name>
    <filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>formContentFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

JSON序列化

  • pom.xml引入所需的jar包
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.9</version>
</dependency>
  • 编写测试
    请添加图片描述
    JSON对于时间格式数据返回不友好!!!添加注解解决请添加图片描述

浏览器同源策略

  • 同源策略阻止从一个域加载的脚本去获取另一个域上的资源
  • 只要协议、域名、端口有任何一个不同,都被当做是不同的域
  • 浏览器Console看到Access-Control-Allow-Origin就代表跨域了

HTML允许跨域的标签:

  • <img>-显示远程图片
  • <script>-加载远程JS
  • <link>-加载远程CSS

Spring MVC跨域访问

CORS跨域资源访问

  • CORS是一种机制,使用额外的HTTP头通知浏览器可以访问其他域
  • URL响应头包含Access-Control-*指明请求允许跨域

方法1. 使用 @CrossOrigin注解
请添加图片描述

方法2. 全局配置跨域
请添加图片描述

Spring MVC拦截器

  • 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
  • Interceptor与Filter用途相似,但实现方法不同
  • 底层基于Spring AOP面向切面编程实现

拦截器开发流程

  • maven引入依赖servlet-api
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

请添加图片描述

  • 实现HandlerInterceptor接口

该接口有三个方法:

  1. preHandle——前置执行处理
  2. postHandle——目标资源已经被Spring MVC框架处理
  3. afterCompletion——响应文本已经产生
public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURL() + "-准备执行");
//        response.getWriter().print("[]");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(request.getRequestURL() + "-目标处理成功");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(request.getRequestURL() + "-响应内容已产生");
    }
}

请添加图片描述

  • applicationContext配置过滤地址

请添加图片描述

拦截器使用细则

根据上面的方式我们设置拦截器,你会发现我们的拦截器对于页面加载的静态资源也进行了拦截,这是我们不希望看到的,所以我们实际开发过程中往往会这样设置。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/restful/**"/>
        <mvc:mapping path="/webapi/**"/>
        <mvc:exclude-mapping path="/**.ico"/>
        <mvc:exclude-mapping path="/**.jpg"/>
        <mvc:exclude-mapping path="/**.gif"/>
        <mvc:exclude-mapping path="/**.js"/>
        <mvc:exclude-mapping path="/**.css"/>
        <mvc:exclude-mapping path="/resources/**"/>
        <bean class="com.imooc.restful.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

在这里插入图片描述

用户流量拦截器

public class AccessHistoryInterceptor implements HandlerInterceptor {
    private Logger logger = LoggerFactory.getLogger(AccessHistoryInterceptor.class);

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        StringBuilder log = new StringBuilder();
        log.append(request.getRemoteAddr());
        log.append("|");
        log.append(request.getRequestURL());
        log.append("|");
        log.append(request.getHeader("user-agent"));
        logger.info(log.toString());
        return true;
    }
}

Spring MVC处理流程

在这里插入图片描述

总结

OK,到这里我们的Spring MVC基本就已经学完了。综合前面学过的Mybatis和Spring,我们就已经学会了SSM框架,后续我也会使用SSM框架做一个项目实战,一起来看看吧~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值