SpringMVC
SpringMVC
Spring MVC概述
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建WEB应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现一般不用),Struts 2(一般老项目使用)等等。

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称 Spring Web MVC 来⾃其源模块的名称Spring-webmvc,但它通常被称为 Spring MVC。
那么什么是Servet呢?为什么不直接使用Servet?
Servlet 是 Java 语言编写的服务器端程序,用于处理客户端发送的请求并生成响应。Servlet 运行在支持 Java Servlet 规范的 Web 服务器中,如 Apache Tomcat、Jetty 等。Servlet 提供了一种在 Web 服务器上动态生成 Web 内容的方式,可以处理各种类型的请求,如 HTTP 请求。尽管 Servlet 可以实现 Web 应用程序的各种功能,但它们通常是在较低级别上操作 HTTP 请求和响应的。使用 Servlet 编写应用程序需要处理很多底层细节,例如解析请求参数、处理会话管理、管理状态等。这些工作可以在开发 Web 应用程序时变得繁琐和重复。
MVC 是⼀种架构设计模式,,也⼀种思想(这种思想很早就有了,在Spring MVC之前可以通过其他的方式来实现), 而 Spring MVC 是对 MVC 思想的具体实现.。除此之外,SpringMVC还是⼀个Web框架。总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.
M (Model) :模型层,DAO封装,是应⽤程序的主体部分,用来处理程序中数据逻辑的部分。
V (View) :视图层,指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展示数据的资源,如vue/html/css/js/jsp等。
C (Controller) :控制层,Servlet封装,可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。
SpringMVC请求流程

核心架构的具体流程步骤如下:
- 首先用户发送请求 -> DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
- DispatcherServlet -> HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
- DispatcherServlet -> HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
- HandlerAdapter -> 处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
- ModelAndView 的逻辑视图名 -> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策 略模式,很容易更换其他视图技术;
- View -> 渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此 很容易支持其他视图技术;
- 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。
SpringMVC用例
Maven包引入
主要引入spring-webmvc包(spring-webmvc包中已经包含了Spring Core Container相关的包),以及servlet和jstl(JSP中使用jstl)的包。
1 |
|
业务代码的编写
User
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44package tech.pdai.springframework.springmvc.entity;
/**
* @author pdai
*/
public class User {
/**
* user's name.
*/
private String name;
/**
* user's age.
*/
private int age;
/**
* init.
*
* @param name name
* @param age age
*/
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Dao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package tech.pdai.springframework.springmvc.dao;
import org.springframework.stereotype.Repository;
import tech.pdai.springframework.springmvc.entity.User;
import java.util.Collections;
import java.util.List;
/**
* @author pdai
*/
public class UserDaoImpl {
/**
* mocked to find user list.
*
* @return user list
*/
public List<User> findUserList() {
return Collections.singletonList(new User("pdai", 18));
}
}
Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31package tech.pdai.springframework.springmvc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tech.pdai.springframework.springmvc.dao.UserDaoImpl;
import tech.pdai.springframework.springmvc.entity.User;
import java.util.List;
/**
* @author pdai
*/
public class UserServiceImpl {
/**
* user dao impl.
*/
private UserDaoImpl userDao;
/**
* find user list.
*
* @return user list
*/
public List<User> findUserList() {
return userDao.findUserList();
}
}
Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39package tech.pdai.springframework.springmvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import tech.pdai.springframework.springmvc.service.UserServiceImpl;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* User Controller.
*
* @author pdai
*/
public class UserController {
private UserServiceImpl userService;
/**
* find user list.
*
* @param request request
* @param response response
* @return model and view
*/
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("dateTime", new Date());
modelAndView.addObject("userList", userService.findUserList());
modelAndView.setViewName("userList"); // views目录下userList.jsp
return modelAndView;
}
}
web.xml
webapp下的web.xml如下:
1 |
|
springmvc.xml
web.xml中我们配置初始化参数contextConfigLocation,路径是classpath:springmvc.xml
1 | <init-param> |
在resources目录下创建
1 |
|
JSP视图
创建userList.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
部署测试
我们通过IDEA的tomcat插件来进行测试
下载Tomcat:tomcat地址在新窗口打开
下载后给tomcat/bin执行文件赋权
1 | pdai@MacBook-Pro pdai % cd apache-tomcat-9.0.62 |
配置Run Congfiuration

添加Tomcat Server - Local

将我们下载的Tomcat和Tomcat Server - Local关联

在Deploy中添加我们的项目

运行和管理Tomcat Sever(注意context路径)

运行后访问我们的web程序页面(注意context路径)
