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 知识回顾
-
SSM:MyBatis + Spring + SpringMVC (延续了MVC三层架构思想)
-
JavaSE:认真学习,老师带,入门快
-
JavaWeb:认真学习,老师带,入门快
-
SSM框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力
-
SpringMVC + Vue - + SpringBoot + SpringCloud + Linux
-
SSM 整合:JavaWeb做项目
-
Spring:IOC(控制反转) 和 AOP(面向切面编程)
-
SpringMVC:SpringMVC的执行流程 (面试可能会问到)
-
SpringMVC:SSM框架整合!
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个字段,而前端需要用户名和密码字段的数据
- 前端:进行数据传输 (传递实体类的数据)
- Pojo:User实体类
- Vo:UserVo(用户视图对象)比如只写两个字段:用户名和密码,然后传给前端 (相当于将实体类进行了细分,本质上还是实体类对象)
- Dto:UserDto (用户数据传输对象) 数据传输目标往往是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模式的实现比较简单,适用于快速开发小规模项目
- Model1中JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的可读性非常差
Model2:
- Model2不仅提高了代码的复用率与项目的扩展性,且大大降低了项目的维护成本
- 增加了应用的扩展性和维护的难度,Model2消除了Model1的缺点
2-4 MVC和MVVM区别
MVC:M:Model (模型层) ; V:View (视图层); C:Controller (控制层)
MVVM:M:Model (模型层) ;V:View (视图层) ;VM: ViewModel(视图模型层),即双向数据绑定
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 port和JMX 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的使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!
以上是关于SpringMVC基础学习之简单回顾MVC架构和Servlet的使用的主要内容,如果未能解决你的问题,请参考以下文章