SpringMVC

学习来源于狂神说,欢迎大家去看看

Web on Servlet Stack (spring.io)

简介

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

Servlet简单回顾

  1. 编写servlet类去继承HttpServlet

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
    }
    }
  2. 在web.xml去引入该servlet

    1
    2
    3
    4
    <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>
  3. 对该servlet进行路径映射

    1
    2
    3
    4
    <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    第一个MVC程序

-> SpringMVC02

  1. 在pom中导入所需的依赖

    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
    38
    39
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.22</version>
    </dependency>
    <dependency>
    <groupId>jakarta.servlet.jsp</groupId>
    <artifactId>jakarta.servlet.jsp-api</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</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>
  2. 编写控制器controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
    * todo 编写一个类实现Controller接口
    */
    public class HelloControl implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    //todo 创建模型和视图
    ModelAndView mv = new ModelAndView();
    //todo 封装要跳转的视图,放在ModelAndView,也就是要访问的页面,在下面会进行前缀后缀也就是完整路径的配置
    mv.setViewName("hello");
    //todo 封装对象,放在ModelAndView中
    mv.addObject("msg", "HelloSpringMVC");
    return mv;
    }
    }
  3. 创建springmvc-servlet.xml进行bean配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!--1. 处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--2. 处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--todo 3. 视图解析器:DispatcherServlet给他的ModelAndView-->
    <!-- 1. 获取ModelAndView的数据
    2. 解析ModelAndView的视图名字
    3. 拼接视图名字,找到对应的视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
    </bean>

    <!--因为我们是使用的BeanNameUrl 的处理器 所以就要配置一个这个,将编写的controller实现类注入-->
    <bean id="/hello" class="com.example.HelloControl"/>
  4. 在web.xml将第二步的servlet配置引入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!--todo 配置DispatchServlet:这个是SpringMVC的核心:请求分发器、前端控制器-->
    <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--todo 配置文件-->
    <!--说明context是在哪-->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--运行级别 1 就是和服务器一起运行-->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <!--/ 匹配所有的请求;(不包括.jsp)-->
    <!--/* 匹配所有的请求;(包括.jsp)-->
    <url-pattern>/</url-pattern>
    </servlet-mapping>
  5. 在测试的时候要注意:tomcat10用不了只能用tomcat9

重点:SpringMVC执行原理_破晓.K的博客-CSDN博客

使用注解开发SpringMVC

-> SpringMVC03

  1. 与第一个mvc程序的区别为可以省去处理器映射器和处理器转发器的编写,使用注解引擎去自动装载上述两个转发器,视图解析器保留不变

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!--todo 1. 自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
    <context:component-scan base-package="com.example.controller"/>
    <mvc:default-servlet-handler/>
    <!--todo 2. 开启注解引擎,会自动转载处理器适配器和处理器映射器-->
    <mvc:annotation-driven/>

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

  3. 编写Controller实现类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.example.controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;

    /*todo 注解方式开发: Control为控制器*/
    @Controller //代表该类会被Spring接管
    public class HelloControl {
    /*RequestMapping为请求URL*/
    @RequestMapping("/hello")
    public String hello(Model model) {
    model.addAttribute("msg", "helloSpringMVCAnnotation");
    return "hello";
    }
    }

    Controller

-> SpringMVC04

RestFul

-> SpringMVC04

资源定位和资源操作风格,互联网所有事物都可被抽象成风格

特点:

  1. 简洁
  2. 高效
  3. 安全

小黄鸭调试法

书:程序员修炼手册

重定向和转发

-> SpringMVC04

接收请求参数和数据回显

-> SpringMVC04

解决乱码问题

-> SpringMVC04

JSON

-> SpringMVC05

工具:

  1. jackson

  2. fastjson

    image-20220828100309826

使用步骤

  1. 导包
  2. 配置解决乱码问题
  3. 书写代码

SSM整合

SSM整合狂神版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE DATABASE ssmbuild;
USE ssmbuild;
CREATE TABLE `books`(
`bookID` INT NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID`(`bookID`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');

遇到问题操作步骤:

  1. 查看这个bean注入是否成功!
  2. Junit 单元测试,看我们的代码是否能够查询出来结果!
  3. 问题,一定不在我们的底层,是spring出了问题!
  4. springMVC, 整合的时候没调用到我们的service层的bean;
    1. applicationContext. xml没有注入bean
    2. web. xml中,我们也绑定过配置文件!发现问题,我们配置的是Spring -mvc . xml,这里面确实没有service bean,所以报空指针

狂神说SpringMVC05:整合SSM框架 - 爵岚 - 博客园 (cnblogs.com)

AJAX

-> SpringMVC06

前端请移步

  1. AJAX笔记 | Dong (gitee.io)
  2. 八、axios学习 | Dong (gitee.io)

拦截器

-> SpringMVC07

文件上传

未实践

Maven Repository: commons-fileupload » commons-fileupload » 1.4 (mvnrepository.com)

image-20220831091545135

image-20220831091551425

image-20220831091600326