9.1 MVC模式
MVC的三个核心部分:
- 模型(Model):
- 模型是应用程序中用于处理数据和业务逻辑的部分。
- 它通常包含应用程序的状态信息(即数据)以及用于访问和修改这些数据的逻辑。
- 模型是独立的,它不关心数据如何显示或用户如何与之交互。
- 它可以与数据库或其他存储系统直接交互,以存储和检索数据。
- 视图(View):
- 视图是应用程序的用户界面部分,负责显示数据给用户。
- 它从模型中获取数据,并将其以用户可理解的方式展示出来。
- 视图通常不知道模型是如何实现的,它只是显示模型提供的数据。
- 视图可以接收用户的输入,但它不处理这些输入,而是将它们传递给控制器。
- 控制器(Controller):
- 控制器是模型和视图之间的桥梁,它处理用户的输入(如点击按钮或提交表单)。
- 它接收用户的请求,并根据这些请求调用模型和视图去完成相应的任务。
- 控制器从视图接收用户输入,然后调用模型来处理这些输入,并将处理结果返回给视图进行显示。
- 控制器还可以处理应用程序的流程控制,例如导航到不同的视图
上面JSP+Servlet+JavaBean的模式就是最典型的MVC模式,在这种模式下,应用程序中每个层级的代码各司其职,结构非常清晰,如下所示
控制器由Servlet担任,接收前端请求并调用JavaBean,相当于一个工作调度人员,JavaBean实现了模型的功能,处理业务并操作数据库,视图由JSP实现,负责MVC结构流程图如下所示
上面的图片阐述了MVC模式三个部分(模型,视图,控制器)的功能职责,并对各部分之间的调用关系进行了描述,从中可以分析出MVC整体的处理过程如下:
(1)视图提供系统与用户交互的界面,并发送用户输入的请求给控制器。
(2)控制器接收用户的请求,并决定应该调用的模型
(3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)
(4)控制器根据返回的处理结构,调用相应的视图格式化模型返回的数据,并通过视图呈现给用户。
MVC(Model-View-Controller)模式作为一种广泛使用的软件设计模式,在软件开发中具有许多优点,但同时也存在一些潜在的缺点。
优点
-
低耦合性:MVC模式通过将应用程序划分为三个核心部分(模型、视图、控制器),降低了它们之间的耦合度。这种低耦合性使得在修改或扩展某个部分时,不需要对其他部分进行大量的修改,从而提高了代码的灵活性和可维护性。
-
高内聚性:每个部分都专注于其特定的职责。模型负责数据处理和业务逻辑,视图负责数据展示,控制器负责用户输入和业务流程控制。这种高内聚性使得代码更加模块化,易于理解和维护。
-
可重用性:由于视图和控制器与模型分离,因此相同的模型可以被多个视图共享,从而提高了代码的重用性。
-
清晰的职责划分:MVC模式为开发者提供了一种清晰的开发思路,使得每个开发者都可以专注于自己擅长的领域(如前端开发者可以专注于视图层,后端开发者可以专注于模型层和控制层)。
-
易于测试:由于模型、视图和控制器之间的低耦合性,可以更容易地对它们进行单元测试。特别是模型层,由于它不依赖于视图和控制器的实现,因此可以独立于其他部分进行测试。
-
支持并行开发:由于MVC模式将应用程序划分为相对独立的三个部分,因此不同的团队或开发者可以并行地开发这三个部分,从而提高了开发效率。
缺点
-
增加了复杂性:对于小型或简单的应用程序来说,引入MVC模式可能会增加额外的复杂性和开销。因为这些应用程序可能不需要如此严格的职责划分和分离。
-
学习曲线:对于新手开发者来说,理解和实现MVC模式可能需要一定的时间和努力。特别是当涉及到复杂的业务逻辑和交互流程时,可能需要更多的时间和精力来掌握。
-
调试困难:由于MVC模式将应用程序划分为多个部分,并在它们之间传递数据和控制流,因此在出现错误或问题时,可能需要跨多个部分进行调试。这可能会增加调试的难度和时间成本。
-
过度设计:在某些情况下,开发者可能会过度设计MVC模式,导致应用程序变得过于复杂和庞大。这可能会降低开发效率,并增加维护成本。
-
视图与模型之间的同步问题:在某些情况下,视图可能需要直接访问或修改模型的数据。然而,由于MVC模式强调低耦合性,因此这种直接访问可能会破坏模型的封装性,并导致视图与模型之间的同步问题。为了解决这个问题,可能需要引入额外的机制(如观察者模式)来同步视图和模型之间的数据。
9.2搭建Spring MVC环境
搭建Spring MVC环境是一个涉及多个步骤的过程,主要包括项目创建、依赖配置、配置文件编写以及控制器和视图层的开发等。以下是一个基于Maven和IDEA的Spring MVC环境搭建步骤概览:
1. 准备开发环境
- 安装Java JDK:确保安装了Java Development Kit(JDK),Spring MVC通常要求JDK 8或更高版本。
- 安装IDE:如IntelliJ IDEA,这是一个流行的Java集成开发环境(IDE)。
- 安装Maven(如果尚未安装):Maven是一个项目管理工具,用于构建和管理项目依赖。
2. 创建Maven项目
- 打开IDEA,选择“File” -> “New” -> “Project”。
- 在弹出的窗口中,选择“Maven”作为项目类型,然后点击“Next”。
- 填写项目的GroupId、ArtifactId和Version等信息,点击“Next”。
- 在接下来的窗口中,可以选择Maven的archetype,但对于Spring MVC项目,通常不需要特定的archetype,因此可以直接跳过此步骤。
- 点击“Finish”完成项目创建。
3. 配置Maven依赖
在项目的pom.xml
文件中添加Spring MVC及相关依赖。以下是一些基本的依赖示例:
<dependencies>
<!-- Spring MVC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.x</version> <!-- 请根据实际需要选择合适的版本 -->
</dependency>
<!-- Servlet API依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 其他可能的依赖,如Spring核心、JSON处理等 -->
<!-- ... -->
</dependencies>
4. 配置web.xml
在src/main/webapp/WEB-INF
目录下创建或编辑web.xml
文件,添加Spring MVC的DispatcherServlet配置。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 其他配置,如欢迎文件列表等 -->
<!-- ... -->
</web-app>
5. 创建Spring MVC配置文件
在src/main/resources
目录下创建spring-dispatcher-servlet.xml
(文件名应与web.xml
中配置的contextConfigLocation
相匹配),并配置Spring MVC的bean和其他设置。
<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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启用注解驱动的Spring MVC -->
<mvc:annotation-driven/>
<!-- 组件扫描,以发现带有@Controller的类 -->
9.2.2 使用注解开发Spring MVC框架
使用注解来开发Spring MVC框架是现代Java Web开发中的一种流行做法,因为它可以减少XML配置文件的复杂性,并使代码更加简洁和易于维护。以下是一个基于注解的Spring MVC框架开发的基本步骤:
1. 添加必要的依赖
首先,确保你的pom.xml
(如果你使用的是Maven)或build.gradle
(如果你使用的是Gradle)中包含了Spring MVC和其他必要的依赖项,如Servlet API、JSP API(如果你打算使用JSP作为视图技术)等。
对于Maven,依赖项可能如下所示:
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.x</version> <!-- 使用适合你的项目的版本 -->
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JSP API(如果你使用JSP) -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- 其他可能的依赖,如数据库连接池、ORM框架等 -->
<!-- ... -->
</dependencies>
2. 配置Spring MVC
使用Java配置来替代web.xml
和spring-dispatcher-servlet.xml
。你可以创建一个配置类,并使用@Configuration
、@EnableWebMvc
等注解来启用Spring MVC。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.yourcompany.yourapp") // 扫描你的控制器等组件
public class WebConfig implements WebMvcConfigurer {
// 实现WebMvcConfigurer接口来定制Spring MVC的行为
// 例如,添加静态资源处理器、拦截器、视图解析器等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
// 其他配置...
}
3. 配置Servlet 3.0的Web应用初始化器
如果你不使用web.xml
,则需要实现一个WebApplicationInitializer
接口来配置Servlet容器
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(WebConfig.class); // 注册你的配置类
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
}
}
4. 创建控制器
使用@Controller
注解来标记你的控制器类,并使用@RequestMapping
等注解来映射请求。
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home"; // 返回视图名,Spring MVC会查找相应的视图文件
}
// 其他控制器方法...
}
5. 配置视图解析器
在你的配置类中,你可以通过实现WebMvcConfigurer
接口来配置视图解析器。
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
registry.viewResolver(resolver);
}
6. 开发视图
根据你的配置(例如,如果你使用JSP),在/WEB-INF/views/
目录下创建相应的JSP文件。
7. 运行和测试
将你的应用部署到Servlet容器中(如Tomcat、Jetty等),并访问你的应用来测试它是否按预期工作。
这就是使用注解来开发Spring MVC框架的基本步骤。注意,这些步骤可以根据你的具体需求进行调整和扩展。