【SpringMVC】工作流程及入门案例

目录

    前言                                                                                            

    回顾MVC三层架构                                                                               

    1. SpringMVC简介                                                                        

    1.1 SpringMVC的特点                                                                              

    1.2 SpringMVC核心组件                                                                           

    1.3 SpringMVC工作流程                                                                           

    2. SpringMVC入门案例                                                                 

    2.1 添加pom.xml依赖 

    2.2 创建spring-mvc.xml 

    2.3 配置web.xml 

    2.4 编写处理器类 

    2.5 编写hello.jsp 

    2.6 运行测试 

    2.7 静态资源处理 


    前言                                                                                            

        Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。主要是用来进行Web开发,是对Servlet进行了封装,也可以理解为是Servlet的加强版。

    回顾MVC三层架构                                                                               

学习SpringMVC之前我们先来回顾下自定义MVC框架思想:

一个自定义MVC框架的基本工作流程如下:

  1. 用户通过视图与应用程序交互,视图将用户的请求传递给控制器。
  2. 控制器接收用户请求,根据请求的类型和内容决定调用哪个模型处理请求,并根据处理结果决定需要更新哪个视图。
  3. 模型处理请求的过程中可能需要与数据库或其他数据源进行交互,获取所需数据并进行相应的处理。处理完成后,将结果返回给控制器。
  4. 控制器根据模型的处理结果,决定更新哪个视图以展示结果给用户。
  5. 视图接收到控制器的指令后,根据要展示的内容进行相应的处理和渲染,最终将结果呈现给用户。

 

        在自定义MVC中每个请求都需要写一个Servlet,显然是不方便了。SpringMVC的工作流程与此差不多,controller可以处理多个请求,并对请求进行分发,执行不同的业务操作,对它进行了加强让开发更加便捷。

    SpringMVC简介                                                                        

        Spring MVC(Model-View-Controller)是一个基于Java的Web应用程序框架,它是Spring框架的一部分。Spring MVC提供了一个简单、灵活且强大的模型,用于构建Web应用程序,它遵循MVC设计模式。这个模式有助于将应用程序的表示层、业务逻辑层和数据访问层分离,使得开发更加模块化和易于维护。

    SpringMVC的特点                                                                              

        Spring MVC的核心原则是分离关注点,将应用程序的不同方面分离开来,以便更好地管理和维护代码。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分来实现这一目标。

  1. 模型(Model):模型代表应用程序的数据和业务逻辑。它可以是一个POJO(Plain Old Java Object)或一个持久化实体类。模型负责处理数据的读取、存储和验证,并提供数据给视图进行展示。

  2. 视图(View):视图负责展示模型中的数据给用户。它可以是一个JSP(JavaServer Pages)、HTML页面或其他模板引擎生成的页面。视图通常是根据模型的数据来动态生成的,以便将数据呈现给用户。

  3. 控制器(Controller):控制器负责处理用户请求并协调模型和视图之间的交互。它接收用户的请求,调用适当的模型处理数据,并选择合适的视图来展示结果。控制器还可以处理表单验证、异常处理和其他与请求相关的逻辑。

    SpringMVC核心组件                                                                           

Spring MVC框架提供了一组核心组件来实现这种模型-视图-控制器的架构。其中包括:

  1. DispatcherServlet:它是Spring MVC的前端控制器,负责接收所有的HTTP请求并将其分发给适当的处理程序。

  2. HandlerMapping:它负责将请求映射到适当的处理程序(控制器)。

  3. Controller:它是处理程序的接口,负责处理用户请求并返回适当的模型和视图。

  4. ViewResolver:它负责将逻辑视图名称解析为实际的视图对象。

  5. View:它负责将模型数据渲染为最终的响应结果,可以是JSP、HTML页面或其他类型的视图。

        除了这些核心组件,Spring MVC还提供了许多其他功能,如数据绑定、表单处理、文件上传、拦截器、国际化支持等,以帮助开发人员更轻松地构建Web应用程序。

 

    SpringMVC工作流程                                                                           

  1. 用户发来一个请求,首先进入的是前端控制器DispatcherServlet
  2. 前端控制器(DispacherServlet)将用户发来的请求发送给处理器映射器(HandlerMapping)
  3. 处理器映射器根据前端控制器发来的用户的请求找到对应符合的控制器(Handler),并且将其封装成处理器执行链,返回给前端控制器。
  4. 处理器适配器接收到来自前端控制器的执行链后,找到对应执行此执行链的处理器适配器(HandlerAdapter)来调用的具体的控制器(就是说其对应的方法或者逻辑)
  5. 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller(处理业务逻辑)
  6. 控制器执行完成后,会返回一个ModelAndView对象给处理器适配器
  7. 处理器适配器将返回来的ModelAndView对象返回给前端控制器(到这里所有的业务处理过程就要完了,接下就是将结果以页面的的形式响应给用户)
  8. 前端控制器将返回回来的ModelAndView对象交给视图解析器(ViewResolver),视图解析器根据传过来的View对象解析成对应的页面对象
  9. ViewResolver 将封装好的将页面对象和Model对象返回给 DIspatcherServlet
  10. 前端控制器再将返回回来的对象交给视图(View)
  11. 视图根据传过来的Model对象再一次的对页面进行渲染(将模型数据填充至视图中),然后在返回给前端控制器。
  12. 前端控制器将完成的结果响应给浏览器,然后浏览器在展现给用户。

 

    SpringMVC入门案例                                                                 

    添加pom.xml依赖 

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>mybatis_spring</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>mybatis_spring Maven Webapp</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version><!--添加jar包依赖--><!--1.spring 5.0.2.RELEASE相关--><spring.version>5.0.2.RELEASE</spring.version><!-- jstl+standard --><jstl.version>1.2</jstl.version><standard.version>1.1.2</standard.version><!-- spring --><spring.version>5.0.2.RELEASE</spring.version></properties><dependencies><!--1.spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- spring mvc相关依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>${standard.version}</version></dependency></dependencies><build><finalName>mybatis_spring</finalName></build>
</project>

缺少jstl+standard的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,那是因为org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包。

    创建spring-mvc.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--1) 扫描com.zking.zf及子子孙孙包下的控制器(扫描范围过大,耗时)--><context:component-scan base-package="com.ycxw"/><!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --><mvc:annotation-driven/><!--3) 创建ViewResolver视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar --><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!--4) 单独处理图片、样式、js等资源 --><!-- <mvc:resources location="/css/" mapping="/css/**"/><mvc:resources location="/js/" mapping="/js/**"/><mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
</beans>

解释:

这段代码是一个Spring MVC应用程序的XML配置文件。它用于配置Spring MVC的一些基本设置,包括组件扫描、注解驱动、视图解析器和静态资源处理。下面是对这段代码的逐行解释:

  1. <context:component-scan base-package="com.ycxw"/>:启用组件扫描,让Spring自动扫描指定包(在这里是com.ycxw)及其子包中的所有类,识别并注册带有特定注解(如@Controller@Service等)的类为Spring容器中的bean。

  2. <mvc:annotation-driven/>:启用Spring MVC的注解驱动功能,让Spring MVC自动注册默认的处理器映射(DefaultAnnotationHandlerMapping)和处理器适配器(AnnotationMethodHandlerAdapter),以支持基于注解的控制器方法。

  3. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:定义一个视图解析器(InternalResourceViewResolver)的bean,用于将控制器返回的逻辑视图名解析为实际的视图资源(如JSP文件)。

  4. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView">:设置视图解析器的viewClass属性,指定使用JstlView类来处理JSTL标签。

  5. <property name="prefix" value="/WEB-INF/jsp/"/>:设置视图解析器的prefix属性,指定视图资源(如JSP文件)的前缀路径。

  6. <property name="suffix" value=".jsp"/>:设置视图解析器的suffix属性,指定视图资源(如JSP文件)的后缀。

  7. <!--4) 单独处理图片、样式、js等资源 -->:这是一个注释,说明接下来的配置是用于处理静态资源。

  8. <!-- <mvc:resources location="/css/" mapping="/css/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/css/开头的请求映射到/css/目录下的静态资源(如CSS文件)。

  9. <!-- <mvc:resources location="/js/" mapping="/js/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/js/开头的请求映射到/js/目录下的静态资源(如JavaScript文件)。

  10. <!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>:这是一个注释掉的配置,如果启用,它会将请求路径以/images/开头的请求映射到WEB-INF/images/目录下的静态资源(如图片文件)。

        总之,这段代码配置了一个基本的Spring MVC应用程序,包括组件扫描、注解驱动、视图解析器和静态资源处理。

    配置web.xml 

配置步骤:

  1. 配置Spring与Web项目集成
  2. 配置中文乱码过滤器
  3. 配置SpringMVC核心控制器DispatcherServlet
<?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_3_1.xsd"version="3.1"><display-name>Archetype Created Web Application</display-name><!-- Spring和web项目集成start --><!-- spring上下文配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param><!-- 读取Spring上下文的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring和web项目集成end --><!-- 中文乱码处理 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- Spring MVC servlet --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><!--web.xml 3.0的新特性,是否支持异步--><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

    编写处理器类 

package com.ycxw.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-09-04 20:11*/
@Controller
public class HelloController {@RequestMapping(value="/hello")public String hello(){System.out.println("调用了hello方法...");return null;}
}
  1. @Controller使用@Controller注解标记这个类是一个Spring MVC控制器。这个注解告诉Spring框架,这个类将处理HTTP请求。

  2. @RequestMapping(value="/hello")使用@RequestMapping注解映射一个HTTP请求路径(在这里是/hello)到控制器的一个方法(在这里是hello()方法)。当用户访问/hello路径时,hello()方法将被调用。

    编写hello.jsp 

在spring-mvc.xml文件已配置ViewResolver视图解析器

    运行测试 

 

    静态资源处理 

所有文件都会被spring-mvc.xml配置文件进行拦截,所以要添加配置,让处理器扫描扫该资源

<mvc:resources location="/static/" mapping="/static/**"/>

 如路径:

运行测试: 

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

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

相关文章

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

C语言:选择+编程(每日一练Day15)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;寻找奇数 思路一&#xff1a; 题二&#xff1a;寻找峰值 思路一&#xff1a; 本人实力有限可能对一些地方解…

【python爬虫】14.Scrapy框架讲解

文章目录 前言Scrapy是什么Scrapy的结构Scrapy的工作原理 Scrapy的用法明确目标与分析过程代码实现——创建项目代码实现——编辑爬虫代码实现——定义数据代码实操——设置代码实操——运行 复习 前言 前两关&#xff0c;我们学习了能提升爬虫速度的进阶知识——协程&#xf…

第二张微服务的调用与注册

文章目录 工程导入利用RestTemplate调用服务需求创建RestTemplate的实例到Spring容器使用RestTemplate发送请求消费者和提供者 Eureka注册中心服务远程调用会出现的问题Eureka的结构和作用Eureka的配置过程搭建注册中心服务注册服务发现 Ribbon负载均衡负载均衡原理源码跟踪总结…

linux kvm网桥br简单理解和持久化配置

linux网桥简单理解和持久化配置 文章目录 前言一、Linux 网桥是什么&#xff1f;二、网桥主要作用三、网桥配置命令及安装(CentOS系统) 1 网桥配置命令2.持久化网桥配置 前言 linux bridge是网络虚拟化中非常重要的一种设备&#xff0c;今天就来学习下linux bridge的相关知…

android studio cmake生成.a文件(静态库)及调用(c c++)静态库.a

第一步生成静态库.a文件&#xff1a; cmake 语法如何生成静态库&#xff0c;就不介绍了&#xff0c;比较简单&#xff0c;我下文列出的参考资料里面有详细介绍。 add_library(${CMAKE_PROJECT_NAME} STATICsrc/CalculStatic.cpp)这一步有坑&#xff0c;我刚开始的时候&#x…

视频监控/视频汇聚/视频云存储EasyCVR平台HLS流集成在小程序无法播放问题排查

安防视频/视频云存储/视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频…

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS DMIPS&#xff08;Dhrystone Million Instructions Per Second&#xff09;&#xff1a; DMIPS用于衡量计算机系统的整体指令执行性能&#xff0c;通常关注整数操作。它基于Dhrystone基准测试来计算&#xff0c;该测试主要包含整数运…

centOS下载与安装

1 下载centOS镜像 The CentOS Project 选择阿里云的镜像 2 下载虚拟机 Vmware workstation VMware - Delivering a Digital Foundation For Businesses 1 下载安装 centOs是一个操作系统&#xff0c;操作硬件的。所以需要有机器&#xff0c;可以使用虚拟机。 2 创建新的虚…

cocosCreator2.4.x 打包 ios ,xcode问题记录

Q&#xff1a;Uncaught ReferenceError: CC_PHYSICS_BUILTIN is not defined A&#xff1a;先clean build folder....&#xff0c;然后重新build Q&#xff1a;xcode 使用模拟器预览 报错 In /Library/Developer/Xcode/DerivedData/hello_world-djnvsdcqyfoqvdepilidvunfunto…

Sentinel配置的blockHandler方法不生效

①首先配置流控的资源名跟SentinelResource中的Value配置的一定要一直且唯一 ②其次blockhandler后面的方法一定要跟下面指定的方法名称是一样的 ③也就是我犯下的错误&#xff0c;一定要注意是上面那个才是Sentinel的&#xff0c;下面的是sun公司的…我说呢&#xff0c;一直…

LLM大模型推理加速 vLLM

参考&#xff1a; https://github.com/vllm-project/vllm https://zhuanlan.zhihu.com/p/645732302 https://vllm.readthedocs.io/en/latest/getting_started/quickstart.html ##文档 加速原理&#xff1a; PagedAttention&#xff0c;主要是利用kv缓存 使用&#xff1a; #…

springboot整合elasticsearch

matchAllQuery查询 BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create("http://43.139.59.28:9200")));}AfterEachvoid tearDown() throws IOException {this.client.close();} Testvoid testMatchAll() throws IOE…

【Yolov5+Deepsort】训练自己的数据集(3)| 目标检测追踪 | 轨迹绘制 | 报错分析解决

&#x1f4e2;前言&#xff1a;本篇是关于如何使用YoloV5Deepsort训练自己的数据集&#xff0c;从而实现目标检测与目标追踪&#xff0c;并绘制出物体的运动轨迹。本章讲解的为第三部分内容&#xff1a;数据集的制作、Deepsort模型的训练以及动物运动轨迹的绘制。本文中用到的数…

解决微信小程序recycle-view使用百分比单位控制宽高时出现的内容溢出问题

recycle-view是微信小程序官方推出的一个经过优化的长列表组件&#xff0c;但是在使用百分比单位控制高宽时有个内容溢出问题&#xff0c;虽然它提供了height和width的参数可以设置宽高&#xff0c;但每次写列表都需要去js里获取宽高并设置是较为麻烦的&#xff0c;所以现在来着…

WordPress Page Builder KingComposer 2.9.6 Open Redirection

WordPress Page Builder KingComposer 2.9.6 Open Redirection WordPress 插件 KingComposer 版本2.9.6 以及以前版本受到开放重定向漏洞的影响。该漏洞在packetstorm网站披露于2023年7月24日&#xff0c;除了该漏洞&#xff0c;该版本的插件还存在XSS攻击的漏洞风险 图1.来自…

LeetCode(力扣)77. 组合Python

LeetCode77. 组合 题目链接代码 题目链接 https://leetcode.cn/problems/combinations/description/ 代码 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:result []return self.backtracking(n, k, 1, [], result)def backtracking(self, n, k…

Java Web3J :使用web3j监听、查询、订阅智能合约的事件

前面有文章写如何使用Docker-compose方式部署blockscout浏览器+charts图表,区块链浏览器已经部署成功了,同时我们在链上增加了治理投票流程,如何实时的把治理事件快速同步到浏览器呢?这时就想到了Web3J来监听智能合约的事件,来达到同步事件的效果 目录 Web3J简介功能简介m…

用迅为RK3568开发板使用OpenCV处理图像颜色通道提取ROI

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\07”目录下&#xff0c;如下图所示&#xff1a; 在计算机的色彩图像中存有三个通道&#xff0c;即 BGR 通道&#xff0c;根据三个颜色通道的亮度值来显示出不同的颜色&…

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验

低价又好用的护眼台灯是多数人的需求&#xff0c;很多人只追求功能性护眼台灯&#xff0c;显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到&#xff0c;然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯&#xff0c;拥有高品质光源&#xff…