springmvc知識四------數據轉換&數據格式化&數據校驗

數據轉換

數據轉換,顧名思義就是數據類型之間的轉換,但是對於數據轉換,有的是可以進行轉化的,例如字符串轉整形數,但是有些數據類型之間是不能進行轉換的,例如從字符串到日期之間的類型轉換。
對於不同的框架,對於數據轉換的類型也有所不同,對於Springmvc,又是怎麼完成數據之間的轉換呢,
首先數據的轉換,肯定是發生在數據綁定中的,那麼數據的綁定流程又是如何的呢

數據綁定流程

1、Springmvc主框架將ServletRequest 對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,用以創建DataBinder實例對象,DataBinder是數據綁定的核心組件
2、DataBinder 調用裝配在Springmvc上下文中的ConversionService組件進行數據類型轉換、數據格式化工作。將Servlet 中的請求信息填充到入參對象中。
3、調用Validate組件對已經綁定了請求消息的入參對象進行數據合法性校驗,並最終生成數據綁定結果BindingData 對象
4、Springmvc 抽取BindingResult中的入參對象和校驗錯誤對象,將他們賦給處理方法的響應入參。

在POJO類中的setter方法中添加斷點可以追蹤代碼進行查看。
當代碼停止之後,我們向前看,可以找到這個【ModelAttributeMethodProcessor】類,然後點進去發現代碼停在了108行。如圖:
這裏寫圖片描述

在這裏我們可以看到數據綁定流程過程中的第一步。

然後我們在變量域中找到binder這個變量,在這個binder變量中存有一系列的值。其中最主要的三個分別是【conversionService】【validators】【bindingResult】
如下圖
這裏寫圖片描述

這三個變量分別對應流程中的二三四所需要的步驟。

數據轉換時在【conversionService】中發生的。而且在這裏Springmvc默認了許多轉換器,下圖所示:
這裏寫圖片描述

在這裏我們可以完成絕大多數的類型之間的轉換。我們不需要再自定義轉換器。

ConversionService converters = 
    @org.springframework.format.annotation.DateTimeFormat java.lang.Long -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16,
@org.springframework.format.annotation.NumberFormat java.lang.Long -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.DateTimeFormat java.util.Calendar -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16
    @org.springframework.format.annotation.DateTimeFormat java.util.Date -> java.lang.String: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16
    @org.springframework.format.annotation.NumberFormat java.lang.Double -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.NumberFormat java.lang.Float -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.NumberFormat java.lang.Integer -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.NumberFormat java.lang.Short -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.NumberFormat java.math.BigDecimal -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    @org.springframework.format.annotation.NumberFormat java.math.BigInteger -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.Boolean -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@de1b36
    java.lang.Character -> java.lang.Number : org.springframework.core.convert.support.CharacterToNumberFactory@166b0df
    java.lang.Character -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@1f9cdda
    java.lang.Enum -> java.lang.String : org.springframework.core.convert.support.EnumToStringConverter@2423ad
    java.lang.Long -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$LongToCalendarConverter@19302fb
    java.lang.Long -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$LongToDateConverter@1d5e499
    java.lang.Number -> java.lang.Character : org.springframework.core.convert.support.NumberToCharacterConverter@139d369
    java.lang.Number -> java.lang.Number : org.springframework.core.convert.support.NumberToNumberConverterFactory@1220b15
    java.lang.Number -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@d76d1e
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.lang.Long: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16,java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Long: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Calendar: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Date: org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory@786e16
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Double: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Float: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Integer: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Short: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigDecimal: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigInteger: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@838143
    java.lang.String -> com.wf.springmvc.crud.entities.Employee : com.wf.springmvc.crud.conversion.EmployeeConversion@134ab9b
    java.lang.String -> java.lang.Boolean : org.springframework.core.convert.support.StringToBooleanConverter@e62a39
    java.lang.String -> java.lang.Character : org.springframework.core.convert.support.StringToCharacterConverter@13ce184
    java.lang.String -> java.lang.Enum : org.springframework.core.convert.support.StringToEnumConverterFactory@1cc946b
    java.lang.String -> java.lang.Number : org.springframework.core.convert.support.StringToNumberConverterFactory@5966f
    java.lang.String -> java.util.Locale : org.springframework.core.convert.support.StringToLocaleConverter@a26638
    java.lang.String -> java.util.Properties : org.springframework.core.convert.support.StringToPropertiesConverter@f0474c
    java.lang.String -> java.util.UUID : org.springframework.core.convert.support.StringToUUIDConverter@151e135
    java.util.Calendar -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToLongConverter@3fcfb
    java.util.Calendar -> java.util.Date : org.springframework.format.datetime.DateFormatterRegistrar$CalendarToDateConverter@89e0c6
    java.util.Date -> java.lang.Long : org.springframework.format.datetime.DateFormatterRegistrar$DateToLongConverter@19b7dfa
    java.util.Date -> java.util.Calendar : org.springframework.format.datetime.DateFormatterRegistrar$DateToCalendarConverter@16bb63e
    java.util.Locale -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@1e4e6db
    java.util.Properties -> java.lang.String : org.springframework.core.convert.support.PropertiesToStringConverter@d8fb2b
    java.util.UUID -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@9875d1
    org.springframework.core.convert.support.ArrayToArrayConverter@13fa2d5
    org.springframework.core.convert.support.ArrayToCollectionConverter@15f1ace
    org.springframework.core.convert.support.ArrayToObjectConverter@dec95c
    org.springframework.core.convert.support.ArrayToStringConverter@2c390c
    org.springframework.core.convert.support.ByteBufferConverter@af9d74
    org.springframework.core.convert.support.ByteBufferConverter@af9d74
    org.springframework.core.convert.support.CollectionToArrayConverter@d8f317
    org.springframework.core.convert.support.CollectionToCollectionConverter@db59df
    org.springframework.core.convert.support.CollectionToObjectConverter@86a58a
    org.springframework.core.convert.support.CollectionToStringConverter@14487c8
    org.springframework.core.convert.support.FallbackObjectToStringConverter@123b9c1
    org.springframework.core.convert.support.IdToEntityConverter@18a5d49,org.springframework.core.convert.support.ObjectToObjectConverter@f2a0ef
    org.springframework.core.convert.support.MapToMapConverter@e969f8
    org.springframework.core.convert.support.ObjectToArrayConverter@75c2be
    org.springframework.core.convert.support.ObjectToCollectionConverter@1de41c3
    org.springframework.core.convert.support.StringToArrayConverter@1556aec
    org.springframework.core.convert.support.StringToCollectionConverter@2e6767

常見的轉換器
這裏寫圖片描述

【validators】數據域
這裏寫圖片描述

【bindingResult】數據域
這裏寫圖片描述

自定義轉化器

三步走:
第一步:前臺輸入框輸入符合格式的數據。
第二步: 編寫自定義轉換器類 實現Converter類。
第三步:springmvc.xml文件註冊自定義轉換器。

Spring定義了三種類型的轉化器接口,實現任意一個轉換器接口都可以作爲自定義轉換器註冊到ConversionServiceFactoryBean中。建議使用第一個。
【Converter《S,T》: 將S類型對象轉化爲T類型對象】
【ConverterFactory:將相同系列多個“同質”Converter封裝在一起,如果希望將一種類型的對象轉換爲另外一種類型及其子類的對象(例如將String轉化爲Number及Number子類Double,Integer等對象)可以使用該轉換器工廠類】
【GenericConverter:會根據源類對象及目標對象所在的宿主類中的上下文信息進行類型轉換】

ConversionService是【Spring類型】轉換體系的核心接口。
可以利用ConversionFactoryBean在spring的IOC容器中定義一個ConversionService。spring將自動識別IOC容器中的Conversion,並在bean屬性配置及Springmvc處理方法入參綁定等場景使用它進行數據的轉換。
可以通過ConversionServiceFactoryBean的converters屬性註冊自定義的類型轉換器。

<!--第一步: 前臺輸入框輸入符合格式的數據 -->

<span>自定義轉換器的使用</span>
<form action="testConversionServiceConverer" method="post">
        <!-- GG-GG.163.com-0-105  lastName-email-gender-department.id -->
Employee : <input type="text" name="employee">
<input type="submit" value="Submit">
</form>

<!--第二步 編寫自定義轉換器類 實現Converter類 -->

@Component
public class EmployeeConversion implements Converter<String, Employee> {
    //Converter<String, Employee> 將String類型轉化爲employee的類型
    @Override
    public Employee convert(String source) {
        // source 傳入的數據
    //  <!-- GG-GG.163.com-0-105  lastName-email-gender-department.id -->
        System.out.println(source);
        if(source!=null){
            String [] vals = source.split("-");
            if(vals!=null && vals.length==4){
                String lastName=vals[0];
                String email=vals[1];
                Integer gender=Integer.parseInt(vals[2]);
                Department department = new Department();
                department.setId(Integer.parseInt(vals[3]));
                Employee employee = new Employee(null, lastName, email, gender, department);
                System.out.println("進入轉化器:"+employee);
                return employee;
            }
        }
        return null;
    }
}

<!--springmvc.xml文件註冊自定義轉換器 -->
<mvc:annotation-driven conversion-service="ConversionServiceFactoryBean"></mvc:annotation-driven>

<bean id="ConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConversion"/>
            </set>
        </property>
    </bean>

注意:
1、 配置自定義的Convert 需要使用 mvc:annotation-driven 並且要使用conversion-service屬性進行我們的轉換器註冊,不影響內置的轉換器的使用。

2、配置conversion-service=”ConversionServiceFactoryBean”屬性可能會使 其餘需要mvc:annotation-driven的註解失效,格式化失效,解決方法就是 配置自定義轉換器時,配置class時要進行不同的配置。
【org.springframework.format.support.FormattingConversionServiceFactoryBean】
【 org.springframework.context.support.ConversionServiceFactoryBean】

3、 流程是先進入轉化器,然後在進入controller。

mvc:annotation-driven

關於mvc:annotation-driven 的使用說明

1、配置頁面進行不經過controller處理直接重定向或轉發時,我們利用其使那些經過RequestMapping註解失效的controller處理生效。
2、 爲了處理靜態資源問題,我們配置屬性,配置之後,RequestMapping註解失效,配置其使其他註解生效。
3、配置自定義轉換器,我們要用到mvc:annotation-driven的屬性conversion-service。

爲什麼要配置 mvc:annotation-driven

官方文檔中提到:
The above registers a RequestMappingHandlerMapping, a RequestMappingHandlerAdapter,
and an ExceptionHandlerExceptionResolver (among others) in support of processing
requests with annotated controller methods using annotations such as @RequestMapping ,
@ExceptionHandler, and others.
It also enables the following:
1. Spring 3 style type conversion through a ConversionService instance in addition to the JavaBeans PropertyEditors used for Data Binding.
2. Support for formatting Number fields using the @NumberFormat annotation through the
ConversionService.
3. Support for formatting Date, Calendar, Long, and Joda Time fields using the @DateTimeFormat annotation.
4. Support for validating @Controller inputs with @Valid, if a JSR-303 Provider is present on the classpath.
5. HttpMessageConverter support for @RequestBody method parameters and @ResponseBody
method return values from @RequestMapping or @ExceptionHandler methods.
翻譯過來即是下文:
【mvc:annotation-driven】會進行自動註冊
【RequestMappingHandlerMapping】【RequestMappingHandlerAdapter】【ExceptionHandlerExceptionResolver】三個bean。
此外還將提供支持:
1、支持使用【ConversionService】實例對錶單參數及新寧類型轉換
2、支持使用【@NumberFormatannotation】【@DateTimeFormat】註解完成數據類型的格式化
3、支持使用【@valid】註解對javaBean實例進行JSR303 驗證
4、支持使用【@RequestBody】和【@ResponseBody】註解

建議在項目中的bean的setter方法中添加斷點進行調試,然後找到【ModelAttributeMethodProcessor】類觀察binder變量【conversionService】,然後再找到任意一個【DispatchServlet】點進去進行觀察this變量的【HandlerAdapter】【HandlerMapping】【HandlerExceptionResolver】,然後我們分別屏蔽和添加配置【mvc:annotation-driven】和【mvc:default-servlet-handler】進行相應的觀察,最後我們得出他們之間的區別:
這裏寫圖片描述
所以這個配置一般都要進行添加的。屬於標配、

@InitBinder

1、有@InitBinder標識的方法,可以對WebDataBinder對象進行初始化。WebDataBinder是DataBinder的子類,用於完成表單字段到JavaBean輸贏的綁定,所以我們可以利用這個註解對JavaBean屬性進行一些操作。
2、有@InitBinder標識的方法不能有返回值,必須聲明爲void。
3、有@InitBinder標識的方法的參數通常是WebDataBinder。
4、WebDataBinder中存在一些方法可以對屬性進行操作並且也可以利用父類DataBinder中的方法。

@InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        // 不對java bean中的 lastName 屬性進行賦值 ,另行處理
        webDataBinder.setDisallowedFields("lastName");
    }

數據格式化

對屬性對象的輸入/輸出進行的格式化,其實是屬於“類型轉換”的範疇。Spring 在格式化模塊中定義了一個實現【ConversionService接口】的【FormattingConversionService實現類】,由於該實現類又擴展了【GenericConversionService類】,所以它不僅僅具有格式化的功能,還具有類型轉換的功能。
FormattingConversionService有一個FormattingConversionServiceFactoryBean工廠類,後者主要是用在spring上下文中構造前者。
在FormattingConversionServiceFactoryBean的內部已經註冊了【NumberFormatAnnotationFormatterFactory類:支持對數字類型的屬性使用@NumberFormat註解】【JodaDateTimeFormatAnnotationFormatterFactory類:支持對日期類型的屬性使用@dateTimeFormat註解】
裝配了【FormattingConversionServiceFactoryBean】後,就可以在Springmvc入參綁定及模型數據輸出時使用上述的註解驅動了。然而【mvc:annotation-driven】默認創建的【ConversionService】實例即爲【FormattingConversionServiceFactoryBean】。所以我們可以直接進行使用。

日期格式化:

@DateTimeFormat註解 可以對【java.util.Date】【java.util.Calendar】【java.long.Long】時間類型進行標註。
屬性值:
pattern:字符串類型。指定解析/格式化字段數據的模式,eg:”yyyy-MM-dd”前臺傳遞的String數據爲“2017-03-03”最爲常用pattern
iso:類型爲DateTimeFormat.ISO。指定解析/格式化字段數據的ISO模式,包括四種ISO.NONE(不使用)–默認值,ISO.DATE(yyyy-MM-dd),ISO.TIME(HH:mm:ss.SSSZ, e.g. 01:30:00.000-05:00),ISO.DATE_TIME(HH:mm:ss.SSSZ, e.g. 01:30:00.000-05:00.)
style:字符串類型。通過樣式指定日期時間的格式,由兩位字符組成,第一位表示日期格式,第二位表示時間格式;

數值格式化:

@NumberFormat 可以對類似數字類型的屬性進行標註。他的兩個屬性爲互斥的。
style:類型爲NumberFormatStyle。用於指定樣式類型。包括【Style.CURRENCY,貨幣類型】【Style.NUMBER,正常數字類型】【Style.PERCENT,百分數類型】
pattern:類型爲String,自定義樣式 【pattern=”#,###,###.#”】注意這裏的匹配用的是#號,常用。

    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birthday;
    @NumberFormat(pattern="#,###,###.#")
    private Double salary;

數據校驗

JSR303

JSR303 是Java爲Bean數據合法性校驗提供的一個標準框架。注意是Java Bean。
JSR303 通過在Bean 屬性上標註類似與@NotNull,@Max等標準的註解指定校驗規則,並通過標準的驗證接口對Bean進行驗證。
JSR303註解如下:
@Null 被註釋的元素必須爲 null

@NotNull 被註釋的元素必須不爲 null

@AssertTrue 被註釋的元素必須爲 true

@AssertFalse 被註釋的元素必須爲 false

@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值

@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值

@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值

@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值

@Size(max, min) 被註釋的元素的大小必須在指定的範圍內

@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內

@Past 被註釋的元素必須是一個過去的日期

@Future 被註釋的元素必須是一個將來的日期

@Pattern(value) 被註釋的元素必須符合指定的正則表達式hibernate對這個規範做了實現和擴展;

注意:JSR303 雖然是Java爲Bean數據合法性校驗提供的一個標準框架,但是Spring並沒有提供JSR303的實現。所以我們需要自己進行添加jar包實現。

Hibernate Validator 擴展註解

Hibernate Validator 是JSR303 的一個參考實現,除了支持JSR303所有的標準註解之外,他還支持以下的擴展。

@Email 被註釋的元素必須是電子郵箱地址

@Length 被註釋的字符串的大小必須在指定的範圍內

@NotEmpty 被註釋的字符串的必須非空

@Range 被註釋的元素必須在合適的範圍內

Springmvc數據校驗

1、對於Spring4.0 擁有自己獨立的數據校驗框架,同時還支持JSR 303標準的校驗框架。
2、Spring在進行數據綁定時,可以同時調用校驗框架來完成數據校驗工作,在Springmvc中,可以直接通過註解驅動的方式進行數據校驗。這也是Struts2 無法比擬的
3、Spring的LocalValidatorFactoryBean既實現了Spring的Validator接口,也實現了JSR 303 的Validator接口。我們只需要在Spring容器中定義一個LocalValidatorFactoryBean,即可將其注入到需要數據校驗的Bean中。
4、Spring本身沒有提供JSR303 的實現,所以必須將JSR303 的實現jar包放到類路徑下。
5、前面3說到只需要在Spring容器中定義一個LocalValidatorFactoryBean,即可將其注入到需要數據校驗的Bean中,那麼我們需要怎麼實現呢?其實我們只需要配置【mvc:annotation-driven】即可,因爲它支持使用【@valid】註解對javaBean實例進行JSR303 驗證,見上面【mvc:annotation-driven】小節。這個配置會自動給我們裝配一個LocalValidatorFactoryBean,然後我們可以通過註解【@valid】註解即可完成Springmvc在數據綁定之後執行數據校驗的工作。
6、Valid註解標註在表單/命令對象前,一般在Controller的目標方法中進行標註,此時,Springmvc在將請求參數綁定到該入參對象後,就會調用校驗框架根據bean註解聲明的校驗規則進行校驗。
7、對於校驗結果的保存,Springmvc是通過對處理方法簽名的規則來保存到BinderResult後者Errors類型中,所以在配置了Valid註解之後,一般在這個方法的參數中,我們需要額外的配置一個BinderResult或者Errors類型的參數。【這兩個類都位於import org.springframework.validation包】中。
8、如果需要多個bean驗證時,需要驗證的bean對象和其綁定結果的對象必須是成對出現的,而且他們之間不能有 其他入參的聲明。見代碼示例

提示消息的國際化

每個屬性在數據校驗和數據綁定出現錯誤時,都會生成一個對應的FieldError對象,而且校驗框架會自動爲該屬性生成4個消息代碼,這些代碼的規則是一校驗註解名爲前綴,結合ModelAttribute、屬性名以及屬性類型名生成多個對應的消息代碼【User類中的password屬性標註@Pattern註解,當數據不滿足該@pattern所定義的規則時,就會產生4個錯誤代碼分別是{Pattern.user.password},{Pattern.password},{Pattern.java.lang.string},{Pattern}】我們就是根據這些代碼信息來進行國際化資源配置的。

使用國際化信息需要在springmvc.xml配置國際化資源文件

JSR303 已經實現了本地化信息顯示,但是我們還是可以進行錯誤信息的定製。也可以不進行定製。

當在Springmvc標籤顯示錯誤時,Springmvc會查看web上下文是否裝配了對應的國際化消息,如果沒有則是按照默認的進行顯示,如果有則是按照國際化消息顯示

如果數據類型轉換或者數據格式轉換髮生錯誤時,或者是該有的參數不存在時,或者是調用處理方法發生錯誤時,都會在隱含模型中創建錯誤消息。其中錯誤代碼前綴如下:
required:必要的參數不存在。【在入參時@RequiredParam(“param1”)標註一個入參必須存在,但是該參數不存在】
typeMismatch:在數據綁定時,發生數據類型不匹配的錯誤。
methodInvocation:Springmvc在調用處理方法時發生了錯誤。

數據校驗流程

    1)如何校驗
            a.使用JSR303驗證標準
            b.加入 hibernate validate驗證框架
            c.在springmvc中配置annotation
            d.在需要的bean的屬性上添加對應的註解
            e .在目標方法bean 類型的前面添加@Valid 註解
    2)驗證出錯轉向頁面
    3)<form:errors/>標籤顯示錯誤信息及國際化標準  

所需要的jar包如下,而且要注意jar包之間的衝突問題、、
衝突報錯信息【java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;】

這裏寫圖片描述

<!--在springmvc中配置annotation  -->
<mvc:annotation-driven></mvc:annotation-driven>

<!--在需要的bean的屬性上添加對應的註解 記得是bean-->

    @NotEmpty
    private String lastName;

    @Email
    private String email;   

    @Past
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birthday;

    @NumberFormat(pattern="#,###,###.#")
    private Double salary;

<!--在目標方法bean 類型的前面添加@Valid 註解 -->

//新增一個數據, 第二步 進行提交到後臺處理  模擬數據發生錯誤,當數據發生錯誤時,我們要進行記錄在BindingResult中
    @RequestMapping(value="/emp",method=RequestMethod.POST)
    public String save(@Valid Employee employee,BindingResult result,Map<String, Object>maps, @Valid User user,BindingResult userresult){
        System.out.println(employee);

        if(result.getErrorCount()>0){ // 檢查是否存在 驗證出錯信息 後臺不需要存儲錯誤信息,下面代碼只是爲了在控制檯打印
            System.out.println("出錯了");
            for(FieldError error:result.getFieldErrors()){
                System.out.println(error.getField()+":"+error.getDefaultMessage());
            }
            // 驗證出錯,指向定製的頁面 
            maps.put("departments",departmentDAO.getDepartments() );
            return "addemp";
        }   
        employeeDAO.save(employee);
        return "redirect:/list";  // 記得一定是redirect小寫的,大寫的識別不出來
    }

<!-- 配置國際化資源文件 , 同時根目錄下也應該有對應的國際化文件 下圖-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
</bean>



<!-- 前臺錯誤消息輸出  path值爲 對應的屬性值-->
<span>----錯誤顯示區域-----</span><br>
    <form:errors path="*"></form:errors><br><!--整體顯示錯誤  -->
<span>----錯誤顯示區域-----</span>
<!-- 單個顯示錯誤,注意path屬性值與input一致 -->
BirthDay:<form:input path="birthday"/> <form:errors path="birthday"/> <br>

這裏寫圖片描述

總結: 數據轉換和數據格式化 是對前臺數據到後臺數據類型的轉化與格式,而數據校驗則是對前臺數據進行一定規則的檢查。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章