SpringMvc 体系结构和处理请求控制器

本文介绍了使用 Spring MVC 进行环境搭建的方法。先阐述了 Spring MVC 的概念和优势,它是 Spring 框架用于 Web 开发的模块,具有高可配置性等特点。接着详细说明了在 idea 中搭建环境的步骤,包括引入依赖、配置 Servlet、创建配置文件、Controller 等,还总结了处理流程及一键式配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用 Spring MVC 进行环境搭建

1.1认识 Spring MVC

  Spring MVC 是 Spring 框架中用于 Web 应用开发的一个模块,是 Spring 提供的一个基于 MVC 设计模式的优秀的 Web 开发框架。其本质相当于 servlet。在 MVC 设计模式中,Spring MVC 作为控制器(Controller)来建立模型与视图,的数据交互,是结构最清晰的 MVC Model2实现。Spring MVC 框架采用松耦合课插拔的组件结构,具有高度可配置性,比其他MVC 框架更具扩展性和灵活性。 此外, SpringMVC 的注解驱动和对REST 风格的支持,是它最具特色的功能。无论是在框架设置,还是在扩展性、灵活性等方面都超越了 Struts2 等MVC 框架,而且它本身也是 Spring 框架的一部分,与Spring 框架的整合可以说是无缝集成,性能方面具有天生的优越性。

1.2环境的搭建

  在 idea 中使用 SpringMVC 框架的步骤如下:
    1、引入相应的依赖。
    2、 Spring MVC 配置。
     a.在 web.xml 中配置servlet, 定义 Spring MVC 的核心 DispatcherServlet.
     b.创建和编写 SpringMVC 的配置文件。
     3、 创建 Controller(处理请求额的控制器)。
     4、 创建 View。
     5、 部署运行。

一、新建一个 Maven 的 webapp项目,在 pom.xml 中添加相应的依赖:
如下图示:
在这里插入图片描述在这里插入图片描述
在pom.xml中添加需要用到的 jar 包,这里我还导入了 myBatis 和 Spring 的一些 依赖:

在这里插入图片描述
二、在web.xml 中配置 Servlet
  Spring MVC 是基于 Servlert 的框架, DispatcherServlet 是整个 Spring MVC 框架的核心,它负责截获请求并将其分派给相应的处理器处理。下面是对 在 web.xml 中 Servlet 的配置。

 <!--配置 SpringMVC 的核心控制器 DispatcherServlet-->
  <servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
    <!-- 初始化参数 -->
    <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>
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  上述代码中的 Servlet 就相当于是 SpringMVC 的入口,通过“<load-on-startup>1</load-on-startup>” 配置标记容器在启动的时候就加载此 DispatcherServlet,即自动启动。然后通过 servlet-mapping 映射到 “/”,即 DispatcherServlet 需要截获并处理该项目的所有URL 请求。在配置 DispatcherServlet 的时候,通过设置 contextConfigLocaiton 参数来指定 Spring MVC 配置文件的位置,此处使用 Spring 资源路径的方式进行指定(classpath:Sspringmvc-servlet.xml)。

补充:*“/” 和 "/"的区别
< url-pattern > / </ url-pattern > 不会匹配到*.jsp,即:.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /
</ url-pattern > 会匹配*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

总之,关于web.xml的url映射的小知识:
< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
< url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)

  1. 首先/这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配。

  2. 在springmvc中可以配置多个DispatcherServlet,比如: 配置多个DispatcherServlet有/和/*,先匹配的是/*这个

  3. 当配置相同的情况下,DispathcherServlet配置成/和/的区别
    <一>/:使用/配置路径,直接访问到jsp,不经springDispatcherServlet
    <二> /
    :配置/*路径,不能访问到多视图的jsp

  当我在客户端调用URL:/user/list然后返回user.jsp视图,当配置的是/:DispathcherServlet拿到这个请求然后返回对应的controller,
  然后依据 Dispather Type为Forward类型转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather没有拦截/user/user.jsp,
  因为此时你配置的是默认的 /,就顺利的交给 ModleAndView 去处理显示了。
当配置的是/*:DispathcherServlet拿到这个请求然后返回对应的controller,然后通过Dispather Type通过Forward转发到user.jsp视图,
  即就是请求user.jsp视图(/user/user.jsp),此时Dispather已经拦截/user/user.jsp,Dispatcher会把他当作Controller去匹配,没有匹配到就会报404错误。

结论:在配置视图的时候尽量用 “/” 这种方式。

三、创建 Spring MVC 的配置文件。如下示例:

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

        http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util-4.0.xsd

        http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd

        http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

        http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://www.springframework.org/schema/p  http://www.springframework.org/schema/p/spring-p-4.0.xsd">
    <!--声明控制器的Bean-->
<bean name="/index" class="controller.TestController"/>
    <!--完成视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>

</beans>

  在上述配置中,主要完成一下两部分内容。
  (1)、配置处理映射器。
  DispatcherServlet 接收到请求后,通过咨询一个名为 HandlerMapping 的 Bean ,把一个 URL 请求指定给一个 Controller 处理。Spring 提供了多种处器映射(HandlerMapping )的支持,比如:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

  BeanNameUrlHandlerMapping 是根据spring容器中配置的bean名称【注意bean的名称需要以’/'开头】和Controller来定义映射关系的, 根据请求路径path去查找beanName和path一致的bean【其中bean必须继承Controller并实现handleRequest方法】,然后调用handleRequest来处理请求。

  SimpleUrlHandlerMapping 是根据其mappings属性中配置的key-value来定义映射关系的,根据请求path【作为映射关系中的key】,找到对应的Controller【此时只要找到Controller就可以了,不用到具体方法,因为自定义的Controller必须继承Controller接口,并实现handleRequest方法,最后也是执行handleRequest方法】

  RequestMappingHandlerMapping 是依赖注解RequestMapping来实现path和Hander的映射关系的,具体是根据注解中的value值作为key,注解所在方法作为Handler设置映射关系,然后请求到达时则根据请求path去查找对应的Handler【具体Controller中的Method】。

  若没有做任何说明,Spring 会默认使用 BeanNameUrlHanLerMapping ,即在Spring 容器中查找与请求 URL同名的Bean。这个映射器不需要配置,根据请求的URL路径即可映射到控制器 Bean 的名称。如下代码所示:

  (2)、配置视图解析器
  DispatcherServlet 会查找到一个视图解析器,将控制器返回的逻辑视图名称装换成渲染结果的实际视图。
Spring 提供了多种视图解析器,比如:

视图解析器说明
XmlViewResolver接口 ViewResolver 的实现,从 XML 配置文件中查找视图实现(默认 XML 配置文件为 /WEB-INF/views.xml)
ResourceBundleViewResolver接口 ViewResolver 的实现,用于从 properties 文件中查找视图
UrlBasedViewResolver接口 ViewResolver 的实现,用于根据请求的 URL 路径返回相应的视图,该视图需为抽象类 AbstractUrlBasedView 的实现,它还有些子类,如 InternalResourceView 和 JstlView 等
InternalResourceViewResolverUrlBasedViewResolver 的子类,通常用于查找 JSP(类 InternalResourceView)和 JSTL(类 JstlView,InternalResourceView 的子类)等视图
VelocityViewResolver /FreeMarkerViewResolverUrlBasedViewResolver 的子类分别用于支持 Velocity(类 VelocityView)和 FreeMark 视图(类 FreeMarkerView)
ContentNegotiatingViewResolver接口 ViewResolver 的实现,用于根据请求文件的后缀名或请求的 header 中的 accept 字段查找视图

四、创建 Controller
  src 目录下创建 congtroller 包在该包中创建 Controller 类,继承org.springframework.web.servlet.mvc.AbstractController,实现 handleRequestInternal 方法就可使该类变成一个可以处理前端请求的控制器了。示例如下:

public class TestController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {

        System.out.println("你好中国!");
        //ModelAndview 对象既包含视图信息,也包含模型数据信息。index 为视图的逻辑名称。
        return new ModelAndView("index");
        
    }
}

ModelAndView 对象代表 SpringMvc 中呈现视图界面时所使用的 Model(模型数据) 和 View(逻辑视图名称)。ModelAndView 对象的作用就是封装这两个对象。返回的视图和模型是可选的,在一些情况下,模型中没有任何数据,name值返回视图即可,或者只返回模型,让 Spring 根据请求 URL 来决定视图。

五、创建 View(省略),部署运行:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击右上角运行启动tomcat
在地址栏中输入相应的 URL ,此处为 index
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述控制台也有输出内容,只是有中文乱码,解决:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  总结 Spring MVC 处理的流程
  当用户发送 URL 请求http://localhost:8080/SpringMvc_7_9_war_exploded/index 时,根据 web.xml 中对于DispatcherServlet 的配置, 该请求被 DispatcherServlet 截获,并根据 HandlerMapping 找到处理相应请求的 Controller(IndexController); Controler 处理完成后,返回 ModelAndView对象;该对象告诉 DispatcherServlet 需要通过那个视图来进行数据模型的展示, DispatcherServlet 根据视图解析器把 Controller 返回的逻辑视图名转换成真正的视图并输出,呈现给用户。

六、使用<mvc:annotation-driven/> 的一键式配置方法:

  <mvc:annotation-driven/> 是 Spring MVC 提供的一键式配置方法,配置此标签后 Spring MVC 会帮我们自动做一些注册组件之类的工作。配置此标签后,我们可以通过注解的方式,把一个 URL 映射到 Controller 上。

修改 springmvc-servlet.xml 的代码:

  <!--扫描基准包中的注解-->
    <context:component-scan base-package="controller"/>
    <!--一键式配置映射-->
    <mvc:annotation-driven/>

    <!--完成视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".html"/>
</bean>

上述代码中两个标签的作用:
<mvc:annotation-driven/>配置该标签自动注册 DefaultAnnotationHandlerMapping(处理映射器) 与 AnnotationMehodHandlerAdapter(处理适器适配器) 这两个 Bean。 Spring MVC 需要通过这两个 Bean 实例来完成对@Controller 和 @requestMapping 等注解的支持,从而找出 URL 与 handler method 的关系并予以关联。

  <context:componet-scan …/>。该标签是对包进行扫描,实现注解驱动 Bean 的定义,同时将 Bean 自动注入到容器中使用。即使标注了 SpringMVC 注解(如@Controller)的 Bean 生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值