国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
SpringMVC學(xué)習(xí)系列-后記 結(jié)合SpringMVC和Hibernate-validator,根據(jù)后臺(tái)驗(yàn)證規(guī)則自動(dòng)生成前臺(tái)的js驗(yàn)證代碼

SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗(yàn)證中我們已經(jīng)學(xué)習(xí)了如何結(jié)合Hibernate-validator進(jìn)行后臺(tái)的數(shù)據(jù)合法性驗(yàn)證,但是通常來(lái)說(shuō)后臺(tái)驗(yàn)證只是第二道保險(xiǎn),為了更好的用戶體驗(yàn)會(huì)現(xiàn)在前端進(jìn)行js驗(yàn)證,驗(yàn)證通過(guò)之后數(shù)據(jù)才能提交到后臺(tái),那么我們不可避免的要在前端的頁(yè)面中寫對(duì)應(yīng)的js驗(yàn)證代碼。

但是這樣就需要進(jìn)行一些很麻煩且重復(fù)的操作:

1.首先要保證前端和后臺(tái)的驗(yàn)證規(guī)則要相同,避免出現(xiàn)前端驗(yàn)證通過(guò),提交后又出現(xiàn)驗(yàn)證失敗的情況。

2.其次要保證前端和后臺(tái)的驗(yàn)證規(guī)則要同步,即修改一邊的驗(yàn)證規(guī)則后要修改另一邊對(duì)應(yīng)的驗(yàn)證規(guī)則。

3.要保證錯(cuò)誤提示信息的一致和相應(yīng)的國(guó)際化問(wèn)題。(其實(shí)這個(gè)問(wèn)題在js驗(yàn)證代碼中提示錯(cuò)誤信息的地方,綁定國(guó)際化信息可以解決,只是比較啰嗦。)

好吧~~~以上這些都不是主要原因,主要原因是我太懶了不想在每個(gè)頁(yè)面中再一個(gè)一個(gè)寫對(duì)應(yīng)的js驗(yàn)證代碼,那么如何才能讓后臺(tái)根據(jù)我們定義的模型驗(yàn)證規(guī)則自動(dòng)生成前端的js驗(yàn)證代碼呢?

下面一步一步來(lái):

首先我想像spring mvc的form標(biāo)簽一樣<form:form modelAttribute="contentModel" method="post">,這樣指定一下就可以生成對(duì)應(yīng)的前端代碼,簡(jiǎn)潔優(yōu)雅,多爽!,那么我們就要先自定義taglib標(biāo)簽。

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

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

<?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>

上面的內(nèi)容很簡(jiǎn)單,就是定義了一個(gè)叫jsValidate的標(biāo)簽,對(duì)應(yīng)的類是com.demo.test.JsValidateTag就是我們之前新建的那個(gè),然后有一個(gè)叫modelAttribute的參數(shù)。

3.接下來(lái)在我們新建的類里面實(shí)現(xiàn)具體的處理邏輯,代碼如下:

 

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;/** *  * 自動(dòng)生成前臺(tái)js驗(yàn)證代碼 * @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({");                //在失去焦點(diǎn)時(shí)驗(yàn)證                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.接下來(lái)在頁(yè)面中引用我們自定義的標(biāo)簽:

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

并指定模型名稱:

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

頁(yè)面整體內(nèi)容如下:

<%@ 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>

好了運(yùn)行測(cè)試看看效果吧:

 

啊哈哈哈哈哈~~~,已經(jīng)生成好了~~~

 

注:以上的代碼只實(shí)現(xiàn)了@NotEmpty、@Range、@NotEmpty三個(gè)注解對(duì)應(yīng)的js驗(yàn)證規(guī)則,其它注解的js驗(yàn)證規(guī)則在JsValidateTag類中添加相應(yīng)的邏輯即可。

 

項(xiàng)目源碼下載:http://pan.baidu.com/s/1c0pVzFy

 

保留版權(quán),如需轉(zhuǎn)載請(qǐng)注明出處…

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SpringMVC Controller介紹
springmvc-數(shù)據(jù)回顯
springmvc注解@Controller和@RequestMapping
SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗(yàn)證
SpringMVC數(shù)據(jù)驗(yàn)證——第七章 注解式控制器的數(shù)據(jù)驗(yàn)證、類型轉(zhuǎn)換及格式化——跟著開(kāi)濤學(xué)SpringMVC
SpringMVC3.1 Hibernate4.1.7完全基于注解配置(零配置文件)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服