SpringMVC数据校验并通过国际化显示错误信息

SpringMVC数据校验

<mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid 注解即可让Spring MVC在完成数据绑定后执行数据校验的工作。

首先,我们在实体类上标注JSR303校验注解

public class User extends BaseDomain{
private int userId; //将属性值长度限定为2~10之间,但中文占两个字符
@Length(min = 2, max = 10)
private String userName; //匹配4~30个数字和字母以及下划线字符
@Pattern(regexp="w{4, 30}")
private String name; @Length(min = 6)
private String password;

注解规则有多个可以参考下表

JSR 303注解

Hibernate Validator拓展注解

接着我们要让springMVC使用这些规则对数据进行校验,下面将使用LoginController控制器进行演示。

@Controller
public class LoginController { @RequestMapping(value = "/login", produces="text/html;charset=UTF-8")
public String login(
@Valid @ModelAttribute("user") User user,
BindingResult result, HttpSession session){
if(result.hasErrors()){
return "forward:/loginPage";
}else{
session.setAttribute("user", user);
return "home";
}
}

​ 在已经标注了JSR303注解的表单/命令对象前标注一个@Valid,Spring MVC框架在将请求数据绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验。

​ 在本例中我们对User对象标注@Valid注解。还有要记得标注@ModelAttribute,并显示的指定其value值为user,在显示错误信息时我们会用到它。

​ 还有一个问题就是校验所产生的校验结果保存在什么地方呢,如何传递给请求处理方法?Spring MVC是通过对处理方法签名的规约来保存校验结果的:前一个表单/命令对象的校验结果保存在其后的入参中,这个保存校验结果的入参必须是BindingResult 或Errors类型,这两个类都位于org.springframework.validation包中。

​ 而且需校验的表单/命令对象和其绑定结果对象或错误对象是成对出现的,它们之间不允许声明其他的入参。

在页面中显示错误信息

​ 由于表单/命令对象所对应的请求一般是从客户端的网页中传送过来的,如果发生了错误,我们必须通过网页显示出错误,提示用户更正错误。

<div class="login-container">

        <form:form modelAttribute="user" action="login" method="post">
<div class="login-inner">
<div class="login-inner-item login-operaType">
<div class="sign-in active">登录</div>
<div class="sign-up">注册</div>
</div>
<div class="login-inner-item">
<input type="text" class="layui-input" placeholder="账号" name="userName" value="${user.userName}">
<div class="message-error">
<form:errors path="userName" cssClass="message-error"/>
</div>
</div>
<div class="login-inner-item">
<input type="password" class="layui-input" placeholder="密码" name="password" value="${user.password}">
<div class="message-error">
<form:errors path="password" cssClass="message-error"/>
</div>
</div>
<div class="login-inner-item message-error">
${errorMsg}
</div>
<div class="login-inner-link">
<a href="">忘记密码</a>
</div>
<div class="login-inner-item .login-inner-submit">
<input type="submit" class="layui-input" value="登录">
</div>
</div>
</form:form>
</div>

首先我们修改一下form标签,并指定模型数据为user,与前面标注的@ModelAttribute一致,如下

<form:form modelAttribute="user" action="login" method="post">
...
</form:form>

然后使用<form:errors />标签来显示错误信息,path用来指定实体类中的属性,cssClass指定css样式类

<form:errors path="userName" cssClass="message-error"/>

也可以使用如下标签显示所有的错误信息,但是不精确没必要

<form:errors path="*"/>

接下来我们测试一下效果,如下就能显示错误信息了

​ 虽然能显示错误信息,但是这些错误信息是springMVC默认的,在实际运用中我们希望使用更加人性化的设置来显示错误信息。这时我们可以给校验注解添加message属性指定错误信息。

public class User extends BaseDomain{
private int userId; @Length(min = 2, max = 10, message = "用户名不正确,长度必须在2~10之间")
private String userName; @Length(min = 6, message = "密码长度不合法,长度必须大于6")
private String password;

这样我们就能按照我们自己的想法去显示不同的错误信息,如下

​ 虽然这样做成功了,能个性化的显示错误信息,但是这使用硬编码的方式依旧不推荐使用,我们希望在不修改源代码的情况下来修改这些错误信息,这时就可以使用国际化的方式来显示错误信息了。

通过国际化显示错误信息

当一个属性校验失败后,校验框架默认会为该属性生成4个消息代码,这些代码以校验注解类名前缀。例如User类中的password属性标准了一个@Length注解,当该属性值不满足@pattern所定义的规则时,就会产生一下4个错误代码:

Length.user.password
Length.password
Length.java.lang.String
Length

这里我们选择最精确的一个Length.user.password

​ 我们在类路径下添加一个文件夹i18n,用来存放国际化资源。然后再创建国际化资源,一个是message.properties,一个是message_zh_CN.properties,内容如下

接下来的工作是在springmvc-servlet中配置好这个国际化资源:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n.message"/>
</bean>

千万要注意,需要给这个bean添加一个id,且其值只能是messageSource,不然这个bean不会起作用。起初我配置好bean后,没给他加上id,然后配置的国际化根本不起作用,这个问题困扰我好久,最后通过查阅资料得知:

​ 对Spring容器启动时的步骤进行剖析,①处的initMessageSource()方法所执行的工作就是初始化容器中的国际化信息资源:它根据反射机制从BeanDefinitionRegistry中找出名称为“messageSource”且类型为org.springframework.context.MessageSource的Bean,将这个Bean定义的信息资源加载为容器级的国际化信息资源。

public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory); try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
//①初始化消息源
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
} this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
} }
}

然后看看MessageSource类图结构

所以容器中存在ResourceBundleMessageSource这个bean,并且id为messageSource时,spring才会把这个Bean定义的信息资源加载为容器级的国际化信息资源

然后就可以把实体类中硬编码的message属性给去掉了,如下就是效果,和之前的一样

SpringMVC数据校验并通过国际化显示错误信息的更多相关文章

  1. 《Java从入门到放弃》入门篇:springMVC数据校验

    昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303 ...

  2. struts2 前端显示错误信息

    当我们显示错误信息的时候,会发现错误信息会以列表的形式显示,这样就不美观了,达不到我们想要的标准.所以我们可以用另外的方式输出错误信息. 例如我现在增加了两个错误信息: this.addFieldEr ...

  3. PHP通过ini_set()来设置显示错误信息和执行时间

    PHP的 ini_set函数是设置选项中的值,在执行函数后生效,脚本结束的时候,这个设置也失效.不是所有的选项都能被改函数设置的.具体那些值能够设置,可以查看手册中的列表. 就是能够设置php.ini ...

  4. Sharepoint2013:在页面上显示错误信息

    在sharepoint2013中我们需要修改以下三处的web.config,以显示错误信息 1, C:\inetpub\wwwroot\wss\VirtualDirectories\端口号\web.c ...

  5. 在ASP.NET 5中显示错误信息

    在 ASP.NET 5 中如果不进行显示错误信息的相关配置,在发生错误时,在浏览器中只能看到空白页面. 显示错误信息的配置方法如下: 1)在 project.json 中添加对 Microsoft.A ...

  6. 为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数

    关键词:log-error_verbosity ,mysql启停没有信息,mysql启停不显示错误信息,mysql不显示启停信息 原因就是因为 log-error_verbosity = 2 被设置成 ...

  7. TP5.0: 显示错误信息

    在TP5中,我们运行的代码有错误无法执行时,只显示页面错误,而不显示错误信息 对我我来讲是无法接受滴!!毕竟我还是个小渣渣,查看了百度,解决方案是: 在application/config,php中找 ...

  8. SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

  9. JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。

    JavaBean组件 JavaBean组件实际是一种java类.通过封装属性和方法成为具有某种功能或者处理某个业务的对象. 特点:1.实现代码的重复利用.2.容易编写和维护.3.jsp页面调用方便. ...

随机推荐

  1. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...

  2. 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)

    推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...

  3. 【EXPDP/IMPDP】数据泵导入导出遇到目录没有权限问题

    当执行数据泵导出的时候,报了如下错误: ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-39087: ...

  4. 【RAC】运行root.sh的时候报错root.sh Oracle CRS stack is already configured and will be running under init(1M)

    环境:oracle10g 系统:CentOS6.4 开始的时候,在节点1上运行root.sh发现出现90s 的时候hang住了,结束掉,结局完事后,再次运行root.sh报错 WARNING: dir ...

  5. Linux三剑客grep、awk和sed

    grep,sed 和 awk是Linux/Unix 系统中常用的三个文本处理的命令行工具,称为文本处理三剑客.本文将简要介绍这三个命令并给出基本用法. 管道 在介绍这两个命令之前,有必要介绍一下Uni ...

  6. ctfhub技能树—密码口令—默认口令

    打开靶机 查看页面内容 根据题目提示,去搜索北京亿中邮信息技术有限公司邮件网关的默认口令 尝试登录 成功拿到flag

  7. Linux学习安装

    Linux学习安装 服务器指的是网络中能对其他机器提供某些服务的计算机系统,相对普通PC, 服务器指的是高性能计算机,稳定性.安全性要求更高 linux安装学习 1.虚拟机 一台硬件的机器 安装vmw ...

  8. Java安全之ysoserial-JRMP模块分析(一)

    Java安全之ysoserial-JRMP模块分析(一) 首发安全客:Java安全之ysoserial-JRMP模块分析(一) 0x00 前言 在分析到Weblogic后面的一些绕过方式的时候,分析到 ...

  9. python工业互联网应用实战3—Django Admin列表

    Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...

  10. 电脑微信电脑PC 多开/防撤回 补丁

    简介 经常使用微信电脑版的用户都会发现一个蛋疼的事情,那就是微信PC版不支持多开,也就是不能同时登陆多个账号,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便.另外有的时候别人撤回了一些 ...