什么是 SpringMVC?
SpringMVC 是一种基于 Java 实现的 MVC 设计模式的请求驱动类型的轻量级 web 框架,使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发
SpringMVC 的前置控制器(DispatchServlet )
Spring 的 web 框架围绕 DispatchServlet 设计,DispatchServlet 的作用是将请求分发到不同的处理器,DispatcherServlet 是一个实际的 Servlet,继承自 HttpServlet 基类
SpringMVC 的运行流程
当用户发起请求时,前置控制器拦截到请求,根据请求参数生成代理请求,找到请求所对应的实际控制器(Controller),控制器处理请求,创建数据模型并与后端进行交互,随后将处理过的数据模型响应给中心控制器,控制器使用数据模型与视图渲染视图结果,结果被返回给中心控制器随后被返回给用户,如下图:
Hello!SpringMVC(使用注解配置 SpringMVC)
首先我们创建一个项目,我这里是使用的 Maven 项目,第一步是导入 jar 包
<!-- 导入依赖 -->
<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>
随后我们要将我们的项目升级为 web 项目,我是使用 idea 进行开发的,操作如下:
添加框架支持
升级为 web 项目
随后我们要在web.xml
中配置 DispatchServlet,先看代码:
<servlet>
<servlet-name>springmvc_anno</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc_anno</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里我们配置了一个DispatcherServlet
类的 Servlet,命名为 springmvc_anno,和以往不同的是,我们这里需要使用<init-param>
标签关联一个 Spring 配置文件,因为我们需要 Spring 框架帮我们找到 Contorller
<load-on-startup>
标签是设置启动级别,数字越小,启动越早,我们直接设置为1
即可,映射路径直接写/
随后我们配置在web.xml
中声明的spring_servlet.xml
,这是一个 Spring 配置文件,所以我们在src
下的resources
目录下创建它,因为我们是使用注解配置,毫无疑问要导入context
命名空间
我们在spring_servlet.xml
中进行四步操作:首先让 IOC 注解生效,即设置注解扫描,第二部过滤掉静态资源,如 HTML、JS、CSS、图片、视频等,第三步启动 MVC 注解驱动,这里会注入DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter
实例,最后一步是配置视图解析器,用于帮助我们更便捷的设计 Controller 类,spring_servlet.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: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/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.lmh.controller"/>
<!-- 让Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
<!--
支持mvc注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
要想使@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例的注入。
-->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
下一步就是创建我们的 Controller,我们实现的功能就是向前端传一个字符串并显示出来,我们起名为com.lmh.controller.HelloController
因为是用过注解实现,首先我们要用@Controller
注解来修饰这个 Controller 类,随后我们只需要在类中创建一个返回值为String
类型的方法即可,这个方法的返回值,就是我们视图名称,假如我们的返回值是test
,再加上spring_servlet.xml
的配置,我们实际上就会访问WEB-INF/jsp/test.jsp
另外,我们需要使用@RequestMapping
注解来修饰我们这个函数,@RequestMapping
注解用来声明我们的映射路径,即定义什么样的url
可以访问到这个 Controller 中的 这个方法,HelloController.java 代码如下:
package com.lmh.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello");
return "hello";
}
}
这里我们设置返回的是hello.jsp
。Model
中为我们包装的数据模型,即返回给前端的信息,随后我们在WEB-INF/jsp/
目录下创建hello.jsp
并接收返回的数据模型:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
到这里,我们的所有配置就都已经结束,我们只需要配置 Tomcat 启动项目即可,在浏览器地址栏输入我们配置的映射路径localhost:8080/hello
,就会出现如下结果