第一个 SpringMVC 程序

151 阅读3分钟

SpringMVC

我是跟着b站狂神说的SpringMVC来进行学习的。这是我的笔记。www.bilibili.com/video/BV1aE…

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

ssm:mybatis + Spring + SpringMVC

JavaSE:认真学习。老师带,入门快。

JavaWeb:认真学习。老师带,入门快。

框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力。

以后要学的东西:CSS + HTML + JS + SpringMVC + VUE + SpringBoot + SpringCloud + LInux

需要了解的前端框架:vue、angularjs、react、

后续要从 MVC 延申的框架:MVP MVVM

什么是 MVC

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

**Model(模型):**数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

**View(视图):**负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

**Controller(控制器):**接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

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

回顾Servite

image-20220409171809812

image-20220409171855430

MVC框架要做哪些事情

  1. 将url映射到java类或java类的方法 .
  2. 封装用户提交的数据 .
  3. 处理请求--调用相关的业务处理--封装响应数据 .
  4. 将响应的数据进行渲染 . jsp / html 等表示层数据 .

什么是 SpringMVC

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

SpringMVC 优点

  • 轻量级,简单易学
  • 高效 , 基于请求响应的MVC框架。和之前的 MVC 相似。
  • 与Spring兼容性好,无缝结合
  • 约定优于配置
  • 功能强大:RESTful、数据验证、格式化、本地化、主题等
  • 简洁灵活

MVC 和 SpringMVC 的区别

原来的 MVC 可能用户需要面对多个 servlet

image-20220409174850121

当我们使用了 SpringMVC 的时候,就出现了一个 DispatcherServlet 来作为用户和 servlet 之间的中转站

它起到了 调度、请求处理、适配URL、跳转页面 的功能。

image-20220409175146616

图片

图片

第一个 SpringMVC 程序

第一步 :导入依赖

<dependencies>
    <!-- junit测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- log4j日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!--Spring-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.17</version>
    </dependency>

    <!--servlet-->
    <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>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

确保自己的项目中有spring依赖 我们的 Spring 是 SpringMVC 的基础

image-20220409193612273


第二步:将项目依赖存入 lib 目录下

image-20220409194507933

image-20220409193832205

如果没有,则在 WEB-INF 目录上右键新建 lib 目录

image-20220409193940185

image-20220409194144962

image-20220409194234809

将依赖全选即可

image-20220409194305509


第三步:配置 DispatchServlet

<?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">

    <!--
    第三步:配置 DispatchServlet
    这个是 SpringMVC 的核心。用来代替以前 Servlet 的任务进行请求转发和选择页面返回给用户的
    现在所有的请求都会走 DispatchServlet
    -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatchServlet 要绑定 Spring 的配置文件-->
        <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 中,url-pattern 有 ‘/’ 和 ‘/*’
    /:表示会匹配(响应)所有的请求,但是不会去匹配(响应) jsp 后缀的 请求。
    /*:响应所有格式 url 的请求。
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

我们可以选择先创建 Spring 配置文件或配置 DIspatchServlet。

这里的配置的 DispatchServlet 和以前学习的 MVC 中的 Servlet 的作用是一样的。


第四步:创建 Spring 配置文件

<?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">

    <!--springmvc 核心三要素-->
    <!--
    处理器映射器:用来分析 url,找到相应 url 的 bean 的 id 并返回到 DispatchServlet
    -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--
    处理器适配器:根据 DispatchServlet 给的 bean id 找到相应的 bean。
    -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>


    <!--
    视图解析器,class 是可以根据需求修改。
    识别 controller 返回的视图地址,在地址名字前后加上下面设置的前缀后缀。
    未来要学的模板引擎 Thymeleaf  Freemarker
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

图片

这一步的作用就是完成了 2、4、5、8、9、10 这几步

可以理解为这步骤起到了:

【识别 URL 内容】

【选择合适的 controller 并返回数据和要跳转的页面】

【给用户调取要跳转的页面并返回给前端】


第五步:创建 Controller 和对应的 JSP 页面

controller

package cn.hyz.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author workplace
 * @date 2022/4/9 20:09
 */
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();

        // 业务代码
        String str = "helloHYZ";
        mv.addObject("str", str);

        // 视图跳转
        mv.setViewName("test");

        return mv;
    }
}

jsp

<%--
  Created by IntelliJ IDEA.
  User: workplace
  Date: 2022/4/9
  Time: 19:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${str}
</body>
</html>

第六步:测试结果

加上框起的后缀就可以跳转到对应的页面并输出内容

image-20220410140216873

项目目录

image-20220410140400825