领域类
应用的领域指的是它所要解决的主题范围:也就是会影响到对应用理解的理念和概念、
Lombok的库
编写领域类的时候,可以通过lombok库来编写短小简洁的代码。它是一个非常棒的库,能够在运行时生成getter和setter方法,以及equals()、hashCode()、toString()等方法。
使用方式
1、pom文件引入坐标
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2、IDE中添加扩展插件
比如在IDEA中
常用注解
@Data注解
@Data注解就是由Lombok提供的,它会告诉Lombok生成所有缺失的方法,同时还会生成所有以final属性作为参数的构造器。
@Slf4j
在运行时,它会在类中自动生成一个SLF4J(Simple Logging Facade for Java)Logger。等同于如下的写法
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(xxxController.class);
Spring MVC
在Spring MVC框架中,控制器是重要的参与者。它们的主要职责是处理HTTP请求,要么将请求传递给视图以便于渲染HTML(浏览器展现),要么直接将数据写入响应体(RESTful)。
视图
Spring提供了多种定义视图的方式,包括JavaServer Pages(JSP)、Thymeleaf、FreeMarker、Mustache和基于Groovy的模板。
如果使用thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
像Thymeleaf这样的视图库在设计时是与特定的Web框架解耦的。这样的话,它们无法感知Spring的模型抽象,因此无法与控制器放到Model中的数据协同工作。但是,它们可以与Servlet的request属性协作。所以,在Spring将请求转移到视图之前,它会把模型数据复制到request属性中,Thymeleaf和其他的视图模板方案就能访问到它们了。
Thymeleaf模板就是增加一些额外元素属性的HTML,这些属性能够指导模板如何渲染request数据。
举例来说,如果有一个请求属性的key为“message”,我们想要使用Thymeleaf将其渲染到一个HTML
标签中,那么在Thymeleaf模板中我们可以这样写:
<p th:text="${message}">placeholder message</p>
当模板渲染成HTML的时候,
元素体将会被替换为Servlet Request中key为“message”的属性值。“th:text”是Thymeleaf命名空间中的属性,它会执行这个替换过程。${}会告诉它要使用某个请求属性(在本例中,也就是“message”)中的值。
Spring Boot自动配置功能所支持的模板方案
通常来讲,你只需要选择想要的视图模板库,将其作为依赖项添加到构建文件中,然后就可以在“/templates”目录下(在基于Maven或Gradle构建的项目中,它会在“src/main/resources”目录下)编写模板了。Spring Boot会探测到你所选择的模板库,并自动配置为Spring MVC控制器生成视图所需的各种组件。
缓存模板
默认情况下,模板只有在第一次使用的时候解析一次,解析的结果会被后续的请求所使用。对于生产环境来说,这是一个很棒的特性,它能防止每次请求时多余的模板解析过程,因此有助于提升性能。
但是,在开发期,这个特性就不太友好了,可以选择禁用掉:
默认情况下,这些属性都设置成了true,以便于启用缓存。我们可以将缓存属性设置为false,从而禁用所选模板引擎的缓存。
视图控制器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
}
}
关于WebConfig,最需要注意的事情就是它实现了WebMvcConfigurer接口。WebMvcConfigurer定义了多个方法来配置Spring MVC。尽管只是一个接口,但是它提供了所有方法的默认实现,只需要覆盖所需的方法即可。
addViewControllers()方法会接收一个ViewControllerRegistry对象,我们可以使用它注册一个或多个视图控制器。在这里,我们调用registry的addViewController()方法,将“/”传递了进去,视图控制器将会针对该路径执行GET请求。这个方法会返回ViewControllerRegistration对象,我们马上基于该对象调用了setViewName()方法,用它指明当请求“/”的时候要转发到“home”视图上。
校验表单输入
Spring支持Java的Bean校验API(Bean Validation API,也被称为JSR-303)。这样的话,我们能够更容易地声明检验规则,而不必在应用程序代码中显式编写声明逻辑。
较新版本的Spring Boot移除了相关依赖,如需使用,需要手动添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
要在Spring MVC中应用校验,我们需要:
- 在要被校验的类上声明校验规则。
- 在控制器方法中声明要进行校验。
- 修改表单视图以展现校验错误。
Validation API提供了一些可以添加到领域对象上的注解,以便于声明校验规则。Hibernate的Validation AP实现又添加了一些校验注解。
@Data
public class Order {
@NotBlank(message="Name is required")
private String name;
@NotBlank(message="Street is required")
private String street;
@NotBlank(message="City is required")
private String city;
@NotBlank(message="State is required")
private String state;
@NotBlank(message="Zip code is required")
private String zip;
@CreditCardNumber(message="Not a valid credit card number")
private String ccNumber;
@Pattern(regexp="^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$", message="Must be formatted MM/YY")
private String ccExpiration;
@Digits(integer=3, fraction=0, message="Invalid CVV")
private String ccCVV;
}
一个基本的Controller样例
@Slf4j
@Controller
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/current")
public String orderForm(Model model){
model.addAttribute("order",new Order());
return "orderForm";
}
@PostMapping
public String processOrder(@Valid Order order, Errors errors,Model model){
if (errors.hasErrors()){
return "orderForm";
}
log.info("Order submitted:" + order);
return "redirect:/";
}
}
@Controller
这个注解会将这个类识别为控制器,并且将其作为组件扫描的候选者,所以Spring会发现它并自动创建一个这个类的实例,并将该实例作为Spring应用上下文中的bean。
@RequestMapping
它能够指定该控制器所处理的请求类型
@GetMapping
是一个相对较新的注解,是在Spring 4.3引入的。在Spring 4.3之前,你可能需要使用方法级别的@RequestMapping注解作为替代:
@RequestMapping(method=RequestMethod.GET)
Model对象
Model对象负责在控制器和展现数据的视图之间传递数据。实际上,放到Model属性中的数据将会复制到Servlet Response的属性中,这样视图就能在这里找到它们了。
@Valid
@Valid注解会告诉Spring MVC要对提交的Order对象进行校验,而校验时机是在它绑定完表单数据之后、调用processOrder()之前。如果存在校验错误,那么这些错误的细节将会捕获到一个Errors对象中并传递给processOrder()。processOrder()方法的前几行会查阅Errors对象,调用其hasErrors()方法判断是否有校验错误。如果存在校验错误,那么这个方法将不会处理Order对象并返回“orderForm”视图名。
Spring MVC中所有可用的请求映射注解
新的请求映射注解具有和@RequestMapping完全相同的属性,所以我们可以在使用@RequestMapping的任何地方使用它们。
通常,会在类级别上使用@RequestMapping,以便于指定基本路径。在每个处理器方法上,我会使用更具体的@GetMapping、@PostMapping等注解。