1.完成功能的步骤
1.1.明白要做的功能,并设计出所涉及到的实体。
1,设计实体有两种方式:正向工程和反向工程。我们使用正向工程。
a)正向工程是设计实体对象,并写映射文件,然后通过工具生成表结构(实体
→hbm.xml→表结构)。
b)反向工程是设计表结构,然后通过工具生成映射文件和实体对象(表结构
→hbm.xml→实体)。
2,关于设计实体对象,考虑这几个问题:
a)有几个实体?
b)实体间是什么关系?(一对多、多对一、多对多、一对一)
c)每个实体分别有什么属性?
3,关于实体中的属性设计,考虑这几个问题:
a)主键。
b)关联关系属性(一个关系有两端,一端是一个属性)。
c)普通属性(一般为添加表单中要填写的数据,或列表、查看等页面中显示的数据)
d)为实现某功能而设计的属性(遇到问题后才能设计出这样的属性,因为他是为解决
这个问题而设计的)。
4,步骤:设计实体→ Java Bean → hbm.xml →表结构
1.2.分析一组相关的功能并做准备工作(创建类并配置等)
1,分析一组相关的功能,分析到每个请求的粒度。这样就可以写出要处理几个请求。一组相关的功能用一个DispatchAction,其中的一个方法就对应一个请求的处理操作。
这一步做了:确定Action中方法名,各要做什么事、返回什么页面。
2,定义出Action、ActionForm、JSP并配置:
a)Acton要继承DispatchAction。
b)在struts-config.xml配置Action、ActionForm、ActionForward。
3,定义出Service并配置(Service中将放一组相关业务方法):
a)Service接口要继承BaseDao,以有增删改查的基本方法。
b)Service的实现类要继承BaseDaoImpl,以有增删改查的方法实现。
c)在BeanFactory.properties中配置这个Service。以便让工厂生成实例。
d)在Action中引用这个Service。
1.3.完成一组相关的功能并进行测试
1,完成DispatchAction方法中的代码,需要使用的业务方法如果没有,就在Service 中定义出,然后写上注释,以确定Service要做什么。
2,完成Service方法中的代码,并进行单元测试。
3,完成用到的Jsp页面(把HTML静态页面改为JSP动态页面)。
4,发布到Tomcat下并进行测试。
2.Hibernate实体映射
2.1. 映射方法
一、前提:
1,要明白实体之间的关系
2,要明白各种关联关系对应的表结构。(一对多、多对一、一对一、多对多)
二、映射方法:
1,在关联关系属性上写出注释:“我(当前对象)与User(关联对象)的多对一(关系)”2,根据关系从下表中拷贝模板并填空
2.2. 映射模板对照表
说明:
1,集合表:集合属性中的元素所在的表。
2,集合外键:集合表中引用我的主键值的那个外键3,多对多时,要有一边有inverse=”true”
3.CRUD操作的流程
相关资源的定义:
说明:
1,方法名是指的DispatchAction中的方法名。2,ActionForward的名称
Service层直接继承BaseDaoImpl,省略DAO层!
3.1.列表显示
3.2.删除
3.3.添加
3.4.修改
1,只要传递了某参数,并且ActionForm中有相应的属性,就会封装到ActionForm中,不管是什么方式(GET或POST)。
3.5.添加和修改可以使用一个页面
在添加与修改页面基本一致的情况下,可以使用同一个页面。这时需要计算出要传递的method参数的值,即指定
1.${param.id eq null ? 'add' : 'edit'}
2.或使用:${fn:startsWith(param.method, "add") ? 'add' : 'edit'}
如果使用第二种方式,还需要导入fn自已定标签,如下:
<%@ taglib prefix="fn" uri="https://www.sodocs.net/doc/814089094.html,/jsp/jstl/functions" %> 3.6.使用commons.jspf
把每个页面中都要用到的引入自定义标签库、js文件与css文件等代码放到一个文件中,起名叫commons.jspf。每个页面只需要使用include指令把这个页面包含进来,就不用重复的写代码了,如下:
<%@include file="/WEB-INF/pages/Public/commons.jspf" %>
4.分页
4.1. 显示效果
在页面中要显示两块:1,当前页的数据列表。2,分页信息。分页信息如下图所示:
其中的页码列表,是最多显示当前页附近的共10个页码。效果如下:
说明:蓝色标出的为当前页。
============= 本页的数据列表 =============
...
============= 分页信息 ===================
页次:${currentPage}/${pageCount}页
每页显示:${pageSize}条
总记录数:${recordCount}条
转到:
>
function gotoPage( pageNum ){
// window.location.href = "/xx.do?method=list&pageNum=" + pageNum;
document.forms[0].pageNum.value = pageNum;
document.forms[0].submit();
}
4.2. 代码重用
1,分页的页面代码重用:使用<%include%>包含分页信息显示代码。但分页用的地址是不同的,解决方法是在包含页面中有一个表单,提交到相应的显示地址,其中的一个参数是pageNum,转到哪一页就是修改这个字段的值并提交表单。
2,分页的计算逻辑重用:把计算的逻辑放到PageView构造方法中,只接受几个必须参数。
4.3. 设计PageView对象
在页面中要显示很多数据,我们可以把要显示的数据都封装到一个对象中。设计PageView对象如下:
public class PageView {
// 用户指定(或配置)
private int currentPage; // 当前页
private int pageSize; // 每页显示的数据的数量
// 从数据库中查询
private int recordCount; // 总记录数
private List recordList; // 当前页的数据列表
// 计算
private int pageCount; // 总页码
private int startPageIndex; // 显示的页码列表的开始索引
private int endPageIndex; // 显示的页码列表的结束索引
public PageView(int currentPage, int pageSize, int recordCount, List recordList) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.recordCount = recordCount;
this.recordList = recordList;
// ============== 计算 =============
// 1, 总页码
pageCount = (recordCount + pageSize - 1) / pageSize;
// 2, startPageIndex 与 endPageIndex
if (pageCount <= 10) {// a, 总页码不大于10页
startPageIndex = 1;
endPageIndex = pageCount;
}
else {// b, 总码大于10页
// 在中间,显示前面4个,后面5个
startPageIndex = currentPage - 4;
endPageIndex = currentPage + 5;
// 前面不足4个时,显示前10个页码
if (startPageIndex < 1) {
startPageIndex = 1;
endPageIndex = 10;
}
// 后面不足5个时,显示后10个页码
else if (endPageIndex > pageCount) {
endPageIndex = pageCount;
startPageIndex = pageCount - 10 + 1;
}
}
}
// getter, setter
}
4.4. 设计QueryBuilder
在Service中要查询recordCount与recordList,并封装为PageView返回。相关代码如下:
在每个分页的查询中,只是HQL语句与设置的参数不一样,其他代码都是一样。如果不想重复的写,就要设计一下了。
一、设计
我们希望最终的工具能够查询出PageView对象,可以满足不同情况下的查询:查询任意实体、可带各种过滤条件、可带各种排序条件。要解决的问题有两个,一是拼接HQL 语句,包括过滤条件的拼接与排序条件的拼接。二是设置相应的参数。
拼接HQL语句,需要拼接过滤条件与排序条件,并且能生查询一页数据的HQL与查询总记录数的HQL。(我们在写一个和Criteria类似的工具,只不过我们是生成HQL)。
一个HQL语句,可由以下几个部分组成:Select子句、From子句、Where子句、OrderBy子句。其中From子句是必须要有的,其他的都可以没有。我们写的工具类就是用于辅助生成这些子句的,并按顺序连接起来。
1,Select子句:如果不写,默认是查询整个对象。也可以指定只查询部分属性。
2,From子句:需要指定一个实体类型。
3,Where子句:可以是一个或多个约束条件,之间用AND或OR连接。如果有参数,还需要设置参数值。
4,OrderBy子句:可以指定多个用于排序的属性,指定ASC或DESC表示升序或降序。多个条件之间用逗号隔开。
根据以上分析,可以确定工具类如下所示:
说明:
1,可以把前三个方法的返回值改为QueryBuilder,实现时是返回this,这样用起来就方便了(方法调用链)。
2,方法queryCount与方法queryList可以直接查出相应的数据,方便使用。也可以使用toQueryCountHql或toQueryListHql方法得到相应的HQL语句(或把这两个方法设为private,因为这两个方法在外面不会被用到)。
二、实现
1,在生成From子句时,指定别名为”this”。这样在使用时,如果有与关键字冲突的属性,可以在前面加上这个别名。
2,生成查询总数量的HQL语句。前面加上SELECT COUNT(*)即可。
3,设置参数。使用问号的方式,把参数放到一个List
4,WHERE中的约束有以下几种:
a)无参数,如”parent IS NULL”。
b)有一个参数,如”type=?”。
c)有多个参数,如”BETWEEN ? AND ?”,(可以写成”>? AND ”)。
5.文件下载
// 定默认的文件名
String name = formTemplate.getName() + ".doc";
name = URLEncoder.encode(name, "utf-8"); // 解决中文文件名的乱码问题response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + name);
6.出现问题了,怎么办?
1.1.解决异常的方法
1,先看一下是什么异常。比如NullPointerException,是说明某行代码中的“.”前面的对象为null;或是异常https://www.sodocs.net/doc/814089094.html,ngClassNotFoundException,是找不到类异常。这时还要看异常的类型与后面的简单信息,如
https://www.sodocs.net/doc/814089094.html,ng.ClassNotFoundException: https://www.sodocs.net/doc/814089094.html,ng.String。说明是
https://www.sodocs.net/doc/814089094.html,ng.String这个类找不到。在这一步要搞清楚是什么错误。
2,找到出错的代码位置。
a)在异常信息中会显示出错时执行的代码是在哪一行,并且有超链接,点击就可以了。
b)错误不在Java代码中,如异常javax.servlet.ServletException:
https://www.sodocs.net/doc/814089094.html,mands.InvalidPathException: No action config found for the specified url.就是说访问的.do地址
没有进行Action配置,这时就知道应该打struts-config.xml。
3,根据异常类型进行推测,一般的异常就可以解决了。如NullPointerException,就找这一行中的“.”然后看是不是为null,如果是,找出某对象为null的原因,问题就解决了。
说明:
1,调试代码时,最好关闭所有其他的工程,在有多个工程代码相近的情况下尤其要这样做,比如有两个工程分别为ItcastOA_1、ItcastOA_2。否则可能会出现代码写错地方的情况,或是点击异常信息中的超链接,转到的是另外一个工程中的相同名称的类中。2,异常要看最下面的,即最后一个“Caused by:”,因为他是最里层的。上面的异常都是捕获某异常后包装后再次抛出的。例如:
https://www.sodocs.net/doc/814089094.html,ng.RuntimeException: javax.servlet.ServletException:
https://www.sodocs.net/doc/814089094.html,ng.RuntimeException: https://www.sodocs.net/doc/814089094.html,ng.NullPointerException ... Caused by: javax.servlet.ServletException:
https://www.sodocs.net/doc/814089094.html,ng.RuntimeException: https://www.sodocs.net/doc/814089094.html,ng.NullPointerException ... Caused by: https://www.sodocs.net/doc/814089094.html,ng.RuntimeException:
https://www.sodocs.net/doc/814089094.html,ng.NullPointerException ...
Caused by: https://www.sodocs.net/doc/814089094.html,ng.NullPointerException ...
我们要解决的异常是最后一个Caused by,上面的都是包装后又抛出的,例throw new RuntimeException(e)。看到的最后一个是:异常A,倒数第二个是:异常B:异常A,
倒数第三个是:异常C:异常B:异常A,最上面的是:异常D:异常C:异常B:异常A。
3,异常的信息是方法调用的过程,如:
Caused by: https://www.sodocs.net/doc/814089094.html,ng.NullPointerException
at https://www.sodocs.net/doc/814089094.html,ng.Class.forName0(Native Method)
at https://www.sodocs.net/doc/814089094.html,ng.Class.forName(Unknown Source)
at cn.itcast.oa.util.BeanFactory.getImpl(BeanFactory.java:61) 表示https://www.sodocs.net/doc/814089094.html,ng.NullPointerException这个异常是在BeanFactory的61行抛出的,但是这个抛异常是因为调用的Class.forName()中抛了异常,Class.forName()中抛异常又是因为调用Class.forName0()时抛了异常,真正抛异常的地方在最上面的方法调用,也就是Class.forName0()。
我们要看排在最上面的我们自己的代码。如果最后一个Caused by中没有我们的代码,则看上一下Caused by中的最上面的我们的代码,如果还没有,再看上一个Caused by,以此类推。
补充:如果最下面的异常不是我们自己的代码抛出的,或是在最后一个异常中的信息中,我们的代码不是在第一行,即最终出错的代码是我们使用框架环境等。这时,一般是因为我们传递的信息有问题,因为一般不会是因为BUG造成的。这时应从两个方面查看:参数或配置。如果不是传递的参数有问题,就是提供的配置有问题,对于配置,应根据情况再推测是哪一块配置中的哪一些配置,然后进行调试。
逻辑错误,是指运行结果与所想的不一致,但没有抛异常。这时应把这些逻辑分成几段,每一段都应有一个预期的状态,然后使用断点工具配合着进行验证,看看每个环节是否都正常,直至找出错误的地方。应该先推测出最可疑的地方进行查找,找不出再依次查找。
如果代码没有问题,还是抛异常,就可能是环境的问题了。
1.2.一些的异常的解决办法
https://www.sodocs.net/doc/814089094.html,ng.IllegalArgumentException:
node to traverse cannot be null!
https://www.sodocs.net/doc/814089094.html,ng.IllegalArgumentException: node to traverse cannot be null!
org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.ja va:31)
org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:25
4)
org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java: 157)
https://www.sodocs.net/doc/814089094.html,pile(QueryTranslatorImpl.java:1 11)
org.hibernate.engine.query.HQLQueryPlan.
org.hibernate.engine.query.HQLQueryPlan.
原因1: HQL语顺的词法有错误,这时应找到出错的代码在哪一行,找出HQL中的语法错误。
https://www.sodocs.net/doc/814089094.html,ng.NoSuchMethodError:
org.hibernate.hql.antlr.HqlBaseParser.r
ecover(Lantlr/RecognitionException;Lant
lr/collections/impl/BitSet;)V
https://www.sodocs.net/doc/814089094.html,ng.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(La ntlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:179)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:2 48)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.ja va:157)
at https://www.sodocs.net/doc/814089094.html,pile(QueryTranslatorImpl.java: 111)
at org.hibernate.engine.query.HQLQueryPlan.
at org.hibernate.engine.query.HQLQueryPlan.
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.j ava:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl. java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.jav a:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
... 40 more
原因1:只要是https://www.sodocs.net/doc/814089094.html,ng.NoSuchMethodError: org.hibernate.hql.antlr...,一般是由于HQL语顺的词法有错误,如写查询所有User时”FROM User”,From后没有加空格等。这时应找到出错的代码在哪一行,找出HQL中的语法错误。
原因2:有一同学也报类似的错误,不过他的原因是jar包冲突。在他的lib/中有:antlr2.7.6与antlr2.7.2,删除antlr2.7.2后就正常了。他的异常信息如下:Caused by: https://www.sodocs.net/doc/814089094.html,ng.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.
recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:179)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:2 48)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.ja va:157)
at https://www.sodocs.net/doc/814089094.html,pile(QueryTranslatorImpl.java: 111)
at org.hibernate.engine.query.HQLQueryPlan.
at org.hibernate.engine.query.HQLQueryPlan.
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.j ava:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl. java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.jav a:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
... 42 more
https://www.sodocs.net/doc/814089094.html,ng.IllegalArgumentException:
Resources cannot be null.
异常信息如下:
https://www.sodocs.net/doc/814089094.html,ng.IllegalArgumentException: Resources cannot be null.
at https://www.sodocs.net/doc/814089094.html,mons.validator.Validator.
at org.apache.struts.validator.Resources.initValidator(Resources.java:507)
at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:111) at https://www.sodocs.net/doc/814089094.html,mands.servlet.ValidateActionForm.validate(Valid ateActionForm.java:58)
at https://www.sodocs.net/doc/814089094.html,mands.AbstractValidateActionForm.execute(Abstra ctValidateActionForm.java:120)
at https://www.sodocs.net/doc/814089094.html,mands.ActionCommandBase.execute(ActionCommandBa se.java:51)
at https://www.sodocs.net/doc/814089094.html,mons.chain.impl.ChainBase.execute(ChainBase.java:190)
at https://www.sodocs.net/doc/814089094.html,mons.chain.generic.LookupCommand.execute(LookupCommand.java: 304)
at https://www.sodocs.net/doc/814089094.html,mons.chain.impl.ChainBase.execute(ChainBase.java:190)
at https://www.sodocs.net/doc/814089094.html,posableRequestProcessor.process(ComposableReque
stProcessor.java:283)
... 19 more
原因:写的FormBean类没有继承ActionForm。或是在配置formbean时,指定错了类。
https://www.sodocs.net/doc/814089094.html,ng.UnsupportedClassVersionErr
or: Bad version number in .class file
https://www.sodocs.net/doc/814089094.html,ng.UnsupportedClassVersionError: Bad version number in .class file at https://www.sodocs.net/doc/814089094.html,ng.ClassLoader.defineClass1(Native Method)
at https://www.sodocs.net/doc/814089094.html,ng.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,.URLClassLoader.defineClass(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,.URLClassLoader.access$100(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at https://www.sodocs.net/doc/814089094.html,.URLClassLoader.findClass(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,ng.ClassLoader.loadClass(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,uncher$AppClassLoader.loadClass(Unknown Source)
at https://www.sodocs.net/doc/814089094.html,ng.ClassLoader.loadClass(Unknown Source)
...
原因:编译的版本高于执行的版本,解决办法为:在工程上右击—> Properties Java Compiler,把Compiler compliance level调为5.0,如下图所示:
1.2.5.Tomcat中多次发布应用程序后出异常:
https://www.sodocs.net/doc/814089094.html,ng.OutOfMemoryError: PermGen space
Caused by: javax.servlet.ServletException: https://www.sodocs.net/doc/814089094.html,ng.OutOfMemoryError: PermGe
n space
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java: 295)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
https://www.sodocs.net/doc/814089094.html,mands.servlet.ExecuteAction.execute(ExecuteAction. java:58)
...
Caused by: https://www.sodocs.net/doc/814089094.html,ng.OutOfMemoryError: PermGen space
原因:是因为工程每次重新发布后,Tomcat都要加载类字节码到内存中,但不会释放。这样在多次发布后,内存用光了,就出现这个内存溢出的错误了。解决办法:重启Tomcat就可以了。
https://www.sodocs.net/doc/814089094.html,ng.NoSuchFieldError:
deferredExpression
Caused by: https://www.sodocs.net/doc/814089094.html,ng.NoSuchFieldError: deferredExpression
at https://www.sodocs.net/doc/814089094.html,mon.core.ForEachSupport.release(For EachSupport.java:178)
at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:1 66)
at org.apache.jsp.WEB_002dINF.jsp.RoleAction.list_jsp._jspDestroy(list_js p.java:40)
at org.apache.jasper.runtime.HttpJspBase.destroy(HttpJspBase.java:61)
at org.apache.jasper.servlet.JspServletWrapper.destroy(JspServletWrapper. java:425)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapp er.java:139)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper. java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:33 7)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
... 37 more
原因:Struts1.3.8中有jstl1.0.2与standard1.0.2,把这两个jar包去掉就可以了。
https://www.sodocs.net/doc/814089094.html,ng.NoSuchFieldError:
deferredExpression
Caused by: https://www.sodocs.net/doc/814089094.html,ng.NoSuchFieldError: deferredExpression
at https://www.sodocs.net/doc/814089094.html,mon.core.ForEachSupport.release(For EachSupport.java:178)
at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:1 66)
at org.apache.jsp.WEB_002dINF.jsp.RoleAction.list_jsp._jspDestroy(list_js p.java:40)
at org.apache.jasper.runtime.HttpJspBase.destroy(HttpJspBase.java:61)
at org.apache.jasper.servlet.JspServletWrapper.destroy(JspServletWrapper. java:425)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapp er.java:139)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper. java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:33 7)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
... 37 more
1.3.解决问题的方式说明与一些建议
1,出问题了,要先从简单的原因入手,是快速解决问题的一个好办法。例如显示器不显示了,不要直接把他拆掉,而应先检查有没有插电源。在我们现阶段(水平还不是很高),有很多错误就是这样简单的原因,所以更要这样做。
2,没有很快的解决问题,也不见得是水平不高,也有可能是自己的状态太不好了。有时在熬夜写程序时遇到一个小问题,却怎么都解决不了,有可能两个小时都搞不定,这时就该休息了,也许第二天早上再看时,一眼就能看到问题所在。还有一个办法,就是让别人帮你找错,不一定要找一个水平比你高的人,他可能很快就能找到错误原因。当然我们还是要保重身体,保持最好的状态,这才是更重要的。
3,总是能解决问题的是高手,总是能避免问题的则是更高的高手。我们就要注意避免问题,要防治结合。怎么才能避免问题呢?有一个好方法是就养成良好的书写习惯,比如总是使用驼峰命名法、慎用缩写等等。如AF是代表ActionForm呢还是ActionForward
呢,除非都很请楚,否则不能用,如用Del表示Delete就很清楚。咱们同学就有好几个在大小写上出了问题了,这应该是可以避免的。
js表单验证代码全集 2008年06月25日星期三下午 03:23 1:js 字符串长度限制、判断字符长度、js限制输入、限制不能输入、textarea 长度限制 2.:js判断汉字、判断是否汉字、只能输入汉字 3:js判断是否输入英文、只能输入英文 4:js只能输入数字,判断数字、验证数字、检测数字、判断是否为数字、只能输入数字 5:只能输入英文字符和数字 6: js email验证、js 判断email 、信箱/邮箱格式验证 7:js字符过滤,屏蔽关键字 8:js密码验证、判断密码 2.1: js 不为空、为空或不是对象、判断为空、判断不为空 2.2:比较两个表单项的值是否相同 2.3:表单只能为数字和"_", 2.4:表单项输入数值/长度限定 2.5:中文/英文/数字/邮件地址合法性判断 2.6:限定表单项不能输入的字符 2.7表单的自符控制 2.8:form文本域的通用校验函数 2.9:js验证手机号,含158,159段的 1. 长度限制
2. 只能是汉字 3." 只能是英文 2. 只能是汉字 3." 只能是英文