利用strut2标签自动生成form前端验证代码,使用到的技术有
1.struts2标签,如<s:form> <s:textfieled>
2.struts2读取*Validation.xml文件(*为Action名字),
org.apache.struts2.components.Form.findFieldValidators(String name, Class actionClass, String actionName, List<Validator> validatorList, List<Validator> retultValidators, String prefix)
这是在freemarker解析form-close.ftl文件(<#assign validators=tag.getValidators("${tagName}")>)是调用的,获取关于某个输入控件的所有验证,如非空验证/长度验证
3.在void org.apache.struts2.components.UIBean.evaluateParams()方法中,会解析Form标签下的所有输入控件标签,
如<s:textfield>,<s:textarea>,主要是得到输入控件的name属性值,并存放在Map<String, Object> org.apache.struts2.components.Component.parameters这个属性中(Form.java继承与Component),
4.Freemarker解析form-close.ftl文件,主要做的工作是
遍历Map<String, Object> org.apache.struts2.components.Component.parameters字段,得到某个输入控件的tagName,
通过调用Form.findFieldValidators得到关于该输入控件的所有验证(如非空/长度/范围等)
5.解析form-close.ftl可能生成的代码如下形式,使用了jquery-validation插件:
---------------------------------开始------------------------------------------
</form>
<script type="text/javascript">$(function() { //最大提示信息数 var maxTips = 10; // validate form on keyup and submit var formElement = $("#submitDeviceManagementAdd"); //是否正在提交 var isSubmitting = false; formElement.validate({ rules: { "device.dimensionNo":{ trim:'true', minlength:1, maxlength:20 ,customValidation: true } ,"device.assetsNo":{ trim:'true', minlength:1, maxlength:25 ,customValidation: true } ,"device.buildingName":{ required: true, minlength:0 ,customValidation: true } ,"device.brandName":{ required: true, minlength:0 , trim:'true', minlength:1, maxlength:50 ,customValidation: true } ,"device.deviceModel":{ required: true, minlength:0 , trim:'true', minlength:1, maxlength:128 ,customValidation: true } ,"device.ipv4":{ trim:'true', minlength:1, maxlength:200 ,customValidation: true } ,"device.macAddress":{ trim:'true', minlength:1, maxlength:128 ,customValidation: true } ,"device.remark":{ trim:'true', minlength:1, maxlength:2000 ,customValidation: true } }, messages: { "device.dimensionNo":{ minlength:"二维码编号的长度只能是1到20个字符!", maxlength:"二维码编号的长度只能是1到20个字符!" ,customValidation: '_customValidationMessage' } ,"device.assetsNo":{ minlength:"固定资产编号的长度只能是1到25个字符!", maxlength:"固定资产编号的长度只能是1到25个字符!" ,customValidation: '_customValidationMessage' } ,"device.buildingName":{ required: "使用单位是必填项!" ,customValidation: '_customValidationMessage' } ,"device.brandName":{ required: "品牌是必填项!" , minlength:"品牌的长度只能是1到25个字符!", maxlength:"品牌的长度只能是1到25个字符!" ,customValidation: '_customValidationMessage' } ,"device.deviceModel":{ required: "设备型号是必填项!" , minlength:"设备型号的长度只能是1到128个字符!", maxlength:"设备型号的长度只能是1到128个字符!" ,customValidation: '_customValidationMessage' } ,"device.ipv4":{ minlength:"IP地址的长度只能是1到100个字符!", maxlength:"IP地址的长度只能是1到100个字符!" ,customValidation: '_customValidationMessage' } ,"device.macAddress":{ minlength:"MAC地址的长度只能是1到128个字符!", maxlength:"MAC地址的长度只能是1到128个字符!" ,customValidation: '_customValidationMessage' } ,"device.remark":{ minlength:"备注的长度只能是1到1000个字符!", maxlength:"备注的长度只能是1到1000个字符!" ,customValidation: '_customValidationMessage' } }, errorPlacement: function(error, element) { // Set positioning based on the elements position in the form var elem = $(element); if (elem.attr('type') == 'hidden') { var widgetName = elem.attr('name') + '_widget'; elem = elem.next("input[name=" + widgetName + "]"); } // Check we have a valid error message if(!error.is(':empty')) { elem.addClass('add_error_border'); var show = elem.qtip('api') != undefined; // Apply the tooltip only if it isn't valid elem.filter(function() { if ($(this).hasClass('ui-autocomplete-input') || !$(this).hasClass('valid')) { $(this).removeClass('valid'); return true; } else return false; }).qtip({ overwrite: false, content: error, position: { my: 'left bottom', at: 'right top' }, show: { event: 'mouseenter', ready: true, persistent: false }, hide: false, style: { classes: 'ui-tooltip-red' // Make it red... the classic error colour! }, events: { show: function(event, api) { var currentTips = formElement.data('currentTips'); if (typeof currentTips == 'undefined') { currentTips = 0; } if (++currentTips <= maxTips) { formElement.data('currentTips', currentTips); _timer.call(api.elements.tooltip, event); } else { return false; } }, hide: function(event, api) { var currentTips = formElement.data('currentTips'); if (typeof currentTips != 'undefined') { if (--currentTips < 0) { currentTips = 0; } formElement.data('currentTips', currentTips); } } } }) // If we have a tooltip on this element already, just update its content .qtip('option', 'content.text', error); if (show) { elem.qtip('show'); } } // If the error is empty, remove the qTip else { if(elem.hasClass('add_error_border')){ elem.toggleClass('add_error_border'); } elem.qtip('destroy'); formElement.data('currentTips', 0); } }, success: $.noop, // Odd workaround for errorPlacement not firing! submitHandler: function(form) { if (isSubmitting) { alert("请勿重复提交表单!"); } else { isSubmitting = true; form.submit(); } }, focusInvalid: false, debug: false }); $.validator.addMethod("trim", function(value, element, params) { if (params.trim === 'true') { $(element).val($.trim($(element).val())); } return true; }); $.validator.addMethod("customValidation", function(value, element, params) { var result = true; return true; }); });</script>
---------------------------------结束---------------------------------------------

利用strut2标签自动生成form前端验证代码的更多相关文章

  1. 利用ir.sequence自动生成序列号

    利用ir.sequence自动生成序列号 什么是序列号 可以这么理解,我有一个产品序号,编码的前缀是SOP,后缀是0001~9999的序号,没生成一个产品就自动流水加一,序列号不会重复,odoo中的i ...

  2. EF自动生成的模型edmx代码分析

    edmx代码分析 本文分析Entity Framework从数据库自动生成的模型文件代码(扩展名为edmx). 1. 概述 本文使用的数据库结构尽量简单,只有2个表,一个用户表和一个分公司表(相当于部 ...

  3. 如何利用Excel快速批量生成想要的代码

    如何利用Excel快速批量生成想要的代码 使用场景 在HTML DOM Video 对象这个页面 我想要将所有的中文描述和对应的属性(共32个属性)打印出来--console.log(descript ...

  4. 利用mybatis-generator自动生成数据持久化的代码

    MyBatis生成器简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将生成所有版本的MyBatis的代码,以及版本2.2.0之后的iB ...

  5. 利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件

    1. mybatis-generator-core-1.3.5.jar 下载地址:https://github.com/mybatis/generator/releases 2. msyql-conn ...

  6. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子

    什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...

  7. Java自动生成asmx的webservice代码

    第一种方式:针对CXF自动生成的代码对响应类大小写区别问题,可以使用此方法. 工具为Eclipse. 新建Web Service Client. 输入地址点击finish即可自动生成. 调用方式: p ...

  8. 自动生成form Scripts

    运行脚本: begin xxx_plsql_generator_pkg2.form_view_iud_p(p_block_name =>'CONTRACT_T' ,p_table_name =& ...

  9. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...

随机推荐

  1. excel中的单位换算函数convert()

    有时,我们在处理数据的时候,需要进行单位换算,比如“7小时24分”换算成小时,可以直接除以或乘以相应的进制来计算,但是在excel中,有一个convert()函数更加方便: 此函数属于工程函数,平时可 ...

  2. jquery 获取属性的值

    jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1.  attr( 属 ...

  3. WEB前端性能优化:HTML,CSS,JS和服务器端优化

    对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前 ...

  4. Android MotionEvent事件响应机制

    在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...

  5. 多条查询sql语句返回多表数据集

    + + "';SELECT ProductID,ProductTitle,ProductName,SalePrice,ListingPrice,MainPicture,SaledItemCo ...

  6. 继承多态绕点 Java篇

    上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...

  7. ios基础篇(五)——UITextField的详细使用

    UItextFieldField通常用于外部数据输入,以实现人机交互. 以下是UItextFieldField的属性及常见用法: 1.textField :设置文本框的默认文本. 2.Placehol ...

  8. c#获取系统时间的方法(转)

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. CentOS命令登录MySQL时,报错ERROR 1045 (28000):

    CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...

  10. MySQL的information_schema的介绍

    information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表述该信 ...