java与java ee_Java EE MVC:处理表单验证

java与java ee

在本文中,我们将介绍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

java与java ee

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

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

相关文章

linux-macbook内核,技术|用 Linux 让旧 MacBook 重获新生

花上一小时&#xff0c;用 Fedora 让一台过时的 Mac 重新有用。最近&#xff0c;我偶然找到了一台 2011 年底的老款 13 英寸 MacBook Pro&#xff0c;有 125GB SSD 和 8GB 内存。我曾带着这台机器去世界各地旅行&#xff0c;当年&#xff0c;我开了很多场会议、研讨会或演示&am…

Windows 如何在命令终端(CMD)使用命令来访问本地/远程的 Oracle 数据库呢?

打开命令窗口后直接输入 sqlplus sys/123orcl as sysdba其中 sys 是用户名&#xff0c;123 是密码&#xff0c;orcl 是数据库实例名&#xff0c;as sysdba 表示用户 sys 是数据库管理员。 没有指定数据库实例名&#xff0c;那么访问默认的数据库实例&#xff0c;如果用户 sys…

linux消耗ram内存吗,linux - 释放Ubuntu 8.04服务器上的内存(RAM) - Ubuntu问答

问题描述我在带有某些轻量级服务器应用程序的Slicehost虚拟服务器上运行了Ubuntu 8.04-apache22&#xff0c;svnserve&#xff0c;mysql和proftpd。唯一严重的服务限制是RAM-我要支付256MB。我注意到&#xff0c;如果让系统运行几天/几周&#xff0c;则可用RAM的数量会缓慢下降…

java 读取集合到流中_Java 10:将流收集到不可修改的集合中

java 读取集合到流中Java 10引入了几种新方法来促进不可修改集合的创建。 List.copyOf &#xff0c; Set.copyOf和Map.copyOf方法从现有实例创建新的集合实例。 例如&#xff1a; List<String> modifiable Arrays.asList("foo", "bar"); List<…

Servlet 组件相关的接口、抽象类关系图

注&#xff1a; ServletConfig 依赖于 Servlet HttpServletResponse 继承自 ServletResponse HttpServlet 实现自 HttpServletResponse 和 HttpServletRequest

java6 已安装更高版本_Java 10及更高版本的思考

java6 已安装更高版本大家好 Java 10于2018年3月20日发布。我认为许多软件团队将阻止升级。 从Java 8到Java 9的专业人员人数可能还更少。为什么会这样&#xff0c;原因是传统的障碍以及对应用程序服务器&#xff0c;框架甚至是云原生容器的依赖。 例如&#xff0c;如果您在等待…

linux 命令api,linux命令行下字典,使用有道API

Linux命令行下的字典&#xff0c;使用“exit”退出。大家简单申请一个key就可以用了。这里申请#!/usr/bin/python3.2import urllib.requestimport jsondef wordMeaning(word):"""Use YouDao API key and the url below, get the JSON formatted information,the…

Java对象转换成JSON对象/JSON对象转换成JSON字符串/JSON字符串转换成JS对象

文章目录后端部分前端部分后端部分 Option op new Option("海淀","hd");//java对象转换json对象 JSONObject obj JSONObject.fromObject(op); //json对象转换成json字符串 String str obj.toString();List<Option> ops new ArrayList<Option…

kafka 消费端 api_在消费者的眼中:您真的需要为您的API提供客户端库吗?

kafka 消费端 apiRESTful Web服务和API的优点在于&#xff0c;任何使用HTTP协议的使用者都可以理解和使用它。 但是&#xff0c;同样的难题一遍又一遍地弹出&#xff1a;您是否应该将Web APis与客户端库一起使用&#xff1f; 如果是&#xff0c;您应该支持哪些语言或/和框架&am…

linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS

转自&#xff1a;http://www.douban.com/note/161471809/RSS is the total memory actually held in RAM for a process.RSS can be misleading, because it reports the total all of the shared libraries that the process uses, eventhough a shared library is only loade…

如何将类加载到内存

// 将类Driver加载到内存&#xff0c;在内存会产生一个和类Driver对应的Class实例 Class class Class.forName("com.mysql.jdbc.Driver");// 获取类加载器&#xff0c;任何类都有个class属性&#xff0c;这个属性返回类在内存中对应的那个Class实例&#xff0c;通过…

idea资源包下创建资源包_根据谁创建资源授权资源

idea资源包下创建资源包我的一位同事向我提出了一个关于StackOverflow的有趣问题&#xff0c;并由于我在Spring方面的经验&#xff0c;建议我回答一个很好的问题。 问题是&#xff0c;“ 如何基于使用批注在REST中创建资源的用户来授权特定资源 。” 要点是&#xff1a; 我正…

如何卸载linux中的docker,linux centos7 安装、卸载docker

docker安装1&#xff1a;查看系统版本cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)2:安装docker(yum方式)$ yum install docker3&#xff1a;查看是否安装成功$docker version若输出以下&#xff0c;说明安装成功Client:Version: 1.12.6API version: …

html页面中Location对象跳转页面用法

姓名&#xff1a;<input name"name"/></br> 薪水&#xff1a;<input name"salary"/></br> 年龄&#xff1a;<input name"age"/></br> <input type"submit" value"确认"/></br…

java orm框架有哪些_Java Stream ORM现在带有JOIN

java orm框架有哪些Speedment是一个Java Stream ORM工具包和运行时&#xff0c;它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL&#xff0c;因此该应用程序变得更加紧凑&#xff0c;从而使其开发速度更快&#xff0c;更不容易出错并且易于维护。 流…

linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)

第一次接触到12C CDB和PDB数据库&#xff0c;且客户提供的是ORACLE一体机&#xff0c;只有访问权&#xff0c;费劲周折&#xff0c;今记录12C创建默认路径表空间语句和用户--创建默认表空间&#xff1a;create tablespace tablesapce_name datafile size 500M autoextend on …

用户在页面输入的中文数据,servlet如何获得正确的中文值

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 告诉浏览器&#xff0c;返回的是html页面&#xff0c;而且是以utf-8编码的response.setContentType("text/html;charsetutf-8");//reques…

java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...

java编写排序的代码在Java 8之前&#xff0c;您编写了几行代码来对对象集合进行排序&#xff1f; Java 8您需要多少个&#xff1f; 您可以在Java 8中用一行完成。 让我们看看下面的Employee类。 public class Employee {private String name;private Integer age;public Emp…

java全局变量和局部变量_Java 10 –局部变量类型推断

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

JS_Java_Oracle_MySQL截取字符串的函数

JS 截取字符串 函数 substring(indexStart, indexEnd)&#xff1a; function f1() {var s abcd;// 字符串的字符下标从0开始&#xff0c;从下标为2的字符c开始截取&#xff0c;截取到下标为3的字符d为止&#xff0c;含头不含尾&#xff0c;所以字符d没有被截取&#xff0c;最…