Java EE MVC:处理表单验证

在本文中,我们将介绍Java EE MVC中的表单验证。

Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易。

使用JAX-RS方式进行验证

假设我们有一个小的html表单,可用于发送联系人消息。 为了表示表单数据,我们创建一个小的ContactMessage bean,其中包含表单字段和验证约束:

public class ContactMessage {@FormParam("message")@NotBlank@Size(max = 1000)private String message;// getters / setters
}

在我们的MVC控制器中,我们使用@BeanParam批注将表单数据转换为ContactMessage对象:

@Controller
@Path("/")
public class ContactController {@POSTpublic String formSubmit(@Valid @BeanParam ContactMessage message) {...}
}

(有关@BeanParam批注的更多详细信息,请参阅博客文章“使用bean参数” )。

通过将@Valid批注添加到ContactMessage参数,可以启用验证。 如果提交表单并且ContactMessage对象的验证失败,则将引发ConstraintViolationException。 在这种情况下,不会调用controller方法。 相反,可以使用通用的JAX-RS ExceptionMapper处理异常,如另一篇文章中所示: Java EE MVC中的全局异常处理 。

这种方法通常适用于标准JAX-RS REST端点。 如果无效数据已传递到服务器,我们通常希望在这里返回通用的HTTP 400(错误请求)状态代码。

在MVC环境中,只要传递了无效数据,我们就可以使用此行为向用户呈现标准错误页面。 但是,这通常不够灵活。 通常,我们想返回一个更具体的页面,向用户显示错误消息。

使用@MvcBinding和BindingResult进行验证

Java EE MVC提供了@MvcBinding批注,该批注启用了替代的异常处理机制。 可以将@MvcBinding与JAX-RS绑定批注(例如@FormParam)一起放在字段和方法参数上:

public class ContactMessage {@MvcBinding@FormParam("message")@NotBlank@Size(max = 1000)private String message;// getters / setters
}

如果注释字段的绑定失败,这将告诉Java EE MVC调用控制器方法而不是通用异常处理程序。 要访问绑定信息,我们可以将BindingResult对象注入到我们的控制器类中:

@Controller
@Path("/")
public class ContactController {@Injectprivate Models models;@Injectprivate BindingResult bindingResult;@POSTpublic String formSubmit(@Valid @BeanParam ContactMessage message) {if (bindingResult.isFailed()) {models.put("bindingResult", bindingResult);return "/WEB-INF/jsp/contact.jsp";}return "/WEB-INF/jsp/success.jsp";}
}

顾名思义,我们可以使用注入的BindingResult对象访问控制器方法中的绑定信息。 在此示例中,我们仅通过调用isFailed()来检查是否存在绑定问题。 通过将bindingResult添加到模型中,我们可以稍后在视图中访问它以向用户显示错误消息。

在提交按钮下方显示所有验证错误的简单JSP视图如下所示:

<form action="${mvc.contextPath}/contact" method="post"><label>Message:</label><textarea name="message"></textarea><br/><input type="submit"/><c:if test="${bindingResult.isFailed()}"><p>Form validation failed. Reasons:</p><ul><c:forEach items="${bindingResult.allValidationErrors}" var="validationError"><li><c:out value="${validationError.paramName}: ${validationError.message}"/></li></c:forEach></ul></c:if>
</form>

结论

使用Java EE MVC进行表单验证非常容易。 可以使用JSR 303 Bean验证批注将验证约束添加到Bean。 @MvcBinding允许我们处理控制器方法内的验证错误,而不是使用通用的ExceptionMappers。 BindingResult使我们可以访问验证信息。

与往常一样,您可以在GitHub上找到示例代码。

翻译自: https://www.javacodegeeks.com/2018/05/java-ee-mvc-handling-validation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号处理系统综合设计-求解器函数的设计(连续和离散时间系统)

微信公众号&#xff1a;创享日记 发送&#xff1a;求解器 获取完整报告&#xff08;含源程序代码结果分析&#xff09; 一、在s域分析连续时间系统的方法 一个线性时不变连续时间系统可以用线性常系数微分方程描述&#xff0c;对系统的时域分析可归结为利用数学方法对该方程求解…

OFFICE2019精简安装D盘(包括Word、PPT、Excel,可根据需要调整)+VISIO2019+Mathtype7.4.0完美下载安装教程

经过笔者测试&#xff0c;64位的OFFICE2019、VISIO2019对MathType兼容性很差&#xff0c;时不时出现问题&#xff0c;且网上能查阅到的解决办法均不能很好地解决。 无奈之下换回32位的OFFICE2019&#xff0c;配合MathType7.4.0&#xff0c;简直完美&#xff0c;现将OFFICE 201…

仿知乎论坛社区社交微信小程序

微信公众号&#xff1a;创享日记 发送&#xff1a;仿知乎 获取完整源码&#xff08;静态数据&#xff09;&#xff0c;导入微信开发者工具即可 说明&#xff1a;源码主要是前端&#xff0c;后端可自行开发 1、首页 问题列表 话题列表 触底加载刷新 2、问题列表及回答 3、发现…

单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

接上一节 高斯信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在单径Rayleigh衰落信道下的性能。 Rayleigh信道 利用改进的jakes模型来产生单径的平坦型瑞利衰落信道(对该jakes模型生成Rayleig…

商城小程序项目完整源码(微信小程序)

微信公众号&#xff1a;创享日记 发送&#xff1a;碰撞商城 获取完整源码详细注释&#xff08;打开微信开发工具导入即可&#xff09; 1、首页 ①搜索框可以点击搜索 ②轮播图可以点击跳转 ③功能模块可以自行开发 2、搜索 输入关键词会有推荐列表 UI可以自行设计得更漂亮 3、…

java 设计模式 示例_Java中的访问者设计模式–示例教程

java 设计模式 示例访客模式是行为设计模式之一 。 当我们必须对一组相似类型的对象执行操作时&#xff0c;将使用访问者模式。 借助访问者模式&#xff0c;我们可以将操作逻辑从对象移动到另一个类。 例如&#xff0c;假设有一个购物车&#xff0c;我们可以在其中添加不同类型…

电商商城小程序项目完整源码(微信小程序)

微信公众号&#xff1a;创享日记 发送&#xff1a;简商城 获取完整源码&#xff08;导入微信开发者工具即可&#xff09; 如果要较完整学习微信小程序云开发可以看看这个“云公开课”帮你了解完整的微信云托管部署流程&#xff0c;学习实战级的小程序开发。 1、首页 点击轮播图…

多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

接上一节 单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在多径衰落信道下的性能。 多径信道 多径衰落信道下的仿真没有采用Jakes模型生成的Rayleigh信道,而是直接采用3径信道h=[0…

Optional.isEmpty()即将加入Java吗?

JDK-8184693请求将方法isEmpty()添加到JDK 8引入的Optional类中。 调用Optional.isEmpty()等效于调用! Optional.isPresent() ! Optional.isPresent() 。 当前没有与JDK-8184693关联的JDK版本 &#xff0c;但是正如最近在core-libs-dev邮件列表中的标题为“ RFR&#xff1a;818…

汉字查拼音微信小程序项目源码

微信公众号&#xff1a;创享日记 发送&#xff1a;查拼音 获取完整源码&#xff08;微信开发者工具导入即可用&#xff09; ①基本包括全部汉字 ②支持多音字 "治":["zh","ch"],"沺":["tin"],"油":["yu"…

高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BFSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

结果预览 高斯 BFSK调制方式在采用m序列时,在高斯信道下的性能仿真结果如下: BFSK调制方式在采用正交Gold序列时,在高斯信道下的性能仿真结果如下: 单径Rayleigh 采用m序列时,在单径Rayleigh信道下的性能仿真结果如下:

随机抽奖转盘微信小程序项目源码

微信小程序&#xff1a;创享日记 发送&#xff1a;抽奖转盘 获取完整源码&#xff08;微信开发者工具打开即可用&#xff09; 可以容易自行修改&#xff0c;融入自己的项目里面。 function formatTime(date) {var year date.getFullYear()var month date.getMonth() 1var d…

基带模型下基于高阶累积量的MFSK信号的调制识别(代码和参考文献见CSDN同名资源)

信号模型:基带信号 文献一:吕新正. 利用高阶累积量实现数字调制信号的自动识别[J]. 2004. 核心思想:将基带信号进行微分后在计算|C21|和|C42|的值,定义特征参数 T 4 = ∣ C 42 ∣ / ∣ C 21 ∣ 2 T 4=\left|C_{42}\right| /\left|C_{21}\right|^{2}

Java 10 –局部变量类型推断

在本文中&#xff0c;我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能。 从Java的第一个版本开始&#xff0c;它是一种强类型语言&#xff0c;在这里我们需要提及每种变量数据类型。 我们所有人都感到Java是冗长的语言&#xff0c;并期望精…

简易计算器微信小程序项目源码

微信公众号&#xff1a;创享日记 发送&#xff1a;计算器 获取完整源码&#xff08;微信开发者工具导入即可用&#xff09; 以下可以忽略不看&#xff01; 微信小程序&#xff0c;小程序的一种&#xff0c;英文名Wechat Mini Program&#xff0c;是一种不需要下载安装即可使用…

MongoDB初学者教程

1. MongoDB简介 在本文中&#xff0c;我们提供了全面的MongoDB教程&#xff0c;该教程与基于Java的应用程序集成。 每当我们读到NoSQL数据库时&#xff0c;我们都需要知道为什么在SQL数据库运行良好时会开发它们。 NoSQL的基础是通过宽松的ACID &#xff08;原子性&#xff0c;…

手势密码解锁微信小程序项目源码

微信公众号&#xff1a;创享日记 发送&#xff1a;手势密码 获取完整源码&#xff08;导入微信开发者工具即可用&#xff09; 以下可以忽略不看&#xff01; 手势密码就是在手机触屏上设置一笔连成的九宫格图案&#xff0c;登录时画一下设定的图形。 运行程序&#xff0c;发…

带你一步一步实战分析缓冲区溢出漏洞攻击

关注公众号有惊喜【部分付费文章免费阅读&#xff0c;持续更新中…】 点击公众号底部【逆向杂记】可见 文件1 (A)描述此二进制文件提供的服务&#xff0c;不需要运行二进制文件来找出这一点。 (B)有可能对此二进制文件进行缓冲区溢出攻击&#xff0c;它在哪里&#xff1f;哪些…

memento模式_Java中的Memento设计模式-示例教程

memento模式记忆模式是行为设计模式之一 。 当我们要保存对象的状态以便以后可以恢复时&#xff0c;可以使用Memento设计模式。 使用Memento模式以这种方式实现该目的&#xff0c;即无法在对象外部访问对象的已保存状态数据&#xff0c;这可以保护已保存状态数据的完整性。 Me…

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界&#xff08;泛型的协变&#xff09; 4.通配符下界&#xff08;泛型的逆变&#xff09; 5.泛型的编译&#xff08;擦除机制&#xff09; 泛型 泛型&#xff1a;就是让一个类能适用于多个类型&#xff0c;就是在封装数据结…