2021-09-29 SpringMVC回顾第一天

一、回顾MVC

1. 简介

是模型、视图、控制器的简写,是一种软件设计规范

是用将显示、业务逻辑、数据分离的方法来组织代码

主要作用是降低了视图与业务逻辑间的双向耦合

最典型的MVC:JSP+Servlet+JavaBean

2. 包括

2.1 Model

模型,包括数据DAO和业务逻辑Service,

提供要展示的数据,因此包括数据和行为

2.2 View

视图JSP

2.3 Controller

控制器Servlet,接收用户请求,委托给模型进行处理,处理完毕后把模型返回的数据返回给视图,由视图负责展示

3. Model2时代

3.1 流程

  1. 用户发请求
  2. Servlet接收请求数据,并调用对应的业务逻辑方法
  3. 业务处理完毕,返回更新后的数据给Servlet
  4. Servlet跳转到jsp,由jsp来渲染页面
  5. 响应更新后的页面给前端

3.2 职责

Controller
  1. 取得表单数据
  2. 调用业务逻辑
  3. 转向指定的页面
Model
  1. 业务逻辑
  2. 保存数据的状态
View
  1. 显示页面

4. MVC框架要做的事情

  1. 将url映射到java类或java的方法
  2. 封装用户提交的数据
  3. 处理请求–调用相关的业务处理–封装响应数据
  4. 将响应的数据进行渲染

二、回顾Servlet

三、SpringMVC简介

SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架

SpringMVC的web框架围绕DispatcherServlet设计

Dispatcher的作用是将请求分发到不同的处理器,其本质也是一个Servlet,因为其顶层实现了HttpServlet

SpringMVC以请求为驱动,围绕着一个中心Servlet分派请求及提供其他功能

四、HelloSpringMVC

步骤

1. 导入相关Jar包

  1. junit
  2. springmvc
  3. jsp
  4. servlet
  5. jstl
 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2. 配置web.xml

注册DispatcherServlet

在DispatcherServlet里绑定springmvc.xml、设置启动级别

    <!--配置DispatcherServlet请求分发器 前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--要绑定Spring配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--启动级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--
    在SpringMVC中
    /:只匹配所有请求,不会去匹配jsp页面
    /*:匹配所有的请求,包括jsp页面
    如果我们在浏览器端要访问一个jsp页面,应该直接跳转到jsp页面,而不是走Servlet,因此用/
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3. 配置springmvc.xml

  1. 配置处理器映射器
  2. 配置处理器适配器
  3. 配置视图解析器
 <!--处理器映射器-->
    <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">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

4. 写Controller类

public class HelloController implements Controller
{
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        //业务
        String hello="helloSpringmvc";
        modelAndView.addObject("msg",hello);
        //跳转
        modelAndView.setViewName("hello");

        return modelAndView;
    }
}

5. 在springmvc.xml中配置controller的bean

<!--BeanNameUrlHandlerMapping 要求配置该bean,要来这里找-->
    <bean id="/hello" class="com.xk.controller.HelloController"></bean>

6. 写JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
 <body>
  ${msg}
 </body>
</html>

五、SpringMVC原理

1. 原理简述

  1. 用户发起请求,请求被前置的控制器(DispatcherServlet)拦截,根据请求参数生成代理请求

  2. 找到请求对应的实际控制器(Controller),控制器处理请求,创建数据库模型,访问数据库,将响应相应给中心控制器

  3. 控制器使用 模型 与 视图渲染 视图结果

  4. 将结果返回给中心控制器

  5. 中心控制器将结果返回给请求者

2. 执行原理

请添加图片描述

  1. 用户发出请求,DispatcherServlet接受请求,并拦截请求

    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
    该url将被拆分成三部分:
    服务器域名:http://localhost:8080
    部署在服务器上的web站点:SpringMVC
    控制器:hello
    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
    
  2. DispatcherServlet调用处理器映射器HandlerMapping,HandlerMapping根据url查找Handler

    根据: http://localhost:8080/SpringMVC/hello
    
  3. HandlerExecution表示具体的Handler,去查找控制器

    查找到的控制器为hello
    
  4. HandlerExecution将解析后的信息传递给DispatcherServlet

    解析控制器的映射,即 <bean id="/hello" class="com.xk.controller.HelloController"></bean>
    
  5. 处理器适配器HandlerAdapter根据特定的规则去执行Handler

  6. Handler让具体的Controller执行

    让实现了Controller接口的HelloController类中,实现Controller接口方法的方法执行
    
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView

    modelAndView.addObject("msg",hello);
    //跳转
    modelAndView.setViewName("hello");
    
  8. HandlerAdapter将视图逻辑名或模型传给DispatcherServlet

  9. DispatcherServlet用视图解析器ViewResolver来解析HandlerAdapter传给DispatcherServlet的视图逻辑名

    解析结果=prefix+视图逻辑名+suffix
    
    即视图逻辑名:hello,解析结果:/WEB-INF/jsp/hello.jsp
    
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>
     </bean>
    
  10. ViewResolver将解析结果传回给DispatcherServlet

  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图

  12. 最终视图呈现给用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值