DispatcherServlet 的作用是将请求分发到不同的处理器。
从 Spring 2.5 开始,使用 Java 5 或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;
正因为 SpringMVC 简单、便捷、易学,天生和 Spring 无缝集成(使用 SpringIOC 和 Aop),使用 约定优于配置,能够进行简单的 JUnit 测试、支持 Restful 风格、异常处理、本地化、国际化、数据验证、类型转换、拦截器,等等… 所以我们要学习。
Spring MVC 框架像许多其他 MVC 框架一样,以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能,DispatcherServlet 是一个实际的 Servlet (它继承自 HttpServlet
基类)。
多看几张原理图,体会一下。。。
上图为 SpringMVC 的一个较完整的流程图,实线表示 SpringMVC 框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
DispatcherServlet 表示前置控制器,是整个 SpringMVC 的控制中心。
用户发出请求,DispatcherServlet 接收请求并拦截请求。
我们假设请求的 URL 为 : http://localhost:8080/sm/hello
如上 URL 拆分成三部分:
-
http://localhost:8080
表示服务器域名 -
sm
表示部署在服务器上的 web 站点 -
hello
表示控制器
通过分析,如上URL表示为:
-
请求位于服务器
localhost:8080
上的sm
站点的hello
控制器,用户发出请求。 -
HandlerMapping 为处理器映射。
DispatcherServlet 调用 HandlerMapping,HandlerMapping 根据请求 url 查找 Handler。
-
HandlerExecution 表示具体的 Handler。
主要作用是根据 url 查找控制器,如上 url 被查找控制器为:
hello
。 -
HandlerExecution 将解析后的信息传递给 DispatcherServlet,如解析控制器映射等。
-
HandlerAdapter 表示处理器适配器,其按照特定的规则去执行 Handler。
-
Handler 让具体的 Controller 执行。
-
Controller 将具体的执行信息返回给 HandlerAdapter,如 ModelAndView。
-
HandlerAdapter 将视图逻辑名或模型传递给 DispatcherServlet。
-
DispatcherServlet 调用视图解析器 (ViewResolver) 解析 HandlerAdapter 传递的逻辑视图名。
-
视图解析器 将解析的逻辑视图名传给 DispatcherServlet。
-
DispatcherServlet 根据视图解析器解析的视图结果,调用具体的视图。
-
最终视图呈现给用户。
==========================================================================
xml 配置版就是体验一下,开发中不会使用,用的更多的是注解版。
新建一个 Moudle , springmvc-hello
, 添加 web 的支持。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.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>
3、配置 web.xml,注册 DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--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>
</web-app>
4、编写 SpringMVC 的配置文件:springmvc-servlet.xml
resources
下创建配置文件springmvc-servlet.xml
,往其中添加以下配置:
-
处理映射器(BeanNameUrlHandlerMapping)
-
处理适配器(SimpleControllerHandlerAdapter)
-
视图解析器(InternalResourceViewResolver)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--添加处理映射器-->
<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="com.yusael.controller.HelloController"/>
</beans>
Controller
要么实现 Controller
接口,要么使用 @Controller
注解;
- 实现
Controller
需要返回一个ModelAndView
,封装 数据 和 视图;
package com.yusael.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 实现 Controller 接口
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
// 封装对象, 放在 ModelAndView 中
mv.addObject("msg", "HelloSpringMVC!");
// 封装要跳转的视图,放在 ModelAndView 中
mv.setViewName("hello"); // 根据视图解析器, 自动拼接成 /WEB-INF/jsp/hello.jsp
return mv;
}
}
springmvc-servlet.xml
中将自己的类交给 SpringIOC 容器,注册 bean:
<!--Handler-->
<bean id="/hello" class="com.yusael.controller.HelloController"/>
编写一个要跳转 hello.jsp
页面,显示 ModelandView
存放的数据,以及我们的正常页面;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>yusael</title>
</head>
<body>
${msg}
</body>
</html>
URL:http:localhost:8080/hello
在 IDEA 的项目发布中,添加 lib 依赖!
- 重启 Tomcat 即可解决!
======================================================================
新建一个 Moudle,springmvc-hello-annotation
,添加 web 支持。
主要有 Spring 框架核心库、Spring MVC、servlet , JSTL 等。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.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>
资源过滤 问题
由于 Maven 可能存在 资源过滤 的问题,pom.xml
增加如下配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
3、配置 web.xml,注册 DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--1.注册servlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 关联 SpringMVC 配置文件 -->
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动顺序,数字越小,启动越早 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会被springmvc拦截 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
/ 和 /* 的区别
<url-pattern> / </url-pattern>
不会匹配到 .jsp
, 只针对我们编写的请求;即:.jsp
不会进入 spring 的 DispatcherServlet
类 。
<url-pattern> /* </url-pattern>
会匹配 *.jsp
,会出现返回 jsp 视图 时再次进入 spring 的DispatcherServlet
类,导致找不到对应的 controller 所以报 404。
4、编写 SpringMVC 的配置文件:springmvc-servlet.xml
在 resource
目录下添加 springmvc-servlet.xml
配置文件,配置的形式与 Spring 容器配置基本类似,为了支持基于注解的 IOC,设置了 自动扫描包 的功能,具体配置信息如下:
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
# 总结
**就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!**
**金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**
**[感兴趣的朋友可以点击这里获得免费领取!](https://codechina.csdn.net/m0_60958482/java-p7)**
![三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)](https://img-blog.csdnimg.cn/img_convert/7a0e41b57e3965143c26876abf28aded.png)
ans 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"
# 总结
**就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!**
**金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**
**[感兴趣的朋友可以点击这里获得免费领取!](https://codechina.csdn.net/m0_60958482/java-p7)**
[外链图片转存中...(img-N5JCfK9S-1629253784500)]