Spring MVC

发布于:2025-02-24 ⋅ 阅读:(14) ⋅ 点赞:(0)

1. Spring MVC 简介

Spring MVC技术与Servlet功能技术等同,均属于web层开发技术

2. Spring MVC 入门案例

2.1 导入sevlet和springmvc坐标

pom.xml

    <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>

2.2 创建SpringMVC控制器类

com.gtc.controller.UserController.java

@Controller
@RequestMapping("/user")
public class UserController {

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

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

2.3 初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

com.gtc.config.SpringMvcConfig.java

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

2.4 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

com.gtc.config.ServletContainerInitConfig.java
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
    // 加载springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        // 创建空容器
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        // 注册容器的配置
        context.register(SpringMvcConfig.class);
        return context;
    }

    // 加载哪些请求归属springmvc处理
    @Override
    protected String[] getServletMappings() {
        // 所有请求都由mvc处理
        return new String[]{"/"};
    }
    // 加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

2.5 导入Tomcat插件(或用本地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>

2.6 启动服务器

 3. bean 加载控制

SpringMVC容器加载controller的表现层bean

Spring容器控制service的业务bean、dao的数据bean等

因为功能不同,如何避免Spirng错误加载到SpringMVC的bean?

解决办法:SpringMvcConfig只加载mvc的bean,Spring加载所有(排除掉springmvc的bean)的bean

  • SpringMVC相关bean加载控制
    • SpringMVC加载的bean对应的包均在com.gtc.controller内
  • Spring相关bean加载控制
    • 方式一: Sring加载的bean设定扫描范围为com.gtc,排除掉controller包内的bean
    • 方式二: Spring加载的bean设定扫描范围为精准扫描,例如service包、dao包等

3.1 Spring MVC加载表现层bean

com.gtc.config.SpringMvcConfig.java

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

3.2 Spring加载其他bean

com.gtc.config.SpringConfig.java

方式一:Sring加载的bean设定扫描范围为com.gtc,排除掉controller包内的bean

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

方式二: Spring加载的bean设定扫描范围为精准扫描,例如service包、dao包等

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

4. 请求与响应

4.1 请求映射路径

@RequestMapping注解实现

4.2 请求参数

在Postman中发送Get请求:

在Postman中发送Post请求:

普通参数传递:

@Controller
public class ParamController {

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

    // 普通参数---请求参数与形参名不同
    @RequestMapping("/commonParam02")
    @ResponseBody
    public String commonParam02(@RequestParam("name") String userNname, int age) {
        System.out.println("普通参数2传递 name ==> " + userNname);
        System.out.println("普通参数2传递 age ==> " + age);
        return "{'module':'common param'}";
    }
}

POJO类型参数

前提:有一个User类,定义了String name和int age两个属性,写了getter和setter方法和toString方法

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

4.3 响应json数据

Postman发送json数据

 (1)加入jackson-databind坐标

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

(2)配置SpringMvcConfig.java加入EnableWebMvc注解

package com.gtc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;


@Configuration
@ComponentScan("com.gtc.controller")
@EnableWebMvc // 开启外部发送的json转换为对象功能
public class SpringMvcConfig{

}

(3)

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

4.4 响应

响应页面

@Controller
@RequestMapping("/user")
public class UserController {
    // 响应页面
    @RequestMapping("/toJumpPage")
    public String toJumpPage() {
        System.out.println("跳转页面");
        return "index.jsp";
    }
}

响应数据

5. REST风格

5.1 REST简介

REST(Representational State Transfer),表现形式状态转换

 

 

5.2 RESTful入门案例 

SpringMVC支持的八种请求方式:

主要四种:增PUT删DELETE改POST查GET