目录
类型转换&数据格式化&数据验证
1、类型转换器
在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持,但是有些情况下有可能难以满足我们的需求,因此需要我们自己实现,如下:
ConversionService converters =
@org.springframework.format.annotation.DateTimeFormat java.lang.Long -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46,@org.springframework.format.annotation.NumberFormat java.lang.Long -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.LocalDate -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@6b2739e8
@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.LocalDateTime -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@515e3e2b
@org.springframework.format.annotation.DateTimeFormat java.time.LocalTime -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.LocalTime -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@e5802af
@org.springframework.format.annotation.DateTimeFormat java.time.OffsetDateTime -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.OffsetDateTime -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@8547711
@org.springframework.format.annotation.DateTimeFormat java.time.OffsetTime -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.OffsetTime -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@5f7ef1af
@org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime -> java.lang.String: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.time.ZonedDateTime -> java.lang.String : org.springframework.format.datetime.standard.TemporalAccessorPrinter@e673fc2
@org.springframework.format.annotation.DateTimeFormat java.util.Calendar -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46
@org.springframework.format.annotation.DateTimeFormat java.util.Date -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46
@org.springframework.format.annotation.NumberFormat java.lang.Byte -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.lang.Double -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.lang.Float -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.lang.Integer -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.lang.Short -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.math.BigDecimal -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
@org.springframework.format.annotation.NumberFormat java.math.BigInteger -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.Boolean -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@430fd9a0
java.lang.Character -> java.lang.Number : org.springframework.core.convert.support.CharacterToNumberFactory@39560299
java.lang.Character -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@7ffc5a86
java.lang.Enum -> java.lang.Integer : org.springframework.core.convert.support.EnumToIntegerConverter@7f642c95
java.lang.Enum -> java.lang.String : org.springframework.core.convert.support.EnumToStringConverter@48af5069
java.lang.Integer -> java.lang.Enum : org.springframework.core.convert.support.IntegerToEnumConverterFactory@421b3faf
java.lang.Long -> java.time.Instant : org.springframework.format.datetime.standard.DateTimeConverters$LongToInstantConverter@7676b8a0
java.lang.Long -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$LongToCalendarConverter@41b2ab4c,java.lang.Long -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$LongToCalendarConverter@51c90511
java.lang.Long -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$LongToDateConverter@16ccf62,java.lang.Long -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$LongToDateConverter@601fac14
java.lang.Number -> java.lang.Character : org.springframework.core.convert.support.NumberToCharacterConverter@4668902f
java.lang.Number -> java.lang.Number : org.springframework.core.convert.support.NumberToNumberConverterFactory@6ca039f6
java.lang.Number -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@3d185b20
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.lang.Long: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46,java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Long: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.LocalDate: org.springframework.format.datetime.standard.TemporalAccessorParser@28573f94
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.LocalDateTime: org.springframework.format.datetime.standard.TemporalAccessorParser@40e4100b
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.LocalTime: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.LocalTime: org.springframework.format.datetime.standard.TemporalAccessorParser@3e4bfc6
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.OffsetDateTime: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.OffsetDateTime: org.springframework.format.datetime.standard.TemporalAccessorParser@68d04a58
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.OffsetTime: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.OffsetTime: org.springframework.format.datetime.standard.TemporalAccessorParser@2a8ae894
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.time.ZonedDateTime: org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory@4a98f52f,java.lang.String -> java.time.ZonedDateTime: org.springframework.format.datetime.standard.TemporalAccessorParser@28dbab47
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Calendar: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46
java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Date: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@4ec4ca46
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Byte: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Double: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Float: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Integer: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Short: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigDecimal: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigInteger: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@1628f3df
java.lang.String -> java.lang.Boolean : org.springframework.core.convert.support.StringToBooleanConverter@5eba909b
java.lang.String -> java.lang.Character : org.springframework.core.convert.support.StringToCharacterConverter@12febea6
java.lang.String -> java.lang.Enum : org.springframework.core.convert.support.StringToEnumConverterFactory@41e4c006
java.lang.String -> java.lang.Number : org.springframework.core.convert.support.StringToNumberConverterFactory@5d6c983e
java.lang.String -> java.nio.charset.Charset : org.springframework.core.convert.support.StringToCharsetConverter@3184a445
java.lang.String -> java.time.Duration: org.springframework.format.datetime.standard.DurationFormatter@437e9192
java.lang.String -> java.time.Instant: org.springframework.format.datetime.standard.InstantFormatter@14dfe2b
java.lang.String -> java.time.Month: org.springframework.format.datetime.standard.MonthFormatter@501f0275
java.lang.String -> java.time.MonthDay: org.springframework.format.datetime.standard.MonthDayFormatter@230d0cca
java.lang.String -> java.time.Period: org.springframework.format.datetime.standard.PeriodFormatter@6b25f6d0
java.lang.String -> java.time.Year: org.springframework.format.datetime.standard.YearFormatter@3ecd1f21
java.lang.String -> java.time.YearMonth: org.springframework.format.datetime.standard.YearMonthFormatter@1448edd0
java.lang.String -> java.util.Currency : org.springframework.core.convert.support.StringToCurrencyConverter@4e203f5f
java.lang.String -> java.util.Locale : org.springframework.core.convert.support.StringToLocaleConverter@1867278f
java.lang.String -> java.util.Properties : org.springframework.core.convert.support.StringToPropertiesConverter@388ee7a7
java.lang.String -> java.util.TimeZone : org.springframework.core.convert.support.StringToTimeZoneConverter@663f1943
java.lang.String -> java.util.UUID : org.springframework.core.convert.support.StringToUUIDConverter@49cc9297
java.nio.charset.Charset -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@6f5a2664
java.time.Duration -> java.lang.String : org.springframework.format.datetime.standard.DurationFormatter@437e9192
java.time.Instant -> java.lang.Long : org.springframework.format.datetime.standard.DateTimeConverters$InstantToLongConverter@6a401b0
java.time.Instant -> java.lang.String : org.springframework.format.datetime.standard.InstantFormatter@14dfe2b
java.time.LocalDateTime -> java.time.LocalDate : org.springframework.format.datetime.standard.DateTimeConverters$LocalDateTimeToLocalDateConverter@3639d795
java.time.LocalDateTime -> java.time.LocalTime : org.springframework.format.datetime.standard.DateTimeConverters$LocalDateTimeToLocalTimeConverter@2bdba24a
java.time.Month -> java.lang.String : org.springframework.format.datetime.standard.MonthFormatter@501f0275
java.time.MonthDay -> java.lang.String : org.springframework.format.datetime.standard.MonthDayFormatter@230d0cca
java.time.OffsetDateTime -> java.time.Instant : org.springframework.format.datetime.standard.DateTimeConverters$OffsetDateTimeToInstantConverter@676ac921
java.time.OffsetDateTime -> java.time.LocalDate : org.springframework.format.datetime.standard.DateTimeConverters$OffsetDateTimeToLocalDateConverter@326421e8
java.time.OffsetDateTime -> java.time.LocalDateTime : org.springframework.format.datetime.standard.DateTimeConverters$OffsetDateTimeToLocalDateTimeConverter@3d974458
java.time.OffsetDateTime -> java.time.LocalTime : org.springframework.format.datetime.standard.DateTimeConverters$OffsetDateTimeToLocalTimeConverter@3c072322
java.time.OffsetDateTime -> java.time.ZonedDateTime : org.springframework.format.datetime.standard.DateTimeConverters$OffsetDateTimeToZonedDateTimeConverter@7412cd2a
java.time.Period -> java.lang.String : org.springframework.format.datetime.standard.PeriodFormatter@6b25f6d0
java.time.Year -> java.lang.String : org.springframework.format.datetime.standard.YearFormatter@3ecd1f21
java.time.YearMonth -> java.lang.String : org.springframework.format.datetime.standard.YearMonthFormatter@1448edd0
java.time.ZoneId -> java.util.TimeZone : org.springframework.core.convert.support.ZoneIdToTimeZoneConverter@5c8ff106
java.time.ZonedDateTime -> java.time.Instant : org.springframework.format.datetime.standard.DateTimeConverters$ZonedDateTimeToInstantConverter@2b5c4212
java.time.ZonedDateTime -> java.time.LocalDate : org.springframework.format.datetime.standard.DateTimeConverters$ZonedDateTimeToLocalDateConverter@7fe794b6
java.time.ZonedDateTime -> java.time.LocalDateTime : org.springframework.format.datetime.standard.DateTimeConverters$ZonedDateTimeToLocalDateTimeConverter@1ee211ef
java.time.ZonedDateTime -> java.time.LocalTime : org.springframework.format.datetime.standard.DateTimeConverters$ZonedDateTimeToLocalTimeConverter@669ff7d6
java.time.ZonedDateTime -> java.time.OffsetDateTime : org.springframework.format.datetime.standard.DateTimeConverters$ZonedDateTimeToOffsetDateTimeConverter@685d298b
java.time.ZonedDateTime -> java.util.Calendar : org.springframework.core.convert.support.ZonedDateTimeToCalendarConverter@6138bd15
java.util.Calendar -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToLongConverter@32b267dc,java.util.Calendar -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToLongConverter@3027d26
java.util.Calendar -> java.time.Instant : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToInstantConverter@208023cf
java.util.Calendar -> java.time.LocalDate : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToLocalDateConverter@75a3f40
java.util.Calendar -> java.time.LocalDateTime : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToLocalDateTimeConverter@5b92ec5f
java.util.Calendar -> java.time.LocalTime : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToLocalTimeConverter@3648cd4b
java.util.Calendar -> java.time.OffsetDateTime : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToOffsetDateTimeConverter@65c3d54f
java.util.Calendar -> java.time.ZonedDateTime : org.springframework.format.datetime.standard.DateTimeConverters$CalendarToZonedDateTimeConverter@6271e8dd
java.util.Calendar -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToDateConverter@5e9b9eea,java.util.Calendar -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToDateConverter@181f31ba
java.util.Currency -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@2c3cd8e9
java.util.Date -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$DateToLongConverter@133715f3,java.util.Date -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$DateToLongConverter@4cb15e75
java.util.Date -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$DateToCalendarConverter@1d56ea37,java.util.Date -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$DateToCalendarConverter@75a88521
java.util.Locale -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@2af910f2
java.util.Properties -> java.lang.String : org.springframework.core.convert.support.PropertiesToStringConverter@6d99fd4
java.util.UUID -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@37df0d7
org.springframework.core.convert.support.ArrayToArrayConverter@2b19ffdb
org.springframework.core.convert.support.ArrayToCollectionConverter@4c019cc0
org.springframework.core.convert.support.ArrayToObjectConverter@343b143b
org.springframework.core.convert.support.ArrayToStringConverter@654a7e11
org.springframework.core.convert.support.ByteBufferConverter@209ae681
org.springframework.core.convert.support.ByteBufferConverter@209ae681
org.springframework.core.convert.support.ByteBufferConverter@209ae681
org.springframework.core.convert.support.ByteBufferConverter@209ae681
org.springframework.core.convert.support.CollectionToArrayConverter@66c9dab
org.springframework.core.convert.support.CollectionToCollectionConverter@470e5927
org.springframework.core.convert.support.CollectionToObjectConverter@6c6550c9
org.springframework.core.convert.support.CollectionToStringConverter@4c04c66a
org.springframework.core.convert.support.FallbackObjectToStringConverter@2b2ed015
org.springframework.core.convert.support.IdToEntityConverter@1661f15d,org.springframework.core.convert.support.ObjectToObjectConverter@80a17d3
org.springframework.core.convert.support.MapToMapConverter@7292a9a
org.springframework.core.convert.support.ObjectToArrayConverter@7a8895dc
org.springframework.core.convert.support.ObjectToCollectionConverter@52fd0eec
org.springframework.core.convert.support.ObjectToOptionalConverter@f5a1070
org.springframework.core.convert.support.ObjectToOptionalConverter@f5a1070
org.springframework.core.convert.support.ObjectToOptionalConverter@f5a1070
org.springframework.core.convert.support.StreamConverter@3820b54f
org.springframework.core.convert.support.StreamConverter@3820b54f
org.springframework.core.convert.support.StreamConverter@3820b54f
org.springframework.core.convert.support.StreamConverter@3820b54f
org.springframework.core.convert.support.StringToArrayConverter@1c9b244
org.springframework.core.convert.support.StringToCollectionConverter@13163c
自定义类型转换器
User.java
package com.springmvc.entity;
import java.util.Date;
public class User {
private Integer id;
private String name;
private Date birthday;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", birthday=" + birthday +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
MyStringToDateConverter.java
package com.springmvc.converters;
import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/***
*
* 1.定义类型转换器 需要明确 源类型 和目标性
* 2.在convert方法自定义类型转换的实现
* 3.在springmvc中配置自定类型转换器
* <bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
* <property name="converters">
* <set>
* <bean class="cn.tulingxueyuan.converters.MyStringToDateConverter"></bean>
* </set>
* </property>
* </bean>
* 4.<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
*/
public class MyStringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
if(!StringUtils.isEmpty(source)){
// 即支持yyyy-MM-dd yyyy/MM/dd
try {
if(source.split("-").length==3){
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
return df.parse(source);
}
else if(source.split("/").length==3){
DateFormat df=new SimpleDateFormat("yyyy/MM/dd");
return df.parse(source);
}
else
{
throw new RuntimeException("日期转换错误:"+source);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
ConvertController.java
package com.springmvc.controller;
import com.springmvc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/convert")
public class ConvertController {
@RequestMapping("/test")
public String test( User user){
System.out.println(user);
return "show";
}
}
spring-mvc.xml
<!--注解驱动,比加,配置访问静态资源 -->
<mvc:annotation-driven conversion-service="conversionService" ></mvc:annotation-driven>
<!--配置自定义类型转换器-->
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
<property name="converters">
<set>
<bean class="com.springmvc.converters.MyStringToDateConverter"></bean>
</set>
</property>
</bean>
测试:
为了方便测试,使用get方式请求:http://localhost:8080/springmvc/convert/test?birthday=2021-08-27
在没有配置自定义类型转换器之前,请求报错,因为springmvc的类型转换器只能将“2021/08/27”转换成日期格式
配置自定义类型转换器之后
2、数据格式化
Spring 提供了两个可以用于格式化数字、日期和时间的注解@NumberFormat和@DateTimeFormat,这两个标签可以用于javabean的属性或方法参数上。
@NumberFormat可以用来格式化任何的数字的基本类型(如int,long)或java.lang.Number的实例(如 BigDecimal, Integer)。
@DateTimeFormat可以用来格式化java.util.Date、java.util.Calendar和 java.util.Long类型.
要指定数字或日期/时间类型的属性,只需要在其上添加 @NumberFormat或@DateTimeFormat注解接可以了。例如下面的代码:
public class User {
private Integer id;
private String username;
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date birthday;
@NumberFormat(style = NumberFormat.Style.CURRENCY ) //货币
private Double balance; //余额 ¥5000
private String[] hobbies;
@NumberFormat(pattern = "#,###.##")
private Double salary; //工资 10,000.00
@NumberFormat(style = NumberFormat.Style.PERCENT) /*不加%会 *100来显示 加上会按你提交精度来显示*/
private Double taskCount;// 任务完成百分比 90%
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Double getTaskCount() {
return taskCount;
}
public void setTaskCount(Double taskCount) {
this.taskCount = taskCount;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", balance=" + balance +
", hobbies=" + Arrays.toString(hobbies) +
", salary=" + salary +
", taskCount=" + taskCount +
'}';
}
}
<spring:eval expression="user.birthday"></spring:eval>
注解类型
DateTimeFormat,互斥属性:
- iso。类型为DateTimeFormat.ISO
- DateTimeFormat.ISO.DATE: 格式yyyy-MM-dd。
- DateTimeFormat.ISO.NONE: 表示不使用ISO格式的时间。
- DateTimeFormat.ISO.TIME: 格式HH:mm:ss .SSSZ。
- DateTimeFormat.ISO.DATE_TIME: 格式yyyy-MM-dd HH:mm:ss .SSSZ。
- pattern。类型为String,使用自定义的时间格式化字符串。
- style。类型为String,通过样式指定日期时间的格式,由两位字符组成,第1位表示日期的样式,第2位表示时间的格式:
- S: 短日期/时间的样式;
- -: 忽略日期/时间的样式;
- F: 完整日期/时间的样式;
- L: 长日期/时间的样式;
- M: 中日期/时间的样式;
NumberFormat
- pattern。类型为String,使用自定义的数字格式化字符串,"##,###.##"。
- style。类型为NumberFormat.Style,常用值:
- Style.NUMBER正常数字类型
- Style.CURRENCY 货币类型
- Style.PERCENT百分数类型
3、数据校验
一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验+后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安全,下面来说一下在springmvc中如何进行后端数据校验。
JSR303是 Java 为 Bean 数据合法性校验提供的标准,它已经包含在 JavaEE 6.0 中 。JSR 303 (Java Specification Requests意思是Java 规范提案)通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通 j过标准的验证接口对 Bean 进行验证。
Hibernate Validator 实现了JSR349验证注解规范的技术
JSR303:
Hibernate Validator 扩展注解:
3.1、原生的表单如何获取错误信息:
* 实现数据验证的步骤: * 1.加入hibernate-validator依赖 * 2.一定要注意!!将新加入的jar包 加入到WEB-INF/lib中 * 3.在需要验证的javaBean的属性上面中加入对应的验证注解,可以设置message属性定制更友好错误提示信息 * 4.在需要验证的处理方法的对应javaBean参数上面加上@Valid * 5.在需要验证的处理方法参数中加入BindingResult,代表自己处理错误,这样就不会显示错误页面了。
* ·基于原生html form表单实现方式: * 1.在将错误信息循环通过map存入到request域中 * 2.在jsp通过${errors.id}获取对应的错误信息
spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供JSR303的实现,需要导入依赖的包。
pom.xml
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
User.java
public class User {
@NotNull(message = "id不能为空")
@Min(value=1,message = "id必须大于0")
private Integer id;
@NotEmpty(message = "用户名不能为空")
@Length(min = 4,max = 8,message = "用户名的长度必须在{min}和{max}位之间")
@Pattern(regexp="^[0-9a-zA-Z]+$",message = "用户名只能输入0-9或者a-z")
private String username;
@Past(message = "您难道穿越了吗?")
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date birthday;
@NumberFormat(style = NumberFormat.Style.CURRENCY ) //货币
private Double balance; //余额 ¥5000
private String[] hobbies;
@NumberFormat(pattern = "#,###.##")
@Range(min = 2000,max = 1000000,message = "工资必须在{min}和{max}之间") //Size的范围是int 不能用于验证Double
private Double salary; //工资 10,000.00
@Range(min=0,max=100,message = "任务完成度必须在{min}和{max}之间") //Range的范围是Long所以,Range可以控制的范围更大
@NumberFormat(style = NumberFormat.Style.PERCENT) /*不加%会 *100来显示 加上会按你提交精度来显示*/
private Double taskCount;// 任务完成百分比 90%
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Double getTaskCount() {
return taskCount;
}
public void setTaskCount(Double taskCount) {
this.taskCount = taskCount;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", balance=" + balance +
", hobbies=" + Arrays.toString(hobbies) +
", salary=" + salary +
", taskCount=" + taskCount +
'}';
}
}
addUser.jsp
<%@ page import="com.springmvc.entity.User" %><%--
Created by IntelliJ IDEA.
User: fztx
Date: 2021-08-27
Time: 15:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>添加用户</title>
</head>
<body>
<h1>添加用户</h1>
<form action="${pageContext.request.contextPath}/user" method="post" >
<%-- private Integer id;
private String username;
private Date birthday;
private Double balance; //¥5000
private String[] hobbies;
private Double salary; //工资 10,000.00
private Double taskCount;// 任务完成百分比 90%--%>
<p>
id:<input type="text" name="id" value="${user.id}">${errors.id}
</p>
<p>
username:<input type="text" name="username" value="${user.username}"> ${errors.username}
</p>
<p>
birthday:<input type="text" name="birthday" value="${user.birthday}">${errors.birthday}
</p>
<p>
balance:<input type="text" name="balance" value="${user.balance}">${errors.balance}
</p>
<p>
salary:<input type="text" name="salary" value="${user.salary}">${errors.salary}
</p>
<p>
taskCount:<input type="text" name="taskCount" value="${user.taskCount}">${errors.taskCount}
</p>
<p>
hobbies:
<input type="checkbox" name="hobbies" value="唱歌" >唱歌
<input type="checkbox" name="hobbies" value="跳舞">跳舞
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
UserController.java
@Controller
public class UserController {
@PostMapping("/user")
public String add(@Valid User user, BindingResult result, Model model){
/*
将错误信息取出来,输出到jsp页面
*/
// 判断当前是否出现了错误
if(result.hasErrors()){
// 存放错误信息:key=错误信息的属性名 value=错误信息
// 这样就有利于在jsp中分别取出${errors.id}
Map<String,String> errors=new HashMap<String,String>();
// 获取所有的错误信息 包含 错误的属性,错误信息
List<FieldError> fieldErrors = result.getFieldErrors();
// 循环转移到map中
for (FieldError fieldError :fieldErrors){
//fieldError.getField() 是属性名
//fieldError.getDefaultMessage() 验证失败的错误信息
errors.put(fieldError.getField(),fieldError.getDefaultMessage());
}
model.addAttribute("errors",errors);
// 如果验证失败将请求重新转发到添加页面
return "user/add";
}
System.out.println(user);
return "show";
}
}
3.2、Springmvc form标签
* ·基于spring form标签库的实现方式: * 1.添加一个显示jsp的处理方法, 一定要传入一个空的User到model中 * 2.在jsp中导入spring-form标签库 * 3.在form标签上一定要加上ModelAtrribute * 4.加上对应的form标签 必须都要以<form:开头
add.jsp
<%@ page import="com.springmvc.entity.User" %><%--
Created by IntelliJ IDEA.
User: fztx
Date: 2021-08-27
Time: 15:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>添加用户</title>
</head>
<body>
<h1>添加用户</h1>
<form:form action="${pageContext.request.contextPath}/form/user" method="post" modelAttribute="user" >
<p>
id: <form:input path="id"></form:input><form:errors path="id"></form:errors>
</p>
<p>
username: <form:input path="username"></form:input><form:errors path="username"></form:errors>
</p>
<p>
birthday:<form:input path="birthday"></form:input><form:errors path="birthday"></form:errors>
</p>
<p>
balance:<form:input path="balance"></form:input><form:errors path="balance"></form:errors>
</p>
<p>
salary:<form:input path="salary"></form:input><form:errors path="salary"></form:errors>
</p>
<p>
taskCount:<form:input path="taskCount"></form:input><form:errors path="taskCount"></form:errors>
</p>
<p>
hobbies:
<%--静态数据源--%>
<form:checkbox path="hobbies" value="唱歌"></form:checkbox>
<form:label path="hobbies">唱歌</form:label>
<form:checkbox path="hobbies" value="跳舞"></form:checkbox>
<form:label path="hobbies">跳舞</form:label>
<hr>
<%--动态数据源--%>
<form:checkboxes path="hobbies" items="${list}"></form:checkboxes>
<%--<form:select path="hobbies"></form:select>--%>
</p>
<p>
<form:button>提交</form:button>
<input type="submit" value="提交">
</p>
</form:form>
</body>
</html>
UserController.java
@PostMapping("/form/user")
public String springformAdd(@Valid User user, BindingResult result, Model model) {
// 判断当前是否出现了错误
if(result.hasErrors()) {
return "user/add";
}
System.out.println(user);
return "show";
}
@ModelAttribute
public void initData(Model model){
// 初始化该页面的数据
/*List<String> list=Arrays.asList("唱歌","跳舞");
model.addAttribute("list",list);*/
Map<String,String> map=new HashMap<>();
map.put("1","唱歌");
map.put("2","跳舞");
model.addAttribute("list",map);
}
@GetMapping("/user/add")
public String addView(User user){
return "user/add";
}
自动绑定,自动回显数据, 如果是新增的情况下也需要保证有该标签所需的对象
Form标签
1. 支持全部http请求方法 比如method=”put” put\delete 提交方式
<%--spring 的form标签库是支持put 和delete的提交的--%>
<form:form method="put" >
11111111111
</form:form>
2. 数据自动回显:需要使用modelAttribute指定数据的对象
3. 使用path来双向绑定属性
4. 动态数据绑定:Select 、 checkboxes、 radiobottons、 都可以使用Items 制定数据源 可以是list (当List的泛型是javaBean的时候需要制定itemValue和itemLabel)、map(不需要制定itemValue和itemLabel)