第 1 章 SpringMVC 概述
1.1 SpringMVC 简介
SpringMVC 也叫 Spring web mvc。是 Spring 框架的一部分,是在 Spring3.0 后发布的。
1.2 SpringMVC 优点
1. 基于 MVC 架构
基于 MVC 架构,功能分工明确。解耦合,
2. 容易理解,上手快;使用简单。
就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的
特定的接口和类。
3. 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合 Strtus,MyBatis,Hiberate,JPA 等其他框架。
4.SpringMVC 强化注解的使用,在控制器, Service , Dao 都可以使用注解。方便灵活。
使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource在控制器类中注入 Service, Service 类中注入 Dao。
1.3新建 maven web 项目
项目结构

1添加pom.xml
- "1.0" encoding="UTF-8"?>
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.bjpowernodegroupId>
- <artifactId>ch01-hello-springmvcartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.11version>
- <scope>testscope>
- dependency>
-
-
-
- <dependency>
- <groupId>jakarta.servletgroupId>
- <artifactId>jakarta.servlet-apiartifactId>
- <version>4.0.4version>
- <scope>providedscope>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.tomcat.embedgroupId>
- <artifactId>tomcat-embed-websocketartifactId>
- <version>9.0.44version>
- dependency>
-
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.5.RELEASEversion>
- dependency>
- dependencies>
-
- <build>
- <plugins>
-
- <plugin>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.1version>
- <configuration>
- <source>1.8source>
- <target>1.8target>
- configuration>
- plugin>
- plugins>
- build>
- project>
2. 注册中央调度器
- (1) 全限定性类名
- 该中央调度器为一个 Servlet,名称为 DispatcherServlet。中央调度器的全限定性类名在
- 导入的 Jar 文件 spring-webmvc-5.2.5.RELEASE.jar 的第一个包 org.springframework.web.servlet
- 下可找到。
- (2) <load-on-startup/>
- 在<servlet/>中添加<load-on-startup/>的作用是,标记是否在Web服务器(这里是Tomcat)
- 启动时会创建这个 Servlet 实例,即是否在 Web 服务器启动时调用执行该 Servlet 的 init()方
- 法,而不是在真正访问时才创建。
- 它的值必须是一个整数。
- ➢ 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 servlet,数值越小,该 Servlet
- 的优先级就越高,其被创建的也就越早;
- ➢ 当值小于 0 或者没有指定时,则表示该 Servlet 在真正被使用时才会去创建。
- ➢ 当值相同时,容器会自己选择创建顺序。
- (3) <url-pattern/>
- 对于<url-pattern/>,可以写为 / ,建议写为*.do 的形式。
- (4) 配置文件位置与名称
- 注册完毕后,可直接在服务器上发布运行。此时,访问浏览器页面,控制台均会抛出
- FileNotFoundException 异常。即默认要从项目根下的 WEB-INF 目录下找名称为 Servlet 名称
- -servlet.xml 的配置文件。这里的“Servlet 名称”指的是注册中央调度器<servlet-name/>标签
- 中指定的 Servlet 的 name 值。本例配置文件名为 springmvc-servlet.xml。
- "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>mywebservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
-
- <init-param>
-
- <param-name>contextConfigLocationparam-name>
-
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
-
-
- <load-on-startup>1load-on-startup>
- servlet>
-
- <servlet-mapping>
- <servlet-name>mywebservlet-name>
-
- <url-pattern>*.dourl-pattern>
- servlet-mapping>
- web-app>
3.创建 SpringMVC 配置文件
- "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"
- 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">
-
-
- <context:component-scan base-package="com.bjpowernode.controller" />
-
-
- beans>

4. 创建处理器
在类上与方法上添加相应注解即可。
@Controller:表示当前类为处理器
@RequestMapping:表示当前方法为处理器方法。该方法要对 value 属性所指定的 URI
进行处理与响应。被注解的方法的方法名可以随意。
- package com.bjpowernode.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.servlet.ModelAndView;
-
- /**
- * @Controller:创建处理器对象,对象放在springmvc容器中。
- * 位置:在类的上面
- * 和Spring中讲的@Service ,@Component
- *
- * 能处理请求的都是控制器(处理器): MyController能处理请求,
- * 叫做后端控制器(back controller)
- *
- * 没有注解之前,需要实现各种不同的接口才能做控制器使用
- */
- @Controller
- public class MyController {
- /*
- 处理用户提交的请求,springmvc中是使用方法来处理的。
- 方法是自定义的, 可以有多种返回值, 多种参数,方法名称自定义
- */
-
- /**
- * 准备使用doSome方法处理some.do请求。
- * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。
- * 一个请求指定一个方法处理。
- * 属性: 1. value 是一个String,表示请求的uri地址的(some.do)。
- * value的值必须是唯一的, 不能重复。 在使用时,推荐地址以“/”
- * 位置:1.在方法的上面,常用的。
- * 2.在类的上面
- * 说明: 使用RequestMapping修饰的方法叫做处理器方法或者控制器方法。
- * 使用@RequestMapping修饰的方法可以处理请求的,类似Servlet中的doGet, doPost
- *
- * 返回值:ModelAndView 表示本次请求的处理结果
- * Model: 数据,请求处理完成后,要显示给用户的数据
- * View: 视图, 比如jsp等等。
- */
- @RequestMapping(value = {"/some.do","/first.do"})
- public ModelAndView doSome(){ // doGet()--service请求处理
- //处理some.do请求了。 相当于service调用处理完成了。
- ModelAndView mv = new ModelAndView();
- //添加数据, 框架在请求的最后把数据放入到request作用域。
- //request.setAttribute("msg","欢迎使用springmvc做web开发");
- mv.addObject("msg","欢迎使用springmvc做web开发");
- mv.addObject("fun","执行的是doSome方法");
-
- //指定视图, 指定视图的完整路径
- //框架对视图执行的forward操作, request.getRequestDispather("/show.jsp).forward(...)
- mv.setViewName("/show.jsp");
- //mv.setViewName("/WEB-INF/view/show.jsp");
- //mv.setViewName("/WEB-INF/view/other.jsp");
-
-
- //当配置了视图解析器后,可以使用逻辑名称(文件名),指定视图
- //框架会使用视图解析器的前缀 + 逻辑名称 + 后缀 组成完成路径, 这里就是字符连接操作
- ///WEB-INF/view/ + show + .jsp
- //mv.setViewName("/WEB-INF/show.jsp");
-
- //mv.setView( new RedirectView("/a.jsp"));
-
- //返回mv
- return mv;
- }
-
-
- @RequestMapping(value = {"/other.do","/second.do"})
- public ModelAndView doOther(){
- ModelAndView mv = new ModelAndView();
- mv.addObject("msg","====欢迎使用springmvc做web开发====");
- mv.addObject("fun","执行的是doOther方法");
- mv.setViewName("/WEB-INF/other.jsp");
- return mv;
- }
- }
若有多个请求路径均可匹配该处理器方法的执行,则@RequestMapping 的 value 属性中
可以写上一个数组。
ModelAndView 类中的 addObject()方法用于向其 Model 中添加数据。Model 的底层为一
个 HashMap。
Model中的数据存储在 request 作用域中,SringMVC 默认采用转发的方式跳转到视图,本次请求结束,模型中的数据被销毁。
5.定义目标页面
在 webapp 目录下新建一个子目录 jsp,在其中新建一个 jsp 页面 show.jsp。

6.测试一下:
这里记录一下:我用的是tomcat10,用的是jakarta.servlet-api,导致我一直报错:大致意思是javax的servlet不能转换成jakrta的servlet。然后我换成9版本的,就可以跑通了。tomcat的配置如下:


7. 修改视图解析器的注册刚上面也做了说明
SpringMVC 框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器
InternalResouceViewResolver 中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳
转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接。
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="prefix" value="/WEB-INF/view/" />
-
- <property name="suffix" value=".jsp" />
- bean>
把 show.jsp 文件放到 /WEB-INF/view/路径中
然后修改处理器


