一步一步从asp.net core mvc中访问asp.net core WebApi
"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何搭建asp.net core webapi,因为前面有好几篇博文都已经讲到它了。这里我们重点要说的是如何使用.net core mvc来访问webapi。
注明:我这里使用的是vs2022 17.11.5版,使用了newtonsofot.json做解析,使用了SqlSugar数据库orm框架。
文章目录
- 一、准备webapi
- 1、准备模型
- 2、准备控制器(api端)
- 二、.net web MVC端的设计
- 1、controller控制器的设计
- 2、viewer视图页的设计
- 三、program的配置
- (一)、关于httpclient
- 1.`System.Net.Http.HttpClient`服务的作用
- 2. 在访问Web API过程中的作用
- (二)、program.cs配置httpclient
- 四、展示信息的视图页
- 1、将控制器数据传递给视图的原理
- 2、传递给视图的两种方法
- a、粗暴显示
- b、使用Viewbag和viewdata
- b、使用模型
请关注文章原出处: https://haigear.blog.csdn.net/article/details/143609860
一、准备webapi
1、准备模型
webapi的模型我们这里准备好了,模型类的代码中我们简单的设置了四个属性,如下代码:
[SugarTable("Book")]public class Book{[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public string ?Context { get; set; }public string ?Desc { get; set; }public bool Status { get; set; }}
如果你想像我一样偷懒,让ID号为自增长类型,而且是主键的话,记得加上这句话
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
如果拆成两句话来说:[SugarColumn(IsIdentity = true)] 表示设置为自增,[SugarColumn(IsPrimaryKey = true)] 表示设置为主键。不要忘记设置了,否则在你提交的表单中如果id为空,数据库就不会自己为你补上,那么你的主键的唯一性就会导致报错,因为你的id号肯定会在第二条记录加入的时候就开始重复。
2、准备控制器(api端)
api端的控制器主要是负责接受mvc端发送的get、put、delete、update四种请求的,少一个咱们的请求都会找不到对应负责的“部门”来服务,所以咱们都把他们实现一次,代码如下:
using Microsoft.AspNetCore.Mvc;
using WEBAPI.Models;namespace WEBAPI.Controllers
{[Route("api/[controller]")][ApiController]public class BookController : ControllerBase{private readonly QbusterContext _context;public BookController(QbusterContext context){_context = context;}// 获取所有书本[HttpGet]public IActionResult GetBooks(){var books = _context.Db.Queryable<Book>().ToList();return Ok(books);}// 添加书本[HttpPost]public IActionResult AddBook(Book book){ _context.Db.Insertable(book).ExecuteCommand();return Ok(book.Id);}// 更新书本[HttpPut]public IActionResult UpdateBook(Book book){_context.Db.Updateable(book).ExecuteCommand();return Ok();}[HttpGet("{id}")]public IActionResult GetBookById(int id){// 在这里实现获取特定Book的逻辑var book = _context.Db.Queryable<Book>().Where(b => b.Id == id).First();if (book == null){return NotFound();}return Ok(book);}// 删除书本[HttpDelete("{id}")]public IActionResult DeleteBook(int id){_context.Db.Deleteable<Book>(id).ExecuteCommand();return Ok();}}
}
请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860
二、.net web MVC端的设计
这里应该是我们的重点章节了,我们在设计之前应该很清楚一点,那就是我们的MVC其实可以是没有Model部分的,为什么呢?因为我们的数据来自API端,当然,你也可以设计一个完全和API端一模一样的模型。其实,我们完全可以直接将API的model直接引入即可(假定你是可以拿到api的dll,或者api和MVC就是在一台机器开发的话)。
1、controller控制器的设计
我们来看最基础最基本的控制器,这个控制器仅仅实现的就是在index方法中利用httpclient发送一个get请求的指令的功能:
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using QBuster_API.Models;namespace WebAppToAPI.Controllers
{public class BookController : Controller{private readonly HttpClient _httpClient;public BookController(HttpClient httpClient){_httpClient = httpClient;}public async Task<IActionResult> Index(){var response = await _httpClient.GetAsync("http://localhost:5049/api/Book");if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();// 处理返回的数据return View();}else{// 处理错误情况return BadRequest();}}}
}
如果我们单独在浏览器中访问api的地址:http://localhost:5049/api/Book我们会得到下面的返回结果,这些也正是我们要最后要呈现在视图中的内容。
如果我们的控制器没有问题,将来控制器的content中就可以通过断点看到上面的内容,也就是这句话中:
var content = await response.Content.ReadAsStringAsync();
这句话完成了读取工作。
2、viewer视图页的设计
上面我们的控制器应该算作是完成了它的使命,拿到了从api请求过来的数据了。接下来就要看视图的了。视图的工作就是把上面的内容显示在页面上。这里我们只为展示原理,所以,我们一开始并不需要在视图文件中写过多少内容进去。先看看它是否能够运行,首先我们建立一个新的视图页面,名称和控制器中的index方法名一致,也叫做index.cshtml:
@*For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{}<p>这访问api的测试页面</p>
特别简单,我们的目的就是让它能够无错误的显示即可。运行试试:
哦豁,不那么简单吧。其实也简单,问题出在没有在program中配置好httpclient而已。
请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860
三、program的配置
前面两个章节只是完成了基本的“基础”准备,剩下的就是我们如何通过配置来使其可以正常访问。
要想访问api,我们这里就必须在program.cs中注册httpclient服务,否则无法解析 System.Net.Http.HttpClient 类型的服务。
(一)、关于httpclient
这里索性就把httpclient介绍一下,避免我们有小白路过因不了解它而迷路(开玩笑)。
1.System.Net.Http.HttpClient
服务的作用
- 发送HTTP请求:
HttpClient
是用于发送HTTP请求的主要工具。它可以发送各种类型的HTTP请求,如GET
、POST
、PUT
、DELETE
等。例如,在一个简单的场景中,如果要从一个新闻网站获取新闻数据,你可以使用HttpClient
发送一个GET
请求到新闻网站的API端点。- 它提供了一种简单且灵活的方式来构建和发送请求。可以通过设置请求头(Headers)来指定诸如内容类型(
Content - Type
)、授权信息(如Authorization
)等。例如,在访问需要身份验证的API时,可以在请求头中添加身份验证令牌,如下所示:
var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_token");
- 处理HTTP响应:
- 当发送请求后,
HttpClient
会接收并处理HTTP响应。它可以获取响应状态码(如200 OK
、404 Not Found
、500 Internal Server Error
等),这对于判断请求是否成功非常重要。例如,如果响应状态码是200
,表示请求成功,你可以继续处理响应内容。 - 可以读取响应内容,响应内容可以是多种格式,如JSON、XML、纯文本等。如果响应是JSON格式的数据,你可以使用
System.Text.Json
(在.NET中)等库将其反序列化,例如:
var response = await client.GetAsync("https://api.example.com/data"); if (response.IsSuccessStatusCode) {var content = await response.Content.ReadAsStringAsync();var data = System.Text.Json.JsonSerializer.Deserialize<YourDataType>(content); }
- 当发送请求后,
2. 在访问Web API过程中的作用
- 建立连接和通信:
- 它是客户端(如ASP.NET Core MVC应用)和Web API之间建立通信的桥梁。当应用需要从Web API获取数据(如获取用户信息、产品列表等)或者向Web API发送数据(如提交订单、更新用户资料等)时,
HttpClient
负责发起请求并等待响应。
- 它是客户端(如ASP.NET Core MVC应用)和Web API之间建立通信的桥梁。当应用需要从Web API获取数据(如获取用户信息、产品列表等)或者向Web API发送数据(如提交订单、更新用户资料等)时,
- 实现请求的定制化:
- 可以根据Web API的要求定制请求。例如,有些Web API可能要求在请求头中包含特定的版本号或者自定义的元数据。
HttpClient
可以轻松地设置这些请求头来满足API的要求。 - 对于
POST
和PUT
请求,可以设置请求体(RequestBody)的内容。如果要向Web API发送一个新的用户注册信息,HttpClient
可以将包含用户姓名、密码等信息的对象序列化为JSON格式(或其他格式)并作为请求体发送,如下所示:
var user = new User {Name = "John Doe",Password = "password123" }; var json = System.Text.Json.JsonSerializer.Serialize(user); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync("https://api.example.com/users", content);
- 可以根据Web API的要求定制请求。例如,有些Web API可能要求在请求头中包含特定的版本号或者自定义的元数据。
- 错误处理和重试机制:
- 当请求出现错误时,如网络故障或者API返回错误状态码,
HttpClient
可以作为基础来构建错误处理机制。可以根据响应状态码来采取不同的措施,如显示友好的错误信息给用户或者进行重试。 - 例如,可以在收到
401 Unauthorized
状态码时,提示用户重新登录,或者在收到500 Internal Server Error
状态码时,等待一段时间后进行重试。
- 当请求出现错误时,如网络故障或者API返回错误状态码,
(二)、program.cs配置httpclient
我们还清楚的记得,上面我们在写好控制器后并不能成功的访问我们的api端。为什么呢?就是这里没有配置好httpclient。下面是配置的代码:
//前面省去五万字
builder.Services.AddControllersWithViews();
builder.Services.AddHttpClient("MyHttpClient", client =>
{client.BaseAddress = new Uri("http://localhost:80000/api");
});
var app = builder.Build();
//后面省去五万字
配置好后,我们就可以来访问了。看看效果:
是的,就是要的这个效果,尽管它比较简单。所以,我们接下来就可以考虑将从api上获取的数据完整的显示在页面上了。认认真真的设计一个视图。
请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860
四、展示信息的视图页
1、将控制器数据传递给视图的原理
在ASP.NET Core MVC 中,从控制器传递数据到视图有多种方法。在上述代码中,你可以将content数据存储在一个视图模型(ViewModel)或者ViewBag/ViewData中,然后在视图中访问它。为了小白能够流畅阅读后面的内容,这里首先介绍一下他们两个吧。
ViewBag
和ViewData
在ASP.NET Core MVC中的位置和本质ViewBag
和ViewData
是ASP.NET Core MVC框架提供的用于在控制器和视图之间传递数据的机制。作用就是为MVC框架内部的对象来管理数据传递。ViewData
的底层实现ViewData
是一个ViewDataDictionary
类型的对象,它本质上是一个字典,用于存储键值对。在ASP.NET Core MVC的内部机制中,它是在控制器和视图之间传递数据的基础结构之一。- 这个字典存储的数据可以是各种类型,如字符串、整数、对象等。当控制器将数据存储在
ViewData
中时,实际上是将数据作为键值对添加到ViewDataDictionary
中。例如,在控制器中这样操作:
public IActionResult Index() {ViewData["Message"] = "Hello, World!";return View(); }
- 这里
ViewData
存储了一个键为Message
,值为Hello, World!
的键值对。
ViewBag
的底层实现和与ViewData
的关系ViewBag
是一个动态类型的属性,它在底层是基于ViewData
实现的。当你访问ViewBag
的属性时,实际上是在访问ViewDataDictionary
中的元素。- ASP.NET Core MVC利用C#的动态语言特性,让
ViewBag
看起来像是一个具有动态属性的对象。例如,在控制器中:
public IActionResult Index() {ViewBag.Message = "Hello, World!";return View(); }
- 这与使用
ViewData
的效果是类似的,在底层,ViewBag.Message
的赋值操作实际上是在ViewDataDictionary
中添加一个键为Message
的值。不过,由于ViewBag
是动态类型,没有编译时检查,所以在使用过程中需要更加小心,避免运行时的类型错误。
- 它们在MVC框架中的作用位置
- 在控制器中,数据被添加到
ViewData
或ViewBag
中,然后在视图渲染过程中,MVC视图引擎(如Razor视图引擎)会读取这些数据。当视图(.cshtml
文件)被渲染时,它可以访问存储在ViewData
或ViewBag
中的数据,从而实现控制器到视图的数据传递。例如,在Razor视图中:
@ViewData["Message"] 或者 @ViewBag.Message
- 这样就可以获取控制器传递过来的数据并在视图中显示出来。它们是MVC框架中用于在不同层次(控制器和视图)之间灵活传递数据的工具,是框架设计的一部分,没有存储在特定的文件中,而是在请求处理和视图渲染的过程中发挥作用。
- 在控制器中,数据被添加到
2、传递给视图的两种方法
a、粗暴显示
视图页中,我们就直接粗暴的拿来用,强制将各种字段类型转化为string来显示。只要将控制器中的content直接作为view的参数返回给视图即可,代码如下:
var content = await response.Content.ReadAsStringAsync();
return View(content);
既然是粗暴的行为,那结果自然是惨不忍睹,就会出现报错,但能够看到数据显示:
看来我们还是得文明一点,做个有文化的文明人啊。
b、使用Viewbag和viewdata
使用他们就显得文明一些,毕竟他们是asp.net core内置的传递工具,官方的人啊,我们来看代码:
在控制器中,将content首先装入viewbag中
public async Task<IActionResult> Index()
{var response = await _httpClient.GetAsync("https://example.com/api/data");if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();ViewBag.Content = content;return View();}else{// 处理错误情况return BadRequest();}
}
然后在视图页中显示,页面代码如下:
<div>@ViewBag.Content
</div>
果然文明了些,但是还差一点“优雅”,这里我们来给视图的代码给修改一下:
@using QBuster_API.Models;
<!DOCTYPE html>
<html>
<head><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head><body><div class="container">@if (!string.IsNullOrEmpty(ViewBag.Content)){var data = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Book>>(ViewBag.Content);<table class="table table-striped"><thead><tr><!-- 根据你的数据结构替换以下表头 --><th>内容</th><th>描述</th><th>状态</th><!-- 添加更多表头 --></tr></thead><tbody>@foreach (var item in data){<tr><!-- 根据你的数据结构替换以下表格内容 --><td>@item.Context</td><td>>@item.Desc</td><td>>@item.Status</td><!-- 添加更多表格内容 --></tr>}</tbody></table>}</div><script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script><script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script><script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body></html>
算了,上面的这种Viewbag的方式也就这样了。来看看使用模型的方式吧。
b、使用模型
使用模型是最好的选择,但最不方便,需要你建立一个视图,当然,我们首先还是在控制器中修改一下代码,主要是将content装入视图中:
public async Task<IActionResult> Index()
{var response = await _httpClient.GetAsync("https://localhost/api/data");if (response.IsSuccessStatusCode){var content = await response.Content.ReadAsStringAsync();var viewModel = new BookViewModel{Content = content};return View(viewModel);}else{// 处理错误情况return BadRequest();}
}
为了省事,我们把模型类(最简单的模型类)偷偷的丢在了控制器后面(和控制器同一个文件)
public class MyViewModel{private string _content;public string Content{get { return _content; }set{if (value == null){throw new ArgumentNullException("Content不能为null");}_content = value;}}
然后就是我们的视图页面了。首先看个粗暴一些的,这和前面的Viewbag的效果一样,视图也的代码:
@using WebAppToAPI.Controllers;
@model MyViewModel;
<div>@Model.Content
</div>
注意,这里要引入controller文件夹,不然MyViewModel
运行效果:
要美化一下,列成表格,方法和Viewbag的做法一样,这里就不赘述了。
好了,感兴趣的同学可以继续关注我的博客。文章可能随时更新,请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860
相关文章:
一步一步从asp.net core mvc中访问asp.net core WebApi
"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何…...
linux中kubectl命令使用
一.命令介绍 kubectl 是 Kubernetes 集群管理的命令行工具,用于与 Kubernetes API 交互。你可以通过它来管理和操作 Kubernetes 集群中的资源,如 Pod、Deployment、Service 等。下面是如何在不同操作系统上下载和使用 kubectl 的方法。 二.下载 kubect…...
Linux 系统结构
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心,具有很多最基本功能,它…...
ESP32-S3设备智能化升级,物联网无线AI语音交互,让生活更加便捷和有趣
在人工智能和物联网技术的推动下,无线AI语音交互技术正在成为智能设备的新选择。这种技术的发展,不仅改变了我们与设备的沟通方式,更开启了一个新的智能交互方案。 想象一下,通过简单的语音指令,就能控制家中的灯光、…...
Python的函数(补充浅拷贝和深拷贝)
一、定义 函数的定义:实现【特定功能】的代码块。 形参:函数定义时的参数,没有实际意义 实参:函数调用/使用时的参数,有实际意义 函数的作用: 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…...
oracle查询字段类型长度等字段信息
1.查询oracle数据库的字符集 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER NLS_CHARACTERSET; 2.查询字段长度类型 SELECT * FROM user_tab_columns WHERE table_name user AND COLUMN_NAME SNAME 请确保将user替换为您想要查询的表名。sname为字段名 这里的字…...
C语言 | Leetcode C语言题解之第559题N叉树的最大深度
题目: 题解: /*** Definition for a Node.* struct Node {* int val;* int numChildren;* struct Node** children;* };*/int maxDepth(struct Node* root) {if (!root) {return 0;}int depth 0;// 创建空队列const int qCap 10e4 1;str…...
光流法(Optical Flow)
一、简介 光流法(Optical Flow)是一种用于检测图像序列中像素运动的计算机视觉技术。其基于以下假设: 1.亮度恒定性假设:物体在运动过程中,其像素值在不同帧中保持不变。 2.空间和时间上的连续性:相邻像素之…...
Rancher的安装
1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面(GUI)。对于不熟悉 Kubernetes 复杂的命令行操作(如使用kubectl)的用户来说,通过 Rancher 的界面可以方便地进行资源管理。例如,用户可以在…...
【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备
【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备 通过路由器的后台,查看当前在线设备,受到网卡版本的影响,有时会有部分设备看不见MAC和分配的IP。此时,可以借助命令行工具扫描子网下所有连…...
Ubuntu22.04安装DataEase
看到DataEase的驾驶舱,感觉比PowerBI要好用一点,于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候,没有顺手设置IP地址信息ÿ…...
Taro React-Native IOS 打包发布
http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…...
【卷积神经网络CNN】基于深度学习动物图像识别系统(完整系统源码+数据库+开发笔记+详细部署教程+启动教程)✅
目录 【卷积神经网络CNN】基于深度学习动物图像识别系统(完整系统源码数据库开发笔记详细部署教程启动教程)✅ 一、项目背景 二、项目目标 三、项目创新点 四、项目功能 五、开发技术介绍 六、数据库设计 七、启动步骤 八、项目功能展示 九、开…...
图像处理椒盐噪声
椒盐噪声,也称为脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。这些白点和黑点会在图像中随机分布,导致图像中…...
推荐一款完全开源的多端仓库管理系统
简介 模块 安装 UI展示 开源地址 今天给大家介绍一款完全开源的仓库管理系统,本系统采用Python语言开发。 简介 该库存管理系统是目前福特亚太区售后物流仓储供应链流程。离开福特后,开始了这个项目。为了帮助一些有需要的人。OneAPP 理念。支持扫…...
python 爬虫 入门 六、Selenium
Selenium本来是一个自动测试工具,用于模拟用户对网站进行操作。在爬虫领域也有其用处。 一、下载安装Selenium及附属插件 pip install Selenium 安装完成后还需要安装一个浏览器驱动,来让python能启动浏览器。 如果是Edge或者其他基于Chromium的浏览器…...
ReactPress:重塑内容管理的未来
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,欢迎一起共建,感谢Star。 ReactPress:重塑内容管理的未来 在当今信息爆炸的时代,一个高效、易用的内容管理系统࿰…...
w035基于web的学科竞赛管理
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件࿰…...
Java:JVM
1.JVM内存区域的划分 一个Java写的程序跑起来,就得到了一个Java进程 JVM 上面运行的字节码指令; 进程:操作系统资源分配的基本单位; 内存区域的划分: 1.程序计数器 在内存空间里(比较小的空间),保存了下一个要执行的指令的内存地址(元数据区的地址); 这里的"下一条…...
Windows下mysql数据库备份策略
Windows下mysql的增量备份和全量备份,并利用schtasks设置定时任务执行bat脚本。 一、备份要求 序号 备份类型 备份频次 备份时间 1 增量备份 每周一-每周六各一次 18:00:00 2 全量备份 每周日一次 18:00:00 二、备份方法 2.1增量备份 2.1.1准备工作…...
基于SSM的校园美食交流系统【附源码】
基于SSM的校园美食交流系统 效果如下: 管理员主页面 用户主页面 美食信息页面 美食资讯页面 修改密码页面 论坛中心页面 研究背景 随着高校信息化建设的不断推进,校园生活日益丰富多样,学生对于美食的需求与探索也愈发旺盛。然而ÿ…...
2024 年Postman 导入和导出 cURL 命令图文教程
Postman 导入和导出 cURL 命令图文教程...
ArcGIS从Excel表格文件导入XY数据并定义坐标系与投影的方法
本文介绍在ArcMap软件中,从Excel表格文件中批量导入坐标点数据,将其保存为.shp矢量格式,并定义坐标系、转为投影坐标系的方法。 已知我们有一个Excel表格文件(可以是.xls、.xlsx、.csv等多种不同的表格文件格式)&#…...
【vue】echarts地图添加蒙版图片,多图层地图实现天气信息展示
实现原理:多层图层叠加实现复杂的信息展示。 <template><div class"wrapper"><el-drawertitle"天气信息":modal"iszz":visible.sync"weatherinfo":direction"direction"><drawer:labelnam…...
MyBatis几种SQL写法
目录 1. 批量操作:通过标签支持批量插入 2. 批量操作:通过标签支持批量更新 3. 批量操作:通过标签支持批量删除 4. 动态SQL 3. 多条件分支查询 4. SQL语句优化:使用标签避免多余的AND或OR关键字。 5. 注解方式使用MyBatis 6. 一对多 7. 多对一&…...
蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】
目录 1:HAA9809特性 2:典型应用电路 3:CTRL管脚控制信息 4:一线脉冲控制方式 5:输入电阻,调节放大增益 6:输入电容,调节频响 7:总结 矽源特ChipSourceTek-HAA9809…...
Webpack知识点—publicPath
文章目录 一、publicPath的定义和作用二、publicPath的配置方式三、publicPath的注意事项四、publicPath的常见问题和解决方法五、Vite 如何修改publicPathWebpack的publicPath是一个重要的配置项,它用于指定打包后生成的静态资源文件在浏览器中的访问路径。 一、publicPath的…...
【JAVA】Java基础—面向对象编程:构造方法的重载
在Java中,构造方法的重载允许一个类定义多个构造方法,这些构造方法可以具有不同的参数列表。通过构造方法的重载,我们可以根据不同的需求创建对象,并以不同的方式初始化对象的属性。 我们可以将构造方法的重载比作一个餐厅的菜单…...
科研绘图系列:R语言多图形组合(barplot boxplot stacked plots)
文章目录 介绍加载R包数据下载图:Barplot图:Boxplot per elemental composition图:网络的边数目图:Clusters - elemental composition合并图形系统信息介绍 R语言多个图形组合 加载R包 library(tidyverse) library(ggpubr) library(rstatix) library(patchwork)数据下载…...
诡异的win11远程桌面连接一闪而过
客户端win10,服务器端是win2019 上面的仅允许允许使用网络级别身份验证的也勾掉了。 mstsc和mstsc -admin远程桌面连接,输入ip点连接后闪退,根本不弹出用户密码输入。但有人也是win10却可以连,也不知道自己的win10有啥差异的地方。…...
网站设计协议/软文营销
绿地,是城市景观中的的重要部分一些精心设计的绿地铺装往往能够给公共空间增添意想不到的灵动甚至起到整体风格的定型作用人造草坪铺装效果,除了取决于人造草坪质量本身,还取决于铺装的场地基础、铺装各环节的操作正确性。好的铺装操作&#…...
wordpress 图片质量/全网软文推广
为什么80%的码农都做不了架构师?>>> http://www.mkyong.com/eclipse/eclipse-ide-tomcat-version-6-0-only-supports-j2ee-1-2-1-3-1-4-and-java-ee-5-web-modules/ 转载于:https://my.oschina.net/macleo/blog/149586...
风机网站怎么做/故事式软文广告300字
原文地址:http://blog.csdn.net/totogo2010/article/details/8016129 介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行…...
深圳网站搭建费用/足球比赛今日最新推荐
集群部署完后,无法进去pod, 执行 kubectl exec -it ngx – sh ,报如下的错误 error: unable to upgrade connection: pod does not exist查看pod 的执行状态, 状态是running kubectl get pod -o wide查看pod 的详细情况, 也都正常,任务调度正常 kubec…...
新能源网站建设/百度权重排名查询
断断续续的读《梦断代码》这本书竟然读了这些日子很是惭愧因为时间一长有些东西就会忘记,好在这本书是向读者灌输思想的一本书,不是一本小说,也不是一本记叙文章,不必从头再来只需要翻开往日的阅读笔记看看自己的收获就行了&#…...
哪个网站专门做灵异文/新产品宣传推广策划方案
360主机卫士 for Linux是专为CentOS、Ubuntu、Redhat等操作系统打造的安全辅静默工具,可以有效地保护服务器的安装,让网站处门无处可藏,兼容Apache、Nginx等系列的服务器环境。360主机卫士linux安装教程:1.1 必要环境1)curl (通过…...