赞
踩
MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块:
Model
(模型)View
(视图)Controller
(控制器)业务处理及数据的收集
数据的展示
调度
。它是一个调度中心,它来决定什么时候调用Model来处理业务,什么时候调用View视图来展示数据。MVC架构模式如下所示:
MVC架构模式的描述:前端浏览器发送请求给web服务器,web服务器中的Controller接收到用户的请求,Controller负责将前端提交的数据进行封装,然后Controller调用Model来处理业务,当Model处理完业务后会返回处理之后的数据给Controller,Controller再调用View来完成数据的展示,最终将结果响应给浏览器,浏览器进行渲染展示页面。
MVC 和三层模型都采用了
分层结构
来设计应用程序,都是降低耦合度,提高扩展力,提高组件复用性。区别在于:
他们的关注点不同,三层模型更加关注业务逻辑组件的划分。
MVC架构模式关注的是整个应用程序的层次关系和分离思想。现代的开发方式大部分都是MVC架构模式结合三层模型一起用。
SpringMVC是一个实现了MVC架构模式的Web框架,底层基于
Servlet
实现。
SpringMVC已经将MVC架构模式实现了,因此只要我们是基于SpringMVC框架写代码,编写的程序就是符合MVC架构模式的。(MVC的架子搭好了,我们只需要添添补补)
Spring框架中有一个子项目叫做Spring Web
,Spring Web子项目当中包含很多模块,例如:
可见 SpringMVC是Spring Web子项目当中的一个模块。因此也可以说SpringMVC是Spring框架的一部分。以下就是Spring官方给出的Spring架构图,其中Web中的servlet指的就是Spring MVC:
SpringMVC框架帮我们做了什么,与纯粹的Servlet开发有什么区别?
DispatcherServlet
作为入口控制器,负责接收请求和分发请求。而在Servlet开发中,需要自己编写Servlet程序,并在web.xml中进行配置,才能接受和处理请求。总之,与Servlet开发相比,SpringMVC框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。
约定大于配置
的原则,对常用的配置约定进行自动化配置。第一步:创建Empty Project,起名:springmvc
第二步:设置springmvc工程的JDK版本:Java21
第三步:设置maven
第四步:创建Maven模块
第五步:将pom.xml文件中的打包方式修改为war
<groupId>com.powernode.springmvc</groupId>
<artifactId>springmvc-001</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式设置为war方式 -->
<packaging>war</packaging>
第六步:添加以下依赖
<dependencies>
<!-- Spring MVC依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.1.4</version>
</dependency>
<!--日志框架Logback依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.3</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!--Spring6和Thymeleaf整合依赖-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring6</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
</dependencies>
第一步:在main
目录下创建一个webapp
目录
第二步:添加web.xml
配置文件
注意 web.xml 文件的位置:D:\Java_Project\springmvc\springmvc-001
\src\main\webapp\WEB-INF\web.xml
注意版本选择:6.0
添加web支持后的目录结构:
Spring MVC是一个web框架,在javaweb中谁来负责接收请求,处理请求,以及响应呢?当然是
Servlet
。在SpringMVC框架中已经为我们写好了一个Servlet,它的名字叫做:DispatcherServlet
,我们称其为前端控制器。既然是Servlet,那么它就需要在web.xml文件中进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<!--SpringMVC提供的前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- /* 表示任何一个请求都交给DispatcherServlet来处理 -->
<!-- / 表示当请求不是xx.jsp的时候,DispatcherServlet来负责处理本次请求-->
<!-- jsp本质就是Servlet,因此如果请求是jsp的话,应该走它自己的Servlet,而不应该走DispatcherServlet -->
<!-- 因此我们的 url-pattern 使用 / -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
DispatcherServlet是SpringMVC框架为我们提供的最核心的类,它是整个SpringMVC框架的前端控制器,负责接收HTTP请求、将请求路由到处理程序、处理响应信息,最终将响应返回给客户端。DispatcherServlet是Web应用程序的主要入口点之一,它的职责包括:
DispatcherServlet接收到请求之后,会根据请求路径分发到对应的Controller,Controller来负责处理请求的核心业务。在SpringMVC框架中Controller是一个普通的Java类(一个普通的POJO类,不需要继承任何类或实现任何接口),需要注意的是:POJO类要纳入IoC容器来管理,POJO类的生命周期由Spring来管理,因此要使用注解标注:
package com.liming.controller;
import org.springframework.stereotype.Controller;
/**
* @author LiMing
* @version 1.0
* @description:
* @date 2024/4/7 14:31
*/
@Controller
public class FirstController {
}
SpringMVC框架有它自己的配置文件,该配置文件的名字默认为:<servlet-name>-servlet.xml,默认存放的位置是WEB-INF 目录下:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--组件扫描-->
<context:component-scan base-package="com.liming.controller"/>
<!--视图解析器-->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
<!--作用于视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"/>
<!--如果配置多个视图解析器,它来决定优先使用哪个视图解析器,它的值越小优先级越高-->
<property name="order" value="1"/>
<!--当 ThymeleafViewResolver 渲染模板时,会使用该模板引擎来解析、编译和渲染模板-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring6.SpringTemplateEngine">
<!--用于指定 Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、模板资源名称、文件编码等信息,加载模板并对其进行解析-->
<property name="templateResolver">
<bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
<!--设置模板文件的位置(前缀)-->
<property name="prefix" value="/WEB-INF/templates/"/>
<!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html-->
<property name="suffix" value=".html"/>
<!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等-->
<property name="templateMode" value="HTML"/>
<!--用于模板文件在读取和解析过程中采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
在WEB-INF目录下新建springmvc-servlet.xml文件,并且提供以上配置信息。
以上配置主要两项:
注意:如果采用了其它视图,请配置对应的视图解析器,例如:
在
WEB-INF
目录下新建templates
目录,在templates目录中新建html
文件,例如:first.html,并提供以下代码:
<!DOCTYPE html>
<!--指定 th 命名空间,让 Thymeleaf 标准表达式可以被解析和执行-->
<!--th不是固定的,可以指定其它的命名空间,只不过大部分情况下用th-->
<!--表示程序中出现的 th 开头的后面代码都是 Thymeleaf语法,需要被 Thymeleaf识别-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>first springmvc</title>
</head>
<body>
<h1>我的第一个Spring MVC程序</h1>
</body>
</html>
对于每一个Thymeleaf文件来说 xmlns:th="http://www.thymeleaf.org" 是必须要写的,为了方便后续开发,可以将其添加到html模板文件中:
package com.liming.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author LiMing
* @version 1.0
* @description:
* @date 2024/4/7 10:34
*/
@Controller
public class FirstController {
@RequestMapping(value="/haha")
public String test(){
System.out.println("正在处理请求....");
// 返回逻辑视图名称(决定跳转到哪个页面)
return "first";
}
}
第一步:配置Tomcat服务器
第二步:部署web模块到Tomcat服务器
第三步:启动Tomcat服务器。如果在控制台输出的信息有中文乱码,请修改tomcat服务器配置文件:apache-tomcat-8.5.99\conf\logging.properties
第四步:打开浏览器,在浏览器地址栏上输入地址:http://localhost:8081/springmvc/haha
后端控制台输出:
http://localhost:8081/springmvc/haha
DispatcherServlet
接收到请求/haha
映射到 FirstController#test(),调用该方法first
给视图解析器/WEB-INF/templates/first.html
文件,并进行解析,生成视图解析对象返回给前端控制器DispatcherServlet一个Controller可以提供多个方法,每个方法通常是处理对应的请求,例如:
@Controller
public class FirstController {
@RequestMapping(value="/haha")
public String test(){
System.out.println("正在处理请求....");
// 返回逻辑视图名称(决定跳转到哪个页面)
return "first";
}
@RequestMapping("/other")
public String other(){
System.out.println("正在处理其它请求...");
return "other";
}
}
提供 other.html 文件
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>other</title>
</head>
<body>
<h1>other ...</h1>
</body>
</html>
在 first.html 文件中,添加超链接,用超链接发送 /other
请求:
<!DOCTYPE html>
<!--指定 th 命名空间,让 Thymeleaf 标准表达式可以被解析和执行-->
<!--th不是固定的,可以指定其它的命名空间,只不过大部分情况下用th-->
<!--表示程序中出现的 th 开头的后面代码都是 Thymeleaf语法,需要被 Thymeleaf识别-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>first springmvc</title>
</head>
<body>
<h1>我的第一个Spring MVC程序</h1>
<!-- th: 表示后面的代码可以编写Thymeleaf语法,可以被Thymeleaf语法解析 -->
<!-- Thymeleaf检测到以 / 开始,表示绝对路径,自动会将webapp的上下文路径加上去 -->
<!-- 最终的效果是:href="/springmvc/other" -->
<a th:href="@{/other}">other请求</a>
</body>
</html>
启动Tomcat,打开浏览器,输入请求路径:http://localhost:8081/springmvc/haha
点击超链接:other请求
webapp目录没有小蓝点怎么办?添加web支持
重点:SpringMVC配置文件的名字和路径是可以手动设置的,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--手动设置springmvc配置文件的路径及名字-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--为了提高用户的第一次访问效率,建议在web服务器启动时初始化前端控制器-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
通过<init-param>来设置SpringMVC配置文件的
路径
和名字
。在DispatcherServlet的init
方法执行时设置的。
<load-on-startup>1</load-on-startup>建议加上,这样可以提高用户第一次访问的效率。表示在web服务器启动时初始化DispatcherServlet
。
package com.liming.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author LiMing
* @version 1.0
* @description:
* @date 2024/4/8 0:02
*/
@Controller
public class IndexController {
@RequestMapping("/")
public String toIndex(){
return "index";
}
}
表示请求路径如果是:http://localhost:8081/springmvc/ ,则进入 /WEB-INF/templates/index.html
页面
配置内容和之前一样,一个是视图解析器
,一个是组件扫描
。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index page</title>
</head>
<body>
<h1>index page</h1>
</body>
</html>
部署到web服务器,启动web服务器,打开浏览器,在地址栏上输入:http://localhost:8081/springmvc/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。