后台数据传输校验

接收数据

  1. 提倡使用restful风格的url。
  2. 通过提交的方式和资源来确定你要执行的功能;通过返回的状态码来确定执行成功还是失败。
  3. post、delete、put、get;好处:全自动生成文档,更加直观。
  4. putForObject、getForObject路径做参数、from表单参数、json参数。
  5. 指定方法响应的数据格式:
    @RequestMapping(value = "/someurl/suburl", produces = "application/json")
    @RequestMapping(value = "/someurl/suburl", produces = "application/xml")
  6. 参数绑定。
    A、处理requet uri部分(这里指uri template中variable,不含queryString部分)的注解:@PathVariable;将某个动态参数放到URL请求路径中,即接收路径参数eg:/new/param,此注解放在参数前面。
    B、处理request header部分的注解:@RequestHeader,@CookieValue;
    C、处理request body部分的注解:@RequestParam,指定了请求参数名称;@RequestBody;允许request的参数在request体中,而不是直接在链接后面,此注解放在参数前面。
    D、处理attribute类型是注解:@SessionAttributes,@ModelAttribute;
  7. 服务端。
    解决服务端返回乱码问题?produces = "application/json;charset=UTF-8"
    接收客户端的数据?(@PathVariable、vo对象、@RequestBody)
  8. 请求域?数据放入到请求域中,进行页面展示。(map、model、modelmap、modelandview)
  9. 客户端调用。
    发送数据给服务端?(数据形式:路径参数、form表单参数、Json参数)
  10. 明确返回的是数据还是页面。如果返回的是数据的话,需要加@ResponseBody注解,同时使用自定义的R进行返回;如果返回的是页面,返回类型定义为String。使用转发(forward)、重定向(redirect)。

校验数据

认识Validator

在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。缺省的元数据是 Java Annotations,通过使用 XML 可以对原有的元数据信息进行覆盖和扩展。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

上面是网上的,以下是总结

简介

Hibernate Validator

验证注解

注解用法
@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附加的注解 
@Email被注释的元素必须是电子邮箱地址
@Length被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range被注释的元素必须在合适的范围内

国际化消息

正常的加消息,是注解的属性,message
@NotNull(groups = ValidationLogin.class, message = "id不能为空")

单对象校验

实体类

public class Car {

   @NotNull
   private String manufacturer;

   @NotNull
   @Size(min = 2, max = 14)
   private String licensePlate;

   @Min(2)
   private int seatCount;

   // getter和setter方法省略
}

Controller控制器

@RequestMapping(value = "/validation") 
public String validation(@Valid Car car, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        System.out.println(bindingResult.getFieldError().getDefaultMessage());
    }
}

分组数据校验

实体类

public class Car {

    // 分组验证接口
    public interface Validation {
    }

    @NotNull(groups = Validation.class, message = "不能为空")
    private String manufacturer;

    @NotNull(groups = Validation.class, message = "不能为空")
    @Size(min = 2, max = 14)
    private String licensePlate;

    @Min(2)
    private int seatCount;

    // getter和setter方法省略
}

Controller控制器

@RequestMapping("/validationGrop") 
public void validationGrop(@Validated(UserVO.ValidationLogin.class) UserVO vo, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        System.out.println(bindingResult.getFieldError().getDefaultMessage());
    }
}

注意:BindingResult必须和@Valid、@Validated一起使用,否则会报错!

案例分析

第①步:引入依赖

1

2

3

4

5

6

7

8

9

10

11

12

13

<!--数据校验-->

       <dependency>

           <groupId>org.hibernate</groupId>

           <artifactId>hibernate-validator</artifactId>

           <version>4.3.1.Final</version>

       </dependency>

 

       <!--validation api-->

       <dependency>

           <groupId>javax.validation</groupId>

           <artifactId>validation-api</artifactId>

           <version>1.0.0.GA</version>

       </dependency>

  

第②步:配置Spring.xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!--:参数方法名解析器-->

   <bean id="methodNameResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/"/>

       <property name="suffix" value=".jsp"/>

   </bean>

    <!--扫描包下所有的被标注的类-->

    <context:component-scan base-package="cn.happy.day15Validator"/>

 

    <!--配置验证器-->

    <bean id="myvalidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">

        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>

    </bean>

 

    <!--绑定验证器-->

    <mvc:annotation-driven validator="myvalidator"/>

  

第③步:实体类注解

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

package cn.happy.day15Validator;

 

import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.Max;

import javax.validation.constraints.Min;

import javax.validation.constraints.Pattern;

import javax.validation.constraints.Size;

 

 

/**

 * Created by Administrator on 2018/3/31.

 */

public class UserInfo {

 

    /**

     * Min:设置最小值

     * Max:设置最大值

     * Message:打印信息

     */

    //指定年龄在18-120之间

    @Min(value = 18,message = "年龄不能小于18岁")

    @Max(value = 120,message = "年龄不能大于100岁")

    private Integer age;

 

    /**

     * 三种验证方式

     * @NotEmpty  用于集合

     * @NotNull   用于基本类型

     * @NotBlank  用于引用类型

     * @Size    设置大小

     */

    //非空验证

    @NotEmpty(message = "用户名不能为空")

    @Size(max = 20,min = 6,message = "用户名不能大于20个字符或小于6个字符")

    private String name;

 

    /**

     * @Pattern  rehexp匹配正则

     */

    @NotEmpty(message = "邮箱不能为空")

    @Pattern(regexp = "^\\w+@\\w+/.\\w+$",message = "邮箱格式错误")

    private String email;

 

    @Pattern(regexp = "^1[35789]\\d{9}$",message = "手机号格式错误")

    private String phone;

 

    public String getPhone() {

        return phone;

    }

 

    public void setPhone(String phone) {

        this.phone = phone;

    }

 

    public String getEmail() {

        return email;

    }

 

    public void setEmail(String email) {

        this.email = email;

    }

 

 

    public Integer getAge() {

        return age;

    }

 

    public void setAge(Integer age) {

        this.age = age;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

}

 

  

第④步:配置处理器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.validation.BindingResult;

import org.springframework.validation.FieldError;

import org.springframework.web.bind.annotation.RequestMapping;

 

import javax.validation.Valid;

import java.text.SimpleDateFormat;

import java.util.Date;

 

/**

 * Created by Administrator on 2018/3/30.

 */

@Controller

public class FirstController {

 

    @RequestMapping("/first")

    /**

     * @Valid   验证对象

     * BindingResult  绑定结果

     * Model    视图对象

     */

    public String doFirst(@Valid UserInfo userInfo, BindingResult br, Model mv) throws Exception {

        //判断br中的错误数

        if(br.getErrorCount()>0){  //证明至少有一个数据错误

            //获取信息

            FieldError name = br.getFieldError("name");

            FieldError age = br.getFieldError("age");

            FieldError phone = br.getFieldError("phone");

            FieldError email = br.getFieldError("email");

 

            //获取错误信息

            if(name!=null){

                String namemsg = name.getDefaultMessage();

                //把错误信息返回到页面

                mv.addAttribute("namemsg",namemsg);

            }

            if(age!=null){

                String agemsg = age.getDefaultMessage();

                mv.addAttribute("agemsg",agemsg);

            }

            if(phone!=null){

                String phonemsg = phone.getDefaultMessage();

                mv.addAttribute("phonemsg",phonemsg);

            }

            if(email!=null){

                String emailmsg = email.getDefaultMessage();

                mv.addAttribute("emailmsg",emailmsg);

            }

            //返回请求View

            return "Validator";

        }

        return "doSecond";

    }

 

}

  配置完成!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值