首页 文章 精选 留言 我的

精选列表

搜索[JDK 25],共10010篇文章
优秀的个人博客,低调大师

Flink Weekly 每周动态更新-2020/03/25

大家好,本文为 Flink Weekly 的第十期,由张成(Ace)整理,主要内容包括:近期社区开发进展,邮件问题答疑以及 Flink 最新社区动态及技术文章推荐。 社区开发进展 ■ [release] 关于发布 Flink 1.10.1 的讨论正在火热进行,最新消息请参考 Yu Li 发起的讨论。[1]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Releasing-Flink-1-10-1-td38689.html ■ [Checkpoint] Arvid Heise 发起 FLIP-76 的投票已经通过。FLIP-76 提出了一种基于检查点屏障的非阻塞对齐执行检查点的方法。相关好处有: 即使某些 Operator 仍在等待正在输入通道上的检查点屏障,上游仍可以继续产生数据。 即使对于具有单个输入通道的 Operator,在整个执行图中的检查点次数也大大减少。 即使在不稳定的环境中,最终用户也将看到更多的进展,因为更及时的检查点将避免过多的重复计算。 促进更快地 rescaling。 更多信息参考:[2]https://cwiki.apache.org/confluence/display/FLINK/FLIP-76%3A+Unaligned+Checkpoints[3]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-FLIP-76-Unaligned-checkpoints-td33651.html ■ [Connectors/Filesystem] 删除 BucketingSink。BucketingSink 已经在 Flink 1.9 版本标记为过期。Flink 有一个新的 StreamingFileSink 替代 BucketingSink。目前 StreamingFileSink 的 scala 版本存在 bug。 [4]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/jira-Created-FLINK-16616-Drop-BucketingSink-td38950.html[5]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Drop-Bucketing-Sink-td38830.html#a38831[6]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/jira-Created-FLINK-16684-StreamingFileSink-builder-does-not-work-with-Scala-td39109.html ■ [Table API & SQL] Jingsong Li 发起了引入 StatefulSequenceSource 的讨论。这个能够方便用户更好的进行测试 SQL。最终讨论决定在 Table 支持 DataGenerator 的 source、Print 的 sink 和blackhole 的 sink。 [7]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Introduce-TableFactory-for-StatefulSequenceSource-td39116.html ■ [sql] Timo 分享了一个关于新的 TableSource 和 TableSink 接口的提案(FLIP-95)。Jark、Dawid、Aljoscha、Kurt、Jingsong 等参考了讨论。其目标是简化当前的接口架构,以支持变更日志源(FLIP-105)和删除对 DataStream API 和 planner 的依赖。 [8]https://cwiki.apache.org/confluence/display/FLINK/FLIP-95%3A+New+TableSource+and+TableSink+interfaces ■ [hadoop]跟进 Stephan 和 Till 的讨论。Sivaprasanna 分享了 Hadoop 相关实用程序组件的概述,以开始讨论将其移动到单独的模块中 “flink-hadoop-utils”。 [9]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/SerializableHadoopConfiguration-td38371.html[10]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Introduce-a-new-module-flink-hadoop-utils-td39107.html 用户问题 ■ 叶贤勋在使用 Hive Source 的时候遇到了 Kerberos 认证的问题,社区同学进行了相关的讨论和建议,感兴趣的同学可以参考如下链接:[11]http://apache-flink.147419.n8.nabble.com/Hive-Source-With-Kerberos-td1688.html ■ hiliuxg 在社区提问 Flink SQL 如何支持每隔 5 分钟触发当日零点到当前 5 分钟的聚合计算。Jark Wu 和 Tianwang Li 进行了相关解答。[12]http://apache-flink.147419.n8.nabble.com/flink-sql-5-5-td2011.html ■ hiliuxg 在社区提问 Flink SQL COUNT DISTINCT 性能优化。Benchao Li、田志声、Lucas Wu、Lake Shen 展开了一些讨论,有兴趣的同学可以参考如下链接: [13]http://apache-flink.147419.n8.nabble.com/flink-sql-td2012.html ■ 王志华 在社区提问 Flink DDL 如何支持自定义 Source/Sink 表。社区同学在邮件中进行了详细的回答。[14]http://apache-flink.147419.n8.nabble.com/ddl-td1959.html ■ 111 在社区提问 Flink SQL1.10 大表 join 如何优化?Jark Wu、Kurt Young 和 Jingsong Lee 进行了详细的解答。目前 Flink SQL 的并行度(非 Source )并不是自动推断出来的,需要通过设置table.exec.resource.default-parallelism,详细的内容参考: [15]http://apache-flink.147419.n8.nabble.com/Flink-SQL1-10-join-td2044.html[16]http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Flink-SQL-How-can-i-set-parallelism-in-clause-of-group-by-td33736.html ■ Aaron Levin 在社区提问 如何能够做到修改任务的并发,然后从 checkpoint 启动任务。Piotr Nowojski、Till Rohrmann 参与了相关讨论。内容涉及到 unaligned checkpoints (FLIP-76) 对savepoint 和 checkpoint 的影响。同时 Lake Shen 也提出了类似的问题。有兴趣的同学可以参考: [17]http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Expected-behaviour-when-changing-operator-parallelism-but-starting-from-an-incremental-checkpoint-td33608.html[18]http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Cancel-the-flink-task-and-restore-from-checkpoint-can-I-change-the-flink-operator-s-parallelism-td33613.html ■ Jiawei Wu 在社区提问“如何使用 Flink SQL 计算 按照供应商分组同时入库时间大于 15 天的库存数据?”,有兴趣的同学可以参考:[19]http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Use-flink-to-calculate-sum-of-the-inventory-under-certain-conditions-td33323.html ■ Vinod Mehra 在社区提出了一个关于 Join 相关的问题。这个问题比较复杂,Timo Walther 进行了相关解答。里面涉及到了一些如何进行 Flink SQL 问题的排查。有兴趣的同学可以参考: [20]http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/time-windowed-joins-and-tumbling-windows-td33551.html 活动博客文章及其他 ■ SQL 开发任务超 50% !滴滴实时计算的演进与优化 [21]https://ververica.cn/corporate_practice/evolution-and-optimization-of-didi-real-time-computing/ ■ Flink 生态:一个案例快速上手 PyFlink[22]https://ververica.cn/developers/pyflink-a-case-in-hand/ ■ 一套 SQL 搞定数据仓库?Flink有了新尝试[23]https://ververica.cn/developers/a-set-of-sql-to-handle-data-warehouse/ ■ 如何在 Flink 中规划 RocksDB 内存容量?[24]https://ververica.cn/developers/how-to-plan-the-memory-capacity-of-rocksdb-in-flink/ 2 分钟快速订阅 Flink 中文邮件列表 Apache Flink 中文邮件列表订阅流程: 发送任意邮件到 user-zh-subscribe@flink.apache.org 收到官方确认邮件 回复该邮件 confirm 即可订阅 订阅成功后将收到 Flink 官方的中文邮件列表的消息,您可以向 user-zh@flink.apache.org 发邮件提问也可以帮助别人解答问题,动动手测试一下! Flink Weekly 作者征集 Flink Weekly 是由社区同学发起的并持续更新的 Flink 社区每周动态汇总,内容涵盖邮件列表中用户问题的解答、社区开发和提议的进展、社区新闻以及其他活动、博客文章等,发布于 Apache Flink 中文邮件列表、Flink 中文社区官方微信公众号及各大社区专栏。 如果你也想积极参与社区,掌握社区最新动态 获得 Apache Flink PMC 及 Committer 对技术文章写作的指导 与社区深度参与者们交流 拥有更多曝光的平台与机会 欢迎报名 Flink Weekly 作者!众所周知,Flink 学的好,女朋友容易找,Flink 学成,头发茂!点击“阅读原文”填写信息即可加入小松鼠大家庭~ 作者介绍: 张成,小红书技术部基础平台开发工程师,目前主要在做基于 Flink 的实时计算平台开发。

优秀的个人博客,低调大师

弹性计算双周刊 第 25

【重点关注】阿里云GPU云服务器现已支持NVIDIA RAPIDS加速库,是国内第一家提供RAPIDS加速库服务的公有云厂商RAPIDS,全称Real-time Acceleration Platform for Integrated Data Science,是NVIDIA针对数据科学和机器学习推出的一套开源GPU加速库,基于CUDA-X AI打造,可加速数据准备、模型训练和图分析。使用RAPIDS加速库可以实现从数据准备、模型训练到预测整个端到端流程得到GPU的加速支持,大大提升任务的执行效率,在模型精度方面实现突破的同时降低基础架构TCO。 专有宿主机DDH提供“自动部署”能力,实现云上独占资源池,提升集群部署效率在专有宿主机上创建ECS实例时,用户获得了指定宿主机创建实例的自由。当具有多台宿主机的时候,通过宿主机“允许自动部

优秀的个人博客,低调大师

JavaScript—浏览器的渲染机制(25

说明: 本文提到的浏览器均是指Chrome。 “script标签“指的都是普通的不带其他属性的外联javascript。 web性能优化的手段并不是非黑即白的,有些手段过头了反而降低性能,所以在讨论条件和结论的时候,虽然很多条件本身会带来其他细微的负面或正面影响,为了不使论述失去重点,不会扩展太开。 一、从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题。比如:为什么大家普遍把 <script src=""></script> 这样的代码放在body最底部?(为了沟通效率,我会提前和对方约定所有的讨论都以chrome为例)应聘者一般会回答:因为浏览器生成Dom树的时候是一行一行读HTML代码的,script标签放在最后面就不会影响前面的页面的渲染。 我很鸡贼地接着问:既然Dom树完全生成好后页面才能渲染出来,浏览器又必须读完全部HTML才能生成完整的Dom树,script标签不放在body底部是不是也一样? 这其实是个开放性的问题,里面涉及的概念的界定本身就很重要。 “页面渲染出来了” 指的是什么?严格来说,我的最后一问是有歧义的:我们需要统一一下什么叫我们经常挂在嘴边的“页面渲染出来了” —— 指的是是 “首屏显示出来了” 还是 “页面完整地加载好了”(后面统称StepC) ? 如果指的是首屏显示出来了,那么问题又来了:假设网页首屏有图片,这里的“首屏” 指的是 “显示了全部图片的首屏”(后面统称StepB) 还是 “没有图片的首屏”(后面统称StepA)。 确定清楚 “页面渲染出来了” 指的是 StepA、StepB、StepC 中的哪一个是非常关键的(虽然至今还没有一个应聘者尝试这么做过),如果 “页面渲染出来了” 指的是 StepC,那么我的最后一问的答案是肯定的——script标签不放在body底部不会拖慢页面完整地加载好的时间。 显然,我们往往更关心首屏时间,所以,如果 “页面渲染出来了” 特指“没有图片的首屏”,那我的最后一问变成了下面这样,又该如何回答呢? 既然Dom树完全生成好后才能显示“没有图片的首屏”,浏览器又必须读完全部HTML才能生成完整的Dom树,script标签不放在body底部是不是也一样? 陷阱 然而上面的问题还是存在一个陷阱——既然Dom树完全生成好后才能显示“没有图片的首屏”这句话是带欺骗性的,“没有图片的首屏”并不以“完整的Dom树”为必要条件。也就是说:在生成Dom树的过程中只要某些条件具备了,“没有图片的首屏”就能显示出来。 所以,抛开这些歧义和陷阱,我的问题变成了: script标签的位置会影响首屏时间么? 然而答案并不是那么显而易见,这得从浏览器的渲染机制说起。(再一次说明:本文所说的浏览器都是指chrome) 二、浏览器的渲染机制Google Web Fundamentals 是一个非常优秀的文档,里面讲到了跟web、浏览器、前端的方方面面。我总结一下其中的 Ilya Grigorik 写的 Critical rendering path 浏览器渲染机制部分的内容如下: 几个概念1、DOM:Document Object Model,浏览器将HTML解析成树形的数据结构,简称DOM。 2、CSSOM:CSS Object Model,浏览器将CSS代码解析成树形的数据结构。 3、DOM 和 CSSOM 都是以 Bytes → characters → tokens → nodes → object model. 这样的方式生成最终的数据。如下图所示:DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。 4、Render Tree:DOM 和 CSSOM 合并后生成 Render Tree,如下图:Render Tree 和DOM一样,以多叉树的形式保存了每个节点的css属性、节点本身属性、以及节点的孩子节点。 注意:display:none 的节点不会被加入 Render Tree,而 visibility: hidden 则会,所以,如果某个节点最开始是不显示的,设为 display:none 是更优的。 浏览器的渲染过程 Create/Update DOM And request css/image/js:浏览器请求到HTML代码后,在生成DOM的最开始阶段(应该是 Bytes → characters 后),并行发起css、图片、js的请求,无论他们是否在HEAD里。 注意:发起 js 文件的下载 request 并不需要 DOM 处理到那个 script 节点,比如:简单的正则匹配就能做到这一点,虽然实际上并不一定是通过正则:)。这是很多人在理解渲染机制的时候存在的误区。 Create/Update Render CSSOM:CSS文件下载完成,开始构建CSSOM Create/Update Render Tree:所有CSS文件下载完成,CSSOM构建结束后,和 DOM 一起生成 Render Tree。 Layout:有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。下一步操作称之为Layout,顾名思义就是计算出每个节点在屏幕中的位置。 Painting:Layout后,浏览器已经知道了哪些节点要显示(which nodes are visible)、每个节点的CSS属性是什么(their computed styles)、每个节点在屏幕中的位置是哪里(geometry)。就进入了最后一步:Painting,按照算出来的规则,通过显卡,把内容画到屏幕上。 以上五个步骤前3个步骤之所有使用 “Create/Update” 是因为DOM、CSSOM、Render Tree都可能在第一次Painting后又被更新多次,比如JS修改了DOM或者CSS属性。 Layout 和 Painting 也会被重复执行,除了DOM、CSSOM更新的原因外,图片下载完成后也需要调用Layout 和 Painting来更新网页。 看 Timeline,一目了然我扒了一段有赞PC首页的代码到本地,通过Node跑起来。Node作为Server端,对/js/jquery.js 做了延时2s返回的处理,并且把 放到导航栏的下面,结果是这样的:从上面的Timeline我们可以看出: 首屏时间和DomContentLoad事件没有必然的先后关系 所有CSS尽早加载是减少首屏时间的最关键 js的下载和执行会阻塞Dom树的构建(严谨地说是中断了Dom树的更新),所以script标签放在首屏范围内的HTML代码段里会截断首屏的内容。 script标签放在body底部,做与不做async或者defer处理,都不会影响首屏时间,但影响DomContentLoad和load的时间,进而影响依赖他们的代码的执行的开始时间。 三、问题的答案 回到前面的问题: script标签的位置会影响首屏时间么? 答案是:不影响(如果这里里的首屏指的是页面从白板变成网页画面——也就是第一次Painting),但有可能截断首屏的内容,使其只显示上面一部分。 为什么说是“有可能”呢?,如果该js下载地比css还快,或者script标签不在第一屏的html里,实际上是不影响的。明白这一影响边界非常重要,这样我们在考察页面性能瓶颈的时候就有的放矢了。举个例子:在网页的第二屏有一个通用模块,实际上我们是可以把它的js逻辑独立成一个文件,将模块的html和js标签放在一起做成独立的模板引进来的(如果它的js比较小或者说因为多了一个文件会多占用一个TCP连接和带宽,这实际上是另外一个话题了,请参考我文章开头的声明)。 四、总结、再进一步 所以,总算弄清楚这个众所周知的常识了。我们来总结一下: 如果script标签的位置不在首屏范围内,不影响首屏时间 所有的script标签应该放在body底部是很有道理的 但从性能最优的角度考虑,即使在body底部的script标签也会拖慢首屏出来的速度,因为浏览器在最一开始就会请求它对应的js文件,而这,占用了有限的TCP链接数、带宽甚至运行它所需要的CPU。这也是为什么script标签会有async或defer属性的原因之一。 可是,在复杂的实际应用场景中,要贯彻这几条结论可能会遇到问题,比如: 你的页面是分模块来写的,每一个模块都有自己的html、js甚至css,当把这些模块凑到一个页面中的时候就会出现js自然而然地出现在HTML中间部分。你很难把script标签都放到底部 即使你把script标签都放到底部,但script标签的存在终究是拖慢了首屏时间、DomContendLoad和loaded的时间。如果只有一个script标签,我们可以加一个async,但多个async的script标签的结果会是js文件被乱序执行的,这显然不是我们想要的。 我们也遇到了这样的问题,所以就做了一个开源项目:Tiny-Loader —— A small loader that load CSS/JS in best way for page performance 简单好用。

优秀的个人博客,低调大师

day25_Struts2学习笔记_02

一、封装请求正文到对象中(非常重要) 1、如何封装静态请求参数? 在 struts.xml 配置文件中,通过参数注入的方式,给动作类的参数注入值。相当于调用的是该参数的setter方法 。控制台输出的是 张三,18 ,如下图所示: 原因:是由默认的 拦截器栈 中的一个 拦截器staticParams 来完成参数注入的。 该拦截器栈在 struts-default.xml 文件中定义。为了演示方便,我们把写在 struts-default.xml 中默认的拦截器写在 struts.xml 中进行显示出来,如下图所示: 当我们把黄色框框中的 <interceptor-ref name="staticParams"/> 这句代码注释掉后,再次访问该 action 时,在控制台输出的是 null,0 。 2、如何封装动态请求参数?:开发时用到的 通过用户的表单封装请求正文参数。1、动作类作为实体模型(即:数据模型与动作类写在一起)实体模型:Entity,对应数据库中表的记录(注意:类对应的是表结构,而对象对应的是一条记录) 原因:是由 params拦截器 完成的。 2、动作类和实体模型分开 3、模型驱动:建立动作类和模型分开的前提下(开发中采用的方式) 此处的学习目标:目前先记住怎么写,要想理解,必须等讲完 OGNL表达式 之后。 原因:是由一个 modelDriven拦截器 完成的。 二、用户注册案例(重点) 1、数据建模(数据库和实体模型) 2、建立业务层接口 + 建立业务层实现类 3、建立持久层接口 + 建立持久层实现类(暂时没有具体实现) 4、拷贝jar包和配置文件 拷贝数据库工具类jar包:commons-dbutils-1.4.jar 和 mysql-connector-java-5.0.8-bin.jar 到 /WebRoot/WEB-INF/lib 中,再拷贝数据源工具类jar包:commons-dbcp-1.4.jar 和 commons-pool-1.6.jar 到 /WebRoot/WEB-INF/lib 中,再将与之相对应的配置文件 dbcpconfig.properties 拷贝至项目路径中的 /src 目录下,若该配置文件有乱码,则点击该配置文件 右键/Properties/Text file encoding/Other/UTF-8 ,OK即可。 5、在项目中新建一个 util的包 ,将代码 DBCPUtil.java 拷贝 如下图所示: 6、持久层实现类(具体实现) 如下图所示: 7、表现层使用Struts2框架实现 动作类 配置文件 注册界面和结果视图注册页面:结果视图: 三、数据类型的转换(明白原理即可,实际开发中几乎不用) 1、开发中的情况:实际开发中用户通过浏览器输入的数据都是 String 或者 String[] 。 String/String[] ————> 填充模型(set方法) ————> POJO(plain old java object) pojo中有java的数据类型。 POJO ————> 获取(get方法) ————> 页面展示:String 2、类型转换的两种情况: 写数据:(增,删,改)都是String或String[]数组转换为其他类型。 读数据:(查)其他类型转换为String。 3、Struts2提供的常用类型转换: a. 基本数据类型 自动转换 。 b. 日期类型:默认按照 本地日期格式 转换(yyyy-MM-dd)。 c. 字符串数组:默认用 逗号+空格 ,连接成一个字符串。 4、自定义类型转换器(知道即可)示例:把日期格式按照 MM/dd/yyyy的格式转换 4.1、先看看Struts2中的类型转换器的结构: UML图如下:DefaultTypeConverter.javaStrutsTypeConverter.java 4.2、编写自己的类型转换器(编写一个类继承StrutsTypeConverter,实现其抽象方法) 4.3、注册类型转换器局部类型转换器:只能指定javabean中的属性。按照 属性 来注册。在属性所属的 javabean 的包下建立一个 .properties 文件。文件名称为:javabean名称-conversion.properties如下图所示:此时,只能是User能够使用。其余的javabean用不了。 全局类型转换器:(推荐)按照 要转换的数据类型 来注册。at the top on classpath ,建立一个固定名称 xwork-conversion.properties 的属性文件。 5、转换失败后的处理(需要掌握)当转换失败后,页面提示: 上面的显示给客户端的用户看,太难看了,不好。 解决办法:配置回显结果视图 问题 :配置了回显视图后,当转换失败时,可以回到请求页面,但是表单数据却都没了?肿么办? 解决办法:显示错误提示:借助Struts2的标签库。如下图所示: 回显数据:使用struts2的标签库生成表单。(建议使用)如下图所示: 演示效果如下图所示: 错误信息中文提示:使用的是struts2的国际化。 效果如下图所示: 问题:类型转换器当转换失败后,如何进入input视图的? 原因:是由一个叫做 conversionError 的拦截器完成的。 注意:要想使用类型转换中的错误处理,在 定义Action 时必须继承 ActionSupport 。 四、数据验证 用户的输入验证,必须做,且工作量巨大。 1、验证的方式 客户端验证:javascript服务端验证:逻辑验证(我们的代码)注意:如果客户端和服务端二选一的话,服务器端的不能省。实际开发中:客户端 + 服务端 2、Struts2的服务端验证 2.1、编程式验证前提:动作类必须继承ActionSupport。在代码中编写验证规则。 a、针对动作类中的 所有动作方法 进行验证: 在动作类中重写 public void validate() 方法。如下图所示: 用到了针对 java.lang包 中String的扩展的 工具类StringUtils : 演示视图如下图所示: 但是当我们再写一个动作方法时: 由此可知,当重写了validate方法后,该验证方法会对动作类中的所有动作方法进行验证。 b、针对动作类中的 某个动作方法 进行验证: 针对上面的问题,解决办法1:给不需要验证的动作方法添加一个 @SkipValidation注解 。 解决办法2: validation方法遵守书写规范。 即:定义验证方法的名称:validate+动作名称 ,动作名称的首字符还要大写。 解决办法1和解决办法2的使用时机: 需要验证的动作方法少,用解决办法2。 需要验证的动作方法多,用解决方式1。(简言之:挑少的写) 所有编程式验证的弊端:硬编码。(写死了) 2.2、声明式验证(推荐)通过编写 验证规则 的 xml文件 。需要验证时,编写xml文件,不要验证时,就不编写。优势:解决了2.1编程式验证的弊端。 a、针对动作类中的 所有动作方法 进行验证:在动作类所在的包中,建立一个 ActionClassName-validation.xml 的文件,内容如下: 图片中的 xwork-validator-1.0.3.dtd文件 在 \struts-2.3.15.3-all\struts-2.3.15.3\apps\struts2-blank\WEB-INF\lib\xwork-core-2.3.15.3.jar\xwork-validator-1.0.3.dtd中。 注意:当使用ActionClassName-validation.xml来命名文件时,它是一个动作类验证器。会验证动作类中的所有动作方法。 b、针对动作类中的 某个动作方法 进行验证:在动作类所在的包中建立一个 xml文件 ,名称为 ActionClassName-ActionName-validation.xml。内容如下: 注意:动作名称是配置文件struts.xml中package元素的name属性的取值。 2.3、Struts2内置的常用声明式验证器1、所在位置:xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml ,该文件内容如下图所示: 2、验证器注入参数 例如:我们使用 requiredstring,默认是去空格,当我们不想去空格时,就可以给该验证器注入参数。基于字段的方式和基于验证器的方式如下: 效果如下图所示: 3、声明式基于字段的常用验证器案例(1)注册页面 student.jsp ,如下图所示: (2)注册页面效果图,如下图所示: (3)实体模型(数据模型:JavaBean) Student.java ,如下图所示: (4) struts.xml 中的配置 (5)动作类 StudentAction.java ,如下图所示: (6)声明式验证文件 StudentAction-addStudent-validation.xml 如下: (7)整体效果,如下图所示: 我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册