首先了解什么是MVC设计模式
- Cotroller:负责接收并处理请求,响应客户端
- Model:模型数据,业务逻辑
- View:呈现模型,与用户进行交互
MVC实现流程:
用户发起请求,会被控制层进行接收,然后控制层根据不同的请求去调用模型层不同的方法。不同的业务方法,会对数据库增删改查一个持久化操作,最终产生一个模型数据。然后封装模型数据,传递给视图层。视图层拿到数据会进行渲染,最终把结果响应给客户端,用户就可以看到最终的一个成果。接下来,用户进行下一步操作,又发了一次新的请求,然后重复上次过程。这就是MVC的流程。
那什么是Spring MVC呢?
- 目前最好的实现MVC设计模式的框架。会对整个MVC设计模式进行封装,将很多底层代码进行屏蔽,那么开发者就可以更加方便、快捷的去进行应用程序的开发。
- SpringMVC是Spring框架的一个后续产品。
- 利用spring容器的特性,简化自己的配置,相当于spring框架的一个子模块,二者可以很好的结合使用,不需要整合。
SpringMVC核心组件
- DispatcherServlet:前置控制器
整个流程控制的核心,用来控制其它组件的执行,进行统一调度,降低各个组件之间的耦合性
相当于总指挥的位置
- Handler:处理器,完成具体业务逻辑
DispatcherServlet接收到请求的时候,需要将不同的请求分发到不同的Handler当中
- HandlerMapping:将请求映射到Handler
- HandlerInterceptor:处理器拦截器
HandlerInterceptor是一个接口,完成需要进行拦截处理的功能
- HandlerExceptionChain:处理器执行链
- HandlerAdapter:处理器适配器
Handler执行业务方法之前,需要进行一系列的操作,包括对表单数据的验证,表单数据类型的转换以及将表单数据封装到java bean当中,这一系列操作则由HandlerAdapter完成
- MoudelAndView:封装模型数据和视图信息
视图信息指的是逻辑视图,作为Handler的处理结果,返回给DispatcherServlet
- ViewResolver:视图解析器
DispatcherServlet拿到MoudelAndView之后,需要进行解析,ViewResolver将逻辑视图解析为物理视图,最终将这个结果渲染给客户端
SpringMVC实现流程:
1、客户端请求被DispatcherServlet接收
2、DispatcherServlet将请求映射到Handler
3、生成Handler以及HandlerInterceptor
4、返回HandlerExceptionChain(Handler+HandlerInterceptor)
5、DispatcherServlet通过HandlerAdapter执行Handler
6、返回一个MoudelAndView(模式视图+逻辑数据)给DispatcherServlet
7、DispatcherServlet通过ViewResolver对MoudelAndView解析,将逻辑视图解析为物理视图
8、返回填充了模型数据的View,响应给客户端进行渲染。
SpringMVC的使用:
1、大部分组件由框架提供,开发者只需要通过配置进行关联
2、开发者只需手动编写Handler,View
基于注解方式的使用(推荐)
1、SpringMVC基础配置
2、Controller,HandlerMapping通过注解进行映射
3、XML配置ViewResolver组件映射
创建AnnotationHandler
package com.lzy.handler;
import com.lzy.entity.Goods;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Map;
@Controller
public class AnnotationHandler {
/**
* 业务方法:ModelAndView完成数据的传递,视图的解析
*/
@RequestMapping("/modelAndViewTest")
public ModelAndView modelAndViewTest(){
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
//填充模型数据
modelAndView.addObject("name","Tom");
//设计逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
/**
* 业务方法:Model传值,String进行视图渲染解析
*/
@RequestMapping("/ModelTest")
public String ModelTest(Model model){
//填充模型数据
model.addAttribute("name","Jerry");
//设置逻辑视图
return "show";
}
/**
* 业务方法:Map传值,String进行视图解析
*/
@RequestMapping("MapTest")
public String MapTest(Map<String,String>map){
//填充模型数据
map.put("name","Cat");
//设计逻辑视图
return "show";
}
}
配置springmvc.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"
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">
<!--将AnnotationHandler自动扫描到IOC容器中-->
<context:component-scan base-package="com.lzy.handler"></context:component-scan>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${name}
</body>
</html>
基于XML配置的使用
1、SpringMVC基础配置
2、XML配置Controller,HandlerMapping组件映射
3、XML配置ViewResolver组件映射
创建MyHandler
package com.lzy.handler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("name","Tom");
//添加逻辑视图
modelAndView.setViewName("show");
// /show.jsp
return modelAndView;
}
}
配置springmvc.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"
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">
<!--配置HandlerMapping,将url请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--配置mapping-->
<property name="mappings">
<props>
<!--配置test请求对应的handler-->
<prop key="/test">testHandler</prop>
</props>
</property>
</bean>
<!--配置Handler-->
<bean id="testHandler" class="com.lzy.handler.MyHandler"></bean>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${name}
</body>
</html>