当前位置: 首页 > news >正文

SpringMVC请求、响应和拦截器的使用

SpringMVC请求

RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上

1. 作用在类上:第一级的访问目录
2. 作用在方法上:第二级的访问目录
3. 细节:路径可以不编写 / 表示应用的根目录开始

(1).RequestMapping的属性

1. path 指定请求路径的url
2. value value属性和path属性是一样的
3. mthod 指定该方法的请求方式
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {/*** /role/save* method="当前方法允许请求方式能访问"* params="请求路径上传参数"* @return*/@RequestMapping(path = "/save",method = {RequestMethod.GET})public String save(){System.out.println("保存角色...");return "suc";}@RequestMapping(value = "/delete")public String delete(){System.out.println("删除角色...");return "suc";}
}

(2).RequestMapping的请求参数绑定

1. 绑定机制
  1. 表单提交的数据都是k=v格式的 username=haha&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  3. 要求:提交表单的name和参数的名称是相同的
2. 支持的数据类型
  1. 基本数据类型和字符串类型
  2. 实体类型(JavaBean)
  3. 集合数据类型(List、map集合等)

基本数据类型和字符串类型

  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写

实体类型(JavaBean)

  1. 提交表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

给集合属性数据封装
JSP页面编写方式:list[0].属性

jsp代码

<html>
<head><meta charset="utf-8"><title>入门程序</title>
</head>
<body>
<h3>入门</h3><a href="/SpringMVC/hello" >入门程序</a><h1>请求参数绑定入门程序</h1><form action="/SpringMVC/user/save" method="get"><input type="text" name="username"/><br/><input type="text" name="age"/><br/><input type="submit"/></form><h1>请求参数绑定入门程序(封装到实体类)</h1><form action="/user/save1" method="post"><input type="text" name="username"/><br/><input type="text" name="age"/><br/><input type="submit"/></form><h1>请求参数绑定入门程序(封装到实体类)</h1><form action="/user/save2" method="post"><input type="text" name="username"/><br/><input type="text" name="age"/><br/><input type="text" name="account.money"/><br/><input type="submit"/></form><h1>请求参数绑定入门程序(存在list集合)</h1><form action="/user/save3" method="post"><input type="text" name="username"/><br/><input type="text" name="age"/><br/><input type="text" name="account.money"/><br/><input type="text" name="accounts[0].money"/><br/><input type="text" name="accounts[1].money"/><br/><input type="submit"/></form>
</body>
</html>

JavaBean代码

public class Account {private Double money;public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"money=" + money +'}';}
}
public class User {private String username;private Integer age;private Account account;private List<Account> accounts;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Account getAccount() {return account;}public void setAccount(Account account) {this.account = account;}public List<Account> getAccounts() {return accounts;}public void setAccounts(List<Account> accounts) {this.accounts = accounts;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", age=" + age +", account=" + account +", accounts=" + accounts +'}';}
}

controller代码

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")public String save(String username,Integer age){System.out.println(username);System.out.println(age);return "suc";}@RequestMapping("/save1")public String save1(User user){System.out.println(user.toString());return "suc";}@RequestMapping("/save2")public String save2(User user){System.out.println(user);return "suc";}@RequestMapping("/save3")public String save3(User user){System.out.println(user);return "suc";}}

在控制器中使用原生的ServletAPI对象
只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象

@RequestMapping(value = "/save6.do",method = {RequestMethod.POST})
public String save6(HttpServletRequest request, HttpServletResponse response){// 获取到HttpSession对象System.out.println(request.getParameter("username"));HttpSession session = request.getSession();System.out.println(session);System.out.println(response);return "suc";
}

SpringMVC响应

第一章:数据处理及跳转

1. 结果跳转方式

①.ModelAndView

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面

<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/html/" /><property name="suffix" value=".html" /><property name="templateMode" value="HTML5"/>
</bean>

对应的controller类

/*** 返回ModelAndView对象的方式* @return*/
@RequestMapping("/save3")
public ModelAndView save3(){System.out.println("执行了...");// 创建mv对象ModelAndView mv = new ModelAndView();// 把一些数据,存储到mv对象中mv.addObject("msg","用户名或者密码已经存在");// 设置逻辑视图的名称mv.setViewName("suc");return mv;
}

在这里插入图片描述

②.ServletAPI

通过设置ServletAPI , 不需要视图解析器 .

1、通过HttpServletResponse进行输出
2、通过HttpServletResponse实现重定向
3、通过HttpServletResponse实现转发

@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {@RequestMapping("/t1")public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {rsp.getWriter().println("Hello,Spring BY servlet API");}@RequestMapping("/t2")public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {rsp.sendRedirect("/SpringMVCDemo/html/suc.html");}@RequestMapping("/t3")public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {//转发req.setAttribute("msg","hello");req.getRequestDispatcher("/html/suc.html").forward(req,rsp);}}
③.SpringMVC

通过SpringMVC来实现转发和重定向 - 无需视图解析器;
测试前,需要将视图解析器注释掉

@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {@RequestMapping("/t1")public String test1(){//转发return "/html/suc.html";}@RequestMapping("/t2")public String test2(){//转发二return "forward:/html/suc.html";}@RequestMapping("/t3")public String test3(){//重定向return "redirect:/html/suc.html";}}

2.ResponseBody响应json数据

json和JavaBean对象互相转换的过程中,需要使用jackson的jar包

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version>
</dependency>

DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
标签配置不过滤

  1. location元素表示webapp目录下的包下的所有文件
  2. mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
<!--设置静态资源不过滤-->
<mvc:resources mapping="/css/**" location="/css/"/> <!--样式-->
<mvc:resources mapping="/images/**" location="/images/"/> <!--图片-->
<mvc:resources mapping="/js/**" location="/js/"/> <!--javascript-->

html代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script><script>// 页面加载$(function(){// 单击事件$("#btn").click(function(){// 发送ajax的请求$.ajax({type: "post",url: "/SpringMVCDemo/user/save6",data:{username:"haha",age:"20"},success:function(d){// 编写很多代码alert(d.username+" ‐ "+d.age);}});});});</script>
</head>
<body>
<h3>异步的数据交互</h3>
<input type="button" value="ajax交互" id="btn">
</body>
</html>

controller

/*** 异步的数据交互* 重定向* @return*/
@RequestMapping("/save6")
public @ResponseBody User save6(User user){System.out.println(user);// 模拟,调用业务层代码user.setUsername("hello");user.setAge(100);// 把user对象转换成json,字符串,再响应。使用@ResposeBody注解 response.getWriter().print()return user;
}

在springMVC当中如果要实现页面跳转就不要使用ajax,如果要json数据的返回就用ajax

第二章:SpringMVC实现文件上传

导入文件上传的jar包

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>

在Springmvc.xml配置文件上传解析器

<!--配置文件上传的解析器组件。id的名称是固定,不能乱写--><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置上传文件的总大小 8M = 8 * 1024 * 1024 --><property name="maxUploadSize" value="8388608" /></bean>

编写文件上传的html页面


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>文件上传</h3><form id="addForm"  action="/SpringMvc/file/upload" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="file" width="120px"><input type="submit" value="上传">
</form><div id="upMenu" class="white_content"><form id="downForm"   lay-filter="updata" action="/SpringMvc/file/down" method="get"><input type="text" id="filename" name="filename"><input type="submit" value="下载"></form><input type="button" value="完成"/>
</div></body>
</html>

controller层

@Controller
@RequestMapping("/file")
public class FileController {/*** 文件上传功能* @param file* @return* @throws IOException*/@RequestMapping(value="/upload",method= RequestMethod.POST)@ResponseBodypublic  String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {// uploads文件夹位置String rootPath = request.getSession().getServletContext().getRealPath("WEB-INF/upload");// 原始名称String originalFileName = file.getOriginalFilename();// 新文件File newFile = new File(rootPath + File.separator  + File.separator + originalFileName);// 判断目标文件所在目录是否存在if( !newFile.getParentFile().exists()) {// 如果目标文件所在的目录不存在,则创建父目录newFile.getParentFile().mkdirs();}System.out.println(newFile);// 将内存中的数据写入磁盘file.transferTo(newFile);return  "{\"data\":\"success\"}";}/*** 文件下载功能* @param request* @param response* @throws Exception*/@RequestMapping("/down")public void down(HttpServletRequest request, HttpServletResponse response) throws Exception{String filename = request.getParameter("filename");System.out.println(filename);//模拟文件,myfile.txt为需要下载的文件String fileName = request.getSession().getServletContext().getRealPath("WEB-INF/upload")+"/"+filename;//获取输入流InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));//假如以中文名下载的话// String filename = "下载文件.txt";//转码,免得文件名中文乱码filename = URLEncoder.encode(filename,"UTF-8");//设置文件下载头response.addHeader("Content-Disposition", "attachment;filename=" + filename);//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setContentType("multipart/form-data");BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());int len = 0;while((len = bis.read()) != -1){out.write(len);out.flush();}out.close();}
}

第三章:SpringMVC的异常处理

1. 异常处理思路

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

2. SpringMVC的异常处理

①:使用自己处理异常
controller代码

/*** 自己处理异常* @return*/
@RequestMapping("/findAll")
public String findAll(Model model){try {System.out.println("执行了...");// 模拟异常int a = 10/0;}catch (Exception e){model.addAttribute("errorMsg","系统正在维护,请联系管理员");return "404";}return "suc";
}

404页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>错误提示页面</title>
</head>
<body>
<h1>404  <b th:text="${errorMsg}"></b></h1>
</body>
</html>

②:使用处理器处理异常
controller代码

/*** 使用异常处理器方式* @return*/
@RequestMapping("/findAll2")
public String findAll2(){System.out.println("执行了...");//模拟异常int a = 10 / 0;return "suc";
}

自定义异常类

public class SysException extends Exception{// 提示消息private String message;public SysException(String message){this.message = message;}@Overridepublic String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "SysException{" +"message='" + message + '\'' +'}';}
}

配置异常处理器

<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.qcby.conf.SysExceptionResolver" />

SpringMVC拦截器

1.什么是拦截器

SpringMVC提供了Intercepter拦截器机制,类似于Servlet当中的Filter过滤器,用于拦截用户的请求并作出相应的处理,比如通过拦截器来进行用户权限验证或者用来判断用户是否登录。
SpringMVC拦截器是可插拔式的设计,需要某一功能拦截器,就需要在配置文件中应用拦截器即可;如果不需要这个功能拦截器,只需要在配置文件中取消该拦截器即可。

2.拦截器和过滤器有哪些区别

1.过滤器依赖于servlet,而拦截器技术属于SpringMVC
2.过滤器可对所有请求起作用,拦截器只对访问controller层的请求起作用。
3.过滤器会比拦截器先执行。拦截器(Interceptor)是在Servlet和Controller控制器之间执行;而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行。
在这里插入图片描述

3.拦截器方法

想要自定义拦截器,需要实现HandlerInterceptor接口。
在这里插入图片描述
我们可以看到 HandlerInterceptor接口有三个方法,分别是preHandle、postHandle、afterCompletion,关于这三个方法

  • preHandle 方法: 该方法在执行器方法之前执行。返回值为Boolean类型,如果返回false,表示拦截,不再向下执行;如果返回true,表示放行,程序向下执行(如果后边没有其他Interceptor,就会执行Controller方法)。所以,此方法可对方法进行判断,决定程序是否继续执行,或者进行一些初始化操作及对请求进行预处理。
  • postHandle方法: 该方法在执行控制器方法调用之后,且在返回ModelAndView之前执行。由于该方法会在DispatcherServlet进行返回视图渲染之前被调用,所以此方法多被用于处理返回的视图, 可通过此方法多被用于处理返回的视图,可通过此方法对请求域中的模型和视图做进一步的修改。
  • afterCompletion方法: 该方法在执行完控制器之后执行。由于是在Controller方法执行完毕之后执行该方法,所以该方法适合进行一些资源清理、记录日志信息等处理操作。

4.单个拦截器的执行流程

程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向前端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
在这里插入图片描述

5.使用拦截器实现用户登录权限验证

在这里插入图片描述
Controller层的设计

@Controller
public class LoginController {/*** 跳转登录页* @return*/@RequestMapping(value = "/login",method = RequestMethod.GET)public String loginPage(){System.out.println("跳转到login.html页面当中");return "login";}/*** 用户登录,成功到主页,失败回到登录页* @param user* @param model* @param session* @return*/@RequestMapping(value = "/login",method = RequestMethod.POST)public String login(User user, Model model, HttpSession session){if(user.getUsername() !=null && user.getUsername().equals("admin")&& user.getPassword() !=null && user.getPassword().equals("123456")){System.out.println("用户登录功能实现");//将用户添加到session保存session.setAttribute("user",user);return "/suc";}model.addAttribute("msg","账户或密码错误,请重新登录");return "login";}/*** 跳转到主页* @return*/@RequestMapping("/index")public String indexPage(){System.out.println("跳转到主页");return "suc";}/*** 用户退出登录* @param session* @return*/@RequestMapping("/logout")public String logout(HttpSession session){session.invalidate();//清除sessionSystem.out.println("用户退出登录");return "login";}}

登录页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body>
<h1> <font color="red"> <b th:text="${msg}"></b></font></h1>
<form action="/SSMDemo/login" method="post">账户:<input type="text" name="username"/>密码:<input type="password" name="password"/><input type="submit" value="登录"/>
</form>
</body>
</html>

主页

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>Hello <b th:text="${msg}"></b></h1>
<a href="/SSMDemo/logout" >入门程序</a>
</body>
</html>

拦截器配置

/*** 登录拦截器*/
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取请求urlString url = request.getRequestURI();//非登录请求进行拦截if (!url.contains("login")){//非登录请求获取sessionif(request.getSession().getAttribute("user") != null){return true;//说明已经登录,放行}else { //没有登录,跳转到登录页面request.setAttribute("msg","您还没登录。请先登录。。。");request.getRequestDispatcher("/html/login.html").forward(request,response);}}else {return true; //登录请求,放行}return true;}//省略了postHandle()和afterCompletion()方法
}

在springMV.xml文件当中配置拦截器

<!--配置拦截器-->
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/> <!--/**表示所有url--><bean class="com.qcby.Interceptor.LoginInterceptor"/></mvc:interceptor>
</mvc:interceptors>

6.多个拦截器的执行流程

当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
假设有两个拦截器Interceptor1和interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。
在这里插入图片描述

相关文章:

SpringMVC请求、响应和拦截器的使用

SpringMVC请求 RequestMapping注解 RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系 RequestMapping注解可以作用在方法和类上 1. 作用在类上&#xff1a;第一级的访问目录 2. 作用在方法上&#xff1a;第二级的访问目录 3. 细节&#xff1a;路径可以不编写…...

基于springboot+layui仓库管理系统设计和实现

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…...

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…...

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…...

QT网络编程之实现UDP广播发送和接收

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…...

SSL VPN基础原理

目录 SSL ---安全传输协议&#xff08;安全套接层&#xff09;---TLS ----传输层安全协议 SSL的工作原理 SSL会话建立的过程 ​编辑 数据传输过程中的封装示意图 无客户端认证的过程 有客户端认证的过程 SSL VPN的核心技术---虚拟网关技术 服务器验证的点&#xff1a; 资源…...

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议&#xff1a;文件传输的桥梁 在数字化时代&#xff0c;文件传输协议&#xff08;FTP&#xff09;是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件&#xff0c;无论是上传还是下载&#xff0c;都提供了一种稳定且高效的方式。本文将深…...

数字化转型导师坚鹏:金融机构数字化运营

金融机构数字化运营 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不清楚数字化运营对金融机构发展有什么影响&#xff1f; 不知道如何提升金融机构数字化运营能力&#xff1f; 不知道金融机构如何开展数字化运营工作&#xff1f; 课程特色&#xff1a;…...

一、C#冒泡排序算法

一、C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法&#xff0c;它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大&#xff08;或最小&#xff09;的元素逐步"冒泡"到数列的末尾。 实现原理 冒泡排序是一种简单的排序算法&#xff0c;其…...

docker部署mysql5

1. 进入面板 2. 新建挂载文件夹 新建三个文件夹: mkdir -p /docker/mysql5/config && mkdir -p /docker/mysql5/data && mkdir -p /docker/mysql5/logsconfig&#xff1a;存放mysql配置data&#xff1a;存放mysql数据logs&#xff1a;存放mysql记录日志 3.…...

Github 2024-03-15 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9非开发语言项目1TypeScript项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量…...

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…...

编码技巧:多条件判断拼接字符串

在写代码业务逻辑的时候&#xff0c;有时候需求稍微变化一下都让代码变的很麻烦&#xff0c;如果只在现有代码基础上硬改&#xff0c;可能会让可读性降低&#xff0c;本文通过一个例子来演示字符串拼接的变化。 一开始的业务逻辑比较简单&#xff0c;是固定条件加一个需要判断…...

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…...

这个不需要吗 HttpServletRequest req

这个不需要吗 HttpServletRequest req 在这个特定场景下&#xff0c;您在OnlineStudentFeignService接口中确实不需要直接使用HttpServletRequest对象。因为Feign是一个声明式的HTTP客户端&#xff0c;它的设计目标是简化服务间的远程调用&#xff0c;它并不直接处理原始的HTT…...

【算法与数据结构】深入解析二叉树(一)

文章目录 &#x1f4dd;数概念及结构&#x1f320; 树的概念&#x1f309;树的表示&#x1f320; 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; &#x1f309;二叉树概念及结构&#x1f320;概念&#x1f309;数据结构中的二叉树&#x1f320;特殊的二叉…...

深入浅出:Objective-C中使用MWFeedParser下载豆瓣RSS

摘要 本文旨在介绍如何在Objective-C中使用MWFeedParser库下载豆瓣RSS内容&#xff0c;同时展示如何通过爬虫代理IP技术和多线程提高爬虫的效率和安全性。 背景 随着信息量的激增&#xff0c;爬虫技术成为了获取和处理大量网络数据的重要手段。Objective-C作为一种成熟的编程…...

Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息&#xff0c;甚至记录程序正常运行的关键步骤&#xff0c;以便日后查看&#xff0c;那么该如何处理呢? 答:显然&#xff0c;可以自行编程实现这个需求&#xff0c;但是&#xff0c;从更注重效率和性能的方面考虑&#x…...

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…...

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…...

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用

初识ts 基本了解 设计者&#xff0c;实现者&#xff1a;微软发行时间&#xff1a;2012年10月1日GitHub&#xff1a;https://github.com/microsoft/TypeScriptts和js关系&#xff1a;ts是js的扩展&#xff0c;ts语法包含js ts是新语言吗&#xff1f; 不是&#xff0c;在js基…...

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…...

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS&#xff08;Quality of Service&#xff09;等级&#xff0c;用于确保消息的可靠性和传输效率。本文将详细…...

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…...

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.fileprometheus.yml --web.listen-address:5555 Prometheus 默认监听端口号为 9090&#xff0c;为了不与系统上的其它进程监听端口冲突&#xff0c;我们在启动…...

(delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )

7.1.4 创建对象 ​ 与其他流行的编程语言比较之后&#xff0c;让我们回到 Pascal&#xff0c;看看如何使用类。 ​ 一旦定义了类&#xff0c;我们就可以创建一个该类型的对象&#xff0c;代码片段如下&#xff08;本节所有代码提取自 Dates1 示例&#xff09;那样&#xff1a…...

unity学习笔记 Restsharp 使用心得

Restsharp Restsharp安装使用注意事项api方式的流式调用--子线程中执行代码无响应的问题问题描述问题解决其他问题 Restsharp 安装 可以在github上下载dll文件然后导入到unity中 https://github.com/adrenak/RestSharp.Unity 也可以百度直接搜Restsharp然后下载相关的文件导入…...

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…...

Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码

Python&#xff1a;自动化处理PDF文档集合&#xff0c;提取文献标题、合并文献PDF并生成目录和页码 引言&#xff1a;功能概述步骤一&#xff1a;提取PDF标题步骤二&#xff1a;生成目录和页码&#xff0c;合并PDF技术亮点 代码步骤一&#xff1a;提取PDF标题&#xff08;Step_…...