SpringMVC | SpringMVC的“入门“

目录:

  • [Spring MVC入门 :](#Spring MVC入门 :)
    • [Spring MVC 概述](#Spring MVC 概述)
    • [第一个Spring MVC应用](#第一个Spring MVC应用)
    • [SpringMVC 的 "工作流程"](#SpringMVC 的 “工作流程”)

Spring MVC入门 :

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材 为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著

文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。

欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


​

Spring MVC 概述

  • Spring MVC 是 Spring 提供的一个实现了 WebMVC 设计模式 的轻量级Web框架。它与 Struts2框架 一样,都属于 MVC框架,但其 (Spring mvc )使用和性能 等方面 比Struts 2更加优异。
  • Spring MVC 具有如下特点:
    • 是 Spring 框架 的一部分 ,可以方便地利用Spring所提供 的其他功能。
    • 灵活性强 ,易于与其他框架集成。
    • 提供了一个 前端控制器 : DispatcherServlet,使开发人员无须额外开发控制器对象。
    • 可自动绑定用户输入 ,并能正确的转换数据类型。
    • 内置了常见 的校验器 ,可以校验用户输入。如果校验不能通过 ,那么就会重定向到输
      入表单。
    • 支持国际化 。可以根据用户区域显示多国语言。
    • 支持多种视图技术 。它支持JSP 、Velocity 和FreeMarker等视图技术。
    • 使用基于 XML的配置文件 ,在编辑后 ,不需要重新编译应用程序。

第一个Spring MVC应用

  • 第一步、创建项目,引入JAR包 : 需要Spring框架的四个基本JAR + Spring MVC需要的两个JAR + 一个日志JAR。

​ SpringMvc所需依赖

  • 第二步、(web.xml)中 配置 "前端控制器"。在 web.xml 中,配置 SpringMVC 的 前端控制器 ( DispatcherServlet )

    web.xml :

    xml 复制代码
    <?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">
    
         <!--  在web.xml中配置"前端控制器" : DispatcherServlet -->
        <!--  配置"前端过滤器" : DispatcherServlet -->
        <servlet>
            <servlet-name>SpringMvc</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
    
           <!--   初始化时加载SpringMVC的"配置文件" : springmvc-config.xml    -->
           <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:springmvc-config.xml</param-value>
           </init-param>
    
            <!--    表示容器启动时立刻加载Servlet    -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>SpringMvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>

    在上面的 web.xml 代码中主要对 <servlet> 和 <servlet-mapping>元素 进行了 配置。在 <servlet>中,配置了 Spring MVC 的 前端控制器 : DispatcherServlet,并通过其 子元素<init-param>配置 了 Spring MVC配置文件 ( springmvc-config.xml ) 的位置, <load-on-startup>元素中的表示容器在启动时立即加载这个Servlet ;在 <servlet-mapping>中,通过 <url-pattern>元素的"/ ",会将所有URL 拦截 ,并交由DispatcherServlet处理。

  • 第三步、创建Controller类 :controller.java :

    java 复制代码
    /**
     * 控制器类
     */
    public class FirstController implements Controller {
    
    
        @Override
        //该方法的返回值是 : ①一个指定路径下的.jsp文件给前端 ②返回一个ModelAndView对象给前端
        public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
            //创建ModelAndView对象
            ModelAndView mav = new ModelAndView();
            //向模型对象中添加数据
            //存一个msg的字符串对象进ModelAndView对象中,后端最终会将该ModelAndView对象传给前端,前端就能获取ModelAndView对象的值
            //前端通过${msg}来获取ModelAndView对象中的字符串值
            mav.addObject("msg", "这是我的第一个MVC程序");
            //设计逻辑视图名 (要返回给前端的"视图"的这个路径下的"first.jsp"文件),同时ModelAndView这个对象也是要返回给前端的
            mav.setViewName("/WEB-INF/jsp/first.jsp");
            //返回ModelAndView对象(里面包含了视图:first.jsp文件)
            return mav;
        }
    }

    handleRequest( )是Controller 接口 的 实现方法,FirstController类 会调用该方法 来处理请求,并返回一个 包含视图名 或 包含视图名 和 模型 的 ModelAndView对象 ( 即存一个msg的字符串对象 进"ModelAndView对象 中 ")。代码中,向模型对象 中添加了一个 名称为 msg 的字符串对象 ( 前端 通过通过 ${msg}来获取ModelAndView 工的值),并设置 返回的视图路径 为"/WEB-INF/jsp/first.jsp " ( 要返回的视图 为 :这个路径下的first.jsp 文件 ),这样,同时ModelAndView 这个对象 也是返回给前端的 。

    (此处是后端 对前端 发送的请求作出响应 ,后端打算返回一个 ModelAndView对象 给前端的,且存了一个msg字符串对象 给前端 ,前端通过 ${ msg }来获得ModelAndView 中的数据 ,同时将指定的.jsp文件作为"视图 "给前端)。

  • 第四步、创建 SpringMVC的配置文件 :springmvc-config.xml

    springmvc-config.xml :

    java 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           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
    	http://www.springframework.org/schema/mvc
    	http://www.springframework.org/schema/mvc/spring-mvc.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置处理器Handle,映射"/firstController"请求  -->
        <bean name="/firstController" class="com.myh.controller.FirstController"/>
    
    
        <!--  下面的的复杂的 处理映射器、处理器适配器和视图解析器在实际开发中是可以不用配置  -->
        <!--  因为spring4.0之后,spring会有默认的"内部配置"来完成相应的工作  -->
        <!--  处理映射器,将处理器Handler的name作为url进行查找  -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <!--  处理器适配器,配置对处理器中handleRequest()方法的调用  -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <!--  视图解析器  -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    
    </beans>

    ① 在上述 springmvc-config.xml 中,首先定义了一个 名称 为"/firstController" 的Bean ,该 Bean 会将控制器类 : FirstController 映射到"/firstController"请求中 。 (可以理解为 :将该"url " 和 "FirstController " 映射/绑定 起来 ,这样"前端请求 "就能到达FirstController 中,controller 做出给前端 的响应)。

    ② 然后配置了 处理器映射器 :BeanNameUrlHandlerMapping 和 处理器适配器:SimpleControllerHandlerAdapter ,其中处理器映射器 用于将处理器Bean中 的的 name (即url )进行处理器查找,而处理器适配器 用于完成对FirstController 处理器 中handleRequest( )方法 的调用。

    ③ 最后配置了 视图解析器 : InternalResourceViewResolver 来解析结果视图 ,并将结果呈现给用户。

    ps :

    在 老版本的Spring 中,配置文件内 必须要配置处理器映射器 、处理器适配器 和视图解析器 ,但在Spring 4.0以后 ,如果不配置 处理器映射器、处理器适配器和视图解析器,也会使用Spring内部默认的配置 来完成相应的工作 ,此处 配置的的配置处理器映射器、处理器适配器和视图解析器 是为了让我们能能够更加清晰地了解Spring MVC的工作流程。

    (意思就是说 :上面的复杂的 处理映射器 、处理器适配器 和视图解析器在实际开发中是可以不用配置的)

  • 第五步、创建视图(View)页面 : (即一个返回给前端 的".jsp文件")

    first.jsp :

    jsp 复制代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>入门程序</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>

    第六步、启动项目,进行测试

    此时项目的目录结构为 :

    将项目发布 到Tomcat 中,并启动 Tomcat 服务器。在浏览器中访问地址http://localhost:8080/firstController。

SpringMVC 的 "工作流程"

  • SpringMVC的"工作原理" :

    (1) 用户 通过客户端 向服务器发送请求 ,请求 会被SpringMVC 的前端控制器 : DispatcherServlet 所拦截 。

    (2) DispatcherServlet拦截 到请求后 ,会调用HandlerMapping 处理器映射器 。

    (3) 处理器映射器 : HandlerMapping 根据请求 URL 找到具体 的处理器 ,生成处理器对象 及处理器拦截器 ( 如果有则生成 )一并返回给DispatcherServlet 。

    (4) DispatcherServlet 会通过返回信息 选择合适 的 HandlerAdapter : HandlerMapping 。
    (5) HandlerAdapter :处理器适配器 会调用并执行
    Handler(处理器)
    : ( 如 FirstController ) ,这里的处理器 指的就是程序中编写的 Controller 类 ,也被称之为后端控制器 (负责处理请求 ,做出响应 )。

    (6) Controller执行完成后 ,会返回一个ModelAndView对象 ( 给前端 ),该对象中会包含视图名 或包含"模型和视图名 " ( 实际给这个操作 是首先 要经过 :HandlerAdapter ,然后再给 DispatcherServlet ,然后一系列的传递 ,最后才能响应 该前端的 )。

    (7) HandlerAdapter : 处理器适配器 将 ModelAndView对象 返回给DispatcherServlet 。

    (8) DispatcherServlet 会根据 ModelAndView对象 选择一个合适的 ViewResolver : (视图解
    析器 )。

    (9)ViewResolver :视图解析器 解析后,会向DispatcherServlet 中返回具体的View(视图) ,如: 一个 .jsp文件 。

    (10) DispatcherServlet 对View 进行渲染 ( 即将模型数据填充至视图 中)。

    (11)视图渲染结果 会返回给客户端浏览器显示 (最后响应 内容给"前端客户")。

    ps :

    在上述执行过程中 ,DispatcherServlet 、HandlerMapping 、HandlerAdapter 和ViewResolver

    对象的工作是在框架内部执行的 ,开发人员并不需要关心这些对象内部的实现过程 ,只需要配置
    前端控制器(DispatcherServlet ),完成Controller中的业务处理, 并在视图中(View)中展示相应信息 即可。

    ( 意思就是说 : 实际开发中要①设置好前端控制器 ②配置好controller 将其对应的"处理器 " ③配置好视图文件等内容即可 。像HandlerMapping 、HandlerAdapter 用spring默认的内部配置即可。)

相关推荐
ym hyd 1112 小时前
试题库管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
AC赳赳老秦2 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up2 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
吠品4 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
步行cgn4 小时前
Spring 全注解开发详解
java·后端·spring
长河5 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
code2cat5 小时前
Java进阶篇之LongAdder:把统计更新分散,再读取总和
java·并发编程·原子类·longadder
凯哥Java5 小时前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化
Ivanqhz5 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
BD_Marathon6 小时前
消息对象中字段的说明
java·前端·python