学Spring的我头尊的很痛…怎么脑子记不住东西啊学了就忘真烦人…(可能有人会看到,但是这篇只是为了记录自己的一些理解防止我忘记想法,可不一定对)
Spring MVC(Model-View-Controller)是Spring框架中的一个模块,用于构建基于Web的应用程序。它遵循经典的MVC设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),以实现关注点分离,便于管理和维护代码。
主要功能
请求处理:处理来自客户端的HTTP请求并将其映射到相应的控制器方法。
模型管理:控制器处理请求并生成相应的数据模型,将模型传递给视图进行展示。
视图渲染:视图负责生成HTML或其他格式的响应内容,并将其返回给客户端。
核心组件
DispatcherServlet:作为前端控制器(Front Controller),负责将请求分发给适当的处理器。
Controller:处理具体请求的业务逻辑,将模型数据传递给视图。
Model:用于在控制器和视图之间传递数据。
View:负责呈现模型数据,生成响应内容。
工作流程
客户端发送HTTP请求到服务器。
DispatcherServlet接收请求并进行解析。
DispatcherServlet根据请求的URL映射找到对应的控制器。
控制器处理请求,进行业务逻辑处理,生成模型数据。
控制器将模型数据传递给视图。
视图渲染模型数据,生成响应内容(如HTML)。
DispatcherServlet将视图生成的响应内容返回给客户端。
示例
下面是一个简单的Spring MVC示例,用于展示基本的请求处理流程。
配置类:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
}
这段代码的主要目的是配置Spring MVC,使其能够自动扫描指定包下的组件,并将视图名称解析为指定目录下的JSP文件。通过使用注解,简化了Spring应用程序的配置,取代了传统的XML配置文件。
@EnableWebMvc:启用Spring MVC,等同于在XML配置中启用<mvc:annotation-driven />。它导入了Spring MVC的默认配置,例如处理器映射器和处理器适配器。
@ComponentScan(basePackages = “com.example”):指定要扫描的包。Spring会扫描com.example包及其子包中的组件(如控制器、服务、仓库等),并将这些组件注册到Spring容器中。
@override覆盖WebMvcConfigurer中的configureViewResolvers方法,配置视图解析器。
registry.jsp(“/WEB-INF/views/”, “.jsp”)定义了视图解析器将视图名称解析为JSP文件的规则。具体来说,当控制器返回一个视图名称时,会将该视图名称解析为/WEB-INF/views/目录下的JSP文件,并使用.jsp作为文件扩展名。例如,返回"hello"会被解析为/WEB-INF/views/hello.jsp。
控制器
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
这段代码定义了一个简单的Spring MVC控制器,当客户端发送/hello请求时,sayHello方法会被调用。该方法将一条消息添加到Model对象中,并返回视图名称"hello"。视图解析器会将"hello"解析为具体的视图文件,并将Model中的数据传递给视图进行渲染。
@GetMapping(“/hello”):注解@GetMapping用于映射HTTP GET请求到指定的处理方法。
/hello表示当客户端发送/hello请求时,将由sayHello方法进行处理。
public String sayHello(Model model):定义了一个名为sayHello的公共方法,该方法返回一个字符串,并接受一个Model对象作为参数。Model对象用于将数据传递到视图中。
model.addAttribute(“message”, “Hello, Spring MVC!”):将一条消息添加到Model对象中,键为"message",值为"Hello, Spring MVC!“。这些数据将在视图中进行渲染。
return “hello”:返回一个字符串"hello”,表示视图的名称。根据视图解析器的配置,该视图名称将被解析为具体的视图文件,例如/WEB-INF/views/hello.jsp。
视图(hello.jsp)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
主应用程序类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
不过现在用的比较多的是Thymeleaf ,它是一个用于 Java 应用程序的现代服务器端模板引擎,主要用于将后端数据与 HTML 模板结合,生成动态网页。
Thymeleaf能 与 Spring 框架无缝集成,特别是 Spring MVC。它常用于 Spring Boot 项目中,作为默认的模板引擎。通过 Thymeleaf,可以很方便地将控制器中的数据传递给视图,并在视图中进行展示。
大概是这么个流程我想:
感觉model这个东西确实很重要…