🎉

【初心者向け/ITスクール 70日】個人プロジェクトスタート4日目

2023/10/26に公開

はじめに

今日は、Spring BootのWEB MVCの活用について、勉強しました。
以前は、ServletからSessionを処理しましたが、SpringBootからSessionを扱ったり、ファイルをアップロードしたこと、データーを検証したことがないので、そちらを中心に勉強しました。
おそらく、今日徹夜でJPAも作ってみれば、すぐプロジェクトにも挑めると思います!

Validation

Domain vs DTO

Domain(Entity)とDTO(form)は徹底的に分けること!

Item(domain)
@Data
public class Item {

    private Long id;
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
ItemSaveForm(DTO)
@Data
public class ItemSaveForm {

    @NotBlank
    private String itemName;

    @NotNull
    @Range(min = 1000, max=1000000)
    private Integer price;

    @NotNull
    @Max(value=9999)
    private Integer quantity;
}

Controller


@PostMapping("/add")
    public String addItem1(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes){

        //field Errorでは処理できない場合は、Controllerに作成
        if (form.getPrice() != null && form.getQuantity() != null) {
            int resultPrice = form.getPrice() * form.getQuantity();
            if (resultPrice < 10000) {
                bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null);
            }
        }

        //失敗する際のロジック
        if (bindingResult.hasErrors()) {
            log.info("errors={}", bindingResult);
            return "validation/v4/addForm";
        }
        //成功する際にのロジック
        Item item = new Item();
        item.setItemName(form.getItemName());
        item.setPrice(form.getPrice());
        item.setQuantity(form.getQuantity());

        Item savedItem = itemRepository.save(item);
        redirectAttributes.addAttribute("itemId", savedItem.getId());
        redirectAttributes.addAttribute("status", true);
        return "redirect:/validation/v4/items/{itemId}";
    }

Session

sessionを無駄に生成せずに、loginしていない人、sessionがあい人にはhomeをloginした人にはlogin homeを転送する方法です。
@SessionAttributeを活用します。

    @GetMapping("/")
    public String homeLoginV3Spring(
            @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model){
        //sessionがnullの場合、home
        if(loginMember == null){
            return "home";
        }

        //sessionが維持されている場合,login home
        model.addAttribute("member",loginMember);
        return "loginHome";
    }
server.servlet.session.tracking-modes=cookie

ブラウザーから最初sessionを生成する際にsession idをURLに乗せないようにするオプションです。

Discussion