SpringMVC笔记

目录

一、入门案例

1.1导入spring-webmvc和java.servlet-api坐标

1.2编写springMVC配置类,初始化springMVC环境(等同于spring配置类)

1.3创建SpringMVC控制器类(等同于Servlet功能)

1.4编写初始化servlet容器配置类,加载SpringMVC配置类,设置springMVC请求拦截路径

二、spring中的bean和spirngMVC中的bean分离管理

2.1方式一:直接排除sprinMVC扫描的bean

2.2方式二:精准扫描springMVC以外的bean

2.3Controller加载控制和业务bean加载控制

三、数据请求

3.1.在controller类上面添加一个模块的请求访问路径前缀,便于区分管理不同的controller

3.2post请秋中文乱码问题

3.3请求数据传递

四、响应数据

五、rest风格

5.1入门案例

 5.2简化开发


 

一、入门案例

1.1导入spring-webmvc和java.servlet-api坐标

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--导入springmvc坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.12.RELEASE</version>
        </dependency>

1.2编写springMVC配置类,初始化springMVC环境(等同于spring配置类)

1.添加@Configuration注解表名该类是springMVC配置类

@Configuration        //相当于spring配置类

2.扫描所有的bean

@ComponentScan("com.xiaoyu")      //扫描要管理的bean

配置类

package com.xiaoyu.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration        //相当于spring配置类
@ComponentScan("com.xiaoyu")      //扫描要管理的bean
public class SpringMVCConfig {
}

1.3创建SpringMVC控制器类(等同于Servlet功能)

 1.添加注解把该类的对象给ioc容器管理

@Controller

2.添加注解编写映射路径(等同于WebServlet注解)

@RequestMapping("/save")      //注解映射路径

3.添加注解表示该方法的返回值为响应的数据

@ResponseBody

控制器类

package com.xiaoyu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @RequestMapping("/save")      //注解映射路径
    @ResponseBody
    public String save(){
        System.out.println("hello springMVC!");
        return "{'username':'xiaoyu'}";
    }
}

1.4编写初始化servlet容器配置类,加载SpringMVC配置类,设置springMVC请求拦截路径

1.继承AbstractDispatcherServletInitializer

extends AbstractDispatcherServletInitializer

2.重写方法

createServletAppLocationContext方法

创建AnnotationConfigWebAppLicationContext对象----》

//3.获取AnnotationConfigWebApplication对象
        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();

加载SpringMVC配置类---》

//4.加载SpringMVC配置类
        annotationConfigWebApplicationContext.register(SpringMVCConfig.class);

返回AnnotationConfigWebAppLocationContext对象---》

        //5.返回annotationConfigWebApplicationContext
        return annotationConfigWebApplicationContext;

 getServletMappings方法

设置springMVC请求拦截路径(任意请求都将转到SpringMVC管理)---》

        //6.设置SpringMVC请求拦截的路径
        return new String[]{"/"};

二、spring中的bean和spirngMVC中的bean分离管理

2.1方式一:直接排除sprinMVC扫描的bean

//Spring配置文件扫描除了SpringMVC管理以外的bean
@ComponentScan(value = "com.itheima",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)

2.2方式二:精准扫描springMVC以外的bean

@ComponentScan("com.itheima.service")

2.3Controller加载控制和业务bean加载控制

原始方式继承AbstractConfigDispatcherServletInitializer实现方法

package com.itheima.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//1.继承抽象类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        //2.加载容器
        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext=new AnnotationConfigWebApplicationContext();

        //3.注册springMVC配置文件(加载springMVC配置文件)
        annotationConfigWebApplicationContext.register(SpringMvcConfig.class);

        //4.返回容器对象
        return annotationConfigWebApplicationContext;
    }

    protected String[] getServletMappings() {
        //5.设置springMVC请求拦截路径(请求交给springMVC管理)
        return new String[] {"/"};
    }

    protected WebApplicationContext createRootApplicationContext() {
        //6.加载容器
        AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext=new AnnotationConfigWebApplicationContext();

        //7.注册springMVC配置文件(加载spring配置文件)
        annotationConfigWebApplicationContext.register(SpringConfig.class);

        //4.返回容器对象
        return annotationConfigWebApplicationContext;
    }
}

 简化方式

package com.itheima.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

//1.继承抽象类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

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

三、数据请求

3.1.在controller类上面添加一个模块的请求访问路径前缀,便于区分管理不同的controller

//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {

3.2post请秋中文乱码问题

在servlet初始化容器里面重写getServletFilter()方法

//1.重写方法设置响应数据格式
    @Override
    protected Filter[] getServletFilters() {
        //2.创建设置响应数据格式的对象
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();

        //3.设置请求字符为utf-8
        characterEncodingFilter.setEncoding("UTF-8");

        //4.返回对象
        return new Filter[]{characterEncodingFilter};
    }

3.3请求数据传递

1.普通参数

直接用controller类里面的方法用形参接收,形参名和请求数据的键的名称一致。

    @RequestMapping(value = "/commonParam")
    @ResponseBody
    public String commonParam(String name,int age){
        System.out.println("name:"+name);
        System.out.println("age:"+age);
        return "{'module':'commonParam'}";
    }

2.普通参数但controller类里面的方法的形参和请求数据的键的名称不一致

在形参前加@RequestParam注解绑定

    @RequestMapping("/commonParamDifferenceName")
    @ResponseBody
    public String commonParamDifferenceName(@RequestParam("name") String username,int age){
        System.out.println("username:"+username);
        System.out.println("age:"+age);
        return "{'module':'commonParamDifferenceName'}";
    }

3.实体类类型参数

如果实体类里没有引用类型成员变量,请求数据的键的名称和实体类的成员变量名称一致即可。

如果有引用类型,请求数据的键的名称为(引用类型对象.引用类型成员变量)即可。

    /*
    实体类参数
     */
    @RequestMapping("/pojoParam")
    @ResponseBody
    public String pojoParam(User user){
        System.out.println("user:"+user);
        return "{'module':'pojoParam'}";
    }

4.数组参数

请求数据的键的名称和形参数组的名称一致即可

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

5.集合参数

请求数据的键的名称和集合的名称一致即可。

    /*
    集合参数
     */
    @RequestMapping("/collectionParam")
    @ResponseBody
    public String collectionParam(@RequestParam List<String> likes){
        System.out.println("likes"+likes);
        return "{'module':'collectionParam'}";
    }

6.json数据传递参数

导入坐标---》

    <!--json数据坐标-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.8</version>
    </dependency>

在springMVC配置类里添加注解,开启json数据格式的自动转换---》

@EnableWebMvc

编写访问方法

1)集合参数(简单类型),json格式

    /*
    集合参数:json格式
     */
    @RequestMapping("/listParamForJson")
    @ResponseBody
    public String listParamForJson(@RequestBody List<String> likes){
        System.out.println("likes"+likes);
        return "{'module': commonJsonParam}";
    }

请求的数据

["gym","pingpong","basketball"]

2)pojo参数(json格式)

    /*
    pojo参数:json格式
     */
    @RequestMapping("pojoParamForJson")
    @ResponseBody
    public String pojoParamForJson(@RequestBody User user){
        System.out.println("user:"+user);
        return "{'module':'pojoParamForJson'}";
    }

请求的json数据

{
    "name":"xiaoyu",
    "age":18,
    "address":{
        "province":"guangdong",
        "city":"zhaoqing"
    }
}

3)集合参数(引用类型),json格式

    /*
    集合参数(引用类型):json格式
     */
    @RequestMapping("/listPojoParamForJson")
    @ResponseBody
    public String listPojoParamForJson(@RequestBody List<User> userList){
        System.out.println("listPojoParamForJson"+userList);
        return "{'module':'listPojoParamForJson'}";
    }

请求的数据

[
    {
        "name":"xiaoyu",
        "age":18
    },
    {
        "name":"xiaoyu",
        "age":18
    }
]

 7.日期型参数传递

    /*
    日期型数据
     */
    @RequestMapping("dataParam")
    @ResponseBody
    public String dataParam(Date date1,@DateTimeFormat(pattern = "yyyy-mm-dd") Date date2){
        System.out.println("yyyy/MM/dd:"+date1);
        System.out.println("yyyy-MM-dd HH:mm:ss"+date2);
        return "{'module':'dataParam'}";
    }

四、响应数据

1.页面跳转

去掉@ResponseBody注解,否则会直接响应成字符串

    //响应页面/跳转页面
    //返回值为String类型,设置返回值为页面名称,即可实现页面跳转
    @RequestMapping("/toJumpPage")
    public String toJumpPage(){
        System.out.println("跳转页面");
        return "page.jsp";
    }

2.响应文本

controller方法返回类型改为String,添加@ResponseBody注解

    //响应文本数据
    //返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
    @RequestMapping("/responseText")
    @ResponseBody
    public String responseText(){
        System.out.println("返回纯文本数据");
        return "response text";
    }

3.响应pojo对象

controller里的方法返回类型改为pojo实体类---》

    public User responseJsonPOJO(){

添加@ResponseBody注解---》

    @ResponseBody

返回pojo对象

        User user = new User();
        user.setName("itcast");
        user.setAge(15);
        return user;

3.响应pojo集合对象

    //响应POJO集合对象
    //返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
    @RequestMapping("/toJsonList")
    @ResponseBody
    public List<User> toJsonList(){
        System.out.println("返回json集合数据");
        User user1 = new User();
        user1.setName("传智播客");
        user1.setAge(15);

        User user2 = new User();
        user2.setName("黑马程序员");
        user2.setAge(12);

        List<User> userList = new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);

        return userList;
    }

五、rest风格

设置当前请求方法----》

method = RequestMethod.GET

访问映射路径改为统一名称,需要数据在后面添加(/{参数名称})---》

value = "/users/{id}" 

5.1入门案例

1添加操作(post请求)

    //设置当前请求方法为POST,表示REST风格中的添加操作
    @RequestMapping(value = "/users",method = RequestMethod.POST)
    @ResponseBody
    public String save(){
        System.out.println("user save...");
        return "{'module':'user save'}";
    }

2根据id删除操作(delete请求)

地址栏设置数据传递给形参---》

value = "/users/{id}"

设置请求方式为delete---》

method = RequestMethod.DELETE

提示形参在访问路径接收参数---》

public String delete(@PathVariable Integer id)
    //设置当前请求方法为DELETE,表示REST风格中的删除操作
    //@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
    @RequestMapping( value = "/users/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id){
        System.out.println("user delete..." + id);
        return "{'module':'user delete'}";
    }

3根据id修改操作(put请求)

地址栏设置数据给形参,并且请求方式改为put---》

@RequestMapping(value = "/users/{id}",method = RequestMethod.PUT)

注解形参数据在url中获取

 public String update(@PathVariable Integer id,@RequestBody User user)
    //设置当前请求方法为PUT,表示REST风格中的修改操作
    @RequestMapping(value = "/users/{id}",method = RequestMethod.PUT)
    @ResponseBody
    public String update(@PathVariable Integer id,@RequestBody User user){
        System.out.println("user update..."+user+id);
        return "{'module':'user update'}";
    }

4查询所有操作(get请求方式)

    //设置当前请求方法为GET,表示REST风格中的查询操作
    @RequestMapping(value = "/users",method = RequestMethod.GET)
    @ResponseBody
    public String selectAll(){
        System.out.println("user selectAll...");
        return "{'module':'user selectAll'}";
    }

5根据id查询(get请求方式)

    //设置当前请求方法为GET,表示REST风格中的查询操作
    //@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
    @RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
    @ResponseBody
    public String selectById(@PathVariable Integer id){
        System.out.println("user selectById..."+id);
        return "{'module':'user selectById'}";
    }

 5.2简化开发

1.@ResponseBody提取到controller类上面统一书写(每个方法的返回值都作为响应体)

2.@Controller注解和@ReoponseBody注解合并到同一个注解()@RestController

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

3.利用访问路径前缀的方法简化书写

@RequestMapping("/books")

4.在方法前的@RequestMapping注解改成@请求方式Mapping注解简化开发,可携带需要的路径访问变量。

@DeleteMapping("/{id}")     //使用@DeleteMapping简化DELETE请求方法对应的映射配置

5.3设置静态资源访问过滤

编写SpringMvcSupport配置类---》

package com.xiaoyu.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

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

继承WebMvcConfiguration---》

extends WebMvcConfigurationSupport

重写addResourcesHandlers方法---》

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }

当访问/xxx/**时,从/xxx查找内容---》

        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");

在springMvc配置类中扫描该配置类---》

@ComponentScan({"com.itheima.controller","com.itheima.config"})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值