• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spring MVC基础知识回顾2

武飞扬头像
专业bug开发
帮助1

前言

学习内容

了解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框架做一个项目实战,一起来看看吧~

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgeiefk
系列文章
更多 icon
同类精品
更多 icon
继续加载