MVC架构

        M:model,数据模型(JavaBean,业务等)

        V:View,展示给用户的试图,也就是页面,视图中会对Model层的数据进行对应的处理        

        C:Controller,控制器,用于处理请求,打包数据模型,转发、跳转视图,也就是Servlet

Spring-MVC,基于Java实现的Web框架,本质上为Servlet

特点

  • 轻量级,部署快
  • 基于请求与响应实现(Servlet的核心内容)
  • 约定优于配置,也就是说按照官方提供的格式进行编码即可,否则容易出错

DispatcherServlet

Spring-MVC的核心处理器,中心控制器,此控制器接管所有请求与响应的处理

配置

 web.xml中配置DispatcherServlet,接管所有的请求

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
        <!--添加spring的配置文件-->
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 表示容器在启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 所有URL都经过此Servlet -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

请求映射配置中/ 与 /* 的区别

        /  :会匹配所有的请求,但是不会解析jsp页面,也就是说xxx.jsp不会被解析

        /* :会匹配所有请求与页面,当xxx.jsp被解析时,最后视图返回效果就变为了x/x/xxx.jsp.jsp

Springmvc-Servlet.xml

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


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"                         id="internalResourceViewResolver">
        <!--请求Url的前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--请求Url的后缀-->
        <property name="suffix" value=".jsp"/>
</bean>

BeanNameUrlHandlerMapping:映射处理器,将请求映射到对应的处理器中

SimpleControllerHandlerAdapter:处理器适配器,将请求适配到对应的处理器,并执行service()

InternalResourceViewResolver:视图解析器,解析所有请求中的视图名称,并查找对应的资源,将数据模型打包分发

编写Controller层

所有的公共配置完成后,接着来处理对应的控制器

public class DemoController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "A B C D");
        mv.setViewName("hello");
        return mv;
    }
}

Controller接口:Spring提供的控制层接口,用于处理请求,核心对象ModelAndView

配置映射:<bean id="/hello" class="xx/xx/DemoController"/>

接着在对应的页面中获取由后台返回的数据即可

常见问题

        404:可能是由于IDEA的项目部署中,没用引入tomcat对应的jar文件所导致

        页面正常调整,但无法获取到msg的变量信息:原因是JSP和Servlet的版本导致EL表达式功能关闭,在JSP页面上添加<%@page isELIgnored="false"%>即可;

Spring-MVC执行原理

1,客户端发送请求到服务器(url)

2,请求通过web.xml中的配置,转接到DispatcherServlet

3,DispatcherServlet会将此请求交由映射器HandlerMapping,映射器会根据请求返回此请求映射的对象

4,映射器将返回到DispatcherServlet,返回的映射器会交由适配器HandlerAdapter

5,适配器HandlerAdapter会映射适配到对应的Controller进行请求处理

6,Controller连接、执行业务,封装数据模型,Controller最后返回一个ModelAndView对象

7,在ModelAndView封装了处理请求后的资源,Model和View,最终转接到DispatcherServlet

8,DispatcherServlet拿到返回的ModelAndView对象之后,通过视图解析器VIewResolver,解析ModelAndView中对应的资源路径名称,返回DispatcherServlet

——注:在Spring MVC允许多个ViewResolve存在,但InternalResourceViewResolver永远在最后一个

9、最终DispatcherServlet会根据解析的视图结果,返回对应的资源页面给客户端

注解开发

        1、配置DispatcherServlet,作为MVC的核心,中心控制器必不可少,所有的请求都会经过此控制器

        2、Spring配置文件中配置

     <context:component-scan base-package="com.zou.controller"/>
     <mvc:default-servlet-handler/>
     <mvc:annotation-driven/>
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/jsp/"/>
         <property name="suffix" value=".jsp"/>
     </bean>

                2.1开启注解扫描配置

                2.2开始静态资源过滤,.css  .html等

                2.3开启自动映射器配置,为所有的请求处理装配映射器(HandlerMapping、HandlerAdapter)

                2.4默认视图解析器配置,通过视图解析器解析Controller中返回的视图资源结果

        3、基本的配置完成后,进行Controller的编写

                @Controller:标注在作为控制器的类上,注册此类为控制器

                ——控制器中的定义请求的处理方法,返回值为string,返回资源名称

                @RequestMapping:可以标注在类中和方法中

                        标注在方法时,代表直系请求,/method

                        标注在类上时,为此类中所有的方法级别请求加上请求路径前缀/class/method

@Controller
//@RequestMapping("/t")
public class TestController {

    @RequestMapping("/today")
    public String today(Model model) {
        model.addAttribute("msg", "Hello 2022");
        return "today";
    }
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐