歪比巴卜~~~~
一、SpringMvc是什么?
个人理解:是Spring这个容器里面的一个技术框架,主要方便管理表现层这一层(Controller)
MVC主要架构:
| 表现层(Controller) | 主要拦截用户请求,调用处理器调用各个Controller并返回视图 |
| 业务层(Service) | 接收前端传过来的参数,调用Dao层完成复杂的业务逻辑 |
| 持久层(Dao) | 直接与数据库交互,负责传输数据给业务层 |
本篇主要通过xml配置文件简单的叙述SpringMVC执行原理,底层原理博主也不懂,等我学会了再讲详细一点
二、SpringMvc讲解
在之前学习过JavaWeb的吴彦祖们都知道,要想接收到用户的请求,必须要有实现了Servlet接口实现类,通过 Servlet 的 service() 方法才能知道用户想要干什么。不同请求可能会需要写多个Servlet类来处理业务逻辑。这样会非常不方便,所以Spring MVC 的核心思想就是统一管理:用一个 DispatcherServlet 接收所有请求,我们只需要实现 Controller 接口专注业务逻辑就行, 因为这一切 Spring MVC 都帮我们搞定了!

图中大概就是SpringMvc的执行流程和顺序,下面简单叙述
假设用户的请求地址:http://localhost:8080/SpringMvc01_config/hello
1.用户发起了请求,被DispathcerServlet拦截并对URL进行拆分
协议:http://
ip地址:localhost
端口号:8080
应用上下文:/SpringMvc01_config
请求的路径:/hello
2.DispathcerServlet调用HandlerMapping:嘿,Bro来活该咋办?(把/hello传过去)
3.HandlerMapping会根据/hello在配置文件里找到HelloControlle控制类路径,并告诉DispathcerServle还需要做啥,这些就是HandlerExecution
4.DispathcerServlet收到这些具体信息,就知道该咋办了
5.DispathcerServlet调用HandlerAdapter, 让他去执行对应的Handler(Handler有很多类型,HandlerAdapter提供了统一的接口)
6.具体的Handler执行具体的Controlle
7.Controlle执行返回信息(ModelAndView)给HandlerAdapter
8.HandlerAdapter再把信息传给DispathcerServlet
9.DispathcerServlet把信息传给ViewResolver
10.ViewResolver解析信息传给DispathcerServlet
11.DispathcerServlet通过解析信息知道具体调用哪个视图给用户
三、配置SpringMvc
1.使用maven工具创建父文件夹
在父文夹中的pom.xml添加核心依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SpringMvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>Spring_mvc1</module>
<module>Spring_mvc2</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
2.在父文件夹中创建子maven项目
子maven项目中添加web工程
配置web.xml
和配置Servlet格式一样,都需要配置<servlet>和<servlet-mapping>标签,因为DispatcherServlet就相当于一个Servlet
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.在resources目录下创建springmvc-servlet.xml
org.example.HelloController是自己是自己实现控制类的包名
处理映射器会根据id="/hello"找到这个控制类
再由处理适配器执行该控制类
视图解析器会解析控制类返回的ModelAndView,假如ModelAndView里面设置视图名字是hello,那么视图解析器会进行拼接:/WEB-INF/jsp/hello.jsp
所以前缀主value值是存放视图位置的目录路径,后缀value值存放该视图的文件类型
<!-- 处理映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--Handler-->
<bean id="/hello" class="org.example.HelloController"/>
4.创建HelloController控制类
只要实现了Controller接口就是一个控制类,里面创建ModelAndView对象,通过该对象设置需要显示的内容以及需要跳转的视图名。
这里mv.addObject("msg","灵魂汁子~浇给~~~~");是一个Map类型,hello.jsp通过msg知道要显示的信息。
public class HelloController implements Controller {
@Nullable
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中。Model
mv.addObject("msg","灵魂汁子~浇给~~~~");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello");
//: /WEB-INF/jsp/hello.jsp
return mv;
}
}
5.在WEB-INF/jsp下创建hello.jsp
用js格式写入msg接收具体信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>
</title>
</head>
<body>
${msg}
</body>
</html>
6.运行结果

四、补充
运行不成功参考博主配置:jdk8 + tomcat9.0+
报404:检查跳转视图路径是否有错误
<url-pattern>/</url-pattern>该标签中一定是/
mv.setViewName("hello")设置视图名不要加文件格式
手动创建lib,点+号全选,添加依赖


3万+

被折叠的 条评论
为什么被折叠?



