前端开发经验总结

 

<td width="28%" align="right" nowrap >

我设置nowrap和不设置nowrap效果都一样。就是表格随着文字自动伸展,为什么?

 

→回答问题:

TD元素noWrap属性的行为与TD元素的width属性有关。

 

◆如果未设置TD宽度,则noWrap属性是起作用的。

◆如果设置了TD宽度,则noWrap属性是不起作用的。

 

http://www.blueidea.com/tech/web/2003/943.asp

 

table调整以下格式

 

<meta   http-equiv="refresh"   content="60"> 静态页面定时刷新语句

 

要有主键表示一条记录是唯一的(没有唯一的数据,自己要构建唯一的数据。例如:创建ID等等)

TreeSet去除重复的内容。在构建数据结构时,理请数据之间的关系,再处理。

 

要有分解的思想:部分+部分=整体(尤其是拼写字符串时要考虑)

 

页面从request中取数据

<jsp:useBean id="allianceList" class="java.util.ArrayList" scope="request"></jsp:useBean>

<jsp:useBean id="prefCustMap" class="java.util.HashMap" scope="request"></jsp:useBean>

 

好的算法,是简洁的。思路要开阔些。设计算法之前要先画流程图,再写代码!

 

1 自己没有review代码

2 没有log输出

3 一定要等更新成功在执行下一步

4 尽可能的使用标签

 

设计方法时,一定要考虑如何处理异常

 

 

ObjectOutputStream只能对Serializable接口的类的对象进行序列化。默认情况下,ObjectOutputStream按照默认方式序列化,这种序列化方式仅仅对对象的非transient的实例变量进行序列化,

而不会序列化对象的transient的实例变量,也不会序列化静态变量。

在应用时,如果对某些成员变量都改为transient类型,将节省空间和时间,提高序列化的性能。20080805

 

程序其实都是对字符串的处理,对字符串的处理,要掌握好正则表达式 20080814

 

如何更好的组织数据,对于数据库中的数据就是一张二维表,可以用二维数组来表示。

其实,大部分的数据都可以组织成一维数组,或者二维数组,对于多维可以转成

 一或者二维数组再进行处理 20080815

 

注意从页面前端的数据长度大于数据库中字段定义的长度的场合,两种方法解决:1 页面前端check长度 2 改数据库中字段的长度

20080815

 

注意截字符串(包含中文)问题,此时是按字符截,按字节截 20080815

 

学习优秀的算法和架构的的实现思想,并运用到实际工作中去 20080818

 

20080820

//email格式检查

function checkEmail(str){

       var email = new RegExp("^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$");

       return(email.test(str));

}

//清除左空格

function ltrim(str){

       return str.replace(/^/s*/, "");

}

//清除右空格

function rtrim(str){

       return str.replace(//s*$/, "");

}

利用随机数,防止url重复

var url = "<%=request.getContextPath()%>/order/queryOrderByPnrOrName.do?random="+ Math.random( )

<img src="<%=request.getContextPath()%>/image/desk/none2.gif" width="683" height="135">

 

isNaN // js中判断是否为数字

设置textareareadonly

<textarea rows="12" cols="100%" readonly="readonly" style="overflow-x:hidden;border:0;font-size:15px;"><%=request.getAttribute("iremark")==null?"":request.getAttribute("iremark")%></textarea>

 

20080828

<!-- querystaffDeskGetPassengerInfoAction(request.setAttribute("querystaff", queryform))获得数据 -->

<jsp:useBean id="querystaff" class="com.travelsky.agent.desk.form.DeskPassengerQueryForm" scope="request"></jsp:useBean>

 

20080902

<%@page isELIgnored="false"%> 表示不忽略el表达式,如果设定为真,那么JSP中的表达式被当成字符串处理

<c:out value="${pageContext.request.contextPath}"/> <%=request.getContextPath()%>是一样的

 

20080903

struts中的action调用action的配置

例如:

 

<form-bean name="setiTermConfig" type="com.travelsky.agent.desk.form.SetiTermConfigForm"></form-bean>

 

<action name="setiTermConfig" path="/DesksetiTermConfig" scope="request" type="com.travelsky.agent.desk.action.SetiTermConfigAction">

  <forward name="success" path="/jsp/desk/SetiTermConfig.jsp"></forward>

</action>

 

<action path="/habitCompanyCodeDetail" type="com.travelsky.agent.desk.action.HabitCompanyCodeDetailAction" parameter="action"  scope="request" >

  <forward name="sucess" path="/DesksetiTermConfig.do" redirect="true"/>

</action>

redirect="true" :true 表示重定向操作(不能共享request范围内的数据) false 表示执行转发操作(可以共享request范围内的数据)

 

 

  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

                  <set-property

                      property="pathnames"

                      value="/WEB-INF/validator-rules.xml, /WEB-INF/validator-rules-custom.xml, /WEB-INF/validation.xml"/>

  </plug-in>

 

20080905

1 js中单引好不行,就用双引号

2 cropDbookRemark = "'"+escape(escape(cropDbookRemark))+"'";

 

       function showRemark(cropBookRemark)

       {

              alert(unescape(unescape(cropBookRemark)));

       }

 

20080909

在页面显示过程中,要考虑一些转义字符的问题

 

 function querypsg(clientCode,passengerCode,tel,passengerName,cert,bp,ply){   

     var temp;

    

     temp= '&clientCode=' + clientCode + '&passengerCode=' + passengerCode + '&tel=' + tel + '&passengerName=' + passengerName + '&cert=' + cert + '&bp=' + bp ;

     ply = '/Nasmodel/DeskPsgToEterm.do?show=first'+ temp;

     ply += "&random=" + Math.random();

     alert(ply);

     var windowProperty = "height="+screen.availheight+",width="+screen.availwidth+'resizable=yes,scrollbars=yes';

     window.open(ply,'',windowProperty);

     //,'toolbar=no,menubar=no,resizable=yes'   

 }

以上的方法,对于新打开的一个窗口,可以借鉴。用到随机数,每次提交是不同的请求

 

//email格式检查

function checkEmail(str){

       var email = new RegExp("^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$");

       return(email.test(str));

}

 

20080923

设置了form,在页面中可以通过以下方式获得:

例如:

 

<script language="javascript">

 

  function doSubmit()

  {

      // alert(document.forms['tempPassengerForm'].tempPassengerCode.value);

      // document.forms['tempPassengerCode'].submit();

      alert(document.tempPassengerForm.tempPassengerCode.value);

  }

</script>

<html:form action="/DeskTempPassengerToEterm.do" name="tempPassengerForm" type="com.travelsky.agent.desk.form.DeskTempPassengerForm" scope="request">

<textarea rows="20" cols="105" name="tempPassengerCode"></textarea>

</html:form>

 

^ $ 他们是分别用来匹配字符串的开始和结束

把指定几个字符放到小括号里,中括号只匹配一个单一的字符,大括号里面限制字符出现的个数

 

* 出现0次或者N

+ 至少出现一次

? 没有或者出现一次

*,+,?只管它前面的字符

这就是完整的email认证匹配模式了

^[_a-z0-9-]+/.[_a-z0-9-]+*@[a-z0-9-]+/.[a-z0-9-]+*$

只能含有中英文、点、空格、中横线和单引号、数字(均为英文标点)

Java^([/u4E00-/u9FA5]|[a-zA-Z0-9]|[. //-'])*$

Js ^([/u4E00-/u9FA5]|[a-zA-Z0-9]|[. //-'])*$

20080925

1 解决js输出乱码的问题:

   1)把JSeclipsecopy出来到记事本中,然后存成utf-8编码格式

   2)在eclipse中新建一个js文件,把该文件编码格式改成utf-8编码格式

   注意的是:html中的编码格式要与js中的编码格式保持一致。

 

20080927

1 往页面传输的数据量很大时,可以采用ajax技术提高页面传输效率,用什么传什么

typeof(parent.tabPage2)!="undefined"

 

20081007

1 设置table width 时要一致,要都用百分号,或者都用px,要保持一致

2

以下显示单,双引号的输出:

<%@page import="org.apache.commons.lang.StringEscapeUtils"%>

function showInfo()

{

       <%

         String  s="/'小王/'";

      String  s1="/"你好/"";

      String say = StringEscapeUtils.escapeJavaScript(s+":"+s1);

      System.out.println(s+":"+s1);

       %>

       alert('<%=say%>');

}

注意:以下方式显示出错误:

 <br>

 <br>

 <%

  String a = "/'小王/'";

  String b = "/"你好/"";

  String c = StringEscapeUtils.escapeJavaScript(a+":"+b);

  %>

<a href="javascript:alert('<%=c %>')">show</a>

通过参数传入显示出错误

 

20081009

1 页面上的单双引号的显示为转义

2 由于网络环境的问题,要防止重复提交的问题

 

20081013

    c:set target="${historyCodeVO}"  value="${codeHistory.airLines}" property="airLines"/>

           <%

             if("".equals(historyCodeVO.getAirLines()))

             {

                 out.print("");

             }

             else

             {

                 out.print(historyCodeVO.getAirLines());

             }

             

           %>

20081014

Java种设置显示时间:

常见标准的写法"yyyy-MM-dd HH:mm:ss",注意大小写,时间是24小时制,24小时制转换成12小时制只需将HH改成hh,不需要另外的函数。

 

20081015

1 使用测试数据时,尽可能的要测第一条数据,二,倒数第二 最后一条数据

2 js中定义对象时,要放到文件的头部

 

20081017

1 如果用AJAX网络反应缓慢,可以提示用户操作进行中...

 

20081023

1 textareasplit数据每一行要/r/n

2 写测试数据的时候,要考虑数据不全的情况,尤其是由用户输入的数据

 

20081024

1 对于抽取出来的js文件,如果调用某个方法时发生错误,将该方法提到文件头部

2

定义和用法:

  setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

  语法:

  setTimeout(code,millisec)

  参数:

  code (必需):要调用的函数后要执行的 JavaScript 代码串。

  millisec(必需):在执行代码前需等待的毫秒数。

  提示:

  setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()

  实例:

  <html>

  <head>

  <script type="text/javascript">

  function timedMsg()

  {

  var t=setTimeout("alert('5 seconds!')",5000)

  }

  </script>

  </head>

  <body>

  <form>

  <input type="button" value="Display timed alertbox!"

  onClick="timedMsg()">

  </form>

  <p>Click on the button above. An alert box will be

  displayed after 5 seconds.</p>

  </body>

  </html>

 

20081027

评估某一个人的能力:一个人的能力尽可能的要数量化,数值化

1 oracle的服务器端或者客户端组件,后应该配置 Net Manager

选择“本地”-〉“服务命名”-〉“创建一个新的服务命名”见下图所示:

 

 

 

 


 

 


输入数据库服务器IP地址或者主机名

 

 

  

 

 

数据库服务名称

 


 

 

或者修改C:/oracle/ora92/network/ADMIN下的tnsnames.ora文件

# TNSNAMES.ORA Network Configuration File: C:/oracle/ora92/NETWORK/ADMIN/tnsnames.ora

# Generated by Oracle configuration tools.

 

BlueSky02 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.6.183.89)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = vio)

    )

  )

 

2008-10-30

写测试case时,要考虑数据库中字段最大长度的情况。例如数据库中名字字段长度为130个字节,就要输入三条数据:等于130个字节,输入大于130个字节,小于130个字节

 

2008-10-31

       <action path="/fareCreator"

           parameter="/jsp/fare/Creator_query.jsp" scope="request"

           type="org.apache.struts.actions.ForwardAction" />

 

2008-11-11

观察数据结构的规律,找到规律或者是业务规则,并用程序优美简洁的表达出来

 

2008-11-17

eval()函数(javascript) - [javaScript]

eval()函数

 

JavaScript有许多小窍门来使编程更加容易。

其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。

举个小例子:

 

var the_unevaled_answer = "2 + 3";

var the_evaled_answer = eval("2 + 3");

alert("the un-evaled answer is " + the_unevaled_answer + " and the evaled answer is " + the_evaled_answer);

 

如果你运行这段eval程序, 你将会看到在JavaScript里字符串"2 + 3"实际上被执行了。

所以当你把the_evaled_answer的值设成 eval("2 + 3"), JavaScript将会明白并把23的和返回给the_evaled_answer

这个看起来似乎有点傻,其实可以做出很有趣的事。比如使用eval你可以根据用户的输入直接创建函数。

这可以使程序根据时间或用户输入的不同而使程序本身发生变化,通过举一反三,你可以获得惊人的效果。

在实际中,eval很少被用到,但也许你见过有人使用eval来获取难以索引的对象。

文档对象模型(DOM)的问题之一是:有时你要获取你要求的对象简直就是痛苦。

例如,这里有一个函数询问用户要变换哪个图象:变换哪个图象你可以用下面这个函数:

 

function swapOne()

{

       var the_image = prompt("change parrot or cheese","");

       var the_image_object;

 

       if (the_image == "parrot")

       {

              the_image_object = window.document.parrot;

       }

       else

       {

              the_image_object = window.document.cheese;

       }

 

       the_image_object.src = "ant.gif";

}

 

连同这些image标记:

 

[img src="stuff3a/parrot.gif" name="parrot"]

[img src="stuff3a/cheese.gif" name="cheese"]

 

请注意象这样的几行语句:

     

the_image_object = window.document.parrot;

 

它把一个图象对象敷给了一个变量。虽然看起来有点儿奇怪,它在语法上却毫无问题。

但当你有100个而不是两个图象时怎么办?你只好写上一大堆的 if-then-else语句,要是能象这样就好了:

 

 

function swapTwo()

{

       var the_image = prompt("change parrot or cheese","");

       window.document.the_image.src = "ant.gif";

}

 

不幸的是, JavaScript将会寻找名字叫 the_image而不是你所希望的"cheese"或者"parrot"的图象,

于是你得到了错误信息:”没听说过一个名为the_image的对象”。

 

还好,eval能够帮你得到你想要的对象。

 

function simpleSwap()

{

       var the_image = prompt("change parrot or cheese","");

       var the_image_name = "window.document." + the_image;

       var the_image_object = eval(the_image_name);

       the_image_object.src = "ant.gif";

}

 

 

如果用户在提示框里填入"parrot",在第二行里创建了一个字符串即window.document.parrot. 然后包含了eval的第三

行意思是: "给我对象window.document.parrot" - 也就是你要的那个图象对象。一旦你获取了这个图象对象,你可以把

它的src属性设为ant.gif. 有点害怕?用不着。其实这相当有用,人们也经常使用它。

 

<html>

<body>

 

<script type="text/javascript">

 

eval("x=10;y=20;document.write(x*y)");// output: 200

document.write("<br />");

 

document.write(eval("2+2"));// output: 4

document.write("<br />");

 

var x=10;

document.write(eval(x+17)); // output: 27

document.write("<br />");

 

eval("alert('Hello world')"); // output: “Hello world”

 

</script>

 

</body>

</html>

使用 JSON(即 JavaScript Object Notation),将以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,该变量随后将引用一个通过指定给该变量的字符串构建的对象。

如果将此字符串赋给任意一个 JavaScript 变量,则该变量将接受以这种对象为单位的数据。要访问数据,请提供需要访问的属性所在的路径。

String json = "{/"name/":/"reiz/"}";

        JSONObject jsonObj = new JSONObject(json);

        String name = jsonObj.getString("name");

      

var str = '{ "name": "Jason", "occupation": "character","sex":"Male" }';   

           //alert(str);

           // eval("result = "+str);

           // 通过eval函数把字符串str,转换成result对象(JavaScript 对象)

           var result = eval('(' + str + ')');

           alert(result);

           alert("name "+result.name); // output: “Jason”

           alert("occupation "+result.occupation); // output: “character”

           alert("sex "+result.sex); // output: “Male”

 

json数据格式中

person是一个数组,而每一个数组元素又是一个对象

{"person":

[

{"sex":"M","price":"{/"TV/":/"200.63/",/"Computer/":/"15000.77/"}","address":"{/"street/":/"BackStreet/",/"number/":12345}","name":"JJ","Id":"1"},

 {"sex":"M","price":"{}","address":"{/"street/":/"BackStreet2/",/"number/":123452}","name":"小杰:金杰","Id":"2"},

 {"sex":"F","price":"{}","address":"{/"street/":/"后街3:后街33.后街34,后街35/",/"number/":123453}","name":"JJ3","Id":"3"}

 ]

 }

 

2008-11-19

Js中得到字节的长度,匹配16进制从00ff的字节(中文两个字节表示一个汉字)

function getCharLength(str){

       if(str){

              return str.replace(/[^/x00-/xff]/gi,'pi').length;

       }else{

              return 0;

       }    

}

2008-12-2

Hibernate 工作原理图

Hibernate 工作原理图
启动
Hibernate
构建Configuration实例,初始化该实例中的所有变量
Configuration cfg = new Configuration().configure();
加载hibernate.cfg.xml文件至该实例内存

通过hibernate.xfg.xml文件中的mapping节点配置,加载hbm.xml文件至该实例内存

利用上面创建的Configuration实例构建一个SessionFactory实例
SessionFactory sf = cfg.buildSessionFactory();
由上面得到的SessionFactory实例创建连接
Session s = sf.openSession();
由上面得到的Session实例创建事务操作接口Transaction的一个实例
tx Transaction tx = s.beginTransaction();
通过Session接口提供的各种方法操作数据库的访问

提交数据库的操作结果
tx.commit();
关闭Session链接
s.close();

 


2008-12-12

在写测试case时,一定要多考虑边界值得问题。例如:在输出指令第22行需要跨行的场合(某条指令不能跨行),要考虑输出的指令在第2122行的情况,就要写六条case

第一条case:在第21行是指令是指令开始的部分

第二条case:在第21行是指令是指令中间的部分

第三条case:在第21行是指令是指令结束的部分

第四条case:在第22行是指令是指令开始的部分

第五条case:在第22行是指令是指令中间的部分

第六条case:在第22行是指令是指令结束的部分

 

还要测试一下循环结束条件

 

2008-12-22

对于前端来说由于浏览器之间的差异(IE有自己的事件模型,DOM也有自己的事件模型,两者之间存在差异),以及对于W3C HtmlDOM支持的程度的水平

要写出安全性好,跨浏览器的前端程序来说,是一种挑战。

 

2008-12-23

对于后端来说,要尽可能编写可测试强,耦合性低的代码

 

2008-12-24

对于未验证的ActiveX控件,要把本地IP加入到可信站点中(只针对第一次加载)

 

2009-1-4

对于用Js生成的控件,生成的id值,要写成如下的方式:

var trainId = 0;// 设置为全局变量

var tbl   = document.getElementById('trainTable');

var tb    = tbl.insertRow(tbl.rows.length);

tb.id = trainId;

trainId++;

a.innerHTML = '<input name="trainService['+tb.id+'].departtime" id="d1'+tb.id+'" maxlength="15" value="'+value0+'"  type="text" size="9"/> <img src="<html:rewrite page="/image/common/icon_03.gif"/>" id=i'+tb.id+' οnclick="calendar(i'+tb.id+',d1'+tb.id+')">';

l.innerHTML = '<a href=javascript:del('+tb.id+',/"trainTable/")>删除</a>';

 

2009-1-7

对于系统权限的设计,可以采用如下设计思路:

1 设计功能模块表:

   包括:funcitionID,pfunctionID,functionName, FUNCTYPE ,fuctionPath字段

funcitionID

pfunctionID

FUNCTYPE

functionNam

fuctionPath

0

0

0001

 

#

1

0

1001

新闻

New.do

2

0

1001

论坛

Bbs.do

3

1

0001

国内新闻

#

4

1

0001

国际新闻

#

5

2

0001

经济论坛

#

6

5

0001

金融危机

#

 

 

通过pfunctionID来表示它所对应得父级菜单,

FUNCTYPE0001 菜单没有连接  1001 菜单具有连接

 

2 设计角色表

Roleid

Rolename

1

Role1

2

Role2

 

3 设计角色详细表(就是纽带表)

Roleid

FUNCID

1

1

1

2

1

3

2

1

2

1

 

4 功能模块表,设计角色表,角色详细表 三个表关联起来

 

2009-1-15

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

标签的参考

fn:contains(string, substring)

           

           

            如果参数string中包含参数substring,返回true

           

       

       

            

            fn:containsIgnoreCase(string, substring)

           

           

            如果参数string中包含参数substring(忽略大小写),返回true

           

       

       

           

            fn:endsWith(string, suffix)

           

           

            如果参数 string 以参数suffix结尾,返回true

           

       

       

           

            fn:escapeXml(string)

           

           

            将有特殊意义的XML (HTML)转换为对应的XML character entity code,并返回

           

       

       

           

            fn:indexOf(string, substring)

           

           

            返回参数substring在参数string中第一次出现的位置

           

       

       

           

            fn:join(array, separator)

           

           

            将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。

           

       

       

           

            fn:length(item)

           

           

            返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。

           

       

       

           

            fn:replace(string, before, after)

           

           

            返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果

           

       

       

           

            fn:split(string, separator)

           

           

            返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素

           

       

       

           

            fn:startsWith(string, prefix)

           

           

            如果参数string以参数prefix开头,返回true

           

       

       

           

            fn:substring(string, begin, end)

           

           

            返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符

           

       

       

           

            fn:substringAfter(string, substring)

           

           

            返回参数substring在参数string中后面的那一部分字符串

           

       

       

           

            fn:substringBefore(string, substring)

           

           

            返回参数substring在参数string中前面的那一部分字符串

           

       

       

           

            fn:toLowerCase(string)

           

           

            将参数string所有的字符变为小写,并将其返回

           

       

       

           

            fn:toUpperCase(string)

            将参数string所有的字符变为大写,并将其返回

           

            fn:trim(string)

            去除参数string 首尾的空格,并将其返回

2009-1-22

1外部引用的Js文件的编码格式要与页面的编码格式保持一致

2 一定要考虑为空的情况

 

 

 

2009-2-2

冒烟测试的对象是每一个新编译的需要正式测试的软件版本,

目的是确认软件基本功能正常,可以进行后续的正式测试工作。

 

例如是否可以正确安装/卸载,主要功能是否实现,

是否存在严重死机或数据严重丢失等Bug。如果通过了该测试,

则可以根据正式测试文档进行正式测试。

否则,就需要重新编译版本,再次执行版本可接收确认测试,直到成功。

 

  冒烟测试的说法据说是:

 

  就象生产汽车一样,汽车生产出来以后,首先发动汽车,看汽车能否冒烟,如果能,证明汽车最起码可以开动了。说明完成了最基本的功能。

 

  冒烟测试一般用于每日构建(Nightly build),构建服务器首先从CVS服务器上,下载最新的源代码,然后编译单元测试,运行单元测试通过后,编译可执行文件,可执行文件若可运行,并能执行最基本的功能,则认为通过了冒烟测试,这时,构建服务器会把程序打包成安装文件,然后上传到内部网站,第二天一早,测试人员来了以后,会收到构建服务器发来的邮件提示昨晚是否构建成功。若构建成功,则测试人员进行相关的功能测试。所有这些功能的完成,一般是靠编写脚本完成的,目前比较常用的脚本有TCLPerlPython及功能弱弱的批处理。用这些可以完成系统的每日构建。

 

简单的说,就是先保证系统能跑的起来,不至于让测试工作做到一半突然出现错误导致业务中断。目的就是先通过最基本的测试,如果最基本的测试都有问题,就直接打回开发部了,减少测试部门时间的浪费。

 

2009-2-3

将常用的js提取出来有如下的好处:

1 多个WEB页面重复使用

2 不仅可以改善代码的维护性,而且使该脚本文件保留在浏览器的缓存中,从而只需要在用户访问站点时向本地下载一次。

 

2009-2-17

javascript 有三部分组成

1 javascript核心(ECMAScript

2 文档对象模型(DOM

3 浏览器对象模型(BOM

 

2009-2-18

<img src="<html:rewrite page="/image/common/icon_03.gif"/>" id=i3 οnclick="calendar(i3,f2)" align="absmiddle">

 

AbsMiddle 图像的中间与同一行中最大元素的中间对齐

 

AbsBottom 图像的下边缘与同一行中最大元素的下边缘对齐

 

AbsMiddle 图像的中间与同一行中最大元素的中间对齐

 

Baseline 图像的下边缘与第一行文本的下边缘对齐

 

Bottom 图像的下边缘与第一行文本的下边缘对齐

 

Left 图像沿网页的左边缘对齐,文字在图像右边换行

 

Middle图像的中间与第一行文本的下边缘对齐

 

NotSet未设定对齐方式

 

Right图像沿网页的右边缘对齐,文字在图像左边换行

 

Top图像的上边缘与同一行上最高元素的上边缘对齐

 

TextTop图像的上边缘与同一行上最高文本的上边缘对齐

 

2009-2-20

      <META name="Keywords"

         content="Reservation,CRS,GDS,Travel,Agent,Portal,APS,订座,机票,查询,终端,民航">

      <META name="Description"

         content="APS(Agent Portal System) is a brand new work place for travel agent to book flight.APS是全新的代理人工作平台,可以使用终端指令或图形化工具实时查询座位情况并订票。">

以上代码有利于搜索引擎的匹配

 

2009-2-23

1对于非法登陆,可以采用标签或者Filter过滤器的方法,来进行验证

2在写客户端的脚本时,要考虑客户端屏幕尺寸和分辨率的情况

 

2009-2-24

style="word-break:break-all;" 加入表格中是强制换行

可以用CSS样式控制

对于div,p等块级元素

正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space:normal,当定义的宽度之后自动换行

html

<div id="wrap">正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space:normal,当定义</div>

css

#wrap{white-space:normal; width:200px; }

 

1.IE浏览器)连续的英文字符和阿拉伯数字,使用word-wrap : break-word ;或者word-break:break-all;实现强制断行

 

#wrap{word-break:break-all; width:200px;}

或者

#wrap{word-wrap:break-word; width:200px;}

 

<div id="wrap">abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>

 

效果:可以实现换行

 

2.Firefox浏览器)连续的英文字符和阿拉伯数字的断行,Firefox的所有版本的没有解决这个问题,我们只有让超出边界的字符隐藏或者,给容器添加滚动条

 

#wrap{word-break:break-all; width:200px; overflow:auto;}

 

<div id="wrap">abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>

 

效果:容器正常,内容隐藏

 

对于table

1. (IE浏览器)使用 table-layout:fixed;强制table的宽度,多余内容隐藏

 

<table style="table-layout:fixed" width="200">

<tr>

<td>abcdefghigklmnopqrstuvwxyz1234567890ssssssssssssss

</td>

</tr>

</table>

 

效果:隐藏多余内容

 

2.(IE浏览器)使用 table-layout:fixed;强制table的宽度,内层td,th采用word-break : break-all;或者word-wrap : break-word ;换行

 

<table width="200" style="table-layout:fixed;">

<tr>

<td width="25%" style="word-break : break-all; ">abcdefghigklmnopqrstuvwxyz 1234567890

</td>

<td style="word-wrap : break-word ;">abcdefghigklmnopqrstuvwxyz 1234567890

</td>

</tr>

</table>

 

效果:可以换行

 

3. (IE浏览器)td,th中嵌套div,p等采用上面提到的div,p的换行方法

4.(Firefox浏览器)使用 table-layout:fixed;强制table的宽度,内层td,th采用word-break : break-all;或者word-wrap : break-word ;换行,使用overflow:hidden;隐藏超出内容,这里overflow:auto;无法起作用

 

<table style="table-layout:fixed" width="200">

<tr>

<td width="25%" style="word-break : break-all; overflow:hidden; ">abcdefghigklmnopqrstuvwxyz1234567890</td>

<td width="75%" style="word-wrap : break-word; overflow:hidden; ">abcdefghigklmnopqrstuvwxyz1234567890</td>

</tr>

</table>

 

2009-3-2

使用hibernatequery=session.createQuery("select count(*) from CpUser where id = :id and password = :password");

query.setParameter("id".userForm.getId());

能防止sql注入

 

2009-3-3

eclipsejsp页面也是可以设置断点,debug

 

2009-3-18

js验证电话号码的正则表达式

  */  

  /d               代表一个数字  

  /d{7,8}     代表78位数字(表示电话号码)  

  /d{3,}       代表分机号码  

  0/d{2,3}   代表区号  

  [0/+]/d{2,3}   代表国际区号

  */

/^(([0/+]/d{2,3}-)?(0/d{2,3})-)?(/d{7,8})(-(/d{3,}))?$/

 

([0/+]/d{2,3}-)?

[0/+]表示可以出现0或者加号,/这个右斜杠表示转义后面的加号

/d{2,3}表示0+)后面必须为23位数字

([0/+]/d{2,3}-)? 不出现或者出现一次

 

(0/d{2,3})- 表示区号0后面必须为23位数字

(([0/+]/d{2,3}-)?(0/d{2,3})-)? 不出现或者出现一次

 

(/d{7,8}) 表示必须为78位数字

(/d{3,}) 表示必须有3位数字

(-(/d{3,}))?不出现或者出现一次

 

2009-3-26

根据ordSale.scopeflag(在form中的属性)属性的值,struts标签自动匹配option中的selected    

<html:select property="ordSale.scopeflag">                                    

                            <html:option value="0">国内</html:option>

                            <html:option value="1">国际</html:option>                                   

                     </html:select>

如果ordSale.scopeflagnull 则安之option中的顺序进行显示,例如:ordSale.scopeflag=null 标签显示的顺序为:

 

<html:select property="ordSale.scopeflag">                                    

<html:option value="1">国际</html:option>                       

<html:option value="0">国内</html:option>                                            

</html:select>

则在页面上显示option为先是国际,再为国内,这种应用的场合为:

例如:范围:下拉框有国内、国际。无值时,默认显示为国际。

 

2009-4-8

浏览器是加载页面的过程

1 页面的dom加载,按照源文档里的顺序创建元素:<html>节点,<head>节点,以及有时会有的<script>节点,<script>节点立即加载并处理其中的脚本

   由于这个时候页面的body还没有被加载,一定要记住不要在页面元素上注册事件监听器。必须等待这个场景中的第二步,最坏情况下是第三步

2 DOM被完全加载;所有的文档描述的元素在内存中被创建。额外的资源还没有被加载(比如图像,CSS文件,嵌入对象),但是它们的DOM元素已经存在了。从这时候起,可以在它们上面注册事件监听器了。Prototype1.6引入了一个标准化的DOMContentLoaded事件(最初是Mozilla的自定义事件),可以在这个时候做一些响应。只需要在document对象上使用自定义的dom:loaded事件。

3 页面被完全加载;所有的内部资源都被加载并处理。这时load事件在window对象上触发。如果页面有很多外部资源,那么它会在页面初始绘制很长时间之后发生

第一阶段就可以有事件开始发生(但是它们不是用户相关的事件,用户相关的事件大多数在第二阶段开始)。只要事件发生,相关的监听器就会被通知,并且这里有一个描述当前事件所有信息的事件对象。

 

2009-4-21

1 页面被完全加载后(所有的内部资源都被加载并处理),才执行window.onload事件

2 标准的load事件,作用在window对象上,触发的比较晚,要等到页面中所有的资源,包括样式单,图像,Flash动画和脚本都被装载以后再触发。为了快速地对DOM作出反应,只要等待DOM被加载(它相当快),使用文档上自定义的dom:loaded事件即可。

 

!=== vs. !=====

 

  开发者易犯的一个常见的错误是对JavaScriptfalse值的缺乏理解。在JavaScript里,null,0,""false,和undefined全部彼此相等(==),因为它们的计算值都为false。这意味着如果你使用代码test==false,则它在testundefinednull时,也会得到结果true,这可能并非你所期望的。

  这正是!=====有用的地方。这两个操作符都将检查变量的精确值(比如null),而不是单看其计算值(false)JSLint要求你任何时候你使用==!=进行真假判断时,都必须用!=====替代。

 

!=!==区别于!=====的示例

 

//这两个都为true

null == false

0 == undefined

//你应该以!=====取代之

null !== false

false === false

 

2009-4-28

解决tomcat乱码问题,可以修改tomcat/conf/server.xml中的

port="8080"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               debug="0" connectionTimeout="20000"

               disableUploadTimeout="true" URIEncoding="GBK"/>

 

URIEncoding设置编码字符集

 

2009-5-5

以下是用prototype来获得checkboxradio选中的值

var myPnr=[];

$$('input[type="checkbox"][name="checkPnr"]').select(function(i){return i.checked}).each(function(i){myPnr.push(i.value)});

$$('input[type="radio"][name="bank"]').select(function(i){return i.checked}).each(function(i){alert(i.value)});

 

 

 

40 个轻量级 JavaScript (上)

http://www.javaeye.com/news/6107-40-lightweight-javascript-library-on

 

50个实用的JavaScript工具

http://www.javaeye.com/news/5846-50-practical-javascript-tools

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值