SpringMVC详解(一)概述

文章目录

  • 第一章 SpringMVC概述
    • 1.SpringMVC基本说明
    • 2. SpringMVC中的核心Servlet --DispatcherServlet
    • 3 springmvc请求的处理过程
    • 实例
      • 1. index.jsp
      • 2. other.jsp
      • 3.MyController
      • 4.StudentConroller
    • 4.复习
    • 5.web开发中配置文件的说明
      • 配置文件的加载顺序和功能
    • 6.SpringMVC内部的执行流程
      • 6.1.springmvc内部请求的处理过程

第一章 SpringMVC概述

1.SpringMVC基本说明

​ SpringMVC是基于Spring的,是Spring中的一个模块,做web开发使用的。springmvc叫做**spring web mvc **说明它是spring的核心技术,做web开发,springmvc内部使用的是mvc架构模式。

​ mybatis 是数据访问层,Spring 是 业务逻辑层 用户界面层是视图和控制器。

​ SpringMVC是一个·容器,管理对象的,使用loC核心技术。springmvc管理界面层中的控制器对象。springmvc底层也是Servlet. 以servlet为核心,接收请求,处理请求。显示处理结果给用户。

处理用户的请求:

​ 用户发起请求 ----SpringMVC ---->Spring ----MyBatis ---- mysql 数据库

2. SpringMVC中的核心Servlet --DispatcherServlet

DispatcherServlet 是框架一个 Servlet对象。 负责接收请求,响应处理结果。

DispatcherServlet 它的父类是HttpServlet。

DispatcherServlet 也叫做前端控制器(front controller)。

​ SpringMVC是管理控制器对象,原来是没有SpringMVC之前 使用 Servlet 作为控制器对象使用。现在通过SpringMVC容器创建一种叫做控制器的对象,代替Servlet行使控制器的角色。功能。

​ SpringMVC主要使用注解的方式创建。

idea2019自动生成的web.xml不支持el表达式 格式替换为


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  
web-app>

SpringMVC详解(一)概述_第1张图片
SpringMVC详解(一)概述_第2张图片

3 springmvc请求的处理过程

简单的处理过程:

用户发起请求some.do—>Tomcat接收了请求 —> DispatcherServlet ----分配MyController(doSome()返回mv对象)—显示给用户了。

省略tomcat

用户some.do-----DispatcherServlet-------MyController

多了DispatcherServlet 才能在请求中增加功能。

如果使用servlet处理请求

用户发起请求-------没有其他对象------------Servlet

PS: WEB-INF 是受保护的目录,浏览器是无法访问的。在项目中受保护页面可能非常多,可以新建子包来存储受保护的页面文件 比如包名为“jsp”

http://localhost:8080/ch01_springmvc/WEB-INF/view/show.jsp 这个网址在浏览器中不能访问

http://localhost:8080/ch01_springmvc/index.jsp 点击超链接跳转到 http://localhost:8080/ch01_springmvc/some.do展示的页面就是/WEB-INF/view/show.jsp

实例

SpringMVC详解(一)概述_第3张图片

index.jsp 中包含index.jsp 中有 some.do other.do add.do 控制器

DispatherServlet中央调度器(收集请求) 他是一个Servlet对象 有doGet doPost service() init() 将请求分派给控制器。

MyConroller控制器 对应some.do other.do

StudentController控制器 add.do

1. index.jsp

SpringMVC详解(一)概述_第4张图片

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    第一个springmvc


    发起some.do的请求
    
/test/second.do
add.do请求

2. other.jsp

SpringMVC详解(一)概述_第5张图片

​ "show.jsp"对应了controller 中的ModelAndView(视图解析器)中的 mv.setViewName(“show”);也就是说当Controller收到请求后,进行处理,处理完成跳转 show.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    show


    /WEB-INF/view/other.jsp,显示request作用域中的数据

msg数据: ${msg}

fun数据: ${fun}

3.MyController

package com.sunny.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;


 * @Controller: 创建控制器(处理器)对象
 *      控制器:叫做后端控制器 (back controller),自定义的类处理请求的。
 *      位置 : 在类的上面,表示创建此类的对象,对象放在springmvc的容器中。
 * */
@Controller
public class MyController {
//    定义方法,处理请求。

    
     * springmvc框架,使用控制器类中的方法,处理请求。
     * 方法的特点:
     * 1.方法的形参,表示请求中的参数
     * 2.方法的返回值,表示本次请求的处理结果
     * */

  
     * @RequestMapping:请求映射
     *              属性:value 请求中的uri地址,唯一值,以“/”开头。
     *              位置:1.在方法的上面(必须的) 2.在类定义的上面(可选)
     *              作用:把指定的请求,交给指定的方法处理,等同于url-pattern
     *
     *返回值 ModelAndView :表示本次请求的处理结果(数据和视图)
     *      Model:表示数据
     *      View:表示视图
     *
     * */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){  //doGet()
        System.out.println("执行了MyController的doSome方法");
//        使用这个方法处理请求。能处理请求的方法叫做控制器方法
//        调用service对象,处理请求,返回数据
        ModelAndView mv = new ModelAndView();
//        添加数据
        mv.addObject("msg","处理了some.do请求");
        mv.addObject("fun","执行了doSome方法");

//        指定视图,setViewName("视图的完整路径")
//        mv.setViewName("/WEB-INF/view/show.jsp");
//        mv.setViewName("/WEB-INF/view/other.jsp");

//        当配置了视图解析器,使用文件名称作为视图名使用,叫做视图逻辑名称。
//        使用了逻辑名称,框架使用配置文件中视图解析器的前缀和后缀,拼接为完整视图路径
//        /WEB-INF/view/   +  show   +  .jsp
        mv.setViewName("show");

//        返回结果
        return mv;

    }
 
     * 当框架调用完doSome()方法后,得到返回中ModelAndView.
     * 框架会在后续的处理逻辑值  处理mv对象里面的数据和视图。
     * 对数据执行 mv.addObject("msg","处理了some.do请求"); 把数据放入到request作用域。
     * 对视图执行forward转发操作。等同于 request.getRequestDispather("/show.jsp").forward(..)
     * */
    @RequestMapping(value = {"/other.do","/test/second.do"})
    public ModelAndView doOther(){  //doGet()
        System.out.println("执行了MyController的doSome方法");
//        使用这个方法处理请求。能处理请求的方法叫做控制器方法
//        调用service对象,处理请求,返回数据
        ModelAndView mv = new ModelAndView();
//        添加数据
        mv.addObject("msg","处理了other.do请求");
        mv.addObject("fun","执行了doOther方法");


        mv.setViewName("other");

//        返回结果
        return mv;

    }
}

4.StudentConroller

package com.sunny.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class StudentController {

    @RequestMapping(value = "/add.do")
    public ModelAndView addStudent(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","注册成功");
        mv.setViewName("show");
        return mv;
    }
}

4.复习

​ 复习:使用springmvc做web项目 首先加依赖,加入springmvc的依赖就已经把spring其他的依赖加进来了,因为springmvc就是spring的一个模块,把servlet交给了springmvc容器进行管理。这里提到了中央调度器。

DispatcherServlet作用:

​ 1.在init()中创建springmvc的容器对象 WebApplicationContext。创建springmvc配置文件种的所有java对象,java对象就是Controller对象。

​ 2.DispatcherServlet是一个Servlet,能够接收请求。

​ 用户发起some.do—DispatcherServlet(Servlet接收请求) —转给MyController

模拟中央调度器的代码。

public class DispatcherServlet extends HttpServlet{
    
    public void service(HttpServletRequest request,HttpServletResponse response){
        if("some.do".equals(request.getURI() ) ){
            //从容器中获取MyController
            MyController c = ctx.getBean("some");
            c.doSome();
        }else if("other.do".equals( request.getURI() ) ){
            OtherController c = ctx.getBean("some");
            c.doOther();
        }
    }
}

5.web开发中配置文件的说明

  1. web.xml 部署描述符文件,给服务器(tomcat)。

    ​ 作用:服务器在启动的时候,读取web.xml,根据文件的声明创建各种对象,根据文件中的声明知道请求和Servlet等对象的关系;

  2. 框架的配置文件,springmvc的配置文件

    ​ 作用:声明框架创建的项目中的各种对象,主要是创建Controller对象的。

配置文件的加载顺序和功能

​ 1.tomcat服务器启动,读取web.xml。根据web.xml文件中的说明,创建对象。


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
      <servlet-name>mywebservlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc.xmlparam-value>
        init-param>

        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
      <servlet-name>mywebservlet-name>

      <url-pattern>*.dourl-pattern>
    servlet-mapping>
web-app>

​ 创建DispatcherServlet他的对象,会执行init()方法。在init()方法中会执行springmvc容器对象创建,WebApplicationContext ctx = new ClassPathXmlApplicationContext(“classpath:springmvc.xml”);

  1. springmvc框架,new ClassPathXmlApplicationContext() 读取springmvc的配置文件。


    <context:component-scan base-package="com.bjpowernode.controller"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/view/"/>

        <property name="suffix" value=".jsp"/>
    bean>

​ 使用组件扫描器 base-package=“com.bjpowernode.controller” ,遍历controller包中的所有类,MyController类,找到这个类中的@Controller , @RequestMapping注解,就能创建MyController对象。直到some.do的请求执行doSome()方法。

​ 以上 1,2都是项目启动的过程,没有执行任何的用户请求。

3.用户发起请求some.do------>DispatcherServlet

​ DispatcherServlet 里面有WebApplicationContext。WebApplicationContext里面有MyController对象。

​ 请求some.do,DispatcherServlet 就知道 MyController处理的。

6.SpringMVC内部的执行流程

​ 这个流程对于从事开发工作或者长期使用框架的人比较好理解。对于刚学习框架的人比较难理解,但是执行流程在面试的时候可能会问。不过很少会问。

​ 有一到两年的框架使用经验后,对这个流程可能会有比较深入的理解。

6.1.springmvc内部请求的处理过程

  1. 用户发起请求给DispatcherServlet

  2. DispatcherServlet把请求(request)交给了处理器的映射器。

    处理器映射器:springmvc框架中的对象,需要实现HandleMapping接口。

    映射器的作用:从springmvc容器中,获取控制器对象(MyController),把找到的控制器和拦截器对象都放到处理器 执行链对象中,保存,并返回给中央调度器。(MyController controller = ApplicationContext.getBean() )

  3. DispatcherServlet把回去到的处理器执行链中的控制器对象,交给了处理器适配器。

    ​ 处理器适配器:是springmvc框架中的对象,实现HandlerAdapter接口。

    ​ 适配器的作用 :执行控制器的方法,也就是执行MyController.doSome()方法。得到结果ModelAndView。

  4. DispatcherServlet把控制器执行结果mv交给了视图解析器。

    ​ 视图解析器:springmvc中的对象,需要实现ViewResolver接口。

    ​ 视图解析器的作用:处理视图的,组成视图的完整路径。能创建View类型的对象。

  5. DispatcherServlet调用View类的方法,把Model中的数据放入到request作用域。执行request.setAttribute(),对视图执行forward()转发行为,request.getRequestDispather("/show.jsp").forward(request,response)

你可能感兴趣的:(Spring核心技术,java,spring,开发语言)