项目代码路径
http://download.csdn.net/download/fulq1234/9996291
2-0 表单验证
Girl.java
package com.imooc.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.Min;
@Entity
public class Girl {
@Id
@GeneratedValue
private Integer id;
private String cupSize;
@Min(value=18,message="未成年少女禁止入内")
private Integer age;
public Girl() {
}
public Girl(String cupSize, Integer age) {
super();
this.cupSize = cupSize;
this.age = age;
}
/**getter/setter方法**/
/**toString方法**/
}
GirlController.java
package com.imooc.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;
import com.imooc.domain.Girl;
import com.imooc.domain.Result;
import com.imooc.repository.GrilRepository;
import com.imooc.service.GirlService;
import com.imooc.util.ResultUtil;
@RestController
public class GirlController {
@Autowired
private GrilRepository girlRepository;
@Autowired
private GirlService girlService;
/**
* 查询所有女生列表
* @return
*/
@GetMapping(value = "/girls")
public List<Girl> girlList(){
System.out.println("girlList");
return girlRepository.findAll();
}
/**
* 添加一个女生
* @param girl
* @return
*/
@PostMapping(value="/girls")
public Result<Girl> girlAdd(@Valid Girl girl,BindingResult bindingResult){
if(bindingResult.hasErrors()){
return ResultUtil.error(1, bindingResult.getFieldError().getDefaultMessage());
}
return ResultUtil.success(girlRepository.save(girl));
}
/**
* 查询一个女生
* @param id
* @return
*/
@GetMapping(value="/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id){
return girlRepository.findOne(id);
}
/**
* 更新
* @param girl
* @return
*/
@PutMapping(value="/girls/{id}")
public Girl girlUpdate(Girl girl){
return girlRepository.save(girl);
}
/**
* 删除
*/
@DeleteMapping(value="/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
girlRepository.delete(id);
}
//通过年龄查询女生列表
@GetMapping(value="/girls/age/{age}")
public List<Girl> girlListByAge(@PathVariable("age") Integer age){
return girlRepository.findByAge(age);
}
@GetMapping(value="/girls/getage/{id}")
public void getAge(@PathVariable("id") Integer id) throws Exception{
girlService.getAge(id);
}
}
2-1 使用AOP处理请求
HttpAspect.java
package com.imooc.aspect;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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;
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
//@Before("execution(public * com.imooc.controller.GirlController.girlList(..))")//只拦截girlList方法
@Pointcut("execution(public * com.imooc.controller.GirlController.*(..))")//拦截GirlController的所有方法
public void log(){
logger.info("111111111");
}
@Before("log()")
public void before(JoinPoint jp){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url
logger.info("url={}",request.getRequestURI());//打印的内容,会替换{}
//请求方式
logger.info("method={}",request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr());
//类方法
logger.info("class_method={}",jp.getSignature().getDeclaringTypeName() + "," + jp.getSignature().getName());//com.imooc.controller.GirlController,girlList
//参数
logger.info("args={}",jp.getArgs());
}
@AfterReturning(returning="object",pointcut="log()")
public void doAfterReturning(Object object){
logger.info("response={}",object.toString());
}
@After("log()")//拦截GirlController的所有方法
public void doAfter(){
logger.info("222222222");
}
}
2-4 统一异常处理
Service中发生错误,后抛出异常,由ExceptionHandle统一处理
import com.imooc.enums.ResultEnum;
//RuntimeException继承Exception ,spring只对继承RuntimeException的异常进行回滚
public class GirlException extends RuntimeException {
private Integer code;
public GirlException(ResultEnum resultEnum){
super(resultEnum.getMsg());
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
ExceptionHandle.java 捕捉异常类
package com.imooc.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.imooc.domain.Result;
import com.imooc.exception.GirlException;
import com.imooc.util.ResultUtil;
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
/**
* 捕获异常类
* @return
*/
@ExceptionHandler(value=Exception.class)
@ResponseBody
public Result handle(Exception e){
if(e instanceof GirlException){
GirlException girlException = (GirlException) e;
return ResultUtil.error(girlException.getCode(), girlException.getMessage());
}
return ResultUtil.error(-1, "未知错误");
}
}
GirlService.java
package com.imooc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.imooc.domain.Girl;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.GirlException;
import com.imooc.repository.GrilRepository;
@Service
public class GirlService {
@Autowired
private GrilRepository girlRepository;
public void getAge(Integer id) throws Exception{
Girl girl = girlRepository.findOne(id);
Integer age = girl.getAge();
if(age < 10){
//返回“你还在上小学吧
throw new GirlException(ResultEnum.PRIMARY_SCHOOL);
}else if(age>10 && age<16){
//返回”你可能在上初中
throw new GirlException(ResultEnum.MIDDLE_SCHOOL);
}
}
/**其它方法**/
}
2-5 单元测试
package com.imooc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GirlServiceTests {
@Autowired
private MockMvc mvc;
@Test
public void test() throws Exception{
mvc.perform(MockMvcRequestBuilders.get("/girls"))
.andExpect(MockMvcResultMatchers.status().isOk())//返回值状态 ok
.andExpect(MockMvcResultMatchers.content().string("abc"));//返回值abc
}
}