Spring MVC全解析:从入门到精通的终极指南

🤵‍♂️ 个人主页:@rain雨雨编程

😄微信公众号:rain雨雨编程

✍🏻作者简介:持续分享机器学习,爬虫,数据分析
🐋 希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+

目录

SpringMVC 框架介绍

核心注解

@Controller

@RequestMapping

@PathVariable

SpringMVC处理请求数据

@RequestParam注解

作用

使用场景

示例

属性概览

属性详解

另一个示例

@RequestHeader 注解详解

作用

使用场景

示例

属性概览

属性详解

@CookieValue 注解详解

作用

使用场景

示例

属性概览

属性详解

SpringMVC处理响应数据

ModelAndView 使用

Model、ModelMap、Map 处理响应数据

1. 使用 Model 传递数据

2. 使用 ModelMap 传递数据

3. 使用 Map 传递数据

总结

SpringMVC消息转换器

@ResponseBody

ResponseBody注解介绍

使用消息转换器处理json数据格式

1. 添加Jackson依赖

2. 启用注解驱动

3. 自定义消息转换器(可选)

4. 使用@ResponseBody注解

5. 配置视图解析器(如果需要视图渲染)

6. 测试JSON数据格式

@RequestBody

HttpEntity

ResponseEntity

总结

其他注解

@ExceptionHandler

@RestController

Rest风格

5.1 REST简介

5.2 REST风格操作

5.3 RESTful开发

5.4 REST风格的优势

SpringMVC 视图及视图解析器

视图解析器对象【ViewResolver】

视图对象【View】

视图解析器的配置

总结

SpringMVC 视图控制器、重定向及静态资源加载

视图控制器

重定向

加载静态资源


SpringMVC 框架介绍

SpringMVC 是 Spring 框架的一个模块,它实现了基于 Java 的 MVC(Model-View-Controller)设计模式,用于构建 Web 应用程序。以下是 SpringMVC 的核心概念和工作流程:

  1. 请求处理:浏览器发送 HTTP 请求到后端服务器,这些请求由 SpringMVC 的前端控制器(DispatcherServlet)接收。

  2. Servlet 分离:传统的 Servlet 模式中,一个 Servlet 只能处理一个请求,这限制了并发处理能力。SpringMVC 通过引入控制器(Controller)层,允许一个控制器处理多个请求。

  3. 分层架构:SpringMVC 提倡将应用程序分为三层:

    • Web 层(Controller):处理 HTTP 请求,调用服务层,并返回视图或数据。

    • Service 层:包含业务逻辑,处理应用程序的核心功能。

    • DAO 层:数据访问对象层,负责与数据库交互,执行 CRUD 操作。

  4. MVC 设计模式:SpringMVC 实现了 MVC 设计模式,其中:

    • Controller:接收请求,调用服务层,返回 Model 和 View。

    • Service:处理业务逻辑,调用 DAO 层。

    • DAO:执行数据操作,返回结果给 Service。

    • Model:应用程序的数据。

    • View:用户界面,展示 Model 数据。

  5. 异步调用:随着互联网的发展,同步调用的性能瓶颈促使异步调用成为趋势。在异步调用中,后端不需要返回传统的视图,而是将数据转换为 JSON 格式返回给前端。 SpringMVC 的职责:

  6. 控制器如何接收请求和数据。

  • 如何将请求和数据转发给业务层(Service)。

  • 如何将请求和数据转发给业务层(Service)。

  • 如何将响应数据转换为JSON格式并返回给前端。

在Spring框架中,@RequestBody@ResponseBodyHttpEntityResponseEntity都是用于处理HTTP请求和响应的注解和类,它们在RESTful服务开发中扮演着重要的角色。下面我将简要区分它们:

核心注解

@Controller
  • 作用:标识一个类作为Spring MVC的控制器,负责处理Web请求。

  • 使用场景:用于定义处理HTTP请求的类,这些类通常包含处理特定URL请求的方法。

  • 示例
    @Controller
    public class UserController {
        // ...
    }
    
@RequestMapping
  • 作用:用于映射Web请求到控制器的处理方法上。

  • 使用场景:可以用于类或方法上,用于定义URL路径与控制器方法之间的映射关系。

  • 示例
    @RequestMapping("/users")
    public class UserController {
        // ...
    }
    
@PathVariable
  • 作用:用于从URL路径中提取变量,并将其绑定到控制器方法的参数上。

  • 使用场景:用于处理包含变量的URL路径,如根据用户ID获取用户信息。

  • 示例
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
    }
    

SpringMVC处理请求数据

@RequestParam注解

在SpringMVC中,@RequestParam注解是一个强大的工具,它允许开发者更灵活地处理HTTP请求中的参数。

作用

@RequestParam注解用于将请求参数映射到处理方法的参数上。当请求参数的名称与方法参数的名称不一致时,这个注解尤为重要。

使用场景
  • 参数名不一致:当HTTP请求中的参数名与方法参数名不同时,使用@RequestParam来指定请求参数的名称。

  • 可选参数:标记方法参数为可选,即使请求中没有提供该参数,方法也能正常执行。

  • 默认值:为方法参数提供默认值,当请求中没有提供该参数时,方法参数将使用默认值。

示例
private static final String SUCCESS = "success";
@RequestMapping("/param1")
public static String test(@RequestParam("stu") String stud){
    System.out.println("stu===>" + stud);
    return SUCCESS;
}

在这个例子中,如果请求的URL是/param1?stu=MoonshotAI,那么控制台将输出stu===>MoonshotAI

属性概览
属性名类型作用默认值
valueString设置需要入参的参数名
nameString与value属性作用一致,设置需要入参的参数名
requiredBoolean设置当前参数是否必须入参true
defaultValueString当装配数值为null时,指定当前defaultValue默认值
属性详解
  • required

    • 类型:Boolean

    • 作用:指定参数是否必须提供。
      • true(默认值):如果请求中没有提供该参数,将返回400错误,提示缺少必需的参数。

      • false:如果请求中没有提供该参数,该参数将被设置为null

  • defaultValue

    • 类型:String

    • 作用:当请求中没有提供该参数,且required属性设置为false时,该参数将使用defaultValue指定的默认值。

另一个示例
private static final String SUCCESS = "success";
@RequestMapping("/param1")
public static String test(@RequestParam(value = "stu", required = false, defaultValue = "Unknown") String stud){
    System.out.println("stu===>" + stud);
    return SUCCESS;
}

在这个例子中,如果请求的URL是/param1(没有提供stu参数),控制台将输出stu===>Unknown,因为defaultValue被设置为"Unknown"

通过使用@RequestParam注解,SpringMVC提供了一种灵活且强大的方式来处理HTTP请求参数,使得开发者能够更精确地控制参数的接收和处理。

@RequestHeader 注解详解

@RequestHeader注解在SpringMVC中用于将HTTP请求头中的信息映射到处理方法的参数上。

作用

@RequestHeader注解允许开发者访问HTTP请求头中的值,并将这些值作为参数传递给控制器的方法。

使用场景
  • 访问请求头信息:当需要根据请求头中的信息(如User-AgentAcceptAuthorization等)来处理请求时。

示例
@RequestMapping("/headerInfo")
public static String headerInfo(@RequestHeader("User-Agent") String userAgent){
    System.out.println("User-Agent===>" + userAgent);
    return SUCCESS;
}

在这个例子中,User-Agent请求头的值将被打印出来。

属性概览
属性名类型作用默认值
valueString设置需要获取的请求头的名称
nameString与value属性作用一致,设置需要获取的请求头的名称
requiredBoolean设置当前请求头是否必须存在true
defaultValueString当请求头不存在时,指定默认值
属性详解
  • required

    • 类型:Boolean

    • 作用:指定请求头是否必须存在。
      • true(默认值):如果请求头不存在,将抛出异常。

      • false:如果请求头不存在,该参数将被设置为null

  • defaultValue

    • 类型:String

    • 作用:当请求头不存在,且required属性设置为false时,该参数将使用defaultValue指定的默认值。

@CookieValue 注解详解

@CookieValue注解在SpringMVC中用于将HTTP请求中的Cookie信息映射到处理方法的参数上。

作用

@CookieValue注解允许开发者访问Cookie中的值,并将这些值作为参数传递给控制器的方法。

使用场景
  • 访问Cookie信息:当需要根据Cookie中的信息(如用户会话、偏好设置等)来处理请求时。

示例
@RequestMapping("/cookieInfo")
public static String cookieInfo(@CookieValue("sessionId") String sessionId){
    System.out.println("Session ID===>" + sessionId);
    return SUCCESS;
}

在这个例子中,名为sessionId的Cookie的值将被打印出来。

属性概览
属性名类型作用默认值
valueString设置需要获取的Cookie的名称
nameString与value属性作用一致,设置需要获取的Cookie的名称
requiredBoolean设置当前Cookie是否必须存在true
defaultValueString当Cookie不存在时,指定默认值
属性详解
  • required

    • 类型:Boolean

    • 作用:指定Cookie是否必须存在。
      • true(默认值):如果Cookie不存在,将抛出异常。

      • false:如果Cookie不存在,该参数将被设置为null

  • defaultValue

    • 类型:String

    • 作用:当Cookie不存在,且required属性设置为false时,该参数将使用defaultValue指定的默认值。

通过使用@RequestHeader@CookieValue注解,SpringMVC提供了一种灵活且强大的方式来处理HTTP请求的头部信息和Cookie,使得开发者能够更精确地控制请求的接收和处理。

SpringMVC处理响应数据

ModelAndView 使用

在SpringMVC中,ModelAndView是一个非常重要的类,它用于在控制器中处理模型数据和视图的返回。

1. 使用ModelAndView对象作为方法返回值类型 ModelAndView允许开发者在同一个对象中设置模型数据和视图名称,从而简化了视图的渲染过程。

2. 设置视图名称 通过ModelAndViewsetViewName方法,可以指定要渲染的视图名称。

3. 设置共享数据 使用ModelAndViewaddObject方法,可以向模型中添加属性,这些属性可以在视图中通过表达式语言(EL)访问。

示例代码

@Controller
public class TestResponse {
    @RequestMapping("/response")
    public ModelAndView test(){
        ModelAndView mv = new ModelAndView();
        // 设置视图的名字
        mv.setViewName("Response_success");
        // 设置共享的数据
        mv.addObject("stu", "liu");
        return mv;
    }
}

在Thymeleaf模板中,可以通过th:text属性来显示模型中的stu属性:

<h1 th:text="${stu}">1</h1>
Model、ModelMap、Map 处理响应数据
1. 使用 Model 传递数据

Model接口允许开发者添加模型属性,这些属性可以在视图中访问。

@Controller
public class ModelExampleController {

    @RequestMapping("/modelExample")
    public String modelExample(Model model) {
        model.addAttribute("message", "Hello, Model!");
        return "exampleView"; // 返回视图名称
    }
}

在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:

<p th:text="${message}"></p>
2. 使用 ModelMap 传递数据

ModelMapMap<String, Object>的实现,它提供了一种更灵活的方式来添加模型属性。

@Controller
public class ModelMapExampleController {

    @RequestMapping("/modelMapExample")
    public String modelMapExample(ModelMap modelMap) {
        modelMap.addAttribute("message", "Hello, ModelMap!");
        return "exampleView"; // 返回视图名称
    }
}

在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:

<p th:text="${message}"></p>
3. 使用 Map 传递数据

直接使用Map<String, Object>作为方法参数,可以添加模型属性,但这种方式可能不如Model或ModelMap直观。

@Controller
public class MapExampleController {

    @RequestMapping("/mapExample")
    public String mapExample(Map<String, Object> map) {
        map.put("message", "Hello, Map!");
        return "exampleView"; // 返回视图名称
    }
}

在视图(例如Thymeleaf模板)中,你可以这样访问传递的数据:

<p th:text="${message}"></p>
总结

ModelAndView提供了一种集成的方式来处理模型数据和视图返回,而ModelModelMapMap则提供了更灵活的方式来处理模型数据。选择哪种方式取决于具体的应用场景和个人偏好。

SpringMVC消息转换器

@ResponseBody
ResponseBody注解介绍
  • 作用:用于将方法的返回值自动转换为JSON、XML等格式,并写入HTTP响应体中。

  • 使用场景:通常用于返回数据给客户端,如查询资源时。

  • 示例
    @GetMapping("/users/{id}")
    @ResponseBody 
    public User getUser(@PathVariable Long id) {
        // ...
    }
    
使用消息转换器处理json数据格式

在Spring MVC中,使用消息转换器处理JSON数据格式通常涉及以下步骤:

1. 添加Jackson依赖

确保你的项目中包含了Jackson库的依赖。如果你使用Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version> <!-- 使用最新版本 -->
</dependency>
2. 启用注解驱动

在你的Spring MVC配置类或XML配置文件中,启用注解驱动,这将自动注册MappingJackson2HttpMessageConverter

Java配置类

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // 可以添加其他配置,但注解驱动已自动注册了MappingJackson2HttpMessageConverter
}

XML配置文件

<mvc:annotation-driven />
3. 自定义消息转换器(可选)

如果需要自定义MappingJackson2HttpMessageConverter的配置,如日期格式、null值处理等,可以在配置类中覆盖configureMessageConverters方法:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = jsonConverter.getObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
        jsonConverter.setObjectMapper(objectMapper);
        converters.add(jsonConverter);
    }
}
4. 使用@ResponseBody注解

在你的控制器方法上使用@ResponseBody注解,这样Spring MVC会使用消息转换器将返回值转换为JSON格式:

@Controller
public class SomeController {

    @ResponseBody
    @RequestMapping("/someEndpoint")
    public SomeObject getSomeData() {
        SomeObject data = new SomeObject();
        // 设置data的属性
        return data;
    }
}
5. 配置视图解析器(如果需要视图渲染)

如果你的应用中同时使用了视图渲染和JSON数据返回,你可能需要配置视图解析器以避免视图解析器与消息转换器冲突:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }

    // 其他配置...
}
6. 测试JSON数据格式

一旦配置完成,你可以通过发送HTTP请求到你的Spring MVC应用程序来测试JSON数据格式是否按预期工作。

通过这些步骤,你可以在Spring MVC应用程序中成功配置和使用消息转换器来处理JSON数据格式。这使得你的应用能够以JSON格式发送和接收数据,满足RESTful服务的需求。

@RequestBody
  • 作用:用于将HTTP请求体中的原始数据(如JSON、XML等)绑定到方法的参数上。

  • 使用场景:通常用于接收客户端发送的请求数据,如创建或更新资源时。

  • 示例
    @PostMapping("/users")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // ...
    }
    
HttpEntity
  • 作用:代表一个HTTP请求或响应实体,可以包含HTTP头信息、HTTP状态码以及请求或响应体。

  • 使用场景:用于构建复杂的HTTP请求,或者在客户端接收到的响应中获取完整的HTTP信息。

  • 示例
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<String> entity = new HttpEntity<>("body", headers);
    ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
    
ResponseEntity
  • 作用:是HttpEntity的子类,专门用于表示HTTP响应。

  • 使用场景:用于在服务器端构建HTTP响应,可以设置响应体、HTTP头信息和HTTP状态码。

  • 示例
    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return new ResponseEntity<>(user, HttpStatus.OK);
    }
    
总结
  • @RequestBody@ResponseBody是注解,分别用于请求和响应的数据绑定。

  • HttpEntityResponseEntity是类,用于构建和表示HTTP请求和响应实体。

  • ResponseEntity可以看作是HttpEntity的特化,专注于响应,并且可以方便地设置状态码。

  • 在Spring MVC中,@ResponseBody可以与@RestController注解结合使用,后者是一个组合注解,包含了@Controller@ResponseBody,用于简化RESTful服务的开发。

其他注解

@ExceptionHandler
  • 作用:用于定义全局异常处理方法,捕获并处理控制器中的异常。

  • 使用场景:用于统一处理Web应用程序中的异常。

  • 示例
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        // ...
    }
    
@RestController
  • 作用:是@Controller@ResponseBody的组合,用于创建RESTful风格的Web服务。

  • 使用场景:用于定义RESTful API的控制器。

  • 示例
    @RestController
    public class UserController {
        // ...
    }
    

Rest风格

REST(Representational State Transfer,表现层状态转换)是一种软件架构风格,广泛应用于Web服务的设计中,特别是RESTful Web服务。以下是REST风格的主要内容和实践步骤:

5.1 REST简介

REST的特点:

  • 一种基于HTTP协议的架构风格。

  • 通过HTTP方法(GET, POST, PUT, DELETE)对资源进行操作。

REST与传统风格的对比:

  • 传统风格:URL与操作紧密相关,如http://localhost/user/getById?id=1

  • REST风格:URL简洁,操作通过HTTP方法区分,如http://localhost/user/1

REST的优点:

  • 隐藏资源的访问行为,提高安全性。

  • 书写简化,易于理解和维护。

5.2 REST风格操作

REST风格中HTTP方法的使用:

  • GET:用于查询资源,如http://localhost/users获取所有用户信息。

  • POST:用于新增资源,如http://localhost/users添加新用户。

  • PUT:用于修改资源,如http://localhost/users/1更新特定用户信息。

  • DELETE:用于删除资源,如http://localhost/users/1删除特定用户。

注意事项:

  • REST是一种风格,不是严格的规范,但遵循约定可以提高代码的可读性和可维护性。

  • 资源名称通常使用复数形式,如usersbooks,表示资源集合。

5.3 RESTful开发

RESTful的概念:

  • 根据REST风格对资源进行访问称为RESTful。

开发实践:

  • 在开发中,通常遵循REST风格来设计和访问后台服务。

  • RESTful开发强调资源的表示和状态的转换,而不是具体的操作过程。

5.4 REST风格的优势

降低开发复杂性:

  • 通过统一的接口和资源表示,简化了客户端和服务器端的交互。

提高系统的可伸缩性:

  • RESTful服务可以独立于客户端进行扩展和优化。

结论:

REST风格提供了一种清晰、简洁的方式来设计Web服务,使得资源的访问和操作更加直观和安全。在现代Web开发中,遵循REST风格进行RESTful开发已成为一种最佳实践。

SpringMVC 视图及视图解析器

在SpringMVC框架中,视图(View)和视图解析器(ViewResolver)是处理用户界面渲染的关键组件。以下是对这两个概念的详细总结:

视图解析器对象【ViewResolver】

概述: 视图解析器是ViewResolver接口的具体实现,它的作用是将控制器返回的逻辑视图名解析为实际的视图对象。

作用

  1. 解析视图:将ModelAndView对象中的逻辑视图名解析为实际的视图对象。

  2. 视图定位:根据配置的规则,将视图名转换为实际的视图实现,如JSP、Thymeleaf模板等。

工作流程

  • 控制器方法执行完毕后,会返回一个视图名(逻辑视图名)。

  • 视图解析器根据这个视图名,结合其配置的前缀、后缀等规则,解析出实际的视图实现。

  • 视图解析器将解析后的视图对象返回给SpringMVC,由其进行视图渲染。

视图对象【View】

概述: 视图对象是View接口的具体实现,它负责将模型数据渲染成用户界面。

作用

  1. 数据展示:将模型(Model)中的数据展示给用户。

  2. 视图渲染:根据视图类型(如JSP、Thymeleaf等),将模型数据填充到视图模板中,生成最终的HTML页面。

工作流程

  • 视图解析器解析出视图对象后,SpringMVC将模型数据传递给视图对象。

  • 视图对象根据模型数据和视图模板,进行视图渲染。

  • 渲染完成后,视图对象将生成的HTML页面返回给用户。

视图解析器的配置

在SpringMVC中,可以通过Java配置或XML配置来设置视图解析器:

Java配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
}

XML配置

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>
总结

在SpringMVC中,视图解析器和视图对象共同工作,实现了控制器与用户界面的解耦。视图解析器负责将逻辑视图名解析为实际的视图对象,而视图对象则负责将模型数据渲染成用户界面。这种设计不仅提高了代码的可维护性,也使得视图的渲染过程更加灵活和可配置。通过合理配置视图解析器,可以轻松地集成不同的视图技术,如JSP、Thymeleaf等,以满足不同的开发需求。

SpringMVC 视图控制器、重定向及静态资源加载

在SpringMVC中,视图控制器、重定向和静态资源加载是构建Web应用时常见的需求。

视图控制器

概述:视图控制器用于处理不涉及复杂业务逻辑的页面跳转。

语法<mvc:view-controller>

  • 作用:为特定的URL映射到一个HTML页面,避免了为每个页面跳转创建控制器类。

配置步骤

  1. 在Spring MVC配置文件中添加<mvc:view-controller>标签,指定URL和视图名称。

  2. 添加<mvc:annotation-driven>标签,启用注解驱动,以解决视图控制器可能引起的其他请求路径失效问题。

示例

<mvc:view-controller path="/home" view-name="homePage"/>
<mvc:annotation-driven/>
重定向

概述:重定向用于将用户从一个URL引导到另一个URL。

语法return "redirect:/xxx.html";

  • 作用:在控制器方法中返回一个重定向字符串,实现页面跳转。

示例

@RequestMapping("/oldUrl")
public String redirect() {
    return "redirect:/newUrl";
}
加载静态资源

概述:静态资源包括HTML、CSS、JS等文件,通常由服务器的DefaultServlet处理。

配置

  • 在Tomcat的web.xml中,DefaultServlet被配置为处理/路径的请求,这可能导致与DispatcherServlet的路径冲突。

问题

  • DispatcherServlet和DefaultServlet的URL配置冲突,导致DefaultServlet无法加载静态资源。

解决方案

  1. 在Spring MVC配置中添加<mvc:default-servlet-handler/>标签,允许DefaultServlet处理静态资源。

  2. 确保<mvc:annotation-driven>标签也被添加,以避免影响Spring MVC控制器的正常使用。

示例

<!-- 解决静态资源加载问题 -->
<mvc:default-servlet-handler/>
<!-- 确保注解驱动正常工作 -->
<mvc:annotation-driven/>

文章持续跟新,可以微信搜一搜公众号  rain雨雨编程 ],第一时间阅读,涉及数据分析,机器学习,Java编程,爬虫,实战项目等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值