【SpringBoot】表單驗證和使用AOP處理請求

      網友投稿 736 2025-03-31

      表單驗證

      項目是上篇文章繼續的。

      首先說下要干嘛,我們需要攔截People年齡在18歲以下的

      首先是在People上的年齡增加一個注解

      @Min(value = 18,message = "年齡必須大于18")//message為提示 20180103 private Integer age;

      【SpringBoot】表單驗證和使用AOP處理請求

      1

      2

      在這里,我們攔截新增的方法

      也就是IndexController類中的peopleAdd方法

      /** * 新增一個對象 * 增加一個功能,如果年齡大于18,就不讓添加進數據庫 20180103 * @param people * @return */ @PostMapping(value = "/add") public People peopleAdd(@Valid People people, BindingResult bindingResult){//@Valid 注解表示使用數據校驗 People類中對年齡進行了限制 ,驗證返回結果會在bindingResult對象中 20180103 //@RequestParam(value = "people") 直接傳類的時候,建議不要使用RequestParam注解 //當然,你可以選擇每一個參數都寫上,但沒必要,更多的時候是直接傳類對象,注意url的參數名和類中屬性名對上 if(bindingResult.hasErrors()){//驗證出現錯誤 System.out.println("驗證錯誤信息:"+bindingResult.getFieldError().getDefaultMessage()); return null; } return peopleDao.save(people); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      這樣我們就實現了年齡的攔截,當年齡沒有大于等于18,則bindingResult.hasErrors()返回的是true

      沒有什么新的知識點,springMVC都學過的

      與Min注解相對應的還有@Max注解

      使用AOP處理請求

      AOP是一種編程范式,與語言無關,是一種程序設計思想

      下面列出三種程序設計思想:

      AOP-面向切面 Aspect Oriented Programming

      OOP-面向對象 Object Oriented Programming

      POP-面向過程 Procedure Oriented Programming

      面向過程到面向對象的區別

      其實就是思考點的不同

      我們用下雨來說一個例子

      面向過程的思想會這樣做:

      假如下雨了,我打開了雨傘

      在面向對象的思想中,應該這么做:

      比如用Java,首先會實現一個叫天氣的對象,給天氣對象賦予一個下雨的動作

      至于我,也會實現一個我的對象,給我這個對象賦予一個打傘的動作

      在Java里面,這些動作可以稱為方法

      上面這兩種思想其實就是”換個角度看世界,換個姿勢處理問題”

      AOP的通用思想是:

      將通用邏輯從具體的業務邏輯中分離出來

      統一處理請求日志

      以記錄每一個http請求來寫實例

      首先去pom.xml添加aop的依賴

      org.springframework.boot spring-boot-starter-aop

      1

      2

      3

      4

      5

      增加一個aop的類:

      package cn.chenhaoxiang.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * Created with IntelliJ IDEA. * User: 陳浩翔. * Date: 2018/1/3. * Time: 下午 10:10. * Explain: */ @Aspect @Component public class HttpAspect { private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);//使用org.slf4j.Logger, /** * 定義切面 */ @Pointcut("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))") public void httpLog(){ } /** * 在方法執行之前執行 */ // @Before("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))")//*在這里表示匹配所有的方法, (..) 表示任意參數,包含沒有參數的 @Before("httpLog()") public void before(JoinPoint joinPoint){ logger.info("before"); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //url logger.info("url={}",request.getRequestURI());//會把request.getRequestURI()的值賦值到{}中去 //method 請求方式 logger.info("method={}",request.getMethod()); //ip logger.info("ip={}",request.getRemoteAddr()); //請求的類方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName()); //參數 logger.info("args={}",joinPoint.getArgs()); } // @After("execution(public * cn.chenhaoxiang.controller.IndexController.*(..))")//這個和上面的Before里面的值重復了,我們可以換種方式來實現 @After("httpLog()") public void after(){ logger.info("after"); } @AfterReturning(returning = "object",pointcut = "httpLog()") public void afterReturning(Object object){//object為方法返回的參數 logger.info("response={}",object);//toString,不然輸出的對象會是地址 //最好是不寫object.toString(),直接輸出object,這樣的話,就不用擔心object空指針了。 } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      基本上就是這些了。本章就到這兒了,該睡覺了,現在還在集體宿舍,鍵盤聲比較大、

      以后出去住就可以學習到半夜了,哈哈

      源代碼-:

      本文章由[諳憶]編寫, 所有權利保留。

      歡迎轉載,分享是進步的源泉。

      轉載請注明出處:

      http://chenhaoxiang.cn/2018/01/03/5001/

      本文源自【諳憶的博客】

      AOP Spring Boot

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel函數怎樣求最高值
      下一篇:wps下劃線怎么打?
      相關文章
      国产精品亚洲二区在线观看| 久久久久久久久无码精品亚洲日韩| 亚洲aⅴ无码专区在线观看| 亚洲AV无码专区在线亚| 亚洲手机中文字幕| 亚洲视频欧洲视频| 亚洲一区综合在线播放| 亚洲日本在线观看| 亚洲一区二区三区四区在线观看| 亚洲国产精品无码久久久不卡| 亚洲熟妇无码AV在线播放| 亚洲中文久久精品无码| 亚洲人成色777777在线观看| 亚洲精品乱码久久久久久| 国产亚洲一区二区在线观看| 久久久久亚洲av无码专区蜜芽| 亚洲AV无码一区二区乱子伦| 亚洲ⅴ国产v天堂a无码二区| 亚洲邪恶天堂影院在线观看| 亚洲精品视频专区| 亚洲国产视频网站| 亚洲中文字幕久久无码| 亚洲精品无码久久久久秋霞| 久久久久久亚洲av无码蜜芽| 成人亚洲综合天堂| 亚洲性久久久影院| 国产亚洲精品资源在线26u| 久热综合在线亚洲精品| 久久久久亚洲AV成人片| 亚洲中文久久精品无码1 | 91丁香亚洲综合社区| 精品丝袜国产自在线拍亚洲| 亚洲欧美日韩中文字幕一区二区三区| 亚洲精品无码久久久久秋霞| 亚洲福利精品一区二区三区 | 亚洲欧洲日本精品| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 亚洲AV无码专区在线播放中文| 亚洲高清在线视频| 亚洲精品网站在线观看你懂的| 精品日韩99亚洲的在线发布|