Java课题笔记~ SpringMVC概述
1.1 SpringMVC简介
SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,在Spring3.0 后发布的。
1.2 SpringMVC的优点
-
基于MVC 架构
基于 MVC 架构,功能分工明确。解耦合。
-
容易理解,上手快,使用简单
就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的特定的接口和类。
-
作为Spring框架一部分,能够使用Spring的IOC和AOP
方便整合Strtus,MyBatis,Hiberate,JPA 等其他框架。
4. SpringMVC 强化注解的使用
在Controller, Service, Dao 都可以使用注解。方便灵活。使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service,在Service 类中注入 Dao。
5.可适配性好
可适配性好,通过HandlerAdapter就可以支持任意一个类作为处理器。
1.3 SpringMVC优化的方向
1.4 SpringMVC执行的流程
执行流程说明:
1) 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
2) DispatcherServlet 根据<servlet-name>中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3) DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。
4) 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。
在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
5) Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。
6) 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
7) ViewResolver 结合Model和View,来渲染视图。
8) 视图负责将渲染结果返回给客户端
1.5 基于XML的SpringMVC程序
项目案例功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息,采用传统的配置式开发方式。
创建步骤:
1)新建maven_web项目
2)添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope> <!--切记要加scope,否则tomcat插件启动时会报错-->
</dependency>
3)删除web.xml文件重新添加,因为自动生成的web.xml文件版本太低了。
4)在web.xml中配置DispatcherServlet核心控制器,url-pattern设置为"/"表示, 客户端发出的所有请求都会被DispatcherServlet核心控制器(中央调度器)拦截, DispatcherServlet再交给springmvc.xml进行处理,springmvc.xml接下来会 为客户端的url请求找到对应的控制器Controller类进行处理。
如果<url-pattern>*.do</url-pattern>,则表示拦截以“.do”结尾的URL请求。
中央调度器的全限定性类名在导入的 Jar 文件 spring-webmvc-x.x.x.RELEASE.jar 的第一个包org.springframework.web.servlet下可找到。
<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
<param-value>classpath:springmvc.xml</param-value>表示从类路径下加载SpringMVC的配置文件。
<init-param>节点是可选项,可以省略。
问题来了,Spring拦截所有的请求后,下一步交给谁进行解释呢,即到哪里找Spring MVC配置文件呢?答案是应用程序在启动时会默认到WEB-INF目录下查找命名格式为“ServletName-servlet.xml”的MVC配置文件。
其中ServletName应与web.xml中的<servlet-name>中的一致。
此外核心配置器还可选用<load-on-startup>1</load-on-startup>表示Servlet容器在服务器启动时立即加载。如果没有这条配置,则表示应用程序在第一个Servlet请求时加载该Servlet。
5)编写一个Controller类
在com.foxbill.controller包下,新建一个FirstController,实现Controller接口。
public class FirstController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView();mav.addObject("hello","Hello My First SpringMVC!");mav.setViewName("main");return mav;}
}
FirstController -->控制器(相当于以前的servlet)
类中的方法的作用:创建一个ModelAndView对象,在对象中添加一个名叫“hello”的字符串对象,并设置逻辑视图为main。这个逻辑视图本身还不是完整的视图路径,将在下述有关步骤(视图解析器)进一步解释为完整路径。
此方法意味着程序将携带hello对象数据,跳转到名为main的逻辑视图。
6)完成springmvc.xml文件的配置。在工程的类路径即resources目录下创建 SpringMVC 的配置文件 springmvc.xml。该文件名可以任意命名。推荐使用springmvc.xml.
<?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"><!--1.配置处理器映射器,确定一种请求-相应的映射规则--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean><!--2.配置处理器适配器,配置对处理器的handleRequest()方法的调用--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean><!--3.配置自定义控制器,一条具体的映射关系,name对应客户端URL请求,class对应服务端响应程序--><bean name="/first" class="com.foxbill.controller.FirstController" /><!--上述类型的1.处理器映射器是默认的,同样上述类型的2.处理器适配器也是默认的,两者均可省略不要--><!--4.配置视图解析器--><!--说明:视图解析器不是必须的,如果没有,则控制层的返回值需要从"main"改为"/WEB-INF/jsp/main.jsp",即必须写完整路径的视图名称。--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>
(1)配置处理器映射器。
创建一种类型为BeanNameUrlHandlerMapping的处理器映射器,即定义一种“请求/响应”映射规则,客户端的URL请求如果跟某一个Bean的name属性匹配,则由该Bean的class属性指定的控制器Controller类进行响应处理。
(2)配置处理器适配器
创建一种处理器适配器,类型为SimpleControllerHandlerAdapter,用于对上述指定的控制器Controller类的handleRequest()方法的调用与执行。
(3)配置自定义控制器
定义一条具体的“请求/响应”映射关系,表示假如客户端发出的URL请求的是/first,则指定由服务端的com.foxbill.controller.FirstController来处理,通过这行代码确定了一条具体的“请求/响应”映射关系,是一对一的对应关系,即name属性对应客户端URL请求,class对应服务端响应程序。
【注意:这个Bean的配置要有效,前提是要配置类型为BeanNameUrlHandlerMapping的映射器和类型为SimpleControllerHandlerAdapter的适配器,它们相当于制定了一个规则,如乒乓球比赛的“男女混合双打”,而自定义控制器则是这个规则下的具体某某男和某某女进行配对,进行混合双打。】
(4)配置视图解析器
视图解析器用来解析控制器返回的逻辑视图的真实路径,这样更方便,易于扩展。
视图解析器不是必须的,如果没有,则控制层的返回值需要从"main"改为"/WEB-INF/jsp/main.jsp",即必须写完整路径的视图名称。
上述类型的处理器映射器是默认的,同样上述类型的处理器适配器也是默认的,两者均可省略不要,因此springmvc.xml可以简化为下列代码:
<?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"><!--1.配置自定义控制器,一条具体的映射关系,name对应客户端URL请求,class对应服务端响应程序--><bean name="/first" class="com.foxbill.controller.FirstController" /><!--2.配置视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>
7)删除index.jsp页面,重新建index.jsp页面,因为自动生成的页面缺失指令设置。
开发页面,发出请求。
<a href="${pageContext.request.contextPath}/first">访问控制器FirstController</a>
8)在webapp/WEB-INF目录上新添目录/jsp。
9)在/jsp目录下新建main.jsp页面。用来进行服务器处理完毕后数据的回显。
在<body></body>之间输入如下代码:
<h1>${hello}</h1>
10)运行项目
1.6 基于注解的SpringMVC程序
所谓 SpringMVC 的注解式开发是指,在代码中通过对类与方法的注解,便可完成处理器在 springmvc 容器的注册。注解式开发是重点。
项目案例功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。
创建步骤:
1)新建maven_web项目
同上
2)添加依赖
此处比上一个项目,多了一个aop的依赖。
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.26</version>
</dependency>
3)配置web.xml
配置方法及内容同上。
4)配置springmvc.xml,需要配置组件扫描器,代码如下
<?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"><!--1.配置组件扫描器--><context:component-scan base-package="com.foxbill.controller" /><!--2.配置视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property></bean></beans>
与配置式开发的相比,少了一大堆配置,无须配置处理器映射器和处理器适配器,但问题来了,“请求/响应”的映射关系在哪定义呢?客户端的URL请求从哪里可以找到对应的服务端处理器来处理呢?可以发现上面代码中多了一个配置组件扫描器,表示通过扫描指定的包下面的类中的注解从而获取映射关系。
5)创建控制器,无须实现任何接口,代码如下:
package com.foxbill.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class FirstController {@RequestMapping("/first")public ModelAndView doHello() {ModelAndView mav = new ModelAndView();mav.addObject("hello","Hello My First SpringMVC!");mav.setViewName("main");return mav;}
}
第一个注解@Controller表示将本类定义为一个控制器类,这个无须再实现Controller接口。
第二个注解@RequestMapping("/first")表示定义一种“请求/响应”的映射关系,即如果客户端浏览器发出“/first”的URL请求,则由该注解下面的doHello()方法来响应。即客户端的请求,被映射到控制器类的方法上,大大减少了配置工作量。
6)index.jsp和main.jsp
同上
7)运行项目
相关文章:

Java课题笔记~ SpringMVC概述
1.1 SpringMVC简介 SpringMVC 也叫Spring web mvc。是Spring 框架的一部分,在Spring3.0 后发布的。 1.2 SpringMVC的优点 基于MVC 架构 基于 MVC 架构,功能分工明确。解耦合。 容易理解,上手快,使用简单 就可以开发一个注解…...

SOPC之NIOS Ⅱ遇到的问题
记录NIOS Ⅱ中遇到的报错 一、NIOS II中Eclipse头文件未找到 问题:Unresolved inclusion: "system.h"等 原因:编译器无法找到头文件所在路径 解决方法: 在文件夹中找到要添加的头文件,并记录下其路径,如…...
uniapp uni-datetime-picker 日期和光标靠右
如果想在uni-datetime-picker组件中将日期和光标靠右,您可以使用自定义样式来实现。首先,您需要在页面的样式文件中定义一个类,用于定制uni-datetime-picker组件的样式。例如,你可以在App.vue或者页面的样式文件中添加以下代码&am…...
关于axios请求中的GET、POST、PUT、DELETE的一些认知
这篇写的特别好。而本文主要从实习用途中展开,不专业。 浅谈HTTP中Get、Post、Put与Delete的区别 1、Get 1、目前Get禁止使用requestBody形式传递值,如果使用了,后端会一直报错,让你确认是否有传递参数。 2、举例,模…...

go-zero 是如何做路由管理的?
原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分。 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的,…...

Springboot集成ip2region离线IP地名映射-修订版
title: Springboot集成ip2region离线IP地名映射 date: 2020-12-16 11:15:34 categories: springboot description: Springboot集成ip2region离线IP地名映射 1. 背景2. 集成 2.1. 步骤2.2. 样例2.3. 响应实例DataBlock2.4. 响应实例RegionAddress 3. 打开浏览器4. 源码地址&…...

智能驾驶系列报告之一:智能驾驶 ChatGPT时刻有望来临
原创 | 文 BFT机器人 L3 功能加速落地,政策标准有望明确 L2 发展日益成熟,L3 功能加速落地。根据市场监管总局发布的《汽车驾驶自动化分级》与 SAE发布的自动驾驶分级标准,自动驾驶主要分为 6 个级别(0 级到 5 级,L0 …...

设计HTML5文档结构
定义清晰、一致的文档结构不仅方便后期维护和拓展,同时也大大降低了CSS和JavaScript的应用难度。为了提高搜索引擎的检索率,适应智能化处理,设计符合语义的结构显得很重要。 1、头部结构 在HTML文档的头部区域,存储着各种网页元…...
vue echarts中按钮点击后修改值 watch数据变化后刷新图表
1 点击按钮 {feature: {myBtn1: {show: true,title: 反转Y轴,showTitle: true,icon: path://M512 0A512 512 0 1 0 512 1024A512 512 0 0 0 512 0M320 320V192h384v128zM128 416V288h256v128zM320 704V576h384v128zM128 800V672h256v128z,onclick: () > {dataSetting.rever…...

React antd tree树组件 - 父子节点没有自动关联情况下 - 显示半选、全选状态以及实现父子节点互动
实现的效果图如下: 如Ant Design Vue 中所示,并没有提供获取半选节点的方法,当设置checked和checkStrictly时,父子节点也不再自动关联了 前提:从后端可以获取的数据分别是完整的树型数据、所有选中的节点数据&#…...
优漫动游 大厂需要什么样的ui设计师呢?
通常来说大公司UI设计的流程主要是这样的:创意-头脑风暴-策划方案-交互设计&评审-美术设计&评审-开发实施,不过实际上大多数公司都有自己的一套流程,源于公司的基因、公司组织体系、公司领导风格。一起了解大厂需要什么样的ui设计师呢…...

TiDB Bot:用 Generative AI 构建企业专属的用户助手机器人
本文介绍了 PingCAP 是如何用 Generative AI 构建一个使用企业专属知识库的用户助手机器人。除了使用业界常用的基于知识库的回答方法外,还尝试使用模型在 few shot 方法下判断毒性。 最终,该机器人在用户使用后,点踩的比例低于 5%࿰…...

uniapp 使用canvas画海报(微信小程序)
效果展示: 项目要求:点击分享绘制海报,并实现分享到好友,朋友圈,并保存 先实现绘制海报 <view class"data_item" v-for"(item,index) in dataList" :key"index"click"goDet…...
TiDB 应急运维脚本,更加方便的管理TiDB集群
TiDB 应急运维脚本,更加方便的管理TiDB集群 使用方法 使用方法:[tidblocalhost ~]$ which tiup ~/.tiup/bin/tiup编辑脚本,MYSQL_PASSWD 和 PORT 根据实际替换 [tidblocalhost ~]$ vi ~/.tiup/bin/ti#version 1.1 #author guanguanglei ##…...

第二部分:AOP
一、AOP简介 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。 AOP是OOP(面向对象编程)的进阶版。 作用:在不改变原始设计的基础上为其进行功能增强。 spring理念&#x…...

分享一组天气组件
先看效果: CSS部分代码(查看更多): <style>:root {--bg-color: #E9F5FA;--day-text-color: #4DB0D3;/* 多云 */--cloudy-background: #4DB0D3;--cloudy-temperature: #E6DF95;--cloudy-content: #D3EBF4;/* 晴 */--sunny-b…...
微服务中RestTemplate访问其他服务返回值转换问题
背景: 接收一个springcloud项目,UI模块访问其他服务的接口,返回数据统一都是使用fastjson进行转换,但是新开发了几个新模块之后发现fastjson很多bug(各种内存溢出),但是很多地方已经重度依赖fa…...

Centos7.9上(离线)安装Gitlab
1、下载Gitlab的rpm安装包Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm,如果依赖缺失,yum安装即可 3、vi /etc/gitlab/gitlab.rb 配置external_url&…...

pikachu中RCE出现乱码的解决的方案
exec “ping” 输入127.0.0.1 这种乱码的解决办法就是在pikachu/vul/rce/rce_ping.php目录里面的第18行代码 header("Content-type:text/html; charsetgbk");的注释打开即可。 BUT但是吧!又出现了其他的乱码!但是搞完这个再把它给注释掉就行了…...
airflow是什么
Airflow 简介 Airflow是一个基于有向无环图(DAG)的可编程、调度和监控的工作流平台,它可以定义一组有依赖的任务,按照依赖依次执行。airflow提供了丰富的命令行工具用于系统管控,而其web管理界面同样也可以方便的管控调度任务,并…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...