Spring MVC 基础

一、Spring MVC 导引

1、MVC设计模式

Model: 模型数据,业务逻辑。
View: 呈现模型,与用户进行交互。
Controller: 负责接收并处理请求,响应客户端。
Spring MVC 基础

2、Spring MVC

​ Spring MVC 是 Spring 框架的一个后续产品,和 Spring 框架可以很好的结合使用,不需要整合。

  • SpringMVC核心组件
  1. DispatcherServlet: 前置控制器
  2. Handler: 处理器,完成具体业务逻辑
  3. HandlerMapping: 将请求映射到Handler
  4. HandlerInterceptor: 处理器拦截器
  5. HandlerExecutionChain: 处理器执行链
  6. HandlerAdapter: 处理器适配器
  7. ModelAndView: 装载模型数据和视图信息
  8. ViewResolver: 视图解析器
  • SpringMVC实现流程
  1. 客户端请求被 DispatcherServlet 接收
  2. DispatcherServlet 将请求映射到 Handler
  3. 生成 Handler 以及 HandlerInterceptor
  4. 返回 HandlerExecutionChain(Handler + HandlerInterceptor)
  5. DispatcherServlet 通过 HandlerAdapter 执行 Handler
  6. 返回一个 ModelAndView
  7. DispatcherServlet 通过 ViewResolver 进行解析
  8. 返回填充了模型数据的 View,响应给客户端
    Spring MVC 基础

二、基于 Xml 的 Spring MVC 实现

1、Spring MVC 的使用

  1. 大部分组件由框架提供,开发者只需通过配置(注解)进行关联
  2. 只需手动编写 HandlerView 即可。

2、基于XML配置的实现

  1. Spring MVC 基础配置
  2. XML 配置 ControllerHandlerMapping 组件映射
  3. XML 配置 ViewResolver 组件映射
  • web.xml 中配置前置控制器 DispatcherServlet
<!-- 前置控制器 DispatcherServlet -->
<servlet>
	<servlet-name>SpringMVC</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- 指定 springmvc.xml 的路径 -->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springmvc.xml</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>SpringMVC</servlet-name>
	<!-- 拦截所有请求 -->
	<url-pattern>/</url-pattern>
</servlet-mapping>
  • Spring MVC 配置 springmvc_config.xml
<!-- 配置:将bean的name作为url进行查找 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

<!-- 配置: 映射"/test" 关联 Handle -->
<bean name="/test" class="com.moc.handler.MyHandler"/>

<!-- 配置:处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

<!-- 配置: 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 为视图名称加上统一的前缀和后缀,test ==> /test.jsp  -->
    <!-- 配置前缀 -->
    <property name="prefix" value="/"/>
    <!-- 配置后缀 -->
    <property name="suffix" value=".jsp"/>
</bean>
  • 自定义类实现 Controller 接口
// 处理单一请求的Controller接口实现类
public class MyHandler implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        // 创建 装载模型数据和逻辑视图 的对象
        ModelAndView modelAndView = new ModelAndView();
        // 添加模型数据 key--value  (会自动放入request域中,value可以是任意POJO对象)
        modelAndView.addObject("name", "Tom");
        // 设置逻辑视图名称,视图解析器会根据名字解析到具体的视图页面
        modelAndView.setViewName("test");

        return modelAndView;
    }
}
  • 具体视图页面 test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${name}
</body>
</html>

三、基于注解方式的Spring MVC 实现

1、实现步骤

  1. SpringMVC基础配置
  2. ControllerHandlerMapping 通过注解进行映射
  3. XML 配置 ViewResolver 组件映射
  • web.xml 中配置前置控制器 DispatcherServlet

    和 xml 配置方式一样,可以在 web.xml 另外加上 过滤器配置解决中文乱码,和 default Servlet 映射防止前置控制器拦截静态资源。

<!-- 过滤器处理中文乱码(需放在前置控制器之前) -->
<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 设置访问静态资源 -->
<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
</servlet-mapping>
  • Spring MVC 配置 springmvc_config.xml
<!-- 指定包开启注解扫描 -->
<context:component-scan base-package="com.moc.handler"/>

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 将 show 配置成 /test.jsp -->
    <!-- 配置前缀 -->
    <property name="prefix" value="/"/>
    <!-- 配置后缀 -->
    <property name="suffix" value=".jsp"/>
</bean>
  • 通过注解实现映射 Handler
// 基于注解实现Spring MVC 的 Handler
@Controller
public class AnnotationHandler {
    // 方式1: ModelAndView 完成数据的传递,视图的解析
    @RequestMapping("/modelAndViewTest")
    public ModelAndView modelAndView() {
        
        // 装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        // 添加模型数据 key--value  (会自动放入request域中)
        modelAndView.addObject("name", "Alice");
        // 添加逻辑视图
        modelAndView.setViewName("show");
        return modelAndView;
    }

    // 方式2: Model 传值  ,String进行视图解析
    @RequestMapping("/ModelTest")
    public String ModelTest(Model model) {
        // 填充模型数据
        model.addAttribute("name", "Jerry");
        // 设置逻辑视图
        return "show";
    }

    // 方式3: Map 传值  ,String进行视图解析
    @RequestMapping("/MapTest")
    public String MapTest(Map<String, String> map) {
        // 填充模型数据
        map.put("name", "Rose");
        // 设置逻辑视图
        return "show";
    }
}