SpringMVC

SpringMVC

  • MVC:

    Model:模型、View:视图、Control:控制器

  • SpringMVC 是Spring框架的一部分,是基于Java实现MVC的轻量级Web框架

  • 特点:

    1. 基于请求响应的高效MVC框架
    2. 约定优于配置
    3. 轻量、简洁、灵活、功能强大

中心控制器

Spring的web框架围绕DispatcherServlet前置控制器(请求分发器)设计,是整个SpringMVC的控制中心,DispatcherServlet的作用是将请求分发到不同的处理器

用户请求

url:http://localhost:8080/SpringMVC/hello

http://localhost:8080:服务器域名

SpringMVC:部署于服务器上的WEB站点名称

hello:注册于WEB站点上的控制器

基础流程

  1. 用户发起请求,被DispatcherServlet接收
  2. DispatcherServlet根据请求调用对应的HandlerMapper:处理器映射器,
  3. HandlerMapper处理器映射器根据请求url查找Handler处理器,HandlerExecution表示为具体的Handler,主要用于url查找控制器
  4. HandlerExution将查找到的Handler解析后的信息传递给DispatcherServlet
  5. DispatcherServlet调用HandlerAdapter:处理器适配器,按照特定的规则执行Handler
  6. Handler让具体的Controller执行,Controller通过ServiceBusiness Logic业务逻辑操作Repository:对象仓库实现Data Access:数据存取,完成对数据库的持久化操作
  7. Controller将具体的执行信息返回给HandlerAdapter,一般为ModelAndView:模型与视图
  8. HandlerAdapter处理器适配器将获取的ModelAndView(包含视图逻辑名或模型)传递给DispatcherAdapter:前端控制器
  9. DispatcherAdapter调用ViewResolver:视图解析器解析HandlerAdapter传递的逻辑视图名
  10. ViewResolver:视图解析器将解析得的逻辑视图名返回给DispatcherServlet
  11. DispatcherServlet根据视图解析器解析的结果调用具体的视图

原理开发

  1. 在父项目中新建模块,右键添加框架支持,添加WEB应用支持,创建一个基础web应用

  2. 在web.xml中注册servlet:DispatcherServlet,自定义servlet-name,在<servlet-mapping>中配置/表示匹配所有的请求,不匹配jsp;若配置为/*会匹配所有的请求包括JSP页面请求,可能无法响应JSP页面请求

    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    DispatcherServlet作为Spring-MVC的中心,在servlet的定义中必须绑定SpringMVC的配置文件;在配置中即设置参数contextConfigLocation,value值为我们创建的SpringMVC配置文件,该文件可以import方式合并到Spring配置文件中去

    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name></param-name>
            <param-value>classpath:SpringMVC-servlet.xml</param-value>
        </init-param>
        <!--启动级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    当Web应用启动时可能就会发送一些请求,故需配置DispatcherServlet的启动级别为1,使得服务器启动的同时启动该Servlet

  3. 编写创建的SpringMVC配置文件中,添加官方的Spring头文件命名空间及约束

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    

    在配置文件中添加SpringMVC核心三要素

    添加处理器映射器

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    

    添加处理器适配器

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    

    添加视图解析器:视图解析器可定义其他的模板引擎,在此处使用的SpringMVC官方提供的视图解析器的配置中,定义url的前缀与后缀,用于拼接全路径

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
       <!--前缀-->
       <property name="prefix" value="/WEB-INF/jsp/"/>
       <!--后缀-->
       <property name="suffix" value=".jsp"/>
    </bean>
    
  4. 定义Controller,在实现原始Controller接口的Controller控制器中,固定实现一个方法,其中包含业务代码与视图跳转,返回一个ModelAndView

    public class HelloController implements Controller {
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mav = new ModelAndView();
            //业务代码
            //假定业务返回
            String result = "Hello SpringMVC";
            mav.addObject("msg",result);
            //设置视图跳转
            mav.setViewName("hello");
            return mav;
        }
    }
    

    ModelAndView常用方法:

    mv.addObject("msg",result); 添加一个业务消息msg值为result,且该值可以为空,result常为业务代码的返回值

    mv.setViewName("name");设置视图名参数,与视图解析器前缀后缀拼接为跳转请求

  5. 在SpringMVC配置文件中配置Controller控制器对应的请求映射,当DispatcherServlet调用选择的处理器适配器BeanNameUrlHandlerMapping时,处理器适配器根据配置的bean名称找到对应的Controller执行

    <bean id="/hello" class="com.flagling.controller.HelloController"/>
    

注解开发

  1. 项目配置

    创建一个空白Maven模块,在pom.xml中配置maven资源过滤

    <build>
       <resources>
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.properties</include>
                   <include>**/*.xml</include>
               </includes>
               <filtering>false</filtering>
           </resource>
           <resource>
               <directory>src/main/resources</directory>
               <includes>
                   <include>**/*.properties</include>
                   <include>**/*.xml</include>
               </includes>
               <filtering>false</filtering>
           </resource>
       </resources>
    </build>
    

    模块右键添加web应用模块支持;点击项目结构Project Structure在Artifacts中选择当前模块

    在WEB-INF下新建lib文件夹,添加所有的library文件

    image-20201008171628153

  2. 在web.xml文件中注册DispatcherServlet

    <?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">
        <!--1.注册servlet-->
        <servlet>
            <servlet-name>SpringMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:SpringMVC-servlet.xml</param-value>
            </init-param>
            <!-- 启动顺序,数字越小,启动越早 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!--所有请求都会被springmvc拦截 -->
        <servlet-mapping>
            <servlet-name>SpringMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    
  3. 编写注册的DispatcherServlet关联的SpringMVC配置文件SpringMVC-servlet.xml,进行SpringMVC的注解配置

    • 配置controller注解扫描包,使得该包下的controller中的注解生效,由IOC容器管理

      <context:component-scan base-package="com.flagling.controller"/>
      
    • 配置SpringMVC不处理静态页面资源

      <mvc:default-servlet-handler />
      
    • 配置SpringMVC的注解支持

      <mvc:annotation-driven />
      
    • 配置视图解析器

      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
          <!-- 前缀 -->
          <property name="prefix" value="/WEB-INF/jsp/" />
          <!-- 后缀 -->
          <property name="suffix" value=".jsp" />
      </bean>
      
    • 最终配置文件:

      <?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"
             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
             http://www.springframework.org/schema/mvc
             https://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
          <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
          <context:component-scan base-package="com.flagling.controller"/>
          <!-- 让Spring MVC不处理静态资源 -->
          <mvc:default-servlet-handler />
          <!--
          支持mvc注解驱动
              在spring中一般采用@RequestMapping注解来完成映射关系
              要想使@RequestMapping注解生效
              必须向上下文中注册DefaultAnnotationHandlerMapping
              和一个AnnotationMethodHandlerAdapter实例
              这两个实例分别在类级别和方法级别处理。
              而annotation-driven配置帮助我们自动完成上述两个实例的注入。
           -->
          <mvc:annotation-driven />
      
          <!-- 视图解析器 -->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
                id="internalResourceViewResolver">
              <!-- 前缀 -->
              <property name="prefix" value="/WEB-INF/jsp/" />
              <!-- 后缀 -->
              <property name="suffix" value=".jsp" />
          </bean>
      
      </beans>
      
  4. 在配置的注解支持的Controller包下编写一个Controller类,添加@Controller注解后,自动装配到IOC容器

    @Controller//将当前类标记为Controller类
    @RequestMapping("/helloController")
    /*
    @RequestMapping请求映射注解可以标记控制器的类与类中方法,设置前端请求地址,标记在控制器上时,请求控制器中的方法时地址前必须先加上控制器的地址
    */
    public class HelloController {
    
        @RequestMapping("/hello")//标记当前方法的请求地址,Handler处理器运行凭此让具体的controller方法运行
        public String hello(Model model1){
            //封装数据到model
            model1.addAttribute("msg","Hello Annotation");
            //返回跳转视图名,视图控制器由此拼接获得全限定地址返回给前端控制器调用
            return  "hello";
        }
    }
    
  5. 创建视图层,视图层名称与controller中方法返回的参数需一致才可以调用成功,视图中设置参数数据在model封装的数据中取得

Controller解析

  • 控制器负责定义访问应用程序的行为
  • 负责解析用户的请求并将其转换为一个模型
  • SpringMVC中一个控制器可以包含多个方法

开发步骤

    • 创建Maven项目模块
    • 添加web应用框架支持,
    • 项目结构WEB-INF下新建lib目录用于Jar包打包
    • web.xml注册DispatcherServlet
    • 设置关联SpringMVC配置文件ContextConfigLocation
    • 设置启动级别<load-on-startup>为1,
    • 设置ServletMapping接收所有前端请求
    • 配置DispatcherServlet关联的SpringMVC配置文件

    • 配置Controller包组件扫描context:component-scan

    • 配置静态资源过滤<mvc:default-servlet-handler/>

    • 配置MVC注解驱动支持<mvc:annotation-driven/>

    • 配置视图解析器

      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
          <!-- 前缀 -->
          <property name="prefix" value="/WEB-INF/jsp/" />
          <!-- 后缀 -->
          <property name="suffix" value=".jsp" />
      </bean>
      
    • 创建视图解析器中注册的静态页面目录
    • 编写静态页面
    • 在Controller包下创建Controller类
    • 注解开发控制前端请求与静态页面的逻辑

Controller实现

  1. 实现Controller接口:

    • 实现Controller接口后则该类为一个控制器

    • 实现接口的方法默认实现一个方法返回一个ModelAndView

    • 方法的实现中包含业务处理,封装页面数据到ModelAndView,封装视图跳转参数名

    • 在Spring配置文件注册Controller的bean,name为前端请求参数路径;只有注册后HandlerAdapter处理器适配器在执行Handler时才能获取对应的Controller执行

      <bean name="/c1" class="com.flagling.controller.Controller1"/>
      
    • 特点:

      • 不需要在Spring配置文件中配置注解驱动、组件扫描包使注解生效
      • 方式较老,一个Controller类中只能实现一个方法,定义的方式比较麻烦
      • 每一个Controller方法实现均需在Spring配置文件中注册,无法自动装配
  2. 注解@Controller

    • @Controller注解类型用于声明Spring类的实例是一个控制器,标记与注解开发的Controller类上,常与@RequestMapping请求地址映射注解搭配使用
    • Spring可使用扫描机制使得指定的包中注解生效,故需在Spring配置中配置Controller包的组件扫描与注解驱动支持
    • @Controller注解的类会自动添加到Spring上下文context中,由IOC容器管理
    • 在Controller包下创建类,用@Controller注解声明当前类为一个控制器
    • 在类中可配置多个方法,每个方法可用@RequestMapping注解标记方法请求映射地址,当请求映射地址与前端请求对应则调用方法;若方法返回值为String,且有对应返回值名称的具体页面时,就会被视图解析器解析‘
    • 在方法中常用Model对象封装跳转页面数据

RequestMapping

  • @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法,即控制器类中的方法
  • Controller类中同时标记类与方法,二者存在上下级的关系,前端地址必须加上类的请求地址才能请求到对应控制器方法

RestFul风格

  • Restful是一个定义资源定位及资源操作的风格,基于该风格设计的软件可以更简洁、更有层次、更易于实现缓存机制

  • 使用Resful操作资源,一个请求url地址可通过不同的请求方式实现不同的效果

    • 后端:

      Controller类的方法上可通过@RequestMapping设置请求地址与请求方式 ,@PathVariable注解匹配前端请求参数

          @RequestMapping(value = "hello/{a}/{b}",method = RequestMethod.GET)
          public String Add(@PathVariable Integer a, @PathVariable String b, Model model){
              String res = a+b;
              model.addAttribute("msg",res);
              return "hello";
          }
      

      也可通过@RequestMapping的变体,各个请求方式的Mapping来设置请求地址,默认为注解对应的请求方式

      @GetMapping("M1")//get请求方式注解
      @PostMapping("M1")//Post请求方式注解
      @DeleteMapping("M1")//Delete请求方式注解
      @PutMapping("M1")//Put请求方式注解
      

      标记不同请求方式的方法,设置的地址映射一致;依靠前端请求该地址的请求方式决定调用具体的Controller方法,达到地址复用的效果
      = a+b;
      model.addAttribute(“msg”,res);
      return “hello”;
      }

      
      也可通过`@RequestMapping`的变体,各个请求方式的Mapping来设置请求地址,默认为注解对应的请求方式
      
      ```java
      @GetMapping("M1")//get请求方式注解
      @PostMapping("M1")//Post请求方式注解
      @DeleteMapping("M1")//Delete请求方式注解
      @PutMapping("M1")//Put请求方式注解
      

      标记不同请求方式的方法,设置的地址映射一致;依靠前端请求该地址的请求方式决定调用具体的Controller方法,达到地址复用的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值