0


【JAVA】Spring MVC 详解

Spring MVC 基本概念

1. Spring MVC 概述

Spring MVC 是 Spring 框架中的一个模块,专注于为 Web 应用程序提供 Model-View-Controller (MVC) 架构。它帮助开发者构建可扩展、可维护的 Web 应用,并且能够轻松集成到 Spring 生态系统中。

2. DispatcherServlet

DispatcherServlet 是 Spring MVC 的核心组件,负责接收 HTTP 请求,并将请求分发给相应的处理器(Controller)。它起到了中央控制器的作用。
示例:

@ConfigurationpublicclassWebAppInitializerimplementsWebApplicationInitializer{@OverridepublicvoidonStartup(ServletContext servletContext)throwsServletException{AnnotationConfigWebApplicationContext context =newAnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher",newDispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");}}

在这个例子中,DispatcherServlet 被注册到 ServletContext 中,并映射到根路径。

3. Controller

Controller 是 Spring MVC 中的一个组件,负责处理用户请求,并返回一个 ModelAndView 对象。它将用户的输入与应用程序的业务逻辑连接起来。
示例:

importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.servlet.ModelAndView;@ControllerpublicclassHomeController{@GetMapping("/")publicModelAndViewhome(){ModelAndView mav =newModelAndView("home");
        mav.addObject("message","Welcome to Spring MVC");return mav;}}

在这个例子中,HomeController 处理根路径的 GET 请求,并返回一个包含消息的视图。

4. ModelAndView

ModelAndView 是 Spring MVC 中的一个类,包含了视图名称和模型数据。它将控制器的处理结果传递给视图层。
示例:

ModelAndView mav =newModelAndView("home");
mav.addObject("message","Welcome to Spring MVC");

在这个例子中,ModelAndView 对象包含视图名称 “home” 和模型数据 “message”。

5. @RequestMapping

@RequestMapping 是 Spring MVC 中的一个注解,用于映射 HTTP 请求到控制器的方法。它支持多种 HTTP 方法(GET、POST 等),还可以指定路径和参数。
示例:

importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;@ControllerpublicclassHomeController{@RequestMapping(value ="/", method =RequestMethod.GET)publicStringhome(){return"home";}}

这个例子展示了如何使用 @RequestMapping 将根路径的 GET 请求映射到 home() 方法。

6. @GetMapping 和 @PostMapping

@GetMapping 和 @PostMapping 是 @RequestMapping 的快捷方式,分别用于处理 GET 和 POST 请求。
示例:

@GetMapping("/hello")publicStringhello(){return"hello";}@PostMapping("/submit")publicStringsubmit(){return"submit";}

在这个例子中,@GetMapping 处理 GET 请求,@PostMapping 处理 POST 请求。

7. @PathVariable

@PathVariable 注解用于将 URL 路径中的变量绑定到方法参数上。
示例:

@GetMapping("/user/{id}")publicStringgetUserById(@PathVariable("id")String userId){return"User ID: "+ userId;}

在这个例子中,@PathVariable(“id”) 将 URL 中的 {id} 绑定到方法参数 userId。

8. @RequestParam

@RequestParam 注解用于将查询参数绑定到方法参数上。
示例:

@GetMapping("/search")publicStringsearch(@RequestParam("q")String query){return"Search query: "+ query;}

在这个例子中,@RequestParam(“q”) 将查询参数 q 绑定到方法参数 query。

9. @ModelAttribute

@ModelAttribute 注解用于将请求中的数据绑定到模型对象上,通常用于表单处理。
示例:

@PostMapping("/submit")publicStringsubmitForm(@ModelAttributeUser user){return"Form submitted for user: "+ user.getName();}

在这个例子中,@ModelAttribute 将请求中的表单数据绑定到 User 对象上。

10. 视图解析器(View Resolver)

视图解析器负责将逻辑视图名称解析为物理视图路径。Spring MVC 提供了多种视图解析器,如 InternalResourceViewResolver 和 ThymeleafViewResolver。
示例:

@BeanpublicInternalResourceViewResolverviewResolver(){InternalResourceViewResolver resolver =newInternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");return resolver;}

在这个例子中,InternalResourceViewResolver 将视图名称解析为 JSP 文件路径。

11. 表单处理

Spring MVC 提供了对表单处理的全面支持,包括表单绑定、验证和表单回显。
示例:

importjavax.validation.Valid;importorg.springframework.validation.BindingResult;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.PostMapping;@PostMapping("/register")publicStringregister(@Valid@ModelAttributeUser user,BindingResult result){if(result.hasErrors()){return"register";}return"success";}

在这个例子中,@Valid 注解用于验证 User 对象,BindingResult 用于处理验证结果。

12. 数据验证(Validation)

Spring MVC 支持基于 JSR-303 的数据验证,可以使用注解对模型对象进行验证。
示例:

importjavax.validation.constraints.NotEmpty;publicclassUser{@NotEmpty(message ="Name is required")privateString name;// getter 和 setter 方法}

在这个例子中,@NotEmpty 注解用于验证 name 字段不能为空。

13. 消息转换器(Message Converters)

消息转换器负责将请求数据转换为对象,以及将对象转换为响应数据。Spring MVC 提供了多种内置的消息转换器,如 JSON 和 XML。
示例:

importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.ResponseBody;@PostMapping("/user")@ResponseBodypublicUsercreateUser(@RequestBodyUser user){// 处理用户数据return user;}

在这个例子中,@RequestBody 和 @ResponseBody 注解用于将 JSON 请求数据转换为 User 对象,并将 User 对象转换为 JSON 响应数据。

14. 拦截器(Interceptor)

拦截器用于在请求处理之前或之后执行额外的逻辑。它们类似于过滤器,但更强大,可以访问 Spring MVC 上下文。
示例:

importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassMyInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{// 执行前置逻辑returntrue;}}

在这个例子中,MyInterceptor 实现了 HandlerInterceptor 接口,可以在请求处理之前执行逻辑。

15. 异常处理(Exception Handling)

Spring MVC 提供了多种异常处理机制,包括 @ExceptionHandler、@ControllerAdvice 和 ResponseEntityExceptionHandler。
示例:

importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)publicStringhandleException(Exception e){return"An error occurred: "+ e.getMessage();}}

在这个例子中,@ExceptionHandler 注解用于处理控制器中的异常,@RestControllerAdvice 注解用于全局异常处理。

16. 文件上传

Spring MVC 支持文件上传功能,可以处理 Multipart 文件上传请求。
示例:

importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.multipart.MultipartFile;@PostMapping("/upload")publicStringuploadFile(@RequestParam("file")MultipartFile file){if(!file.isEmpty()){// 处理文件return"File uploaded successfully";}return"File upload failed";}

在这个例子中,@RequestParam 注解用于将上传的文件绑定到 MultipartFile 对象上。

17.RestController

@RestController 是 @Controller 和 @ResponseBody 的组合注解,通常用于构建 RESTful Web 服务。
示例:

importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassApiController{@GetMapping("/api/hello")publicStringhello(){return"Hello, RESTful world!";}}

在这个例子中,@RestController 注解用于构建一个 RESTful API。

18. 国际化(Internationalization, i18n)

Spring MVC 提供了对国际化的全面支持,允许根据用户的区域设置提供不同的语言和格式。
示例:

importorg.springframework.context.annotation.Bean;importorg.springframework.context.support.ResourceBundleMessageSource;@BeanpublicResourceBundleMessageSourcemessageSource(){ResourceBundleMessageSource source =newResourceBundleMessageSource();
    source.setBasename("messages");return source;}

在这个例子中,ResourceBundleMessageSource 用于加载国际化资源文件。

19. Spring MVC 与 Thymeleaf 集成

Thymeleaf 是一种流行的模板引擎,可以与 Spring MVC 集成,用于生成动态的 HTML 页面。
示例:

importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.GetMapping;@ControllerpublicclassThymeleafController{@GetMapping("/greeting")publicStringgreeting(Model model){
        model.addAttribute("message","Hello, Thymeleaf!");return"greeting";}}

在这个例子中,ThymeleafController 处理 /greeting 请求,并返回一个包含消息的 Thymeleaf 模板视图。

20. WebSocket 支持

Spring MVC 提供了对 WebSocket 的支持,允许在 Web 应用程序中实现实时双向通信。
示例:

importorg.springframework.context.annotation.Configuration;importorg.springframework.web.socket.config.annotation.EnableWebSocket;importorg.springframework.web.socket.config.annotation.WebSocketConfigurer;importorg.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublicclassWebSocketConfigimplementsWebSocketConfigurer{@OverridepublicvoidregisterWebSocketHandlers(WebSocketHandlerRegistry registry){
        registry.addHandler(newMyWebSocketHandler(),"/ws");}}

在这个例子中,WebSocketConfig 配置了一个 WebSocket 处理器,用于处理 /ws 路径的 WebSocket 连接。

总结

Spring MVC 是一个功能强大的框架,提供了广泛的工具和特性来构建现代 Web 应用程序。通过理解和掌握上述每一个知识点,开发者可以更高效地构建出可扩展、维护性强的 Web 应用。

标签: java spring mvc

本文转载自: https://blog.csdn.net/weixin_37559642/article/details/142127152
版权归原作者 弗瑞德学JAVA 所有, 如有侵权,请联系我们删除。

“【JAVA】Spring MVC 详解”的评论:

还没有评论