SpringMVC基础

SpringMVC基础

课程计划

  • 搭建Springmvc框架

  • 流程图

  • 实际应用案例

  • 接收参数

  • 返回值

  • 获取ServletAPI

  • REST风格

学习目标

  • 学会搭建SpringMVC框架

  • 深入了解MVC的流程

  • 可以接收多种类型的参数

  • 返回JSON数据

  • 学会REST风格

一、介绍

SpringMVC 是Spring框架的Web开发模块。

后续,会把SpringMVC融合到Spring中,形成SpringBoot框架

未来日常开发中,会非常频繁的使用SpringMVC中的知识点。

虽然是mvc的知识,会在SpringBoot框架中使用

  • 核心优势

  1. 注解驱动:@RequestParam/@RequestBody 简化了参数/数据的绑定

  2. MVC框架:控制器(Controller)+ 模型(Model)+ 视图 (View) 分离职责

  3. 数据友好:自动支持JSON等格式的序列化和反序列化,在接受和返回JSON数据方面,非常便捷

  4. 企业级功能:Restful API,拦截器,统一的异常处理,这些功能都会在企业实际应用中使用。

  5. 开发高效:约定优于配置,减少了XML的配置,专注业务逻辑

  • 底层原理

基于Servelt技术构建的框架。通过更高级的抽象,降低开发的复杂度,兼容Servlet 3.0 + 规范

二、入门案例

1、创建项目

2、引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.javasm</groupId>
  <artifactId>mvcdemo</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mvcdemo Maven Webapp</name>
​
  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <!--SpringMVC的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>6.2.12</version>
    </dependency>
    <!--Spring框架-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>6.2.12</version>
    </dependency>
    <!--Servlet-->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.0.0</version>
    </dependency>
​
    <!--Lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.42</version>
    </dependency>
    <!--Jackson(JSON处理)-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.16.1</version><!-- 与 Spring6 兼容-->
    </dependency>
    <!--FastJson2  (可以不引入)-->
    <dependency>
      <groupId>com.alibaba.fastjson2</groupId>
      <artifactId>fastjson2</artifactId>
      <version>2.0.40</version>
    </dependency>
​
  </dependencies>
  <build>
    <plugins>
      <!--当前插件,辅助获取参数-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>17</source>
          <target>17</target>
          <!--添加 -parmeters ,保留方法参数名称-->
          <compilerArgs>
            <arg>-parameters</arg>
          </compilerArgs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
​

3、新建配置类

@Configuration
@ComponentScan(basePackages = "com.javasm")
@EnableWebMvc//开启WebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    //在下方,添加各种MVC配置
}

4、新建初始化类

/**
 * WebInitializer 实现了 WebApplicationInitializer接口
 * 用来代替web.xml配置类的
 * Spring框架会自动扫描并识别实现了该接口的类
 * Spring框架 提交了 SpringServletContainerInitializer 来处理当前类
 * 当前应用 部署 支持Servlet 3.0 + 的容器时
 * 容器会自动调用WebApplicationInitializer.onStartup()方法
 * 无需手动实例化或者调用
 */
public class WebInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
​
        //创建AnnotationConfigWebApplicationContext对象。声明启动类
        AnnotationConfigWebApplicationContext context =
                new AnnotationConfigWebApplicationContext();
        context.register(WebMvcConfig.class);
​
        //注册 DispatcherServlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration =
                servletContext.addServlet("dispatcher",dispatcherServlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
        //注册 字符编码 过滤器
        FilterRegistration.Dynamic encodingFilter =
                servletContext.addFilter("characterEncodingFilter", CharacterEncodingFilter.class);
        encodingFilter.setInitParameter("encoding","UTF-8");
        encodingFilter.setInitParameter("forceEncoding","true");
        encodingFilter.addMappingForUrlPatterns(null,false,"/");
​
    }
}

5、新建Controller

/**
 * @RequestMapping("/web/user")  浏览器,通过/web/user路径,可以找到当前的Controller
 */
@Controller
@RequestMapping("/web/user")
public class WebUserController {
​
    /**
     * @RequestMapping("/hello")  浏览器 /web/user/hello 找到当前方法
     * 正常返回字符串,mvc中,直接返回字符串,并不是显示字符串,而是去寻找字符串对应的页面
     * @ResponseBody 表示,当前的方法,返回的是json字符串。自动把返回值转成json
     *
     */
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "Hello Spring MVC !!!!!";
    }
}

6、测试

当前项目使用了Spring 6+,支持的最低jdk是17,所以Tomcat最低要求是Tomcat 10

三、流程

DispatcherServlet内部流程

总结


前端控制器 DispatcherServlet

处理器映射器 Handler Mappding

处理器 Controller

视图解析器 ViewResolver

最终的视图View

四 、参数

1、普通参数

1.1 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebUser {
​
    private Integer uid;
    private String username;
}
1.2 Controller
    @PostMapping("/doAdd1")
    @ResponseBody
    public String doAdd1(Integer id,String name){
        WebUser webUser = new WebUser();
        webUser.setUid(id);
        webUser.setUsername(name);
        return name;
    }
1.3 异常
17-Nov-2025 11:32:57.142 警告 [http-nio-8080-exec-1] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]
​
返回的数据类型是JSON,但是MVC中没有配置

2、数组

    @PostMapping("/doAdd2")
    @ResponseBody
    public String doAdd2(String[] hobbys){
        return Arrays.toString(hobbys);
    }

3、对象

    @PostMapping("/doAdd3")
    @ResponseBody
    public String doAdd3(WebUser webUser){
        return webUser.toString();
    }

4、包装类

4.1 vo
@Data
public class WebUserVo{

    private WebUser webUser;

    private String[] hobbys;

    List<Player> playerList;

    Map<Integer,String> items;

}
4.2 model
@Data
public class Company {
    private Integer cid;
    private String name;
}
@Data
public class Player {
    private Integer id;
    private String nickname;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebUser {

    private Integer uid;
    private String username;
    
    private Company company;
}
4.3 Controller
    @PostMapping("/doAdd4")
    @ResponseBody
    public String doAdd4(WebUserVo vo){
        return "success";
    }
4.4 测试

先修改tomcat的配置文件 server.xml

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
			   relaxedQueryChars="[,]"
			   URIEncoding="UTF-8"
			   responseEncoding="UTF-8"
			   useBodyEncodingForURI="true"
               />

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值