• SpringMVC-1-Hello SpringMVC


    SpringMVC --> 一、Hello SpringMVC

    狂神说

    1. 回顾MVC

    1.1 什么是MVC

    • MVC:Model、View、Controller;模型、视图、控制器,是一种软件设计规范;

    • 将业务逻辑、数据、前端显示分离的方法来组织代码;

    • MVC主要作用是降低视图与业务逻辑的双向耦合;

    • MVC是一种架构模式,并不是设计模式。

    • Model模型:

      • 数据模型,提供要展示的数据,包含数据和行为,可以认为是领域模型或JavaBean组件,现在一般分离为:Value Object(数据Dao) 、服务层(行为Service)。即Model提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务;
    • View视图:

      • 负责进行模型的展示,一般是用户界面之类用户想看到的东西;
    • Controller控制器:

      • 接收用户请求,委托给Model进行处理(状态改变),处理完毕后把返回的模型数据返回给Views视图,由View负责展示,即Controller像是一个调度员。
    • 最典型的MVC就是JSP + Servlet + JavaBean模式。

    1.2 回顾Servlet

    1. 创建父工程,导入依赖

      <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.12version>
          <scope>testscope>
      dependency>
      <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          <version>5.3.10version>
      dependency>
      <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>servlet-apiartifactId>
          <version>2.5version>
      dependency>
      <dependency>
          <groupId>javax.servlet.jspgroupId>
          <artifactId>jsp-apiartifactId>
          <version>2.2version>
      dependency>
      <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>jstlartifactId>
          <version>1.2version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
    2. 创建子工程, 添加web app支持
      在这里插入图片描述

    在这里插入图片描述

    1. 编写一个Servlet类HelloServlet.java,用来处理用户的请求

      public class HelloServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //1.获取前端参数
              String method = req.getParameter("method");
              if(method.equals("add")) {
                  req.getSession().setAttribute("msg","执行了add方法");
              }
              if(method.equals("delete")) {
                  req.getSession().setAttribute("msg", "执行了delete方法");
              }
              //2.调用业务层
              //3.视图转发或重定向
              req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
          }
      
          @Override
          protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req,resp);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    2. 编写jsp跳转页面hello.jsp, 在WEB-INF目录下

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          HelloServlet
      
      
      ${msg}
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    3. web.xml中配置servlet

      
      <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>HelloServletservlet-name>
              <servlet-class>com.ano.servlet.HelloServletservlet-class>
          servlet>
          <servlet-mapping>
              <servlet-name>HelloServletservlet-name>
              <url-pattern>/hellourl-pattern>
          servlet-mapping>
      
      web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    4. 配置tomcat 启动并测试

      http://localhost:8080/hello?method=delete
      http://localhost:8080/hello?method=add
      
      • 1
      • 2

    2. 什么是SpringMVC

    2.1 概述

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

    • 查看官方文档:22. Web MVC framework (spring.io)

    • 特点:

      1. 轻量级、简单易学;
      2. 高效,基于请求响应的MVC框架;
      3. 与Spring无缝结合;
      4. 约定优于配置;
      5. 功能强大,支持RESTful、数据验证、格式化、本地化、主题等功能;
      6. 简洁灵活。
      7. 最重要的一点:用的人多。

    2.2 中心控制器

    • Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解Controller进行开发,十分简洁;

    • Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)
      在这里插入图片描述

    2.3 SpringMVC原理

    1. 原理如下图所示:

    在这里插入图片描述

    1. SpringMVC执行原理如图所示:其中实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现的部分。
      在这里插入图片描述

    2. 简单分析以下以上执行原理流程

      • DispatcherServlet代表前置控制器,是整个SpringMVC的控制中心。用户发送请求,DispatcherServlet接收请求并拦截请求;
      • HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler;
      • HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器;
      • ④ HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等;
      • HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler;
      • ⑥ Handler让具体的Controller执行;
      • ⑦ Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView;
      • ⑧ HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet;
      • ⑨ DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名;
      • ⑩ 视图解析器ViewResolver将解析的逻辑视图名传给DispatcherServlet;
      • 11 DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图View
      • 12 最终视图View呈现给用户。

    3. Hello, SpringMVC

    3.1 配置版

    1. 新建module springmvc-02-hellomvc,添加web框架支持;

    2. 确定导入了相关依赖;

    3. 配置web.xml,注册Dispatcher;

      
      <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>springmvcservlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
              
              <init-param>
                  <param-name>contextConfigLocationparam-name>
                  <param-value>classpath:springmvc-servlet.xmlparam-value>
              init-param>
              
              <load-on-startup>1load-on-startup>
          servlet>
      
          
          
          <servlet-mapping>
              <servlet-name>springmvcservlet-name>
              <url-pattern>/url-pattern>
          servlet-mapping>
      web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    4. 编写spring MVC配置文件springmvc-servlet.xml

      
      <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" id="InternalResourceViewResolver">
              
              <property name="prefix" value="/WEB-INF/jsp/"/>
              
              <property name="suffix" value=".jsp"/>
          bean>
      
      beans>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    5. 编写操作业务Controller:HelloController.java ,要么实现Controller接口,要么增加注解,需要返回一个ModelAndView,装数据,封视图;

      import org.springframework.web.servlet.ModelAndView;
      import org.springframework.web.servlet.mvc.Controller;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      public class HelloController implements Controller {
      
          @Override
          public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
              //创建ModelAndView 模型和视图
              ModelAndView mv = new ModelAndView();
              //封装对象,放在ModelAndView中
              mv.addObject("msg","HelloSpringMVC");
              //封装要跳转的视图,放在ModelAndView中
              mv.setViewName("hello");
              return mv;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
    6. 将HelloController类注册在SpringIOC容器中,在springmvc-servlet.xml中注册bean

      <bean id="/hello" class="com.ano.controller.HelloController"/>
      
      • 1
    7. 编写要跳转的页面,/WEB-INF/jsp/hello.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          helloMvc
      
      
      ${msg}
      
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    8. 配置Tomcat,启动测试!
      在这里插入图片描述

    9. 可能存在的问题:报404,可能需要在IDEA的发布项目中添加lib依赖,具体操作如下图所示:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    3.2 注解版

    1. 新建一个Moudle,并添加web支持;

    2. 由于可能存在Maven资源过滤的问题,pom.xml中完善以下配置:

      <build>
          <resources>
              <resource>
                  <directory>src/main/javadirectory>
                  <includes>
                      <include>**/*.propertiesinclude>
                      <include>**/*.xmlinclude>
                  includes>
                  <filtering>falsefiltering>
              resource>
              <resource>
                  <directory>src/main/resourcesdirectory>
                  <includes>
                      <include>**/*.propertiesinclude>
                      <include>**/*.xmlinclude>
                  includes>
                  <filtering>falsefiltering>
              resource>
          resources>
      build>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
    3. 在pom.xml中引入相关依赖,在父依赖中已经引入了;

    4. 配置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>SpringMVCservlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
              
              <init-param>
                  <param-name>contextConfigLocationparam-name>
                  <param-value>classpath:springmvc-servlet.xmlparam-value>
              init-param>
              
              <load-on-startup>1load-on-startup>
          servlet>
          
          <servlet-mapping>
              <servlet-name>SpringMVCservlet-name>
              <url-pattern>/url-pattern>
          servlet-mapping>
      web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    5. 添加Spring MVC配置文件resources/springmvc-servlet.xml

      
      <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">
      
          
          <context:component-scan base-package="com.ano.controller" />
          
          <mvc:default-servlet-handler />
          
          <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
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
    6. 创建Controller HelloController.java

      package com.ano.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      @Controller
      @RequestMapping("/HelloController")
      public class HelloController {
          /**
           * 在类上注册了@RequestMapping方法就会自动下移,实际地址:项目名称/HelloController/hello
           * @param model
           * @return
           */
          @RequestMapping("/hello")
          public String sayHello(Model model) {
              // 向Model中添加属性msg和值,在JSP页面取出并渲染
              model.addAttribute("msg","HelloSpringMVCAnnotation");
              // WEB_INF/jsp/hello.jsp
              return "hello";
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      说明:

      • @Controller 是为了让Spring IOC容器初始化的时候自动扫描到;

      • @RequestMapping 是为了映射请求路径,这里因为类和方法上都有映射,所以访问时的请求路径应该是/HelloController/hello;

      • 方法中声明的Model类型的参数是为了把Action中的数据带到视图中;

      • 方法返回的结果是视图的名称hello,加上配置文件后的前后缀就变成WEB_INF/jsp/hello.jsp。

    7. 创建视图层 WEB_INF/jsp/hello.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          helloMvcAnnotation
      
      
      ${msg}
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    8. 配置Tomcat运行 请求http://localhost:8080/HelloController/hello
      在这里插入图片描述

    9. 小结

      使用SpringMVC必须要配置的三大件:处理器映射器、处理器适配器、视图解析器

      通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可。

  • 相关阅读:
    期货开户交易要控制自己的消极情绪
    Kubernetes-in-action (二)
    OS11 - 计数器和警报的配置(2)【Davinci Cfg】
    设计模式 | 青训营笔记
    Oracle 注释详解(--、/**/、rem)
    Windows10环境下Python解析pacp文件
    基于IoT全链路实时质量 - 魔洛哥
    123.Impala查询缓慢问题与解决
    方法区(Method Area)
    模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别 + 信息抽取(UIE-X)
  • 原文地址:https://blog.csdn.net/baidu_38126306/article/details/126692155