【零基础入门SpringMVC】第一期——开篇导论

news/2024/5/4 15:02:51/文章来源:https://blog.csdn.net/qq_61323055/article/details/127954219

一、导论

$ 什么是MVC?

  • MVC 是一种将软件按照 模型、视图、控制器来划分的一种架构思维
  • MVC全称SpringWebMVC,那么M、V、C分别代表什么呢?
    • M:Model 代表模型层,作用就是处理数据,在我们SpringMVC中,分为两种Bean

      • 第一类为实体Bean,用于我们数据存取 【pojo
      • 第二类为业务Bean,用于我们业务处理与数据访问 【dao、service
    • V: View 代表视图层,为我们提供前端页面的显示,与用户进行交互

    • C:Controller 代表控制层,负责接收请求和响应服务器【Service

在这里插入图片描述

  • MVC的工作流程:

    用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到ControllerController再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

在这里插入图片描述

$ 什么是SpringMVC?

  • 我们知道Spring分为八大模块,SpringWebMVC是其中的一个子项目
  • 三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet
  • MVC是一种设计模式,然而我们三层架构是一种架构,不要把三层架构与MVC的三部分对应上

$ SpringMVC的特点

  • 是基于MVC的轻量级框架,支持IoCAOP,完全基于注解开发
  • 基于原生的Servlet,封装了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
  • 配置 + Jar包 == 框架

二、第一个项目

  • 演示如何构建springMVC项目以及了解springMVC的执行流程

$ 开发环境

  • 此处我以我自己选择的开发环境为例
    • IDEA 2022.2.3
    • Maven 3.8.3
    • Tomcat 9.0.54
    • Spring 5.3.1

$ 创建一个新的工程

  • 我们可以使用模板创建web工程,也可以创建普通maven工程然后动手配置【此处我选择第二种】
    在这里插入图片描述
  • 修改pom.xml,添加打包方式为 war,并配置相关依赖
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu</groupId><artifactId>springMVC-demo1</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version></dependency><!-- 日志 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- ServletAPI --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- Spring5Thymeleaf整合包 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency></dependencies>
    </project>
    
  • src/main 目录下创建一个新的目录 webapp 用于我们web相关的文件
  • 然后在项目结构中去添加我们的 web.xml 文件

File >> Project Structure >> 点击我们的模块 >> Web 右侧上方加号 >> 根据提示补充路径 >> 点击应用

在这里插入图片描述

$ 配置我们的 web.xml

  • 我们知道 web.xml 一般是用来注册 Servlet 、监听器等

  • 因为我们springMVC基于原生的Servlet,为我们提供一个功能强大的前端控制器【本身就是一个Servlet】,所以我们要到web.xml中进行注册

  • 那我们为什要去注册?注册有什么用呢?

    • 因为我们浏览器不能直接去访问一个类,我们需要通过Servlet去配置一个访问路径
    • 当访问路径符合我们的匹配路径,就会被这个Servlet去处理
  • springMVC 为我们提供两种配置方式:

    • 第一种为默认配置方式:对于springMVC的配置文件的位置和命名都是固定的,很不方便

      <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
      <servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      </servlet>
      <servlet-mapping><servlet-name>springMVC</servlet-name><!--设置springMVC的核心控制器所能处理的请求的请求路径 --><url-pattern>/</url-pattern>
      </servlet-mapping>
      

      为什么此处不比配jsp文件呢?
      因为jsp文件本质就是一种Servlet,应该使用特殊的Servlet去处理,而不是我们springMVC的前端控制器
      为什么说默认配置不方便呢?
      对于上面的这个配置文件而言,我们的配置文件的位置只能为WEB-INF目录下,文件名为springMVC-servlet.xml

    • 第二种为扩展配置方式:在servlet标签中使用参数初始化子标签

      <!--我们需要通过前端控制器Dispatcher来处理所有前端的请求,因为它是一个Servlet所以需要我们在web.xml中进行注册--><servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--我们不采用默认的配置方式,因为默认的配置方式路径和配置文件命名都是固定的--><!--我们采用拓展的配置方式,在此给出初始化参数--><init-param><!--这个参数名值固定的,我们在前端控制器中已经配置好的--><param-name>contextConfigLocation</param-name><!--classpath 代表根路径,对应我们main下的java和resource--><param-value>classpath:springMVC.xml</param-value></init-param><!--我们servlet默认是在第一次被调用的时候进行加载,为了解决第一次启动的时候加载慢我们可以通过load-on-startup来提高启动优先级,也就是让服务器初始化的时候进行加载--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><!--对应映射的name要与我们上面的name一致--><servlet-name>springMVC</servlet-name><!--url的模式为 /,代表会处理所有除了.jsp结尾的请求--><url-pattern>/</url-pattern></servlet-mapping>
      

      为什么我们要提高Servlet初始化的优先级呢?
      我们知道Servlet是在第一次调用的时候进行初始化的,启动过程有很多初始化操作,这些操作如果都放到第一次访问的时候去做会影响我们的访问速度,所以我们就让服务器启动的时候执行servlet的初始化工作

$ 创建请求控制器

  • 我们前端控制器Dispatcher就是统一对前端的请求进行处理的,但是针对不同的请求处理过程可能不一致
  • 我们要实现一个控制器类,类中方法对应着不同的处理过程
  • springMVC会根据我们的预设自动进行匹配
  • 我们通过@Controller注解将控制器纳入到SpringIoC容器进行管理 【用其他注解也行,不过控制层用这个可读性高】
  • 我们需要在核心配置文件中添加注解扫描,才能让我们这个pojo类成为真正的控制器
package com.atguigu.mvc.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author Bonbons* @version 1.0*/
@Controller
public class HelloController {// 我们希望对于所有的链接 "/" 的处理走我们控制器中指定的方法,是通过@RequestMapping来完成的@RequestMapping("/") // 此处省略了value属性public String index(){/*方法名不重要,我们在前端控制器的Servlet注册配置了我们处理哪些请求然后找到我们的控制器,我们控制器的方法对应哪种处理,我们通过方法的返回值获得视图名称,然后到我们springMVC的核心配置文件中的视图解析器去解析,添加上我们的前缀和后缀 >> 就获得了我们要跳转的页面     */return "index";}@RequestMapping(value = "/target")public String toTarget(){return "target";}
}
  • 这里有几个需要注意的点:
    • 因为我们的页面在WEB-INF下,所以浏览器不能直接访问到,重定向也不行,只能通过跳转的方式
    • 对于控制器方法的命名随意,我们springMVC的核心配置文件中的视图解析器根据控制器返回值进行拼接,最后实现页面的跳转

$ 编写我们springMVC的核心配置文件

  • 我们直接将核心配置文件放到类路径下,此处就是 resource 目录下
  • 对于我们的第一个项目而言,只需要配置扫描Bean包的功能和视图解析器的功能【采用了thymeleaf框架】
<?xml version="1.0" encoding="UTF-8"?>
<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"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"><!--扫描组件--><context:component-scan base-package="com.atguigu.mvc.controller"/><!-- 配置Thymeleaf视图解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><!--优先级--><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><!--内部Bean--><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 视图后缀 --><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean></beans>

$ 编写我们的前端页面

  • index页面中给出一个超链接,可以跳转到我们的第二个页面
    • 需要使用我们 thymeleaf 的命名空间
    • 以 / 开头代表绝对路径,又分为浏览器解析的绝对路径和服务器解析的绝对路径两种【超链接由浏览器负责解析】
    • 此处的 /target 代表请求地址,请求地址与我们控制器方法@RequestMapping注解的属性值一致
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <h1>首页</h1>
    <!--th 代表使用thymeleaf去解析,使用@{}包裹属性值,识别到为绝对路径后,会自动为我们添加上下文路径-->
    <a th:href="@{/target}">HelloWorld</a><br/>
    </body>
    </html>
    
  • 我们的 target.html 是我们用来跳转的第二个页面
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><p>Hello World!</p>
    </body>
    </html>
    

$ 配置Tomcat

  • 要想将项目运行到本地web服务器上,就需要配置我们的 tomcat

Edit Configurations >>左上角加号 >> 找到Tomcat Server >> 选择我们应用的tomcat >> 选择Deployment 进行配置 【我们通常都会选择 exploded

在这里插入图片描述

  • 在我们Deployment页面下方配置上下文路径
    在这里插入图片描述
  • 修改以下两个配置
    在这里插入图片描述
  • 保存后就可以运行我们的项目了
    在这里插入图片描述
    当把光标放到我们的超链接上面,就可以在我们的状态栏里看到我们超链接的请求地址

在这里插入图片描述
点击后跳转我们的 target 页面,至此我们的第一个springMVC 项目就结束了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_224790.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自学入门(打卡十)2022-11-22

Pytest与Unittest区别 参考资料&#xff1a;https://blog.csdn.net/qq_33385691/article/details/112004487 pytest用例规则 文件名以test_.py文件和test.py 以test_开头的函数 以Test开头的类&#xff0c;test_开头的方法&#xff0c;并且不能带有__init_ 方法 所有的包pake…

​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件

​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件 有没有办法从另一个VI或可执行文件访问正在运行的LabVIEW可执行文件。例如&#xff0c;从显示控件获取值&#xff0c;为控件设置值&#xff0c;以及初始化运行LabVIEW可执行文件VI的前面板。 在正在运行的可执行文…

11.23二叉树

目录 一.笔试强训习题订正 1.选择题 2.编程题-组队竞赛 3.删除公共字符 解法1 哈希映射思想 解法2 暴力解法 解法3 substring解法replaceAll() 二.二叉树相关Oj题 1.二叉树的遍历 2.二叉树分层遍历 三.二叉树的最近公共祖先 1.思路一 2.思路2 四.将二叉搜索树转化…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

java项目测试成功后部署到服务器上的相关问题

1.java项目是如何部署给用户使用的? 前提&#xff1a; 以一个web项目为例&#xff0c; 使用工具&#xff1a;开发工具&#xff1a;IDEA&#xff1b;Tomcat&#xff08;应用服务器&#xff09;&#xff1b;Navicat&#xff08;数据库&#xff09;&#xff1b;Jenkins&#xff…

鲲鹏devkit编译调试工具——《sudoku》作业解析

《sudoku》作业解析 本次实验以sudoku项目为例介绍鲲鹏编译调试插件的基本使用方法 本次实验的步骤主要为 获取源码安装鲲鹏编译调试插件服务器配置进行代码同步配置配置测试任务进行编译调试 接下来我们先获取本次实验所需要的源码 获取源码 sudoku项目已经上传到github使…

CVPR‘15 Joint action recognition and pose estimation from video

任务&#xff1a;action recognition and pose estimation 思路&#xff1a;对动作和姿态进行统一建模&#xff0c;将动作分成姿态&#xff0c;再将姿态分成part&#xff0c;学习三种level特征&#xff0c;通过动态规划有效的推断动作标签和姿态。 方法&#xff1a;统一建模…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

Vue常用知识点汇总

1. Vue常见的指令有哪些&#xff0c;有什么用 &#xff08;1&#xff09;v-text&#xff1a; 会替换掉元素里的内容&#xff1b; &#xff08;2&#xff09;v-html&#xff1a; 可以渲染html界面&#xff1b; &#xff08;3&#xff09;v-clock&#xff1a; 防止界面闪烁&…

JavaScript开发工具WebStorm入门教程:开始运行WebStorm(一)

WebStorm是一个JavaScript开发工具&#xff0c;用于JavaScript及其相关技术编码&#xff0c;包括TypeScript、React、Vue、Angular、Node.js、HTML和样式表。就像IntelliJ IDEA和其他JetBrains ide一样&#xff0c;WebStorm让您的开发体验更愉快&#xff0c;自动化日常工作&…

7种主流数据分析软件比较及经典教材推荐

前言 STATA 软件优点&#xff1a;Stata以其简单易懂和功能强大受到初学者和高级用户的普遍欢迎。使用时可以每次只输入一个命令&#xff0c;也可以通过一个Stata程序一次输入多个命令。这样的话即使发生错误&#xff0c;也较容易找出并加以修改。尽管Stata的数据管理能力没有…

用DIV+CSS技术设计我的家乡网站(web前端网页制作课作业)南宁绿城之都

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Xshell连接不上创建的虚拟机

1.输入ip a查看是否有对应的网卡ip 更改前&#xff1a; 更改后&#xff1a; 具体看下面博客的步骤&#xff0c;这里不详细赘述 (137条消息) Linux虚拟机联网步骤&#xff08;修改网络配置信息&#xff09;_袁梦码的博客-CSDN博客_怎么让linux虚拟机联网 2.关闭防火墙 永久关…

C语言实现冒泡排序(图解)

目录 一、冒泡排序是什么&#xff1f; 二、图解冒泡排序过程 三、代码实现 3.1易错点&#xff08;切记切记&#xff09; 四、优化 4.1优化代码 一、冒泡排序是什么&#xff1f; int arr[]{9,8,7,6,5,4,3,2,1,0} &#xff0c;像这样的数组&#xff0c;升序排序。 冒泡排序…

linux 清理垃圾文件

linux的文件系统比windows的要优秀&#xff0c;不会产生碎片&#xff0c;对于长时间运行的服务器来说尤为重要&#xff0c;而且linux系统本身也不会像windows一样产生大量的垃圾文件。不知道这个说法有没有可信度!至少我们可以确定的是linux系统的文件系统是比较优秀的! linux…

使用html+css+js实现一个静态页面(含源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

MASA Framework 事件总线 - 进程内事件总线

概述 事件总线是一种事件发布/订阅结构&#xff0c;通过发布订阅模式可以解耦不同架构层级&#xff0c;同样它也可以来解决业务之间的耦合&#xff0c;它有以下优点 松耦合横切关注点可测试性事件驱动 发布订阅模式 通过下图我们可以快速了解发布订阅模式的本质 订阅者将自…

Python学习 - 异常处理

Python学习 - 语法入门&#xff1a;https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型&#xff1a;https://blog.csdn.net/wanzijy/article/details/125341568 Python学习 - 流程控制&#xff1a;https://blog.csdn.net/wanzijy/article/details…

什么是软件测试?

什么是软件测试&#xff1f; 软件测试的定义&#xff1a;在一定条件下对软件进行操作&#xff0c;发现软件的问题&#xff0c;提高软件的质量。 软件测试在开发中的有着重要地位。软件测试在各阶段的完成相应的任务&#xff0c;需求测试&#xff0c;架构测试&#xff0c;详细测…

关于windows的文件监控管理系统(Java)

目 录 摘 要 I Abstract II 1.绪论 1 1.1课题背景 1 1.2系统开发的目的和意义 2 1.3国内外概况 3 1.4研究主要内容 3 2.windows文件监控管理系统相关技术介绍 4 2.1 API 4 2.2 API HOOK 5 2.3 Java 5 2.4 DLL 6 2.4 Windows系统的Socket编程 6 2.4.1使用WinSock API 6 2.4.2 使…