SpringMVC基础学习之简单回顾MVC架构和Servlet的使用

Posted 狂奔の蜗牛rz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC基础学习之简单回顾MVC架构和Servlet的使用相关的知识,希望对你有一定的参考价值。

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。

这个SpringMVC基础学习系列是用来记录我学习SpringMVC框架基础知识的全过程 (这个系列是参照B站狂神的SpringMVC最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)


之后我将尽量以两天一更的速度更新这个系列,还没有学习SpringMVC框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧,加油吧,编程人!

今天我们来到了SpringMVC基础学习的第一站:简单回顾MVC架构和Servlet的使用。废话不多说,让我们开始今天的学习内容吧。

1.Spring MVC 学习

1.1 知识回顾

  • SSMMyBatis + Spring + SpringMVC (延续了MVC三层架构思想)

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

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

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

  • SpringMVC + Vue - + SpringBoot + SpringCloud + Linux

  • SSM 整合:JavaWeb做项目

  • SpringIOC(控制反转) 和 AOP(面向切面编程)

  • SpringMVCSpringMVC的执行流程 (面试可能会问到)

  • SpringMVCSSM框架整合

1.2 简单回顾MVC架构

1.2.1 什么是MVC?

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

简单来说,所谓MVC就是Model 模型(包括Pojo、Dao和Service,即数据和业务)+ View 视图(JSP/html,展示数据)+ Controller 控制器(Servle,获取请求和返回响应)

1.2.2 了解MVC各层

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

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

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

  • Dao和Service
  • Servlet:转发和重定向
  • JSP/HTML

最典型的MVC就是JSP + Servlet + JavaBean的模式

1.2.3 MVC执行流程图

1.2.4 知识扩充

例如有个User实体类:该实体类有用户名,密码,生日,爱好 … 等20个字段,而前端需要用户名和密码字段的数据

  • 前端:进行数据传输 (传递实体类的数据)
  • PojoUser实体类
  • VoUserVo(用户视图对象)比如只写两个字段:用户名和密码,然后传给前端 (相当于将实体类进行了细分,本质上还是实体类对象)
  • DtoUserDto (用户数据传输对象) 数据传输目标往往是Dao(数据访问对象)从数据库中检索数据

1.2.5 Model模型的发展

1.简单了解Model1时代

1-1 Model1基本概念
  • 在web早期的开发中,通常采用的都是Model1,而在Model1中,主要分为两层,视图层模型层

1-2 Model1的优缺点

Model1优点:架构简单,只有模型层视图层,比较适合小型项目开发

Model1缺点JSP职责不单一,相当于即担任控制层,又担任视图层不便于维护

注意::JSP本质上就是一个Servlet

2.简单了解Model2时代

2-1 Model2基本概念

Model2把一个项目分成三部分,包括视图控制模型

职责分析

Controller控制器

  • 取得表单数据
  • 调用业务逻辑
  • 转向指定的页面

Model模型

  • 业务逻辑
  • 保存数据的状态

View视图

  • 显示页面
2-2 Model2与Model1区别

Model1

  • Model1模式实现比较简单,适用于快速开发小规模项目
  • Model1JSP页面身兼ViewController两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的可读性非常差

Model2

  • Model2不仅提高了代码的复用率项目的扩展性,且大大降低了项目的维护成本
  • 增加了应用的扩展性维护的难度Model2消除了Model1的缺点
2-4 MVC和MVVM区别

MVCMModel (模型层) ; VView (视图层); CController (控制层)

MVVMMModel (模型层) ;VView (视图层) ;VMViewModel(视图模型层),即双向数据绑定

3.知识扩充

面试常见问题

你的项目的架构是设计好的,还是演进的?

项目架构是演进的,因为没有任何一个项目可以一开始就设计很好的架构,底层架构都是在不断的进行演变的,包括像阿里这样的大公司也不例外

  • Alibaba 刚开始使用php,一般用于个人页面网站,但是当并发量成百上千万时就会存在问题了
  • 随着用户数量增加,无奈转向Java
  • 王坚 提出要去IOE,即不使用IBM和Orcale的企业软件服务,然后就是使用mysql数据库
  • MySQL:MySQL是一个开源小巧,可拔插,组件化的数据库,SQL底层其实还有一层架构,阿里经过修改,将MySQL更新为了AliSQL以及AliRedis
  • All in one —> 微服务

1.3 简单回顾Servlet

1.3.1 搭建基本环境

1.创建项目工程和导入资源依赖

1-1 创建Maven项目
  • 创建一个普通的Maven项目,其他都不需要勾选

1-2 导入资源依赖
  • 在项目的pom.xml配置文件中导入相关的资源依赖
<!-- 导入相应的资源依赖 -->
<dependencies>
    <!-- spring-webmvc资源依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.4.RELEASE</version>
    </dependency>
    <!-- servlet-api资源依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <!-- jsp-api资源依赖 -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <!-- jstl资源依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <!-- junit单元测试资源依赖 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

1-3 删除父项目的src文件

2.创建子项目和导入资源依赖

2-1 创建Module子项目
  • 右击父工程名字,点击【New】新建,然后选择【Module】模块

2-2 创建普通Maven项目
  • 与父工程相同,子模块还是选择创建一个普通的Maven项目,不用勾选任何选项,然后给子项目起名字就可以了

2-3 导入资源依赖
  • 子项目的pom.xml配置文件中引入相关的资源jar包
<dependencies>
    <!--servlet-api资源依赖-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <!--jsp-api资源依赖-->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
</dependencies>

3.解决src目录下的java文件变灰问题

2-1 查看src文件目录下的java文件
  • 点开src文件目录下的main文件,发现main文件下的java文件是灰色的

2-2 添加项目支持
  • 右击项目名称,选择【Add Framework Support…】,即添加项目支持

2-3 勾选Web Application
  • 进入【Add Framework Support…】界面,接着勾选JavaEE目录下的【Web Application】

2-4 再次查看src文件下的java文件
  • 再次查看src文件目录下的main文件,发现main文件下的java文件已经变为蓝色了,然后也添加了web文件夹,并且web文件上有个蓝点

1.3.2 编写控制层Servlet和web.xml配置文件

1.编写控制层HelloServlet

  • src目录下的main文件下的java文件下,创建一个com.kuang.cotoller包,来存放控制层的HelloServlet类
package com.kuang.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 HelloServlet extends HttpServlet {
    
    /**
     * 1.重写doGet方法
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        /**
         * 1.1 获取前端参数
         */
        String method =req.getParameter("method");
        // 判断调用的请求是add方法还是delete方法
        if(method.equals("add")) {
            // 执行add方法
            req.getSession().setAttribute("msg","执行了add方法");
        }
        if(method.equals("delete")) {
            // 执行delete方法
            req.getSession().setAttribute("msg","执行了delete方法");
        }
        
       /**
        * 1.2 调用业务层
        * 为了省事, 具体的业务逻辑就不写了
        */
        
        /**
         * 1.3 视图转或者重定向
         */
        // 1.3.1 使用转发请求
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
        // 1.3.2 或者使用重定向
//        resp.sendRedirect();
    }
    
    /**
     * 2.重写doPost方法
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    
}

2.编写web.xml配置文件

  • 找到web目录下的WEB-INF文件下的web.xml配置文件,进行servlet以及映射的相关配置
<?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">
    <!-- 1.配置servlet -->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
    </servlet>
    <!-- 2.配置servlet-mapping -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <!-- 请求hello的页面,然后会自动转发给hello的servlet来处理 -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <!-- 3.配置session -->
   <session-config>
        <!-- 设置超时时间,超过15分钟就自动关闭会话 -->
        <session-timeout>15</session-timeout>
    </session-config>
    <!-- 4.配置欢迎页面 -->
    <welcome-file-list>
         <!-- 默认欢迎页面设置为index.jsp -->
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

1.3.3 编写视图层JSP页面

  • web文件夹下的WEB-INF文件下,创建一个jsp文件夹,用来存放视图层的相关页面文件

1.编写test.jsp测试页面

  • 用来展示Servlet调用方法后的信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

2.编写form.jsp表单页面

  • 用来进行提交数据信息表单页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/hello" method="post">
    <input type="text" name="method"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

1.3.4 配置TomCat服务器

1-1 编辑配置信息
  • 点击IDEA编译器左上方的工具栏图形一行,找到那个锤子图标的后面,点击选择【Add Configurations】,因为我已经配置过了,所以这里显示的是【Edit Configurations】

1-2 添加Tomcat服务器
  • 点击左上角的“+”号,即添加新配置,找到选项中的【Tomcat Server】即Tomcat服务器,然后选择【Local】,即使用本地的Tomcat

1-3 配置Tomcat服务器信息
  • 添加本地的Tomcat服务器后,接着进行Tomcat服务器的相关信息配置,找到【Server】下的【Application server】,点击后面的【Configure…】

  • 然后进行【Tomcat Home】的信息配置,找到本地的Tomcat文件位置,然后IDEA会进行自动识别Tomcat版本信息

  • 再次回到【Server】页面后,会发现HTTP portJMX port已经自动匹配了,Tomcat默认端口号正常情况下是8080,但这里本地的Tomcat服务器端口号被我修改了,所以显示是8888

1-4 设置发布项目信息
  • 【Deployment】下点击右侧的“+”号,选择【Artifact…】

  • 然后添加发布项目信息,最后点击右下角的【Apply】应用此配置

1.3.5 测试结果

1.启动Tomcat服务器

2.打开默认页面

  • 启动Tomcat服务器后,会自动跳转到默认的index.jsp欢迎页面

3.调用add方法

  • 原本默认的URL链接后面加上hello?method=add后,即http://localhost:8888/springmvc_01_servlet_war_exploded/hello?method=add,会跳转到test.jsp页面,然后页面会显示调用对应方法的信息

4.调用delete方法

  • 原本默认的URL链接后面加上hello?method=delete,即http://localhost:8888/springmvc_01_servlet_war_exploded/hello?method=delete,会跳转到test.jsp页面,然后页面会显示调用对应方法的信息


好了,今天的有关 简单回顾MVC架构和Servlet的使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!


参考视频链接【狂神说Java】SpringMVC最新教程IDEA版通俗易懂

以上是关于SpringMVC基础学习之简单回顾MVC架构和Servlet的使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC总结帖

菜菜菜鸟学习之JavaWeb 入门1(自己的学习理解,不对之处请大神们多多指教啊)

Python学习之——Socket套接字(TCP连接)

PHP实例学习之————MVC架构模式分析与设计

php学习之bbs论坛项目-web架构和MVC思想

程序猿的日常——SpringMVC系统架构与流程回顾