当前位置: 首页 > news >正文

【JAVA】SrpingMVC(上)—— 注解请求与响应

目录

【SpringMVC】

【开发流程】

【使用】

【注解】

【@Controller】

【@RequestMapping】

【@ResponseBody】

【AbstractDispatcherServletInitializer类】

【三个接口方法可实现】

【Controller加载控制】

【@ComponentScan】

【bean的加载格式】

【Postman】

【请求与响应】

【请求映射路径】

【@RequestMapping】

【请求方式】

【Get请求】

【Post请求】

【接收】

【请求参数】

【普通参数】

【POJO参数】

【嵌套pojo参数:POJO对象中包含POJO对象】

【数组参数】

【集合保存普通参数】

【json数组】

【json对象(POJO)】

【json数组(POJO)】

【日期类型参数】

【响应】

【响应页面】

【响应文本数据】

【响应Json数据(对象转json)】

【响应Json数据(对象集合转json数组)】


【SpringMVC】

【概述】

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

【优点】

  • 使用简单,开发便捷(相比于Servlet)
  • 灵活性强

【开发流程】

  1. 创建web工程(Maven结构)
  2. 设置tomcat服务器,加载web工程(tomcat插件)
  3. 导入坐标(SpringMVC+Servlet)
  4. 定义处理请求的功能类(UserController
  5. 设置请求映射(配置映射关系)
  6. 将SpringMVC设定加载到Tomcat容器中

【使用】

1、导入SpringMVC坐标与Servlet坐标

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
 

2、初始化SpringMVC环境(同Spring环境)

@Configuration
public class SpringMvcConfig {
}

3、创建SpringMVC控制器,设定请求方法的返回值为字符串类型,并返回自定义json数据

@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'info':'SpringMVC'}";
    }
}

4、设定SpringMVC加载对应的bean

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

5、初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载SpringMVC对应的容器对象
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    //设置SpringMVC所管理的请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //加载Spring对应的容器对象
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

【注解】

【@Controller】

  • 名称:@Controller
  • 类型:类注解
  • 作用:设定SpringMVC的核心控制器bean

例:

@Controller
public class UserController {
}

【@RequestMapping】

  • 名称:@RequestMapping
  • 类型:方法注解
  • 作用:设置当前控制器方法请求访问路径

例:

@RequestMapping("/save")
public void save(){
    System.out.println("user save ...");
}

【相关属性】

value(默认):请求访问路径

【@ResponseBody】

  • 名称:@ResponseBody
  • 类型:方法注解
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析

例:

@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'info':'SpringMVC'}";
    }
}

【AbstractDispatcherServletInitializer类】

【概述】

SpringMVC提供的快速初始化Web3.0容器的抽象类

【三个接口方法可实现】

1、createServletApplicationContext()方法

【作用】

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

例:

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

2、getServletMappings()方法

【作用】

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

例:

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

3、createRootApplicationContext()方法

【作用】

如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()

例:

    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

【Controller加载控制】

Spring相关bean加载控制

  • 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
  • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
  • 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

【@ComponentScan】

  • 名称:@ComponentScan
  • 类型:类注解

例:

@Configuration
@ComponentScan(value = "com.itheima",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)
public class SpringConfig {
}

【属性】

  • excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes
  • includeFilters:加载指定的bean,需要指定类别type)与具体项classes

【bean的加载格式】

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

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

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

简化:

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
}

【Postman】

【概述】

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件

【作用】

常用于进行接口测试

【请求与响应】

【请求映射路径】

【@RequestMapping】

  • 名称:@RequestMapping
  • 类型:方法注解  类注解
  • 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
  • 属性:value(默认):请求访问路径或访问路径前缀

例:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'user save'}";
    }
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user delete...");
        return "{'module':'user delete'}";
    }
}

【请求方式】

【Get请求】

普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

【Post请求】

普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

【Post请求中文乱码处理】

为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

    // 配字符编码过滤器
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }

【注意】

多个过滤器写法:{filter1,filter2,...}

【接收】

Get和Post请求的接收参数方法一致

    //普通参数
    @RequestMapping("/commonParam")
    @ResponseBody
    public String commonParam(String name, int age) {
        System.out.println("普通参数传递 name==>" + name);
        System.out.println("普通参数传递 age==>" + age);
        return "{'module':'common param'}";
    }

【请求参数】

【种类】

【普通参数】

url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数,若请求参数名与形参变量名不同,使用@RequestParam绑定参数关系

    //普通参数不同名
    @RequestMapping("/commonParamDifferentName")
    @ResponseBody
    public String commonParamDifferentName(@RequestParam("name") String username, int age) {
        System.out.println("普通参数传递 name==>" + username);
        System.out.println("普通参数传递 age==>" + age);
        return "{'module':'common param different name'}";
    }

【@RequestParam】

  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:绑定请求参数与处理器方法形参间的关系
  • 参数:
  • required:是否为必传参数
  • defaultValue:参数默认值

【POJO参数】

请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

    //pojo参数
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user) {
        System.out.println("pojo参数传递 user==>" + user);
        return "{'module':'pojo param'}";
    }

【嵌套pojo参数:POJO对象中包含POJO对象】

请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

    //pojo嵌套参数
    @RequestMapping("/pojoContainPojoParam")
    @ResponseBody
    public String pojoContainPojoParam(User user) {
        System.out.println("pojo嵌套pojo参数传递 user==>" + user);
        return "{'module':'pojo contain pojo param'}";
    }

【数组参数】

请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

    //数组参数
    @RequestMapping("/arrayParam")
    @ResponseBody
    public String arrayParam(String[] likes){
        System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
        return "{'module':'array param'}";
    }

【集合保存普通参数】

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系

    //集合参数
    @RequestMapping("/listParam")
    @ResponseBody
    public String listParam(@RequestParam List<String> likes) {
        System.out.println("集合参数传递 likes ==> " + likes);
        return "{'module':'list param'}";
    }

【json数组】

1、添加json数据转换坐标

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>

 2、开启自动转换json数据的支持

【@EnableWebMvc】

  • 类型:配置类注解
  • 作用:开启SpringMVC多项辅助功能

例:

@EnableWebMvc
public class SpringMvcConfig {
}

3、设置发送json数据(请求body中添加json数据)

4、设置接收json数据

    //集合参数:Json格式
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes) {
        System.out.println("list common(json)参数传递 likes ==> " + likes);
        return "{'module':'list common for json param'}";
    }

【@RequestBody】

  • 名称:@RequestBody
  • 类型:形参注解
  • 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

【json对象(POJO)】

POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

1、2、同【json数组】

3、设置发送json数据(请求body中添加json数据)

4、设置接收json数据

    //pojo参数:Json格式
    @RequestMapping("/pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user) {
        System.out.println("pojo(json)参数传递 user==>" + user);
        return "{'module':'pojo for json param'}";
    }

【json数组(POJO)】

POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

1、2、同【json数组】

3、设置发送json数据(请求body中添加json数据)

4、设置接收json数据

    //集合pojo参数:Json格式
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> list) {
        System.out.println("list pojo(json)参数传递 list ==> " + list);
        return "{'module':'list pojo for json param'}";
    }

【注意】

@RequestBody与@RequestParam区别

  • @RequestParam用于接收url地址传参,表单传参application/x-www-form-urlencoded
  • @RequestBody用于接收json数据application/json

【日期类型参数】

日期类型数据基于系统不同格式也不尽相同

  • 2088-08-18
  • 2088/08/18
  • 08/18/2088

接收形参时,根据不同的日期格式设置不同的接收方式

    //日期参数
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date, @DateTimeFormat(pattern = "yyyy-MM-dd") Date date1, @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2) {
        System.out.println("参数传递 date ==> " + date);
        System.out.println("参数传递 date(yyyy-MM-dd) ==> " + date1);
        System.out.println("参数传递 date(yyyy/MM/dd HH:mm:ss) ==> " + date2);
        return "{'module':'data param'}";
    }

【@DateTimeFormat】

  • 名称:@DateTimeFormat
  • 类型:形参注解
  • 作用:设定日期时间型数据格式
  • 属性:pattern:日期时间格式字符串

例:

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){
    System.out.println("参数传递 date ==> "+date);
    return "{'module':'data param'}";
}

【类型转换器:Converter接口】

public interface Converter<S, T> {
    @Nullable
    T convert(S var1);
}

【功能】

  • 请求参数年龄数据(String→Integer)
  • json数据转对象(json → POJO)
  • 日期格式转换(String → Date)

【注意】

@EnableWebMvc功能之一:根据类型匹配对应的类型转换器

使用类型转换器时要开启@EnablWebMvc

【响应】

【@ResponseBody】

  • 名称:@ResponseBody
  • 类型:方法注解
  • 作用:设置当前控制器返回值作为响应体

例:

@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("save...");
    return "{'info':'springmvc'}";
}

 【类型转换器:HttpMessageConverter接口】

public interface HttpMessageConverter<T> {
   boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
   boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
   List<MediaType> getSupportedMediaTypes();
   T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
         throws IOException, HttpMessageNotReadableException;
   void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
         throws IOException, HttpMessageNotWritableException;
}

【响应页面】

http://localhost:8080/toJumpPage
    //响应页面/跳转页面
    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("跳转页面");
        return "page.jsp";
    }

【响应文本数据】

    //响应文本数据
    @RequestMapping("/toText")
    @ResponseBody
    public String toText(){
        System.out.println("返回纯文本数据");
        return "response text";
    }

【响应Json数据(对象转json)】

    //响应POJO对象
    @RequestMapping("/toJsonPOJO")
    @ResponseBody
    public User toJsonPOJO(){
        System.out.println("返回json对象数据");
        User user=new User();
        user.setName("zhangsan");
        user.setAge(15);
        return user;
    }

【响应Json数据(对象集合转json数组)】

    //响应POJO对象
    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回json对象数据");
        User user1=new User();
        user1.setName("zhangsan");
        user1.setAge(15);
        User user2=new User();
        user2.setName("lisi");
        user2.setAge(12);
        List<User> userList=new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        return userList;
    }

相关文章:

  • ZZCMS201910代码审计
  • HTTPDNS
  • ApacheDBUtils的使用
  • 补涨行情的模式如何做?(几天几板模式)
  • 基于Levy飞行策略的改进樽海鞘群算法-附代码
  • 【CSDN高校社区无锡学院】# 新学期,新Flag # 开学季征文活动
  • Linux安装zlib、libpng、freetype给交叉编译工具链使用
  • 深度讲解指针的笔试题目
  • Python 环境安装系统教程——PyCharm
  • 都这麽大了还不快了解防火墙(1)?
  • Code For Better 谷歌开发者之声——谷歌Web工具包(GWT)
  • c++图解内存管理
  • 【微信小程序】自定义组件(二)
  • 基于SSM的水果商城
  • Ubuntu20.04美化成mac OS苹果风格
  • 2017年终总结、随想
  • avalon2.2的VM生成过程
  • JavaScript对象详解
  • leetcode-27. Remove Element
  • Python进阶细节
  • vue中实现单选
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 你真的知道 == 和 equals 的区别吗?
  • 前端路由实现-history
  • 如何解决微信端直接跳WAP端
  • No resource identifier found for attribute,RxJava之zip操作符
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • PostgreSQL之连接数修改
  • ​linux启动进程的方式
  • #、%和$符号在OGNL表达式中经常出现
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)JPA - JQPL 实现增删改查
  • (转)【Hibernate总结系列】使用举例
  • (转)四层和七层负载均衡的区别
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Framework .NET Core与 .NET 的区别
  • .NET gRPC 和RESTful简单对比
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Autowired和@Resource装配
  • [20150629]简单的加密连接.txt
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BeginCTF]真龙之力
  • [CC-FNCS]Chef and Churu
  • [CentOs7]iptables防火墙安装与设置
  • [ES-5.6.12] x-pack ssl