3.SpringMVC

SpringMVC

1.Springmvc概述

1.1mvc模式

模型(Model)是应用程序的核心部分,它负责处理数据和业务逻辑。可以将模型看作是应用程序的“大脑”,它知道如何处理数据并执行业务逻辑。在Web应用程序中,模型通常包括数据访问对象(DAO)、实体类和服务层。即:service+dao+entity。其对应框架:mybatis,jdbc等。

视图(View)是MVC模式中的另一个核心部分,它负责显示数据和用户界面。视图可以是Web页面、移动应用程序的UI界面或其他任何形式的用户界面。在Web应用程序中,视图通常由HTML、CSS和JavaScript等技术组成。

控制器层(Controller)是MVC模式中的第三个核心部分,它负责协调模型和视图之间的交互。控制器接收来自用户界面的请求,并将请求传递给模型进行处理。一旦模型Model完成处理,控制器将结果返回给视图进行显示。 在Web应用程序中,控制器通常是一个Servlet(老的javase)或Spring MVC框架中的控制器controller类。控制器类负责处理来自浏览器的HTTP请求,并将请求转发(或者说调用到适当的service层或DAO层(一般controller调用service层)进行处理。一旦服务层或DAO层完成处理,控制器类将结果返回给浏览器以供显示。设计层面:controller。可选框架:springmvc。

模块设计层面可选框架
模型(Model)service+dao+entityjdbc,hibernate,mybatis
视图(View)Webapp 页面jsp,thymeleaf,vue
控制器(Controller)controllerservlet,structs2,springmvc

1.2springmvc概述

Spring MVC是Spring框架的一部分。Spring框架提供了很多功能和组件,包括IoC容器、AOP、数据访问、事务管理、Web开发等。Spring MVC是Spring框架中的一个模块,它提供了基于MVC模式的Web开发功能。因此,使用Spring MVC可以方便地与其他Spring组件(如IoC容器和AOP)集成,并且可以充分利用Spring框架提供的其他功能。

2.springmvc五大核心组件:

  1. DispatcherServlet:DispatcherServlet是Spring MVC框架中的核心组件,它负责接收所有的HTTP请求,并将请求分发给适当的处理器进行处理。DispatcherServlet是MVC模式中的C层的核心,它继承了Servlet的接口。在Spring MVC中,DispatcherServlet充当了前端控制器(Front Controller)的角色。

  2. HandlerMapping:HandlerMapping是处理器映射器,它负责根据请求URL找到对应的处理器(Handler)。在Spring MVC中,HandlerMapping将请求URL映射到一个或多个处理器上。springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。由框架实现。

  3. Handler:(是需要程序员开发具体的Controller)Handler是具体的处理器,有叫后端处理器,它是c层和model层交互、调用的那一层。它负责处理来自用户界面的请求,并将结果返回给前端控制器DispatcherServlet。在Spring MVC中,Handler通常是一个Controller类或者一个带有@RequestMapping注解的方法。

  4. ViewResolver:ViewResolver是视图解析器,它负责将逻辑视图名称解析为实际视图对象。在Spring MVC中,ViewResolver通常使用JSP、Thymeleaf、FreeMarker等技术来实现视图层。它根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通0过页面展示给用户。由框架实现。

  5. View:View是实际视图对象,它负责显示数据和用户界面。在Web应用程序中,View通常由HTML、CSS和JavaScript等技术组成。

  6. HandlerAdapter:处理器适配器,通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。(由框架实现,和HandlerMapping,不用太过关注)

    省流版:

    DispatcherServlet :控制器入口负责接收、分发请求

    HandlerMapping:负责根据请求找到对应的控制器

    Controller: 真正处理请求的控制器

    ModelAndView:封装数据信息和视图信息的

    ViewResolver:视图处理器通过处理找到对应的页面

五大核心组件与传统servlet的关系:

DispatcherServlet和Handler这些组件可以被看作是对Servlet功能的细化和扩展。在传统的Servlet编程模型中,一个Servlet通常负责处理多个URL请求,并且需要自己解析HTTP请求、生成HTTP响应等多个操作。这种模式下,一个Servlet可能会变得非常复杂和臃肿。

而DispatcherServlet主要继承了Servlet的接收http请求并分发的功能,它直接调用了servlet的api;而原本Servlet也要干的用于处理HTTP请求和生成HTTP响应就交给了控制器(Controller)类或处理器方法(Handler Method)它们并不直接继承自Servlet API中的任何类或接口。

当一个HTTP请求到达DispatcherServlet时,DispatcherServlet会根据请求的URL和其他条件来确定要将该请求分发给哪个Handler来进行处理。然后,DispatcherServlet会调用对应的Handler来生成HTTP响应。

3.SpringMvc具体的执行流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50UTfw9O-1683633483626)(C:\Users\wyf\AppData\Roaming\Typora\typora-user-images\image-20230411205844955.png)]

  1. 用户在浏览器提交请求会到前端控制器DispatcherServlet进行处理。前端控制器DispatcherServlet收到请求后,将请求转给处理器映射器HandlerMapping。
  2. 处理器映射器HandlerMapping根据request请求的URL等信息查找能够进行处理的Handler,以及相关拦截器interceptor,并构造HandlerExecutionChain执行链,然后将构造好的HandlerExecutionChain执行链对象返回给前端控制器DispatcherServlet,执行链包含一个处理器对象和一或多个拦截器。
  3. 前端控制器DispatcherServlet根据处理器执行链的处理器,能够找到其对应处理器的处理器适配器HandlerAdapter;
  4. 处理器适配器HandlerAdapter调用相应的处理Handler,即让我们写的具体的Controller方法执行。
  5. Controller处理完后返回ModelAndView给HandlerAdapter(ModelAndView表示SpringMVC的封装对象,将model和view封装在一起)。
  6. 处理器适配器HandlerAdapter将Controller执行结果ModelAndView返回给前端控制器DispatcherServlet。
  7. 前端控制器DispatcherServlet调用视图解析器ViewReslover处理ModelAndView。
  8. 视图解析器ViewReslover解析后根据逻辑视图名解析成物理视图名即具体的页面地址,生成并返回具体对象View(springmvc封装对象,是一个接口)。
  9. 前端控制器DispatcherServlet根据对象View进行视图渲染(即将模型数据model填充至视图中)。
  10. 最后前端控制器DispatcherServlet向用户返回响应,至此就全部完成了。
流程简略版:
  1. 当用户发送HTTP请求时,DispatcherServlet首先接收到请求。
  2. DispatcherServlet将请求交给HandlerMapping进行处理器映射,找到对应的Handler。
  3. Handler处理请求,并将结果返回给DispatcherServlet。
  4. DispatcherServlet将逻辑视图名称交给ViewResolver进行视图解析,找到对应的View。
  5. View显示数据和用户界面,并将结果返回给DispatcherServlet。
  6. DispatcherServlet将结果返回给浏览器进行显示。

4.SpringMVC配置和环境搭建

4.1创建maven工程

并在pom.xml中导入相关依赖。

4.2web.xml 中配置 DispatcherServlet

springmvc的配置:

​ springmvc的配置一般都是在web.xml里面指定位置的。另外,springmvc 的配置文件也有默认位置。因此,存在两种配置方式:

  1. 采用默认配置方式, springmvc 的配置文件有默认位置。

    <!--  Spring MVC 的Servlet,-->   
    <servlet>
      <servlet-name>springDisServlet</servlet-name>
      <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>springDisServlet</servlet-name>
      <url-pattern>*.do</url-pattern>
    </servlet-mapping> 
    
    

    这是web.xml中对DispatcherServlet的配置(当然如果用springboot的话,只需添加spring-boot-starter-web依赖来自动配置DispatcherServlet和其他相关组件。这个依赖包含了Spring MVC框架所需的所有组件和配置文件,因此不需要手动添加或修改任何配置文件。)

    注意这里没有标签,这个标签是用来设定Spring MVC配置文件的名称(可以自己定为springconfig.xml啥啥的)和位置的,所以这是使用默认的配置文件位置时,Spring MVC会在classpath下查找名为"spring-servlet.xml"或"[servlet-name]-servlet.xml"的配置文件,并自动加载它们。

    比如:我们将DispatcherServlet的名称设置为"myDispatcherServlet"(上面代码中取名为springDisServlet的哈),那么Spring MVC会在classpath下查找名为"spring-servlet.xml"或"myDispatcherServlet-servlet.xml"的配置文件,并自动加载它们。

    好处:这样做的好处是可以简化配置,因为我们不需要在web.xml文件中显式地指定Spring MVC配置文件的位置。同时,这也符合约定优于配置(Convention over Configuration)的原则

  2. 采用指定位置配置方式

    在web.xml文件中指定springmvc 的配置文件位置,该配置文件必须放在src目录中。关键配置语法为:

    <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:springmvc.xml</param-value> 
    </init-param>
    
    

    在web.xml对DispatcherServlet的配置中增加这一段标签,明确了contextConfigLocation的地址为:classpath:(即在classess文件夹下面),而且命名为springmvc.xml(或者其他名称都可以),指定配置文件位置时,这个配置文件的名字可以随便取。

web.xml中DispatcherServlet的详细配置

load-on-startup:当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被调用时才加载。正数的值越小,启动该servlet的优先级越高。

url-pattern:表示拦截哪些请求, “/” 表示拦截所有请求。也可以如”.扩展名”表示拦截所有以扩展名结尾的请求。例如”.do”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vHGGmNms-1683633483627)(C:\Users\wyf\AppData\Roaming\Typora\typora-user-images\image-20230412011145228.png)]

4.3编写springmvc.xml 文件并在其中配置ViewResolver(视图解析器)和HandlerMapping(处理器映射器)两个组件

注意,当用默认的方式配置Spring MVC时,我们不需要手动在spring-servlet.xml中配置这些组件。这是因为Spring MVC框架提供了一种基于约定大于配置的方式来进行组件的自动注册和装配。

具体来说,当我们在web.xml文件中配置DispatcherServlet时,Spring MVC框架会自动加载并解析名为[servlet-name]-servlet.xml的配置文件,并根据其中的约定来注册和装配各个组件。例如,Spring MVC框架会自动扫描指定包下的所有@Controller、@Service、@Repository和@Component注解,并将它们注册为相应类型的Bean。

所以感觉这部分不是很必要啊

springmvc的src目录下创建Spring MVC配置文件springmvc.xml(手动配置方法),在该配置文件中,使用Spring MVC最简单的配置方式进行配置,主要配置处理器映射器和视图解析器。 在springmvc.xml文件中,首先要引入beans、aop、context和mvc命名空间;然后主要完成配置处理器映射和配置视图解析器。

  1. 配置处理器映射器

    使用mvc:annotation-driven元素后,会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver这三个Bean。

    但mvc:annotation-driven 配置mvc注解扫描,可以用注解@RequestMapping(“url”) 加在方法前简化配置、、

  2. 配置视图解析器

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/“ />
        <property name=“suffix” value=“.html” />
    </bean>
    

    prefix属性指定了所有视图文件所在目录的前缀,而suffix属性指定了所有视图文件的后缀。这样,在进行视图解析时,Spring MVC框架会根据Controller返回的逻辑视图名和这两个属性来自动拼接出对应的物理视图路径。即: 前缀+视图名+后缀=映射到页面(物理视图路径)

4.4创建controller类(在后面5.mvc两核心注解中再展开讲)

  • @Controller:将该Bean注册到Spring的容器中

  • @RequestMapping:该注解可以用在类和方法上,它是用来映射请求的URL。用在类上: 表示初步的请求映射信息,所有响应请求都是以该地址作为父路径。用在方法上: 表示在父路径的基础上进一步细分映射信息。类定义处未标注@RequestMapping:则映射的请求URL从方法处开始。

    eg:在项目的src目录下创建包com.springmvc.controller,在包中创建类HelloController.java,用来处理/hello请求

    @Controller
    public class HelloController {
        @RequestMapping("/hello")
        public ModelAndView ceshi( ) {
            ModelAndView mav = new ModelAndView();  
            mav.addObject("msg", "这是第一个Spring MVC 程序!")
            mav.setViewName("success"); //返回的文件名  
            return mav;             // 返回逻辑名
        } 
    }
    

4.5 创建视图文件

  1. 创建视图页面 在项目的WEB-INFO路径下创建springmvc-1文件夹,并在此文件夹中创建视图页面success.jsp。并在该视图页面上通过EL表达式输出“msg”中的信息,代码如右所示:

  2. 部署项目,启动Tomcat测试 将项目文件发布到Tomcat中,并启动Tomcat服务器,访问http://localhost:8080/springmvc-1/hello,其运行效果如图所示。

4.5 Spring MVC 请求流程

通过前面示例,简单总结Spring MVC的处理流程:

​ 当用户发送URL请求http://localhost:8080/springmvc-1/hello时,根据web.xml中对于DispatcherServlet的配置,该请求被DispatcherServlet截获(DispatcherServle在web.xml中的配置url-pattern:中写 “/” 表示拦截所有请求,所以肯定把它拦下来了),(后面的流程前面讲过了)并根据HandlerMapping找到处理相应请求的Controller控制器(HelloController);Controller处理完成后,返回ModelAndView对象;该对象告诉DispatcherServlet需要通过哪个视图来进行数据模型的展示,DispatcherServlet根据视图解析器把Controller返回的逻辑视图名渲染成真正的视图并输出,呈现给用户。

​ DispatcherServlet会利用一些特殊的bean来处理Request请求和生成相应的视图返回。关于视图的返回,Controller只负责传回来一个值,然后到底返回的是什么视图,是由视图解析器控制的,在jsp中常用的视图解析器是InternalResourceViewResovler,它会要求一个前缀和一个后缀在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/springmvc-1/blog/index.jsp。

5 Spring MVC 控制类两大基础注解

5.1 @Controller注解

在SpringMVC中, @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。

@Controller 定义了一个控制器类,而使@RequestMapping 注解的方法才是真正处理请求的处理器。 @controller主要负责处理前端控制器(DispatcherServlet )发过来的请求,经过业务逻辑层处理(controller调用service层)之后封装成一个model,并将其返回给view进行展示。


@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。这个时候就需要把这个控制器类交给Spring 来管理。有两种方式可以管理:

<!-- 方式一 --> 
<bean class="com.cqvie.handler.HelloWorld"/> 
<!-- 方式二 --> 
< context:component-scan base-package = "com.cqvie"/> 
<!-- 路径写到controller的上一层 --> 

  • 方式一:手动在配置文件中定义一些Bean对象、、傻子吧,注解>配置!

  • 方式二:注解扫描配置:通过context:component-scan元素来自动扫描指定包下所有带有@Controller、@Service、@Repository和@Component注解的类,并将其自动注册为Spring容器中的Bean对象。例如,在您提供的代码中,我们通过context:component-scan元素来扫描com.cqvie包(controller上一层的路径)下所有带有注解的类,并将其自动注册为Spring容器中的Bean对象。


    mvc:annotation-driven/元素:

启用mvc:annotation-driven/之后,我们就可以在控制器类中使用@Controller、@RequestMapping、@RequestParam等注解来定义请求映射和请求参数绑定等功能。因为单用context:component-scan元素只能扫描并注册带有@Controller、@Service、@Repository和@Component注解的类,并将其自动注册为Spring容器中的Bean对象。它并不能直接扫描和处理@RequestMapping、@RequestParam等注解。

5.2 @RequestMapping

Spring通过@Controller注解找到相应的控制器类以后,还需要知道控制器内部对每一个请求是如何处理的,这就需@RequestMapping注解,其作用是为控制器controller指定可以处理哪些URL请求,可以使用该注解标注在一个方法或一个类上。如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ecgn8SiT-1683633483628)(C:\Users\wyf\AppData\Roaming\Typora\typora-user-images\image-20230412020725513.png)]

这里,我们在一个名为UserController的类上使用@RequestMapping注解,并指定URL为"/user",那么这个UserController就成为了一个处理"/user"请求的控制器。此时,UserController中的所有方法都可以被映射为相对于"/user"路径的请求。相关路径都要加上"/user",此方法被映射到如下请求URL:

  • http://localhost:8080/springmvc-2/user/register
  • http://localhost:8080/springmvc-2/user/login

6 SSM总体框架图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-chm8bLh0-1683633483628)(C:\Users\wyf\AppData\Roaming\Typora\typora-user-images\image-20230412021127400.png)]

此时,UserController中的所有方法都可以被映射为相对于"/user"路径的请求。相关路径都要加上"/user",此方法被映射到如下请求URL:

  • http://localhost:8080/springmvc-2/user/register
  • http://localhost:8080/springmvc-2/user/login

6 SSM总体框架图[外链图片转存中...(img-chm8bLh0-1683633483628)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凡ffffff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值