【SpringMVC 笔记(2),Java大厂74道高级面试合集

本文详细介绍了SpringMVC的DispatcherServlet作用、执行流程、XML配置与注解配置方式,包括HandlerMapping、HandlerAdapter、视图解析等关键概念,并讨论了资源过滤问题和URL路径的差异。
摘要由CSDN通过智能技术生成

DispatcherServlet 的作用是将请求分发到不同的处理器

从 Spring 2.5 开始,使用 Java 5 或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;

正因为 SpringMVC 简单、便捷、易学,天生和 Spring 无缝集成(使用 SpringIOC 和 Aop),使用 约定优于配置,能够进行简单的 JUnit 测试、支持 Restful 风格、异常处理、本地化、国际化、数据验证、类型转换、拦截器,等等… 所以我们要学习。

Spring MVC 框架像许多其他 MVC 框架一样,以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能,DispatcherServlet 是一个实际的 Servlet (它继承自 HttpServlet 基类)。

SpringMVC 执行原理


多看几张原理图,体会一下。。。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上图为 SpringMVC 的一个较完整的流程图,实线表示 SpringMVC 框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

执行流程


DispatcherServlet 表示前置控制器,是整个 SpringMVC 的控制中心。

用户发出请求,DispatcherServlet 接收请求并拦截请求。

我们假设请求的 URL 为 : http://localhost:8080/sm/hello

如上 URL 拆分成三部分:

  • http://localhost:8080 表示服务器域名

  • sm 表示部署在服务器上的 web 站点

  • hello 表示控制器

通过分析,如上URL表示为:

  1. 请求位于服务器 localhost:8080 上的 sm 站点的 hello控制器,用户发出请求。

  2. HandlerMapping 为处理器映射。

    DispatcherServlet 调用 HandlerMappingHandlerMapping 根据请求 url 查找 Handler。

  3. HandlerExecution 表示具体的 Handler。

    主要作用是根据 url 查找控制器,如上 url 被查找控制器为:hello

  4. HandlerExecution 将解析后的信息传递给 DispatcherServlet,如解析控制器映射等。

  5. HandlerAdapter 表示处理器适配器,其按照特定的规则去执行 Handler。

  6. Handler 让具体的 Controller 执行。

  7. Controller 将具体的执行信息返回给 HandlerAdapter,如 ModelAndView

  8. HandlerAdapter 将视图逻辑名或模型传递给 DispatcherServlet。

  9. DispatcherServlet 调用视图解析器 (ViewResolver) 解析 HandlerAdapter 传递的逻辑视图名。

  10. 视图解析器 将解析的逻辑视图名传给 DispatcherServlet

  11. DispatcherServlet 根据视图解析器解析的视图结果,调用具体的视图。

  12. 最终视图呈现给用户。

xml 配置版

==========================================================================

xml 配置版就是体验一下,开发中不会使用,用的更多的是注解版。

1、创建一个 Web 项目


新建一个 Moudle , springmvc-hello , 添加 web 的支持。

2、pom.xml 中导入 SpringMVC 的依赖



<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> 

5、编写操作业务 Controller


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;

  }

} 

6、配置文件中注册 bean


springmvc-servlet.xml 中将自己的类交给 SpringIOC 容器,注册 bean:


<!--Handler-->

<bean id="/hello" class="com.yusael.controller.HelloController"/> 

7、创建视图层 hello.jsp


编写一个要跳转 hello.jsp 页面,显示 ModelandView 存放的数据,以及我们的正常页面;


<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

   <title>yusael</title>

</head>

<body>

${msg}

</body>

</html> 

8、配置 Tomcat 启动测试!


URL:http:localhost:8080/hello

可能遇到的问题:访问出现404


在 IDEA 的项目发布中,添加 lib 依赖!

  • 重启 Tomcat 即可解决!

注解版

======================================================================

1、创建一个 Web 项目


新建一个 Moudle,springmvc-hello-annotation,添加 web 支持。

2、pom.xml 中导入 SpringMVC 的依赖


主要有 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)]



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值