Spring MVC入门

介绍了Spring MVC框架的概念、特征及核心功能,通过案例详细介绍了Spring MVC开发所需要的开发环境以及基本的开发步骤。

一、Spring MVC框架概述

Spring MVC是Spring框架的一个模块,是一个基于Java的实现了MVC设计模式的轻量级Web框架。它通过一套注解和接口,让简单的Java类成为处理请求的控制器,无需实现任何接口,同时支持REST风格的编程。

1. Spring MVC主要特征

  1. 清晰的职责分离:将控制器、模型对象、分派器以及处理程序对象的角色分开

  2. 灵活配置:支持基于XML和注解的配置方式

  3. 可重用的业务代码:可以使用现有的业务对象作为命令或表单对象

  4. 可定制的绑定和验证:支持类型转换和验证

  5. 强大的视图技术:支持JSP、Velocity、FreeMarker等多种视图技术

  6. REST支持:原生支持REST风格的URL

  7. 国际化支持:内置国际化支持

  8. 主题支持:支持主题和外观的更改

2. MVC 与 Spring MVC

MVC 是一种广泛适用的设计模式,而 Spring MVC 是该模式在 Java Web 开发中的一种优秀实现。Spring MVC 通过提供丰富的功能和简化的开发方式,使开发者能更高效地构建 Web 应用程序,同时保持了 MVC 模式的核心优势。理解二者的关系有助于在不同场景下做出更合适的技术选择。

2.1 MVC 设计模式

1. 基本概念

MVC(Model-View-Controller)是一种软件架构设计模式,将应用程序分为三个核心组件:

  • Model(模型):处理数据和业务逻辑

  • View(视图):负责数据展示

  • Controller(控制器):处理用户输入,协调模型和视图

2. 典型工作流程

用户请求 → 控制器 → 调用模型 → 返回数据 → 控制器选择视图 → 视图渲染 → 响应给用户

2.2 Spring MVC 框架

1. 基本概念

Spring MVC 是基于 Java 的实现 MVC 设计模式的请求驱动型 Web 框架,属于 Spring Framework 的一部分。

2. 核心组件
组件 说明
DispatcherServlet 前端控制器,接收所有请求
HandlerMapping 请求到处理器的映射
Controller 实际处理请求的组件
ModelAndView 封装模型和视图信息
ViewResolver 视图解析器
3. 请求处理流程
  1. 用户发送请求 → DispatcherServlet

  2. DispatcherServlet 查询 HandlerMapping → 找到对应 Controller

  3. Controller 调用业务逻辑 → 返回 ModelAndView

  4. DispatcherServlet 查询 ViewResolver → 解析视图

  5. 视图渲染 → 返回响应

3. Spring MVC 工作流程

3.1 Spring MVC 的请求执行顺序

(1)用户向服务端发送一次请求,在满足**web.xml文件中前端控制器的匹配规则** 的前提下,这个请求在 Tomcat 的解析下,会先到前端控制器 DispatcherServlet(也叫中央控制器)。如我们发出*.action 的请求,则只对以".action"结尾的请求路径进行处理。某些访问 JSP 的页面请求则不会被框架拦截处理。

(2)DispatcherServlet 作为框架的核心,通过处理器映射器 (框架提供 SimpleUrlHandlerMapping 类,也可能是其他的映射器类),从映射文件中根据请求路径找到对应的处理器类,并得到该类的实例对象。

(3)DispatcherServlet 通过处理器适配器(框架提供的一个类),对处理类的实例对象进行适配器处理以及参数绑定,并将请求转移到处理类中进行业务处理。

(4)处理类通过实现框架提供的 Controller 接口,最终完成适配功能。并在这里完成具体的业务逻辑功能,将数据和视图信息封装到 ModelAndView对象中,并返回给 DispatcherServlet 处理。

(5)DispatcherServlet 获取从处理器返回的 ModelAndView 对象后,交给视图解析器(框架中提供的功能类)解析,并显示在相应的视图中。

3.2 Spring MVC 框架的核心接口

(1)前端控制器(DispatcherServlet) :它也称为中央控制器,是整个请求响应的控制中心。组件的调用都由它统一调度。配置在 web.xml 文件中,随服务器启动而实例化。

(2)简单处理器映射器(SimpleUrlHandlerMapping) :根据用户访问的 URL 映射到对应的后端处理器 Handler,并将该处理器的实例返回给前端控制器。

(3)处理器适配器(HandlerAdapter) :常用的有 SimpleControllerHandlerAdapter,该功能组件在框架中默认运行。它用于封装参数数据,绑定视图等。

(4)视图解析器(ViewResolver) :常用的有 InternalResourceViewResolver,在框架中该功能组件默认运行。它用于将 ModelAndView 逻辑视图解析为具体的视图(如 JSP)。

(5)后端处理器(Handler) :即由程序员编写的处理类,对用户具体请求进行处理,该类必须实现框架提供的 Controller 接口,才能作为处理器完成组件功能。

(6)处理器中使用的类(ModelAndView) :用于封装数据和视图信息,并返回给前端控制器。该类实现了对原生 ServletRequest 对象的封装,因此可以作为域对象封装数据,并在视图中用 EL 表达式取出数据。

二、案例------Spring MVC框架实现模拟登录

案例说明:使用Spring MVC框架进行用户登录验证

1.新建web项目并引入依赖

在Idea中配置Tomcat并运行第一个servlet程序------初试Jakarta EE项目 https://blog.csdn.net/m0_74808313/article/details/142817862?sharetype=blog&shareId=142817862&sharerefer=APP&sharesource=m0_74808313&sharefrom=link

XML 复制代码
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.3</version>
    </dependency>
    <!--    spring基本依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>3.0.0</version>
      <type>maven-plugin</type>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.9</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.22.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.22.0</version>
    </dependency>
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.0.33</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-install-plugin</artifactId>
      <version>3.0.1</version>
      <type>maven-plugin</type>
    </dependency>

2. 配置Spring MVc的前端控制器

Spring MVC 框架通过前端控制器对符合匹配规则的客户端请求进行统一的拦截处理。这些匹配规则放置在 Spring MVC 的配置文件中,框架通过默认的路径去加载这些文件。

配置文件路径 :在 Webapp/WEB-INF/web.xml 中进行配置。

配置内容 :由于 Spring MVC 框架的前端控制器是一个 Servlet,该 Servlet 在前面的支持 JAR 包中存在。其配置方式与 Servlet 的配置一致,具体代码如下。

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

    <!--  配置前端控制器  -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
                <url-pattern>*.action</url-pattern>
        <!--   截所有请求并交由DispatcherServlet处理     -->
<!--        <url-pattern>/</url-pattern>-->
    </servlet-mapping>
</web-app>

3. 配置 Spring MVC 的核心映射文件 springmvc-servlet.xml

文件路径 :在 Webapp/WEB-INF 目录下新建 springmvc-servlet.xml。文件名来源于 web.xml 配置的前端控制器的名称与后缀 -servlet,前端控制器在加载过程中会自动在该路径下寻找该映射文件。因此该文件的路径和文件名不能随意更改。如要更改,则需在 web.xml 中配置前端控制器时,修改其默认的映射文件路径和文件名,这里暂时不做讲解。

配置内容如下

(1)xml 文件中的约束

(2)配置访问路径与后台处理器之间的映射。该配置需要框架提供的映射类 SimpleUrlHandlerMapping 来完成请求路径的跳转。

XML 复制代码
<?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:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.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">
    <context:component-scan base-package="org.rainpet"></context:component-scan>
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <mvc:annotation-driven/>
    <import resource="classpath:mybatisConfig.xml"/>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatisConfig.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="mapUnderscoreToCamelCase" value="true"/>
            </bean>
        </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描所有dao接口 -->
        <property name="basePackage" value="org.rainpet.mapper"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- 配置访问路径与后台处理器之间的映射   -->
    <bean id="loginController" class="org.rainpet.LoginController"></bean>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                            <prop key="/login.action">loginController</prop>
                <!--  配置了一个SimpleUrlHandlerMapping,将URL路径/login映射到loginController,用于处理登录请求    -->
<!--                <prop key="/login">loginController</prop>-->
            </props>
        </property>
    </bean>
</beans>

4. 新建登录页面login.jsp和登录成功后的页面success,jsp

文件路径 :在 Webapp/ 目录下新建 login.jsp、success,jsp

XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
	<form action="/springMvc01/login.action" method="post">
		用户名:<input type="text" name="userName"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="登录">
	</form>
</body>
</html>
XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
	<h1>登录成功</h1>
	${userName}
</body>
XML 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body>
	<h1>error</h1>
	${info}
</body>

5. 新建登录处理器LoginController.java

java 复制代码
package org.rainpet;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        ModelAndView mav=new ModelAndView();
        if(password!=null&&password.equals("123456")){
            mav.addObject("userName","欢迎您:"+userName);
            mav.setViewName("success.jsp");
        }else {
            mav.addObject("info","用户名或密码错误");
            mav.setViewName("error.jsp");
        }
        return mav;
    }
}
  1. 启动TomCat

浏览器地址栏输入http://localhost:8080/springMvc01/login.jsp,到登录界面,实现登录

相关推荐
豆沙沙包?10 分钟前
2025年- H25-Lc133- 104. 二叉树的最大深度(树)---java版
java·开发语言
阿常114 小时前
解决Maven项目中报错“java不支持版本6即更高的版本 7”
java·开发语言·maven
Stay Passion5 小时前
Java 实用工具类:Apache Commons IO 的 IOUtils
java·开发语言·apache
今天也是元气满满的一天呢6 小时前
java学习之数据结构:一、数组
java·数据结构·学习
heyCHEEMS7 小时前
最大子段和 Java
java·开发语言·算法
-曾牛7 小时前
探索 Spring AI 的 ChatClient API:构建智能对话应用的利器
java·人工智能·spring boot·后端·spring·springai·ai指南
白露与泡影7 小时前
使用OAuth2保护Spring AI MCP服务!
java·后端·spring
magic 2458 小时前
Spring 命名空间注入:p、c 与 .util 的深度解析
java·前端·spring