发表于: java/j2ee | 作者: | 日期: 2008/11/14 06:11
标签:

这里有两种方法帮你删除在一个ArrayList里重复的elements。下面的程序片段里,removeDuplicate方法不维护顺序 (Order),而removeDuplicateWithOrder方法会保持顺序 (Order),但会有些性能上的牺牲。

The removeDuplicate Method:
/** List order not maintained **/
public static void removeDuplicate(ArrayList arlList)
{
HashSet h = new HashSet(arlList);
arlList.clear();
arlList.addAll(h);
}
The removeDuplicateWithOrder Method:
/** List order maintained **/
public static void removeDuplicateWithOrder(ArrayList arlList)
{
Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = arlList.iterator(); iter.hasNext(); ) {
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
arlList.clear();
arlList.addAll(newList);
}

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 06:11
标签:

页面主体:main

头:header

内容:content/container

尾:footer

导航:nav/navigation

子导航:subnav

菜单:menu

子菜单:submenu

侧栏:sidebar

栏目:column

文章列表:list

页面外围控制整体布局宽度:wrapper

登录条:loginbar

标志:logo

广告:banner

友情链接:friendlink

页脚:footer

版权:copyright

滚动:scroll

热点:hot

新闻:news

下载:download

搜索:search

标签页:tab

提示信息:msg

小技巧:tips

栏目标题:title

加入:joinus

指南:guild

服务:service

注册:regsiter

状态:status

投票:vote

合作伙伴:partner

左右中:left right center

评论关闭
发表于: computer | 作者: | 日期: 2008/11/14 06:11
标签: ,,,

经常在互联网上见到B2B、B2C、C2C这些专业术语,只知道他们是电子商务的类型却并不了解其确切的含义。今天总结了一下。

B2B(Business to Business)
B2B是英文Business To Business的缩写,是企业对企业之间的营销关系。电子商务是现代B2B marketing的一种具体主要的表现形式。它将企业内部网,通过B2B网站与客户紧密结合起来,通过网络的快速反应,为客户提供更好的服务,从而促进企业的业务发展。 More …

评论关闭
发表于: lnmp | 作者: | 日期: 2008/11/14 06:11
标签:

//获得当前的脚本网址
function get_php_url(){
if(!empty($_SERVER[“REQUEST_URI”])){
$scriptName = $_SERVER[“REQUEST_URI”];
$nowurl = $scriptName;
}else{
$scriptName = $_SERVER[“PHP_SELF”];
if(empty($_SERVER[“QUERY_STRING”])) $nowurl = $scriptName;
else $nowurl = $scriptName.”?”.$_SERVER[“QUERY_STRING”];
}
return $nowurl;
}

//把全角数字转为半角数字
function GetAlabNum($fnum){
$nums = array(“0”,”1”,”2”,”3”,”4”,”5”,”6”,”7”,”8”,”9”);
$fnums = “0123456789”;
for($i=0;$i<=9;$i++) $fnum = str_replace($nums[$i],$fnums[$i],$fnum); $fnum = ereg_replace("[^0-9\.]|^0{1,}","",$fnum); if($fnum=="") $fnum=0; return $fnum; } //去除HTML标记 function Text2Html($txt){ $txt = str_replace(" "," ",$txt); $txt = str_replace("<","<",$txt); $txt = str_replace(">“,”>”,$txt);
$txt = preg_replace(”/[\r\n]{1,}/isU”,”
\r\n”,$txt);
return $txt;
}

//清除HTML标记
function ClearHtml($str){
$str = str_replace(‘<','<',$str); $str = str_replace('>‘,’>’,$str);
return $str;
}

//相对路径转化成绝对路径
function relative_to_absolute($content, $feed_url) {
preg_match(‘/(http|https|ftp):\/\//’, $feed_url, $protocol);
$server_url = preg_replace(“/(http|https|ftp|news):\/\//”, “”, $feed_url);
$server_url = preg_replace(“/\/.*/”, “”, $server_url);

if ($server_url == ”) {
return $content;
}

if (isset($protocol[0])) {
$new_content = preg_replace(‘/href=”\//’, ‘href=”‘.$protocol[0].$server_url.’/’, $content);
$new_content = preg_replace(‘/src=”\//’, ‘src=”‘.$protocol[0].$server_url.’/’, $new_content);
} else {
$new_content = $content;
}
return $new_content;
}

//取得所有链接
function get_all_url($code){
preg_match_all(‘/“\’ ]+)[”|\’]?\s*[^>]*>([^>]+)<\/a>/i’,$code,$arr);
return array(’name’=>$arr[2],’url’=>$arr[1]);
}

//获取指定标记中的内容
function get_tag_data($str, $start, $end){
if ( $start == ” || $end == ” ){
return;
}
$str = explode($start, $str);
$str = explode($end, $str[1]);
return $str[0];
}

//HTML表格的每行转为CSV格式数组
function get_tr_array($table) {
$table = preg_replace(“‘ ]*?>’si”,’”‘,$table);
$table = str_replace(”

“,’”,’,$table);
$table = str_replace(”

“,”{tr}”,$table);
//去掉 HTML 标记
$table = preg_replace(”‘<[\/\!]*?[^<>]*?>’si”,””,$table);
//去掉空白字符
$table = preg_replace(”‘([\r\n])[\s]+’”,””,$table);
$table = str_replace(” “,””,$table);
$table = str_replace(” “,””,$table);

$table = explode(”,{tr}”,$table);
array_pop($table);
return $table;
}

//将HTML表格的每行每列转为数组,采集表格数据
function get_td_array($table) {
$table = preg_replace(“‘
]*?>’si”,””,$table);
$table = preg_replace(”‘
]*?>’si”,””,$table);
$table = preg_replace(”‘ ]*?>’si”,””,$table);
$table = str_replace(”

“,”{tr}”,$table);
$table = str_replace(”

“,”{td}”,$table);
//去掉 HTML 标记
$table = preg_replace(”‘<[\/\!]*?[^<>]*?>’si”,””,$table);
//去掉空白字符
$table = preg_replace(”‘([\r\n])[\s]+’”,””,$table);
$table = str_replace(” “,””,$table);
$table = str_replace(” “,””,$table);

$table = explode(’{tr}’, $table);
array_pop($table);
foreach ($table as $key=>$tr) {
$td = explode(’{td}’, $tr);
array_pop($td);
$td_array[] = $td;
}
return $td_array;
}

//返回字符串中的所有单词 $distinct=true 去除重复
function split_en_str($str,$distinct=true) {
preg_match_all(‘/([a-zA-Z]+)/’,$str,$match);
if ($distinct == true) {
$match[1] = array_unique($match[1]);
}
sort($match[1]);
return $match[1];
}

评论关闭
发表于: lnmp | 作者: | 日期: 2008/11/14 06:11
标签:

PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为:

  date — 格式化一个本地时间/日期

  gmdate — 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT)。

  举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的:

  当前时间假定是2007-03-14 12:15:27

  echo date(‘Y-m-d H:i:s’, time()); 输出为:2007-03-14 12:15:27

  echo gmdate(‘Y-m-d H:i:s’, time()); 输出为:2007-03-14 04:15:27

  但是这只是在Linux+Apache下运行PHP所得的结果,如果在Windows下运行,则2个函数返回都是:2007-03-14 04:15:27。

  所以,我们应该给一个兼容性的写法,统一使用gmdate,并手工设置当前时区,写法改进如下:

  echo gmdate(‘Y-m-d H:i:s’, time() + 3600 * 8);

  这样不管在Linux+Apache下还是Windows下都得到了正确的结果,当然这样写还有一个好处,当网站是面向全世界的时候,那么网站用户只要设置所在的时区,程序自动根据用户设置的时区进行时间计算,数据库中信息发布时间只存当前的time()所生成的时间,那么在中国+8时区看到的发布时间是:2007-03-14 12:15:27,那么在欧洲+2时区用户看到这个信息的发布时间是:2007-03-14 06:15:27,这样信息的时间就全部对应正确了。

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 06:11

CSS属性 border-collapse 边框合并属性
说明
该CSS属性用来设定表格的行和列的边框是合并成单边框,还是分别有各自的边框。

值:collapse | separate | inherit

可用值 值的说明
separate 缺省值。边框分开,不合并。
collapse 边框合并。即如果相邻,则共用同一个边框。

示例代码
<table style=”border-collapse:collapse”>
继承

适用于
表格元素

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 06:11
标签:

em
相对长度单位。相对于当前对象内文本的字体尺寸。
如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

ex
相对长度单位。相对于字符“x”的高度。此高度通常为字体尺寸的一半。
如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

px
像素(Pixel)。相对长度单位。
像素是相对于显示器屏幕分辨率而言的。譬如,WONDOWS的用户所使用的分辨率一般是96像素/英寸。而MAC的用户所使用的分辨率一般是72像素/英寸。

pt
点(Point)。绝对长度单位。

em vs px

em指字体高,任意浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。

em有如下特点:
1. em的值并不是固定的;
2. em会继承父级元素的字体大小。

长度单位优化方法:

1. body选择器中声明Font-size=62.5%;

2. 将你的原来的px数值除以10,然后换上em作为单位;

简单吧,如果只需要以上两步就能解决问题的话,可能就没人用px了。经过以上两步,你会发现你的网站字体大得出乎想象。因为em的值不固定,又会继承父级元素的大小,你可能会在content这个div里把字体大小设为1.2em, 也就是12px。然后你又把选择器p的字体大小也设为1.2em,但如果p属于content的子级的话,p的字体大小就不是12px,而是1.2em=1.2 * 12px=14.4px。这是因为content的字体大小被设为1.2em,这个em值继承其父级元素body的大小,也就是16px * 62.5% * 1.2=12px, 而p作为其子级,em则继承content的字体高,也就是12px。所以p的1.2em就不再是12px,而是14.4px。

3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明,也就是避免以上提到的1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em,那么在声明p的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继承#content的字体高而变为了1em=12px。

4.以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点。解决方法:只需在body选择器中把62.5%换成63%就能正常显示了。
http://hi.baidu.com/toall/blog/item/d5f652fb337093146c22eb4e.html

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 05:11
标签: ,

一篇关于prototype的入门文章,浅显易懂。
from:http://dev.csdn.net/article/84222.shtm

如何在Javascript实现OO编程?恐怕最好的方式就是充分利用prototype属性。关于prototype的介绍有很多,我就不赘述了。比较基本的原理是,当你用prototype编写一个类后,当你new一个新的object,浏览器会自动把prototype中的内容替你附加在object上。这样,通过利用prototype,你也就实现了类似OO的Javascript。

在Javascript中,object就是一个associative array。一个function就是一个类。当你编写如下function时,其实就是定义了一个类,该function就是它的构造函数。

function MyObject(name, size)

{

this.name = name;

this.size = size;

}

之后,你可以方便的通过MyObject类的prototype属性来方便的扩充它。比如,你可以给他添加其他的属性和方法。

MyObject.prototype.tellSize = function()

{

return “size of “+this.name+” is “+this.size;

}

MyObject.prototype.color = “red”;

MyObject.prototype.tellColor = function()

{

return “color of “+this.name+” is “+this.color;

}

var myobj1 = new MyObject(“tiddles”, “7.5 meters”);

domDiv.innerHTML += myobj1.tellColor()+”<br/>”;

你可以想象,当你调用tellColor()方法后,结果是这样的:

color of tiddles is red

很方便的是,prototype属性可以动态添加。比如,你需要往MyObject中加入一个height属性,并希望其提供一个tellHeight()方法来获得height属性的值。你可以在上面的代码后,继续添加如下的代码:

MyObject.prototype.height = “2.26 meters”;

MyObject.prototype.tellHeight = function()

{

return “height of “+this.name+” is “+this.height;

}

之后,你可以访问一下myobj1的tellHeight()方法,你可以得到如下的结果:

height of tiddles is 2.26 meters

prototype的这些动态的特性看起来有些迷人,不过我倒是反而觉得有些凉飕飕的。确实,这些特性给你很大的灵活性,可以给与你runtime改变类属性和方法的能力。不过,稍微发掘一下,会有些不良的习惯产生。

首先,如果可以动态添加属性和方法,那么很容易让人想到,当我调用时,我想要调用的属性或者方法存在不?这是一个很严肃的问题,如果当我们调用时根本没有该属性或者方法,将可能导致我们的脚本down掉。

不过也有解决办法。比如,在上面的代码中,当还没有tellHeight()方法时,我们可以如下编写代码避免发生错误:

if (myobj1.tellHeight)

{

domDiv.innerHTML += myobj1.tellHeight()+”<br/>”;

}

注意,一定要在if语句中,不要加方法后面的那对(),否则,直接就down掉了。有兴趣的读者可以打印一下,看看分别访问myobj1.tellHeight和myobj1.tellHeight()时有什么区别。

也许,你觉得这个是小意思。加个判断嘛,不就好了?

对,但是下面一个问题更令人头痛。

属性和方法在不在的问题简单,可是属性和方法变不变化的问题可就严重了。在不在我们可以检测,变不变呢?比如,请看下面的代码:

function MyObject(name, size)

{

this.name = name;

this.size = size;

}

MyObject.prototype.color = “red”;

MyObject.prototype.tellColor = function()

{

return “color of “+this.name+” is “+this.color;

}

var myobj1 = new MyObject(“tiddles”, “7.5 meters”);

domDiv.innerHTML += myobj1.tellColor()+”<br/>”;

MyObject.prototype.color = “green”;

domDiv.innerHTML += myobj1.tellColor()+”<br/>”;

该代码将产生如下结果:

color of tiddles is red
color of tiddles is green

请注意,你修改的是类MyObject的color属性。但是你惊奇的看到你之前实例化的对象myobj1的属性值竟然也变化了。天!如果你的项目代码是多人合作,那么,也许某个人会在编程时为了图一己之便,擅自修改你的类。于是,所有人的对象都变化了。于是,你们陷入了漫长的debug过程中。。。。。。(不要说我没有告诉你啊)

上面是属性,还有方法:

function MyObject(name, size)

{

this.name = name;

this.size = size;

}

MyObject.prototype.color = “red”;

MyObject.prototype.tellColor = function()

{

return “color of “+this.name+” is “+this.color;

}

var myobj1 = new MyObject(“tiddles”, “7.5 meters”);

domDiv.innerHTML += myobj1.tellColor()+”<br/>”;

MyObject.prototype.color = “green”;

MyObject.prototype.tellColor = function()

{

return “your color of “+this.name+” is “+this.color;

}

domDiv.innerHTML += myobj1.tellColor()+”<br/>”;

这段代码的结果是:

color of tiddles is red
your color of tiddles is green

哈?原来方法也能变,汗!

问题来了。Javascript太灵活的编程方式多少让人不适应。如果整个Team的水平都比较高还可以,没人会犯这样的错误。但是,当有个毛头小伙子不知情,擅自修改类,将导致所有的人的对象都发生变化,无论是属性还是方法。在Javascript代码变得越来越多的Ajax时代,这是一个严重的问题。

这说明,编写Javascript时,好的编程风格更加重要。记得某人曾经说过这样的话,想Java和C#这些比较严格的语言,虽然降低了灵活性,但也减少了犯错误的可能。这样,即使一个新手,他写出的代码也不会与高手差太多。但是,像Javascript这样的脚本语言,由于太灵活,所以,高手写出的是天使,而新手写的,可能是魔鬼!

参考链接:
http://www.cnblogs.com/goody9807/archive/2007/04/16/715109.html
http://bokee.shinylife.net/blog/article.asp?id=455
http://www.west263.com/info/html/wangyezhizuo/Javascript/20080225/44132.html

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 05:11

1:
document.all[]

2:
document.表单名称.对象名称.属性值

3:
getElementById()

4:
getElementsByName()

5:
getElementsByTagName()

评论关闭
发表于: sitebuild | 作者: | 日期: 2008/11/14 05:11

基本概念
就像JavaScript语言本身宽松灵活的风格一样,JavaScript数组也具有类似的特性。虽然JavaScript不像java语言,没有有强大的容器框架(List、Set、Map等)的支撑,但JavaScript数组却完全可以模拟出类似的数据结构。

数组的创建

创建一个空数组:

var arr = new Array();

创建一个数组:

var arr = new Array(‘aaa’,’bbb’,’ccc’);

创建一个长度为10的数组:

var arr = new Array(10);

在javascript1.1中,上述语句有效,在javascript1.2中,上述语句将创建一个长度为1内容为10的数组。所以,还是尽量不要使用指定长度的方式来创建数组。

通过数组直接量(javascript1.2)创建数组:

var arr1 = [‘aaa’,’bbb’,’ccc’];

JavaScript的数组同php的数组一样,你可以指定长度,但是却可以随时改变其长度。在JavaScript中,只有那些真正存储在数组中的元素才能够分配到内存。比如声明如下:

arr[0] = ‘aaa’;
arr[1000] = ‘bbb’;

那么,实际分类内存的只有第0号元素和第1000号元素,而1–999号元素并没有分配内存。

数组的元素的访问

同其他语言一样,JavaScript中同样适用[]对数组元素进行访问:


//获取数组的元素值
var testGetArrValue=arrayObj[1];
//给数组元素赋予新的值
arrayObj[1]= “这是新值”;

遍历数组

var strs = new Array(‘aaa’,’bbb’,’ccc’);
for(var i = 0; i < strs.length; i++){ alert(strs[i]); }

数组元素的添加

虽然创建数组的时候我们指定了数组的长度,但却可以随时改变这个值:


var strs = new Array(3);
strs[4] = ‘darkmi’;
for(var i = 0; i < strs.length; i++){ alert(strs[i]); }

该JavaScript代码片段的输出为前三个alert窗口显示“undefined”,第四个alert窗口显示“darkmi”。

另外我们也可以使用JavaScript数组对象的push方法将一个或多个新元素添加到数组结尾,push方法还会返回数组新长度。

push方法的原型如下:

arrayObj. push([item1 [item2 [. . . [itemN ]]]]);

push方法示例:

var strs = [‘aaa’, ‘bbb’, ‘ccc’];
strs.push(‘ddd’, ‘eee’);
for(var i = 0; i < strs.length; i++){ alert(strs[i]); }

unshift方法将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度。

unshift方法的原型如下:

arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);

unshift方法示例:

var strs = [‘ddd’, ‘eee’];
strs.unshift(‘aaa’, ‘bbb’, ‘ccc’);
for(var i = 0; i < strs.length; i++){ alert(strs[i]); }

splice方法将一个或多个新元素插入到数组的指定位置,插入位置的元素自动后移,返回数组新长度。


arrayObj.splice(insertPos,0,[item1[, item2[, . . . [,itemN]]]]);

数组元素的删除

移除最后一个元素并返回该元素值

arrayObj.pop();

移除最前一个元素并返回该元素值,数组中元素自动前移

arrayObj.shift();

删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素。

arrayObj.splice(deletePos,deleteCount);

数组的截取和合并
以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制 start 之后的所有元素

arrayObj.slice(start, [end]);

将多个数组(也可以是字符串,或者是数组和字符串的混合)连接为一个数组,返回连接好的新的数组

arrayObj.concat([item1[, item2[, . . . [,itemN]]]]);

数组的拷贝

返回数组的拷贝数组,注意是一个新的数组,不是指向

arrayObj.slice(0);

返回数组的拷贝数组,注意是一个新的数组,不是指向

arrayObj.concat();

数组元素的排序
反转元素(最前的排到最后、最后的排到最前),返回数组地址

arrayObj.reverse();

反转元素(最前的排到最后、最后的排到最前),返回数组地址

arrayObj.sort();

数组元素的字符串化

返回字符串,这个字符串将数组的每一个元素值连接在一起,中间用 separator 隔开。

arrayObj.join(separator);

评论关闭