zoukankan      html  css  js  c++  java
  • Spring MVC

    Spring MVC

    MVC 是什么

    MVC 是 Model、View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责。

    模型:用于存储数据以及处理用户请求的业务逻辑。一个或多个 JavaBean 对象

    视图:向控制器提交数据,显示模型中的数据。一个或多个JSP 页面

    控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。 一个或多个 Servlet 对象

    基于 Servlet 的MVC 模式的流程图

    image-20200417104031475

    Spring MVC 工作流程

    image-20200417104656125

    总结:
    1. 客户端请求提交到 DispatcherServlet。
    2. 由 DispatcherServlet 控制器寻找一个或多个 HandlerMapping,找到处理请求的 Controller。
    3. DispatcherServlet 将请求提交到 Controller。
    4. Controller 调用业务逻辑处理后返回 ModelAndView。
    5. DispatcherServlet 寻找一个或多个 ViewResolver 视图解析器,找到 ModelAndView 指定的视图。
    6. 视图负责将结果显示到客户端

    HandlerMapping 接口负责完成客户请求到 Controller 映射。

    Controller 接口将处理用户请求,一旦 Controller 处理完用户请求,将返回 ModelAndView 对象给 DispatcherServlet 前端控制器,ModelAndView 中包含了模型(Model)和视图(View)。

    注解

    Controller 注解类型

    在 Spring MVC 中使用 org.springframework.stereotype.Controller 注解类型声明某类的实例是一个控制器。

    package controller;
    
    import org.springframework.stereotype.Controller;
    
    /**
    * “@Controller”表示 IndexController 的实例是一个控制器
    *
    * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
    */
    @Controller
    public class IndexController {
        // 处理请求的方法
    }
    

    在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC 框架扫描到,需要在配置文件中声明 spring-context,并使用 <context:component-scan/> 元素指定控制器类的基本包

    <?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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:p="http://www.springframework.org/schema/p" 
        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
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!-- 使用扫描机制扫描控制器类,控制器类都在controller包及其子包下 -->
        <context:component-scan base-package="controller" />
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>
    
    RequestMapping 注解类型

    在基于注解的控制器类中可以为每个请求编写对应的处理方法。那么如何将请求与处理方法一一对应呢?

    需要使用 org.springframework.web.bind.annotation.RequestMapping 注解类型将请求与处理方法一一对应。

    1)方法级别注解

    方法级别注解的示例代码如下

    package controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
    * “@Controller”表示 IndexController 的实例是一个控制器
    *
    * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
    */
    @Controller
    public class IndexController {
        @RequestMapping(value = "/index/login")
        public String login() {
            /**
             * login代表逻辑视图名称,需要根据Spring MVC配置
             * 文件中internalResourceViewResolver的前缀和后缀找到对应的物理视图
             */
            return "login";
        }
    
        @RequestMapping(value = "/index/register")
        public String register() {
            return "register";
        }
    }
    

    上述示例中有两个 RequestMapping 注解语句,它们都作用在处理方法上。注解的 value 属性将请求 URI 映射到方法,value 属性是 RequestMapping 注解的默认属性,如果只有一个 value 属性,则可以省略该属性。

    用户可以使用如下 URL 访问 login 方法(请求处理方法),在访问 login 方法之前需要事先在 /WEB-INF/jsp/ 目录下创建 login.jsp。

    http://localhost:8080/springMVCDemo02/index/login
    
    2)类级别注解

    类级别注解的示例代码如下:

    package controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    @Controller
    @RequestMapping("/index")
    public class IndexController {
        @RequestMapping("/login")
        public String login() {
            return "login";
        }
    
        @RequestMapping("/register")
        public String register() {
            return "register";
        }
    }
    

    在类级别注解的情况下,控制器类中的所有方法都将映射为类级别的请求。用户可以使用如下 URL 访问 login 方法。

    http://localhost:8080/springMVCDemo02/index/login
    

    为了方便维护程序,建议开发者采用类级别注解,将相关处理放在同一个控制器类中。例如,对商品的增、删、改、查处理方法都可以放在 GoodsOperate 控制类中。

    作者:我是刘先生
    地址:https://www.cnblogs.com/cekaigongchengshi/
    文章转载请标明出处,如果,您认为阅读这篇博客让您有些收获,不妨点击一下推荐按钮,据说喜欢分享的,后来都成了大神

    欢迎扫码关注微信公众号
  • 相关阅读:
    bzoj 3238
    bzoj 3473 后缀自动机多字符串的子串处理方法
    bzoj 2998 第k小字串
    bzoj 3672 利用点分治将CDQ分治推广到树型结构上
    bzoj 3671 贪心
    NOIP模拟题——nan
    NOIP模拟题——kun(栈)
    hduP2586——How far away ?
    DP习题
    NOIP模拟题——来自风平浪静的明天
  • 原文地址:https://www.cnblogs.com/cekaigongchengshi/p/12869826.html
Copyright © 2011-2022 走看看