稻草問答

2020-08-11 17:50:58

稻草問答

建立R類

最終響應給用戶端的應該是Json數據,爲了保證用戶端的到的是Json數據,我們應該自定義R類(JsonResult),然後將各種要傳遞給用戶端的數據包裝到R類,最後傳遞給前端

異常統一處理

通過拋出異常的方式將使用者的各種失敗原因返回到前端,首先先常見基礎類別的service異常繼承RuntimeExceptio類異常,同時SpringMvc會自動管理異常。同時,在SQL的事務性機制 機製中,必須拋出RuntimeException才能 纔能保證事務的一致性

兩種做法

  • 將異常寫在各自的控制器中,然後由控制器去繼承Service基礎類別異常即可
  • 單獨定義一個global異常類集中處理,必須在該類上新增@ControllerAdvice註解,或者@RestControllerAdvice註解,並且在處理異常的方法上新增@Exceptionhandler註解

參數驗證

使用hibernate-vaildation框架實現伺服器端對對用戶端請求參數的驗證

實現步驟:1.在實體類的屬性上新增驗證的註解@TableField(「屬性名」)…2.在控制器的驗證參數前新增@Valid或者@Validated,之後新增BindingResult 參數,之後在控制器中呼叫BindingResult的hasErrors方法進行判斷

註解

  • @NotNull(message="…")
  • @NotEmpty(message="…")
  • @NotBlank(message="…")
  • @Size(min= ,max= ,message=」密碼長度…「)
  • @Pattern()自定義正則表達式

快取服務

redis

  • 快取記憶體數據庫,是Key和Value的儲存結構

訊息佇列

kafka

  • 當多個用戶端對伺服器發起請求時,伺服器會使用多執行緒同時處理這些請求,使得請求處理的時間較長,同時,多個執行緒同時執行處理數據,記憶體中的數據量也會特別大,對伺服器造成壓力,使用訊息佇列可以使那些不需要立即被處理的請求排隊,可以減輕伺服器的壓力,使用的時生產者消費者模型

  • 相關術語

    • Producer
    • Consumer
    • Topic
    • Record
    • Broker

SpringCloud Netflix

zuul

  • 微服務的API閘道器,對外暴露聚合Api,實現外部與內部的隔離。遮蔽內部微小變動,保持系統的穩定

Eureka

  • 解決微服務專案中各個獨立功能相互呼叫,多個伺服器部署不同功能需要在Eureka中進行註冊,這樣不同伺服器之間就能夠相互訪問了

持久層

JDBC

  • 是SUN公司提供的一種鏈接數據庫的規範介面,各個數據庫廠商根據介面標準開發出各自的連線驅動實現介面,這樣使得無論使用哪種數據庫都可以實現通過jdbc介面進行連線

Durid

  • 數據庫連線池,目前流行的數據庫連線池

Mybatis

  • 簡化持久層的開發,使用Mybatis進行CRUD操作時,只需要定義存取數據的抽象方法,再編寫抽象方法(抽象方法不允許過載)對應的SQL語句即可

  • pageHelper

    • 在業務方法中必須使用PageInfo<>作爲返回值
    • 設定分頁格式例如PageHelper.startPage(page, 2)
    • 將每頁顯示多少條設定成設定:project.question-list.page-size=2
  • 步驟,1.載入驅動2.讀取數據庫的url、username、password,建類連線

  • 通過註解的方式直接在mapper介面中編寫SQL語句:@insert@Update@Delet@Select,@Options(userGenertorKeys=true,keypropertis=「id」)自動生成主鍵

  • 多參數的問題可以使用arg或者param排號解決,但是無法清除的表達出語意,因此使用@param(「別名」)來解決多參數語意不明的問題,後續在在佔位符中寫別名進行區分

  • 動態SQL-foreach:需要將抽象方法的參數設計成多參數形式,或者時集合或者陣列的形式,然後在mapper.xml檔案中的查詢語句的條件中使用foreach節點

    • foreach節點的設定:1.collection:需要被遍歷的物件,2.item:遍歷過程的每一個元素,3.separate:遍歷的元素之間的分隔符,4.#{}表示子集中的元素名稱
  • #{}和${}的問題

    • #{},相當於preparedStatement,${}相當於Statement
  • 名稱不一致導致無法自動封裝

    • 在SQL語句中通過自定義別名的方式解決名稱不一致導致數據無法封裝的問題
    • 使用resultMap節點解決名稱不一致無法封裝的問題;在一對多的查詢中必須使用resultMap節點來指導封裝Collection節點用來設定一對多的屬性,ofType是集合元素的型別

Mybatis Plus

  • 在Mybatis基礎上,可以自動生成常規存取數據庫的SQL語句,使得開發人員可以不再編寫每張表都會有的比如根據id查詢,刪除,插入等

    • Mybatisplus會自動生成id,通過在實體類的id屬性上新增@TableId(value=」id「 type=Idtype.AUTO)解決該問題
  • MybatisPlus-generator

    • 對程式碼生成器進行設定,專案名稱,數據庫名稱,檔案位置等等

前端

邏輯部分

  • vue

    • 漸進式前端框架,雙向系結機制 機製,注重於數據的傳輸,減少對dom樹的操作

      • v-bind:
      • v-text:
      • v-on:
  • ajax

    • 非同步的Javascript和xml,可以實現用戶端一邊渲染頁面,一面傳輸數據,進行數據互動時不再重新整理頁面,只傳輸互動的數據,減少網路資源的消耗
  • jQuery

    • JavaScript的函數庫,提供了大量的對前端頁面的操作 ,主要特點,寫的少,做的多
  • javaScript

    • 一種獨立的指令碼語言,可以使前端頁面實現複雜的動態功能

顯示

  • css

    • 前端頁面的樣式語言
  • Bootstrap

    • 響應式的前端框架,基於HTML,css,javascript,可以實現快速開發前端頁面,支援多種不同的螢幕顯示
  • vue-select

    • vue元件,下拉選框
  • summernote

    • 富文字編輯器

Spring

Springboot

  • 一個更好用的SpringMvc,遵循約定大於設定的思想,預設完成絕大多數的設定,並且預設即成絕大部分常用依賴

  • Springboot整合Mybatis步驟:1.新增Mybatis依賴2.在組態檔properties中新增數據庫資訊url、username、password。3.建立mapper介面定義持久層方法,在resource中複製貼上mapper.xml檔案,並將名稱空間指定爲mapper的介面名。4.在properties檔案中新增mapper.xml的classpath。5.在設定類上新增MapperScan(」mapper介面包名「)

  • 註解

    • @RestController

SpringMvc

  • Model+View+Controller,也可以認爲是完成檢視和控制器的之間的互動關係,在java EE傳統模式下會存在大量的servlet元件,同時會有大量servlet物件長期佔用記憶體的問題,並且SpringMvc極大的簡化了開發

    • 核心執行流程

      • DispatcherServlet接受用戶端請求後,呼叫HandleMapping獲得請求路徑和Controller的對應關係,DispacherServlet根據對應關係將請求發給對應的Controller,Controller完成model和view的之間的數據互動,將結果ModelAndView返回給DispacherServlet,DispatcherServlet再將返回的結果交給ViewResolved進行解析,得到具體的要響應給用戶端的試圖名稱,交給DispatchServle,再由DispatchServlet將結果響應給用戶端
      • 在設定類中通過characterEncoding設定字元集,解決頁面顯示中文的問題
    • 註解

      • @RequestMapping(「請求路徑」),其中對映的請求路徑可以有多個,也可以在其中設定,請求的方法是post還是get

        • @GetMapping
        • @PostMapping
      • @ResponseBody:表示返回字串,不反回試圖名稱

      • @EnableWebMvc註解相當於設定了web.xml檔案

      • @Configuration將該類設定成啓動類

      • @Requestparam(「別名」),設定參數別名

    • 接收參數

      • Controller中的方法裡可以將用戶端請求的參數直接宣告爲方法的參數,還可以在方法的參數裡通過@RequestParam(「參數名」)自定義參數名,此時用戶端必須按照自定義參數名提交參數
      • 通過使用HttpServletRequest作爲方法的參數,呼叫該參數的getParameter()方法獲取請求參數
      • 直接將請求參數封裝起來作爲方法的請求參數,用戶端的請求參數應與封裝類的屬性名稱一致,且封裝類擁有規範的get與set方法
      • 可以新增HttpSession型別作爲參數對session進行存取,可以在方法體中存入數據和取出數據
    • 重定向與轉發

      • 當返回型別是String型別時可以進行轉發和重定向,返回「redirect:「目標路徑」,轉發返回」forward:檢視名稱「,因爲轉發時預設行爲,所以可以直接返回檢視名稱,不寫forward
      • 轉發:伺服器內部行爲,用戶端只發出一次請求,用戶端位址列不會發生變化,從編寫程式碼的角度看,轉發需要指定檢視名稱。重定向:的本質是伺服器端收到用戶端請求後響應一個302狀態碼和目標路徑,用戶端收到後會再次向目標路徑對伺服器端再次發起請求,同時導航位址列發生變化,所以重定向用戶端至少向伺服器端發起兩次請求,從編寫程式碼的角度看,重定向需要指定目標路徑
    • 攔截器interceptor

      • 建立流程:1.建立攔截器類實現HandlerInterceptors介面,重寫其中的方法。2.在設定類中重寫@addInterceptor方法,並在其中建立攔截器物件,分別使用addIntercerptor和addPathPatttern方法新增物件和攔截路徑,設定需要攔截路徑,要求寫絕對路徑,並在設定類上新增@EnableWebMvc註解
      • 在攔截器類中有三個方法,preHandle()、postHandle()、afterCompletion,當preHandle返回true則再執行postHandle和afterComlpetion方法,當返回false時則不執行後面的方法,瀏覽器顯示一片空白,所以preHandle纔是真正意義上的攔截方法,所以應在preHandle中自定義攔截方法
      • 過濾器與攔截器的區別:1.相同點:都可以作用於若幹個不同的請求,都有鏈的概念,2.不同點:攔截器時JavaEE中自帶的,攔截器時框架的方法,攔截器可以設定白名單,過濾器不可以,攔截器第一次攔截是在DispatcherServlet之後,過濾器時在所有的Servlet元件之前進行攔截
      • 解決post請求中文亂碼的問題:在SpringMvc的初始化類中重寫getServletFilter()方法,返回一個設定好的字元集物件
    • SpringMvc建立流程

      • 1.建立初始化類,繼承AbstractAnnotationConfigDispatcherServletInitializer,重寫其中的方法getServletMappings中返回對映路徑的後綴型別;在getServletConfigClasses中返回設定類.class。2.建立SpringMavc設定類實現Configurer並在其中設定檢視解析器和模板解析器,同時新增@Component(」包名「)和@Configuration註解
  • 基於SpringMvc的檔案上傳

    • 規定格式

      • 必須使用Post請求方式提交
      • Html表單中必須設定:enctype="multipart/form-data
      • 表單中必須使用:控制元件
    • 組態檔中設定上傳位置:spring.resources.static-locations=file:d:/upload

    • 組態檔

      • 在組態檔中重置靜態資源路徑:spring.resources.static-locations[0]=classpath:/static
        spring.resources.static-locations[1]=file:${project.upload-location}
      • project.question.image-max-size=307200
      • project.question.image-content-types=image/jpeg, image/png, image/bmp
    • 上傳方法的參數MultipartFile

      • boolean isEmpty()判斷上傳檔案是否爲空
      • long getSize()獲取檔案大小
      • String contentType獲取檔案mime型別
      • String getOriginalFilename()獲取檔案原始路徑
      • void transferTo(File dest)儲存上傳的檔案

SpringSecurity

  • Spring 家族中的安全框架,Springboot對SpringSecurity提供了自動化設定方案,其核心是一組過濾器鏈 basic Authentication Filter

    • 建立PasswordEncode物件,呼叫其encode(rawpassword),實現對密碼加密
  • 基於記憶體驗證的登錄

    • 建立SpringSecurityConfig的設定類,這個類繼承WebSecurityConfigurerAdapter,重寫Protect configure(AuthenticationManagerBuilder auth)方法,在這個方法中可以設定允許通過的使用者名稱和密碼及許可權

    • UserDetailsService介面,建立一個類,實現該介面,重寫其中的UserDatils loadUserByUsername(String username),該方法表示給定一個使用者名稱,獲取使用者詳情

    • 查詢數據庫驗證登錄:查詢數據庫通過username找到使用者名稱和密碼,許可權,構建Userdatils物件,再將物件返回

    • 存取控制:在Security設定類中重寫Protect void configure(HttpSecurity http)方法,對存取進行設定

    • 許可權控制:

      • 在處理請求的方法前新增@PreAuthorize(」hasAuthority(‘字串’)「),同時還需要再SecurityConfig設定類上新增@EnableGlobalMethodSecurity(PrepostMethod=true)
  • 通過SpringSecurity獲取當前使用者的資訊:

    • 在請求的方法的參數列表中新增Authentication,或者princepal,通過這兩個參數get所需要的資訊,這兩個參數獲得資訊比較多還可以
    • 通過注入@AuthenticationPrincepal UserDatils userdatils來獲取使用者資訊
    • 擴充套件UserDatials方法,向UserDatials中設定更多的屬性,通常設計一個類繼承Security中User,然後建立物件,將各類屬性set進去

Spring實現了自動建立物件和管理物件,通過DI實現IOC

  • Bean物件的作用域

    • 預設情況下Spring管理的物件是單例的,全域性只有一份,可以通過新增@Scope(「prototype」)變成非單例模式,同時Spring中預設是餓漢式載入,可以通過使用@Lazy註解將餓漢式變成懶漢式載入
  • Bean物件的生命週期

    • 通常bean物件是由容器自行管理,在一定程度上是程式設計師不可控的,Spring允許設定最多兩個方法,一個是初始化方法initial(),一個是銷燬前執行的方法destroy(),可以通過@Bean(initMethod=「init」,destroy=「destroy」)實現
  • 自動裝配

    • @Resource

      • 會先通過ByName裝配,如果沒有找到名字對應的型別,會再根據ByType進行裝配,此註解是java本身提供的不是屬於Spring框架
    • @Autowired

      • 容器自動裝載了一個AutowiredAnntationBeanPostProcessor,當掃描到此類註解後就會在Ioc容器中找到對應的類,並裝配給物件屬性
      • ByType,該註解會根據型別裝配,當沒有該型別的會直接報錯,當設定requid=false則不會報錯;當有多個相同的型別是會拋出NoUniqueBeanDefinitionException異常,這是需要通過屬性的名稱進行裝配,ByName
    • 通過自動裝配和使用介面的方式實現解耦

    • Spring也可以實現方法參數的自動裝配,此時不需要直接

  • 元件掃描

    • 在需要掃面的類上面新增@Component註解,同類型註解還有@Controller,@Service,@Repository,只是語意不同
  • 設定類

    • 在類之前新增@ComponentScan(「包名」)作爲設定類,則在載入載入時載入設定類就可以
  • 讀取組態檔

    • 在類宣告之前新增@PropertySource(「classpath:組態檔名」),之後在類中定義屬性,在屬性之前新增@Value("${組態檔中的屬性名稱}")
    • 也可以同過建立Environment物件,對Environment進行自動裝配來讀取組態檔

Thymeleaf

將數據系結到事先設計好的頁面模板中

th:replace

th:fragment

自由主題

外掛

lombok

  • 簡化程式碼,使用註解的方式消除java開發中大量的模板程式碼,比如get方法和set方法

Slf4j

  • 一個日誌記錄的介面,並不具體實現類,需要使用其他例如log4j去完成具體實現,配合Lombok中的@Slf4j直接建立實現物件

XMind - Trial Version