真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解

本章節(jié)內(nèi)容很豐富,主要有基本的表單操作,數(shù)據(jù)的格式化,數(shù)據(jù)的校驗(yàn),以及提示信息的國(guó)際化等實(shí)用技能。
首先看效果圖

創(chuàng)新互聯(lián)是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁(yè)美工、網(wǎng)站程序員、網(wǎng)頁(yè)設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷人員及形象策劃。承接:網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開(kāi)發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門(mén)戶平臺(tái)等全方位的服務(wù)。

SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解

項(xiàng)目結(jié)構(gòu)圖

SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解

接下來(lái)用代碼重點(diǎn)學(xué)習(xí)SpringMVC的表單操作,數(shù)據(jù)格式化,數(shù)據(jù)校驗(yàn)以及錯(cuò)誤提示信息國(guó)際化。請(qǐng)讀者將重點(diǎn)放在UserController.java,User.java,input.jsp三個(gè)文件中。
maven 項(xiàng)目必不可少的pom.xml文件。里面有該功能需要的所有jar包。

<?xml version="1.0" encoding="UTF-8"?> 
 
 4.0.0 
 com.springmvc 
 springmvc 
 0.0.1-SNAPSHOT 
 war 
 
  
  
  
   
   maven-compiler-plugin 
    
    1.7 
    1.7 
    UTF-8 
    
   
  
  
 
  
 4.1.3.RELEASE 
  
  
  
  
  org.springframework 
  spring-webmvc 
  ${spring.version} 
  
 
  
  org.springframework 
  spring-context 
  ${spring.version} 
  
 
  
  org.springframework 
  spring-aop 
  ${spring.version} 
  
 
  
  org.springframework 
  spring-core 
  ${spring.version} 
  
  
  
  org.springframework 
  spring-web 
  ${spring.version} 
  
 
  
  
  javax.servlet 
  javax.servlet-api 
  4.0.0 
  provided 
  
  
  javax.servlet 
  jstl 
  1.2 
  
  
  taglibs 
  standard 
  1.1.2 
  
  
  
  javax.servlet.jsp 
  jsp-api 
  2.2 
  provided 
  
  
  
  org.hibernate 
  hibernate-validator 
  5.4.1.Final 
  
  
  javax.validation 
  validation-api 
  1.1.0.Final 
  
  
   
  
 

SpringMVC的核心配置文件

<?xml version="1.0" encoding="UTF-8"?> 
 
 
  
  
 
  
  
   
   
  
  
  
  
 
  
  
   
  
  
  
  
  
  
  
  
  
   
  
  
 

以上是準(zhǔn)備工作。下面開(kāi)始核心代碼介紹。

數(shù)據(jù)的校驗(yàn)思路:

第一步,在實(shí)體類中指定屬性添加校驗(yàn)注解(如@NotEmpty),
第二步,在控制層目標(biāo)方法實(shí)體類參數(shù)添加注解@Valid,
第三步,在返回頁(yè)面加上顯示提示錯(cuò)誤信息

數(shù)據(jù)格式化思路:只需要在實(shí)體類中加上注解即可。

信息國(guó)際化思路:

第一步,在SpringMVC配置文件中配置國(guó)際化資源文件
第二步,創(chuàng)建文件i18n_zh_CN.properties文件
第三步,在i18n_zh_CN.properties文件配置國(guó)際化信息(要嚴(yán)格按照SpringMVC的語(yǔ)法)

UserController.java,兩個(gè)重點(diǎn)知識(shí)。一個(gè)是SpringMVC的rest風(fēng)格的增刪改查。另一個(gè)是@Valid注解用法。具體看代碼。

import java.util.Map; 
import javax.validation.Valid; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.validation.Errors; 
import org.springframework.validation.FieldError; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
 
import com.itdragon.springmvc.crud.dao.PositionDao; 
import com.itdragon.springmvc.crud.dao.UserDao; 
import com.itdragon.springmvc.crud.orm.User; 
 
@Controller 
public class UserController { 
 
 @Autowired 
 private UserDao userDao; 
  
 @Autowired 
 private PositionDao positionDao; 
  
 private static final String INPUT = "input"; // 跳轉(zhuǎn)到編輯頁(yè)面 
 
 private static final String LIST = "list"; // 跳轉(zhuǎn)到用戶列表頁(yè)面 
 
 @ModelAttribute 
 public void getUser(@RequestParam(value="id",required=false) Integer id, 
   Map map){ 
  if(id != null){ 
   map.put("user", userDao.getUserById(id)); 
  } 
 } 
  
 // 更新用戶,用put請(qǐng)求方式區(qū)別get請(qǐng)求方式,屬于SpringMVC rest 風(fēng)格的crud 
 @RequestMapping(value="/user", method=RequestMethod.PUT) 
 public String updateUser(User user){ 
  userDao.save(user); 
  return "redirect:/users"; 
 } 
  
 // 點(diǎn)擊編輯跳轉(zhuǎn)編輯頁(yè)面 
 @RequestMapping(value="/user/{id}", method=RequestMethod.GET) 
 public String input(@PathVariable("id") Integer id, Map map){ 
  map.put("user", userDao.getUserById(id)); 
  map.put("positions", positionDao.queryAllPositions()); 
  return INPUT; 
 } 
  
 // 通過(guò)id刪除用戶 
 @RequestMapping(value="/delete/{id}", method=RequestMethod.GET) 
 public String delete(@PathVariable("id") Integer id){ 
  userDao.deleteUserById(id); 
  return "redirect:/users"; 
 } 
  
 /** 
  * 新增用戶,若保存成功則跳轉(zhuǎn)到用戶列表頁(yè)面,若失敗則跳轉(zhuǎn)到編輯頁(yè)面 
  * @param user 用 @Valid 注解修飾后,可實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的邏輯 
  * @param result 數(shù)據(jù)校驗(yàn)結(jié)果 
  * @param map 數(shù)據(jù)模型 
  * @return 
  */ 
 @RequestMapping(value="/user", method=RequestMethod.POST) 
 public String save(@Valid User user, Errors result, Map map){ 
  if(result.getErrorCount() > 0){ 
   for(FieldError error : result.getFieldErrors()){ 
    System.out.println(error.getField() + " : " + error.getDefaultMessage()); 
   } 
   map.put("positions", positionDao.queryAllPositions()); 
   return INPUT; 
  } 
  userDao.save(user); 
  return "redirect:/users"; 
 } 
  
 @RequestMapping(value="/user", method=RequestMethod.GET) 
 public String input(Map map){ 
  map.put("positions", positionDao.queryAllPositions()); 
  map.put("user", new User()); 
  return INPUT; 
 } 
  
 // 跳轉(zhuǎn)用戶列表頁(yè)面 
 @RequestMapping("/users") 
 public String list(Map map){ 
  map.put("users", userDao.queryAllUsers()); 
  return LIST; 
 } 
  
} 

User.java,兩個(gè)重點(diǎn)知識(shí)。一個(gè)是數(shù)據(jù)的格式化(包括日期格式化和數(shù)值格式化)。另一個(gè)是使用 JSR 303 驗(yàn)證標(biāo)準(zhǔn)數(shù)據(jù)校驗(yàn)。

數(shù)據(jù)格式化,由于前端傳給后臺(tái)的是字符串,對(duì)于比較特殊的屬性,比如Date,F(xiàn)loat類型就需要進(jìn)行數(shù)據(jù)格式化
** @NumberFormat 數(shù)值格式化 **
可以格式化/解析的數(shù)字類型:Short、Integer、Long、Float、Double、BigDecimal、BigInteger。
屬性參數(shù)有:pattern="###,###.##"(重點(diǎn))。
style= org.springframework.format.annotation.NumberFormat.Style.NUMBER(CURRENCY / PERCENT)。其中Style.NUMBER(通用樣式,默認(rèn)值);Style.CURRENCY(貨幣樣式);Style.PERCENT(百分?jǐn)?shù)樣式)

** @DateTimeFormat 日期格式化 **
可以格式化/解析的數(shù)字類型:java.util.Date 、java.util.Calendar 、java.long.Long。
屬性參數(shù)有:pattern="yyyy-MM-dd hh:mm:ss"(重點(diǎn))。
iso=指定解析/格式化字段數(shù)據(jù)的ISO模式,包括四種:ISO.NONE(不使用ISO模式,默認(rèn)值),ISO.DATE(yyyy-MM-dd),ISO.TIME(hh:mm:ss.SSSZ),ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ);style=指定用于格式化的樣式模式,默認(rèn)“SS”,優(yōu)先級(jí): pattern 大于 iso 大于 style,后兩個(gè)很少用。

數(shù)據(jù)校驗(yàn)

空檢查
** @Null ** 驗(yàn)證對(duì)象是否為null
** @NotNull ** 驗(yàn)證對(duì)象是否不為null, 無(wú)法查檢長(zhǎng)度為0的字符串
** @NotBlank ** 檢查約束字符串是不是Null還有被Trim的長(zhǎng)度是否大于0,只對(duì)字符串,
且會(huì)去掉前后空格
** @NotEmpty ** 檢查約束元素是否為NULL或者是EMPTY
Booelan檢查
** @AssertTrue ** 驗(yàn)證 Boolean 對(duì)象是否為 true
** @AssertFalse ** 驗(yàn)證 Boolean 對(duì)象是否為 false
長(zhǎng)度檢查
** @Size(min=, max=) ** 驗(yàn)證對(duì)象(Array,Collection,Map,String)值是否在給定的范圍之內(nèi)
** @Length(min=, max=) ** 驗(yàn)證對(duì)象(CharSequence子類型)長(zhǎng)度是否在給定的范圍之內(nèi)
日期檢查
** @Past ** 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前
** @Future ** 驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后
** @Pattern ** 驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則
數(shù)值檢查
** @Min ** 驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值
** @Max ** 驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值
** @DecimalMax ** 被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)
是一個(gè)通過(guò)BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
** @DecimalMin ** 被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)
是一個(gè)通過(guò)BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
** @Digits ** 驗(yàn)證 Number 和 String 的構(gòu)成是否合法
** @Digits(integer=,fraction=) ** 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度
** @Range(min=, max=) ** 檢查數(shù)字是否介于min和max之間
** @CreditCardNumber ** 信用卡驗(yàn)證
** @Email ** 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過(guò)驗(yàn)證
** @ScriptAssert(lang= ,script=, alias=) ** 通過(guò)腳本驗(yàn)證

其中有幾點(diǎn)需要注意:

空判斷注解

String name  @NotNull @NotEmpty @NotBlank
null       false    false    false
""       true    false    false
" "       true    true    false
"ITDragon!"   true    true    true

數(shù)值檢查:建議使用在Stirng,Integer類型,不建議使用在int類型上,因?yàn)楸韱沃禐椤啊睍r(shí)無(wú)法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null

import java.util.Date; 
import javax.validation.constraints.DecimalMin; 
import org.hibernate.validator.constraints.Email; 
import org.hibernate.validator.constraints.NotEmpty; 
import org.springframework.format.annotation.DateTimeFormat; 
import org.springframework.format.annotation.NumberFormat; 
 
public class User { 
  
 private Integer id; 
 @NotEmpty 
 private String account; 
 @Email 
 @NotEmpty 
 private String email; 
 private Integer sex; 
 private Position position; 
 @DateTimeFormat(pattern="yyyy-MM-dd") 
 private Date createdDate; 
 @NumberFormat(pattern="###,###.#") 
 @DecimalMin("2000") 
 private Double salary; 
  
 public User() { 
 } 
 public User(Integer id, String account, String email, Integer sex, 
   Position position, Date createdDate, Double salary) { 
  this.id = id; 
  this.account = account; 
  this.email = email; 
  this.sex = sex; 
  this.position = position; 
  this.createdDate = createdDate; 
  this.salary = salary; 
 } 
 public Integer getId() { 
  return id; 
 } 
 public void setId(Integer id) { 
  this.id = id; 
 } 
 public String getAccount() { 
  return account; 
 } 
 public void setAccount(String account) { 
  this.account = account; 
 } 
 public String getEmail() { 
  return email; 
 } 
 public void setEmail(String email) { 
  this.email = email; 
 } 
 public Integer getSex() { 
  return sex; 
 } 
 public void setSex(Integer sex) { 
  this.sex = sex; 
 } 
 public Position getPosition() { 
  return position; 
 } 
 public void setPosition(Position position) { 
  this.position = position; 
 } 
 public Date getCreatedDate() { 
  return createdDate; 
 } 
 public void setCreatedDate(Date createdDate) { 
  this.createdDate = createdDate; 
 } 
 public Double getSalary() { 
  return salary; 
 } 
 public void setSalary(Double salary) { 
  this.salary = salary; 
 } 
 @Override 
 public String toString() { 
  return "User [id=" + id + ", account=" + account + ", email=" + email 
    + ", sex=" + sex + ", position=" + position + ", createdDate=" 
    + createdDate + ", salary=" + salary + "]"; 
 } 
 
} 

input.jsp,SpringMVC 表單標(biāo)簽知識(shí)點(diǎn)詳解

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@page import="java.util.HashMap"%> 
<%@page import="java.util.Map"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
 
 
 
 
 
SpringMVC 表單操作 
 
 
 
 
  
 

修改或創(chuàng)建用戶信息

<%-- 對(duì)于 _method 不能使用 form:hidden 標(biāo)簽, 因?yàn)?modelAttribute 對(duì)應(yīng)的 bean 中沒(méi)有 _method 這個(gè)屬性 --%> <%-- --%>
<% Map genders = new HashMap(); genders.put("1", "Male"); genders.put("0", "Female"); request.setAttribute("genders", genders); %>

 i18n國(guó)際化文件

#語(yǔ)法:實(shí)體類上屬性的注解.驗(yàn)證目標(biāo)方法的modleAttribute 屬性值(如果沒(méi)有默認(rèn)為實(shí)體類首字母小寫(xiě)).注解修飾的屬性 
#以第一個(gè)為例:User實(shí)體類中 屬性account用了NotEmpty注解修飾,表示不能為空。所以前綴是NotEmpty 
#驗(yàn)證的目標(biāo)方法 public String save(@Valid User user, ...) User被注解@Valid 修飾,但沒(méi)有被modleAttribute修飾。所以中間是user 
#后綴就是被注解修飾的屬性名 account 
NotEmpty.user.account=用戶名不能為空 
Email.user.email=Email地址不合法 
 
#typeMismatch 數(shù)據(jù)類型不匹配時(shí)提示 
typeMismatch.user.createdDate=不是一個(gè)日期 
#required 必要參數(shù)不存在時(shí)提示 
#methodInvocation 調(diào)用目標(biāo)方法出錯(cuò)的時(shí)提示 

其他文件,Position 實(shí)體類

public class Position { 
 
 private Integer id; 
 private String level; 
 
 public Position() { 
 } 
 public Position(Integer id, String level) { 
 this.id = id; 
 this.level = level; 
 } 
 public Integer getId() { 
 return id; 
 } 
 public void setId(Integer id) { 
 this.id = id; 
 } 
 public String getLevel() { 
 return level; 
 } 
 public void setLevel(String level) { 
 this.level = level; 
 } 
 @Override 
 public String toString() { 
 return "Position [id=" + id + ", level=" + level + "]"; 
 } 
} 

 模擬用戶操作的dao,UserDao.java

import java.util.Collection; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Map; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import com.itdragon.springmvc.crud.orm.Position; 
import com.itdragon.springmvc.crud.orm.User; 
 
@Repository 
public class UserDao { 
 
 private static Map users = null; 
 
 @Autowired 
 private PositionDao positionDao; 
 
 // 模擬數(shù)據(jù)庫(kù)查詢數(shù)據(jù) 
 static{ 
 users = new HashMap(); 
 users.put(1, new User(1, "ITDragon", "11@xl.com", 1, new Position(1, "架構(gòu)師"), new Date(), 18888.88)); 
 users.put(2, new User(2, "Blog", "22@xl.com", 1, new Position(2, "高級(jí)工程師"), new Date(), 15555.55)); 
 users.put(3, new User(3, "Welcome", "33@xl.com", 0, new Position(3, "中級(jí)工程師"), new Date(), 8888.88)); 
 users.put(4, new User(4, "To", "44@xl.com", 0, new Position(4, "初級(jí)工程師"), new Date(), 5555.55)); 
 users.put(5, new User(5, "You", "55@xl.com", 1, new Position(5, "java實(shí)習(xí)生"), new Date(), 2222.22)); 
 } 
 
 // 下一次存儲(chǔ)的下標(biāo)id 
 private static Integer initId = 6; 
 
 public void save(User user){ 
 if(user.getId() == null){ 
  user.setId(initId++); 
 } 
  
 user.setPosition(positionDao.getPositionById(user.getPosition().getId())); 
 users.put(user.getId(), user); 
 } 
 
 public Collection queryAllUsers(){ 
 return users.values(); 
 } 
 
 public User getUserById(Integer id){ 
 return users.get(id); 
 } 
 
 public void deleteUserById(Integer id){ 
 users.remove(id); 
 } 
} 

import java.util.Collection; 
import java.util.HashMap; 
import java.util.Map; 
import org.springframework.stereotype.Repository; 
import com.itdragon.springmvc.crud.orm.Position; 
 
@Repository 
public class PositionDao { 
 
 private static Map positions = null; 
 
 static{ 
 positions = new HashMap(); 
  
 positions.put(1, new Position(1, "架構(gòu)師")); 
 positions.put(2, new Position(2, "高級(jí)工程師")); 
 positions.put(3, new Position(3, "中級(jí)工程師")); 
 positions.put(4, new Position(4, "初級(jí)工程師")); 
 positions.put(5, new Position(5, "java實(shí)習(xí)生")); 
 } 
 
 // 模擬查詢所有數(shù)據(jù) 
 public Collection queryAllPositions(){ 
 return positions.values(); 
 } 
 
 // 模擬通過(guò)id查詢數(shù)據(jù) 
 public Position getPositionById(Integer id){ 
 return positions.get(id); 
 } 
 
} 

用戶列表頁(yè)面的list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 
 
 
 
 
 
SpringMVC 表單操作 
 
 
 
 
 
 
 
  
 
沒(méi)有任何員工信息.
用戶信息表 Add Account
用戶編碼 賬號(hào)名 郵箱 性別 職位 薪水 時(shí)間 編輯 刪除
${user.id } ${user.account } ${user.email } ${user.sex == 0 ? 'Female' : 'Male' } ${user.position.level } ${user.salary } Edit Delete

注意事項(xiàng)

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint '
使用hibernate validator出現(xiàn)上面的錯(cuò)誤, 需要 注意
@NotNull 和 @NotEmpty 和@NotBlank 區(qū)別
@NotEmpty 用在集合類上面
@NotBlank 用在String上面
@NotNull 用在基本類型上

如果在基本類型上面用NotEmpty或者NotBlank 會(huì)出現(xiàn)上面的錯(cuò),筆者將@NotEmpty用到了Date上,導(dǎo)致出了這個(gè)問(wèn)題。若還有問(wèn)題,還繼續(xù)在這里補(bǔ)充。

以上便是SpringMVC的表單操作,其中包含了常用知識(shí),如數(shù)據(jù)的格式化,數(shù)據(jù)的校驗(yàn),提示信息國(guó)際化,F(xiàn)orm標(biāo)簽的用法。


當(dāng)前文章:SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解
文章URL:http://weahome.cn/article/pcdcei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部