Deolin一般将Input类对象作为POST请求方法的参数,

Input类的域与前端的数据结构一一对应,由于后端不应该相信前端传过来的任何数据,

所以前端的数据对象先绑定到Input对象中,通过JSR303做一次数据校验。

Input类的所有域,类型都是String,

1、不相信前端传来的数据,所以不用诸如Integer,java.util.Date类型的域。不然会出现ClassClassCastException。

2、String类型的域可以添加@Pattern的注解,保证Input对象的每一个域,都能顺利的转化为业务上对应的类型。

Input类

    @NotBlank(message = "ID为空")
@Size(max = 11, message = "ID长度超过11")
@Pattern(regexp = "[0-9]+", message = "ID中有非数字")
private String id;

业务上的整数类型

    @NotBlank
@Size(max = 500, message = "地址长度超过500字符")
private String address;

长文本

    @NotBlank
@Size(max = 20)
@Pattern(regexp = "[0-9\\-]+")
private String telno;

手机号(这个正则可能不是最合适的)

    @NotBlank
@Pattern(regexp = "^true$|^false$", 不可用标识不是true且不是false)
private String disableFlag;

逻辑值

    @NotBlank
@Pattern(regexp = "^\d{1,8}(\.\d{1,2})*$", message = "单价格式错误(整数长度超过8个数字,或小数长度超过2个数字,或不是数字格式)")
private String price;

价格(最高价是99999999.99)

    @NotBlank
@Pattern (regexp = "^([01][0-9]|2[0-3]):([0-5][0-9])$", message = "格式不是HH:mm")
private String breakfastTime;

时间(24小时制,长度不是5位 错误,全角冒号 错误)

控制器共用方法

package com.women.ordering.common;

/**
* 封装了控制器的共用方法<br>
*
* @author Deolin
*/
abstract public class Controller { private static final Logger LOG = LogManager.getLogger(Controller.class); /**
* 检查前端提交的数据对象
*
* @param checker JSR303检验结果的封装对象
* @throws InputException 存在任何的异常数据
*/
protected void checkInput(BindingResult checker) {
List<ObjectError> errors = checker.getAllErrors();
StringBuilder messages = new StringBuilder(400);
if (errors.size() > 0) {
for (ObjectError error : errors) {
messages.append(error.getDefaultMessage());
}
LOG.warn("有异常数据越过前端校验:" + messages);
throw new InputException(messages.toString());
}
} }

示例

    /**
* 前端
*/
var jsonObj = {'id':'1aaa4', 'price':'10.999'};
$.ajax({
type : "post",
url : "/test",
dataType : "json",
contentType : "application/json",
data : JSON.stringify(jsonObj),
success:function(back) {
if (back.result) {
alert("success");
} else {
alert(back.message);
}
},
error:function(back) {
alert('error');
}
});
/**
* 后端
*/
@Controller
public class TestController extends Controller { @RequestMapping(value = "test", method = RequestMethod.POST)
@ResponseBody
public RequestResult test(@RequestBody ProductInput input, BindingResult checker) {
try {
checkInput(checker);
// TODO 业务代码
return "success";
} catch (Exception e) {
return e.getMessage();
};
} }

Input类中常用的验证方式的更多相关文章

  1. WCF中常用的binding方式

    WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...

  2. WCF中常用的binding方式 z

    WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务. WSHttpBinding: 比 Bas ...

  3. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  4. NAND Flash中常用的纠错方式(ECC算法)

    Hanming,RS,BCH —— NAND Flash中常用的纠错方式 因为闪存中会有出错的可能,如果没有使用ECC模块,读出的数据和写入的数据会有不匹配的可能,也许一个文件中只有一两个bit不匹配 ...

  5. 基础篇:1.JavaScript运行在html中,引用有几种方式?—— 6.js中常用的输出方式?

    书接上文,上文提到若干条JavaScript的基础性知识,大部分都是一些概念性的东西,本着认真严谨的态度,我们要认真对待,有些条目的问题是某个知识点的周边延伸,为节约篇幅,就一起整理了,如有描述不对的 ...

  6. php面向对象类中常用的魔术方法

    php面向对象类中常用的魔术方法   1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...

  7. 第8.34节 《Python类中常用的特殊变量和方法》总结

    本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...

  8. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  9. String类中常用的操作

    一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...

随机推荐

  1. Asp.Net Core 使用 MediatR

    Asp.Net Core 使用 MediatR 项目中使用了CQRS读写分离,增删改 的地方使用了 MediatR ,将进程内消息的发送和处理进行解耦.于是便有了这篇文章,整理并记录一下自己的学习.遇 ...

  2. The Art Of Loving

    The Art Of Loving 来源 https://www.zhihu.com/question/23720541 ----------------------------- 茫然的蒲公英 有书 ...

  3. 【转载】C#使用Trim方法去除字符串前后的所有空格

    在C#语言程序开发过程中,很多时候需要对字符串对象的前后空格进行去除,此时就需要使用到Trim()方法来实现这个功能,Trim()方法可以快速去除字符串前端和后端的所有空格. 例如有个字符:strin ...

  4. PC启动过程详解

    系统启动过程 1. 预引导(Pre-Boot)阶段 2. 引导阶段 3. 加载内核阶段 4. 初始化内核阶段 5. 用户登录阶段 基本概念: BIOS:即“Basic Input/Output Sys ...

  5. js中的BOM和DOM常用事件方法

    笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...

  6. github发布版本

    github发布版本后再pacakgist能拉取到需要发布版本 本地 mac@macdeMacBook-Pro:/www/tool$ git add . mac@macdeMacBook-Pro:/w ...

  7. 【SpringMVC】统一异常处理

    一.需求 二.统一异常处理解决方案 2.1 定义异常 2.2 异常处理 2.3 配置统一异常处理器 2.4 异常处理逻辑 一.需求 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处 ...

  8. 使用 rem 设置文字大小

    一.那到底什么是 rem 呢? 规范中明确写道: Equal to the computed value of ‘font-size’ on the root element. 「rem」是指根元素( ...

  9. unity之中级必备知识

    Mask,Scroll Rect实现图拖拽:新建Imag,添加Mask,Scroll Rect组件:新建Image,托放在Scroll下的Content:新建Scroll Bar实现滚动条的同步:托放 ...

  10. linux网络编程之system v信号量(二)

    今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...