@Valid 驗證性註解 ,根據註釋驗證表單數據
1.新建enity 類
package com.imooc.sell.dataobject;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.imooc.sell.enums.OrderStatusEnum;
import com.imooc.sell.enums.ProductStatusEnum;
import com.imooc.sell.utils.CodeUtils;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
/**商品
* @Author: 阿俊哥
* @Date: 2019/3/2 12:57
* @Version 1.0
*/
@Entity
@Data
@DynamicUpdate
@Table(name = "product_info")
public class ProductInfo {
@Id
private String productId;
/*商品名稱*/
private String productName;
/*商品價格*/
private BigDecimal productPrice;
/*商品庫存*/
private Integer productStock;
/*商品介紹*/
private String productDescription;
/*商品圖片*/
private String productIcon;
/*商品狀態 0 上架 1 下架*/
private Integer productStatus=ProductStatusEnum.UP.getCode();
private Date createTime;
private Date updateTime;
/*商品所在類目*/
private Integer categoryType;
public ProductStatusEnum getProductStatusCode()
{
return CodeUtils.getCode(productStatus, ProductStatusEnum.class);
}
}
2.新建form對應的實體類對象
通常爲了代碼的可讀性,和區分實體類的功能的原則下,我們會建立一個與表單對應的實體對象,況且大多數的情況下,我們的表單對應的字段少於實體類對應的字段
package com.imooc.sell.form;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
/**
* @Author: 阿俊哥
* @Date: 2019/3/19 20:06
* @Version 1.0
*/
@Data
public class ProductForm {
private String productId;
@NotEmpty(message = "名稱不能爲空")
/*商品名稱*/
private String productName;
@NotEmpty(message ="價格不能爲空" )
/*商品價格*/
private BigDecimal productPrice;
@Min(value = 1,message = "庫存數不能小於1")
/*商品庫存*/
private Integer productStock;
/*商品介紹*/
private String productDescription;
/*商品圖片*/
private String productIcon;
/*商品所在類目*/
private Integer categoryType;
}
關於驗證性註釋,我們一般都寫在表單對象裏面
還有以下注釋可以選擇 來自https://blog.csdn.net/hlx20080808/article/details/80494199
@Null 限制只能爲null
@NotNull 限制必須不爲null
@AssertFalse 限制必須爲false
@AssertTrue 限制必須爲true
@DecimalMax(value) 限制必須爲一個不大於指定值的數字
@DecimalMin(value) 限制必須爲一個不小於指定值的數字
@Digits(integer,fraction) 限制必須爲一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future 限制必須是一個將來的日期
@Max(value) 限制必須爲一個不大於指定值的數字
@Min(value) 限制必須爲一個不小於指定值的數字
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在min到max之間
@Past 驗證註解的元素值(日期類型)比當前時間早
@NotEmpty 驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0)
@NotBlank 驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email 驗證註解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
3.新建Controller 類
/**
* @Author: 阿俊哥
* @Date: 2019/3/17 18:19
* @Version 1.0
*/
@Controller
@Slf4j
@RequestMapping("/seller/product")
public class SellerProductController {
@Autowired
ProductService productService;
@Autowired
CategoryService categoryService;
@RequestMapping("/save")
public ModelAndView save(@Valid ProductForm productForm,
BindingResult bindingResult,
Map<String,Object> map)
{
//判斷有沒有出錯
if(bindingResult.hasErrors())
{
map.put("msg", bindingResult.getFieldError().getDefaultMessage());
map.put("url","/sell/seller/product/index");
return new ModelAndView("common/error", map);
}
//對於修改,我們要先查詢基本的值,再進行更新
//捕獲一下異常
try{
ProductInfo productInfo = new ProductInfo();
if(StringUtils.isEmpty(productForm.getProductId()))
{
productInfo = ProductForm2ProductInfo.convert(productForm,productInfo);
}
else{
productInfo = productService.findById(productForm.getProductId());
productInfo = ProductForm2ProductInfo.convert(productForm,productInfo);
}
productService.saveProduct(productInfo);
}catch (Exception e)
{
map.put("msg", ResultEnum.ERROR.getMsg());
map.put("url","/sell/seller/product/index");
return new ModelAndView("common/error", map);
}
map.put("url","/sell/seller/product/list");
return new ModelAndView("common/success", map);
}
4.當我們在存儲的時候,我們會把form對象轉換爲entity 對象,這裏爲了邏輯功能的實現和代碼的可讀性,我們專門創建一個類,來進行form 對象和 entity 對象的轉換
package com.imooc.sell.converter;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonToken;
import com.imooc.sell.dataobject.OrderDetail;
import com.imooc.sell.dto.OrderMasterDTO;
import com.imooc.sell.enums.ResultEnum;
import com.imooc.sell.exception.ResultException;
import com.imooc.sell.form.OrderForm;
import lombok.extern.slf4j.Slf4j;
import sun.rmi.runtime.Log;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: 阿俊哥
* @Date: 2019/3/8 20:16
* @Version 1.0
*/
@Slf4j
public class OrderForm2OrderMasterDTO {
public static OrderMasterDTO convert(OrderForm orderForm)
{
Gson gson = new Gson();
OrderMasterDTO orderMasterDTO = new OrderMasterDTO();
orderMasterDTO.setBuyName(orderForm.getName());
orderMasterDTO.setBuyPhone(orderForm.getPhone());
orderMasterDTO.setBuyAdress(orderForm.getAddress());
orderMasterDTO.setBuyOpenid(orderForm.getOpenid());
List<OrderDetail> orderDetailList = new ArrayList<>();
try {
orderDetailList = gson.fromJson(orderForm.getItems(), new TypeToken<List<OrderDetail>>(){}.getType());
}catch (Exception e)
{
log.error("【對象轉換錯誤】錯誤 String = {}",orderForm.getItems());
}
orderMasterDTO.setOrderDetailList(orderDetailList);
return orderMasterDTO;
}
}
5.接下來就是頁面了,我們這裏用的freemarker 我們這裏主要有一些表單的代碼
<#--主要內容content-->
<div id="page-content-wrapper">
<div class="container-fluid">
<div class="row clearfix">
<div class="col-md-12 column">
<form role="form" method="post" action="/sell/seller/product/save">
<div class="form-group">
<label >名稱</label>
<input type="text" class="form-control" name="productName" value="${(productInfo.getProductName())!""}" />
</div>
<div class="form-group">
<label >單價</label>
<input type="text" class="form-control" name="productPrice" value="${(productInfo.getProductPrice())!""}" />
</div>
<div class="form-group">
<label >庫存</label>
<input type="number" class="form-control" name="productStock" value="${(productInfo.getProductStock())!""}" />
</div>
<div class="form-group">
<label >介紹</label>
<input type="text" class="form-control" name="productDescription" value="${(productInfo.getProductDescription())!""}" />
</div>
<div class="form-group">
<label >圖片</label>
<img src="${(productInfo.productIcon)!""}" width="150" height="130" />
<input type="text" class="form-control" name="productIcon" value="${(productInfo.getProductIcon())!""}" />
</div>
<div class="form-group">
<label >類目</label>
<select name="categoryType" class="form-control">
<#list productCategorieList as productCategory>
<option value="${productCategory.categoryType}"
<#if productInfo?? && productCategory.categoryType == productInfo.categoryType>
selected
</#if>
>${productCategory.getCategoryName()}</option>
</#list>
</select>
</div>
<div>
<input type="text" name="productId" value="${(productInfo.productId)!""}" hidden="hidden">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
</div>
</div>
</div>
這樣當我們表單提價的時候就會自動的進行驗證 轉換,