使用Spring Boot开发web应用程序非常方便,只需要进行简单的配置,可以把更多的精力放在业务逻辑上。
在spring 官网上,根据需求下载Spring Boot的初始工程。链接如下:
https://start.spring.io/
拿到初始工程之后,第一件事情,就是搞一个helloworld程序。代码写好之后,运行程序。
Spring Boot程序的运行有三种方式:
- 通过idea直接启动,右键—run
- 通过maven直接启动,进入到项目的目录下,执行
mvn spring-boot:run
- 进入到项目目录下,执行
maven install
编辑jar包,执行java -jar XX.jar
运行程序。
web应用程序,肯定是要需要使用配置文件保存基本配置信息,比如各种DB的连接信息或者业务逻辑的配置项。Spring Boot项目中对于配置项的支持非常友好,支持两种类型的配置文件,分别是 properties
类型和 yml
类型。其中 yml
的配置文件描述的更加清晰,推荐使用。下边是一个yml格式的配置文件:
2.1 在程序中,使用 @Value
注解提取配置信息。
@Entity
public class Student
{
@Value("${id}")
private Integer id;
@Value("${name}")
private String name;
...
2.2 使用@ConfigurationProperties注解加载整个小结
例如,yml
配置文件中存在如下配置:
student:
id: 1
name: zhangsan
age: 18
height: 175
使用@ConfigurationProperties注解,使得该小结的配置项直接映射成为一个对象。在注解中,通过prefix字段指定要加载的配置小结。
@Entity
@ConfigrationProperties(prefix="student")
public class Student
{
private Integer id;
private String name;
private Integer age;
private Integer height;
public Student()
{
}
...
2.3 支持多套配置文件
Spring Boot中可以准备多套备用的配置文件,在主配置文件中,可以指定要使用的备用配置文件
在主配置文件 application.yaml
中,指定要使用的配置文件:
spring:
profiles:
active: file1
配置文件与程序代码是分开的,在运行jar的时候,可以自由使用对应的配置文件
java -jar target/test-0.0.1-SNAPSHOT.jar --spring.profiles.active=file1
3. Controller
3.1 基本注解使用
- @Controller注解修饰类,标明该类用于处理请求,使用的时候,需要在pom文件中国配置模版引擎,准备templates目录下的html文件。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在controller中,通过return指定返回的html模版。
@Controller
public class HelloController
{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello()
{
return "index";
}
}
如果不想使用模版,则需要同时标注@ResponseBody注解。
- @RequestMapping注解用于修饰方法,表示绑定的url和http方法类型。
- @RestController注解用于修饰类,与@Controller类似,但是不需要使用模版引擎,可以单独直接使用。
@RestController public class HelloController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public String sayHello() { return "helloworld"; } }
- @GetMapping,@PostMapping等注解用于修饰方法,作用与@RequestMapping类似。但是因为@GetMapping注解本身已经包含了方法,所以只需要设置路径信息。
@GetMapping(value = "/hello")
public String sayHello()
{
return "index";
}
3.2 绑定多个url
只需要给@RequestMapping注解的value字段赋值为一个集合即可。
@RestController
public class HelloController
{
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public String sayHello()
{
return "helloworld";
}
}
3.3 请求中的参数
参数包含两类,路径参数 @PathVariable
和请求参数 @RequestParam
。
路径参数举例:
@GetMapping(value = "/hello/{word}")
public String sayHello(@PathVariable("word") String word)
{
return "index";
}
请求参数举例如下:
@GetMapping(value = "/hello")
public String sayHello(@RequestParam("word") String word)
{
return "index";
}
3.4 请求参数的默认值
@GetMapping(value = "/hello")
public String sayHello(@RequestParam(value = "word", required = false,
defaultValue = "hello") String word)
{
return "index";
}
3.5 参数合并
我们的controller中可能存在这样的接口,根据用户输入的信息,来创建某一个对象。下边的例子是根据用户提交的信息,创建一个Student对象并且入库。
@PostMapping(value = "/student")
public Student studentCreate(@RequestParam("name") String name,
@RequestParam("age") Integer age,
@RequestParam("height") Integer height)
{
Student student = new Student();
student.setName(name);
student.setAge(age);
student.setHeight(height);
return save(student);
}
这段代码看起来没有问题问题,但是扩展性不足,而且参数太多,如果后续还需要再增加100个属性,就需要把新的100个参数也都塞进来。
其实,可以将该接口的参数直接设置为Student类型的对象,这样无论Student类怎么变更,这里都是通用的。
@PostMapping(value = "/student")
public Student studentCreate(Student student)
{
return save(student);
}
4. 数据库操作这里只侧重介绍Spring boot的使用方法,实际使用的时候,注意安全校验哈。
4.1 配置mysql和jpa
在application.yml中配置mysql的连接信息和jpa的ddl策略:
spring:
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
enable_lazy_load_no_trans: false
show-sql: true
datasource:
username: root
password: root
url: jdbc:mysql://192.168.99.100:3306/test
driver-class-name: com.mysql.jdbc.Driver
ddl-auto指定策略。当指定为create或者update的时候,在程序启动的时候,均为自动创建要使用的数据表。两者的区别在于,当db中已经存在同名表的时候,create会选择删除重建,而update则直接使用。
- show-sql字段用于表示是否在控制台显示出最终的sql语句。
4.2 数据表定义
在jpa中,不需要通过sql语句来创建表。对于需要存储的对象,我们只需要在定义的类上边添加 @Entity
注解即可。jpa会创建与该类同结构字段的数据表。@Id
表示主键,@GeneratedValue
表示自增。
需要定义无参的构造函数和set/get方法。
@Entity
public class Student
{
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer age;
private Integer height;
public Student(){}
// set和get方法
...
4.3 定义sql操作
使用jpa会大大提高效率,因为不需要去写sql语句,而是通过java代码实现。
jpa中存在一系列的函数命名规范,开发过程中需要遵守其规范。
extends JpaRepository<类, 主键类型>
根据id查询Student对象。
public interface StudentDao extends JpaRepository<Student, Integer>
{
public Student findById(Integer id);
}
5. 事务支持
使用 @Transactional
注解修饰方法,保证该方法中的操作都处在同一个事务中。
@Transactional
public void insert()
{
DbUtil.insertNum(1);
DbUtil.insertNum(2);
}
6. 表单验证
我们认为客户提交的数据都是不安全的,对于表单数据,我们可以使用spring boot提供的注解方式进行验证。
下边的例子中,我们设置学生的年龄不能小于7岁。通过 @Min
注解设置最小值,并不满足条件时候的错误信息。
@Entity
public class Student
{
@Id
@GeneratedValue
private Integer id;
private String name;
@Min(value = 7, message = "不满足入学年龄")
private Integer age;
...
在rest接口中,添加 @Valid
注解打开校验,并在参数中添加BindingResult 对象,用于获取校验结果。
@PostMapping(value = "/student")
public Student studentCreate(@Valid Student student, BindingResult bindingResult)
{
if (bindingResult.hasErrors())
{
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
return save(student);
}
7. 异常
在spring boot中,如果处理逻辑中抛出了异常,则可以通过定义ControllerAdvice进行统一的处理。
@ControllerAdvice
public class ExceptionHandle
{
@ExceptionHandler(value = Exception.class)
@ResponseBody
public void handleException(Exception e)
{
...
}
}
也可以把@ControllerAdvice
替换成@RestControllerAdvice
,这样就不需要添加@ResponseBody
:
@RestControllerAdvice
public class ExceptionHandle
{
@ExceptionHandler(value = Exception.class)
public void handleException(Exception e)
{
...
}
}