SpringMvc-改良替换servlet(controller)

1.大体概述

新增注解

1.@controller    //  类上  controller层的bean类
2.@RequestMapping("/xx") //类上和方法上 路径请求前缀
3.@RsponseBody  //类上 给浏览器返回指定json数据(本质上是字符串信息)
4.@RestController // 类注解  等同于@Controller与@ResponseBody两个注解组合功能
5.@RequsestParam("xx name")//参数注解: 参数中当请求参数名与形参变量名不同 别名关联
6.@EnableWebMvc //配置类  开启json数据类型自动转换
7.@RequestBody //参数注解  接受浏览器给我们的数据是json
8.@PathVariable //参数注解 绑定路径参数与处理器方法形参间的关系 出现根据id查询或者根据id删除使用
9.@GetMapping(查询)  @PostMapping(增加)  @PutMapping(修改)  @DeleteMapping(删除) //方法注解

@RequestBody、@RequestParam、@PathVariable区别和应用

1.区别
  @RequestParam用于接收url地址传参或表单传参
  @RequestBody用于接收json数据 3种接受数据
  @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
2.应用
  1.后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
  2.如果发送非json格式数据,选用@RequestParam接收请求参数
  3.采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
1.springMVC概述
1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
2. 优点
   1. 使用简单,开发便捷(相比于Servlet):接受请求参数 和响应结果
   1. 灵活性强
   
SpringMvc就是让我们编写一个个的Controller,相当于以前的servlet
处理请求,通常将结果转换成json响应给客户端
2.在Controller中如何定义访问路径,如何响应数据?
在controller下的方法上写@RequestMapping("/save")  设置访问路径
3.单次请求过程
前端发送请求想访问save--->springmvc拦截-->转发到类下的方法路径@RequestMapping("/save")
4.springmvc加载bean 和 spring加载bean 怎么区分
1.在springconfig核心配置类
@ComponentScan精确扫描({"com.itheima.service","com.itheima.dao"})
2.创建springMvcConfig类
@ComponentScan精确扫描("com.itheima.controller")
5.在config包下创建bean加载类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { 
    protected WebApplicationContext createServletApplicationContext() { 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;  
    }   
    protected WebApplicationContext createRootApplicationContext() {  
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();      
        ctx.register(SpringConfig.class);        
        return ctx;  
    }   
    protected String[] getServletMappings() { 
        return new String[]{"/"}; 
    }
}

2.SpringMvc入门

1.实现步骤
1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 创建处理器类BrandController
// 添加@Controller 注解  表示当前对象交给springMvc容器来管理
      创建处理方法:seleteAllBrand方法
// 添加@ResponseBody     默认情况,表示方法会查找响应的响应页面返回给前端
// 添加@RequestMapping("/selectAll") //设置当前处理器方法,处理具体请求路径

5 编写SpringMVC配置类,加载处理请求的Bean。(一次操作)     //本质还是spring配置类
// @Configuration   //表示配置类
// @ComponentScan("com.itheima") //扫包路径

6 加载SpringMVC配置类,并设置SpringMVC请求拦截的路径
 public class ServletConfig extends AbstractDispatcherServletInitializer{  
//web容器配置类  取代web.xml文件
 
//创建容器
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
//注册容器 
 context.register(SpringMvcConfig.class);
  return context;
  1. 代码演示
【第一步】创建web工程(Maven结构)

骨架创建-->导入缺少java和resourse
【第二步】设置tomcat服务器,加载web工程(tomcat插件)
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <port>80</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>
【第三步】导入坐标(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>
第四步 创建处理器类BrandController
//处理器类  :取代Servlet 处理各种前端请求
@Controller  //注解  当前对象交给spring容器来管理  SpringMvc
@RequestMapping("/brands") //请求前缀 添加在处理器上,设置当前处理器处理模块请求,请求映射值,配置模块的名称+s


public class BrandController {
    //开发前后端模式:html+ajax----web层
    @ResponseBody //默认情况,次注解  方法会查找响应的响应页面返回给前端
                  //注解作用
    @RequestMapping("/selectAll") //设置当前处理器方法,处理具体请求路径
    public String selectAllBrand(){
        return "selectAll Brand.......";
    }

    @ResponseBody
    @RequestMapping("/add")
    public String addBrand(){
        return "addBrand.......";
    }

    @ResponseBody
    @RequestMapping("/delete")
    public String deleteBrand(){
        return "deleteBrand.......";
    }

    @ResponseBody
    @RequestMapping("/update")
    public String updateBrand(){
        return "updateBrand.......";
    }
第五步 编写SpringMVC配置类
@Configuration   //表示配置类
@ComponentScan("com.itheima") //扫包
public class SpringMvcConfig {
}
第六步 加载SpringMVC配置类
//服务器启动时:自动获取当前配置类,获取当前tomcat服务器基本配置   此类配置向房屋web.xml(配置tomcat)
public class ServletConfig extends AbstractDispatcherServletInitializer{
    //1.配置创建springmvc 容器
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //创建web容器
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
        //注册容器
        context.register(SpringMvcConfig.class);
        return context;
    }

     //2.告知tomcat 那些请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"}; //所有的请求都交给springMvc来处理
    }
     //3.配置创建 加载 spring 容器
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        //创建web容器
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
        //注册容器
        context.register(SpringConfig.class);
        return context;
    }

//附:
// 解决resquset  请求参数乱码问题
//tomcat调用此方法,获取当前项目中配置的过滤器,应用过滤器  解决post乱码问题
//快捷方式  右键-->generate-->Override method-->找到filter的过滤器生成
     //4. 在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。
    @Override
    protected Filter[] getServletFilters() {
        //创建字符集过滤器
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        //设置字符集
        encodingFilter.setEncoding("utf-8");
        return new Filter[]{encodingFilter};
    }
}

3.接受请求8种(g5j3)与响应4种

tomcat启动顺序 1.启动servletConfig加载容器类 -->启动springmvcconfig类-->启动controller

1.接受get数据用的注解
@RequestParam :请求参数名与形参名不同时
@ResponseBody :在方法上都加 准没错
2.接收json数据用的注解
1.记得添加json转换用的依赖坐标  具体下面有
@EnableWebMvc注解 :开启json数据类型自动转换  //config配置类开启
@ResponseBody注解 ://方法上  返回给浏览器为json
@RequestBody注解 ://参数中,外部的json对象 保存到形参中
3.响应json数据使用到的注解
@ResponseBody注解 ://方法上  返回给浏览器为json
@EnableWebMvc注解 :开启json数据类型自动转换  //config配置类开启
2.接受请求参数传递
1.get请求发送普通类型参数

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

//普通参数:请求参数与形参名称对应即可完成参数传递
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
    System.out.println("普通参数传递 name ==> "+name);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param'}";
}

附:get请求中文乱码的话,在tomcat插件可以解决

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port><!--tomcat端口号-->
          <path>/</path> <!--虚拟目录-->
          <uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集-->
        </configuration>
      </plugin>
    </plugins>
  </build>
2.POST请求传递普通参数

普通参数:form表单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'}";
}

POST请求中文乱码处理

在加载SpringMVC配置的配置类中指定字符过滤器

// 解决resquset  请求参数乱码问题
//tomcat调用此方法,获取当前项目中配置的过滤器,应用过滤器  解决post乱码问题
//快捷方式  右键-->generate-->Override method-->找到filter的过滤器生成
    //4. 在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。
    @Override
    protected Filter[] getServletFilters() {
        //创建字符集过滤器
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        //设置字符集
        encodingFilter.setEncoding("utf-8");
        return new Filter[]{encodingFilter};
    }
1.接受请求五种get类型的参数介绍

1.普通参数

2.POJO类型参数

3.嵌套POJO类型参数

4.数组类型参数

5.集合类型参数

1.普通参数
//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
    System.out.println("普通参数传递 userName ==> "+userName);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param different name'}";
}
2.POJO类型参数

定义一个javabean类 参数一致

POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
@data //注解替代下面手动方法
public class User {
    private String name;
    private int age;
    //同学们自己添加getter/setter/toString()方法
}
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    System.out.println("pojo参数传递 user ==> "+user);
    return "{'module':'pojo param'}";
}
3.嵌套POJO类型参数 又名POJO对象中包含POJO对象
public class User {
    private String name;
    private int age;
    private Address address;
    //同学们自己添加getter/setter/toString()方法
}
public class Address {
    private String province;
    private String city;
    private Address address;
}

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

//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
publicStringpojoContainPojoParam(Useruser){
    System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
    return"{'module':'pojo contain pojo param'}";
}

4.数组类型参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
    System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
    return "{'module':'array param'}";
}
5.集合类型参数
集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
    System.out.println("集合参数传递 likes ==> "+ likes);
    return "{'module':'list param'}";
}
2.接受三种json字符串数据传参
1.使用注解
@EnableWebMvc注解 :开启json数据类型自动转换  //config配置类开启
@ResponseBody注解:参数上 浏览器给的参数是json
2.json数据三种参数介绍
1. json普通数组(["","","",...])
2. json对象({key:value,key:value,...})
3. json对象数组([{key:value,...},{key:value,...}])
3.模拟三种参数传输
  1. 传递json普通数组
1.首先添加json数据转换相关坐标
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>
2.模拟小飞人 设置发送json数据(请求body中添加json数据)
1.设置body   2.设置raw  3.设置json  4.添加["game
","music","travel"]

3.config开启自动转换json数据的支持

@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}

4.在Controller中编写方法接收json参数

//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody //返回给浏览器为json     //参数中,浏览器给我的数据json
public String listParamForJson(@RequestBody List<String> likes){                               
    System.out.println("list common(json)参数传递 list ==> "+likes);
    return "{'module':'list common for json param'}";
}
  1. 传递json对象

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

在小飞人模拟发送json数据

在Controller中编写方法接收json参数

//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
    System.out.println("pojo(json)参数传递 user ==> "+user);
    return "{'module':'pojo for json param'}";
}
  1. 传递json对象数组

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

//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的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'}";
}

4.请求映射路径前缀

1.RequestMapping
@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")//1级路径
public class UserController {
    //请求路径映射
    @RequestMapping("/save") //二级路径此时save方法的访问路径是:/user/save
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值