【SpringBoot】表單驗證和使用AOP處理請求
表單驗證
項目是上篇文章繼續的。
首先說下要干嘛,我們需要攔截People年齡在18歲以下的
首先是在People上的年齡增加一個注解
@Min(value = 18,message = "年齡必須大于18")//message為提示 20180103 private Integer age;
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的依賴
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小時內刪除侵權內容。