🎉
【初心者向け/ITスクール 70日】個人プロジェクトスタート4日目
はじめに
今日は、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