04 SpringMVC

1. SpringMVC概述

作用: 用于前端请求处理,即Servlet的创建。
优点:

  • 基于 MVC 架构 : 基于 MVC 架构,功能分工明确。解耦合,
  • 容易理解,上手快;使用简单。就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的
    特定的接口和类。
  • 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合Strtus,MyBatis,Hiberate,JPA 等其他框架。
  • SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注解。方便灵活。使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource在控制器类中注入 Service, Service 类中注入 Dao。

1.1 第一个SpringMVC程序的实现。

需求:

	需求: 用户在页面发起一个请求, 请求交给springmvc的控制器对象,
	       并显示请求的处理结果(在结果页面显示一个欢迎语句)。
			
	实现步骤:
		1. 新建web maven工程
		2. 加入依赖
		   spring-webmvc依赖,间接把spring的依赖都加入到项目
		   jsp,servlet依赖
		
		3.重点: 在web.xml中注册springmvc框架的核心对象DispatcherServlet
		   1)DispatcherServlet叫做中央调度器, 是一个servlet, 它的父类是继承HttpServlet
		   2)DispatcherServlet页叫做前端控制器(front controller)
		   3)DispatcherServlet负责接收用户提交的请求, 调用其它的控制器对象,并把请求的处理结果显示给用户
	
		4.创建一个发起请求的页面 index.jsp
	
		5.创建控制器(处理器)类
		  1)在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
		  2)在类中的方法上面加入@RequestMapping注解。
		
		6.创建一个作为结果的jsp,显示请求的处理结果。
		
		7.创建springmvc的配置文件(spring的配置文件一样)
		  1)声明组件扫描器, 指定@Contorller注解所在的包名
		  2)声明视图解析器。帮助处理视图的。

主要内容及扩展内容:

  • 依赖的引入
  • 中央调度器DispatcherServlet的配置
  • 处理器类的使用规则
  • 请求映射RequestMapping
  • 视图解析器

具体工作:

  • 第一步:POM文件中的依赖引入

    <!--servlet依赖-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <!--springmvc依赖:注意它会将spring的依赖全部自动加入-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.5.RELEASE</version>
        </dependency>
    
  • 第二步: web.xml 文件下中央调度器的注册

    <?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">
        <!--声明,注册springmvc核心对象DispatcherServlet(中央调度器)
            需要在Tomcat服务器动时,自动创建DispatcherServlet对象实例
    
            为什么要创建DispatcherServlet对象实例??
                因为:在使用springMVC时需要使用springMVC的容器,而在创建过程中,容器并不是手动创建的,
                        所以在DispatcherServlet创建对象时,会自动创建springMVC的容器。
                        读取springmvc的配置文件,将配置文件中的对象都创建好,当用户发起请求时,可以直接使用对象。
    
                servlet初始化会执行init()方法, DispatcherServlet在init()中会做如下操作
    
                init(){
                    // 创建容器,读取配置文件
                    WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml")
                    // 将容器对象,放入到ServletContext中
                    getServletContext.getAttribute(key,ctx);// 获取容器
                }
    
                Tomcat启动异常:Could not open ServletContext resource [/WEB-INF/(servlet-name的名字)-servlet.xml]
                    springmvc创建容器对象时,需要读取配置文件的默认规则是:在/WEB-INF/(servlet-name的名字)-servlet.xml
        -->
        <servlet>
            <servlet-name>myweb</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--自定义springmvc读取的配置文件的位置-->
            <init-param>
                <!--springmvc的配置文件的位置的属性-->
                <param-name>contextConfigLocation</param-name>
                <!--指定自定义文件的位置-->
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!--在tomcat启动后,创建servlet对象
                load-on-startup : 表示Tomcat启动后创建对象的顺序,它的值是整数,
                    数值越小Tomcat创建对象的时间越早,大于等于0的整数
            -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>myweb</servlet-name>
            <!--
                注意: 这里的url-pattern方式可以有两种
                    1. 使用扩展名的方式,语法 *.xxx : xxx是自定义的扩展名,常用方式是 *.do,*.action,*.mvc等
                    2. 使用 “/”
            -->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>
    
  • 第三步: SpringMVC 配置文件的创建 : 声明组件扫描器、视图解析器。

    <?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">
    
            <!--声明组件扫描器-->
            <context:component-scan base-package="com.bjpowernode.controller"/>
            <!--声明视图解析器,作用:帮助开发人员设置视图文件的路径-->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <!--前缀:视图文件路径-->
                    <property name="prefix" value="/WEB-INF/view/"/>
                    <!--后缀:视图文件的扩展名-->
                    <property name="suffix" value=".jsp"/>
            </bean>
    </beans>
    
  • 第四步: 使用@Controller注解:将类转换为处理器类,使用@RequeastMapping注解:将请求转交给指定的方法处理。

    package com.bjpowernode.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     *  @Controller:创建处理器对象,对象放在springmvc容器中
     *
     *  位置: 类上方
     *  作用: 和spring中的@service,@component一样
     */
    @Controller
    public class MyController {
          
          
        /**
         *  处理用户提交的请求,springmvc是使用方法来处理的,
         *  方法是自定义的,可以有多种返回值,多种参数
         */
    
        /**
         * 准备使用dosome方法处理some.do请求
         * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。
         *                  一个请求制定一个方法处理
         *
         *         属性: 1. value: 是一个String,表示请求的url地址(some.do)
         *                  value的值必须是唯一的,不能重复。 在使用时,推荐地址以"/"开头
         *         位置: 1. 在方法的上面,常用的
         *               2. 在类的上面
         *  说明:使用RequestMapping修饰的方法叫做处理器方法或者控制器方法
         *       使用RequestMapping修饰的方法可以处理请求的,类似servlet中的doGet,doPost
         *
         *
         *  返回值: ModelAndView
         *      model:数据,请求处理完成后,要显示给用户的数据
         *      view:视图,比如jsp等等
         */
        @RequestMapping(value = {
          
          "/some.do","first.do"})
        public ModelAndView doSome(){
          
          
            // 处理some.do请求了
            ModelAndView mv = new ModelAndView();
            // 添加数据,框架在请求的最后把数据放入到request作用域。
            mv.addObject("msg","欢迎使用springmvc做web开发");
            mv.addObject("fun","执行的是doSome方法");
            // 指定视图,制定视图的完整路径
            // 框架对视图的执行的forward操作,相当于request.getRequestDispather("/show.jsp").forward(...)
            //mv.setViewName("/show.jsp");
            //mv.setViewName("/WEB-INF/view/show.jsp");
            //当设置了视图解析器后,可以使用逻辑名称(文件名),制定视图
            //框架会使用视图解析器的前缀+逻辑名称+后缀组成完整路径
            mv.setViewName("show");
            // 返回mv
            return mv;
        }
    
        @RequestMapping(value = {
          
          "/other.do","second.do"})
        public ModelAndView doOther(){
          
          
    
            ModelAndView mv = new ModelAndView();
            mv.addObject("msg","欢迎使用springmvc做web开发");
            mv.addObject("fun","执行的是doOther方法");
            mv.setViewName("other");
            return mv;
        }
    }
    

1.2 使用 SpringMVC 框架 web 请求处理顺序

在这里插入图片描述

1.3 SpringMVC 执行流程

在这里插入图片描述
处理步骤解析:

  • 第一步:浏览器提交请求到中央调度器
  • 第二步:中央调度器直接将请求转给处理器映射器。(处理映射器:可以看做是我们写的bean标签和controller和requestMapping合在一起的请求处理地址的字符串拼接路径)
  • 第三步:处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链(这个执行链可以看做就是处理器地址路径)后返回给中央调度器。
  • 第四步:中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
  • 第五步:处理器适配器调用执行处理器。
  • 第六步:处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
  • 第七步:处理器适配器直接将结果返回给中央调度器。
  • 第八步:中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
  • 第九步:视图解析器将封装了的视图对象返回给中央调度器。
  • 第十步:中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
  • 第十一步:中央调度器响应浏览器。

2. SpringMVC注解式开发

2.1 @RequestMapping 定义请求规则

2.1.1 注解出现的位置

  • 方法上:如下所示:当在方法上时表示的是该处理请求的路径。

    @RequestMapping(value = {
          
          "/some.do","first.do"})
        public ModelAndView doSome(){
          
          
            ModelAndView mv = new ModelAndView();
            mv.addObject("msg","欢迎使用springmvc做web开发");
            mv.addObject("fun","执行的是doSome方法");
            mv.setViewName("show");
            return mv;
        }
    
  • 类上:如下所示:在类上时,表示的是该处理请求的模块名。
    如:此时我们需要发送多个请求,test/one.do,test/two.do,test/three.do。。。。,可以发现这些请求的url地址都包含了“test”,因此我们可以在类的上方加入@RequestMapping(value = “/test”),表示该类处理的请求时test模块的,在后面的函数中@RequestMapping只需要写 one.do,two.do,three.do不需要写test/one.do,test/two.do,test/three.do,更加的便捷。
    在这里插入图片描述

value 属性值常以“/”开始。

2.1.2 对请求提交方式的定义

对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。

Method 属性的取值为 RequestMethod 枚举常量。常用的为 RequestMethod.GET 与RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。
在这里插入图片描述

2.2 处理器方法的参数

猜你喜欢

转载自blog.csdn.net/qq_28384023/article/details/117912868