Springboot初探
一、springboot基础
- 需要的前置知识:
1).利用maven构建项目
2).spring注解
3).RESTful API - 是spring MVC的升级版,但可以不需要掌握spring mvc
- java 和 Maven等版本保持一致
1.第一个springboot程序
-
用idea创建一个springboot web程序
new --> project --> Spring Initalizr --> next -->填写相关的内容 --> 选择web --> 勾选web -->创建成功
项目结构: -
启动spring boot项目的方式:
1).在程序中idea直接run Application.java类,在有mvn环境中
2).进入到项目所在目录,命令:mvn spring-boot:run
3).先编译程序mven install
然后进入target目录,会生成一个jar(项目名-版本号-SNAPSHOT.jar)文件,然后java -jar 项目名-版本号-SNAPSHOT.jar
2.自定义属性配置
- 配置文件为src/main/resources/application.properties
名字不可变,有些情况下可以使用application.yml - 配置端口
server.prot=8080
配置项目根路径server.content-path:/项目名
- 配置常用变量
变量名=变量值
在程序中使用时可以用@Value("${变量名}")
来申明使用 - 可以配置多个配置文件,使用其中一个配置文件,但是主配置文件仍然是application.properties
如配置了多个配置文件 application-dev.peoperties 和 application-prod.peoperties,在主配置文件中可以用spring.profiles.active=dev/prod
来决定使用哪个配置文件
总结
@Value 简单配置的取值
@Component 为配置类添加为bean组件
@ConfigurationProperties 为配置类添加配置说明,取得的值是哪一前缀对应的配置值
3.Controller的使用
1 .Controller即用来接客户端的请求的
分类 | 说明 |
---|---|
@Controller | 处理http请求 |
@RestController | Spring4之后新加的注解,用来返回json,简化之前的@Controller+@ResponseBody组合 |
@RequestMapping | 配置url映射 |
2. 说明
- 在springboot中使用@RestController即可以做到直接返回json格式
在使用@Controller需要和@ResponseBody组合才能返回json格式 - 直接使用@Controller时,返回的是对项目中某个页面的引用,需要引入模板
thymeleaf
,并设置响应的html/jsp页面,才能返回页面内容 - 可以用@RequestMaping配置每个controller(Controller和RestController)和controller的方法的url
@RquestMapping(value="/hlleo", method=RequestMethod.GET) //配置单映射
@RquestMapping(value={"/hlleo","/hi"},method=RequestMethod.GET) //配置多映射
其中当不指定method时,get和post方式都可以访问
3. Controller如何处理url中的参数
分类 | 说明 |
---|---|
@PathVariable | 获取url中的数据 |
@RequestParam | 获取请求参数的值 |
@GetMapping/@PostMapping | 组合注解 |
实例如下:
@PathVariable
获取url中的数据
@RequestMapping(value="/say/{id}", method=RequestMethod.GET)
public String say(@PathVariable("id") Integer myid){
return "id: " + myid;
}
访问 url : localhost:8080/say/100
得到 id: 100
@RequestParam
获取请求参数的值
@RequestMapping(value="/say", method=RequestMethod.GET)
public String say(@("id") Integer myid){
return "id: " + myid;
}
访问 url : localhost:8080/say?id=100
得到 id: 100
@GetMapping
组合注解
@GetMapping(value="/say") 相当于
@RequestMapping(value="/say", method=RequestMethod.GET)
@PostMapping(value="/say") 相当于
@RequestMapping(value="/say", method=RequestMethod.POST)
4.spring-data-jpa
JAP(java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate,TopLink等。
5.事务管理
数据库事务:即一系列的mysql操作的集合
@Transactional
即是对事务管理方法的注解方式
二、springboot web
1.springboot表单验证
可以验证传入对象的某些属性的值
可以在对象定义类中对某个属性加对应的注解,如最小值验证
@Min(value=18, message="错误信息")
然后在使用这个类时,需要在前面加@Valid,即可以做到验证对象属性。
2.AOP处理请求
AOP是一种编程范式,与语言无关,一种编程思想
分类 | 解释 |
---|---|
AOP | Aspect Oriented Programming 面向切面 |
OOP | Object Oriented Programming 面向对象 |
POP | Procedure Oriented Programming 面向过程 |
springboot应用AOP
首先需要加入AOP依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
然后定义一个切面类处理Http请求
@Aspect //声明为切面
@Component //加入springbean中,自动注入
public class HttpAspect {
//用logger的方式打印日志
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
//声明为公共切面可以省去重复的定义
@Pointcut("execution(public * com.kk.Controller.GirlController.*(..))") //拦截这个正则表达式对应的controoler
public void log(){
}
@Before("log()")
public void doBefore(){
logger.info("before aspect");
}
@After("log()")
public void doAfter(){
logger.info(" aspect after");
}
}
3.异常处理
出现异常时和成功时返回的对象应该保持一致,即应该完成对数据的封装和格式的统一,否则调用端口时很难处理。
初步处理异常
一般做如下处理:
1.定义一个返回结果类, 一般定义在domain或model包内
一般包含返回状态码,返回状态描述,返回对象内容,
public class Result<T> {
/** 错误码. */
private Integer code;
/** 提示信息. */
private String msg;
/** 具体的内容. */
private T data;
.....
}
2.返回时应该返回 Result<Object>
@PostMapping(value="/girls")
public Result<Girl> girlAdd(@Valid Girl girl, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
}
girl.setCupSize(girl.getCupSize());
girl.setAge(girl.getAge());
return ResultUtil.success(girlRepository.save(girl));
}
3.优化去除重复代码时应用了一个ResultUtil类
public class ResultUtil {
public static Result success(Object object){
Result result = new Result();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
return result;
}
public static Result error(Integer code, String msg){
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
定义自己的异常类和系统异常区分开
1.定义一个自己的异常类
//继承RuntimeException是因为springboot的异常就是这个
public class GirlException extends RuntimeException {
private Integer code;
public GirlException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
2.定义一个捕获异常的类
@ControllerAdvice //springboot特殊的捕获异常类的注解
public class ExceptionHandle {
@ExceptionHandler(value=Exception.class) //捕获的是Exception类型的异常
@ResponseBody //为了返回的是json格式
public Result Handle(Exception e){
if(e instanceof GirlException){
GirlException girlException = (GirlException)e;
return ResultUtil.error(girlException.getCode(),girlException.getMessage());
}else {
return ResultUtil.error(-1, "未知错误");
}
}
}