Spring_MVC 快速入门指南

Spring_MVC 快速入门指南

一、Spring_MVC 简介

1. 什么是 Spring_MVC?

Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,使代码结构更加清晰,便于维护和扩展。

2. Spring_MVC 的优势

清晰的分离:将业务逻辑、数据和视图分离,使代码更易于管理和测试。

灵活的配置:支持多种配置方式,包括 XML 和注解。

丰富的功能:提供了许多内置功能,如数据绑定、类型转换、国际化等。

与其他 Spring 模块集成:可以无缝地与其他 Spring 模块(如 Spring Data、Spring Security)集成。

二、创建 Spring_MVC 应用

1. 依赖导入

在项目的 pom.xml 文件中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>6.1.12</version>
</dependency>

2. 创建配置类

创建一个配置类 SpringMvcConfig.java,用于替代传统的 XML 配置:

java 复制代码
package com.itheima.config;

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

@Configuration
@ComponentScan("com.itheima.Controller") // 指定要扫描的包
@EnableWebMvc // 启用 Spring_MVC 的功能
public class SpringMvcConfig {
}

3. 创建启动类

创建一个继承自 AbstractDispatcherServletInitializer 的类 ServletConfig.java,用于配置和启动 Spring_MVC 应用:

java 复制代码
package com.itheima.config;

import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import org.springframework.web.servlet.support.AnnotationConfigWebApplicationContext;

import javax.servlet.Filter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

public class ServletConfig extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(SpringMvcConfig.class); // 注册配置类
        return context;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"}; // 所有请求都由 Spring_MVC 处理
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }
}

4. 创建控制器

创建一个控制器类 UserController.java,使用 @Controller 注解标记,并通过 @RequestMapping 注解设置请求路径:

java 复制代码
package com.itheima.Controller;

import org.springframework.web.bind.annotation.*;

@Controller
public class UserController {
    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return "Hello, Spring_MVC!";
    }

    @RequestMapping(value = "/user/save", method = RequestMethod.POST)
    @ResponseBody
    public String saveUser() {
        System.out.println("User saved successfully");
        return "{\"status\": \"success\", \"message\": \"User saved\"}";
    }

    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getUserById(@PathVariable Integer id) {
        System.out.println("Retrieving user with ID: " + id);
        return "{\"id\": " + id + ", \"name\": \"John Doe\"}";
    }
}

构造形式:

三、请求路径设置与控制器注解详解

1. @Controller 注解

  • 用于标记一个类为控制器类。
  • Spring 容器会扫描带有 @Controller 注解的类,并将其注册为 Spring Bean。

2. @RequestMapping 注解

  • 用于映射 HTTP 请求到处理方法。
  • 可用于类级别(设置基础路径)和方法级别(设置具体路径)。
  • 支持多种 HTTP 方法(GET、POST、PUT、DELETE)。
java 复制代码
@Controller
@RequestMapping("/api") // 类级别的基础路径
public class ApiController {
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String getUser() {
        return "User data";
    }
}

3. @ResponseBody 注解

  • 用于指定方法的返回值将直接作为响应体返回给客户端。
  • 常用于返回 JSON 或 XML 数据。
java 复制代码
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public String getUser() {
    return "{\"id\": 1, \"name\": \"John Doe\"}";
}

4. @RequestBody 注解

  • 用于将请求体中的数据绑定到方法参数。
  • 常用于处理 POST 或 PUT 请求中的 JSON 或 XML 数据。
java 复制代码
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String saveUser(@RequestBody User user) {
    return "{\"status\": \"success\"}";
}

5. @PathVariable 注解

  • 用于从 URL 中提取占位符参数。
  • 常用于动态获取路径中的参数。
java 复制代码
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@ResponseBody
public String getUserById(@PathVariable Integer id) {
    return "{\"id\": " + id + ", \"name\": \"John Doe\"}";
}

四、运行应用

完成上述步骤后,启动应用服务器(如 Tomcat),可以通过以下 URL 访问您的应用:

  • http://localhost:8080/hello:返回 "Hello, Spring_MVC!"。
  • http://localhost:8080/user/save:返回用户保存成功的 JSON 数据。
  • http://localhost:8080/user/1:返回用户信息的 JSON 数据。

五、常见问题与解决方案

1. 无法访问控制器方法

  • 可能原因:控制器类或方法未正确标注注解,或注解路径配置错误。
  • 解决方案 :检查控制器类是否使用 @Controller 注解,方法是否使用 @RequestMapping 注解,以及路径是否正确。

2. 返回 JSON 数据时出现 406 错误

  • 可能原因:客户端不接受应用返回的 JSON 数据类型。
  • 解决方案 :确保在控制器方法上添加 @ResponseBody 注解,并在请求头中设置 Accept: application/json

3. 中文乱码问题

  • 可能原因:请求或响应的编码设置不正确。

  • 解决方案

    ServletConfig 类中添加字符编码过滤器:

    java 复制代码
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }

    在 Tomcat 启动配置中添加 JVM 参数:

    -Dfile.encoding=UTF-8

相关推荐
QT 小鲜肉21 小时前
【孙子兵法之中篇】009. 孙子兵法·行军篇
人工智能·笔记·读书·孙子兵法
教练、我想打篮球21 小时前
117 javaweb servlet+jsp 项目中修改了 数据库连接配置, 却怎么都不生效
java·servlet·jdbc·jsp
LO嘉嘉VE21 小时前
学习笔记二十五:支持向量机-核函数
笔记·学习·支持向量机
你不是我我21 小时前
【Java 开发日记】我们来说一说 Redis IO 多路复用模型
java·开发语言·redis
SadSunset21 小时前
(13)复杂查询
java·笔记·架构·mybatis
浩瀚地学21 小时前
【Java】ArrayList
java·开发语言·经验分享·笔记
阿杰同学21 小时前
Java 设计模式 面试题及答案整理,最新面试题
java·开发语言·设计模式
这样の我21 小时前
java 模拟chrome指纹 处理tls extension顺序
java·开发语言·chrome
LeonIter21 小时前
《以日为鉴》读书随笔
笔记
Genevieve_xiao21 小时前
【数据结构与算法】【xjtuse】面向考纲学习(下)
java·数据结构·学习·算法