【AJAX】XMLHttpRequest、Promise 與 axios的關系

目錄

一、AJAX原理 —— XMLHttpRequest

1.1 使用XMLHttpRequest

二、 XMLHttpRequest - 查詢參數 (就是往服務器后面拼接要查詢的字符串)

三、 地區查詢

四、 XMLHttpRequest - 數據提交

五、 認識Promise

5.1 為什么 JavaScript 需要異步?

5.2 Promiss - 三種狀態

5.3 使用Promiss + XHM 獲取省份列表

六、 封裝簡易的axios——獲取省份列表

七、 注冊賬號——支持傳遞請求體數據 data選項

總結不易~ 本章節對我有很大的收獲,希望對你也是!!!


本節素材已上傳至Gitee:https://gitee.com/liu-yihao-hhh/ajax_studyhttps://gitee.com/liu-yihao-hhh/ajax_study

一、AJAX原理 —— XMLHttpRequest

定義

XMLHttpRequest(XHR) 對象用于與服務器交互。通過XMLHttpRequst可以再不刷新頁面的情況下請求特定URL,獲取數據。這允許網頁在不影響用戶操作的情況下,更新頁面的局部內容。XMLHttpRequest在AJAX編程中被大量使用。

與axios的關系: axios內部采用XMLHttpRequest 與服務器交互

1.1 使用XMLHttpRequest

  1. 創建XMLHttpRequest對象
  2. 配置請求方法和請求url地址
  3. 監聽loadend事件,接受響應結果
  4. 發起請求
    const xhr = new XMLHttpRequest()xhr.open('請求方法', '請求url網址')xhr.addEventListener('loadend', () => {// 接受 - 響應結果console.log(xhr.response)})// 發送 - 請求xhr.send()

XMLHttpRequest基礎使用,獲取服務器的數據并展示

    // 1. 創建一個XMR對象const xhr = new XMLHttpRequest()// 2. 配置請求方法和請求url地址xhr.open('GET', 'http://hmajax.itheima.net/api/province')// 3. 監聽 loadend事件 接收響應結果xhr.addEventListener('loadend', () => {console.log(xhr.response) // 這里返回的是json字符串// json字符串轉對象const data = JSON.parse(xhr.response)console.log(data.list.join('<br>')) // 數組轉字符串進行拼接document.querySelector('.my-p').innerHTML = data.list.join('<br>')})// 4. 發起請求xhr.send()

二、 XMLHttpRequest - 查詢參數 (就是往服務器后面拼接要查詢的字符串)

定義: 瀏覽器提供給服務器的額外信息, 讓服務器返回瀏覽器想要的數據

    /*** 目標:使用XHR攜帶查詢參數,展示某個省下屬的城市列表*/const xhr = new XMLHttpRequest()// 進行查詢 往服務器后面進行拼接查詢的參數名 ?pname=xhr.open('GET', 'http://hmajax.itheima.net/api/city?pname=遼寧省')// loadend 加載結束事件xhr.addEventListener('loadend', () => {console.log(xhr.response)const data = JSON.parse(xhr.response)console.log(data.list)document.querySelector('.city-p').innerHTML = data.list.join('<br>')})xhr.send()

三、 地區查詢

這一個案例就是要我們同時傳入兩個參數,但是我們不方便自己獲取兩個參數后拼接到url后面,這個時候,我們就可以采用瀏覽器內置的構造函數URLSearchParams 來創建一個對象,里面放入我們需要傳入URL的對象參數,他就會自動給我們返回一個url編碼的字符串,我們就可以直接在url后面進行拼接? ?+編碼即可

    /*** 目標: 根據省份和城市名字, 查詢對應的地區列表*/// 1. 給查詢按鈕綁定一個點擊事件document.querySelector('.sel-btn').addEventListener('click', () => {// 2. 收集省份和城市名字const pname = document.querySelector('.province').valueconst cname = document.querySelector('.city').value// 3. 組織查詢參數字符串const qObj = {pname,cname}// 查詢參數對象 -》 查詢參數字符串// 瀏覽器內置的構造函數// 1. 創建 URLSearchParams 對象 自動將我們需要的多個查詢對象轉換成一個字符串 好方便后續的拼接const paramsObj = new URLSearchParams(qObj)const queryString = paramsObj.toString()console.log(queryString) // 拿到一個url編碼 pname=%E6%B9%96%E5%8C%97&cname=%E6%AD%A6%E6%B1%89%E5%B8%82 // 4. 使用XHR對象, 查詢地區列表const xhr = new XMLHttpRequest()xhr.open('GET', `http://hmajax.itheima.net/api/area?${queryString}`)// loadend 加載結束事件xhr.addEventListener('loadend', () => {console.log(xhr.response)const data = JSON.parse(xhr.response)console.log(data)const htmlStr = data.list.map(item => {return `<li class="list-group-item">${item}</li>`})console.log(htmlStr)const html = htmlStr.join('<br>')document.querySelector('.list-group').innerHTML = html})xhr.send()})

四、 XMLHttpRequest - 數據提交

需求: 通過XHR提交用戶名和密碼,完成注冊功能

核心: 請求頭設置Content-Type:application/json

請求體攜帶JSON字符串

?提交數據就是在xhr.send()中進行提交,但是要提前設置請求頭,告訴服務器我們提交的數據是JSON數據

? ? ? xhr.setRequestHeader('Content-Type', 'application/json')

?準備好要進行提交的數據之后,就將該數據轉換成JSON字符串直接進行提交即可!

    /*** 目標:使用xhr進行數據提交-完成注冊功能*/// 后端的數據提交 http://hmajax.itheima.net/api/register// 請求參數 body application/jsondocument.querySelector('.reg-btn').addEventListener('click', () => {const xhr = new XMLHttpRequest()xhr.open('POST', 'http://hmajax.itheima.net/api/register')xhr.addEventListener('loadend', () => {console.log(xhr.response)})// 設置請求頭 - 告訴服務器內容類型(JSON字符串)xhr.setRequestHeader('Content-Type', 'application/json')// 準備提交的數據const userObj = {username: '我是hhhhha',password: '11111111'}const userStr = JSON.stringify(userObj)console.log(userStr)// 設置請求體 發送請求xhr.send(userStr)})

五、 認識Promise

定義: Promise對象用于表示一個異步操作的最終完成(或失敗)及其結果值

  • 同步方式:你站在門口等外賣員送來,什么事都不干,一直等著。

  • 異步方式:你點完外賣,繼續干別的事(比如學習/打游戲),等外賣來了,電話通知你,然后你去取。

5.1 為什么 JavaScript 需要異步?

因為 JavaScript 是 單線程的(同一時間只能做一件事),如果你在執行一個耗時操作(比如網絡請求、讀取大文件),同步寫法會卡住整個頁面,用戶無法點擊、無法操作,非常糟糕。異步寫法可以把“耗時的事”交給瀏覽器處理,不阻塞主線程,頁面流暢運行

Promise語法

    // 1. 創建Promise對象const p = new Promise((resolve, reject) => {// 2. 執行異步任務 并傳遞結果// 成功調用: resolve(值) 觸發then()執行// 失敗調用: reject(值) 觸發catch()執行})// 3. 接收結果p.then(result => {// 成功}).catch(error => {// 失敗})

學了Promise后, 會更好的理解axios?, 能夠解決回調函數地獄的問題

創建Promise對象后傳入的兩個參數都是函數,但是二者分別是表示成功時調用的函數 和 失敗時調用的函數,等待定時器異步操作完成后,屏幕會輸出函數傳入的字符

    // 1. 創建Promise對象// 參數名	類型	作用// resolve	函數	表示成功時調用,用來傳遞“成功的結果”// reject	函數	表示失敗時調用,用來傳遞“失敗的原因”const p = new Promise((resolve, reject) => {// 2. 執行異步操作setTimeout(() => {resolve('模擬AJAX請求-成功的結果')// reject(new Error('模擬AJAX請求-失敗的結果'))}, 2000)})// 3. 獲取結果p.then(result => {console.log(result)}).catch(error => {console.log(error)})

5.2 Promiss - 三種狀態

一個Promiss對象,必然處于一下的一種狀態:

待定(pending)? new Promiss(): 初始狀態, 既沒有被兌現,也沒有被拒絕

已兌現(fulfilled) .then(回調函數):意味著,操作成功完成

已拒絕(rejected) .catch(回調函數): 意味著操作失敗

請求成功時,是fulfilled狀態,觸發.then()

請求失敗時,是rejected狀態, 觸發.catch()

5.3 使用Promiss + XHM 獲取省份列表

當發送請求錯誤的時候 將error.message錯誤信息渲染到屏幕上

六、 封裝簡易的axios——獲取省份列表

通過myAxios傳入的對象參數進行接收,默認是GET選項

  1. 創建Promise對象
  2. 發起XHR請求,默認是GET
  3. 進行xhr.open設置請求方法和地址,來為發送請求做準備
  4. loadend 是在請求完成后觸發,來進行發揮成功或者失敗的函數
  5. xhr.status 是服務器響應狀態,xhr.response 是服務器響應內容
  6. xhr.send()正式發起請求到服務器?
  <p class="my-p"></p><script>/*** 目標:封裝_簡易axios函數_獲取省份列表*  1. 定義myAxios函數,接收配置對象,返回Promise對象*  2. 發起XHR請求,默認請求方法為GET*  3. 調用成功/失敗的處理程序*  4. 使用myAxios函數,獲取省份列表展示*/// 1. 定義myAxios函數,接收配置對象,返回Promise對象function myAxios(config) {return new Promise((resolve, reject) => {// 2. 發起XHR請求 默認是getconst xhr = new XMLHttpRequest()// open 設置請求的方法和地址,為發送請求做準備xhr.open(config.method || 'GET', config.url)//  loadend 是在 請求完成 (不管成功還是失敗)時觸發的事件,用來統一處理響應結果。xhr.addEventListener('loadend', () => {// 3. 調用成功 / 失敗 \// xhr.response 是服務器響應的內容。if (xhr.status >= 200 && xhr.status < 300) resolve(JSON.parse(xhr.response))else reject(new Error(xhr.response))})// 正式發起請求,把配置好的 XHR 請求發送到服務器。xhr.send()})}// 4. 使用myAxios函數 獲取省份列表myAxios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {console.log(result)document.querySelector('.my-p').innerHTML = result.list.join('<br>')}).catch(error => {console.log(error)document.querySelector('.my-p').innerHTML = error.message})</script>

修改myAxios函數,支持傳遞查詢參數,就是需要傳入params選項

        // 判斷 有 params 選項, 攜帶查詢參數if (config.params) {// 使用URLSearchParmas轉換 并攜帶到url上const paramsObj = new URLSearchParams(config.params)const queryString = paramsObj.toString()console.log(paramsObj)console.log(queryString)// 把查詢數字字符串 拼接到url?后面config.url += `?${queryString}`console.log(config.url)}

?起到查詢作用就是要根據上面學習的URLSearchParams瀏覽器內置函數來將用戶傳入的params查詢參數對象轉換成字符串來坪街道url?后面

  1. 判斷是否攜帶params對象參數
  2. 使用 URLSearchParams轉換 并攜帶到url上 此時還是一個對象關系
  3. 將paramsObj轉換成字符串queryString
  4. 進行與url拼接?
  <p class="my-p"></p><script>/*** 目標:封裝_簡易axios函數_獲取省份列表*  1. 定義myAxios函數,接收配置對象,返回Promise對象*  2. 發起XHR請求,默認請求方法為GET*  3. 調用成功/失敗的處理程序*  4. 使用myAxios函數,獲取省份列表展示*/// 1. 定義myAxios函數,接收配置對象,返回Promise對象function myAxios(config) {return new Promise((resolve, reject) => {// 2. 發起XHR請求 默認是getconst xhr = new XMLHttpRequest()// 判斷 有 params 選項, 攜帶查詢參數if (config.params) {// 使用URLSearchParmas轉換 并攜帶到url上const paramsObj = new URLSearchParams(config.params)const queryString = paramsObj.toString()console.log(paramsObj)console.log(queryString)// 把查詢數字字符串 拼接到url?后面config.url += `?${queryString}`}console.log(config.url)// open 設置請求的方法和地址,為發送請求做準備xhr.open(config.method || 'GET', config.url)//  loadend 是在 請求完成 (不管成功還是失敗)時觸發的事件,用來統一處理響應結果。xhr.addEventListener('loadend', () => {// 3. 調用成功 / 失敗 \// xhr.response 是服務器響應的內容。if (xhr.status >= 200 && xhr.status < 300) resolve(JSON.parse(xhr.response))else reject(new Error(xhr.response))})// 正式發起請求,把配置好的 XHR 請求發送到服務器。xhr.send()})}// 4. 使用myAxios函數 獲取省份列表myAxios({url: 'http://hmajax.itheima.net/api/area',params: {pname: '湖北省',cname: '武漢市'}}).then(result => {console.log(result)document.querySelector('.my-p').innerHTML = result.list.join('<br>')}).catch(error => {console.log(error)document.querySelector('.my-p').innerHTML = error.message})</script>

七、 注冊賬號——支持傳遞請求體數據 data選項

        // 判斷是否有data選項 攜帶請求體if (config.data) {// 數據轉換類型 在send中發送const jsonStr = JSON.stringify(config.data)// 請求體數據類型標記xhr.setRequestHeader('Content-Type', 'application/json')xhr.send(jsonStr)}// 正式發起請求,把配置好的 XHR 請求發送到服務器。else xhr.send()})

  1. 提交數據到服務器,用POST方法進行提交,然后攜帶data對象數據
  2. 要將data對象數據轉換成JSON字符串
  3. 標記數據傳輸到服務器的數據類型是json格式
  4. 然后正式發起請求 xhr.send(josnStr)
  <button class="reg-btn">注冊用戶</button><script>/*** 目標:封裝_簡易axios函數_獲取省份列表*  1. 定義myAxios函數,接收配置對象,返回Promise對象*  2. 發起XHR請求,默認請求方法為GET*  3. 調用成功/失敗的處理程序*  4. 使用myAxios函數,獲取省份列表展示*/// 1. 定義myAxios函數,接收配置對象,返回Promise對象function myAxios(config) {return new Promise((resolve, reject) => {// 2. 發起XHR請求 默認是getconst xhr = new XMLHttpRequest()// 判斷 有 params 選項, 攜帶查詢參數if (config.params) {// 使用URLSearchParmas轉換 并攜帶到url上const paramsObj = new URLSearchParams(config.params)const queryString = paramsObj.toString()console.log(paramsObj)console.log(queryString)// 把查詢數字字符串 拼接到url?后面config.url += `?${queryString}`}console.log(config.url)// open 設置請求的方法和地址,為發送請求做準備xhr.open(config.method || 'GET', config.url)//  loadend 是在 請求完成 (不管成功還是失敗)時觸發的事件,用來統一處理響應結果。xhr.addEventListener('loadend', () => {// 3. 調用成功 / 失敗 \// xhr.response 是服務器響應的內容。if (xhr.status >= 200 && xhr.status < 300) resolve(JSON.parse(xhr.response))else reject(new Error(xhr.response))})// 判斷是否有data選項 攜帶請求體if (config.data) {// 數據轉換類型 在send中發送const jsonStr = JSON.stringify(config.data)// 請求體數據類型標記xhr.setRequestHeader('Content-Type', 'application/json')xhr.send(jsonStr)}// 正式發起請求,把配置好的 XHR 請求發送到服務器。else xhr.send()})}document.querySelector('.reg-btn').addEventListener('click', () => {// 4. 使用myAxios函數 獲取省份列表myAxios({url: 'http://hmajax.itheima.net/api/register',method: 'POST',data: {username: 'wshhaaaaa12w~',password: '1234567'}}).then(result => {console.log(result)}).catch(error => {console.log(error)})})</script>

八、 天氣預報案例

?一些渲染操作都是非常簡單的,就最后一步原生js 響應式輸入,只要得到了當前的輸入框,然后add~input就能做到響應式!!!

document.querySelector('.search-city').addEventListener('input', e => {console.log(e.target.value)
})
/*** 目標1:默認顯示-北京市天氣*  1.1 獲取北京市天氣數據*  1.2 數據展示到頁面*/// 獲取并渲染城市天氣函數
const getWeather = async (cityCode) => {// 獲取天氣數據const response = await axios('http://hmajax.itheima.net/api/weather', { params: { city: cityCode } })console.log(response.data)const data = response.data.data// 展示數據document.querySelector('.dateShort').innerHTML = data.datedocument.querySelector('.dateLunar').innerHTML = data.dateLunardocument.querySelector('.area').innerHTML = data.area// 當天的氣溫const nowWStr = `<div class="tem-box"><span class="temp"><span class="temperature">${data.temperature}</span><span>°</span></span></div><div class="climate-box"><div class="air"><span class="psPm25">${data.psPm25}</span><span class="psPm25Level">${data.psPm25Level}</span></div><ul class="weather-list"><li><img src="${data.weatherImg}" class="weatherImg" alt=""><span class="weather">${data.weather}</span></li><li class="windDirection">${data.windDirection}</li><li class="windPower">${data.windPower}</li></ul></div>`document.querySelector('.weather-box').innerHTML = nowWStr// 當天的天氣const twObj = data.todayWeatherconst todayWStr = `<div class="range-box"><span>今天:</span><span class="range"><span class="weather">${twObj.weather}</span><span class="temNight">${twObj.temNight}</span><span>-</span><span class="temDay">${twObj.temDay}</span><span>℃</span></span></div><ul class="sun-list"><li><span>紫外線</span><span class="ultraviolet">${twObj.ultraviolet}</span></li><li><span>濕度</span><span class="humidity">${twObj.humidity}</span>%</li><li><span>日出</span><span class="sunriseTime">${twObj.sunriseTime}</span></li><li><span>日落</span><span class="sunsetTime">${twObj.sunsetTime}</span></li></ul></div>`document.querySelector('.today-weather').innerHTML = todayWStr// 七日天氣預報數據展示const dayForecast = data.dayForecastconst dayForecastStr = dayForecast.map(item => {return `<li class="item"><div class="date-box"><span class="dateFormat">${item.dateFormat}</span><span class="date">${item.date}</span></div><img src="${item.weatherImg}" alt="" class="weatherImg"><span class="weather">${item.weather}</span><div class="temp"><span class="temNight">${item.temNight}</span>-<span class="temDay">${item.temDay}</span><span>℃</span></div><div class="wind"><span class="windDirection">${item.windDirection}</span><span class="windPower">&lt;${item.windPower}</span></div></li>`}).join('')document.querySelector('.week-wrap').innerHTML = dayForecastStr
}// m默認進入網頁 - 就要獲取天氣數據(北京城市編碼就是 ‘110100’)
getWeather('110100')// 搜索城市列表
document.querySelector('.search-city').addEventListener('input', async e => {console.log(e.target.value)const response = await axios('http://hmajax.itheima.net/api/weather/city', { params: { city: e.target.value } })const cityStr = response.data.data.map(item => {return `<li class="city-item">${item.name}</li>`}).join('')document.querySelector('.search-list').innerHTML = cityStrdocument.querySelector('.search-list').addEventListener('click', ee => {const num = response.data.data.filter(item => {return item.name === ee.target.innerHTML})console.log(num)if (num.length > 0) getWeather(num[0].code)})
})

最后獲得城市的code值優化,只需要在渲染的同時加上自定義data-code屬性就好!?

  const cityStr = response.data.data.map(item => {return `<li class="city-item" data-code="${item.code}">${item.name}</li>`}).join('')document.querySelector('.search-list').innerHTML = cityStrdocument.querySelector('.search-list').addEventListener('click', e => {console.log(e.target.dataset.code)getWeather(e.target.dataset.code)})

總結不易~ 本章節對我有很大的收獲,希望對你也是!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90460.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++中的stack和queue

C中的stack和queue 前言 這一節的內容對于stack和queue的使用介紹會比較少&#xff0c;主要是因為stack和queue的使用十分簡單&#xff0c;而且他們的功能主要也是在做題的時候才會顯現。這一欄目暫時不會寫關于做題的內容&#xff0c;后續我會額外開一個做題日記的欄目的。 這…

Spring Bean生命周期七步曲:定義、實例化、初始化、使用、銷毀

各位小猿&#xff0c;程序員小猿開發筆記&#xff0c;希望大家共同進步。 引言 1.整體流程圖 2.各階段分析 1??定義階段 1.1 定位資源 Spring 掃描 Component、Service、Controller 等注解的類或解析 XML/Java Config 中的 Bean 定義 1.2定義 BeanDefinition 解析類信息…

API安全監測工具:數字經濟的免疫哨兵

&#x1f4a5; 企業的三重致命威脅 1. 漏洞潛伏的定時炸彈 某支付平臺未檢測出API的批量數據泄露漏洞&#xff0c;導致230萬用戶信息被盜&#xff0c;面臨GDPR 1.8億歐元罰單&#xff08;IBM X-Force 2024報告&#xff09;。傳統掃描器對邏輯漏洞漏檢率超40%&#xff08;OWASP基…

Matplotlib詳細教程(基礎介紹,參數調整,繪圖教程)

目錄 一、初識Matploblib 1.1 安裝 Matplotlib 1.2、Matplotlib 的兩種接口風格 1.3、Figure 和 Axes 的深度理解 1.4 設置畫布大小 1.5 設置網格線 1.6 設置坐標軸 1.7 設置刻度和標簽 1.8 添加圖例和標題 1.9 設置中文顯示 1.10 調整子圖布局 二、常用繪圖教程 2…

Redis高可用架構演進面試筆記

1. 主從復制架構 核心概念Redis單節點并發能力有限&#xff0c;通過主從集群實現讀寫分離提升性能&#xff1a; Master節點&#xff1a;負責寫操作Slave節點&#xff1a;負責讀操作&#xff0c;從主節點同步數據 主從同步流程 全量同步&#xff08;首次同步&#xff09;建立連接…

無人機保養指南

定期清潔無人機在使用后容易積累灰塵、沙礫等雜物&#xff0c;需及時清潔。使用軟毛刷或壓縮空氣清除電機、螺旋槳和機身縫隙中的雜質。避免使用濕布直接擦拭電子元件&#xff0c;防止短路。電池維護鋰電池是無人機的核心部件&#xff0c;需避免過度放電或充電。長期存放時應保…

vlm MiniCPM 學習部署實戰

目錄 開源地址&#xff1a; 模型repo下載&#xff1a; 單圖片demo&#xff1a; 多圖推理demo&#xff1a; 論文學習筆記&#xff1a; 部署完整教程&#xff1a; 微調教程&#xff1a; 部署&#xff0c;微調教程&#xff0c;視頻實測 BitCPM4 技術報告 創意&#xff1…

92套畢業相冊PPT模版

致青春某大學同學聚會PPT模版&#xff0c;那些年我們一起走過的歲月PPT模版&#xff0c;某學院某班同學聯誼會PPT模版&#xff0c;匆匆那年PPT模版&#xff0c;青春的紀念冊PPT模版&#xff0c;梔子花開PPT模版&#xff0c;畢業紀念冊PPT模版。 92套畢業相冊PPT模版&#xff1…

爬蟲基礎概念

網絡爬蟲概述 概念 網絡爬蟲&#xff08;Web Crawler&#xff09;&#xff0c;也稱為網絡蜘蛛&#xff08;Web Spider&#xff09;或機器人&#xff08;Bot&#xff09;&#xff0c;是一種自動化程序&#xff0c;用于系統地瀏覽互聯網并收集網頁信息。它模擬人類瀏覽器行為&…

java8 stream流操作的flatMap

我們來詳細解釋一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的關鍵在于將其與 map 操作進行對比。??核心概念&#xff1a;????map 操作&#xff1a;??作用&#xff1a;將一個流中的每個元素??轉換??為另一個元素&#xff08;類型可以不同&#xff09;…

開源UI生態掘金:從Ant Design二次開發到行業專屬組件的技術變現

開源UI生態掘金&#xff1a;從Ant Design二次開發到行業專屬組件的技術變現內容摘要在開源UI生態中&#xff0c;Ant Design作為一款廣受歡迎的UI框架&#xff0c;為開發者提供了強大的基礎組件。然而&#xff0c;面對不同行業的特定需求&#xff0c;僅僅依靠現有的組件往往難以…

Object Sense (OSE):一款從編輯器腳本發展起來的編程語言

引言&#xff1a;從Vim編輯器走出的語言在編程語言的世界里&#xff0c;許多革命性的創新往往源于看似簡單的工具。Object Sense&#xff08;簡稱OSE&#xff09;的誕生&#xff0c;便與一款經典文本編輯器——Vim息息相關。它的前身是Vim的腳本語言VimL&#xff08;Vimscript&…

我考PostgreSQL中級專家證書二三事

1. 為什么選擇PGCE&#xff1f;PostgreSQL的開源特性、高性能和高擴展性早已讓我心生向往&#xff0c;而PGCE認證不僅是對技術能力的認可&#xff0c;更是一張通往更高職業舞臺的“通行證”。官方資料提到&#xff0c;PGCE考試涵蓋性能優化、高可用架構、復雜查詢處理、內核原理…

Java 動態導出 Word 登記表:多人員、分頁、動態表格的最佳實踐

本文詳細講解如何使用 Java 動態導出包含多人員報名表的 Word 文檔&#xff0c;每人占據獨立一頁&#xff0c;并支持動態表格行&#xff08;如個人經歷&#xff09;。我們對比了多種實現方案&#xff0c;最終推薦基于 Freemarker XML 模板 或 docx4j 的靈活方式&#xff0c;并…

【element-ui el-table】多選表格勾選時默認勾選了全部,row-key綁定異常問題解決

項目場景&#xff1a; Element-UI的el-table組件row-key使用問題 同一個頁面使用了幾個table&#xff0c;這幾個table都使用了多選&#xff0c;row-key屬性&#xff0c;其中row-key的綁定方式都是用的靜態綁定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…

C#注釋技巧與基礎編程示例

以下是一個包含基礎注釋的 C# 程序示例&#xff0c;展示了 C# 中各類注釋的使用方法&#xff1a;using System;namespace BasicCSharpProgram {/// <summary>/// Program 類是應用程序的入口點/// 包含 Main 方法作為程序執行的起點/// </summary>public class Pro…

極客大挑戰2019-HTTP

涵蓋知識&#xff1a;UA頭偽造漏洞&#xff1a;全稱&#xff1a;User-Agent 這個部分包含我們所使用的操作系統版本&#xff0c;cpu&#xff0c;瀏覽器類型等。來源偽造漏洞&#xff1a;在http請求頭中會攜帶一個Referer&#xff0c;這個用來表示服務器用戶是從哪個地方來的X-F…

談談ArrayList與Vector的理解?

目錄 擴容機制 ArrayList擴容源碼 Vector擴容源碼 二者區別 擴展&#xff1a;stack(棧&#xff09; 1.創建stack對象 2. 入棧(先進后出&#xff09; 3.出棧 擴展&#xff1a;舉個例子&#xff1a;實現下字符串逆置&#xff0c;利用stack棧來實現。 從接口實現上&#xff…

【Linux庖丁解牛】— 多線程同步 !

1. 什么是線程同步為什么會有線程同步&#xff0c;那一定是有了新問題。互斥可以解決臨界資源被同時訪問的問題&#xff0c;但是純互斥也會帶來新的問題。由于當前被執行的線程離cpu最近【其他線程被阻塞掛起還要被喚醒】&#xff0c;所以&#xff0c;當前進程對于競爭鎖天然就…

基于arduino uno r3主控的環境監測系統設計-1

準備設計arduino uno r3為主控的環境監測系統&#xff0c;通過傳感器采集TVOC&#xff08;總揮發性有機物&#xff09;、HCHO&#xff08;甲醛&#xff09;和eCO2&#xff08;等效二氧化碳&#xff09;數據&#xff0c;并顯示在LCD屏幕上&#xff0c;同時支持數據記錄到SD卡&am…