SpringMVC

SpringMVC一、SpringMVC概述SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的。理解成是servlet的一个升级web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让web开发方便。springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后
摘要由CSDN通过智能技术生成

SpringMVC

一、SpringMVC概述

  • SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的。理解成是servlet的一个升级
  • web开发底层是servlet , 框架是在servlet基础上面加入一些功能,让web开发方便。
  • springmvc中有一个对象是Servlet : DispatherServlet(中央调度器)
    • DispatherServlet: 负责接收用户的所有请求, 用户把请求给了DispatherServlet, 之后DispatherServlet把请求转发给Controller对象, 最后是Controller对象处理请求。
  • SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), springmvc容器中放的是控制器对象
index.jsp-----DispatherServlet(Servlet)----转发,分配给---Controller对象(@Controller注解创建的对象)
1、开发
  • 需求:用户在页面发起一个请求, 请求交给springmvc的控制器对象,并显示请求的处理结果(在结果页面显示一个欢迎语句)。

  • 步骤:

①新建web maven工程
②加入依赖
  • spring-webmvc依赖,间接把spring的依赖都加入到项目
  • jsp,servlet依赖
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                           http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.cooler</groupId>
<artifactId>ch01-hello-springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <!--servlet依赖-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
  <!--springmvc依赖-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.5.RELEASE</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <!-- 编码和编译和JDK版本 -->
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
  </plugins>
</build>
</project>
③重点: 在web.xml中注册springmvc框架的核心对象DispatcherServlet
  • DispatcherServlet叫做中央调度器, 是一个servlet, 它的父类是继承HttpServlet

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

  • DispatcherServlet负责接收用户提交的请求, 调用其它的控制器对象,并把请求的处理结果显示给用户

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    
        <!--声明,注册springmvc的核心对象DispatcherServlet
    			需要在tomcat服务器启动后,创建DispatcherServlet对象的实例。
            	因为DispatcherServlet在创建过程中,同时创建springmvc容器对象,读取springmvc的配置文件,把这个配置文件中的			  对象都创建好,当用户发起请求时就可以直接使用对象了。
    
            	servlet的初始化会执行init()方法。 
    			DispatcherServlet在init()中{
               		//创建容器,读取配置文件
              		 WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
               		//把容器对象放入到ServletContext中
               		getServletContext().setAttribute(key, ctx);
            }
    
            启动tomcat报错,读取这个文件 /WEB-INF/springmvc-servlet.xml(/WEB-INF/myweb-servlet.xml)
            springmvc创建容器对象时,读取的配置文件默认是/WEB-INF/<servlet-name>-servlet.xml .
        -->
        <servlet>
            <servlet-name>myweb</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
            <!--自定义springmvc读取的配置文件的位置-->
            <init-param>
                <!--springmvc的配置文件的位置的属性-->
                <param-name>contextConfigLocation</param-name>
                <!--指定自定义文件的位置-->
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
    
    <!--在tomcat启动后,创建Servlet对象
       load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,数值越小,tomcat创建对象的时间越早。 大于等于0的整数。
            -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>myweb</servlet-name>
            <!--
                使用框架的时候, url-pattern可以使用两种值
                1. 使用扩展名方式, 语法 *.xxxx , xxxx是自定义的扩展名。 
    				常用的方式 *.do, *.action, *.mvc等等
                    不能使用 *.jsp
    
                2.使用斜杠 "/"
            -->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>
    
④创建一个发起请求的页面 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
   <p>第一个springmvc项目</p>
   <p><a href="some.do">发起some.do的请求</a> </p>
   <p><a href="other.do">发起other.do的请求</a> </p>
</body>
</html>
⑤创建控制器(处理器)类
  • 在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中

  • 在类中的方法上面加入@RequestMapping注解。

    package com.cooler.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.RedirectView;
    
    import javax.xml.ws.RequestWrapper;
    
    /**
     *  @Controller:创建处理器对象,对象放在springmvc容器中。
     *  位置:在类的上面
     *  和Spring中讲的@Service ,@Component一样
     *
     *  能处理请求的都是控制器(处理器): MyController能处理请求,叫做后端控制器(back controller)
     *
     *  没有注解之前,需要实现各种不同的接口才能做控制器使用
     */
    @Controller
    public class MyController {
         
        /*
           处理用户提交的请求,springmvc中是使用方法来处理的。方法是自定义的, 可以有多种返回值, 多种参数,方法名称自定义
         */
    
        /**
         * 准备使用doSome方法处理some.do请求。
         * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。一个请求指定一个方法处理。
         *                  
         *       属性: 1. value 是一个String,表示请求的uri地址的(some.do)。
         *                value的值必须是唯一的, 不能重复。 在使用时,推荐地址以“/”开头
         *       位置:1.在方法的上面,常用的。
         *            2.在类的上面
         *  说明: 使用RequestMapping修饰的方法叫做处理器方法或者控制器方法。
         *  		使用@RequestMapping修饰的方法可以处理请求的,类似Servlet中的doGet, doPost
         *
         *  返回值:ModelAndView 表示本次请求的处理结果
         *   Model: 数据,请求处理完成后,要显示给用户的数据
         *   View: 视图, 比如jsp等等。
         */
        @RequestMapping(value = {
         "/some.do","/first.do"})
        public ModelAndView doSome(){
           // doGet()--service请求处理
            
            //处理some.do请求。 相当于service调用处理完成了。
            
            ModelAndView mv  = new ModelAndView();
            
            //添加数据, 框架在请求的最后把数据放入到request作用域。
            //request.setAttribute("msg","欢迎使用springmvc做web开发");
            mv.addObject("msg","欢迎使用springmvc做web开发");
            mv.addObject("fun","执行的是doSome方法");
    
            //指定视图, 指定视图的完整路径
            //框架对视图执行的forward操作, request.getRequestDispather("/show.jsp).forward(...)
            //mv.setViewName("/show.jsp");
            //mv.setViewName("/WEB-INF/view/show.jsp");
            //mv.setViewName("/WEB-INF/view/other.jsp");
    
    
            //当配置了视图解析器后,可以使用逻辑名称(文件名),指定视图
            //框架会使用视图解析器的前缀 + 逻辑名称 + 后缀 组成完成路径, 这里就是字符连接操作
            ///WEB-INF/view/ + show + .jsp
            mv.setViewName("show");
    
            //mv.setView( new RedirectView("/a.jsp"));
    
            //返回mv
            return mv;
        }
    
    
        @RequestMapping(value = {
         "/other.do","/second.do"})
        public ModelAndView doOther(){
         
            ModelAndView mv  = new ModelAndView();
            mv.addObject("msg","====欢迎使用springmvc做web开发====");
            mv.addObject("fun","执行的是doOther方法");
            mv.setViewName("other");
            return mv;
        }
    }
    
⑥创建一个作为结果的jsp,显示请求的处理结果。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
  <h3>/WEB-INF/view/show.jsp从request作用域获取数据</h3><br/>
  <h3>msg数据:${msg}</h3><br/>
  <h3>fun数据:${fun}</h3>
</body>
</html>
⑦创建springmvc的配置文件(spring的配置文件一样)
  • 声明组件扫描器, 指定@Contorller注解所在的包名

  • 声明视图解析器。帮助处理视图的。

    <?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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--声明组件扫描器-->
        <context:component-scan base-package="com.cooler.controller" />
    
        <!--声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径-->
        <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀:视图文件的路径-->
            <property name="prefix" value="/WEB-INF/view/" />
            <!--后缀:视图文件的扩展名-->
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>
    
2、springmvc请求的处理流程
  • 发起some.do
  • tomcat(web.xml–url-pattern知道 *.do的请求给DispatcherServlet)
  • DispatcherServlet(根据springmvc.xml配置知道 some.do—doSome())
  • DispatcherServlet把some.do转发给MyController.doSome()方法
  • 框架执行doSome()把得到ModelAndView进行处理, 转发到show.jsp

上面的过程简化的方式:some.do—DispatcherServlet—MyController

3、springmvc执行过程源代码分析
(1)tomcat启动,创建容器的过程
  • 通过load-on-startup标签指定的1,创建DisaptcherServlet对象
  • DisaptcherServlet它的父类是继承HttpServlet的, 它是一个serlvet, 在被创建时,会执行init()方法。
在init()方法中
//创建容器,读取配置文件
 WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
 //把容器对象放入到ServletContext中
 getServletContext().setAttribute(key, ctx);
  • 上面创建容器作用: 创建@controller注解所在的类的对象, 创建MyController对象,这个对象放入到 springmvc的容器中, 容器是map , 类似 map.put(“myController”,MyController对象)
(2)请求的处理过程
  • 执行servlet的service()
protected void service(HttpServletRequest request, HttpServletResponse response)

//再调用下面的doService
protected void doService(HttpServletRequest request, HttpServletResponse response)

//再调用下面的doDispatch
DispatcherServlet.doDispatch(request, response){

  调用MyController的.doSome()方法
  
   }
  • doDispatch:springmvc中DispatcherServlet的核心方法, 所有的请求都在这个方法中完成的。

二、SpringMVC注解式开发

1、@RequestMapping定义请求规则
(1)@RequestMapping放在类上面
  • value:所有请求地址的公共部分,叫做模块名称
@Controller
@RequestMapping("/test")
public class MyController {
   

    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
     // doGet()--service请求处理
        //处理some.do请求了。 相当于service调用处理完成了。
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc做web开发");
        mv.addObject("fun","执行的是doSome方法");
        mv.setViewName("show");
        return mv;
    }

    @RequestMapping(value = "/other.do")
    public ModelAndView doOther(){
   
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","====欢迎使用springmvc做web开发====");
        mv.addObject("fun","执行的是doOther方法");
        mv.setViewName("other");
        return mv;
    }
}
(2)指定请求方式Method属性
  • 属性: method, 表示请求的方式。 它的值RequestMethod类枚举值。例如:
    • 表示get请求方式, RequestMethod.GET
    • post方式, RequestMethod.POST
@Controller
@RequestMapping("/user")
public class MyController {
   

    //指定some.do使用get请求方式
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public ModelAndView doSome(){
     // doGet()--service请求处理
        //处理some.do请求了。 相当于service调用处理完成了。
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc做web开发");
        mv.addObject("fun","执行的是doSome方法");
        mv.setViewName("show");
        return mv;
    }


    //指定other.do是post请求方式
    @RequestMapping(value = "/other.do",method = RequestMethod.POST)
    public ModelAndView doOther(){
   
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","====欢迎使用springmvc做web开发====");
        mv.addObject("fun","执行的是doOther方法");
        mv.setViewName("other");
        return mv;
    }

    //不指定请求方式,没有限制
    @RequestMapping(value = "/first.do")
    public ModelAndView doFirst(HttpServletRequest request,
                                HttpServletResponse response,
                                HttpSession session){
   
        ModelAndView mv  = new ModelAndView();
        mv.addObject("msg","====欢迎使用springmvc做web开发====" + request.getParameter("name"));
        mv.addObject("fun","执行的是doFirst方法");
        mv.setViewName("other");
        return mv;
    }
}
2、处理器方法的参数
  • 处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。
    • HttpServletRequest
    • HttpServletResponse
    • HttpSession
    • 请求中所携带的请求参数
  • 在处理器方法形参列表中定义
(1)接收参数—逐个接收
  • 要求: 处理器(控制器)方法的形参名和请求中参数名必须一致,同名的请求参数赋值给同名的形参。
@Controller
public class MyController 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值