【SpringBoot】表單驗證和使用AOP處理請求
表單驗證
專案是上篇文章繼續的。
首先說下要幹嘛,我們需要攔截People年齡在18歲以下的
首先是在People上的年齡增加一個註解
@Min(value = 18,message = "年齡必須大於18")//message為提示 20180103
private Integer age;
在這裡,我們攔截新增的方法
也就是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);
}
這樣我們就實現了年齡的攔截,當年齡沒有大於等於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的依賴
<!-- AOP的依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
增加一個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空指標了。
}
}
基本上就是這些了。本章就到這兒了,該睡覺了,現在還在集體宿舍,鍵盤聲比較大、
以後出去住就可以學習到半夜了,哈哈
原始碼下載地址:
GITHUB原始碼下載地址:
本文章由[諳憶]編寫, 所有權利保留。
歡迎轉載,分享是進步的源泉。