Spring MVC詳解、靜態資源訪問、攔截器

1. Spring MVC概述

1.1 Spring MVC是什么

SpringMVC是Spring的一個模塊,是一個基于MVC設計模式的web框架。

image-20230301230028355

1.2 Spring MVC執行流程。

image-20230301231258943

1.3 組件分析

  • 前端控制器(默認配置)Dispatcher Servlet 作用:只負責分發請求。可以很好的對其它組件進行解耦合。

  • 處理器映射器(默認配置)HandlerMapping

    作用:將前端的url和處理器方法建立映射關系

  • 處理器適配器(默認配置)HandlerAdapter

    適配并調用具體的處理器方法執行

  • 處理器 controller

    (需要程序員開發)

  • 視圖解析器 ViewResolver

    根據邏輯視圖查找映射物理視圖

簡化的MVC執行流程:

image-20230301232713058

前后分離的執行流程:

image-20230301232837289

2. Handler

引入依賴

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.1 參數

Handler的參數列表,功能非常強大,主要功能有以下兩點:

  1. 接收請求參數

  2. 獲取servletAPI


@Controller 
@RestController
public class Login {}
2.1.1接收請求參數
  • 簡單類型的參數,Spring MVC可以直接幫我們封裝成參數列表中聲明的類型,比如String、int、double……

    //http://localhost:8080/login?username=petrel&password=123
    @RequestMapping("/login")
    public void login(String username, String password){System.out.println(username);System.out.println(password);
    }
  • 或者也可以直接接收一個Java Bean

    //http://localhost:8080/login?name=petrel&age=23
    @RequestMapping("/login")
    public void login(Person person) {System.out.println(person.getName());System.out.println(person.getAge());
    }
  • 如果請求參數是一個日期,Spring MVC并不能直接封裝到Date中,需要設置一下日期格式。

    //http://localhost:8080/login?name=petrel&age=23&birthday=2020-02-02
    public class User {private String username;private String password;@DateTimeFormat(pattern = "yyyy-MM-dd")//前端到后端 可以把前端string類型轉換到后端date類型//@JsonFormat(pattern = "yyyy-MM-dd")//后端到前端 ? 可以把后端date類型轉換到前端stringprivate Date birthday;// getters & setters...
    }// ? ? SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");// ? ? String date = sim.format(user.getBirthday());  將Date處理成字符串
  • 如果請求參數是一個數組類型,我們可以直接通過數組接收。

    http://localhost:8080/delSel?ids=1&ids=2 ?  請求參數ids為方法的參數
    @RequestMapping("/delSel")
    public String delSel(Integer[] ids) {System.out.println(Arrays.toString(ids));return "index";
    }
  • 如果想要用集合類型來接收數組參數呢?下面的寫法可以么?

    //http://localhost:8080/delSel?ids=1&ids=2
    @RequestMapping("/delSel")
    public String delSel(List<Integer> ids) {System.out.println(ids);return "index";
    }
    //不可以,因為方法參數中的數據類型 必須是可實例化的,得有構造方法,List是個接口,沒辦法構造。但是可以使用ArrayList
    //http://localhost:8080/delSel?ids=1&ids=2
    @RequestMapping("/delSel")
    public String delSel(@RequestParam ArrayList<Integer> ids) {System.out.println(ids);return "index";
    }
    //但是必須在參數前面加@RequestParam才可以拿到請求參數
2.1.2 獲取servletAPI

可以在Handler的形參中直接使用以下類型:

  • HttpServletRequest 通過request對象獲取請求信息

  • HttpServletResponse 通過response處理響應信息

  • HttpSession 通過session對象得到session中存放的對象

 ? @ResponseBody @RequestMapping("/login") ? // 獲取前端請求資源路徑public String login(String username, Integer password, HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("username", username);return "index";}@ResponseBody @RequestMapping("/test") ? // 獲取前端請求資源路徑public String test(HttpServletRequest request) {HttpSession session = request.getSession();Object username = session.getAttribute("username");String uname = (String) username;return uname;}@ResponseBody @RequestMapping("/login") ? // 獲取前端請求資源路徑public String login(String username, Integer password, HttpSession session) {session.setAttribute("username", username);return "index";}@ResponseBody @RequestMapping("/test") ? // 獲取前端請求資源路徑public String test(HttpSession session) {Object username = session.getAttribute("username");String uname = (String) username;return uname;}

2.2 返回值(了解)

可以為Handler指定兩種種返回值類型:

  • void

    如果返回值為void的時候,可以在Handler形參上定義requestresponse,使用requestresponse指定響應結果

    response.getWriter().println();
  • String

    邏輯視圖名稱

    返回的字符串就是邏輯視圖。

    return "index.jsp";

    請求轉發與重定向

    ? ?@RequestMapping("/login")// @ResponseBody  注釋,否則返回json格式public String login(String username, Integer password, HttpSession session) {session.setAttribute("username", username);// ? return "forward:/test";  // 請求轉發return "redirect:/test"; // 重定向}
    ?@RequestMapping("/test")@ResponseBody ?// 這里需要返回jsonpublic String test(HttpSession session) {Object username = session.getAttribute("username");String uname = (String) username;return uname;}

2.3 注解

  • @RequestMapping

    • 聲明在方法上:

      //@RequestMapping("/login")
      //@RequestMapping(value = "/login")
      //@RequestMapping(path = "/login")
      //@RequestMapping(value = {"/login1", "/login2"})
      @Controller
      public class TestController {@ResponseBody ?@RequestMapping(value = {"/login1", "/login2"}, method = RequestMethod.GET)// 只有get請求才可以 post請求進不來public String login(String username) {System.out.println(username);return username;}
      }
      • 通過value屬性配置該方法的訪問路徑

      • 通過method屬性指定該方法允許的訪問方式,默認情況get,post都支持

    • // 靜態文件目錄,resources/static/login.html  訪問方式 http://localhost:8080/login.html
      <form action="/login1" method="get">
      ?<input type="text" name="username"><button>提交</button>
      ?
      </form>
    • 聲明在類上:窄化請求

      ??:我們的controller中是不允許有相同的資源路徑的

      假設我們的EmpController和DeptController都需要將資源路徑成定義"/findAll"必然是不合法的

      我們可以將資源路徑分別定義成"emp/findAll"和"dept/findAll",這種方式叫做窄化請求

      窄化請求,可以對請求URL進行分類管理,例如:/person/add/person/list……

      // http://localhost:5555/v1/findAll?username=petrel
      @RestController
      @RequestMapping("/v1")
      public class TestController {
      ?@RequestMapping("/findAll")public String findAll(String username) {System.out.println(username);return username;}
      }
      ?
      // 2合1注解 : @RestController = @Controller  +  @ResponseBody
  • @RequestParam

    該注解用來標注一個請求參數:

    在方法的形參前,可以加可以不加,加了就有特殊含義了

     @RequestMapping(value = "/login1")public String login1(String name) {System.out.println(name);return "index";}
    //上述方式在請求 login1 可以不強制傳遞請求參數,那打印name結果是null
    ?
    ?@RequestMapping(value = "/login2")public String login2(@RequestParam String name) {System.out.println(name);return "index";}
    //上述方式在請求 login2 強制必須傳遞請求參數,那打印name結果就是請求參數傳的值
    ?
    ?
    //http://localhost:8080/login3?name=tom@RequestMapping(value = "/login3")public String login3(@RequestParam("name") String username) {System.out.println(username);return "index";}//上述方式在請求 login3 的請求參數是name 指定請求參數的名字,用于處理前后端參數不一致//@RequestParam(value = "name") 和 @RequestParam(name = "name") 等同于 @RequestParam("name")
    ?
    ?
    ?
    //http://localhost:8080/login4 ? ?
    @RequestMapping(value = "/login4")public String login4(@RequestParam(name = "name", required = false) String username) {System.out.println(username);return "index";}
    //  required = false,默認是true 代表著必須傳遞參數,如果設置false代表可以不傳遞參數,不傳為null
    ?
    ?
    @RequestMapping(value = "/login5")
    public String login5(@RequestParam(name = "name",defaultValue = "zs") String username) {System.out.println(username);return "index";
    }
    //設置默認值,這樣required就不需要在寫了。
    • value@RequestParam(value="username")等同于@RequestParam("username"),對應請求參數的鍵

    • required:參數是否必填

    • defaultValue:設置默認值

  • @PathVariable

    將路徑的一部分作為請求參數,RESTful的基礎。

    //http://localhost:8080/findById/1
    @RequestMapping("/findById/{id}")
    public String findById(@PathVariable Integer id) {System.out.println(id);return "index";
    }
    ?
    //請求參數就不可以是?號。參數必須是目錄形式。
    ?
    @RestController
    @RequestMapping("/person")
    public class PersonController {@GetMapping("/findById/{id}")public String findById(@PathVariable Integer id) {System.out.println(id);return null;}
    ?@PutMapping("/updateById/{id}")public String updateById(@PathVariable Integer id) {System.out.println(id);return null;}
    ?@DeleteMapping("/deleteById/{id}")public String deleteById(@PathVariable Integer id) {System.out.println(id);return null;}
    ?
    ?@GetMapping("/findByIdOrName/{id}/{name}")public String findByIdOrName(@PathVariable Integer id, @PathVariable String name) {System.out.println(id);System.out.println(name);return null;}
    }

    RESTful

    RESTful就是一個url的編寫風格。使用RESTful就不需要用?問號分割請求參數了。

    一個嚴格的RESTful中是不可能存在?的。

    一個URl對應一個資源,請求方式確定一個動作。

    ps:有一張person表id有1 2 3 ,name有zs,lisi,wangwu。

    POST請求:就是向數據庫中添加數據。/person,代表把person對象添加到表中

    DELETE請求:就是向數據庫中刪除一條數據。 /person/1 ,代表把person表中id為1的 刪除

    PUT請求:就是向數據庫修改一條數據。/person/1,代表把person表中id為1的 修改

    GET請求:就是向數據庫表查詢數據。/person/3, 代表把person表中id為3的 查詢出來

3. 靜態資源訪問

springboot中放置靜態資源的目錄,常用有static和templates目錄,只要把靜態資源放到這幾個目錄下,就能直接訪問到

http://localhost:8080/login.html
http://localhost:8080/login1.html 

static目錄下靜態資源默認是可以被訪問到的,但是templates目錄下資源默認是訪問不到的,需要做配置:

spring.web.resources.static-locations=classpath:/templates/,classpath:static/

也可以直接給所有靜態資源添加一個前綴,既可統一攔截,又可統一放開

spring.mvc.static-path-pattern=/res/**
http://localhost:8080/res/login1.html ?
http://localhost:8080/res/login.html 

4. Spring MVC對JSON的支持

Spring MVC對JSON的?持?常友好,主要?到兩個注解:@RequestBody,@ResponseBody

也可以配置為其它的JSON?具,?如fastjson,?學如何配置。

為什么學習Jackson,因為它是SpringMVC默認的,方便配置使用。

@RequestBody

public class User {private Integer id;private String username;private String password;getter&& setter
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<button id="btn1">前端發送json到后端</button>
<button id="btn2">接收后端數據</button>
?
<script>
?$("#btn1").click(function () {$.ajax({type: "post",url: "http://localhost:8080/sendJson",data: '{"username":"zs","password":"123456","id":20}',contentType: 'application/json' //告訴服務器 前端發的數據是json格式})})
?$("#btn2").click(function () {$.ajax({type: "get",url: "http://localhost:8080/receiveJson",// url: "http://localhost:8080/receiveJsonData",success(res) {console.log(res);}})})
</script>
?
</body>
</html>

Handler部分

package com.whitecamellia.springboot01.controller;import com.whitecamellia.springboot01.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Petrel* @create 2022-08-04 6:59 上午*/
@Controller
public class JsonController {@PostMapping("/sendJson")public String jsonTest1(@RequestBody User user) {//@RequestBody 前端來的json字符串在請求體中System.out.println(user);return "index";}
}

測試:查看控制臺是否接受到前端發送過來的json數據。

@ResponseBody

JavaScript部分

<script>$("#btn2").click(function () {$.ajax({type: "get",url: "http://localhost:8080/receiveJson",// url: "http://localhost:8080/receiveJsonData",success(res) {console.log(res);}})
</script>

Handler部分

      // login.html@GetMapping("/receiveJson")@ResponseBody //代表這得到的返回值要作為響應體 返回給前端,就不會走試圖解析器public List<User> jsonTest2() {User user = new User();user.setUsername("zs");user.setPassword("123456");user.setId(20);List<User> list = new ArrayList<>();list.add(user);return list;}
?@GetMapping("/receiveJsonData")@ResponseBodypublic Map<String, Object> jsonTest3() {
?User user = new User();user.setUsername("zs");user.setPassword("123456");user.setId(20);List<User> list = new ArrayList<>();list.add(user);Map<String, Object> map = new HashMap<>();map.put("code", 200);map.put("message", "數據請求成功!");map.put("data", list);return map;}

測試:查看前端頁面console頁面,是否拿到后端響應過來的數據。

注意:@ResponseBody 注解一定要放在方法上面,標注,不要放到方法返回值處標注。

@ResponseBody 注解也可以放到類上,這樣該類內部每個方法都會隱式被標注為@ResponseBody。

Fastjson

 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.10</version></dependency>

5. 攔截器

image-20230301233922310

登錄需求

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<div>賬號:<input type="text" id="username">
</div>
<div>密碼:<input type="password" id="password">
</div>
<div><button id="btn">登錄</button>
</div>
?
<script>
?$("#btn").click(() => {$.ajax({url: "http://localhost:8080/login",method: "post",data: {username: $("#username").val(),password: $("#password").val()},success(res) {console.log(res)if (res.code == 200) {location.href = "index.html"} else {alert("登錄失敗")}}})})
?
</script>
</body>
</html>
// index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<h1>Home主頁</h1>
<h3 id="info">
?
</h3>
<script>
?$.ajax({url: "http://localhost:8080/findAll",method: "get",success(res) {$("#info").html(res.data)}})
</script>
</body>
?
</html>
package com.whitecamellia.uploaddemo.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;/*** @author Petrel* @create 2022-08-04 10:05 下午*/
@RestController
public class LoginController {@PostMapping("/login")public Map<String, Object> login(String username, String password, HttpSession session) {session.setAttribute("username", username);Map<String, Object> map = new HashMap();if ("admin".equals(username) && "123456".equals(password)) {map.put("code", 200);map.put("success", "登錄成功");return map;} else {map.put("code", 200);map.put("success", "登錄失敗");return map;}}
}
package com.whitecamellia.uploaddemo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Petrel* @create 2022-08-04 3:52 下午*/
@RestController
public class TestController {@GetMapping("/findAll")public Map<String, Object> findAll(HttpSession session) {Object username = session.getAttribute("username");Map<String, Object> map = new HashMap<>();List<String> list = new ArrayList();if (username == null) {list.add("用戶未登錄,不能獲取數據");map.put("code", 403);map.put("message", "用戶未登錄");map.put("data", list);}list.add("用戶已登錄,可以獲取數據");map.put("code", 200);map.put("message", "用戶已登錄");map.put("data", list);return map;}
}
創建攔截器

實現HandlerInterceptor接口

創建interceptor package
/*** 創建攔截器*/
package com.whitecamellia.uploaddemo.controller.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();Object username = session.getAttribute("username");if (username != null) {return true; // 放行} else {Map<String, Object> map = new HashMap<>();response.setHeader("content-type", "application/json");map.put("code", 403);map.put("message", "No Access");//  java對象轉成json字符串String str = JSONArray.toJSONString(map);
//            ObjectMapper objectMapper = new ObjectMapper();
//            String s = objectMapper.writeValueAsString(map);
//            response.addHeader("charset", "utf8");PrintWriter writer = response.getWriter();writer.write(str);//  json字符串 轉成 java對象// Map map1 = JSONObject.toJavaObject((JSON) o, Map.class);System.out.println("攔截器工作了");return false; // 攔截}}
}
配置攔截器
創建config package
package com.whitecamellia.uploaddemo.controller.config;import com.whitecamellia.uploaddemo.controller.interceptor.LoginInterceptor;
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 LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html").excludePathPatterns("/login");}
}

跨域配置

package com.whitecamellia.uploaddemo.controller.config;import com.whitecamellia.uploaddemo.controller.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author Petrel*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html").excludePathPatterns("/login");}/*** 允許跨域調用的過濾器*/@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();//允許所有域名進行跨域調用config.addAllowedOriginPattern("*");//允許跨越發送cookieconfig.setAllowCredentials(true);//放行全部原始頭信息config.addAllowedHeader("*");//允許所有請求方法跨域調用config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}}

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

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

相關文章

這樣的軟件測試面試題,誰面試遇到誰淘汰!!!

88 11.6 自動化測試用例的來源 手工編寫測試用例 把原來手工的測試用例&#xff0c;當成自動化測試用例 11.7 自動化測試的優點與缺點 優點: 1、對程序的回歸測試更方便 2、可以運行更多更繁瑣的測試 3、提高測試效率和準確性&#xff0c;節約時間成本 4、可以執行一些手工測試…

【源碼解析】從ReentrantLock角度聊聊AQS原理

AQS結構 //頭節點 當前持有鎖的線程private transient volatile Node head;/*** Tail of the wait queue, lazily initialized. Modified only via* method enq to add new wait node.*///每個進來的線程都插入到最后private transient volatile Node tail;/*** The synchroni…

MLIR筆記(6)

5. 方言與操作 5.1. 方言的概念 在MLIR里&#xff0c;通過Dialect類來抽象方言。具體的每種方言都需要從這個基類派生一個類型&#xff0c;并實現重載自己所需的虛函數。 MLIR文檔里這樣描述方言&#xff08; MLIR Language Reference - MLIR&#xff09;&#xff1a; 方言…

手把手教你玩轉ESP8266(原理+驅動)

在嵌入式開發中&#xff0c;無線通信的方式有很多&#xff0c;其中 WIFI 是繞不開的話題。說到 WIFI 通信&#xff0c;就不得不提 ESP8266了。 ESP8266 是一款高性能的 WIFI 串口模塊&#xff0c;實現透明傳輸。只要有一定的串口知識&#xff0c;不需要知道 WIFI 原理就可以上…

作為一個產品經理帶你了解Axure的安裝和基本使用

1.Axure的簡介 Axure是一種強大的原型設計工具&#xff0c;它允許用戶創建交互式的、高保真度的原型&#xff0c;以及進行用戶體驗設計和界面設計。Axure可以幫助設計師和產品經理快速創建和共享原型&#xff0c;以便團隊成員之間進行溝通和反饋。Axure提供了豐富的交互組件和功…

Spring--10--Spring Bean的生命周期

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1.Spring Bean1.1 什么是 Bean簡而言之&#xff0c;bean 是由 Spring IoC 容器實例化、組裝和管理的對象。 1.2 Spring框架管理Bean對象的優勢 2.Bean的生命周期實例…

西工大網絡空間安全學院計算機系統基礎實驗二(phase_2下——漫漫深夜過后的黎明!!!)

內存地址內存地址中的數注釋指向這塊內存的寄存器0xffffd0e8函數phase_2的棧幀0xffffd0e40xffffd0f4函數phase_2的棧幀0xffffd0e00x5655b7b0函數phase_2的棧幀0xffffd0dc0x565566ca函數read_six_numbers的返回地址&#xff0c;函數phase_2的棧幀0xffffd0d80x5655af64舊%ebx的值…

SpringIOC之ConditionEvaluator

博主介紹:?全網粉絲5W+,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗? 博主作品:《Java項目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

Netty性能好的原因是什么

Netty性能好的原因 廢話篇Netty性能好的原因是什么1. 非阻塞IO模型高效的Reactor線程模型零拷貝內存池設計無鎖串行化設計高性能序列化協議 廢話篇 相信有同學會經常被問到這樣的問題&#xff0c;不妨下次被面試官問到這種問題&#xff0c;我們可以這樣回答&#xff01; Nett…

簡單實用的firewalld命令

簡單實用的firewalld命令 一、查看防火墻是否打開二、查詢、開放、關閉端口三、查看已監聽端口四、驗證 一、查看防火墻是否打開 systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.…

map.getOrDefault

map.getOrDefault 是 Java 中的一個方法&#xff0c;用于從 Map 中獲取指定鍵的值&#xff0c;如果鍵不存在&#xff0c;則返回指定的默認值。 方法簽名如下&#xff1a; V getOrDefault(Object key, V defaultValue) 其中&#xff0c;key 是要獲取值的鍵&#xff0c;defaul…

day19_java泛型

泛型 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制&#xff0c;該機制允許程序員在編譯時檢測到非法的類型。保證了java的安全性 泛型的本質是參數化類型&#xff0c;也就是說所操作的數據類型被指定為一個參數…

AWS EC2使用 instance profile 訪問S3

AWS EC2 instance可以使用instance profile 配置訪問S3的權限。 然后就可以直接在EC2上執行 python代碼或者AWS CLI去訪問S3了。 唯一需要注意的地方是&#xff0c;申明region。 示例代碼&#xff1a; aws s3 ls xxxx-s3-bucket --region xxx-region import boto3 client …

一文讀懂MySQL基礎知識文集(8)

&#x1f3c6;作者簡介&#xff0c;普修羅雙戰士&#xff0c;一直追求不斷學習和成長&#xff0c;在技術的道路上持續探索和實踐。 &#x1f3c6;多年互聯網行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責人。 &#x1f389;歡迎 &#x1f44d;點贊?評論…

IDEA 報錯

IDEA 報錯&#xff1a; Cannot resolve symbol&#xff1a;這通常是由于 IDEA 無法識別您正在使用的類或方法導致的。請確保您已經導入了正確的包&#xff0c;并且您的類路徑設置正確。 NullPointerException&#xff1a;這通常是由于您的代碼嘗試訪問空對象或空值導致的。請檢…

JavaScript 函數的返回值

JavaScript 函數的返回值 JavaScript 函數的返回值是函數執行后返回的值&#xff0c;可以是任意類型的值&#xff0c;包括數字、字符串、布爾值、對象等。函數的返回值通過 return 關鍵字來指定&#xff0c;如果函數沒有指定返回值&#xff0c;則默認返回 undefined。例如&…

Qt處理焦點事件(獲得焦點,失去焦點)

背景&#xff1a; 我只是想處理焦點動作&#xff0c;由于懶&#xff0c;上網一搜&#xff0c;排名靠前的一位朋友&#xff0c;使用重寫部件的方式實現。還是因為懶&#xff0c;所以感覺復雜了。于是又花了一分鐘解決了一下。 所以記錄下來&#xff0c;以免以后忘了。 思路&a…

單目相機測距(3米范圍內)二維碼實現方案(python代碼 僅僅依賴opencv)

總體思路:先通過opencv 識別二維碼的的四個像素角位置,然后把二維碼的物理位置設置為 cv::Point3f(-HALF_LENGTH, -HALF_LENGTH, 0), //tl cv::Point3f(HALF_LENGTH, -HALF_LENGTH, 0), //tr cv::Point3f(HALF_LENGTH, HALF_LENGTH, 0), //br cv::P…

四年編程成長總結

文章目錄 計算機計算機基礎知識操作系統計算機網絡 自考學習與備考考試經歷 軟考學習與準備考試成果人生成長自主學習解決問題團隊合作 總結 計算機 計算機是我學習和應用Java編程的基礎&#xff0c;它為我提供了一個強大的工具和平臺。在這四年的學習中&#xff0c;我逐漸深入…

軟件運行原理 - 內存模型 - 棧內存

說明 C/C軟件運行時&#xff0c;內存根據使用方式的不同分為堆內存和棧內存&#xff0c;棧內存使用有以下特征&#xff1a; 棧內存使用&#xff08;申請、釋放&#xff09;由系統自動分配和釋放&#xff0c;程序員不用做任何操作。棧內存重復使用&#xff0c;進入函數時數據入…