SpringMVC基于注解使用:类型转换&数据格式化&数据验证

目录

类型转换&数据格式化&数据验证

1、类型转换器

自定义类型转换器

测试:

2、数据格式化

注解类型

3、数据校验

3.1、原生的表单如何获取错误信息:

3.2、Springmvc form标签


类型转换&数据格式化&数据验证

1、类型转换器

在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持,但是有些情况下有可能难以满足我们的需求,因此需要我们自己实现,如下:

https://note.youdao.com/yws/public/resource/5c9055f0c6fff47263ddf0e0d37422d5/xmlnote/854CD1465613401C93050C2AE246EAF8/1020835776564A948D8820D9FA2A36EA/3190

 

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:

https://note.youdao.com/yws/public/resource/5c9055f0c6fff47263ddf0e0d37422d5/xmlnote/854CD1465613401C93050C2AE246EAF8/726DF2BA29D843119C9EA3F8CF7326BC/3180

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值