1. 关于Spring MVC
Spring MVC是基于Spring框架基础之上的,主要解决了后端服务器接收客户端提交的请求,并给予响应的相关问题。
MVC = Model + View + Controller,它们分别是:
-
Model:数据模型,通常由业务逻辑层(Service Layer)和数据访问层(Data Access Object Layer)共同构成
-
View:视图
-
Controller:控制器
MVC为项目中代码的职责划分提供了参考。
需要注意:Spring MVC框架只关心V - C之间的交互,与M其实没有任何关系。
2. 创建Spring MVC工程
运行在Tomcat上的Maven Webapp(需要创建Tmocat) 名称为springmvc01
【操作步骤】
-
在
pom.xml
中添加spring-webmvc
依赖项: -
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.14</version> </dependency>
提示:如果后续运行时提示不可识别Servlet相关类,则补充添加以下依赖项:
-
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
-
接下来,准备2个配置类,一个是Spring框架的配置类,一个是Spring MVC框架的配置类:
-
springmvc.config.SpringConfig.java
-
package cn.tedu.springmvc.config; import org.springframework.context.annotation.Configuration; @Configuration // 此注解不是必须的 public class SpringConfig { }
springmvc.config.SpringMvcConfig.java
-
package springmvc.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration // 此注解不是必须的 @ComponentScan("springmvc") // 必须配置在当前配置类,不可配置在Spring的配置类 public class SpringMvcConfig implements WebMvcConfigurer { }
接下来,需要创建项目的初始化类,此类必须继承自
AbstractAnnotationConfigDispatcherServletInitializer
,并在此类中重写父类的3个抽象方法,返回正确的值(各方法的意义请参见以下代码中的注释):springmvc.SpringMvcInitializer
-
package cn.tedu.springmvc; import springmvc.config.SpringConfig; import springmvc.config.SpringMvcConfig; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /** * Spring MVC项目的初始化类 */ public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { // 返回自行配置的Spring相关内容的类 return new Class[] { SpringConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { // 返回自行配置的Spring MVC相关内容的类 return new Class[] { SpringMvcConfig.class }; } @Override protected String[] getServletMappings() { // 返回哪些路径是由Spring MVC框架处理的 return new String[] { "*.do" }; } }
最后,创建控制器类,用于接收客户端的某个请求,并简单的响应结果:
springmvc.controller.UserController
-
package springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller // 必须是@Controller,不可以是其它组件注解 public class UserController { public UserController() { System.out.println("UserController.UserController()"); } // http://localhost:8080/springmvc01_war_exploded/login.do @RequestMapping("/login.do") @ResponseBody public String login() { return "UserController.login()"; } }
-
全部完成后,启动项目,会自动打开浏览器并显示主页,在主页的地址栏URL上补充
/login.do
即可实现访问,并看到结果。 -
当启动Tomcat时,会自动将项目打包并部署到Tomcat,通过自动打开的浏览器中的URL即可访问主页,在URL中有很长一段是例如
springmvc01_war_explored
这一段是不可以删除的,其它的各路径必须补充在其之后,例如/login.do
就必须在此之后 -
当启动Tomcat时,项目一旦部署成功,就会自动创建并加载
AbstractAnnotationConfigDispatcherServletInitializer
的子类,即当前项目中自定义的SpringMvcInitialier
,无论这个类放在哪个包中,都会自动创建并加载,由于会自动调用这个类中所有方法,所以会将Spring MVC框架处理的请求路径设置为*.do
,并执行对springmvc
的组件扫描,进而会创建UserController
的对象,由于在UserController
中配置的方法使用了@RequestMapping("/login.do")
,则此时还将此方法与/login.do
进行了绑定,以至于后续随时访问/login.do
时都会执行此方法 -
注意:组件扫描必须配置在Spring MVC的配置类中
-
注意:控制器类上的注解必须是
@Controller
,不可以是@Component
、@Service
、@Repository