【Spring】二,web应用开发中的常用技术点

领域类

应用的领域指的是它所要解决的主题范围:也就是会影响到对应用理解的理念和概念、

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等注解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值