SpringMVC-01

SpringMVC简介

SpringMVC概述

  • Spring MVC属于SpringFrameWork的后续产品。
  • Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
  • 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架。
  • Spring web mvc和Struts2都属于表现层的框架

SpringMVC处理流程

入门程序

1.创建web工程

2.导入springMVC相关jar包,在spring的基础上添加一个mvc的包 

3.添加配置文件

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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    

</beans>

4.配置前端控制器

web.xml当中配置前端控制器

    <!-- 配置SpringMVC前端控制器 -->
    <servlet>
        <servlet-name>mySpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定SpringMVC配置文件 -->
        <!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>mySpringMVC</servlet-name>
        <!-- 设置所有以action结尾的请求进入SpringMVC -->
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

springMVC中url-patten取值

  • /*: 拦截所有   jsp  js png .css  真的全拦截.不建议使用
  • *.action   *.do: 拦截以do action 结尾的请求
  • /: 拦截所有,不包括jsp,包含.js .png.css     建议使用 

5.创建控制器

@Controller
public class MyController {

    @RequestMapping("/first.action")
    public ModelAndView show(){

        // 创建ModelAndView,用来存放数据和视图
        ModelAndView modelAndView = new ModelAndView();

        // 设置数据到模型中
        modelAndView.addObject("name","xhh");

        // 设置视图jsp
        modelAndView.setViewName("/first.jsp");

        return modelAndView;

    }

}

6.在springMVC核心配置文件当中添加控制器扫描范围

<!--扫描指定包下注解@Controller @Service-->
<context:component-scan base-package="com.xhh"/>

7.创建first.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>first</title>
</head>
<body>

<h1>first.jsp --- ${name}</h1>

</body>
</html>

8.index.jsp页面跳转

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>

<a href="${pageContext.request.contextPath}/first.action">发送请求</a>

</body>
</html>

9.启动工程测试

执行流程

详细执行流程

架构流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

流程图

组件说明

DispatcherServlet

  1. 前端控制器
  2. 用户请求到达前端控制器,它就相当于mvc模式中的C
  3. DispatcherServlet是整个流程控制的中心
  4. 由它调用其它组件处理用户的请求
  5. DispatcherServlet的存在降低了组件之间的耦合性

HandlerMapping

  1. 处理器映射器
  2. HandlerMapping负责根据用户请求url找到Handler处理器
  3. springmvc提供了不同的映射器实现不同的映射方式
  4. HandlerMapping会把找到映射返回给前端控制器

Handler

  1. 后端控制器
  2. 在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

HandlAdapter

  1. 通过HandlerAdapter对处理器进行执行
  2. 处理器适配器

ViewResolver

  1. 视图解析器
  2. View Resolver负责将处理结果生成View视图

View

  1. springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

默认加载组件

处理器映射器

  • @RequestMapping:定义请求url到处理器功能方法的映射。
  • 注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。
  • 根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法。
  • 匹配成功返回HandlerMethod对象给前端控制器。
  • HandlerMethod对象中封装url对应的方法Method。

处理器适配器

  • 对标记@ResquestMapping的方法进行适配
  • 解析对应的方法

视图解析器

  • 视图解析器使用SpringMVC框架默认的InternalResourceViewResolver
  • 这个视图解析器支持JSP视图解析
  • 配置视图解析器
    • 当一个页面存放目录结构比较多时,就可以配置目录
    • 可以在返回地址上添加前缀和后缀

  • 3.2之前
  • defaultAnnotationHandlerMapping
  • AnnotationMethodHandlerAdapter
  • <mvc:annotation-driven />

之前:注册映射器和适配器

请求转发与重定向

启动服务器加载SpringMVC

请求转发

重定向

接收参数

使用传统request对象接收参数

 

 

  • Springmvc框架会自动把 Request 对象传递给方法。

不使用request接收简单类型参数

  • 当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。

  • @RequestParam
    • 形参的类型与绑定的类型不一致时,可以使用@RequestParam进行匹配

  • value:请求参数名字
  • required:
    • 是否必须。
    • 默认是true。
    • 表示请求中一定要有相应的参数,否则将报错。
  • defaultValue
    • 默认值。
    • 表示如果请求中没有同名参数时的默认值。

以一个javaBean对象接收

  • 要求对象当中的属性要和表单当中的名称一致

 

 数组接收数据

  • name相同时,中以使用数组来接收对应的参数

 

 包装类接收参数

 

 

 List集合接受数据

 自定义参数绑定

  • 根据业务需求自定义数据显示格式。
  • 需求
    • 修改商品日期。
    • 由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
  • 分析
    • 前端控制器接收到请求后,找到注解形式的处理器适配器。      
    • 对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。
    • 内部已经定义了很多的转换器,比如可以直接使用int类型来接收字符串。
    • 日期类型与字符串比较特殊,字符串的日期格式,有很多种.可以自己来定义是哪种格式的转换。
    • 可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
  • 步骤
    • 把发布时间对象的字符串转换成日期接收。   

 

  • 1.创建转换器

  •  2.在springMVC核心配置文件当中自定义转换器

 Post请求中文参数乱码

  • 当发送post请求时,带有中文的参数会发生乱码。
  • 解决办法
    • 在web.xml当中添加一个过滤器。

   <!-- 解决post乱码问题 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!-- 设置编码参是UTF8 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 
posted @ 2020-02-08 14:45  Leader_TBlog  阅读(128)  评论(0)    收藏  举报