在软件开发的广袤天地中,MVC 模式宛如一座明亮的灯塔,指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块,更是将 MVC 模式的优势发挥得淋漓尽致,堪称 Servlet 的强力升级版。
MVC 思想并非特定编程语言或者 web 应用所独有的,它是一种广泛适用的规范。通过将一个应用清晰地划分为 Model、View 和 Controller 三个基本部分,这三个部分以最小的耦合协同工作,极大地提高了应用的可扩展性和可维护性。就像一辆汽车,发动机(Model)负责提供动力,仪表盘(View)负责展示信息,方向盘和变速箱(Controller)负责控制方向和速度,它们各司其职又协同配合,共同保证汽车的正常运行。
搭建 SpringMVC 项目的第一步,是创建一个 WEB 工程。就像搭建一座房子,首先要打好地基。创建好工程后,我们需要引入开发所需的 jar 包,这些 jar 包就如同建房所需的各种建筑材料。通过在项目的pom.xml
文件中进行如下配置来引入依赖:
xml
5.0.2.RELEASE
com.fasterxml.jackson.core
jackson-databind
2.9.0
com.fasterxml.jackson.core
jackson-core
2.9.0
com.fasterxml.jackson.core
jackson-annotations
2.9.0
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
ch.qos.logback
logback-classic
1.2.3
org.thymeleaf
thymeleaf-spring4
3.0.9.RELEASE
接下来,我们需要对web.xml
配置文档进行更改。web.xml
就像是一个交通指挥中心,负责配置整个 web 应用的一些关键信息。首先,我们要确保web - app
标签的配置正确,指定合适的版本和相关命名空间:
xml
Spring MVC 的核心是基于原生 servlet 的强大前端控制器 DispatcherServlet,它就像一个智能的交通警察,对所有的请求和响应进行统一处理。在web.xml
中配置 DispatcherServlet 的过程如下:
xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
true
encoding
UTF-8
encodingFilter
/*
default
*.html
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatcherServlet
/
/index.html
我们需要编写index.html
和suc.html
页面。index.html
就像是应用的大门,用户从这里进入应用,它提供了一个简单的界面,包含一个指向/SpringMVCDemo/hello.do
的超链接:
html
入门程序
入门
入门程序
suc.html
则是用于展示处理结果的页面,它使用了 Thymeleaf 模板引擎来动态渲染数据:
html
成功
Hello
创建一个HelloController
类,使用@Controller
注解将其交给 IOC 容器进行管理,就像把一把钥匙交给管理员,让管理员来管理这个类的生命周期和依赖注入等操作。在这个类中,编写一个处理请求的方法sayHello
,使用@RequestMapping
注解来映射请求路径:
java
//把当前类交给IOC容器进行管理
@Controller
public class HelloController {
/**
* 处理超链接发送出来的请求
* @param model 用于向视图传递数据的模型对象
* @return 返回视图名称
*/
@RequestMapping(path = "/hello.do")
public String sayHello(Model model){
System.out.println("入门方法执行了2...");
// 向模型中添加属性msg与值,可以在html页面中取出并渲染
model.addAttribute("msg","hello,SpringMVC");
// 配置了视图解析器后,直接返回视图名称suc,视图解析器会根据配置找到对应的实际页面
return "suc";
}
}
springmvc.xml
是 Spring MVC 的重要配置文件,它就像一个指挥家,协调着各个组件的工作。在这个文件中,我们进行了如下配置:
xml
完成上述所有配置后,启动 Tomcat 服务器进行测试。如果一切配置正确,当用户访问index.html
页面并点击 “入门程序” 超链接时,会触发HelloController
中的sayHello
方法,最终跳转到suc.html
页面并展示 “hello,SpringMVC” 的信息。
Spring 的 web 框架就像是一个精心设计的交响乐团队,而 DispatcherServlet 则是这个团队中的指挥家。它的核心作用是将请求精准地发送到不同的处理器,确保整个应用的流程顺畅运行。在启动 Tomcat 服务器时,由于配置了load - on - startup
标签,DispatcherServlet 对象会被创建,同时它会加载springmvc.xml
配置文件,就像指挥家在演出前会仔细研究乐谱一样,DispatcherServlet 通过加载配置文件来了解整个应用的架构和流程。
load - on - startup
配置为 1,DispatcherServlet 对象被创建,并且它会根据contextConfigLocation
参数的值加载springmvc.xml
配置文件。在这个过程中,Spring 容器被初始化,各种组件被创建并注册到容器中,就像搭建一个舞台,准备好各种道具和演员。@Controller
注解标记的HelloController
对象会被 Spring 容器创建,就像导演挑选演员并让他们做好演出准备。index.jsp
(这里假设index.html
重定向到了index.jsp
,实际情况中也可以直接从index.html
发起请求)发送请求时 请求会如同传递接力棒一般,率先抵达 DispatcherServlet 这个核心控制器。DispatcherServlet 会仔细审视请求的路径,依据配置在HelloController
类中sayHello
方法上的@RequestMapping
注解,精准地找到需要执行的具体方法。这就好比在一个大型图书馆中,根据索引目录快速定位到所需的书籍。
视图解析与页面查找:sayHello
方法执行完毕后会返回一个视图名称(在这里是suc
)。此时,视图解析器开始发挥关键作用,它会依据在springmvc.xml
中配置的规则去寻找对应的实际页面。以本案例的配置来说,视图解析器ThymeleafViewResolver
会在/html/
目录下查找名为suc.html
的文件。这类似于按照地图的指引,在城市的特定区域找到目标建筑。
页面渲染与响应:Tomcat 服务器找到suc.html
页面后,会根据 Thymeleaf 模板引擎的规则对其进行渲染。在渲染过程中,sayHello
方法通过model.addAttribute("msg","hello,SpringMVC")
设置的msg
属性值会被动态地填充到页面中对应的位置。最终,渲染好的页面作为响应返回给用户,用户在浏览器中就能看到展示了 “hello,SpringMVC” 信息的页面,完成一次完整的请求处理流程,就像一场精彩的演出完美落幕,观众欣赏到了最终的成果。
BeanNameUrlHandlerMapping
会根据处理器的 Bean 名称来映射请求。可以将其想象成一个智能的导航系统,根据输入的目的地信息,规划出到达目的地的路线,这里的目的地就是请求要访问的处理器。HelloController
中的sayHello
方法。它负责接收请求参数,调用相关的业务逻辑方法进行处理,然后返回处理结果。好比工厂中的工人,根据订单要求进行生产加工,最终产出产品。SimpleControllerHandlerAdapter
用于适配实现了Controller
接口的处理器。它类似于一个万能插头转换器,将不同规格的插头(请求)转换为能插入特定插座(处理器)的形式,确保请求能够正确地被处理器处理。ThymeleafViewResolver
根据配置的前缀/html/
和后缀.html
,以及视图名称suc
,找到suc.html
页面并进行解析。它就像一个翻译官,将抽象的视图名称翻译为具体的、可展示的页面资源。suc.html
就是视图,通过 Thymeleaf 模板语法将model
中的msg
数据展示在页面上。视图就像是一幅精美的画作,将各种元素(数据)组合在一起,呈现给观众(用户)欣赏。