Hibernate 能够满足我们的验证需求 您所在的位置:网站首页 linux根目录要多大 Hibernate 能够满足我们的验证需求

Hibernate 能够满足我们的验证需求

2023-06-08 10:57| 来源: 网络整理| 查看: 265

注éç®åäºæ°æ®éªè¯

developerWorks ææ¡£é项 å°æ­¤é¡µä½ä¸ºçµå­é®ä»¶åé

å°æ­¤é¡µä½ä¸ºçµå­é®ä»¶åé

æ ·ä¾ä»£ç 

æå± Tomcat åºç¨

ä¸è½½ IBM å¼æº J2EE åºç¨æå¡å¨ WAS CE æ°çæ¬ V1.1

级å«: 中级

Ted Bergeron ([email protected]), åä½åå§äºº, Triview, Inc.

2006 å¹´ 10 æ 10 æ¥

å°½ç®¡å¨ Web åºç¨ç¨åºä¸­å°½å¯è½å¤çå±æ¬¡ä¸­æ建æ°æ®éªè¯é常éè¦ï¼ä½æ¯è¿æ ·åå´é常èæ¶ï¼ä»¥è³äºå¾å¤å¼å人åé½ä¼å¹²è忽ç¥è¿ä¸ªæ­¥éª¤ ââ è¿å¯è½ä¼å¯¼è´ä»å大éé®é¢ç产çãä½æ¯éçææ°çæ¬ç Java å¹³å°ä¸­å¼å¥äºæ³¨éï¼éªè¯åå¾ç®åå¾å¤äºãå¨æ¬æ中ï¼Ted Bergeron å°åæ¨ä»ç»å¦ä½ä½¿ç¨ Hibernate Annotations ç Validator ç»ä»¶å¨ Web åºç¨ç¨åºä¸­è½»æ¾æ建并维æ¤éªè¯é»è¾ã

ææ¶ä¼æä¸ç§å·¥å·ï¼å®å¯ä»¥ç正满足å¼å人ååæ¶æå¸çéæ±ãå¼å人åå¨ç¬¬ä¸æ¬¡ä¸è½½è¿ç§å·¥å·å½å¤©å°±å¯ä»¥å¨èªå·±çåºç¨ç¨åºä¸­å¼å§ä½¿ç¨è¿ç§å·¥å·ãç论ä¸æ¥è¯´ï¼è¿ç§å·¥å·å¨å¼å人åè±è´¹å¤§éæ¶é´æ¥ææ¡å¶ç¨æ³ä¹åå°±å¯ä»¥ä»ä¸­è·çãæ¶æå¸ä¹å¾å欢è¿ç§å·¥å·ï¼å ä¸ºå®å¯ä»¥å°å¼å人å导åæ´é«ç论å±æ¬¡çå®ç°ãHibernate Annotations ç Validator ç»ä»¶å°±æ¯ä¸ç§è¿æ ·çå·¥å·ã

å¼å§ä¹åéè¦äºè§£çå容

å¨é读æ¬æä¹åï¼åºè¯¥å¯¹ Java å¹³å°çæ¬ 5ï¼å°¤å¶æ¯æ³¨éï¼ãJSP 2.0ï¼å ä¸ºæ¬æ中å建äºä¸äºæ ç­¾æ件ï¼å¹¶å¨ TLD 中å®ä¹äºä¸äºå½æ°ï¼å®ä»¬é½æ¯ JSP 2.0 çæ°ç¹æ§ï¼å Hibernate å Spring æ¡æ¶æä¸ä¸ªåºæ¬çäºè§£ã请注æå³ä½¿ä¸ä½¿ç¨ Hibernate æ¥å®ç°æä¹æ§ï¼ä¹å¯ä»¥å¨èªå·±çåºç¨ç¨åºä¸­ä½¿ç¨ Hibernate Validatorã

Java SE 5 为 Java 语è¨æä¾äºå¾å¤éè¦çå¢å¼ºåè½ï¼ä¸è¿å¶ä»å¢å¼ºåè½å¯è½é½ä¸å¦ 注é è¿æ ·æ½å巨大ãä½¿ç¨ æ³¨éï¼æ们就ç»äºå·æäºä¸ä¸ªæ åãä¸çº§çåæ°æ®æ¡æ¶ä¸º Java 类使ç¨ãHibernate ç¨æ·æå·¥ç¼å *.hbm.xml æ件已ç»å¾å¤å¹´äºï¼æèä½¿ç¨ XDoclet æ¥èªå¨å®ç°è¿ä¸ªä»»å¡ï¼ãå¦ææå·¥åå»ºäº XML æ件ï¼é£å°±å¿é¡»å¯¹æ¯ä¸ªæéè¦çæä¹å±æ§é½æ´æ°è¿ä¸¤ä¸ªæ件ï¼ç±»å®ä¹å XML æ å°ææ¡£ï¼ãä½¿ç¨ HibernateDoclet å¯ä»¥ç®åè¿ä¸ªè¿ç¨ï¼è¯·åçæ¸å 1 ç»åºçä¾å­ï¼ï¼ä½æ¯è¿éè¦æ们确认èªå·±ç HibernateDoclet çæ¬æ¯æè¦ä½¿ç¨ç Hibernate ççæ¬ãdoclet ä¿¡æ¯å¨è¿è¡æ¶ä¹æ¯ä¸å¯ç¨çï¼å ä¸ºå®è¢«ç¼åå°äº Javadoc é£æ ¼ç注é中äºãHibernate Annotationsï¼å¦å¾ 2 æ示ï¼éè¿æä¾ä¸ä¸ªæ åãç®æçæ å°ç±»çæ¹æ³åææ·»å çè¿è¡æ¶å¯ç¨æ§æ¥å¯¹è¿äºæ¹å¼è¿è¡æ¹è¿ã

æ¸å 1. ä½¿ç¨ HibernateDoclet ç Hibernate æ å°ä»£ç  /** * @hibernate.property column="NAME" length="60" not-null="true" */ public String getName() { return this.name; } /** * @hibernate.many-to-one column="AGENT_ID" not-null="true" cascade="none" * outer-join="false" lazy="true" */ public Agent getAgent() { return agent; } /** * @hibernate.set lazy="true" inverse="true" cascade="all" table="DEPARTMENT" * @hibernate.collection-one-to-many class="com.triview.model.Department" * @hibernate.collection-key column="DEPARTMENT_ID" not-null="true" */ public List getDepartment() { return department; } æ¸å 2. ä½¿ç¨ Hibernate Annotations ç Hibernate æ å°ä»£ç  @NotNull @Column(name = "name") @Length(min = 1, max = NAME_LENGTH) // NAME_LENGTH is a constant declared elsewhere public String getName() { return name; } @NotNull @ManyToOne(cascade = {CascadeType.MERGE }, fetch = FetchType.LAZY) @JoinColumn(name = "agent_id") public Agent getAgent() { return agent; } @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY) public List getDepartment() { return department; }

å¦æä½¿ç¨ HibernateDocletï¼é£ä¹ç´å°çæ XML æ件æè¿è¡æ¶æè½æè·é误ãä½¿ç¨ æ³¨éï¼å¨ç¼è¯æ¶å°±å¯ä»¥æ£æµåºå¾å¤é误ï¼æèå¦æå¨ç¼è¾æ¶ä½¿ç¨äºå¾å¥½ç IDEï¼é£ä¹å¨ç¼è¾æ¶å°±å¯ä»¥æ£æµåºé¨åé误ãå¨ä»å¤´å建åºç¨ç¨åºæ¶ï¼å¯ä»¥å©ç¨ hbm2ddl å·¥å·ä¸ºèªå·±çæ°æ®åºä» hbm.xml æ件中çæ DDLãä¸äºéè¦çä¿¡æ¯ ââ æ¯å¦name å±æ§çæ大é¿åº¦å¿é¡»æ¯ 60 个å­ç¬¦ï¼æè DDL åºè¯¥æ·»å é空约æ ââ é½è¢«ä» HibernateDoclet 项添å å° DDL 中ãå½ä½¿ç¨æ³¨éæ¶ï¼æ们å¯ä»¥ä»¥ç±»ä¼¼çæ¹å¼èªå¨çæ DDLã

尽管è¿ä¸¤ç§ä»£ç æ å°æ¹å¼é½å¯ä»¥ä½¿ç¨ï¼ä¸è¿æ³¨éçä¼å¿æ´ä¸ºææ¾ã使ç¨æ³¨éï¼å¯ä»¥ç¨ä¸äºå¸¸éæ¥æå®é¿åº¦æå¶ä»å¼ãç¼è¯å¾ªç¯çé度æ´å¿«ï¼å¹¶ä¸ä¸éè¦çæ XML æ件ãå¶ä¸­æ大çä¼å¿æ¯å¯ä»¥è®¿é®ä¸äºæç¨ä¿¡æ¯ï¼ä¾å¦è¿è¡æ¶çé空注éæé¿åº¦ãé¤äºæ¸å 2 ç»åºç注éä¹å¤ï¼è¿å¯ä»¥æå®ä¸äºéªè¯ç约æãæåå«çé¨å约æå¦ä¸ï¼

@Max(value = 100) @Min(value = 0) @Past @Future @Email

å¨éå½æ¡ä»¶ä¸ï¼è¿äºæ³¨éä¼å¼èµ·ç± DDL çææ£æ¥çº¦æãï¼æ¾ç¶ï¼@Future 并ä¸æ¯ä¸ä¸ªéå½çæ¡ä»¶ãï¼è¿å¯ä»¥æ ¹æ®éè¦å建å®å¶çº¦æ注éã

éªè¯ååºç¨ç¨åºå±

ç¼åéªè¯ä»£ç æ¯ä¸ä¸ªç¦äººä¸èæ¶çè¿ç¨ãé常ï¼å¾å¤å¼å人åé½ä¼æ¾å¼å¨ç¹å®çå±è¿è¡æææ§éªè¯ï¼ä»èå¯ä»¥èçä¸äºæ¶é´ï¼ä½æ¯æèççæ¶é´æ¯å¦è½å¤å¼¥è¡¥å¨è¿ä¸ªå°æ¹å å¿½ç¥é¨ååè½æå¼èµ·ç缺é·å´é常å¼å¾æ¢è®¨ãå¦æå¨ææåºç¨ç¨åºå±ä¸­å建并维æ¤éªè¯æéè¦çæ¶é´å¯ä»¥æ大å°åå°ï¼é£ä¹äºè®ºçç¦ç¹å°±ä¼è½¬åæ¯å¦è¦å¨å¤ä¸ªå±æ¬¡ä¸­è¿è¡æææ§éªè¯ãå设æä¸ä¸ªåºç¨ç¨åºï¼å®è®©ç¨æ·ä½¿ç¨ä¸ä¸ªç¨æ·åãå¯ç åä¿¡ç¨å¡å·æ¥å建ä¸ä¸ªå¸å·ãå¨è¿ä¸ªåºç¨ç¨åºä¸­æå¸æè¿è¡éªè¯çç»ä»¶å¦ä¸ï¼

è§å¾ï¼ éè¿ JavaScript è¿è¡éªè¯å¯ä»¥é¿åä¸æå¡å¨åå¤è¿è¡äº¤äºï¼è¿æ ·å¯ä»¥æä¾æ´å¥½çç¨æ·ä½éªãç¨æ·å¯ä»¥ç¦ç¨ JavaScriptï¼å æ­¤è¿ä¸ªå±æ¬¡çéªè¯æ好è¦æï¼ä½æ¯å´å¹¶ä¸å¯é ã对æéè¦çåè¿è¡ç®åçéªè¯æ¯å¿é¡»çã æ§å¶å¨ï¼ éªè¯å¿é¡»å¨æå¡å¨ç«¯çé»è¾ä¸­è¿è¡å¤çãè¿ä¸ªå±æ¬¡ä¸­ç代ç å¯ä»¥ä»¥éåæ个ç¹å®ç¨éçæ¹å¼å¤çéªè¯ãä¾å¦ï¼å¨æ·»å æ°ç¨æ·æ¶ï¼æ§å¶å¨å¯ä»¥å¨è¿è¡å¤çä¹åæ£æ¥æå®çç¨æ·åæ¯å¦å·²ç»å­å¨ã æå¡ï¼ ç¸å¯¹å¤æçä¸å¡é»è¾éªè¯é常é½æéåæ¾å°æå¡å±ä¸­ãä¾å¦ï¼ä¸æ¦æä¸ä¸ªä¿¡ç¨å¡å¯¹è±¡çèµ·æ¥ææï¼å°±åºè¯¥ä½¿ç¨ä¿¡ç¨å¡å¤çæå¡å¯¹è¿ä¸ªä¿¡ç¨å¡çä¿¡æ¯è¿è¡ç¡®è®¤ã DAOï¼ å¨æ°æ®å°è¾¾è¿ä¸ªå±æ¬¡æ¶ï¼åºè¯¥å·²ç»æ¯ææçäºã尽管å¦æ­¤ï¼æ§è¡ä¸æ¬¡å¿«éæ£æ¥ä»èç¡®ä¿æéè¦çåé½é空并ä¸å¼ä¹é½å¨ç¹å®çèå´æéµå¾ªç¹å®çæ ¼å¼ï¼ä¾å¦ e-mail å°ååå°±åºè¯¥åå«ä¸ä¸ªææç e-mail å°åï¼ä¹æ¯é常æççãå¨æ­¤å¤æè·é误æ»æ¯äº§çå¯ä»¥é¿åç SQLException é误è¦å¥½ã DBMSï¼ è¿æ¯é常å¯ä»¥å¿½ç¥éªè¯çå°æ¹ãå³ä½¿å½åæ­£å¨æ建çåºç¨ç¨åºæ¯æ°æ®åºçæä¸å®¢æ·æºï¼å°æ¥è¿å¯è½ä¼æ·»å å¶ä»å®¢æ·æºãå¦æåºç¨ç¨åºæä¸äº bugï¼å¤§é¨ååºç¨ç¨åºé½å¯è½ä¼æ bugï¼ï¼é£ä¹æ æçæ°æ®ä¹å¯è½ä¼è¢«åéç»æ°æ®åºãå¨è¿ç§æåµä¸­ï¼å¦æèµ°è¿ï¼å°±å¯ä»¥æ¾å°æ æçæ°æ®ï¼å¹¶ä¸éè¦åæè¿äºæ°æ®æ¯å¦å¯ä»¥æ¸é¤ï¼ä»¥åå¦ä½æ¸é¤ã 模åï¼ è¿æ¯è¿è¡éªè¯çä¸ä¸ªçæ³å°æ¹ï¼å®ä¸éè¦è®¿é®å¤é¨æå¡ï¼ä¹ä¸éè¦äºè§£æä¹æ§æ°æ®ãä¾å¦ï¼æä¸å¡é»è¾å¯è½ä¼è¦æ±ç¨æ·è³å°æä¾ä¸ä¸ªè系信æ¯ï¼è¿å¯ä»¥æ¯ä¸ä¸ªçµè¯å·ç ä¹å¯ä»¥æ¯ä¸ä¸ª e-mail å°åï¼å¯ä»¥ä½¿ç¨æ¨¡åå±çéªè¯æ¥ç¡®ä¿ç¨æ·çç¡®æä¾äºè¿ç§ä¿¡æ¯ã

è¿è¡éªè¯çä¸ç§å¸åæ¹æ³æ¯å¯¹ç®åçéªè¯ä½¿ç¨ Commons Validatorï¼å¹¶å¨æ§å¶å¨ä¸­ç¼åå¶ä»ä¸äºéªè¯é»è¾ãCommons Validator å¯ä»¥çæ JavaScript æ¥å¯¹è§å¾ä¸­çéªè¯è¿è¡å¤çãä½æ¯ Commons Validator ä¹æèªå·±ç缺é·ï¼å®åªè½å¤çç®åçéªè¯é®é¢ï¼å¹¶ä¸å°éªè¯çä¿¡æ¯é½ä¿å­å°äº XML æ件中ãCommons Validator 被设计ç¨æ¥ä¸ Struts ä¸èµ·ä½¿ç¨ï¼èä¸æ²¡ææä¾ä¸ç§ç®åçæ¹æ³å¨åºç¨ç¨åºå±é´éç¨éªè¯ç声æã

å¨è§åæææ§éªè¯ç­ç¥æ¶ï¼éæ©å¨é误åçæ¶ç®åå°å¤çè¿äºé误æ¯è¿è¿ä¸å¤çãä¸ç§è¯å¥½ç设计åæ¶è¿è¦éè¿çæä¸ä¸ªå好çç¨æ·çé¢æ¥é²æ­¢åºç°é误ãéç¨é¢åè¿è¡çæ¹æ³è¿è¡éªè¯å¯ä»¥æ大å°å¢å¼ºç¨æ·å¯¹äºåºç¨ç¨åºçç解ãä¸å¹¸çæ¯ï¼Commons Validator 并没æ对此æä¾æ¯æãå设å¸æ HTML æ件设置ææ¬åç maxlength å±æ§æ¥ä¸éªè¯å¹éï¼æèå¨ææ¬åä¹åæ¾ä¸ä¸ä¸ªç¾åå·ï¼%ï¼æ¥è¡¨ç¤ºè¦è¾å¥ç¾åæ¯çå¼ãé常ï¼è¿äºä¿¡æ¯é½è¢«ç¡¬ç¼åå° HTML æ档中äºãå¦æå³å®ä¿®æ¹ name å±æ§æ¥æ¯æ 75 个å­ç¬¦ï¼èä¸æ¯ 60 个å­ç¬¦ï¼é£ä¹éè¦æ¹å¨å¤å°å°æ¹å¢ï¼å¨å¾å¤åºç¨ç¨åºä¸­ï¼é常é½éè¦ï¼

æ´æ° DDL æ¥å¢å¤§æ°æ®åºåçé¿åº¦ï¼éè¿ HibernateDocletã hbm.xml æ Hibernate Annotationsï¼ã æ´æ° Commons Validator XML æ件å°æ大å¼å¢å å° 75ã æ´æ°ææä¸è¿ä¸ªåæå³ç HTML 表åï¼ä»¥ä¿®æ¹ maxlength å±æ§ã

æ´å¥½çæ¹æ³æ¯ä½¿ç¨ Hibernate Validatorãéªè¯çå®ä¹é½è¢«éè¿æ³¨é æ·»å å°äºæ¨¡åå±ä¸­ï¼åæ¶è¿æ对æåå«çéªè¯å¤ççæ¯æãå¦æéæ©ååå©ç¨ææç Hibernateï¼è¿ä¸ª Validator å°±å¯ä»¥å¨ DAO å DBMS å±ä¹æä¾éªè¯ãå¨ä¸é¢ç»åºçæ ·ä¾ä»£ç ä¸­ï¼å°ä½¿ç¨ reflection å JSP 2.0 æ ç­¾æ件å¤æ§è¡ä¸ä¸ªæ­¥éª¤ï¼ä»èååå©ç¨æ³¨é 为è§å¾å±å¨æçæ代ç ãè¿å¯ä»¥æ¸é¤å¨è§å¾ä¸­ä½¿ç¨ç硬ç¼åçä¸å¡é»è¾ã

å¨æ¸å 3 中ï¼dateOfBirth 被注é为 NotNull åè¿å»çæ¥æã Hibernate ç DDL çæ代ç å¯¹è¿ä¸ªåæ·»å äºä¸ä¸ªé空约æï¼ä»¥åä¸ä¸ªè¦æ±æ¥æå¿é¡»æ¯ä¹åæ¥æçæ£æ¥çº¦æãe-mail å°åä¹æ¯é空çï¼å¿é¡»å¹é e-mail å°åçæ ¼å¼ãè¿ä¼çæä¸ä¸ªé空约æï¼ä½æ¯ä¸ä¼çæå¹éè¿ç§æ ¼å¼çæ£æ¥çº¦æã

æ¸å 3. éè¿ Hibernate Annotations è¿è¡æ å°çç®åèç³»æ¹å¼ /** * A Simplified object that stores contact information. * * @author Ted Bergeron * @version $Id: Contact.java,v 1.1 2006/04/24 03:39:34 ted Exp $ */ @MappedSuperclass @Embeddable public class Contact implements Serializable { public static final int MAX_FIRST_NAME = 30; public static final int MAX_MIDDLE_NAME = 1; public static final int MAX_LAST_NAME = 30; private String fname; private String mi; private String lname; private Date dateOfBirth; private String emailAddress; private Address address; public Contact() { this.address = new Address(); } @Valid @Embedded public Address getAddress() { return address; } public void setAddress(Address a) { if (a == null) { address = new Address(); } else { address = a; } } @NotNull @Length(min = 1, max = MAX_FIRST_NAME) @Column(name = "fname") public String getFirstname() { return fname; } public void setFirstname(String fname) { this.fname = fname; } @Length(min = 1, max = MAX_MIDDLE_NAME) @Column(name = "mi") public String getMi() { return mi; } public void setMi(String mi) { this.mi = mi; } @NotNull @Length(min = 1, max = MAX_LAST_NAME) @Column(name = "lname") public String getLastname() { return lname; } public void setLastname(String lname) { this.lname = lname; } @NotNull @Past @Column(name = "dob") public Date getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(Date dateOfBirth) { this.dateOfBirth = dateOfBirth; } @NotNull @Email @Column(name = "email") public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } æ ·ä¾åºç¨ç¨åº å¨ ä¸è½½ ä¸èï¼æ¨å¯ä»¥ä¸è½½ä¸ä¸ªæ ·ä¾åºç¨ç¨åºï¼å®å±ç¤ºäºæ¬æ中éç¨ç设计ææ³å代ç ãç±äºè¿æ¯ä¸ä¸ªå¯ä»¥å·¥ä½çåºç¨ç¨åºï¼å æ­¤ä»£ç æ¯æ¬æ中讨论ççå容æ´ä¸ºå¤æãä¾å¦ï¼æ¸å 9 å°±èéäºæ ç­¾æ件 text.tagï¼è¿ä¸ªæ ·ä¾åºç¨ç¨åºå·ææ ç­¾æ件使ç¨çææ代ç ï¼ä»¥åå¶ä»ä¸ä¸ªç±»ä¼¼çæ ç­¾æ件使ç¨ç代ç ï¼ç¨äºéæ©ãéèåæ£æ¥æ¡ç HTML åç´ ï¼ãç±äºè¿æ¯ä¸ä¸ªå¯ä»¥å·¥ä½çåºç¨ç¨åºï¼å®åå«äºä¸ä¸ªå¨è¿ç§ç±»åçåºç¨ç¨åºä¸­é½å¯ä»¥æ¾å°çæ¶æãè¿æä¸ä¸ª Ant æ建æ件ãSpring å Hibernate XML å°è£ä»£ç ï¼ä»¥å log4j éç½®ãè½ç¶è¿äºé½ä¸æ¯æ¬æä»ç»çéç¹ï¼ä½æ¯æ¨ä¼åç°ä»ç»ç ç©¶ä¸ä¸è¿ä¸ªæ ·ä¾åºç¨ç¨åºçæºä»£ç æ¯é常æç¨çã

å¦æéè¦ï¼Hibernate DAO å®ç°ä¹å¯ä»¥ä½¿ç¨ Validation Annotationsãæéåçæ¯å¨ hibernate.cfg.xml æ件中æå®åºäº Hibernate äºä»¶çéªè¯è§åãï¼æ´å¤ä¿¡æ¯è¯·åè Hibernate Validator çææ¡£ï¼å¯ä»¥å¨ åèèµæ ä¸è中æ¾å°ç¸å³çé¾æ¥ï¼ãå¦æçå°å¸ææè¿è·¯ï¼æ¨å¯ä»¥åªæè·æå¡ææ§å¶å¨ä¸­ç InvalidStateException å¼å¸¸ï¼å¹¶å¾ªç¯éå InvalidValue æ°ç»ã

对æ§å¶å¨æ·»å éªè¯

è¦æ§è¡éªè¯ï¼éè¦å建ä¸ä¸ª Hibernate ç ClassValidator å®ä¾ãè¿ä¸ªç±»è¿è¡å®ä¾åç代价å¯è½ä¼å¾é«ï¼å æ­¤æ好åªå¯¹å¸æè¿è¡éªè¯çæ¯ä¸ªç±»æ¥è¿è¡å®ä¾åãä¸ç§æ¹æ³æ¯å建ä¸ä¸ªå®ç¨å·¥å·ç±»ï¼å¯¹æ¯ä¸ªæ¨¡å对象å­å¨ä¸ä¸ª ClassValidator å®ä¾ï¼å¦æ¸å 4 æ示ï¼

æ¸å 4. å¤çéªè¯çå®ç¨å·¥å·ç±» /** * Handles validations based on the Hibernate Annotations Validator framework. * @author Ted Bergeron * @version $Id: AnnotationValidator.java,v 1.5 2006/01/20 17:34:09 ted Exp $ */ public class AnnotationValidator { private static Log log = LogFactory.getLog(AnnotationValidator.class); // It is considered a good practice to execute these lines once and // cache the validator instances. public static final ClassValidator CUSTOMER_VALIDATOR = new ClassValidator(Customer.class); public static final ClassValidator CREDIT_CARD_VALIDATOR = new ClassValidator(CreditCard.class); private static ClassValidator 1.0 form formtags text /WEB-INF/tags/form/text.tag determine if field is required from Annotations required com.triview.web.Utilities Boolean required(java.lang.Object,java.lang.String)

æ¸å 7 èéèª Utilities ç±»ï¼å¶ä¸­åå«äºæ ç­¾æ件使ç¨çææå½æ°ãå¨åæ中æ们æ¾ç»è¯´è¿ï¼æéåä½¿ç¨ Java 代ç ç¼åç代ç é½è¢«æ¾å°äºå ä¸ª TLD å¯ä»¥æ å°çå½æ°ä¸­ï¼è¿æ ·æ ç­¾æ件就å¯ä»¥ä½¿ç¨å®ä»¬äºï¼è¿äºå½æ°é½æ¯å¨ Utilities 类中è¿è¡ç¼ç çãå æ­¤ï¼æ们éè¦ä¸æ ·ä¸è¥¿ï¼å®ä¹è¿äºç±»ç TLD æ件ãUtilities 中çå½æ°ï¼ä»¥åæ ç­¾æ件æ¬èº«ï¼åèè¦ä½¿ç¨è¿äºå½æ°ãï¼ç¬¬åæ ·åºè¯¥æ¯ä½¿ç¨è¿ä¸ªæ ç­¾æ件ç JSP 页é¢ãï¼

å¨æ¸å 7 中ï¼ç»åºäºå¨ TLD 中å¼ç¨çå½æ°åå¦å¤ä¸ä¸ªè¡¨ç¤ºç»å®å±æ§æ¯å¦æ¯ Date çæ¹æ³ãå¨è¿ä¸ªç±»ä¸­è¦æ¶åå°æ¯è¾å¤ç代ç ï¼ä½æ¯æ¬æéäºç¯å¹ï¼ä¸ä¼ç»åºææç代ç ï¼ä¸è¿éè¦æ³¨æ findGetterMethod() é¤äºå°è¡¨è¾¾å¼è¯­è¨ï¼Expression Languageï¼ELï¼æ¹æ³è¡¨ç¤ºï¼customer.contactï¼è½¬æ¢æ Java 表示ï¼customer.getContact()ï¼ä¹å¤ï¼è¿æ§è¡äºåºæ¬çæ åæä½ã

æ¸å 7. Utilities èé public static Boolean required(Object object, String propertyPath) { Method getMethod = findGetterMethod(object, propertyPath); if (getMethod == null) { return null; } else { return getMethod.isAnnotationPresent(NotNull.class); } } public static Boolean isDate(Object object, String propertyPath) { return java.util.Date.class.equals(getReturnType(object, propertyPath)); } public static Class getReturnType(Object object, String propertyPath) { Method getMethod = findGetterMethod(object, propertyPath); if (getMethod == null) { return null; } else { return getMethod.getReturnType(); } }

æ­¤å¤å¯ä»¥æ¸æ¥å°çå°å¨è¿è¡æ¶ä½¿ç¨ Validation annotations æ¯å¤ä¹å®¹æãå¯ä»¥ç®åå°å¼ç¨å¯¹è±¡ç getter æ¹æ³ï¼å¹¶æ£æ¥è¿ä¸ªæ¹æ³æ¯å¦æç¸å³çç»å®ç注é ã

æ¸å 8 中ç»åºç JSP ä¾å­è¿è¡äºç®åï¼è¿æ ·å°±å¯ä»¥çéæ¥çç¸å³çé¨åäºãæ­¤å¤ï¼è¿éæä¸ä¸ªè¡¨åï¼å®æä¸ä¸ªéæ©æ¡å两个è¾å¥åãææè¿äºåé½æ¯éè¿å¨ form.tld æ件中声æçæ ç­¾æ件è¿è¡åç°çãæ ç­¾æ件被设计æ使ç¨æºè½ç¼ºçå¼ï¼è¿æ ·å°±å¯ä»¥æ ¹æ®éè¦å许ç®åç¼ç ç JSP å¯ä»¥æå®ä¹æ´å¤ä¿¡æ¯çé项ãå³é®çå±æ§æ¯ propertyPathï¼å®ä½¿ç¨ EL 符å·å°è¿ä¸ªåæ å°ä¸ºæ¨¡åå±å±æ§ï¼å°±åæ¯ä½¿ç¨ Spring MVC ç bind æ ç­¾ä¸æ ·ã

æ¸å 8. ä¸ä¸ªåå«è¡¨åçç®å JSP é¡µé¢ Help

text.tag æ件çå®æ´æºä»£ç å¤ªå¤§äºï¼ä¸å¥½æ¾å¨è¿å¿ï¼å æ­¤æ¸å 9 ç»åºäºå¶ä¸­å³é®çé¨åï¼

æ¸å 9. æ ç­¾æ件 text.tag èé calendar Calendar.setup( { inputField : "${status.expression}", // ID of the input field ifFormat : "%m/%d/%Y", // the date format button : "${status.expression}_button" // ID of the button } );

error${status.errorMessage}

æ们马ä¸å°±å¯ä»¥çåº propertyPath æ¯æä¸éè¦çå±æ§ãsizeã maxlength å required é½å¯ä»¥å¿½ç¥ãobjectPath var è¢«è®¾ç½®ä¸ºå¨ propertyPath 中å¼ç¨çå±æ§çç¶å¯¹è±¡ãå æ­¤ï¼å¦æ propertyPath æ¯ customer.contact.fax.numberï¼ é£ä¹ objectPath å°±åºè¯¥è¢«è®¾ç½®ä¸º customer.contact.faxãæ们ç°å¨å°±ä½¿ç¨ Spring ç bind æ ç­¾ç»å®å°äºåå«å±æ§ç对象ä¸ãè¿ä¼å°å¯¹è±¡åé设置æ对åå«å±æ§çå®ä¾çå¼ç¨ãæ¥ä¸æ¥ï¼æ£æ¥è¿ä¸ªæ ç­¾çç¨æ·æ¯å¦å·²ç»æå®ä»/她们æ¯å¦å¸æå±æ§æ¯å¿é¡»çãå许表åå¼å人åè¦çä»æ³¨é中è¿åçå¼æ¯é常éè¦çï¼å ä¸ºææ¶ä»/她们å¸æ让æ§å¶å¨ä¸ºæéè¦çå设置缺çå¼ï¼èç¨æ·å¯è½å¹¶ä¸å¸æ为è¿ä¸ªåæä¾å¼ãå¦æ表åå¼å人å没æ为 required æå®å¼ï¼é£ä¹å°±å¯ä»¥è°ç¨è¿ä¸ªè¡¨å TLD ç required å½æ°ãè¿ä¸ªå½æ°è°ç¨äºå¨ TLD æ件中æ å°çæ¹æ³ãè¿ä¸ªæ¹æ³ç®åå°æ£æ¥ @NotNull 注éï¼å¦æå®åç°æ个å±æ§å·æè¿ä¸ªæ³¨éï¼å°±å° labelClass åé设置为å¿é¡»çãå¯ä»¥ç±»ä¼¼å°ç¡®å®æ­£ç¡®ç maxlength 以åè¿ä¸ªåæ¯å¦æ¯ä¸ä¸ª Dateã

æ¥ä¸æ¥ä½¿ç¨ Spring æ¥ç»å®å° propertyPath ä¸ï¼èä¸æ¯ååé¢ä¸æ ·åªç»å®å°åå«è¿ä¸ªå±æ§ç对象ä¸ãè¿å许å¨çæ label å input HTML æ ç­¾æ¶ä½¿ç¨ status.expression å status.valueã input æ ç­¾ä¹å¯ä»¥ä½¿ç¨ä¸ä¸ªå¤§å° maxlength 以åéå½çç±»æ¥çæãå¦æåé¢å·²ç»ç¡®å®å±æ§æ¯ä¸ä¸ª Dateï¼ç°å¨å°±å¯ä»¥æ·»å  JavaScript æ¥åäºãï¼å¯ä»¥å¨ åèèµæ ä¸èæ¾å°ä¸ä¸ªå¾å¥½çæ¥åç»ä»¶çé¾æ¥ï¼ã注ææ ¹æ®éè¦é¾æ¥å±æ§ãè¾å¥ ID åå¾å ID çæ ç­¾æ¯å¤ä¹ç®åãï¼è¿ä¸ª JavaScript æ¥åéè¦ä¸ä¸ªå¾å ID æ¥å¹éè¾å¥åï¼å¶åç¼æ¯ _buttonã

æåï¼å¯ä»¥å° å°è£å°ä¸ä¸ª span æ ç­¾ä¸­ï¼è¿æ ·å许表åå¼å人åå¨é¡µé¢ä¸­æ·»å å¶ä»å¾æ ï¼ä¾å¦ç¨æ¥å¯»æ±å¸®å©çå¾æ ãï¼æ¸å 8 ç»åºäºä¸ä¸ªä¸ºä¿¡ç¨å¡å·åæ·»å ç帮å©å¾æ ãï¼æåçé¨åæ¯æ£æ¥ Spring æ¯å¦ä¸ºè¿ä¸ªå±æ§æ¥ååæ¾ç¤ºäºä¸ä¸ªé误ï¼å¹¶åä¸ä¸ªé误å¾æ ä¸èµ·æ¾ç¤ºã

ä½¿ç¨ CSSï¼å°±å¯ä»¥å¯¹å¿é¡»çåè¿è¡ä¸ä¸è£é¥° ââ ä¾å¦ï¼è®©å®ä»¬ä»¥çº¢è²æ¾ç¤ºãå¨ææ¬è¾¹ä¸æ¾ç¤ºä¸ä¸ªæå·ï¼æè使ç¨ä¸ä¸ªèæ¯å¾åæ¥è£é¥°å®ãå¨æ¸å 10 中ï¼å°å¿é¡»çåçæ ç­¾è®¾ç½®æé»è²ï¼èä¸åé¢æ¾ç¤ºä¸ä¸ªçº¢è²çæå·ï¼å¨ Firefox 以åå¶ä»æ åå¼å®¹çæµè§å¨ä¸­ï¼ï¼å¦ææ¯å¨ IE 中åè¿ä¼å¨å·¦è¾¹å ä¸ä¸ä¸ªå°æå­çèæ¯å¾åï¼

æ¸å 10. 对å¿é¡»åè¿è¡è£é¥°ç CSS ä»£ç  label.required { color: black; background-image: url( /images/icons/flag_red.png ); background-position: left; background-repeat: no-repeat; } label.required:after { content: '*'; } label.optional { color: black; }

æ¥æè¾å¥åèªå¨ä¼å¨å³è¾¹æ¾ä¸ä¸ä¸ª JavaScript æ¥åå¾æ ã对ææçææ¬å设置正确ç maxlength å±æ§å¯ä»¥é²æ­¢ç¨æ·è¾å¥å¤ªå¤ææ¬æå¼èµ·çé误ãå¯ä»¥æ©å± text æ ç­¾æ¥ä¸ºè¾å¥å类设置å¶ä»çæ°æ®ç±»åãå¯ä»¥ä¿®æ¹ text æ ç­¾ä½¿ç¨ HTMLï¼èä¸æ¯ XHTMLï¼å¦æå¸æè¿æ ·ï¼ãå¯ä»¥ä¸å¤ªè´¹åå°è·å¾å·æ正确语ä¹ç HTML 表åï¼èä¸ä¸é学习åºäºç»ä»¶çæ¡æ¶ç¥è¯ï¼å°±å¯ä»¥å©ç¨åºäºç»ä»¶ç Web æ¡æ¶çä¼ç¹ã

尽管æ ç­¾æ件çæç HTML æ件å¯ä»¥å¸®å©é²æ­¢ä¸äºé误ç产çï¼ä½æ¯å¨è§å¾å±å¹¶æ²¡æä»»ä½ä»£ç æ¥çæ­£è¿è¡é误æ£æ¥ãç±äºå¯ä»¥ä½¿ç¨ç±»å±æ§ï¼ç°å¨å°±å¯ä»¥æ·»å ä¸äºç®åç JavaScript æ¥å®ç°è¿ç§åè½äºï¼å¦æ¸å 11 æ示ãè¿éç JavaScript ä¹å¯ä»¥æ¯éç¨çï¼å¨ä»»ä¸è¡¨å中é½å¯ä»¥éç¨ã

æ¸å 11. ç®åç JavaScript éªè¯ç¨åº function checkRequired(form) { var requiredLabels = document.getElementsByClassName("required", form); for (i = 0; i < requiredLabels.length; i++) { var labelText = requiredLabels[i].firstChild.nodeValue; // Get the label's text var labelFor = requiredLabels[i].getAttribute("for"); // Grab the for attribute var inputTag = document.getElementById(labelFor); // Get the input tag if (inputTag.value == null || inputTag.value == "") { alert("Please make sure all required fields have been entered."); return false; // Abort Submit } } return true; }

è¿ä¸ª JavaScript æ¯éè¿ä¸ºè¡¨å声ææ·»å  onsubmit="return checkRequired(this);" 被è°ç¨çãè¿ä¸ªèæ¬ç®åå°è·åå·ææéè¦çç±»ç表å中çææåç´ ãç±äºæ们çä¹ æ¯æ¯å¨æ ç­¾æ è®°ä¸­ä½¿ç¨è¿ä¸ªç±»ï¼å æ­¤ä»£ç ä¼éè¿ for å±æ§æ¥æ¥æ¾ä¸è¿ä¸ªæ ç­¾è¿æ¥å¨ä¸èµ·çè¾å¥åãå¦æä»»ä½è¾å¥å为空ï¼å°±ä¼çæä¸æ¡ç®åçè­¦åæ¶æ¯ï¼è¡¨åæ交就ä¼åæ¶ãå¯ä»¥ç®åå°å¯¹è¿ä¸ªèæ¬è¿è¡æ©åï¼ä½¿å¶æ«æå¤ä¸ªç±»ï¼å¹¶ç¸åºå°è¿è¡éªè¯ã

对äºåºäº JavaScript ç综åçéªè¯éåæ¥è¯´ï¼æ好æ¯ä½¿ç¨å¼æºå®ç°ï¼èä¸æ¯èªè¡å¼åãå¨æ¸å 8 中æ¨å¯è½å·²ç»æ³¨æå°ä¸é¢ç代ç ï¼

οnclick="new Effect.SlideDown('creditCardHelp')"

è¿ä¸ªå½æ°æ¯ Script.aculo.us åºçä¸é¨åï¼è¿ä¸ªåºæä¾äºå¾å¤é«çº§çææãå¦ææ­£å¨ä½¿ç¨ Script.aculo.usï¼å°±éè¦å¯¹ææ建çåå®¹ä½¿ç¨ Prototype åºã JavaScript éªè¯åºçä¸ä¸ªä¾å­æ¯ç± Andrew Tetlaw å¨ Prototype åºç¡ä¸æ建çãï¼è¯·åç åèèµæ ä¸è中çé¾æ¥ãï¼ä»çæ¡æ¶ä¾èµäºè¢«æ·»å å°è¾å¥åçç±»ï¼

å¯ä»¥ç®åå°ä¿®æ¹ text.tag çé»è¾å¨ input æ ç­¾ä¸­æå¥å ä¸ªç±»ãå° class="required" æ·»å å°è¾å¥æ ç­¾å label æ ç­¾ä¸­ä¸ä¼å½±å CSS è§åï¼ä½ä¼ç ´åæ¸å 10 中ç»åºçç®å JavaScript éªè¯ç¨åºãå¦æè¦æ··å使ç¨æ¡æ¶ä¸­ç代ç åç®åç JavaScript 代ç ï¼æ好使ç¨ä¸åçç±»åï¼æå¨ä½¿ç¨ç±»åæç´¢åç´ æ¶ç¡®ä¿ç±»åææ并æ£æ¥æ ç­¾ç±»åã



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有