关于spring-mvc:SpringMVC学习记录

2次阅读

共计 19211 个字符,预计需要花费 49 分钟才能阅读完成。

回顾 MVC

什么是 MVC

  • MVC 是模型 (Model)、视图(View)、控制器(Controller) 的简写,是一种软件设计规范。
  • 是将业务逻辑、数据、显示拆散的办法来组织代码。
  • MVC 次要作用是 升高了视图与业务逻辑间的双向偶合
  • MVC 不是一种设计模式,MVC 是一种架构模式。当然不同的 MVC 存在差别。

Model(模型):数据模型,提供要展现的数据,因而蕴含数据和行为,能够认为是畛域模型或 JavaBean 组件(蕴含数据和行为),不过当初个别都拆散开来:Value Object(数据 Dao)和 服务层(行为 Service)。也就是模型提供了模型数据查问和模型数据的状态更新等性能,包含数据和业务。

View(视图):负责进行模型的展现,个别就是咱们见到的用户界面,客户想看到的货色。

Controller(控制器):接管用户申请,委托给模型进行解决(状态扭转),处理完毕后把返回的模型数据返回给视图,由视图负责展现。也就是说控制器做了个调度员的工作。

最典型的 MVC 就是 JSP + servlet + javabean 的模式。

Model1 时代

  • 在 web 晚期的开发中,通常采纳的都是 Model1。
  • Model1 中,次要分为两层,视图层和模型层。

Model1 长处:架构简略,比拟适宜小型我的项目开发;

Model1 毛病:JSP 职责不繁多,职责过重,不便于保护;

Model2 时代

Model2 把一个我的项目分成三局部,包含 视图、管制、模型。

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

职责剖析

Controller:控制器
  1. 获得表单数据
  2. 调用业务逻辑
  3. 转向指定的页面
Model:模型
  1. 业务逻辑
  2. 保留数据的状态
View:视图
  1. 就一个 显示页面

Model2 这样不仅进步的代码的复用率与我的项目的扩展性,且大大降低了我的项目的保护老本。Model 1 模式的实现比较简单,实用于疾速开发小规模我的项目,Model1 中 JSP 页面身兼 View 和 Controller 两种角色,将管制逻辑和体现逻辑混淆在一起,从而导致代码的重用性非常低,减少了利用的扩展性和保护的难度。Model2 打消了 Model1 的毛病。

MVC 框架要做哪些事件

  1. 将 url 映射到 java 类或 java 类的办法 .
  2. 封装用户提交的数据 .
  3. 解决申请 – 调用相干的业务解决 – 封装响应数据 .
  4. 将响应的数据进行渲染 . jsp / html 等表示层数据 .

常见的服务器端 MVC 框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常见前端 MVC 框架:vue、angularjs、react、backbone;由 MVC 演化出了另外一些模式如:MVP、MVVM 等等 ….

回顾 Servlet

  1. 新建一个 Maven 工程 springMVC 当做父我的项目,而后新建一个 maven 子项目springMVC01-servlet,勾选模版maven-archetype-webapp
  2. 编写 pom.xml 配置文件

    <?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>xyz.rtx3090</groupId>
      <artifactId>SpringMVC-Review01</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>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-api</artifactId>
          <version>5.7.0</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
      
    </project>
  3. 替换 SpringMVC-Review/SpringMVC-Review01/src/main/webapp/WEB-INF/web.xml 为如下内容

    <?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">
    
    
    </web-app>
  4. SpringMVC-Review/SpringMVC-Review01/src/main/webapp/WEB-INF 目录下新建 jsp 目录,而后在 jsp 目录下新建 hello.jsp 文件

    <%--
      Created by IntelliJ IDEA.
      User: bernardo
      Date: 2021/6/30
      Time: 10:33
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>helloSpringMVC</title>
    </head>
    <body>
    <%-- 从 Java 程序中取数据 --%>
    ${msg}
    </body>
    </html>
  5. 欠缺我的项目目录构造,如图所示

  6. 编写一个 Servlet 类HelloSpringMVC,用来解决用户的申请

    package xyz.rtx3090.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class HelloSpringMVC extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 获取办法名
            String method = req.getParameter("method");
            // 依据不同的办法名设置不同的属性值
            if(method.equals("add")) {req.getSession().setAttribute("msg","执行了 add 办法");
            } else if (method.equals("delete")) {req.getSession().setAttribute("msg","执行了 delete 办法");
            } else {req.getSession().setAttribute("msg","执行了其余未知办法");
            }
    
            // 业务逻辑代码(临时咱们不须要写)// 视图跳转
            req.getRequestDispatcher("WEB-INF/jsp/hello.jsp").forward(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);
        }
    }
  7. 在 web.xml 配置文件中注册咱们后面写的 HelloServet 类

    <?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">
    
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>xyz.rtx3090.servlet.HelloSpringMVC</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/helloServlet</url-pattern>
        </servlet-mapping>
    </web-app>
  8. 配置 Idea 中的 Tomcat 服务器,并在浏览器输出上面地址,启动测试

    • http://localhost:8080/tomcat 配置的工程门路 /helloServlet?method=add

    • http://localhost:8080/tomcat 配置的工程门路 /helloServlet?method=delete

SpringMVC 概述

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

查看官网文档:https://docs.spring.io/spring…

咱们为什么要学习 SpringMVC 呢?

Spring MVC 的特点:

  1. 轻量级,简略易学
  2. 高效 , 基于申请响应的 MVC 框架
  3. 与 Spring 兼容性好,无缝联合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简洁灵便

Spring 的 web 框架围绕DispatcherServlet [调度 Servlet] 设计。

DispatcherServlet 的作用是将申请散发到不同的处理器。从 Spring 2.5 开始,应用 Java 5 或者以上版本的用户能够采纳基于注解模式进行开发,非常简洁;

正因为 SpringMVC 好 , 简略 , 便捷 , 易学 , 天生和 Spring 无缝集成(应用 SpringIoC 和 Aop) , 应用约定优于配置 . 可能进行简略的 junit 测试 . 反对 Restful 格调 . 异样解决 , 本地化 , 国际化 , 数据验证 , 类型转换 , 拦截器 等等 …… 所以咱们要学习 .

最重要的一点还是用的人多 , 应用的公司多 .

SpringMVC 核心控制器

Spring 的 web 框架围绕 DispatcherServlet 设计。DispatcherServlet 的作用是将申请散发到不同的处理器。从 Spring 2.5 开始,应用 Java 5 或者以上版本的用户能够采纳基于注解的 controller 申明形式。

Spring MVC 框架像许多其余 MVC 框架一样, 以申请为驱动 , 围绕一个核心 Servlet 分派申请及提供其余性能DispatcherServlet 是一个理论的 Servlet (它继承自 HttpServlet 基类)

SpringMVC 的原理如下图所示:

当发动申请时被前置的控制器拦挡到申请,依据申请参数生成代理申请,找到申请对应的理论控制器,控制器解决申请,创立数据模型,拜访数据库,将模型响应给核心控制器,控制器应用模型与视图渲染视图后果,将后果返回给核心控制器,再将后果返回给请求者。

SpringMVC 执行原理

图为 SpringMVC 的一个较完整的流程图,实线示意 SpringMVC 框架提供的技术,不须要开发者实现,虚线示意须要开发者实现。

简要剖析执行流程

  1. DispatcherServlet 示意前置控制器,是整个 SpringMVC 的控制中心。用户发出请求,DispatcherServlet 接管申请并拦挡申请。

    咱们假如申请的 url 为 : http://localhost:8080/SpringM…

** 如上 url 拆分成三局部:**

http://localhost:8080 服务器域名

SpringMVC 部署在服务器上的 web 站点

hello 示意控制器

通过剖析,如上 url 示意为:申请位于服务器 localhost:8080 上的 SpringMVC 站点的 hello 控制器。

  1. HandlerMapping 为处理器映射。DispatcherServlet 调用 HandlerMapping,HandlerMapping 依据申请 url 查找 Handler。
  2. HandlerExecution 示意具体的 Handler, 其次要作用是依据 url 查找控制器,如上 url 被查找控制器为:hello。
  3. HandlerExecution 将解析后的信息传递给 DispatcherServlet, 如解析控制器映射等。
  4. HandlerAdapter 示意处理器适配器,其依照特定的规定去执行 Handler。
  5. Handler 让具体的 Controller 执行。
  6. Controller 将具体的执行信息返回给 HandlerAdapter, 如 ModelAndView。
  7. HandlerAdapter 将视图逻辑名或模型传递给 DispatcherServlet。
  8. DispatcherServlet 调用视图解析器 (ViewResolver) 来解析 HandlerAdapter 传递的逻辑视图名。
  9. 视图解析器将解析的逻辑视图名传给 DispatcherServlet。
  10. DispatcherServlet 依据视图解析器解析的视图后果,调用具体的视图。
  11. 最终视图出现给用户。

在这里先听一遍原理,不了解没有关系,咱们马上来写一个对应的代码实现大家就明确了,如果不明确,那就写 10 遍,没有笨人,只有懒人!

第一个 springMVC 程序(配置版)

  1. 首先创立一个带 webapp 模版的 Maven 我的项目

  2. 手动创立文件夹,复原至规范的 maven 我的项目构造

  3. WEB-INF 创立 jsp 目录,而后在其下创立 first.jsp 文件

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>first</title>
    </head>
    <body>
    
    </body>
    </html>
  4. 编写 pom.xml 文件,解决配置我的项目须要的 Jar 包依赖问题

    <?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>xyz.rtx3090</groupId>
      <artifactId>SpringMVC-Review02</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>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
    
    </project>
  5. main->resource 目录下创立并编写 SpringMVC 配置文件,文件名与上面 web.xml 配置的 关联 springMVC 文件中的 classpath:绝对应springMVC-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 解决映射器 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <!-- 处理器适配器 -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
  6. 配置 web.xml 文件(留神删除原来的束缚头,采纳这个束缚 4.0 版的

    <?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">
    
        <!-- 注册 DispatcherServlet-->
        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 关联 springMVC 配置文件 -->
            <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>
        <!--/ 匹配所有的申请;(不包含.jsp)-->
        <!--/* 匹配所有的申请;(包含.jsp)-->
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
  7. 创立编写实现 Controller 接口的 FirstController 类

    package xyz.rtx3090.controller;
    import ...
    
    public class FirstController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {ModelAndView modelAndView = new ModelAndView();
    
            // 封装对象
            modelAndView.addObject("msg","Hello,world");
            // 封装视图
            modelAndView.setViewName("first");// 用于进行拼接,组成文件名
    
            return modelAndView;
        }
    }
  8. 将 FirstController 类配置到 SpringMVC 配置文件 springMVC-servlet.xml

        <!-- 将 Controller 类注册到 springIOC 容器中 -->
        <bean id="/first" class="xyz.rtx3090.controller.FirstController"/>
  9. first.jsp 中,取出 FirstController 类中存入的数据对象

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>first</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
  10. 肯定要重新配置 Tomcat,为其新的我的项目从新增加一个组件页面
  11. 在浏览器地址栏中追加输出/first,启动测试(留神配置 tomcat 抉择组件时,不要抉择带 exploded 的,不然启动不了)

第一个 springMVC 程序(注解版)

  1. 首先创立一个带 webapp 模版的 Maven 我的项目

  2. 手动创立文件夹,复原至规范的 maven 我的项目构造

  3. WEB-INF 创立 jsp 目录,而后在其下创立 first.jsp 文件

  4. 编写 pom.xml 文件,解决配置我的项目须要的 Jar 包依赖问题

    <?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>xyz.rtx3090</groupId>
      <artifactId>SpringMVC-Review03</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>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
    
    </project>
  5. 创立并编写 FirstController 类

    package xyz.rtx3090.Controller;
    import ...
    
    @Controller
    @RequestMapping("FirstController") // 这个也能够不写
    public class HelloController {
    
        // 映射拜访门路, 实在拜访地址 : 我的项目名 /FirstController/hello
        @RequestMapping("one")
        public String index(Model model) {
            // 向模型中增加属性 msg 与值,能够在 JSP 页面中取出并渲染
            model.addAttribute("msg","Hello, Controller");
            // 返回视图地位 //web-inf/jsp/hello.jsp
            return "hello";// 用于进行拼接,组成文件名
        }
    
        // 映射拜访门路, 实在拜访地址 : 我的项目名 /FirstController/hello
        @RequestMapping("two")
        public String tomcat(Model model) {
            // 向模型中增加属性 msg 与值,能够在 JSP 页面中取出并渲染
            model.addAttribute("msg","严老板都是个垃圾,是个垃圾~");
            // 返回视图地位 //web-inf/jsp/hello.jsp
            return "hello";// 与上一个映射的办法返回的值统一,指向同一个视图
        }
    }
    • @Controller 是为了让 Spring IOC 容器初始化时主动扫描到;
    • @RequestMapping 是为了映射申请门路,这里因为类与办法上都有映射所以拜访时应该是 /HelloController/hello;
    • 办法中申明 Model 类型的参数是为了把 Action 中的数据带到视图中;
    • 办法返回的后果是视图的名称 hello,加上配置文件中的前后缀变成 WEB-INF/jsp/first.jsp。
  6. 创立并编写 springMVC 配置文件springMVC-servlet(文件名称与上面 web.xml 中关联 springmvc 配置文件的 classpath 统一)

    <?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"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    
        <!-- 主动扫描包,让指定包下的注解失效, 由 IOC 容器对立治理 -->
        <context:component-scan base-package="xyz.rtx3090.Controller"/>
        <!-- 让 Spring MVC 不解决动态资源 -->
        <mvc:default-servlet-handler/>
        <!--
       反对 mvc 注解驱动
           在 spring 中个别采纳 @RequestMapping 注解来实现映射关系
           要想使 @RequestMapping 注解失效
           必须向上下文中注册 DefaultAnnotationHandlerMapping
           和一个 AnnotationMethodHandlerAdapter 实例
           这两个实例别离在类级别和办法级别解决。而 annotation-driven 配置帮忙咱们主动实现上述两个实例的注入。-->
        <mvc:annotation-driven/>
    
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    1. 在视图解析器中咱们把所有的视图都寄存在 /WEB-INF/ 目录下,这样能够保障视图平安,因为这个目录下的文件,客户端不能间接拜访。
      • 让 IOC 的注解失效
      • 动态资源过滤:HTML . JS . CSS . 图片,视频 …..
      • MVC 的注解驱动
      • 配置视图解析器
  7. 配置 web.xml 文件(留神删除原来的束缚头,采纳这个束缚 4.0 版的

    <?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">
    
      <!-- 注册 DispatcherServlet-->
      <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 通过初始化参数指定 SpringMVC 配置文件的地位,进行关联 -->
        <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>
      <!-- 所有申请都会被 springmvc 拦挡 -->
      <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    </web-app>
    • / 和 /* 的区别:< url-pattern > / </ url-pattern > 不会匹配到.jsp,只针对咱们编写的申请;即:.jsp 不会进入 spring 的 DispatcherServlet 类。< url-pattern > / </ url-pattern > 会匹配 .jsp,会呈现返回 jsp 视图 时再次进入 spring 的 DispatcherServlet 类,导致找不到对应的 controller 所以报 404 错。
      • 留神 web.xml 版本问题,要最新版!
      • 注册 DispatcherServlet
      • 关联 SpringMVC 的配置文件
      • 启动级别为 1
      • 映射门路为 /【不要用 /*,会 404】
  8. first.jsp 中,取出 FirstController 类中存入的数据对象

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>first</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
  9. 配置 Tomcat,在浏览器地址栏中追加输出

    • /FirstController/one
    • /FirstController/two

    咱们能够看到,尽管这个两个地址是被咱们设置的指向同一个视图,然而显示的页面内容却不同!

    咱们很多网站的页面复用,都是大略这个复用的。

小结

实现步骤其实十分的简略:

  1. 新建一个 web 我的项目
  2. 导入相干 jar 包
  3. 编写 web.xml , 注册 DispatcherServlet
  4. 编写 springmvc 配置文件
  5. 接下来就是去创立对应的管制类 , controller
  6. 最初欠缺前端视图和 controller 之间的对应
  7. 测试运行调试.

应用 springMVC 必须配置的三大件:

处理器映射器、处理器适配器、视图解析器

通常,咱们只须要 手动配置视图解析器 ,而 处理器映射器 处理器适配器 只须要开启 注解驱动 即可,而省去了大段的 xml 配置

Controller 控制器

Controller 概述

  • 控制器简单提供拜访应用程序的行为,通常通过接口定义或注解定义两种办法实现。
  • 控制器负责解析用户的申请并将其转换为一个模型。
  • 在 Spring MVC 中一个控制器类能够蕴含多个办法
  • 在 Spring MVC 中,对于 Controller 的配置形式有很多种
// 实现该接口的类取得控制器性能
public interface Controller {
   // 解决申请且返回一个模型与视图对象
   ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

通过源码咱们能够看到 Controller 是一个接口,在 org.springframework.web.servlet.mvc 包下,接口中只有一个办法;

Controller 实现(配置版)

同上 第一个 springMVC 程序(配置版)

Controller 实现(注解版)

同上 第一个 springMVC 程序(注解版)

@RequestMapping

概述

  • @RequestMapping 注解用于映射 url 到控制器类或一个特定的处理程序办法。可用于类或办法上。用于类上,示意类中的所有响应申请的办法都是以该地址作为父门路。
  • 为了测试论断更加精确,咱们能够加上一个我的项目名测试 myweb

只注解在办法下面

@Controller
public class TestController {@RequestMapping("/h1")
   public String test(){return "test";}
}
// 拜访门路:http://localhost:8080 / 我的项目名 / h1

同时注解类与办法

@Controller
@RequestMapping("/admin")
public class TestController {@RequestMapping("/h1")
   public String test(){return "test";}
}
// 拜访门路:http://localhost:8080 / 我的项目名 / admin /h1  , 须要先指定类的门路再指定办法的门路;

RestFul 格调

概述

Restful 就是一个资源定位及资源操作的格调。不是规范也不是协定,只是一种格调。基于这个格调设计的软件能够更简洁,更有档次,更易于实现缓存等机制。

性能

资源:互联网所有的事物都能够被形象为资源

资源操作:应用 POST、DELETE、PUT、GET,应用不同办法对资源进行操作。

别离对应 增加、删除、批改、查问。

传统形式操作资源

过不同的参数来实现不同的成果!办法繁多,post 和 get

​ http://127.0.0.1/item/queryIt… 查问,GET

​ http://127.0.0.1/item/saveIte… 新增,POST

​ http://127.0.0.1/item/updateI… 更新,POST

​ http://127.0.0.1/item/deleteI… 删除,GET 或 POST

应用 RESTful 操作资源

能够通过不同的申请形式来实现不同的成果!如下:申请地址一样,然而性能能够不同!

​ http://127.0.0.1/item/1 查问,GET

​ http://127.0.0.1/item 新增,POST

​ http://127.0.0.1/item 更新,PUT

​ http://127.0.0.1/item/1 删除,DELETE

代码测试

  1. 拷贝 第一个 springMVC 程序(注解版)我的项目代码
  2. 在其中的 Controller 类中减少上面办法

    @RequestMapping("three/{x}/{y}")
    public String restFul(@PathVariable int x, @PathVariable int y, Model model) {
        int result = x + y;
        //Spring MVC 会主动实例化一个 Model 对象用于向视图中传值
        model.addAttribute("msg","后果:" + result);
        // 返回视图地位
        return "hello";
    }
  3. 配置 tomcat,在浏览器中输出localhost:8080/ 工程名 / 类映射 /three/1/2,查看页面显示后果

  4. 咱们来批改下对应的参数类型,再次测试

    @RequestMapping("four/{x}/{y}")
    public String restFul02(@PathVariable int x, @PathVariable String y, Model model) {
        //Spring MVC 会主动实例化一个 Model 对象用于向视图中传值
        model.addAttribute("msg","后果:"+ x + y);
        // 返回视图地位
        return "hello";
    }

应用 method 属性指定申请类型

用于束缚申请的类型,能够收窄申请范畴。指定申请谓词的类型如 GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE 等

  1. 咱们来减少一个办法进行测试

    @RequestMapping(value = "five", method = {RequestMethod.POST})
    public String restFul03(Model model) {model.addAttribute("msg","我是诺手狗!");
        return "hello";
    }
  2. 咱们应用浏览器地址栏进行拜访默认是 Get 申请,会报错 405:
  1. 如果将 POST 批改为 GET 则失常了

        @RequestMapping(value = "five", method = {RequestMethod.GET})
        public String restFul03(Model model) {model.addAttribute("msg","我是诺手狗!");
            return "hello";
        }

小结

Spring MVC 的 @RequestMapping 注解可能解决 HTTP 申请的办法, 比方 GET, PUT, POST, DELETE 以及 PATCH。

所有的地址栏申请默认都会是 HTTP GET 类型的。

办法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一个组合注解,平时应用的会比拟多!

它所表演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

思考

应用门路变量有什么益处?

  • 使门路变得更加简洁;
  • 取得参数更加不便,框架会主动进行类型转换。
  • 通过门路变量的类型能够束缚拜访参数,如果类型不一样,则拜访不到对应的申请办法,如这里拜访是的门路是 /commit/1/a,则门路与办法不匹配,而不会是参数转换失败。

后果跳转形式

ModelAndView

设置 ModelAndView 对象 , 依据 view 的名称 , 和视图解析器跳到指定的页面 .

页面 : {视图解析器前缀} + viewName +{视图解析器后缀}

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
     id="internalResourceViewResolver">
   <!-- 前缀 -->
   <property name="prefix" value="/WEB-INF/jsp/" />
   <!-- 后缀 -->
   <property name="suffix" value=".jsp" />
</bean>

对应的 controller 类

public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       // 返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}

ServletAPI

通过设置 ServletAPI , 不须要视图解析器 .

1、通过 HttpServletResponse 进行输入

2、通过 HttpServletResponse 实现重定向

3、通过 HttpServletResponse 实现转发

正文完
 0