亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

SpringMVC學習系列-后記 結合SpringMVC和Hibernate-validator,根據后臺驗證規則自動生成前臺的js驗證代碼

2019-11-15 00:45:05
字體:
來源:轉載
供稿:網友
SPRingMVC學習系列-后記 結合SpringMVC和Hibernate-validator,根據后臺驗證規則自動生成前臺的js驗證代碼

在SpringMVC學習系列(6) 之 數據驗證中我們已經學習了如何結合Hibernate-validator進行后臺的數據合法性驗證,但是通常來說后臺驗證只是第二道保險,為了更好的用戶體驗會現在前端進行js驗證,驗證通過之后數據才能提交到后臺,那么我們不可避免的要在前端的頁面中寫對應的js驗證代碼。

但是這樣就需要進行一些很麻煩且重復的操作:

1.首先要保證前端和后臺的驗證規則要相同,避免出現前端驗證通過,提交后又出現驗證失敗的情況。

2.其次要保證前端和后臺的驗證規則要同步,即修改一邊的驗證規則后要修改另一邊對應的驗證規則。

3.要保證錯誤提示信息的一致和相應的國際化問題。(其實這個問題在js驗證代碼中提示錯誤信息的地方,綁定國際化信息可以解決,只是比較啰嗦。)

好吧~~~以上這些都不是主要原因,主要原因是我太懶了不想在每個頁面中再一個一個寫對應的js驗證代碼,那么如何才能讓后臺根據我們定義的模型驗證規則自動生成前端的js驗證代碼呢?

下面一步一步來:

首先我想像spring mvc的form標簽一樣<form:form modelAttribute="contentModel" method="post">,這樣指定一下就可以生成對應的前端代碼,簡潔優雅,多爽!,那么我們就要先自定義taglib標簽。

1.添加一個類,這里就叫JsValidateTag,我是定義在com.demo.test包下面的。

2.在WebContent/WEB-INF目錄下面添加一個xml文件,我這里名稱叫test.tld內容如下:

<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="http://java.sun.com/xml/ns/j2ee"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"        version="2.0">                <description>Test</description>        <tlib-version>1.0</tlib-version>        <short-name>test</short-name>        <uri>http://www.mytest.org/tags/test</uri>                <tag>            <description></description>            <name>jsValidate</name>            <tag-class>com.demo.test.JsValidateTag</tag-class>            <body-content>empty</body-content>            <attribute>                <description>Path to property for data binding</description>                <name>modelAttribute</name>                <required>true</required>                <rtexprvalue>true</rtexprvalue>            </attribute>        </tag>        </taglib>

上面的內容很簡單,就是定義了一個叫jsValidate的標簽,對應的類是com.demo.test.JsValidateTag就是我們之前新建的那個,然后有一個叫modelAttribute的參數。

3.接下來在我們新建的類里面實現具體的處理邏輯,代碼如下:

package com.demo.test;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import javax.servlet.jsp.JspException;import org.hibernate.validator.constraints.Email;import org.hibernate.validator.constraints.NotEmpty;import org.hibernate.validator.constraints.Range;import org.springframework.web.servlet.tags.form.AbstractFormTag;import org.springframework.web.servlet.tags.form.TagWriter;/** *  * 自動生成前臺js驗證代碼 * @author liukemng@sina.com * */@SuppressWarnings("serial")public class JsValidateTag extends AbstractFormTag {    @SuppressWarnings("unused")    private TagWriter tagWriter;    private String modelAttribute;    public void setModelAttribute(String modelAttribute) {        this.modelAttribute = modelAttribute;    }        public String getModelAttribute() throws JspException {        String resolvedModelAttribute = (String) evaluate("modelAttribute", this.modelAttribute);        return (resolvedModelAttribute != null ? resolvedModelAttribute : "");    }    @Override    protected int writeTagContent(TagWriter tagWriter) throws JspException {        Object model;        if(getRequestContext().getModel()!=null)            model=getRequestContext().getModel().get(getModelAttribute());        else            model=this.pageContext.getRequest().getAttribute(getModelAttribute());        if(model!=null){            Map<String, List<String[]>> fieldValidateMap=new HashMap<String, List<String[]>>();            try {                Field[] theFields=model.getClass().getDeclaredFields();                if(theFields!=null&& theFields.length>0){                    for(Field field : theFields){                        String fieldName=field.getName();                        List<String[]> fieldValidateList=new ArrayList<String[]>();                        NotEmpty notEmpty=field.getAnnotation(NotEmpty.class);                        if(notEmpty!=null){                            String messageName=notEmpty.message();                            fieldValidateList.add(new String[]{"required","true",getRequestContext().getMessage(messageName.substring(1, messageName.length()-1))});                        }                                                Email email=field.getAnnotation(Email.class);                        if(email!=null){                            String messageName=email.message();                            fieldValidateList.add(new String[]{"email","true",getRequestContext().getMessage(messageName.substring(1, messageName.length()-1))});                        }                                                Range range=field.getAnnotation(Range.class);                        if(range!=null){                            String messageName=range.message();                            fieldValidateList.add(new String[]{"range","["+range.min()+","+range.max()+"]",getRequestContext().getMessage(messageName.substring(1, messageName.length()-1))});                        }                                                                        if(fieldValidateList.size()>0){                            fieldValidateMap.put(fieldName, fieldValidateList);                        }                    }                }            }catch (SecurityException e1) {                e1.printStackTrace();            }                        if(fieldValidateMap.size()>0){                        StringBuilder rulesBuilder=new StringBuilder();                StringBuilder messagesBuilder=new StringBuilder();                                rulesBuilder.append("rules:{");                messagesBuilder.append("messages:{");                int i=0;                Iterator<Entry<String, List<String[]>>> iterator=fieldValidateMap.entrySet().iterator();                while(iterator.hasNext()){                    Entry<String, List<String[]>> entry=iterator.next();                    rulesBuilder.append(entry.getKey()).append(":{");                    messagesBuilder.append(entry.getKey()).append(":{");                                        int j=0;                    for(String[] array : entry.getValue()){                        rulesBuilder.append(array[0]).append(":").append(array[1]);                        messagesBuilder.append(array[0]).append(":/"").append(array[2]).append("/"");                        if(j<entry.getValue().size()-1){                            rulesBuilder.append(",");                            messagesBuilder.append(",");                        }                        j++;                    }                                        rulesBuilder.append("}");                    messagesBuilder.append("}");                    if(i<fieldValidateMap.size()-1){                        rulesBuilder.append(",");                        messagesBuilder.append(",");                    }                    i++;                }                                rulesBuilder.append("},");                messagesBuilder.append("}");                tagWriter.startTag("script");                tagWriter.writeAttribute("type", "text/Javascript");                tagWriter.appendValue("$(function() {");                tagWriter.appendValue("$(/"#");                tagWriter.appendValue(getModelAttribute());                tagWriter.appendValue("/").validate({");                //在失去焦點時驗證                tagWriter.appendValue("onfocusout:function(element){$(element).valid();},");                tagWriter.appendValue(rulesBuilder.toString());                tagWriter.appendValue(messagesBuilder.toString());                tagWriter.appendValue("});");                tagWriter.appendValue("});");                tagWriter.endTag(true);            }            }                this.tagWriter=tagWriter;        return EVAL_BODY_INCLUDE;    }        @Override    public void doFinally() {        super.doFinally();        this.tagWriter = null;    }}

4.接下來在頁面中引用我們自定義的標簽:

<%@ taglib prefix="test" uri="http://www.mytest.org/tags/test" %>

并指定模型名稱:

<test:jsValidate modelAttribute="contentModel"></test:jsValidate>

頁面整體內容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><%@ taglib prefix="test" uri="http://www.mytest.org/tags/test" %><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    <title>Insert title here</title>    <script src="<c:url value='/js/jquery-1.10.2.min.js'/>" type="text/javascript"></script>    <script src="<c:url value='/js/jquery.validate.min.js'/>" type="text/javascript"></script></head><body>    <form:form modelAttribute="contentModel" method="post">                     <form:errors path="*"></form:errors><br/><br/>                    name:<form:input path="name" /><br/>        <form:errors path="name"></form:errors><br/>                        age:<form:input path="age" /><br/>        <form:errors path="age"></form:errors><br/>                email:<form:input path="email" /><br/>        <form:errors path="email"></form:errors><br/>        <input type="submit" value="Submit" />            </form:form>  </body><test:jsValidate modelAttribute="contentModel"></test:jsValidate></html>

好了運行測試看看效果吧:

啊哈哈哈哈哈~~~,已經生成好了,再也不用親自寫驗證規則了,懶癌病情又加重了~~~

注:以上的代碼只實現了@NotEmpty、@Range、@NotEmpty三個注解對應的js驗證規則,其它注解的js驗證規則在JsValidateTag類中添加相應的邏輯即可。

項目源碼下載:http://pan.baidu.com/s/1c0pVzFy

保留版權,如需轉載請注明出處…


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频在线看| 国产精品久久久久久久久粉嫩av| 色阁综合伊人av| 成人网在线免费看| 欧美成年人视频网站| 久久伊人精品天天| 日韩av观看网址| 国产高清视频一区三区| 4444欧美成人kkkk| 国产精品久久久久久亚洲调教| 91久久精品久久国产性色也91| 欧美一区二粉嫩精品国产一线天| 欧美日韩在线观看视频小说| 国产视频自拍一区| 欧美日韩精品在线播放| 久久久久久亚洲精品中文字幕| 国产成人精彩在线视频九色| 操91在线视频| 日韩亚洲欧美中文高清在线| 欧美中在线观看| 欧美成年人视频网站欧美| 国产精品xxx视频| 在线成人免费网站| 欧美高清videos高潮hd| 96国产粉嫩美女| 亚洲男人7777| 777777777亚洲妇女| 国产亚洲成av人片在线观看桃| 亚洲qvod图片区电影| 欧美一级大片在线免费观看| 欧美激情一二区| 日本欧美精品在线| 欧美中文字幕精品| 国产91精品久久久久久| 欧洲精品在线视频| 欧美在线观看一区二区三区| 在线观看精品自拍私拍| 日韩精品视频免费| 欧美日韩中国免费专区在线看| 国产欧美 在线欧美| 国产91在线播放九色快色| 伊是香蕉大人久久| 国产69精品久久久久久| 欧美午夜激情视频| 久久久久久亚洲精品不卡| 国产精品美女无圣光视频| 精品久久久久久中文字幕| 在线亚洲国产精品网| 欧美日韩国产色视频| 欧美成年人视频网站| 欧美乱大交做爰xxxⅹ性3| www.亚洲一区| 亚洲人午夜精品免费| 久久影视免费观看| 国产在线视频不卡| 欧美日本在线视频中文字字幕| 久久精品久久精品亚洲人| 亚洲国产欧美一区二区丝袜黑人| 欧美激情第一页xxx| 亚洲欧美激情精品一区二区| 欧美一级bbbbb性bbbb喷潮片| 色婷婷久久一区二区| 欧美日韩一区二区在线| 在线午夜精品自拍| 欧美又大又粗又长| 欧美精品免费在线| 亚洲国产精品一区二区久| 免费99精品国产自在在线| 欧美日韩国产限制| 国产精品久久久久久久久久新婚| 日韩中文字幕在线视频播放| 欧美激情在线狂野欧美精品| 成人激情黄色网| 福利视频导航一区| 欧美性猛交xxxx免费看| 丝袜亚洲欧美日韩综合| 日产日韩在线亚洲欧美| 秋霞成人午夜鲁丝一区二区三区| 久久久在线观看| 中文字幕成人在线| 91成品人片a无限观看| 日韩精品在线免费播放| 久久精品久久久久久国产 免费| 亚洲日韩第一页| 成人网在线免费观看| 国产午夜精品美女视频明星a级| 日韩成人在线视频观看| 国产999在线观看| 日韩高清电影免费观看完整| 国产欧美一区二区三区在线看| 色偷偷亚洲男人天堂| 精品视频一区在线视频| 91国产精品91| 国产精品女人久久久久久| 国产午夜精品视频| 成人深夜直播免费观看| 精品国产鲁一鲁一区二区张丽| 7777精品久久久久久| 久久精品最新地址| 日韩一区二区久久久| 在线视频日本亚洲性| 92版电视剧仙鹤神针在线观看| 成人做爰www免费看视频网站| 国产成人精品电影久久久| 亚洲另类xxxx| 亚洲xxx自由成熟| 久久激情视频久久| 欧美激情xxxx性bbbb| 性色av一区二区三区在线观看| 中文字幕欧美专区| 欧美精品videofree1080p| 日韩视频―中文字幕| 久久久久国色av免费观看性色| 国产在线精品播放| 亚洲人高潮女人毛茸茸| 国产日本欧美在线观看| 成人免费看吃奶视频网站| 国产精品av免费在线观看| 日本精品久久中文字幕佐佐木| 97在线观看视频| 日韩美女视频中文字幕| 91欧美精品午夜性色福利在线| 欧美性精品220| 精品亚洲男同gayvideo网站| 欧美国产日韩一区二区三区| 成人精品在线视频| 成人伊人精品色xxxx视频| 中文字幕日韩欧美精品在线观看| 丁香五六月婷婷久久激情| 欧美在线视频观看免费网站| 色综合久久88| 97视频在线看| 日韩在线视频线视频免费网站| 97视频在线观看播放| 精品av在线播放| 欧美电影免费播放| 色yeye香蕉凹凸一区二区av| 国产精品ⅴa在线观看h| 尤物九九久久国产精品的特点| 91精品国产91久久久久久吃药| 欧美一级视频在线观看| 不卡av在线播放| 色综合色综合网色综合| 国产亚洲欧美日韩一区二区| 久久精品国产清自在天天线| 国产精品一区二区女厕厕| 亚洲国产精品va在线看黑人| 欧美另类高清videos| 18一19gay欧美视频网站| 性欧美激情精品| 亚洲大胆美女视频| 色综合久久天天综线观看| 韩国三级电影久久久久久| 国产91av在线| 久久久久国色av免费观看性色| 欧美亚洲国产日韩2020| 色综久久综合桃花网| 精品人伦一区二区三区蜜桃网站| 亚洲国产精品99| 国产精品久久久久久久久影视| 欧美一区二区大胆人体摄影专业网站| 久久精品久久久久| 91日本在线观看| 97碰碰碰免费色视频|