自学springMVC的第一天

SpringMVC应用一

一、SpringMVC的概述

1、什么是SpringMVC

  • Spring MVC是一种基于java实现了Web MVC 设计模式的请求驱动类型的轻量级的Web框架。

    • SpringMVC主要解决Web应用的轻量级框架

      • 作用于javaee分层架构,处理Web层的控制器组件

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtHIzLhx-1631703881460)(assets/image-20210914141342196.png)]

    • 它也是Spring框架组件之一

    • 它也是基于MVC思想设计

    • 它基于请求驱动实现

2、SpringMVC的作用

  • 解决web应用问题,简化web应用开发功能

    • 提供以注解方式解决web功能
  • 作用于三层架构,主要解决web层问题

二、SpringMVC的框架模型

1、SpringMVC框架图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1UR92mo-1631703881462)(assets/image-20210914141720539.png)]

  • 描述Springmvc的框架模型

2、SpringMVC的核心组件

  • DispatcherServlet

    • 前端控制器
      • DispatcherServlet组件是整个SpringMVC的核心
      • 它是负责用户请求,也就是SpringMVC所有的请求入口都是DispatcherServlet
      • 负责委派及协调组件去处理请求并且作出相应的响应结果
  • HandlerMapping

    • 处理器映射器
      • 作用
        • 根据用户请求,找到对应的hanlder组件
          • 可以根据不同的规则,去找到对应的handler组件
            • 可以根据bean name
            • 可以根据直接映射uri地址
            • 可以根据@RequestMapping("/xxx")
  • HandlerAdpater

    • 处理器适配器
      • 作用
        • 判断handler目标组件是否适合运行
        • 举例
          • 看电影,门票买,位置已经坐下,还是有3D眼镜才能看此电影,类比适配器检验是否有带3D眼镜
  • Handler

    • 目标组件
      • 它其实就是客户端请求运行的组件对象
  • ModelAndView

    • Model

      • 指就是数据模型

        • 将数据加载到Model,默认会将数据存储到request作用域
      • 作用

        • 将数据显示到视图组件
    • View

      • 视图组件
  • ViewResolver

    • 视图解释器
      • 将逻辑视图通过解释器解释成物理视图组件

3、SpringMVC的工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnLmOWyc-1631703881463)(assets/image-20210914144733110.png)]

1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链
HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给
DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器
HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封
装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到
DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至
视图中)。
11.DispatcherServlet响应用户。

三、实现Springmvc第一个程序

1、导入jar库

2、配置DispatchServlet

  • 在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">
    
        <!--配置DispatchServlet-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/spring-mvc.xml</param-value>
            </init-param>
            <!--当web应用启动,则初始化此Servlet组件-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <!--此应用所有的请求路径都交给DispatcherServlet处理-->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

3、配置spring-mvc.xml文件

  • 主要配置springmvc的核心组件,配置成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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--主要配置springmvc的核心组件-->
        <!--配置handlerMapper组件
            BeanNameUrlHandlerMapping:根据bean的name作为handler uri地址映射
        -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    
        <!--将handler配置成bean对象-->
        <bean name="/hello" class="com.gec.controller.HelloController" />
    
    
        <!--主要配置一个HandlerAdapter
            适配handler是否实现Controller接口,如果实现此接口,则允许运行此目标handler,否则运行不了
        -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    
        <!--视图解释器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--视图组件的后缀-->
            <property name="suffix">
                <value>.jsp</value>
            </property>
            <!--配置前缀(视图组件在那个路径)-->
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
        </bean>
    
    
    </beans>
    

4、编写Handler

package com.gec.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
* 目标handler
* */
public class HelloController implements Controller {

    /*
    * 此handler目标对象的请求方法
    * */
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        httpServletRequest.setAttribute("username","tom");

        ModelAndView modelAndView=new ModelAndView();
        //逻辑视图名(success)---->视图解释器 ----->(/WEB-INF/jsp/success.jsp)
        modelAndView.setViewName("success");


        return modelAndView;
    }
}

四、分析处理器映射器和处理器适配器

1、处理器映射器

  • 作用

    • 根据一定的规则去找到目标handler
  • 类型

    • BeanNameUrlHandlerMapping

      • 根据handler的bean name作为访问handler的uri地址
    • SimpleUrlHandlerMapping

      • 将handler bean对象与uri地址作直接映射

      • 举例

        • key:就是uri地址
        • value:uri地址映射的bean id(bean就是handler的bean对象)
            <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
                <property name="mappings">
                    <props>
                        <prop key="/hello">hellohandler</prop>
                        <prop key="/hello2">hellohandler</prop>
                    </props>
                </property>
            </bean>
        
    • ControllerClassNameHandlerMapping(Spring5不支持)

    • RequestMappingHandlerMapping

      • 要使用此映射器,它与RequestMappingHandlerAdapter一对
      • 实现@RequestMapping注解方式映射handler地址

2、处理器适配器

  • 作用

    • 1、判断handler是否适合运行,如果不适合运行,则直接抛出异常(The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler)

    • 2、执行目标handler

      • 消息转换器
      • 数据转换
      • 数据格式化
      • 数据校验
      • 运行handler
    • 3、返回ModelAndView对象给DispatcherServlet

  • 适配器类别

    • HttpRequestHandlerAdapter

      • 必须要求handler实现HttpRequestHandler接口

      • 用法

        package com.gec.controller;
        
        import org.springframework.web.HttpRequestHandler;
        
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        
        /*
        * 目标handler
        * */
        public class HelloController implements HttpRequestHandler {
            @Override
            public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        
                httpServletRequest.setAttribute("username","tom");
        
                //转发给视图组件显示
                httpServletRequest.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(httpServletRequest,httpServletResponse);
        
            }
        
        }
        
        
    • SimpleControllerHandlerAdapter

      • 此handler必须实现org.springframework.web.servlet.mvc.Controller接口

      • 用法

        package com.gec.controller;
        
        import org.springframework.web.servlet.ModelAndView;
        import org.springframework.web.servlet.mvc.Controller;
        
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        /*
        * 目标handler
        * */
        public class HelloController implements Controller {
        
        
        
           /* * 此handler目标对象的请求方法
            * **/
            @Override
            public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        
                httpServletRequest.setAttribute("username","tom");
        
                ModelAndView modelAndView=new ModelAndView();
                //逻辑视图名(success)---->视图解释器 ----->(/WEB-INF/jsp/success.jsp)
                modelAndView.setViewName("success");
        
        
                return modelAndView;
            }
        }
        
        
    • RequestMappingHandlerAdapter

      • 以注解的方式适配目标对象

      • 与RequestMappingHandlerMapping是一对的

五、以注解的方式实现Springmvc程序

1、简介

  • 使用注解方式实现handler目标请求方法

  • 使用什么注解

    @RequestMapping
    
    • 此注解修饰方法
      • 定义一个请求方法对应的uri地址
  • 如何配置注解方式实现请求

    • 使用RequestMappingHandlerMapping处理器映射器
    • 使用RequestMappingHandlerAdapter处理器适配器

2、具体实现

a、配置DispatcherServlet

  • 编写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">

    <!--配置DispatchServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-mvc.xml</param-value>
        </init-param>
        <!--当web应用启动,则初始化此Servlet组件-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--此应用所有的请求路径都交给DispatcherServlet处理-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

b、编写spring-mvc.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"
           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/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.gec.controller" />
    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
    
    
    
        <!--视图解释器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--视图组件的后缀-->
            <property name="suffix">
                <value>.jsp</value>
            </property>
            <!--配置前缀(视图组件在那个路径)-->
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
        </bean>
    
    </beans>
    
  • 更加简化的写法

    <?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/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.gec.controller" />
    
        <mvc:annotation-driven />
        <mvc:default-servlet-handler />
    
    
    
        <!--视图解释器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--视图组件的后缀-->
            <property name="suffix">
                <value>.jsp</value>
            </property>
            <!--配置前缀(视图组件在那个路径)-->
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
        </bean>
    
    </beans>
    

c、编写Handler类

  • 此handler必须使用@Controller注解
package com.gec.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {


    /*
    * 定义请求方法
    * 一个请求方法映射一个uri地址
    * */
    @RequestMapping(value = "/hello1")
    public ModelAndView dohello()
    {
        String username="tom";

        ModelAndView modelAndView=new ModelAndView();
        //将数据存储到request作用域
        modelAndView.addObject("username",username);
        modelAndView.setViewName("success");
        return modelAndView;

    }

    /*
    * 如果此请求方法返回是字符串类型,则认为是逻辑视图名
    * */
    @RequestMapping(value = "/hello2")
    public String dohello2(Model model)
    {
        //将数据存储到request作用域
        model.addAttribute("username","gec");

        return "success";
    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值