搜档网
当前位置:搜档网 › ItcastOA_文档2_实现步骤_实体映射_增删改_表单验证_分页方案_文件下载_解决异常

ItcastOA_文档2_实现步骤_实体映射_增删改_表单验证_分页方案_文件下载_解决异常

ItcastOA_文档2_实现步骤_实体映射_增删改_表单验证_分页方案_文件下载_解决异常
ItcastOA_文档2_实现步骤_实体映射_增删改_表单验证_分页方案_文件下载_解决异常

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参数的值,即指定value 的值是add还是edit。可以使用以下表达式:

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}条

首页

${num}

尾页

转到:

>

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中,使用for循环设置参数值。

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.(HQLQueryPlan.java:77)

org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56)

原因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.(HQLQueryPlan.java:77)

at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56)

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.(HQLQueryPlan.java:77)

at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56)

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.(Validator.java:158)

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表单验证代码全集

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." 只能是英文