2024好事发生
文章链接:https://cloud.tencent.com/developer/article/2472759【了解函数式接口FUNCTION】
作者:用户1737293
评价:深入浅出的讲解了函数式接口,文章段落清晰,从开始的介绍到功能应用非常清楚。结构层次分明,非常不错的一篇文章,推荐给各位需要的同学。
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
Spring MVC是Spring框架提供的一个基于Servlet的Web框架,它实现了MVC设计模式。MVC是一种将应用程序分为三个基本部分的软件架构模式:模型(Model)、视图(View)和控制器(Controller)。
Spring MVC通过这三个部分的分离,使得代码更加模块化、易于维护和测试。
Spring MVC具有以下优点:
尽管Spring MVC具有许多优点,但它也存在一些缺点:
控制器是Spring MVC的核心组件之一,负责处理用户的请求并返回模型和视图。在Spring MVC中,控制器通常是一个使用@Controller
注解标记的类。
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello"; // 返回视图名称
}
}
在上面的示例中,MyController
是一个控制器类,它包含一个处理/hello
请求的方法。当请求到达时,该方法会被调用,并返回一个视图名称"hello"
,该名称会被视图解析器解析为实际的视图对象。
@RequestMapping
注解用于将请求映射到控制器的方法上。它可以指定请求的方法(如GET、POST等)、路径等。
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public String getUser(@PathVariable("id") Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "userDetail";
}
@PostMapping
public String createUser(@ModelAttribute User user) {
userService.save(user);
return "redirect:/user/list";
}
}
在上面的示例中,UserController
是一个处理用户相关请求的控制器类。它包含两个方法:getUser
和createUser
。getUser
方法处理GET请求,并通过@PathVariable
注解获取URL中的路径变量id
。createUser
方法处理POST请求,并通过@ModelAttribute
注解将请求参数绑定到User
对象上。
Spring MVC提供了自动数据绑定的功能,可以将请求参数绑定到Java对象上。这大大简化了参数处理的过程。
@PostMapping("/submit")
public String submitForm(@ModelAttribute("userForm") User user) {
// 处理用户对象
return "result";
}
在上面的示例中,submitForm
方法通过@ModelAttribute
注解将请求参数绑定到User
对象上。Spring MVC会自动将请求参数与User
对象的属性进行匹配,并将匹配到的值赋给相应的属性。
视图解析器负责将逻辑视图名解析为实际的视图对象。在Spring MVC中,常用的视图解析器有InternalResourceViewResolver
、ThymeleafViewResolver
等。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
在上面的XML配置中,InternalResourceViewResolver
被配置为视图解析器。它指定了视图文件的前缀和后缀,这样当控制器返回一个视图名称时,视图解析器就可以根据这些配置找到实际的视图文件。
Spring MVC提供了全局异常处理的功能,可以集中处理控制器中抛出的异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Object> handleException(Exception e) {
// 处理异常
return new ResponseEntity<>("Error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上面的示例中,GlobalExceptionHandler
是一个全局异常处理器类。它包含一个处理所有异常的方法handleException
。当控制器中抛出异常时,该方法会被调用,并返回一个包含错误信息的响应实体。
MVC模式最早由Trygve Reenskaug在1978年提出,用于Smalltalk-80环境。随着Web技术的发展,MVC模式逐渐被引入到Web应用程序的开发中。在Java Web领域,Struts是最早实现MVC模式的框架之一。然而,Struts的配置较为繁琐,且性能较低。因此,Spring框架推出了自己的MVC实现——Spring MVC。
Spring框架是一个开源的Java/J2EE全功能栈(full-stack)的应用程序框架,它以IoC(控制反转)和AOP(面向切面编程)为核心,提供了全面的编程和配置支持。随着Spring框架的不断发展,它逐渐成为Java企业级应用开发的首选框架。Spring MVC作为Spring框架的一部分,也逐渐得到了广泛的应用。
在用户认证与授权方面,Spring MVC可以与Spring Security集成,实现用户认证和授权的功能。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
在上面的示例中,WebSecurityConfig
类配置了Spring Security的安全规则。它指定了访问/admin/**
路径的用户必须具有ADMIN
角色,而其他路径则需要用户进行认证。
在数据访问与操作方面,Spring MVC可以与MyBatis、Hibernate等ORM框架集成,实现数据的持久化操作。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findById(Long id) {
return userMapper.findById(id);
}
public void save(User user) {
userMapper.insert(user);
}
}
在上面的示例中,UserService
类是一个服务类,它提供了用户数据的访问和操作功能。它注入了UserMapper
接口,该接口通过MyBatis与数据库进行交互。
在文件上传与下载方面,Spring MVC提供了简单的处理方式。
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 保存文件
file.transferTo(new File("path/to/save/" + file.getOriginalFilename()));
} catch (IOException e) {
e.printStackTrace();
}
return "uploadSuccess";
}
在上面的示例中,uploadFile
方法处理文件上传请求。它通过@RequestParam
注解获取上传的文件对象,并将其保存到指定路径下。
DispatcherServlet
是Spring MVC的核心组件之一,它负责请求的接收、分发和处理。当请求到达时,DispatcherServlet
会根据请求的URL找到对应的控制器方法,并调用该方法处理请求。处理完成后,DispatcherServlet
会将返回的视图名解析为实际的视图对象,并将其呈现给用户。
HandlerMapping
是一个接口,用于将请求映射到相应的控制器。Spring MVC提供了多种实现方式,如RequestMappingHandlerMapping
。当请求到达时,DispatcherServlet
会调用HandlerMapping
来找到对应的控制器方法。
控制器是处理用户请求的核心部分,它负责处理业务逻辑并返回视图。在Spring MVC中,控制器通常是一个使用@Controller
注解标记的类。当请求到达时,DispatcherServlet
会调用控制器中的方法来处理请求。
ModelAndView
是用于封装模型和视图的对象。控制器返回一个ModelAndView
对象,包含模型数据和视图名。DispatcherServlet
会将返回的视图名解析为实际的视图对象,并将其呈现给用户。
视图解析器负责将逻辑视图名解析为实际的视图对象。在Spring MVC中,常用的视图解析器有InternalResourceViewResolver
、ThymeleafViewResolver
等。当控制器返回一个视图名时,视图解析器会根据配置找到实际的视图文件,并将其呈现给用户。
首先,我们需要创建一个Maven项目,并添加Spring MVC的依赖。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
在web.xml
文件中配置DispatcherServlet
作为前端控制器。
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在src/main/resources
目录下创建dispatcher-servlet.xml
配置文件,用于配置处理器映射信息和视图解析器。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
在src/main/java
目录下创建控制器类。
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
在WEB-INF/views
目录下创建hello.jsp
页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, Spring MVC!</h1>
</body>
</html>
启动Tomcat服务器,在浏览器的地址栏输入http://localhost:8080/项目名/hello
,向控制器发送请求。浏览器会跳转到hello.jsp
页面,并显示“Hello, Spring MVC!”字样。
Spring MVC是一个功能强大且灵活的Web开发框架,它基于MVC设计模式,通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。尽管Spring MVC具有一些缺点,如学习曲线较陡峭、配置繁琐、性能稍低、依赖较重等,但其优点仍然使得它成为Java企业级应用开发的首选框架之一。通过深入理解Spring MVC的原理和应用实践,我们可以更好地利用它来构建高质量的Web应用程序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。