SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解

目录
  • 前言
  • 一.bean的加载控制
  • 二.容器加载
    • 1.createServletApplicationContext()方法
    • 2.createRootApplicationContext()方法
    • 3.getServletMappings()方法
  • 三.PostMan的引入
    • 1.发送GET请求
    • 2.发送POST请求
    • 3.中文乱码问题解决
  • 四.Rest风格
    • 1.REST简介
    • 2.RESTful传参
    • 3.RESTful简便形式(快速开发)
    • 4.放行静态资源

前言

从繁到简是贯彻SSM学习过程的原始真解

一.bean的加载控制

在MVC的模式中,Spring控制着业务和功能的bean,SpringMVC控制着表现层的bean,因为各自的作用不同,我们要避免Spring加载到SpringMVC控制的bean,如何实现?

方式一:

设定Spring的包扫描范围,排除表现层的bean所在的包

@ComponentScan({"com.yu7daily.service","com.yu7daily.dao"})
public class SpringConfig {...}

这样写的好处是可以适配所有的数据层技术通用性强,如果使用的是mybatis,他的自动代理为我们生成了对象可以不用扫描dao层对应的包

方式二:

按注解过滤掉bean,因为SpringMVC的配置类上存在@Controller注解,通过设置来过滤掉这个注解所在的类即可

@ComponentScan(value="com.yu7daily",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
//设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
//excludeFilters属性:排除扫描路径中指定类别加载的bean
//type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
//classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean

方式三:

将二者加载到同一个环境

二.容器加载

在web3.0中,提供了快速初始化web容器的方式——继承AbstractDispatcherServletInitializer类并重写其方法

1.createServletApplicationContext()方法

创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,从而将WebApplicationContext的作用范围提升至ServletContext范围,即 整个web容器范围

    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringmvcConfig.class);
        return ctx;
    }

2.createRootApplicationContext()方法

创建servlet容器时需要加载非springMVC对应的bean

    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

3.getServletMappings()方法

设定SpringNc对应的请求映射路径,设置为 / 后表示拦截所有请求,任意请求都将转入到SpringMVC进行处理

    protected String[] getServletMappings() { return new String[]{"/"}; }

这样每当我们启动服务器时,就会自动生成Spring和SpringMVC的容器,简化开发

上述不难发现,都是通过指定配置文件名来完成容器的加载,存在一定的硬编码问题,于是Spring为我们提供了更简单的加载方式——继承AbstractAnnotationConfigDispatcherServletInitializer即可

代码量显著减少,这种方式更值得使用!

三.PostMan的引入

一般向浏览器发送get请求比较容易,但发送post请求我们得另写表单,发送ajax请求得另写JS代码,十分麻烦,PostMan的诞生很好地解决了这一问题

它主要是用来模拟各种HTTP请求的(如:get/post/delete/put…等等).,而且与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果

1.发送GET请求

1.首先写好表现层

   @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name ,int age){
        System.out.println("传递的参数为 name ==> "+name);
        System.out.println("普通参数传递 age ==> "+age);
        return "Hello SpringMVC";
    }

2.在PostMan中发送请求

3.在IDEA中接收到了Postman发送过来的请求

2.发送POST请求

由于POST请求的参数处于请求体内,所以在Postman中要选择以body的形式发送

服务器端接受的数据如下:

3.中文乱码问题解决

当我将“pyq”改为“懒羊羊”后发送请求则会出现中文乱码问题

按照以往的套路,是在web服务器中添加一个过滤器即可,而在SpringMVC中将过滤器写在配置类中即可

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};   //若要配置多个过滤器,在数组中添加即可
    }

四.Rest风格

1.REST简介

REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格,按照这种风格来访问资源则称之为RESTful

当我们想表示一个网络资源的时候,可以使用两种方式:

1.传统风格资源描述形式

http://localhost/user/getById?id=1 查询id为1的用户信息

http://localhost/user/saveUser 保存用户信息

2.REST风格描述形式

http://localhost/user/1

http://localhost/user

传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,可以知道你进行的操作,使用rest风格后请求地址变的简单了,并且光看请求URL并不是很能猜出来该URL的具体功能

为了解决开发人员明白一个相同的url地址进行的是何种操作,按照REST风格访问资源时使用行为动作对资源操作进行了区分

http://localhost/users 查询全部用户信息 GET(查询)
http://localhost/users/1 查询指定用户信息 GET(查询)
http://localhost/users 添加用户信息 POST(新增/保存)
http://localhost/users 修改用户信息 PUT(修改/更新)
http://localhost/users/1 删除用户信息 DELETE(删除)

请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE

按照不同的请求方式代表不同的操作类型。

  • 发送GET请求是用来做查询
  • 发送POST请求是用来做新增
  • 发送PUT请求是用来做修改
  • 发送DELETE请求是用来做删除

值得注意的是:之所以称之为REST风格是因为只是一种"风格"而已,并不是规范,在实际开发中可以灵活变通,修改

2.RESTful传参

RESTful的传参方式稍微和上述有所不同,需要在@RequestMapping中指定请求行为和参数的名称,以post提交为例

    @RequestMapping(value = "/users/{age}",method = RequestMethod.POST)
    @ResponseBody
    public String save(@PathVariable Integer age){  //@PathVariable表示此参数由路径传递
        System.out.println("传参age");
        return "Hello SpringMVC";
    }

我们输入的路径相比之下就显得格外简洁,安全

同样也可以成功传送到服务器端

请求行为可以通过method灵活更改,但是设定好之后更改传递的方式就会报错,例如method=RequestMethod.POST却以GET的方式提交

@RequestParam 用于接收url地址传参或表单传参(非json格式)
@RequestBody 用于接收json数据(传参数>1)
@PathVariable 用于接收路径参数,使用{参数名称}描述路径参数(传参数较少)

@RequestParam、@RequestBody前面的文章有过介绍

3.RESTful简便形式(快速开发)

简化开发一般解决硬编码问题,例如:

每个方法的@RequestMapping注解中都定义了访问路径/books,@RequestMapping注解中都要使用method属性定义请求方式,响应json都需要加上@ResponseBody注解重复性太高

所以:

1.将@RequestMapping提到类上面,用来定义所有方法共同的访问路径。

2.使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替,设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求

3.将ResponseBody提到类上面,让所有的方法都有@ResponseBody的功能

4.使用@RestController注解替换@Controller与@ResponseBody注解,简化书写

就先这样:

public class QQ {
    @RestController //@Controller + ReponseBody
    @RequestMapping("/goodss")
    public class goodsController {
        @PostMapping
        public String save(@RequestBody Goods goods){
            System.out.println("goods save..." + goods);
            return "Hello SpringMVC";
        }
        @DeleteMapping("/{id}")
        public String delete(@PathVariable Integer id){
            System.out.println("goods delete..." + id);
             return "Hello SpringMVC";
        }
        @PutMapping
        public String update(@RequestBody Goods goods){
            System.out.println("goods update..." + goods);
             return "Hello SpringMVC";
        }
        @GetMapping("/{id}")
        public String getById(@PathVariable Integer id){
            System.out.println("goods getById..." + id);
             return "Hello SpringMVC";
        }
        @GetMapping
        public String getAll(){
            System.out.println("goods getAll...");
            return "Hello SpringMVC";
        }
    }
}

硬编码问题得到了极大的改善!这就是Restful的极速开发

4.放行静态资源

protected String[] getServletMappings() {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> return new String[]{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->"/"};}

因为上述拦截方法存在的原因,SpringMVC将所有请求都拿去处理(静态资源JS/CSS/HTML…)而这些本应是交给tomcat来处理,因此客户端就会出现404错误

所以,SpringMVC需要将静态资源进行放行

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

到此这篇关于SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解的文章就介绍到这了,更多相关SpringMVC加载控制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用postman进行接口自动化测试

    目录 一.接口结果判断 1.功能区 2.脚本相关 3.代码模板 二.集合(批量)测试 1.批量执行 2.变化的参数数据 1.使用变量 2.Pre-request Script 3.测试数据集 3.定期任务 三.请求依赖问题 1.接口执行顺序 2.数据传递 1.全局变量 2.多环境区分与切换 3.变量的创建 4.使用与切换 3.解决依赖问题 1.假设场景 2.思路 3.Postman 中的操作 4.运行并查看结果 我们先思考一下,如果需要达到自动化接口测试的效果,那么我们在基本的模拟请求上还需要

  • 使用Postman生成的okhttp代码依赖

    目录 Postman生成okhttp代码依赖 使用Postman快速生成代码 总结 Postman生成okhttp代码依赖 <dependency>             <groupId>com.squareup.okhttp3</groupId>             <artifactId>okhttp</artifactId>             <version>3.14.9</version>    

  • node.js+postman+mongodb搭建测试注册接口的实现

    目录 准备工作 下载安装Postman mongodb连接串配置 GET请求测试 注册接口搭建 创建User数据模型 使用body-parser中间件 POST请求测试 使用User数据模型 使用gravatar处理头像 准备工作 申请一个免费的MongoDB 到https://www.mlab.com注册申请一个500M的MongoDB数据库.登录后手动在创建Databases下的Collections中手动创建一个数据库node_app. 在个人首页点击Connect获取node.js连接M

  • 使用Postman测试需要授权的接口问题

    Postman是一款免费的http模拟请求工具,常用来测试开发接口.实际场景中,很多接口是需要授权才能使用.这就需要Postman获取授权,把返回的token保存,在调用其他接口时连同token一起传递. 我所在的项目基于spring全家桶,正常流程是:调用获取验证码接口 -> 登录接口 -> 调用业务接口 . 新建一个登录请求 "{{参数名}}"代表Postman的环境变量 captchaKey 调用获取验证码返回 captchaCode 验证码,因为是测试环境,固定88

  • Postman全局注册方法及对返回数据可视化处理

    目录 1.全局方法注册及使用 1.1 注册 1.2全局方法使用 2. 可视化 1.全局方法注册及使用 1.1 注册 在collection最外层中Pre-request Script中编写全局方法 // 开发者本机ip const globalDevIp = 'http://172.16.65.46:9191' // 全局变量 pm.globals.set("variable_key", "variable_value"); var moment = require

  • SpringMVC加载控制与Postmand的使用和Rest风格的引入及RestFul开发全面详解

    目录 前言 一.bean的加载控制 二.容器加载 1.createServletApplicationContext()方法 2.createRootApplicationContext()方法 3.getServletMappings()方法 三.PostMan的引入 1.发送GET请求 2.发送POST请求 3.中文乱码问题解决 四.Rest风格 1.REST简介 2.RESTful传参 3.RESTful简便形式(快速开发) 4.放行静态资源 前言 从繁到简是贯彻SSM学习过程的原始真解

  • 详解SpringMVC加载配置Properties文件的几种方式

    最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下SpringMVC加载配置Properties文件的几种方式 1.通过context:property-placeholde实现配置文件加载 1.1.在spring.xml中加入context相关引用 <?xml version="1.0" encoding="UTF-8&

  • Entity Framework加载控制Loading Entities

    Entity Framework允许控制对象之间的关系,在使用EF的过程中,很多时候我们会进行查询的操作,当我们进行查询的时候,哪些数据会被加载到内存中呢?所有的数据都需要吗?在一些场合可能有意义,例如:当查询的实体仅仅拥有一个相关的子实体时可以加载所有的数据到内存中.但是,在多数情况下,你可能并不需要加载全部的数据, 而是只要加载一部分的数据即可. 默认情况下,EF仅仅加载查询中涉及到的实体,但是它支持两种特性来帮助你控制加载: 1.贪婪加载 2.延迟加载 下面以客户类型.客户和客户邮件三个实

  • SpringMVC使用RESTful接口案例详解

    目录 一.准备工作 二.功能清单 三.具体功能-访问首页 一.准备工作 和传统 CRUD 一样,实现对员工信息的增删改查. ①搭建环境 添加相关依赖 web.xml springmvc.xml ②准备实体类 public class Employee { private Integer id; private String lastName; private String email; //1 male, 0 female private Integer gender; public Integ

  • springMVC引入Validation的具体步骤详解

    本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力.特别提及:非基本类型属性的valid,GET方法的处理,validation错误信息的统一resolve. 本文中validation的实际实现委托给Hibernate validation处理 基本配置 pom引入maven依赖 <!-- validation begin --> <dependency> <groupId>javax.validation<

  • SpringMVC bean实现加载控制方法详解

    目录 1.Spring配置类排除加载SpringMVC的bean 2.Servlet容器配置类简洁开发 1.Spring配置类排除加载SpringMVC的bean SpringMVC 通常只需要加载 controller 包内的 bean,而 Spring 需要加载 dao 和 service 包内的 bean,为了省事,Spring 配置类经常设置扫描的包为一个大范围的包(包含 dao 和 service 在内的包),此时 Spring 会错误或者多余地加载到 controller 包内的 b

  • SpringBoot Bean被加载时进行控制

    目录 序章 加载控制@Conditional派生注解 这是我未加控制前的代码 控制后 bean依赖的属性配置 序章 简介:bean的加载控制指根据特定情况对bean进行选择性加载以达到适用项目的目标. 根据之前对bean加载的八种方式,其中后面四种是可以对bean被加载时进行控制. 我拿第六种来举个例子. 之前也举过例子,但是实际开发呢,一般不会那么使用. import org.springframework.context.annotation.ImportSelector; import o

  • 浅析Angular2子模块以及异步加载

    用Angular2开发一个大型的应用,我们通常都需要分模块进行开发.例如将某一个功能的相关页面和功能放在一个模块里面,这样既可以实现系统的松耦合,给开发和后期的维护带来很大的便利.同时,对于子模块,我们还可以使用延时加载,这样可以减少初始加载的文件的大小.在这篇文章中,我们就来看看在Angular2框架下怎么实现子模块及其延时加载. 可以在这里查看本文使用的实例.该实例基于上篇文章Angular2使用Guard和Resolve进行验证和权限控制 所用的实例,并在它基础上添加了一个lazy的模块,

  • Spring实现上拉刷新和下拉加载效果

    本文实例为大家分享了Spring实现上拉刷新和下拉加载效果,供大家参考,具体内容如下 导依赖: compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.liaoinstan.springview:library:1.3.0' compile files('libs/glide-3.7.0.jar') activity_main布局 <?xml version="1.0" encoding="ut

  • Spring加载properties文件的两种方式实例详解

    在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修改源代码,这样更加方便.在Spring中也可以这么做,而且Spring有两种加载properties文件的方式:基于xml方式和基于注解方式.下面分别讨论下这两种方式. 1. 通过xml方式加载properties文件 我们以Spring实例化dataSource为例,我们一般会在beans

随机推荐