开发web应用

# 开发Spring web应用,最基本的需要构建以下组件:

  1.pojo类(从数据库获取数据)

   2.pringmvc控制器

   3.视图模板(页面)

##第一步 构建pojo类  

package tacos.pojo;

import lombok.Data;
import lombok.RequiredArgsConstructor;

@Data
@RequiredArgsConstructor
public class Ingredient {
    
    private final String id;
    
    @SuppressWarnings("unused")
    private final String name;
    
    private final Type type;
    
    public static enum Type{
        WARP,PROTEIN,VEGGIES,CHEESE,SAUCE
    }
    
}

###1.lombok 

 https://www.cnblogs.com/jthr/p/14139880.html

 

##第二步 构建控制器类,控制器类的作用是处理请求

 ###例子

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.slf4j.Slf4j;
import tacos.Ingredient;
import tacos.Ingredient.Type;

@Slf4j
@Controller
@RequestMapping("/design")
public class DesignTacoController {

@ModelAttribute //会在这个controller类中每个请求方法执行前被执行
public void addIngredientsToModel(Model model) {
    List<Ingredient> ingredients = Arrays.asList(
      new Ingredient("FLTO", "Flour Tortilla", Type.WRAP),
      new Ingredient("COTO", "Corn Tortilla", Type.WRAP),
      new Ingredient("GRBF", "Ground Beef", Type.PROTEIN),
      new Ingredient("CARN", "Carnitas", Type.PROTEIN),
      new Ingredient("TMTO", "Diced Tomatoes", Type.VEGGIES),
      new Ingredient("LETC", "Lettuce", Type.VEGGIES),
      new Ingredient("CHED", "Cheddar", Type.CHEESE),
      new Ingredient("JACK", "Monterrey Jack", Type.CHEESE),
      new Ingredient("SLSA", "Salsa", Type.SAUCE),
      new Ingredient("SRCR", "Sour Cream", Type.SAUCE)
    );
    
    Type[] types = Ingredient.Type.values();
    for (Type type : types) {
      model.addAttribute(type.toString().toLowerCase(),
          filterByType(ingredients, type));
    }
}
    

  @GetMapping("showDesignForm")
  public String showDesignForm(Model model) {
    model.addAttribute("design", new Taco());
    return "design";
  }

 @PostMapping
  public String processDesign(Design design) {
    // Save the taco design...
    // We'll do this in chapter 3
    log.info("Processing design: " + design);

    return "redirect:/orders/current"; //重定向
  }

private List<Ingredient> filterByType( List<Ingredient> ingredients, Type type) { return ingredients .stream() .filter(x -> x.getType().equals(type)) .collect(Collectors.toList()); } }

 ###1.注解说明

  @Slf4j注解说明:相当于 private static final Logger log = LoggerFactory.getLogger(Slf4jDemo.class);

  springmvc常用注解

  @RequestMapping   通用的梳理请求

  @GetMapping  处理get请求

  @PostMapping  处理Post请求

  @PutMapping  处理Put请求

  @DeleteMapping  处理Delete请求

  @PatchMapping  处理Patch请求

  通常我们可以在类上使用@RequestMapping指定通用路径,然后在方法上使用下面几个注解细化请求形式和具体路径

 注解:@ModelAttribute
  
该注解会使该方法在这个controller类中每个请求方法执行前被执行,如访问/design/showDesignForm,会先经过addIngredientsToModel方法

  springmvc参数接收常用方法 - https://www.cnblogs.com/jthr/p/13476648.html

###2.参数返回视图

@GetMapping("showDesignForm")
  public String showDesignForm(Model model) {
    model.addAttribute("design", new Taco());
    return "design";
  }

  这个接口直接返回的视图路径。没有返回参数。像Thymeleaf这样的视图库无法与控制器放到modal中的数据协同工作,但是它可以与request属性写作,所以,在spring返回视图前,它会将模型数据赋值到request属性中。这样在视图中可以获取到modal的数据。

 

###3.表单校验

  在pojo类上加上注解-设置校验规则

@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;

}

  在表单绑定的时候执行校验

  

  @PostMapping
  public String processOrder(@Valid Order order, Errors errors) {
    if (errors.hasErrors()) {
      return "orderForm";
    }
    
    log.info("Order submitted: " + order);
    return "redirect:/";
  }

 

  @Valid Order order

 

  这个注解告诉springmvc对Order 进行校验,如果校验存在错误,会捕捉一个error对象,返回视图

 

##对于某些请求,他们不需要填充模型,也不需要处理输入,也就是一个请求进来,不用参数,且直接返回视图 ,我们可以声明视图控制器

  这个类我们实现了WebMvcConfigurer接口,它定义了多个方法来配置springmvc

@Configuration
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/home").setViewName("homeview");  //这里它会处理/home这个请求,并且返回到/homeview这个视图
  }

}

 

这里就要用到配置类了@Configuration,在这个新的配置类中声明视图控制器