之前我们学习了Java SSM的第一部分Spring和第二部分MyBatis,如果有需要了解的小伙伴,可以点击:
我们这一节就是SpringMVC的学习,学习完SpringMVC我们JavaSSM的基础学习就完成了,后续还需要深入去学习SSM的知识。
言归正传,SpringMVC就是Spring Web MVC,它是Spring框架提供的支持Web应用的表现层的框架,它支持多种视图层,不只是JSP,还可以是Tiles,Velocity等。
1,SpringMVC的MVC架构
MVC是一种软件架构的思想,将软件按照模型视图,控制器来划分。MVC是Model,View和Controlller的缩写,也表示该模式的三种职责。
(1)Model 模型,它通常由JavaBean技术来实现,包括业务实体类,业务逻辑组件,根据组件等。
其中JavaBean分为两类,一是实体类Bean,专门存储业务数据,二是业务处理Bean,专门用于处理业务逻辑和数据访问。
(2)View 视图,它通常由JSP技术实现,用来收集用户请求,向用户传递服务器响应结果等技术。 S
(3)Controlller 控制器,它负责将用户的请求数据移交对应的数据模型进行处理,将处理结果提交对应的视图完成反馈。
它的主要工作是围绕DispathcherServlet展开的。DispathcherServlet是用来接收请求并且将它们发给对应的控制器的中央Servlet。
DispatcherServlet 前端控制器,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制,它相当于SpringMVC的中枢神经系统,降低了组件之间的耦合度,进行解耦。
2,SpringMVC的工作原理
我大致的画出了SpringMVC的工作原理,大致为十一个步骤:
(1)客户端发送请求到前端控制器:DispatcherServlet
(2)DispatcherServlet收到请求后调用HandlerMapping查找Handler。
(3)HandlerMapping根据url查找具体的Controller,生成处理器对象和处理器拦截器并且返回DispatcherServlet。
(4)DispathcherServlet依据处理器适配器调用处理器。
(5)处理器适配器调用处理器,执行业务处理。
(6)Handler执行后返回ModelAndView。
(7)处理器适配器把接收到的ModelAndView返回DispatcherServlet。
(8)DispatcherServlet寻找视图解析器,将ModelAndView传过去,视图解析器根据逻辑视图名解析试图。
(9)视图解析器返回视图。
(10)DispatcherServlet对视图进行渲染。
(11)DispatcherServlet响应客户端,将进行渲染的视图呈现。
3,SpringMVC的优势
(1)角色与职责划分非常清晰,每个角色都有对应的对象实现。
(2)视图技术灵活,不仅仅只限于JSP
(3)SpringMVC是非侵入,可适配的。
(4)配置过程简单。
(5)SpringMVC可以作为Spring的子项目,无缝整合。
(6)SpringMVC具有可定制的绑定和验证。
(7)支持国际化和本地化。
4,配置SpringMVC的运行环境
首先,配置一下Tomcat9环境,添加SpringMVC的依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.14.RELEASE</version>
</dependency>
</dependencies>
然后,配置一下web.xml,将DispatcherServlet替换掉Tomcat自带的Servlet,这里url-pattern需要写为/
,即可完成替换:
<?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>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
接着需要为整个Web应用程序配置一个Spring容器, 这里我们直接使用注解方式进行配置:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.example.config.MvcConfiguration</param-value>
</init-param>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
直接实现接口即可:
public class MainInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{MainConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
这样,就完成最基本的配置了,现在任何请求都会优先经过DispatcherServlet进行集中处理。
5,请求处理方式
用于我们需要通过浏览器发送请求,然后访问服务器,服务器会根据携带的http参数来进行执行命令,完成响应,这个获取参数的方式就需要请求来完成,总共有8种,重点的两种方式:GET方式和POST方式.
- GET方式:向特定的资源发出请求,并返回实体.有固定的写法.而且数据有最大长度,超出就不行
- POST方式:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- RESTFul方式:为了简化GET请求的写法,可以使用RESTFul方式,用法:
按照传统方式发送请求的时候比较麻烦,需要定义多种请求,而RESTful在HTTP协议中,有不同的发送请求的方式,分别是GET、POST、PUT和DELETE方式,分别对应查询、修改、添加和删除操作。我们如果能让不同的请求方式表示不同的请求类型就可以简化我们的查询。
1,get,set风格
@Controller
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getAllUser(){
System.out.println("查询所有用户信息");
return "success";
}
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String getUserById(){
System.out.println("根据用户ID查询用户信息");
return "success";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String insertUser(String username,String password){
System.out.println("添加用户信息:" + username + ","+ password);
return "success";
}
}
2,PUT和DELETE方式
@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String updateUser(String username,String password){
System.out.println("修改用户信息:" + username + ","+ password);
return "success";
}
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(String username,String password){
System.out.println("删除用户信息:" + username + ","+ password);
return "success";
}
六,使用Ajax技术访问
<script src="jquery-1.8.3.min.js"></script>
<script>
function fun(){
$.ajax({
url:"http://localhost:8080/stu/add",
data:$("#f1").serialize(),
success:function(data){
console.log(data);
}
})
}
</script>
七,SpringMVC的常用注解
@Controller 标识是一个Controller,Spring包扫描创建实例
@RequestMapping 请求后的映射路径
@PathVariable 标识接收单个参数
@ResponseBody 返回对象利用jackson工具类转换为json字符串
@RequestParam 参数名和请求参数名称不同时使用,可以设置默认值
@CrossOrigin 解决跨域问题
Spring MVC的核心架构: