网站管理员招聘济南 规划 网站

web/2025/9/30 12:52:03/文章来源:
网站管理员招聘,济南 规划 网站,建网站怎么赚流量,乐陵森林大队长李兵java bean 验证这篇文章总结了一些简单#xff0c;快速的示例#xff0c;这些示例说明了您想使用Java Beans Validation API#xff08;JSR 349#xff0c;JSR 303#xff09;进行的最常见操作。 记住#xff0c;Beans Validation独立于Java EE。 尽管它是作为Java EE兼容… java bean 验证 这篇文章总结了一些简单快速的示例这些示例说明了您想使用Java Beans Validation APIJSR 349JSR 303进行的最常见操作。 记住Beans Validation独立于Java EE。 尽管它是作为Java EE兼容服务器的一部分内置的但该API也可以在Java SE应用程序中轻松使用。 所有这些示例都使用Java SE。 要求 我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情但不能保证。 Java 1.8.0_65_x64 NetBeans 8.2 Maven 3.0.5与NetBeans捆绑在一起 dependencygroupIdjavax.validation/groupIdartifactIdvalidation-api/artifactIdversion1.1.0.Final/version /dependency dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion5.1.2.Final/version /dependency dependencygroupIdjavax.el/groupIdartifactIdjavax.el-api/artifactIdversion2.2.4/version /dependency dependencygroupIdorg.glassfish.web/groupIdartifactIdjavax.el/artifactIdversion2.2.4/version /dependency dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope /dependency下载 访问我的GitHub页面https://github.com/mjremijan以查看我所有的开源项目。 这篇文章的代码位于 https : //github.com/mjremijan/thoth-beanvalidation 基本 此示例显示了使用内置的标准约束和内置的标准验证器进行Bean验证的基础。 清单1.1 –验证的Bean package org.thoth.beanvalidation.basics;import javax.validation.constraints.NotNull;public class Widget {NotNullprotected String name;public String getName() {return name;}public void setName(String name) {this.name name;} } 清单1.2 –如何验证 package org.thoth.beanvalidation.basics;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.junit.Assert; import org.junit.Before; import org.junit.Test;public class WidgetTest {protected Validator validator;Beforepublic void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void violations_size() {// setupWidget w new Widget();// actionSetConstraintViolationWidget violations validator.validate(w);// assertAssert.assertEquals(1, violations.size());}Testpublic void violation_message() {// setupWidget w new Widget();// actionSetConstraintViolationWidget violations validator.validate(w);// assertConstraintViolationWidget v violations.stream().findFirst().get();Assert.assertEquals(may not be null, v.getMessage());}Testpublic void violation_messageTemplate() {// setupWidget w new Widget();// actionSetConstraintViolationWidget violations validator.validate(w);// assertConstraintViolationWidget v violations.stream().findFirst().get();Assert.assertEquals({javax.validation.constraints.NotNull.message}, v.getMessageTemplate());}Testpublic void violation_propertyPath() {// setupWidget w new Widget();// actionSetConstraintViolationWidget violations validator.validate(w);// assertConstraintViolationWidget v violations.stream().findFirst().get();Assert.assertEquals(name, v.getPropertyPath().toString());} }自定义消息模板 本示例说明如何使用自定义错误消息而不是使用内置标准错误消息来定制内置标准约束。 清单2.1 – ValidationMessages.properties Candy.name.NotNullA candy name is required. 清单2.2 –验证的Bean package org.thoth.beanvalidation.custommessage;import javax.validation.constraints.NotNull;public class Candy {NotNull(message {Candy.name.NotNull})protected String name;public String getName() {return name;}public void setName(String name) {this.name name;} } 清单2.3 –如何验证 package org.thoth.beanvalidation.custommessage;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test;public class CandyTest {protected static Validator validator;BeforeClasspublic static void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void notnull_violation_message() {// setupCandy candy new Candy();// actionSetConstraintViolationCandy violations validator.validate(candy);// assertConstraintViolationCandy v violations.stream().findFirst().get();Assert.assertEquals(A candy name is required., v.getMessage());}Testpublic void notnull_violation_messageTemplate() {// setupCandy candy new Candy();// actionSetConstraintViolationCandy violations validator.validate(candy);// assertConstraintViolationCandy v violations.stream().findFirst().get();Assert.assertEquals({Candy.name.NotNull}, v.getMessageTemplate());} }具有可变替换的自定义消息模板 此示例说明了如何使用自定义错误消息配置内置的标准约束该错误消息中的变量值在运行时由Bean验证替换。 可以替换的变量的示例包括已验证的实际值以及Size约束的min和max属性。 清单3.1 – ValidationMessages.properties Candy.name.Size.messageThe candy name ${validatedValue} is invalid. It must be between {min} and {max} characters long 清单3.2 –验证的Bean package org.thoth.beanvalidation.variablereplacement;import javax.validation.constraints.Size;public class Candy {private String name;Size(message {Candy.name.Size.message}, min5, max10)public String getName() {return name;}public void setName(String name) {this.name name;} } 清单3.3 –如何验证 package org.thoth.beanvalidation.variablereplacement;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.thoth.beanvalidation.variablereplacement.Candy;public class CandyTest {protected static Validator validator;BeforeClasspublic static void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void does_the_constraint_have_the_correct_messageTemplate() {// setupCandy candy new Candy();candy.setName();// actionSetConstraintViolationCandy violations validator.validate(candy);// assertConstraintViolationCandy v violations.stream().findFirst().get();Assert.assertEquals({Candy.name.Size.message}, v.getMessageTemplate());}Testpublic void is_the_message_correct_if_size_is_too_small() {// setupCandy candy new Candy();candy.setName(foo);// actionSetConstraintViolationCandy violations validator.validate(candy);// assertConstraintViolationCandy v violations.stream().findFirst().get();Assert.assertEquals(The candy name \foo\ is invalid. It must be between 5 and 10 characters long, v.getMessage());}Testpublic void is_the_message_correct_if_size_is_too_big() {// setupCandy candy new Candy();candy.setName(123456789|1);// actionSetConstraintViolationCandy violations validator.validate(candy);// assertConstraintViolationCandy v violations.stream().findFirst().get();Assert.assertEquals(The candy name \123456789|1\ is invalid. It must be between 5 and 10 characters long, v.getMessage());} }自定义属性验证器 本示例说明如何为类的属性创建您自己的约束和您自己的验证器。 清单4.1 – ValidationMessages.properties org.thoth.beanvalidation.propertyvalidator.Excludes.messageThe value ${validatedValue} is one of {value} which is forbidden. 清单4.2 –约束注释 package org.thoth.beanvalidation.propertyvalidator;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint;Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Constraint(validatedBy {ExcludesValidator.class}) Documented public interface Excludes {String message() default {org.thoth.beanvalidation.propertyvalidator.Excludes.message};Class[] groups() default {};Class[] payload() default {};String[] value() default {}; } 清单4.3 –约束验证器 package org.thoth.beanvalidation.propertyvalidator;import java.util.Arrays; import java.util.List; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;public class ExcludesValidatorimplements ConstraintValidator Excludes, String {private ListString excludeTheseValues;Overridepublic void initialize(Excludes arg) {String[] strarr arg.value();if (strarr null) {strarr new String[]{};}excludeTheseValues Arrays.asList(strarr);}Overridepublic boolean isValid(String value, ConstraintValidatorContext cvc) {if (excludeTheseValues.contains(value)) {return false;} else {return true;}} } 清单4.4 –验证的Bean package org.thoth.beanvalidation.propertyvalidator;public class Candy {private String name;public Candy(String name) {this.name name;}Excludes({foo, bar, shrubbery})public String getName() {return name;} } 清单4.5 –如何验证 package org.thoth.beanvalidation.propertyvalidator;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import static org.junit.Assert.assertEquals; import org.junit.BeforeClass; import org.junit.Test;public class CandyTest {protected static Validator validator;BeforeClasspublic static void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void a_non_excludeded_name_should_not_give_you_a_constraint_violation() {// setupCandy candy new Candy(hershey);// actionSetConstraintViolationCandy violations validator.validate(candy);// assertassertEquals(0, violations.size());}Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_foo() {// setupCandy candy new Candy(foo);// actionConstraintViolationCandy violation validator.validate(candy).iterator().next();// assertassertEquals({org.thoth.beanvalidation.propertyvalidator.Excludes.message}, violation.getMessageTemplate());assertEquals(The value \foo\ is one of [foo, bar, shrubbery] which is forbidden., violation.getMessage());}Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_bar() {// setupCandy candy new Candy(bar);// actionConstraintViolationCandy violation validator.validate(candy).iterator().next();// assertassertEquals({org.thoth.beanvalidation.propertyvalidator.Excludes.message}, violation.getMessageTemplate());assertEquals(The value \bar\ is one of [foo, bar, shrubbery] which is forbidden., violation.getMessage());}Testpublic void do_you_get_a_constraint_violation_if_you_use_excluded_name_shrubbery() {// setupCandy candy new Candy(shrubbery);// actionConstraintViolationCandy violation validator.validate(candy).iterator().next();// assertassertEquals({org.thoth.beanvalidation.propertyvalidator.Excludes.message}, violation.getMessageTemplate());assertEquals(The value \shrubbery\ is one of [foo, bar, shrubbery] which is forbidden., violation.getMessage());} }自定义类验证器 此示例说明如何创建适用于整个类的约束和验证器。 清单5.1 – ValidationMessages.properties org.thoth.beanvalidation.classvalidator.IdentificationExists.messageAt least one of social security number, drivers license number, or passport number must exist. 清单5.2 –约束注释 package org.thoth.beanvalidation.classvalidator;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload;Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Constraint(validatedBy {IdentificationExistsValidator.class}) Documented public interface IdentificationExists {String message() default {org.thoth.beanvalidation.classvalidator.IdentificationExists.message};Class?[] groups() default {};Class? extends Payload[] payload() default {}; } 清单5.3 –约束验证器 package org.thoth.beanvalidation.classvalidator;import java.util.Objects; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;public class IdentificationExistsValidator implements ConstraintValidatorIdentificationExists, Identification {Overridepublic void initialize(IdentificationExists a) {}Overridepublic boolean isValid(Identification t, ConstraintValidatorContext cvc) {boolean invalid Objects.equals(t.getDriversLicenseNumber(), null)Objects.equals(t.getPassportNumber(), null)Objects.equals(t.getSocialSecurityNumber(), null);return !invalid;} } 清单5.4 –验证的Bean package org.thoth.beanvalidation.classvalidator;IdentificationExists public class Identification {protected String socialSecurityNumber;protected String driversLicenseNumber;protected String passportNumber;public String getSocialSecurityNumber() {return socialSecurityNumber;}public void setSocialSecurityNumber(String socialSecurityNumber) {this.socialSecurityNumber socialSecurityNumber;}public String getDriversLicenseNumber() {return driversLicenseNumber;}public void setDriversLicenseNumber(String driversLicenseNumber) {this.driversLicenseNumber driversLicenseNumber;}public String getPassportNumber() {return passportNumber;}public void setPassportNumber(String passportNumber) {this.passportNumber passportNumber;} } 清单5.5 –如何验证 package org.thoth.beanvalidation.classvalidator;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.junit.Assert; import org.junit.Before; import org.junit.Test;public class IdentificationTest {protected Validator validator;Beforepublic void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void violation_if_all_are_missing() {// setupIdentification id new Identification();// actionSetConstraintViolationIdentification violations validator.validate(id);// assertConstraintViolationIdentification v violations.stream().findFirst().get();Assert.assertEquals(At least one of social security number, drivers license number, or passport number must exist., v.getMessage());}Testpublic void no_violation_if_social_security_number_exists() {// setupIdentification id new Identification();id.setSocialSecurityNumber(a);// actionSetConstraintViolationIdentification violations validator.validate(id);// assertAssert.assertEquals(0, violations.size());}Testpublic void no_violation_if_drivers_license_number_exists() {// setupIdentification id new Identification();id.setDriversLicenseNumber(a);// actionSetConstraintViolationIdentification violations validator.validate(id);// assertAssert.assertEquals(0, violations.size());}Testpublic void no_violation_if_passport_number_exists() {// setupIdentification id new Identification();id.setPassportNumber(a);// actionSetConstraintViolationIdentification violations validator.validate(id);// assertAssert.assertEquals(0, violations.size());} }组序列短路 此示例显示了在进行验证时如何使用GroupSequence作为短路。 这意味着如果第一轮验证未通过则验证“短路”并且不会执行第二轮验证。 默认情况下所有bean验证约束都放入“默认”组序列中。 但是通过将GroupSequence放在类上如下所示仅针对该类重新定义“默认”组序列。 使用下面的类上的GroupSequence 其基本作用是在bean验证期间第一个操作是验证该类中未专门分配组的所有约束。 首先是NotNull约束。 如果所有这些都OK那么第二个操作是验证Second.class组中的所有约束。 那就是Size约束。 如果所有这些都OK那么第三Third.class操作将验证Third.class组中的所有约束。 那就是Pattern约束。 如果某个小组在任何时候都无法通过验证则验证将“短路”并且验证不再进行。 清单6.1 –验证的Bean package org.thoth.beanvalidation.groupsequence;import javax.validation.GroupSequence; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size;GroupSequence({Candy.class, Candy.Second.class, Candy.Third.class}) public class Candy {protected interface Second {}protected interface Third {}private String name;NotNull()Size(min4, max10, groups Second.class )Pattern(regexp [a-z], groups Third.class)public String getName() {return name;}public void setName(String name) {this.name name;} } 清单6.2 –如何验证 package org.thoth.beanvalidation.groupsequence;import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test;public class CandyTest {private Validator validator;Beforepublic void before() {validator Validation.buildDefaultValidatorFactory().getValidator();}Testpublic void short_circuits_first_if_null() {// setupCandy w new Candy();// actionSetConstraintViolationCandy violations// validator.validate(w, CheckGroupSequence.class); validator.validate(w);// assertassertEquals(1, violations.size());assertEquals(may not be null, violations.iterator().next().getMessage());}Testpublic void short_circut_if_size_is_in_violation() {// setupCandy w new Candy();w.setName(foo);// actionSetConstraintViolationCandy violations validator.validate(w);// assertassertEquals(1, violations.size());assertEquals(size must be between 4 and 10, violations.iterator().next().getMessage());}Testpublic void short_circuit_if_pattern_is_in_violation() {// setupCandy w new Candy();w.setName(SHRUBBERY);// actionSetConstraintViolationCandy violations validator.validate(w);// assertassertEquals(1, violations.size());assertEquals(must match \[a-z]\, violations.iterator().next().getMessage());} }摘要 Bean验证是一种功能强大的API尤其是因为它可以在Java EE服务器或独立的Java SE应用程序中使用。 这只是Bean验证API基础知识的简短摘要但是通常它足以涵盖开发人员有关如何使用它的大多数问题。 翻译自: https://www.javacodegeeks.com/2017/07/java-bean-validation-basics.htmljava bean 验证

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

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

相关文章

什么软件可以做动画视频网站穆棱建设局网站

一.说明SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目…

怎么把网站上传到域名柳州网站虚拟主机公司

引言 在当今数字化时代,编程已经成为一种极具创造力和趣味性的活动。通过编写代码,我们可以创造出各种各样的应用程序和游戏,其中包括经典的贪吃蛇游戏。本文将向您介绍如何使用 JavaScript 编程语言制作一个简单而有趣的贪吃蛇游戏&#xf…

网站集约化建设汇报目前什么编码做网站最好

网课地址:网络模型_二层转发原理(三)_哔哩哔哩_bilibili 一、路由交换 网络:用来信息通信,信息共享的平台。 网络节点(交换机,路由器,防火墙,AP)介质&#…

网站跟客户端推广怎么做江苏招标网

如何启动/停止/重启MySQL一、 启动方式1、使用 service 启动:service mysql start2、使用 mysqld 脚本启动:/etc/inint.d/mysql start3、使用 safe_mysqld 启动:safe_mysql&二、停止1、使用 service 启动:service mysql stop2…

台州网站建设方案抖音开放平台工会

网页图片显示不出来怎么办?文字与图片是构成一个网页的两个最基本的元素。你可以简单地理解为:文字,就是网页的内容。图片,就是网页的美观。除此之外,网页的元素还包括动画、音乐、程序等等。有时候我们浏览网页却发现图片显示不…

昆明大型网站建设费用苏州网站排名优化价格

在文件系统中,有三大缓冲为了提升效率:inode缓冲区、dentry缓冲区、块缓冲。(内核:2.4.37)一、inode缓冲区为了加快对索引节点的索引,引入inode缓冲区,下面我们看Linux/fs/inode.c代码。inode缓冲区代码1、一些数据结构…

网站在公司做有什么要求吗公众号免费素材网站

用来练手的python练习题,原题链接: python练习实例25 题干 : 求12!3!…20!的和。 题干要求我们实现一个阶乘的求和,显而易见的,我们可以使用递归来实现阶乘,再使用循环语句对这些阶乘就行求和。源代码如下: # 求阶乘 def facto…

贵州省建设厅官网站首页个人网页设计理念

引言 云原生技术作为软件开发和部署的新范式,以其高度可伸缩性、灵活性和可靠性,吸引了广泛的关注。本文将深入探讨云原生技术的核心概念、优势以及其在现代软件开发中的应用。 1. 什么是云原生技术? 云原生技术是一种以云计算为基础&#…

订货网站怎么做怎么搜索整个网站内容

注册阿里云,免费领云服务器,每月280元额度,3个月试用时长,可快速搭建网站/小程序,部署开发环境,开发多种企业应用,共3步骤即可免费领取阿里云服务器,阿里云服务器网aliyunfuwuqi.com…

重庆交通建设监理协会网站做网站的上海公司

蕾师师 发自 凹非寺量子位 报道 | 公众号 QbitAI只需要输入一段语音,代码会自动生成与之相对的动画唇形。还是毫无违和感的那种。这是一个在GitHub上拥有501星的开源项目,叫做Rhubarb Lip Sync。它既可以是Windows和OS X命令行工具,也可以作为…

华为企业网站建设分析中国网络营销网站

五种方法的介绍 以下是五种在React项目中配置代理服务器的方法的使用场景和优缺点: 1. 使用 http-proxy-middleware 中间件: 使用场景:适用于大多数React项目,简单易用。优点:配置简单,易于理解和维护。…

网站推广的方案设计怎么写晋江小学网站建设

Matlab基本初等函数大全 方便查阅,适合基础学习者使用。 链接中是完整版 完整版初等函数大全 1、特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN 非数 nargin 输入参数个数 narg…

第3章营销型企业网站建设体育直播网站开发数据源获取

1、活动介绍 本活动主要是面向想要全面了解亚马逊云科技 (Amazon Web Services) 云的个人,而不受特定技术角色的限制。内容包括亚马逊云科技云概念、亚马逊云科技服务、安全性、架构、定价和支持等等,此外还可以参加亚马逊的认证考试。 2、学习过程 该…

网站维护 静态页面quercus wordpress

1.首先明确一下业务规则: 业务规则: 再来一单就是将原订单中的商品重新加入到购物车中 2.产品页面原型和开发接口文档 3.业务层逻辑代码开发 3.1 查询方向 我们要明确的是: 再来一单就是将原订单中的商品重新加入到购物车中------直接把商品加入到购物车&#…

kuake自助建站系统源码张家港网站优化

来源:中建科工 华中大区。2020年12月8日全国公建领域最大跨度的张弦桁架钢结构工程合肥滨湖国际会展中心二期首榀桁架滑移顺利完成合肥滨湖国际会展中心二期项目位于合肥市滨湖新区锦绣大道与广西路交口,该项目2#综合馆建筑面积约4.8万平方米&#xff0c…

北大荒建设集团有限公司网站中原彼得堡航空学院网站的建设

NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库。如此多的http库,该怎样选择呢?01HttpWebRequest这是.NET创建者最初开发用于使用HTTP请求的标准类。…

做项目的编程网站wordpress的编辑器插件

第 1 章 Flume 概述 1.1 Flume 定义 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的 海量日志采集、聚合和传 输的系统 。 Flume 基于流式架构,灵活简单。 为什么选用 Flume Python 爬虫数据 Java 后台日志数据 服…

如何修改网站后台东莞市建设局网站6

PCL-PEG-DCL (ACUPA) 聚己内酯聚乙二醇PSMA 抑制剂 【中文名称】 聚己内酯聚乙二醇PSMA抑制剂DCL 【英文名称】 PCL-PEG-DCL (ACUPA) 【品 牌】 碳水科技(Tanshtech) 【纯 度】 95%以上 【保 存】 -20 【规 格】 50mg,100mg,500mg,…

怎么给自己制作一个网站百度seo优化规则

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删开发环境如前面介绍的那样,C属于一种静态的编译型语言,所以,开发环境配置过程中就需要用到对应的编译器。C有…

网站推广的目标备案域名被拿去做违法

题目 输入4个整数 要求按照从小到大的顺序输出 书上的学习辅导答案 // 主要部分 int main(){int t,a,b,c,d;printf("请输入四个数:");scanf("%d,%d,%d,%d"