springboot整合springmvc
1、创建springboot项目,勾选Spring web
- 当前springboot选择的是2.6.13版本,jdk1.8
- 尽量选2.几的springboot
2、在pom.xml中导入相应的坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
3、配置application.yml,按需配置,可选
server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: myuserpassword: mypassworddriver-class-name: com.mysql.cj.jdbc.Driverservlet:multipart:max-file-size: 10MB # 设置单个文件最大上传大小max-request-size: 50MB # 设置请求的最大总数据大小enabled: true # 开启文件上传支持format:date-time-patterns:- yyyy-MM-dd HH:mm:ss # 日期时间格式-mvc:static-path-pattern: /static/** # 指定静态资源的访问路径模式resources:static-locations: file:/path/to/your/static/files/ # 指定静态资源文件的存储位置view:prefix: /WEB-INF/views/ # view前缀suffix: .jsp # view后缀,如:.jsp
4、创建controller包,报下新建UserController进行测试
package com.example.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("user")
public class UserController {@GetMapping("hello")public String test(){return "hello ssm";}
}//访问http://localhost:8080/user/hello,返回hello ssm即为测试成功
5、访问静态资源
默认的静态资源路径为:classpath:/META-INF/resources/classpath:/resources/classpath:/static/(一般放置在这个文件夹下)classpath:/public/只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理
6、相关注解
1、@RequestMapping
- 用于Controller类、类中方法上,用来处理请求地址映射的注解
- @RequestMapping(value = “/login”,produces = “application/json;charset=utf-8”, method = RequestMethod.GET)
- value:url的值,
- method:提交方式 ,get或者post
- produces:指定响应体返回类型和编码
- @GetMapping,与@RequestMapping作用一致,但指定必须为get请求,且只能用在类上
- @PostMapping,与@RequestMapping作用一致,但指定必须为post请求,且只能用在类上
2、@RequestParam
- 用于Controller类的方法参数前,如4中test()如果有参数,即可使用test(@RequestParam String name)
- @RequestParam(value=“username”, required=true, defaultValue=“zhang”) String name)
- value表示 入参的请求参数名字,前端传过来的必须和这个名称一样
- required默认值是true,意思为该参数必传
- defaultValue表示默认值,当前设定为zhang
- 注解可用于map与对象:test(@RequestParam Map query)、test(@RequestParam User user)
3、@RequestBody
- 用于Controller类的方法上,效果是接收JSON数据
4、@PathVariable
- 拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
- deleteById(@PathVariable (“id”) String uid):将占位符{id}的值绑定给了形参uid
5、@ResponseBody
-
用于Controller类的方法上,效果是返回JSON数据给前端。
-
返回值一般写AjaxResult
-
AjaxResult工具类
package com.pj.util;import java.io.Serializable; import java.util.List;/*** ajax请求返回Json格式数据的封装 */ public class AjaxJson implements Serializable{private static final long serialVersionUID = 1L; // 序列化版本号public static final int CODE_SUCCESS = 200; // 成功状态码public static final int CODE_ERROR = 500; // 错误状态码public static final int CODE_WARNING = 501; // 警告状态码public static final int CODE_NOT_JUR = 403; // 无权限状态码public static final int CODE_NOT_LOGIN = 401; // 未登录状态码public static final int CODE_INVALID_REQUEST = 400; // 无效请求状态码public int code; // 状态码public String msg; // 描述信息 public Object data; // 携带对象public Long dataCount; // 数据总数,用于分页 /*** 返回code * @return*/public int getCode() {return this.code;}/*** 给msg赋值,连缀风格*/public AjaxJson setMsg(String msg) {this.msg = msg;return this;}public String getMsg() {return this.msg;}/*** 给data赋值,连缀风格*/public AjaxJson setData(Object data) {this.data = data;return this;}/*** 将data还原为指定类型并返回*/@SuppressWarnings("unchecked")public <T> T getData(Class<T> cs) {return (T) data;}// ============================ 构建 ================================== public AjaxJson(int code, String msg, Object data, Long dataCount) {this.code = code;this.msg = msg;this.data = data;this.dataCount = dataCount;}// 返回成功public static AjaxJson getSuccess() {return new AjaxJson(CODE_SUCCESS, "ok", null, null);}public static AjaxJson getSuccess(String msg) {return new AjaxJson(CODE_SUCCESS, msg, null, null);}public static AjaxJson getSuccess(String msg, Object data) {return new AjaxJson(CODE_SUCCESS, msg, data, null);}public static AjaxJson getSuccessData(Object data) {return new AjaxJson(CODE_SUCCESS, "ok", data, null);}public static AjaxJson getSuccessArray(Object... data) {return new AjaxJson(CODE_SUCCESS, "ok", data, null);}// 返回失败public static AjaxJson getError() {return new AjaxJson(CODE_ERROR, "error", null, null);}public static AjaxJson getError(String msg) {return new AjaxJson(CODE_ERROR, msg, null, null);}// 返回警告 public static AjaxJson getWarning() {return new AjaxJson(CODE_ERROR, "warning", null, null);}public static AjaxJson getWarning(String msg) {return new AjaxJson(CODE_WARNING, msg, null, null);}// 返回未登录public static AjaxJson getNotLogin() {return new AjaxJson(CODE_NOT_LOGIN, "未登录,请登录后再次访问", null, null);}// 返回没有权限的 public static AjaxJson getNotJur(String msg) {return new AjaxJson(CODE_NOT_JUR, msg, null, null);}// 返回一个自定义状态码的public static AjaxJson get(int code, String msg){return new AjaxJson(code, msg, null, null);}// 返回分页和数据的public static AjaxJson getPageData(Long dataCount, Object data){return new AjaxJson(CODE_SUCCESS, "ok", data, dataCount);}// 返回,根据受影响行数的(大于0=ok,小于0=error)public static AjaxJson getByLine(int line){if(line > 0){return getSuccess("ok", line);}return getError("error").setData(line); }// 返回,根据布尔值来确定最终结果的 (true=ok,false=error)public static AjaxJson getByBoolean(boolean b){return b ? getSuccess("ok") : getError("error"); }/* (non-Javadoc)* @see java.lang.Object#toString()*/@SuppressWarnings("rawtypes")@Overridepublic String toString() {String data_string = null;if(data == null){} else if(data instanceof List){data_string = "List(length=" + ((List)data).size() + ")";} else {data_string = data.toString();}return "{"+ "\"code\": " + this.getCode()+ ", \"msg\": \"" + this.getMsg() + "\""+ ", \"data\": " + data_string+ ", \"dataCount\": " + dataCount+ "}";}}
7、请求转发和重定向
1、forward请求转发
/*** 使用forward关键字进行请求转发 * "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径 * @return * @throws Exception */@RequestMapping("/delete")public String delete() throws Exception {System.out.println("delete方法执行了...");// return "forward:/WEB-INF/pages/success.jsp"; return "forward:/user/findAll";}
2、redirect重定向
/*** 重定向 * @return * @throws Exception */@RequestMapping("/count")public String count() throws Exception {System.out.println("count方法执行了...");return "redirect:/add.jsp";// return "redirect:/user/findAll"; }}
8、拦截器
1、新建Interceptor包,包下新建MyHandlerInterceptor文件
package com.example.Interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Pre Handle: " + request.getMethod() + " " + request.getRequestURI());System.out.println("在控制器方法调用之前执行");return true; // 继续处理请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post Handle: " + request.getRequestURI());System.out.println("在控制器方法调用之后执行,但在视图渲染之前");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("After Completion: " + request.getRequestURI());System.out.println("在整个请求完成后执行,无论是否出现异常");}
}
2、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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><mvc:interceptors><bean class="com.example.Interceptor.MyHandlerInterceptor" /></mvc:interceptors>
</beans>
3、新建config包,包下新建WebMvcConfigurer文件
package com.example.config;import com.example.Interceptor.MyHandlerInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**") // 指定拦截器的应用路径.excludePathPatterns("/resources/**", "/static/**"); // 排除静态资源}
}
拦截器参考链接
springboot整合springmvc参考链接
相关文章:

springboot整合springmvc
1、创建springboot项目,勾选Spring web 当前springboot选择的是2.6.13版本,jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...

el-cascader多选的父子关联和父子不关联功能
公用html: <el-cascader v-model"data" :options"optionsData" :props"props" clearable> </el-cascader> 公用js变量: data () {return {// 绑定的数组data: [],// 绑定的选项数据optionsData: []} }, 公…...

#Datawhale AI夏令营第4期#多模态大模型Task2
赛事进阶解读 关于赛事介绍: Better Synth 是一项以数据为中心的挑战赛,考察如何合成与清洗图文数据以在多模态大模型上取得更优的图片理解能力。 本次比赛基于 Mini-Gemini 模型进行训练,只关注于预训练(模态间对齐)…...

LeetCode 热题100-1
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任…...

表现良好的最长时间段(LeetCode)
题目 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格…...

【性能优化】DNS解析优化
前言 DNS解析过程消耗时间DNS有本地缓存 比如首次访问某站点,会耗费很多时间进行DNS解析,但解析结束后会将ip地址存入本地设备,后续再访问此域名时就会直接从缓存中取。 首次访问页面时,本页面的DNS解析是无法优化的࿰…...

【剑指 offer】合并链表
目 录 描述: 输入两个递增的链表,单个链表的长度为 n,合并这两个链表并使新链表中的节点仍然是递增排序的。 思路: 定义一个新链表,先进行我们的原俩链表判断,然后比较俩链表的每个节点大小,然…...

红酒与节日装饰:打造节日氛围的需备品
随着节日的脚步渐渐临近,节日的氛围也愈发浓厚。在这个特殊的时刻,红酒与节日装饰无疑成为了营造节日氛围的需备品。洒派红酒(Bold & Generous)作为定制红酒的品牌,其不同的韵味与节日装饰的精致整合,共…...

Element Plus的el-carousel走马灯平铺多张图片
效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…...

【promise】Promise的几个关键问题 (三)
Ⅰ-如何改变 promise 的状态? (1) resolve(value): 如果当前是 pending 就会变为 resolved (2) reject(reason): 如果当前是 pending 就会变为 rejected (3) 抛出异常: 如果当前是 pending 就会变为 rejected Ⅱ-一个 promise 指定多个成功/失败回调函数, 都会调用吗? 当 pro…...

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)
上一篇博文:绘制条形码的效果不是很好:利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境: win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下: 1 新建.net framework 4.8的控制台项目…...

IP代理如何增强网络安全性?
在当今的数字时代,网络安全已成为一个关键问题,而使用 IP 代理可以成为增强网络安全的有效方法。根据请求信息的安全性,IP 代理服务器可分为三类:高级匿名代理、普通匿名代理和透明代理。此外,根据使用的用途ÿ…...

NDP(Neighbor Discovery Protocol)简介
定义 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由设备发现(Router Discovery),…...

为何要隐藏源 IP 地址?
概述 在网络世界中,服务器的安全至关重要。一旦服务器遭受黑客攻击,采取正确的防御措施是防止进一步损害的关键。其中一项重要的策略就是隐藏服务器的真实 IP 地址。本文将探讨隐藏源 IP 地址的重要性,并提供一些实用的方法来实现这一目标。…...

目前最流行的前端构建工具,你知道几个?
现在的市面上有很多不同的前端构建工具,我们很难对它们一一进行关注。在本文中,我们将重点介绍最受欢迎的几种,并探讨开发人员喜欢或不喜欢它们的原因。 Webpack Webpack 是一个模块打包器,主要用于处理 Web 应用程序的资源的优化…...

C++函数模板温习总结
函数模板 // 1、typename 在这里是类型重定义(typedef),而不是宏替换(#define) //2、模板的非类型参数,属性为const , 不允许修改 //3、函数模板不允许部分特例化,类模板可以 //4、模板函数和非模板函数重载,优先调用…...

【网络】套接字(socket)编程——TCP版
接着上一篇文章:http://t.csdnimg.cn/GZDlI 在上一篇文章中,我们实现的是UDP协议的,今天我们就要来实现一下TCP版本的 接下来接下来实现一批基于 TCP 协议的网络程序,本节只介绍基于IPv4的socket网络编程 基于 TCP 的网络编程开…...

水凝胶生物打印是什么?如何指导Organoids培养?有啥好处?
大家好,我们来了解这篇《Hydrogel-in-hydrogel live bioprinting for guidance and control of organoids and organotypic cultures》发表在《Nature Communications》的一篇文章。三维水凝胶基器官样培养,如类器官和体外器官型培养,能够自我…...

从springBoot框架服务器上下载文件 自定义一个启动器
在springboot框架中下载服务器存储的图片: 1)springboot默认访问放行的目录只有static,在static目录下存放图片资源 2)编译后的static目录中有一个1.png 2.5)编写控制器: Controller //RequestMapping("/upload&q…...

某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]
文章目录 某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏…...

pythonselenium自动化测试实战项目(完整、全面)
前言 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过11一直没有更新博客,今天整理一下实战项目的代码共大家学习。(注:项目是针对我们公司内部系统的测试,只能内部网络访问,外部网络…...

如何选择合适的虚拟机软件?对比Parallels Desktop 和VMware Fusion 使用虚拟机畅玩黑神话悟空
随着技术的发展,虚拟机软件将更加高效地管理和分配系统资源。虚拟机软件扮演着越来越重要的角色。无论是软件开发者需要测试不同操作系统环境下的应用,还是普通用户希望在一台机器上同时运行多个操作系统,虚拟机软件都是不可或缺的工具。那么…...

ESP32FreeRTOS开发笔记:2.定义、多任务与优先级调度
FreeRTOS 是一种实时操作系统(RTOS),专门用于嵌入式系统。它之所以被称为 "FreeRTOS",是因为它是一个免费和开源的 RTOS。下面我们具体讨论一下 FreeRTOS 与 RTOS 的区别,以及 "free" 的含义。 一、什么是 RTOS? RTOS,全称 Real-Time Operating Sy…...

【Python-办公自动化】1秒比较出2张表格之间的不同并标黄加粗
欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介…...

Linux下查看各进程的swap
cat /etc/re*se Red Hat Enterprise Linux Server release 6.8 (Santiago) 简单的可以通过top命令查看 top 后 按 f 进入选择列界面 按 p 就会输出swap信息(变为P) 回车返回看到SWAP信息了 再按 F 再按p 按swap排序 再回车后就是各进程按swap排序…...

最后一个单词的长度 简单字符串问题
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World" 输出:5 解…...

Autodesk Mudbox 2024:重塑创意边界的3D数字绘画与雕刻利器
在数字艺术与设计领域,Autodesk Mudbox 2024以其卓越的性能和直观的操作界面,再次刷新了3D数字绘画与雕刻软件的标准。作为Autodesk家族的一员,Mudbox不仅继承了其家族强大的技术基因,更在细节上精雕细琢,为艺术家和设…...

【python下用sqlite3, 多线程下报错,原因和解决 】
在python下用sqlite3, 多线程 在UPDATE 或者INSERT的时候, 会报错 sqlite3.OperationalError: cannot commit - no transaction is active 1. 原因 多线程写冲突 非原子写操作:如果多个线程同时执行非原子写操作,可能会导致数据覆盖或不一致。 2. 解…...

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信
目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1)bind 绑定 2)listen 监听 3)accept 接收连接请求 4)recv 接收 5)sen…...

【DataKit系列】数据迁移-实例搭建步骤(二)
说明:此文档仅包含使用DataKit进行数据迁移时,搭建迁移任务相关教程,不包含一些必须的前置配置步骤,和环境要求等,请优先学习“【DataKit系列】数据迁移-使用说明(一)”文档。 数据迁移实例搭建…...