Let's Go!

发布新日志

  • 第一章:Ruby语言最小化

    2011-04-30 01:03:40

     

    谈到Ruby语言,这里只是简单解释了理解第一部分所需的知识。这里并没有完全指出编程中需要注意的地方,本章的目的在于阅读,而非编写Ruby程序。有Ruby经验的人可以放心的跳过这一章。

    关于语法,在第二部分中,我们会一直谈到令人厌倦,所以,本章就不做详尽的讨论了。只有那些用得最多的,比如hash字面量,会谈到一些变化。原则上,不省略那些可能省略的东西。因为这样会让语法规则变得简单,不必到处去写“此处省略”。

    对象 Top

    字符串

    Ruby程序中可操作的东西都是对象,没有像Java的int和long这样的基本类型(primitive)。比如,下面这样写就是一个内容为“content”的字符串对象(String对象)。

    Ruby代码 复制代码 收藏代码
    1. "content"   


    简单的说,这里调用了一个字符串对象,更准确的说法是,这是一个产生字符串对象的“表达式”。因此,如果你写了多次,那么每次都会生成一个字符串对象。

    Ruby代码 复制代码 收藏代码
    1. "content"    
    2. "content"    
    3. "content"   


    这里生成了三个内容同为“content”的对象。

    对了,仅仅这样,程序员是无法看到对象的。下面是在终端上显示对象的方法。

    Ruby代码 复制代码 收藏代码
    1. p("content")   # 显示"content"   


    “#”之后是注释。今后,结果都会以注释的形式给出。

    “p(……)”表示调用函数p,任何对象都可以显示出来,基本上,它就是一个调试函数。

    严格说来,Ruby没有函数,不过,可以把它认为是函数。这个“函数”可以用在任何地方。

    各种各样的字面量(literal)

    接下来,稍微说明一下可以直接生成对象的表达式(字面量)。先来看一下整数和小数。

    Ruby代码 复制代码 收藏代码
    1. # 整数   
    2. 1   
    3. 2   
    4. 100   
    5. 9999999999999999999999999   # 多大的数都能用   
    6.   
    7. # 小数   
    8. 1.0   
    9. 99.999   
    10. 1.3e4     # 1.3×10^4  


    不要忘了,这些都是生成对象的表达式。重复一下,Ruby中没有“基本类型”。

    下面的表达式生成数组对象。

    Ruby代码 复制代码 收藏代码
    1. [1, 2, 3]  


    这段程序生成了一个数组,它按顺序包含1、2、3三个整数作为其元素。数组元素可以使用任意对象,这样也可以。

    Ruby代码 复制代码 收藏代码
    1. [1, "string", 2, ["nested""array"]]  


    下面的表达式生成hash表。

    Ruby代码 复制代码 收藏代码
    1. {"key"=>"value""key2"=>"value2""key3"=>"value3"}  


    hash表是一种在任意对象间建立一一对应关系的结构。上面表达的是一个如下关系的表。

    Ruby代码 复制代码 收藏代码
    1. "key"   →  "value"    
    2. "key2"  →  "value2"    
    3. "key3"  →  "value3"   


    对这样创建出的一个hash表对象,这样问,“什么与‘key’对应?”,如果它能够听到的话,“是‘value’。” 怎么听?使用方法。

    方法调用

    方法可以通过对象调用。C++术语称之为成员函数。没有必要深入解释什么是方法, 这里只简单解释一下记法。

    Ruby代码 复制代码 收藏代码
    1. "content".upcase()  


    这表示对字符串对象(其内容为“content”)调用upcase方法。upcase是这样一个方法,它返回一个新的字符串对象,将小写字母转换为大写字母,其结果如下:

    Ruby代码 复制代码 收藏代码
    1. p("content".upcase())   # 显示"CONTENT"   


    方法可以连续调用。

    Ruby代码 复制代码 收藏代码
    1. "content".upcase().downcase()  


    这里对"content".upcase()的返回值对象调用downcase方法。

    另外,不同于Java或C++拥有公有的字段(成员变量),Ruby对象的接口只有方法。

    程序 Top

    顶层(top level)

    直接写出Ruby表达式就是程序,不必像Java或C++那样定义main()。

    Ruby代码 复制代码 收藏代码
    1. p("content")  


    这就是一个完整的程序了。把这段代码放到一个名为first.rb的文件中,就可以在命令行下执行了:

    Ruby代码 复制代码 收藏代码
    1. % ruby first.rb   
    2. "content"   


    如果使用ruby的-e选项,连创建文件都省了。

    Ruby代码 复制代码 收藏代码
    1. % ruby -e 'p("content")'  
    2. "content"   


    对了,p所写的地方在程序的嵌套层次上是最低的,也就是说,它位于程序的最上层,称为“顶层”。拥有顶层是Ruby作为脚本语言的一大特征。

    在Ruby中,基本上一行就是一条语句,最后面无需分号。因此,下面的程序可以解释为三条语句。

    Ruby代码 复制代码 收藏代码
    1. p("content")   
    2. p("content".upcase())   
    3. p("CONTENT".downcase())  


    如果执行的话,结果是这样。

    Ruby代码 复制代码 收藏代码
    1. % ruby second.rb   
    2. "content"    
    3. "CONTENT"    
    4. "content"   


    局部变量

    在Ruby中,无论是变量还是常量,全都保持着引用(reference)。因此,将一个变量赋值给另一个变量时,不会发生复制。可以考虑一下Java的对象类型变量、C++的对象指针。然而,指针自身的值是无法修改的。

    Ruby变量的首字符表示变量的类型(作用域)。以小写字母或下划线开头的表示局部变量。 “=”表示赋值。

    Ruby代码 复制代码 收藏代码
    1. str = "content"    
    2. arr = [1,2,3]  


    最初的赋值兼做变量声明,无需额外声明。变量是无类型的,因此,无论何种类型,都可以无差别的赋值。下面的程序完全合法。

    Ruby代码 复制代码 收藏代码
    1. lvar = "content"    
    2. lvar = [1,2,3]   
    3. lvar = 1  


    虽说可以,不过没有必要。把不同类型的变量赋值给一个变量通常只能增加阅读的难度。实际的Ruby程序中很少这样做。这里的做法完全是为了举例。

    访问变量是一种常见的记法。

    Ruby代码 复制代码 收藏代码
    1. str = "content"    
    2. p(str)           # 显示"content"   


    随后是一个变量保持引用的例子。

    Ruby代码 复制代码 收藏代码
    1. a = "content"    
    2. b = a   
    3. c = b  


    程序执行后,a、b、c三个局部变量指向同一个对象——第一行生成的字符串对象“content”,如图1所示。


    图1: Ruby变量保持对象引用


    对了,这里的“局部”是某种程度上的局部,暂且还无法解释它的范围。先要说一下,顶层只是一种“局部”作用域。

    常量

    变量名以大写字母开头的是常量。因为是常量,只能对它进行一次(第一次)赋值。

    Ruby代码 复制代码 收藏代码
    1. Const = "content"    
    2. PI = 3.1415926535   
    3.   
    4. p(Const)   # 显示"content"   


    再次赋值会造成错误。说实话,只是警告,不是错误。这么做是为了让一些操作Ruby程序本身的应用程序,比如开发环境,在加载两次文件的时候,不会报错。也就是说,这是为实用而做的妥协,本来应该报错。实际上,直到1.1版本都会报错。

    Ruby代码 复制代码 收藏代码
    1. C = 1   
    2. C = 2   # 实际中只是给出警告,理论上应该报错  


    很多人为“常量”这个词所欺骗,认为常量就是“所指对象一旦被记住,便不再改变”。实际上,并不是常量所指的对象不再改变。如果用英语表达的话,read only比constant更能表现其意图(图2)。顺便说一下,另有一个名为freeze的方法用于让对象本身不变。


    图2: 常量read only的含义


    实际上,常量的作用域还没有谈到。在下一节中,我们会结合类来谈一下。

    控制结构

    Ruby的控制结构很丰富,单单罗列出来就很困难了。先来谈谈if和while。

    Ruby代码 复制代码 收藏代码
    1. if i < 10 then  
    2.   # 主体   
    3. end  
    4.   
    5. while i < 10 do  
    6.   # 主体   
    7. end  


    对于条件表达式,只有两个对象——false和nil——为假,其余所有对象都是真。0和空字符串也是真。

    顺便说一下,当然不会只有false,还有true。它当然是真。

    类与方法 Top



    本来在面向对象系统中,方法属于对象。但那完全是理想世界的事。在普通的程序中,会有大量拥有相同方法集合的程序,坦率的说,以对象为单位去记忆其所拥有的方法并不是件容易的事。通常是用类或多方法(multi method)这样的结构来减少方法的重复定义。

    在Ruby中,将对象与方法连在一起的机制采用了传统的”类”的概念。也就是说,所有对象都属于某个类,由类决定可以调用的方法。这时,就称对象是“某某类的实例(instance)”。

    比如,字符串“str”是String类的一个实例。并且,String类定义了upcase、downcase、strip,以及其它一些方法,所有字符串对象都可以响应这些方法。

    Ruby代码 复制代码 收藏代码
    1. # 因为全都属于字符串类,所以定义了同样的方法   
    2.        "content".upcase()   
    3. "This is a pen.".upcase()   
    4.     "chapter II".upcase()   
    5.   
    6.        "content".length()   
    7. "This is a pen.".length()   
    8.     "chapter II".length()  


    不过,如果调用的方法没有定义怎么办?静态语言的话,会造成编译错误,而Ruby则会成为运行时异常。实际试一下。这种长度的程序还是用-e运行比较方便。

    Ruby代码 复制代码 收藏代码
    1. % ruby -e '"str".bad_method()'  
    2. -e:1: undefined method `bad_method' for "str":String (NoMethodError)  


    如果找不到方法,就会抛出一个名为NoMethodError的错误。

    最后,为那个一遍遍说的令人厌烦的“String的upcase方法”准备了一个专用的记法。 “String#upcase”表示“定义在String类中的upcase方法”。

    顺便说一下,写成“String.upcase”在Ruby世界里有完全不同的意思。至于是什么意思?下节分解。

    类的定义

    迄今为止,都是已经定义的类。当然,还可以定义自己的类。类可以用class语句定义。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2. end  


    这里定义了一个新的类C。定义后,可以如下这样用。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2. end  
    3. c = C.new()   # 生成C的实例,赋值给变量c  


    请注意,生成实例用的不是new C。敏锐的读者可能注意到了,C.new()的记法像是一个方法调用。在Ruby中,生成对象的表达式只是一个方法调用。

    首先,Ruby的类名与常量名是等价的。那么,与类名同名的常量是什么呢?实际上,就是这个类。在Ruby中,所有能操作的东西都是对象。类自然也是对象。这种对象称为类对象。所有的类对象都是Class类的实例。

    也就是说,创建新类对象的class语句,其动作是将类对象赋值给一个与类同名的常量。另一方面,生成实例的操作是,访问这个常量,通过该对象调用方法(通常是new)。看看下面的例子就可以知道,实例生成同普通的方法调用没有区别。

    Ruby代码 复制代码 收藏代码
    1. S = "content"    
    2. class C   
    3. end  
    4.   
    5. S.upcase()  # 得到常量S表示的对象,调用upcase方法   
    6. C.new()     # 得到常量C表示的对象,调用new方法  


    正是因为这样,Ruby中没有new这个保留字。

    接下来,可以用p将生成的类实例显示出来。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2. end  
    3.   
    4. c = C.new()   
    5. p(c)       # #<C:0x2acbd7e4>  


    不过,它到底无法像字符串和整数那样表示得那么漂亮,显示的是类名和所属的内部ID。这个ID表示的是指向该对象指针的值。

    是的是的,可能你已经完全忘了方法名的记法。 “Object.new”表示通过类对象Object本身调用new方法。因此,“Object#new”和“Object.new”完全是两码事,需要严格区分。

    obj = Object.new()   # Object.new
    obj.new()            # Object#new

    实际上,Object#new并没有定义,像这个程序的第二行会造成错误。希望你只把它当作一个例子。

    方法的定义

    即便定义了类,没有定义方法也是没有意义的。让我们试着在类C中定义方法。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def myupcase( str )   
    3.     return str.upcase()   
    4.   end  
    5. end  


    定义方法用def语句。这个例子中定义了myupcase方法。有一个名为str的参数。同变量一样,参数和返回值都不需要写类型。而且可以有多个参数。

    试着用一下定义的方法。缺省情况下,方法可以在外部调用。

    Ruby代码 复制代码 收藏代码
    1. c = C.new()   
    2. result = c.myupcase("content")   
    3. p(result)   # 显示"CONTENT"   


    当然,习惯之后便无需一个个的赋值了。下面的写法也是一样的。

    Ruby代码 复制代码 收藏代码
    1. p(C.new().myupcase("content"))   # 同样显示"CONTENT"   


    self

    在方法执行过程中,通常会保留自己(方法调用的实例)是谁的信息,这个信息可以通过self得到。类似于C++或Java中的this。我们来确认一下。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def get_self()   
    3.     return self  
    4.   end  
    5. end  
    6.   
    7. c = C.new()   
    8. p(c)              # #<C:0x40274e44>   
    9. p(c.get_self())   # #<C:0x40274e44>  


    如你所见,两个表达式返回的是同样的对象。可以确认,对c调用方法,其self就是c。

    那么,通过自身调用方法该怎么做才好呢?首先要考虑通过self进行调用。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def my_p( obj )   
    3.     self.real_my_p(obj)   # 通过自身调用方法   
    4.   end  
    5.   
    6.   def real_my_p( obj )   
    7.     p(obj)   
    8.   end  
    9. end  
    10. C.new().my_p(1)   # 显示1  


    不过,调用“自己的”方法还要特意指定,太麻烦。因此,对self的调用可以省略调用方法的目标对象(接收者,receiver)。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def my_p( obj )   
    3.     real_my_p(obj)   # 可以不指定调用的接收者   
    4.   end  
    5.   
    6.   def real_my_p( obj )   
    7.     p(obj)   
    8.   end  
    9. end  
    10.   
    11. C.new().my_p(1)   # 显示1  


    实例变量

    还有一种说法,对象是数据 + 代码,所以,仅仅定义方法还是没什么用。有必要以对象为单位来记住数据,也就是实例变量,在C++中称为成员变量。

    根据Ruby的变量命名规则,第一个字母决定类型。实例变量是“@”。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def set_i(value)   
    3.     @i = value   
    4.   end  
    5.   
    6.   def get_i()   
    7.     return @i  
    8.   end  
    9. end  
    10.   
    11. c = C.new()   
    12. c.set_i("ok")   
    13. p(c.get_i())   # 显示"ok"   


    实例变量不同于前面介绍的变量,即便不赋值(甚至不定义)也一样可以访问。这种情况下会变成怎样呢……接着前面的代码继续尝试。

    Ruby代码 复制代码 收藏代码
    1. c = C.new()   
    2. p(c.get_i())   # 显示nil  


    没有set就get,结果显示nil。nil表示一个“没有”的对象。存在对象却“没有”,很不可思议,没办法,它就是这样。

    nil也可以作为一个字面量使用。

    Ruby代码 复制代码 收藏代码
    1. p(nil)   # 显示nil  


    initialize

    正如我们看到的,即便是刚刚定义的类也可以调用new方法创建实例。的确如此,不过,有时需要对一个类进行特定的初始化。这时要修改的不是new方法,而是一个名为initialize的方法。它会在new的过程中调用。

    Ruby代码 复制代码 收藏代码
    1. class C   
    2.   def initialize()   
    3.     @i = "ok"    
    4.   end  
    5.   def get_i()   
    6.     return @i  
    7.   end  
    8. end  
    9. c = C.new()   
    10. p(c.get_i())   # 显示"ok"   
  • GOG-groovy on grails vs ROR- ruby on rails

    2011-04-30 00:10:43

     

    groovy参考: groovy.rar(1.15 MB)

    ROR资源列表

    http://www.iteye.com/topic/33776

    来源于  Ruby On Rails 中文社区论坛

    <入门级教程>
    Ruby On Rails入门的中文教材
    http://www.railscn.com/viewtopic.php?t=8&sid=7558f51c768090c52947e01c1dc8885c

    Rolling with Ruby on Rails.chm入门级教程下载
    http://www.railscn.com/viewtopic.php?t=557&sid=7558f51c768090c52947e01c1dc8885c

    RubyCourse_1.0-1.pdf
    http://www.railscn.com/viewtopic.php?t=562&sid=7558f51c768090c52947e01c1dc8885c

    <综合教程>---推荐
    Rails Recipes
    http://www.railscn.com/viewtopic.php?t=634&sid=7558f51c768090c52947e01c1dc8885c

    Ruby for Rails
    http://www.railscn.com/viewtopic.php?t=620&sid=7558f51c768090c52947e01c1dc8885c

    Best of Ruby Quiz
    http://www.railscn.com/viewtopic.php?t=498&sid=7558f51c768090c52947e01c1dc8885c

    Agile Web Development with Rails
    英文版教程http://www.railscn.com/viewtopic.php?t=163&sid=7558f51c768090c52947e01c1dc8885c
    中文版教程http://my4java.itpub.net/category/9983/23097
    省墨打印版http://www.railscn.com/viewtopic.php?t=542&sid=7558f51c768090c52947e01c1dc8885c

    Ruby Hacking Guide
    http://www.railscn.com/viewtopic.php?t=565&sid=7558f51c768090c52947e01c1dc8885c

    Enterprise Integration with Ruby
    http://www.railscn.com/viewtopic.php?t=539&sid=7558f51c768090c52947e01c1dc8885c

    Programming Ruby 2nd edition
    http://www.railscn.com/viewtopic.php?t=115&sid=e9def3ef4bbbeafb16bcb8c8da5931f0

    Ruby In A Nutshell
    http://www.railscn.com/viewtopic.php?t=143&sid=7558f51c768090c52947e01c1dc8885c


    <实例教程>
    Flex 和 ROR 结合应用的教程
    http://www.railscn.com/about660.html

    一个结合flash,rails和ajax一起的购物车程序(教程)
    http://www.railscn.com/viewtopic.php?t=639&sid=7558f51c768090c52947e01c1dc8885c

    12个顶尖实例
    http://oio.zzdragon.name/?p=98

    高级Rails ajax教程
    http://www.railscn.com/viewtopic.php?t=621&sid=1777733ef6a90f744b9fdc3361c81d96


    <手册>
    rails1.1新特性介绍
    http://www.railscn.com/viewtopic.php?t=522&sid=7558f51c768090c52947e01c1dc8885c

    rails 1.1 api chm
    http://www.railscn.com/viewtopic.php?t=552&sid=7558f51c768090c52947e01c1dc8885c

    Ruby-Library-QuickRef
    http://www.railscn.com/viewtopic.php?t=564&sid=7558f51c768090c52947e01c1dc8885c

    Understanding Ruby's Object Model
    http://www.railscn.com/viewtopic.php?t=563&sid=7558f51c768090c52947e01c1dc8885c

    <论坛>
    http://www.railscn.com
    http://chinaonrails.com
    http://forum.javaeye.com
    http://rorwiki.hellopen.net

    <博客>
    铁道播客:有诸多视频教程
    http://rorcast.blogger2blogger.com/

    my4java的文字博客:有很多教程的译稿、笔记等
    http://my4java.itpub.net/

    cnruby道喜技术日记:众多实例教程
    http://www.hhtong.com/blog1/

    caphe的博客
    http://www.blogjava.net/cap

    Caiwangqin的博客
    http://www.uuzone.com/blog/uu_1115110/

    <工具使用>
    rails的IDE讨论
    http://www.railscn.com/viewtopic.php?t=3&sid=7558f51c768090c52947e01c1dc8885c

    rails的IDE讨论另一篇
    http://www.railscn.com/viewtopic.php?t=510&sid=7558f51c768090c52947e01c1dc8885c

    JEDIT与ror的讨论
    http://www.railscn.com/viewtopic.php?t=518&sid=7558f51c768090c52947e01c1dc8885c

    komodo
    http://www.railscn.com/viewtopic.php?t=310&sid=7558f51c768090c52947e01c1dc8885c

    dreamweaver的可下rubyweaver
    http://www.railscn.com/viewtopic.php?t=451&sid=7558f51c768090c52947e01c1dc8885c


    <环境设置>
    ROR with Lighttpd+SCGI on Windows
    http://www.railscn.com/viewtopic.php?t=348&sid=7558f51c768090c52947e01c1dc8885c

    ROR with Lighttpd问题
    http://www.railscn.com/viewtopic.php?t=618&sid=7558f51c768090c52947e01c1dc8885c

    lighttpd+scgi 多域名配置
    http://www.railscn.com/viewtopic.php?t=471&sid=7558f51c768090c52947e01c1dc8885c

    大负荷下apache+fastcgi出错问题,
    http://www.railscn.com/viewtopic.php?t=589&sid=7558f51c768090c52947e01c1dc8885c

    装fastCGI+MySQL驱动时候的问题
    http://www.railscn.com/viewtopic.php?t=566&sid=7558f51c768090c52947e01c1dc8885c

    typo的安装问题
    http://www.railscn.com/viewtopic.php?t=633&sid=7558f51c768090c52947e01c1dc8885c

    Getting start rails' - 在DreamHost上建Typo
    http://www.railscn.com/viewtopic.php?t=377&sid=7558f51c768090c52947e01c1dc8885c

    ROR性能测试
    http://www.railscn.com/viewtopic.php?t=454&sid=7558f51c768090c52947e01c1dc8885c

    Memcache-client for Ruby On Rails
    http://www.railscn.com/viewtopic.php?t=394&sid=7558f51c768090c52947e01c1dc8885c

    <空间申请>
    free hosting ROR
    http://www.railscn.com/about703.html

    HostingRail.com - 免费Ruby on Rails空间
    http://www.railscn.com/viewtopic.php?t=628&sid=7558f51c768090c52947e01c1dc8885c

    免费的webhosting-ror 100mb
    http://www.railscn.com/viewtopic.php?t=504&sid=7558f51c768090c52947e01c1dc8885c

    国内的Ruby on Rails空间
    http://www.railscn.com/viewtopic.php?t=285&sid=7558f51c768090c52947e01c1dc8885c


    <真实应用>
    中文站点
    http://www.railscn.com/about670.html
    http://www.railscn.com/viewtopic.php?
    http://www.railscn.com/about337.html
    外国站点
    http://www.railscn.com/viewtopic.php?t=505&sid=7558f51c768090c52947e01c1dc8885c


    <杂类>
    框架比较J2EE, Rails, Zope(and more..) 视频
    http://www.railscn.com/viewtopic.php?t=641&sid=7558f51c768090c52947e01c1dc8885c

    groovy on rails
    http://www.railscn.com/viewtopic.php?t=599&sid=7558f51c768090c52947e01c1dc8885c

    用户登录引擎(共两部分)
    http://www.railscn.com/viewtopic.php?t=434&highlight=login&sid=6d906cbcb22afe0eda158d772b0a72c2
    http://www.railscn.com/viewtopic.php?t=435&highlight=login&sid=6d906cbcb22afe0eda158d772b0a72c2

    如何开启一个后台任务?railscron
    http://www.railscn.com/viewtopic.php?t=623&sid=7558f51c768090c52947e01c1dc8885c

    如何上传一个文件
    http://www.railscn.com/viewtopic.php?t=635&sid=7558f51c768090c52947e01c1dc8885c

    如何更改首页
    http://www.railscn.com/viewtopic.php?t=409&sid=7558f51c768090c52947e01c1dc8885c

     

     

  • 命令行 单引号和双引号

    2011-04-27 11:04:42

    命令行小技巧:
    linux 下面单引号和双引号可以区分,可以嵌套区分 -d '"name:aa","pwd:bb"'
    windows 下面不认单引号,双引号可以正确执行,但是换成单引号就报错:

    curl: (1) Unsupported protocol: 'http
    'q' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    'coordinate' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。

    -----

    单引号嵌套双引号: ' " " '

    对双引号进行转义  " \" \" "

    ----

    不同操作系统下的路径也是有差异的。注意区分操作。

    os path

  • 查看apache连接数及apache工作原理

    2011-04-15 21:57:01

     

    ps -ef|grep httpd|wc -l
    netstat -nat|grep -i "80" |wc -l
    netstat -na|grep ESTABLISHED|wc -l
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r +0n
    返回结果示例:
    LAST_ACK 5
    SYN_RECV 30
    ESTABLISHED 1597
    FIN_WAIT1 51
    FIN_WAIT2 504
    TIME_WAIT 1057
    其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
     
     
     
     
     
     
     
     
    状态:描述
    CLOSED:无连接是活动的或正在进行
    LISTEN:服务器在等待进入呼叫
    SYN_RECV:一个连接请求已经到达,等待确认
    SYN_SENT:应用已经开始,打开一个连接
    ESTABLISHED:正常数据传输状态
    FIN_WAIT1:应用说它已经完成
    FIN_WAIT2:另一边已同意释放
    ITMED_WAIT:等待所有分组死掉
    CLOSING:两边同时尝试关闭
    TIME_WAIT:另一边已初始化一个释放
    LAST_ACK:等待所有分组死掉
     
     
    转自:http://blog.163.com/mobile-man/blog/static/2180267201002443034392/
     
     


    Linux下查看apache连接数

    1、查看apache当前并发访问数:
     netstat -an | grep ESTABLISHED | wc -l

    对比httpd.conf中MaxClients的数字差距多少。

    2、查看有多少个进程数:
    ps aux|grep httpd|wc -l

    3、可以使用如下参数查看数据
    server-status?auto

    #ps -ef|grep httpd|wc -l
    1388
    统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
    表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。

    #netstat -nat|grep -i "80"|wc -l
    4341
    netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。
    最终返回的数字就是当前所有80端口的请求总数。

    #netstat -na|grep ESTABLISHED|wc -l
    376
    netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
    最终返回的数字就是当前所有80端口的已建立连接的总数。

    netstat -nat||grep ESTABLISHED|wc - 可查看所有建立连接的详细记录

    查看Apache的并发请求数及其TCP连接状态:
      Linux命令:
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    (这条语句是从 新浪互动社区事业部 新浪互动社区事业部技术总监王老大那儿获得的,非常不错)返回结果示例:
      LAST_ACK 5
      SYN_RECV 30
      ESTABLISHED 1597
      FIN_WAIT1 51
      FIN_WAIT2 504
      TIME_WAIT 1057
      其中的
    SYN_RECV表示正在等待处理的请求数;
    ESTABLISHED表示正常数据传输状态;
    TIME_WAIT表示处理完毕,等待超时结束的请求数。

    ---------------------------------------------------------------------------------------------

    查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):

    Linux命令:
         ps -ef | grep httpd | wc -l

    查看Apache的并发请求数及其TCP连接状态:

    Linux命令:
         netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    返回结果示例:
      LAST_ACK 5
      SYN_RECV 30
      ESTABLISHED 1597
      FIN_WAIT1 51
      FIN_WAIT2 504
      TIME_WAIT 1057

    说明:  
       SYN_RECV表示正在等待处理的请求数;
        ESTABLISHED表示正常数据传输状态;
       TIME_WAIT表示处理完毕,等待超时结束的请求数。

     

    http://archive.cnblogs.com/a/1886067/
  • loadrunner 添加压力机

    2011-04-15 14:57:40

     

    安装Controller的机子如果要联合别的机子一起跑脚本
    第一,保证要联合的机子上装了LR agent,并启用了(状态栏那里会有一个小卫星)
    第二,RPC服务开启
    第三,请从你的Controller的机子上登陆下要联合的机子。(运行里面输入  \\机器名)

     

     

    个人觉得,性能测试不是单单用LR做个脚本,找台机器压一下就好了。
    你现在需要
    1 是了解LR的运行原理和机制。
    2 了解你测试中间件的一些基本知识
    3 制定你要测试系统预期要达到的目标
    4 根据实际的业务需求合理的制定测试场景和测试脚本
    5 在是考虑如何施压。是否需要多机器
    6 分析测试结果,决定下一步

     

     

     

     

  • 06_redis学习笔记整理

    2011-04-15 00:04:46

     

    redis学习笔记整理

     

    一、. redis 环境搭建. 2

    二、. redis学习笔记之数据类型. 3

    三、. redis学习笔记之排序. 11

    四、. redis学习笔记之事务. 16

    五、. redis学习笔记之pipeline 20

    六、. redis学习笔记之发布订阅. 23

    七、. redis学习笔记之持久化. 28

    八、. redis学习笔记之主从复制. 30

    九、. redis学习笔记之虚拟内存. 31

     

    word下载:   Redis学习笔记整理.rar(28.9 KB)

  • 05_LAMP+Java+Memcache环境搭建

    2011-04-14 23:30:07

    LAMP+Java+Memcache环境搭建 By Morgan Zhengrf
    目 录
    一、Linux OS版本 .................................................................................................................... 1
    二、所需软件 ........................................................................................................................... 1
    三、安装apache ...................................................................................................................... 1
    四、安装GD、libxml、freetype、libmcrypt、openssl、jpeg、libpng和zlib ..................... 1
    五、安装MySQL ....................................................................................................................... 3
    六、安装PHP ........................................................................................................................... 4
    七、安装及配置JDK ................................................................................................................ 5
    八、安装及配置PHP扩展JAVA ............................................................................................. 5
    九、安装及配置PHP扩展memcache .................................................................................... 6
    1、安装libevent ................................................................................................................... 6
    2、安装memcached ............................................................................................................ 6
    3、安装及配置memcache .................................................................................................. 7
    1
    一、Linux OS版本
    CentOS Release 5.3 (Final)
    二、所需软件
    Apache: httpd-2.2.9.tar.gz GD2: gd-2.0.35.tar.gz Libxml: libxml2-2.6.32.tar.gz Freetype: freetype-2.3.5.tar.gz Jpeg: jpegsrc.v6b.tar.gz Libpng: libpng-1.2.29.tar.gz Zlib: zlib-1.2.3.tar.gz MySQL: mysql-5. 0.67.tar.gz PHP: php-5.2.6.tar.gz (不安装ZendOptimizer:ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz) JDK: jdk-6u22-linux-i586.bin Php-java-bridge: php-java-bridge_4.0.7.tar.gz
    (http://ftp.heanet.ie/disk1/sourceforge/p/project/ph/php-java-bridge/OldFiles/)
    Libevent: libevent-1.4.9-stable.tar.gz(http://monkey.org/~provos/libevent/)
    Memcached: memcached-1.2.7.tar.gz(http://pecl.php.net/package/memcache)
    Memcache: memcache-2.2.5.tgz(http://www.danga.com/memcached/)
    三、安装apache
    # tar xzvf httpd-2.2.9.tar.gz # cd http-2.2.9 # ./configure --prefix=/usr/local/apache --enable-rewrite=shared --enable-proxy=shared --enable-proxy-ajp=shared --enable-mods-shared=all --enable-so --enable-dav # make # make install
    四、安装GD、libxml、freetype、libmcrypt、openssl、jpeg、libpng和zlib
    tar xzvf gd-2.0.35.tar.gz cd gd/2.0.35/ ./configure --prefix=/usr/local/gd2 make make install tar xzvf libxml2-2.6.32.tar.gz
    2
    cd libxml2-2.6.32 ./configure --prefix=/usr/local/libxml2 make make install tar xzvf freetype-2.3.5.tar.gz cd freetype-2.3.5 ./configure --prefix=/usr/local/freetpye make make install tar xzvf libmcrypt-2.5.8.tar.gz cd libmcrypt-2.5.8 ./configure --prefix=/usr/local/libmcrypt make make install tar xzvf openssl-0.9.8g.tar.gz cd openssl-0.9.8g ./config --prefix=/usr/local/openssl make make install mkdir -p /usr/local/jpeg6/include mkdir /usr/local/jpeg6/lib mkdir /usr/local/jpeg6/bin mkdir -p /usr/local/jpeg6/man/man1 tar xzvf jpegsrc.v6b.tar.gz cd jpeg-6b ./configure --prefix=/usr/local/jpeg6 make make install tar xzvf libpng-1.2.29.tar.gz cd libpng-1.2.29 ./configure --prefix=/usr/local/libpng make make install tar xzvf zlib-1.2.3.tar.gz cd zlib-1.2.3 ./configure --prefix=/usr/local/zlib make make install
    3
    五、安装MySQL
    # groupadd mysql # useradd –g mysql mysql # mkdir –p /usr/local/mysql/data # chown –R root /usr/local/mysql # chgrp –R mysql /usr/local/mysql # chown –R mysql /usr/local/mysql/data # chmod –R 755 /usr/local/mysql/data # chown –R mysql:mysql /usr/local/mysql/data ########################### ## Before installing mysql, please ensure that the gcc-c++ package is installed. ## If not, please intall gcc-c++ package first. ## In the CentOS Linux, you can use the command " yum install gcc-c++ " to install. ########################## ########################## ## MySQL事件调度器是在MySQL 5.1中新增的另一个特色功能, ## 可以作为定时任务调度器, ## 取代部分原先只能用操作系统任务调度器才能完成的定时功能。 ## 特点:MySQL的事件调度器则可以实现每秒钟执行一个任务。 ########################## # tar xzvf mysql-5.0.67.tar.gz # cd mysql-5.0.67. # ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --localstatedir=/usr/local/mysql/data # make # make install ## generate the mysql's system database # /usr/local/mysql/bin/mysql_install_db --user=mysql& ## start MySQL Server # /usr/local/mysql/bin/mysqld_safe --user=mysql& ## attention: ## stop MySQL Server:/usr/local/mysql/share/mysql/mysql.server stop ## set root’s password # /usr/local/mysql/bin/mysqladmin -u root password "123456"
    4
    # mysql -uroot -p mysql> grant all privileges on *.* to 'root'@'%' identified by '123456'; mysql> flush privileges; mysql> exit
    六、安装PHP
    # mkdir -p /usr/local/php/etc # tar jxvf php-5.2.6.tar.gz # cd php-5.2.6 # ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-gd=/usr/local/gd2 --with-libxml-dir=/usr/local/libxml2 --with-freetype-dir=/usr/local/freetype --with-mcrypt=/usr/local/libmcrypt --with-openssl=/usr/local/openssl --with-jpeg-dir=/usr/local/jpeg6 --with-png-dir=/usr/local/libpng --with-zlib --with-zlib-dir=/usr/local/zlib --with-gettext --with-curl --with-ldap --with-iconv --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-embed --enable-calendar --enable-magic-quotes --enable-sockets --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-pcntl --enable-shmop # make # make install # cp php.ini-dist /usr/local/php/etc/php.ini 修改apache的httpd.conf文件,在文件的最后添加如下信息: # vi /usr/local/apache/conf/httpd.conf AddType application/x-httpd-php .php 在httpd.conf文件中增加 index.php <IfModule dir_module> DirectoryIndex index.php index.html index.htm </IfModule> 重启apache # /usr/local/apache/bin/apachectl restart
    5
    七、安装及配置JDK
    # chmod a+x jdk-6u22-linux-i586.bin # ./ jdk-6u22-linux-i586.bin # mv jdk1.6.0_22 /usr/local/java # vi /etc/profile 在profile文件的末尾添加如下内容 export JAVA_HOME=/usr/local/java export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=./:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:./ # source /etc/profile 重新打开一个终端,执行如下命令: # java –version java version "1.6.0_01" Java(TM) SE Runtime Environment (build 1.6.0_01-b06) Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode) 说明JDK安装成功。
    八、安装及配置PHP扩展JAVA
    # tar xzvf php-java-bridge_4.0.7.tar.gz # cd php-java-bridge-4.0.7 # /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519 # ./configure --with-java=/usr/local/java,/usr/local/java/jre # make # make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ # cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613 # ln -s java.so libphp_java.so # mv * ../ 配置 php.ini 文件 # vi php.ini 加入 java.class.path=/usr/local/php/lib/php/extensions
    6
    java.home =/usr/local/java java.library =/usr/local/java/lib java.library.path =/usr/local/php/lib/php/extensions extension_dir = /usr/local/php/lib/php/extensions extension=java.so 6、重启apache # /usr/local/apache/bin/apachectl restart //usr/local/java/bin/java -Djava.library.path=/usr/local/php/lib/php/extensions -Djava.class.path=/usr/local/php/lib/php/extensions/JavaBridge.jar -Djava.awt.headless=true -Dphp.java.bridge.base=/usr/local/php/lib/php/extensions php.java.bridge.Standalone LOCAL:@java-bridge-61a3 1 若重启完apache,没有出现开启 JavaBridge.jar的服务程序,请手动重启: # java -jar /usr/local/php/lib/php/extensions/JavaBridge.jar SERVLET:8080 3 /log/JavaBridge.log 测试php-java-bridge是否安装成功: test.php文件内容: <?php $system=new Java("java.lang.System"); print 'Java version = '.$System->getProperty('java.version'); echo "the process closes...."; ?> 然后,执行php命令: # /usr/local/php/bin/php test.php Java version=1.6.0_01 <br> 说明安装成功!
    九、安装及配置PHP扩展memcache
    1、安装libevent
    # tar xzvf libevent-1.4.9-stable.tar.gz # cd libevent-1.4.9-stable # ./configure --prefix=/usr --with-php-config=/usr/local/php/bin/php-config # make # make install # ls /usr/lib/ |grep libevent
    2、安装memcached
    # tar xzvf memcached-1.2.7.tar.gz # cd memcached-1.2.7 #./configure --with-libevent=/usr --with-php-config=/usr/local/php/bin/php-config
    7
    # make # make install # ls /usr/local/bin/memcached
    3、安装及配置memcache
    # tar xzvf memcache-2.2.5.tgz # cd memcache-2.2.5 # /usr/local/php/bin/phpize #./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir # make # make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ # cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ # mv * ../ # vi /usr/local/php/etc/php.ini 在php.ini文件的末尾添加如下内容: [Memcache] extension_dir=/usr/local/php/lib/php/extensions extension=memcache.so 重新启动apache服务: # /usr/local/apache/bin/apachectl restart 启动memcache服务: # /usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 12006 -c 256 -P /tmp/memcached.pid
    【相关内容链接:http://morgan363.javaeye.com】

    pdf下载: LAMP+Java+Memcache环境搭建.rar(307 KB)

     

  • 04_Ubuntu10下Memcached1.4.5安装

    2011-04-14 23:23:56

    Ubuntu10下Memcached1.4.5安装

     

    Memcached是高性能的分布式内存缓存服务器。一般通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。Memcached常用于存放对数据库操作的结果集以及session信息。memcached是居家旅行必备之佳品,所以也要装备一下。

    安装libevent2.0.10
    这个是装Memcached1.4.5的前提条件。Ubuntu10已经有libevent1.4的了,可是版本过低。 下载地址: http://monkey.org/~provos/libevent/

    下载: libevent-2.0.10.rar(775 KB)

    改名-解压-编译安装

    Java代码  
    1. mv libevent-2.0.10-stable.tar.gz libevent2010.tar.gz   
    2. tar –zxvf libevent2010.tar.gz    
    3. cd libevent-2.0.10-stable   
    4. ./configure -prefix=/usr/local   
    5. make   
    6. make install  


    安装完后可以查看下/usr/local/lib是否有libevent等文件
    Java代码  
    1. ls -al /usr/local/lib|grep libevent   



    安装memcache1.4.5
    下载地址: http://code.google.com/p/memcached/downloads/list
    下载: memcached-1.4.5.rar(296 KB)

    Java代码  
    1. tar –zxvf memcached-1.4.5.tar.gz   
    2. cd memcached-1.4.5  
    3. ./configure   
    4. make   
    5. sudo make install  


    查看安装结果
    Java代码
    1. ls -al /usr/local/bin/memcached  


    启动memcached
    Java代码  
    1. /usr/local/bin/memcached -d -m 128 -u root -p 11211 –P /tmp/memcached.pid  

    参数: -d 启动守护进程(后台运行)
          -m 分配给memcache使用的内存,单位是MB
          -u 运行memcached的用户
          -l 监听的服务器IP
          -p 监听的服务器端口,默认是11211
          -P(大写) 保存Memcache的pid文件,后面跟路径

    启动Memcached报错
    guangbo@guangbo-laptop:/usr/local/bin$ /usr/local/bin/memcached -d -m 128 -u root -p 11211 -P /tmp/memcached.pid
    /usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
    /usr/local/lib下安装有libevent2.0相关的包。

    解决方法:建立软连接
    Java代码  
    1. sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5  


    查看是否建立成功
    guangbo@guangbo-laptop:/usr/local/lib$
    Java代码  
    1. ls -al /usr/lib|grep libevent  


    telnet测试memcached
    Java代码  
    1. telnet 192.168.1.2 11211  

    Trying 192.168.1.2...
    Connected to 192.168.1.2.
    Escape character is '^]'

    查看版本
    Java代码  
    1. version  

    VERSION 1.4.5

    stats查看memcached的详细信息
    stats
    Java代码  
    1.   
    STAT pid 9192
    STAT uptime 352
    STAT time 1300907990
    STAT version 1.4.5
    STAT pointer_size 32


    Ok,安装memcached1.4.5成功。这次比较顺利,没有搞nginx那么多错。
     


    原文:
    http://www.iteye.com/topic/974445

     

     

     


     

  • 03_Java环境下Memcached应用详解

    2011-04-14 23:21:59

    Java环境下Memcached应用详解

     

    这里将介绍Java环境下Memcached应用,Memcached主要是集群环境下的缓存解决方案,希望本文对大家有所帮助。

      本文将对在Java环境下Memcached应用进行详细介绍。Memcached主要是集群环境下的缓存解决方案,可以运行在Java或者.NET平台上,这里我们主要讲的是Windows下的Memcached应用。

      这些天在设计SNA的架构,接触了一些远程缓存、集群、session复制等的东西,以前做企业应用的时候感觉作用不大,现在设计面对internet的系统架构时就非常有用了,而且在调试后看到压力测试的情况还是比较好的。

      在缓存的选择上有过很多的思考,虽然说memcached结合java在序列化上性能不怎么样,不过也没有更好的集群环境下的缓存解决方案了,就选择了memcached。本来计划等公司买的服务器到位装个linux再来研究memcached,但这两天在找到了一个windows下的Memcached版本,就动手开始调整现有的框架了。

      Windows下的Server端很简单,不用安装,双击运行后默认服务端口是11211,没有试着去更改端口,因为反正以后会用Unix版本,到时再记录安装步骤。下载客户端的JavaAPI包,接口非常简单,参考API手册上就有现成的例子。

      目标,对旧框架缓存部分进行改造:

      1、缓存工具类

      2、hibernate的provider

      3、用缓存实现session机制

      今天先研究研究缓存工具类的改造,在旧框架中部分函数用了ehcache对执行结果进行了缓存处理,现在目标是提供一个缓存工具类,在配置文件中配置使用哪种缓存(memcached或ehcached),使其它程序对具体的缓存不依赖,同时使用AOP方式来对方法执行结果进行缓存。

      首先是工具类的实现:

      在Spring中配置

      Java代码


    <bean id="cacheManager"     
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">      
    <property name="configLocation">      
    <value>classpath:ehcache.xmlvalue>      
    property>      
    bean>      
     
    <bean id="localCache"     
    class="org.springframework.cache.ehcache.EhCacheFactoryBean">      
    <property name="cacheManager" ref="cacheManager" />      
    <property name="cacheName"     
    value="×××.cache.LOCAL_CACHE" />      
    bean>      
     
    <bean id="cacheService"     
    class="×××.core.cache.CacheService" init-method="init" destroy-method="destory">      
    <property name="cacheServerList" value="${cache.servers}"/>      
    <property name="cacheServerWeights" value="${cache.cacheServerWeights}"/>      
    <property name="cacheCluster" value="${cache.cluster}"/>      
    <property name="localCache" ref="localCache"/>      
    bean>     
      
    <bean id="cacheManager"  
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  
    <property name="configLocation">  
    <value>classpath:ehcache.xmlvalue>  
    property>  
    bean>  
    <bean id="localCache"  
    class="org.springframework.cache.ehcache.EhCacheFactoryBean">  
    <property name="cacheManager" ref="cacheManager" />  
    <property name="cacheName"  
    value="×××.cache.LOCAL_CACHE" />  
    bean>  
     
    <bean id="cacheService"  
    class="×××.core.cache.CacheService" init-method="init" destroy-method="destory">  
    <property name="cacheServerList" value="${cache.servers}"/>  
    <property name="cacheServerWeights" value="${cache.cacheServerWeights}"/>  
    <property name="cacheCluster" value="${cache.cluster}"/>  
    <property name="localCache" ref="localCache"/>  
    bean> 

      在properties文件中配置${cache.servers} ${cache.cacheServerWeights} ${cache.cluster}

      具体工具类的代码

      Java代码


    /**    
    * @author Marc    
    *     
    */     
    public class CacheService {      
    private Log logger = LogFactory.getLog(getClass());      
    private Cache localCache;      
    String cacheServerList;      
    String cacheServerWeights;      
    boolean cacheCluster = false;      
    int initialConnections = 10;      
    int minSpareConnections = 5;      
    int maxSpareConnections = 50;      
    long maxIdleTime = 1000 * 60 * 30; // 30 minutes     
    long maxBusyTime = 1000 * 60 * 5; // 5 minutes     
    long maintThreadSleep = 1000 * 5; // 5 seconds     
    int socketTimeOut = 1000 * 3; // 3 seconds to block on reads     
    int socketConnectTO = 1000 * 3; // 3 seconds to block on initial     
    // connections. If 0, then will use blocking     
    // connect (default)     
    boolean failover = false; // turn off auto-failover in event of server     
    // down     
    boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in     
    // pool     
    MemCachedClient mc;      
    public CacheService(){      
    mc = new MemCachedClient();      
    mc.setCompressEnable(false);      
    }      
    /**    
    * 放入    
    *     
    */     
    public void put(String keyObject obj) {      
    Assert.hasText(key);      
    Assert.notNull(obj);      
    Assert.notNull(localCache);      
    if (this.cacheCluster) {      
    mc.set(key, obj);      
    } else {      
    Element element = new Element(key, (Serializable) obj);      
    localCache.put(element);      
    }      
    }      
    /**    
    * 删除     
    */     
    public void remove(String key){      
    Assert.hasText(key);      
    Assert.notNull(localCache);      
    if (this.cacheCluster) {      
    mc.delete(key);      
    }else{      
    localCache.remove(key);      
    }      
    }      
    /**    
    * 得到    
    */     
    public Object get(String key) {      
    Assert.hasText(key);      
    Assert.notNull(localCache);      
    Object rt = null;      
    if (this.cacheCluster) {      
    rt = mc.get(key);      
    } else {      
    Element element = null;      
    try {      
    element = localCache.get(key);      
    } catch (CacheException cacheException) {      
    throw new DataRetrievalFailureException("Cache failure: "     
    + cacheException.getMessage());      
    }      
    if(element != null)      
    rt = element.getValue();      
    }      
    return rt;      
    }      
    /**    
    * 判断是否存在    
    *     
    */     
    public boolean exist(String key){      
    Assert.hasText(key);      
    Assert.notNull(localCache);      
    if (this.cacheCluster) {      
    return mc.keyExists(key);      
    }else{      
    return this.localCache.isKeyInCache(key);      
    }      
    }      
    private void init() {      
    if (this.cacheCluster) {      
    String[] serverlist = cacheServerList.split(",");      
    Integer[] weights = this.split(cacheServerWeights);      
    // initialize the pool for memcache servers     
    SockIOPool pool = SockIOPool.getInstance();      
    pool.setServers(serverlist);      
    pool.setWeights(weights);      
    pool.setInitConn(initialConnections);      
    pool.setMinConn(minSpareConnections);      
    pool.setMaxConn(maxSpareConnections);      
    pool.setMaxIdle(maxIdleTime);      
    pool.setMaxBusyTime(maxBusyTime);      
    pool.setMaintSleep(maintThreadSleep);      
    pool.setSocketTO(socketTimeOut);      
    pool.setSocketConnectTO(socketConnectTO);      
    pool.setNagle(nagleAlg);      
    pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);      
    pool.initialize();      
    logger.info("初始化memcached pool!");      
    }      
    }      
     
    private void destory() {      
    if (this.cacheCluster) {      
    SockIOPool.getInstance().shutDown();      
    }      
    }      
    }     
    /**   
    * @author Marc   
    *    
    */  
    public class CacheService {   
    private Log logger = LogFactory.getLog(getClass());   
    private Cache localCache;   
    String cacheServerList;   
    String cacheServerWeights;   
    boolean cacheCluster = false;   
    int initialConnections = 10;   
    int minSpareConnections = 5;   
    int maxSpareConnections = 50;   
    long maxIdleTime = 1000 * 60 * 30; // 30 minutes   
    long maxBusyTime = 1000 * 60 * 5; // 5 minutes   
    long maintThreadSleep = 1000 * 5; // 5 seconds   
    int socketTimeOut = 1000 * 3; // 3 seconds to block on reads   
    int socketConnectTO = 1000 * 3; // 3 seconds to block on initial   
    // connections. If 0, then will use blocking   
    // connect (default)   
    boolean failover = false; // turn off auto-failover in event of server   
    // down   
    boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in   
    // pool   
    MemCachedClient mc;   
    public CacheService(){   
    mc = new MemCachedClient();   
    mc.setCompressEnable(false);   
    }   
    /**   
    * 放入   
    *    
    */  
    public void put(String key, Object obj) {   
    Assert.hasText(key);   
    Assert.notNull(obj);   
    Assert.notNull(localCache);   
    if (this.cacheCluster) {   
    mc.set(key, obj);   
    } else {   
    Element element = new Element(key, (Serializable) obj);   
    localCache.put(element);   
    }   
    }   
    /**   
    * 删除    
    */  
    public void remove(String key){   
    Assert.hasText(key);   
    Assert.notNull(localCache);   
    if (this.cacheCluster) {   
    mc.delete(key);   
    }else{   
    localCache.remove(key);   
    }   
    }   
    /**   
    * 得到   
    */  
    public Object get(String key) {   
    Assert.hasText(key);   
    Assert.notNull(localCache);   
    Object rt = null;   
    if (this.cacheCluster) {   
    rt = mc.get(key);   
    } else {   
    Element element = null;   
    try {   
    element = localCache.get(key);   
    } catch (CacheException cacheException) {   
    throw new DataRetrievalFailureException("Cache failure: "  
    + cacheException.getMessage());   
    }   
    if(element != null)   
    rt = element.getValue();   
    }   
    return rt;   
    }   
    /**   
    * 判断是否存在   
    *    
    */  
    public boolean exist(String key){   
    Assert.hasText(key);   
    Assert.notNull(localCache);   
    if (this.cacheCluster) {   
    return mc.keyExists(key);   
    }else{   
    return this.localCache.isKeyInCache(key);   
    }   
    }   
    private void init() {   
    if (this.cacheCluster) {   
    String[] serverlist = cacheServerList.split(",");   
    Integer[] weights = this.split(cacheServerWeights);   
    // initialize the pool for memcache servers   
    SockIOPool pool = SockIOPool.getInstance();   
    pool.setServers(serverlist);   
    pool.setWeights(weights);   
    pool.setInitConn(initialConnections);   
    pool.setMinConn(minSpareConnections);   
    pool.setMaxConn(maxSpareConnections);   
    pool.setMaxIdle(maxIdleTime);   
    pool.setMaxBusyTime(maxBusyTime);   
    pool.setMaintSleep(maintThreadSleep);   
    pool.setSocketTO(socketTimeOut);   
    pool.setSocketConnectTO(socketConnectTO);   
    pool.setNagle(nagleAlg);   
    pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);   
    pool.initialize();   
    logger.info("初始化memcachedpool!");   
    }   
    }   
    private void destory() {   
    if (this.cacheCluster) {   
    SockIOPool.getInstance().shutDown();   
    }   
    }   

      然后实现函数的AOP拦截类,用来在函数执行前返回缓存内容

      Java代码


    public class CachingInterceptor implements MethodInterceptor {      
     
    private CacheService cacheService;      
    private String cacheKey;      
     
    public void setCacheKey(String cacheKey) {      
    this.cacheKey = cacheKey;      
    }      
     
    public void setCacheService(CacheService cacheService) {      
    this.cacheService = cacheService;      
    }      
     
    public Object invoke(MethodInvocation invocation) throws Throwable {      
    Object result = cacheService.get(cacheKey);      
    //如果函数返回结果不在Cache中,执行函数并将结果放入Cache     
    if (result == null) {      
    result = invocation.proceed();      
    cacheService.put(cacheKey,result);      
    }      
    return result;      
    }      
    }     
    public class CachingInterceptor implements MethodInterceptor {   
     
    private CacheService cacheService;   
    private String cacheKey;   
     
    public void setCacheKey(String cacheKey) {   
    this.cacheKey = cacheKey;   
    }   
     
    public void setCacheService(CacheService cacheService) {   
    this.cacheService = cacheService;   
    }   
     
    public Object invoke(MethodInvocation invocation) throws Throwable {   
    Object result = cacheService.get(cacheKey);   
    //如果函数返回结果不在Cache中,执行函数并将结果放入Cache   
    if (result == null) {   
    result = invocation.proceed();   
    cacheService.put(cacheKey,result);   
    }   
    return result;   
    }   

      Spring的AOP配置如下:

      Java代码


    <aop:config proxy-target-class="true">      
    <aop:advisor      
    pointcut="execution(* ×××.PoiService.getOne(..))"     
    advice-ref="PoiServiceCachingAdvice" />      
    aop:config>      
     
    <bean id="BasPoiServiceCachingAdvice"     
    class="×××.core.cache.CachingInterceptor">      
    <property name="cacheKey" value="PoiService" />      
    <property name="cacheService" ref="cacheService" />      
    bean>  

     

    转自:http://webservices.ctocio.com.cn/java/270/9189770.shtml

  • 02_搭建java socket服务器+mysql+tomcat+memcached环境

    2011-04-14 23:20:39

    搭建java socket服务器+mysql+tomcat+memcached环境

     

    以Redhat CentOS 5.0系统为例

    1.安装jdk:卸载过时jdk1.4:
     rpm -qa | grep gcj      ← 确认gcj的版本号
     java-1.4.2-gcj-compat-1.4.2.0-27jpp   ← 根据版本号卸载gcj

     yum -y remove java-1.4.2-gcj-compat   ← 卸载gcj
     

    下载jdk1.6

    wget http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u18-linux-x64-rpm.bin?BundledLineItemUUID=JGlIBe.mxBkAAAEn1_NilR04&OrderID=TK1IBe.mMWcAAAEnzPNilR04&ProductID=p_9IBe.pFJcAAAElWitRSbJV&FileName=/jdk-6u18-linux-x64-rpm.bin

     付给权限:chmod +x filename
     安装:./filename


     getconf LONG_BIT 查看电脑位数
     ls -l $(which java)  查看jdk默认安装路径


     查看jdk安装路径:ls -l $(which java)
     配置jdk:vi /etc/profile

    在末尾加上

    export JAVA_HOME=/usr/java/jdk1.6.0_10/  (jdk实际安装目录)
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin

    2.安装tomcat:下载tomcat,可以太平洋获取地址 用wget命令下载

    tar -xzvf tomcatFileName

    mv tomcat  /usr/local/

    配置tomcat:vi /etc/profile

    export CATALINA_BASE=/usr/local/tomcat
    export CATALINA_HOME=/usr/local/tomcat
    export CATALINA_TMPDIR=/usr/local/tomcat/temp
    export JRE_HOME=/usr/java/jdk1.6.0_10 (jdk实际安装目录)

    source  /etc/profile 重新加载配置文件

    修改端口:
    /etc/init.d/iptables status
    /sbin/iptables -I INPUT -p tcp --dport 843 -j ACCEPT
    /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
    /etc/rc.d/init.d/iptables save
    service iptables restart

    tomcat优化:tomcat:
     http://www.javaeye.com/topic/463830
     
     
     tomcat原来参数
     <Connector executor="tomcatThreadPool"
                   port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
     
     tomcat参数优化:
     <Connector port="8080" maxHttpHeaderSize="8192"
      useBodyEncodingForURI="true"  maxThreads="1000"  minSpareThreads="25"
      maxSpareThreads="75"   enableLookups="false" redirectPort="8443"
      acceptCount="100"  compression="on" compressionMinSize="2048"  
      compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
            connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>

    tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下设置:
    JAVA_OPTS='$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]

    设置环境变量:export JAVA_OPTS=”$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]”
    一般说来,你应该使用物理内存的 80% 作为堆大小。如果本机上有Apache服务器,可以先折算Apache需要的内存,然后修改堆大小。
    建议设置为70%;建议设置[[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。

    JAVA_OPTS="-server -Xms1024M -Xmx1024M -Xss128k -Xmn500m -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC  -XX:+UseBiasedLocking"

    3.mysql安装:

      以下载MySQL-community-5.0.45-0.rhel5.src.rpm为例:

     检查是否存在mysql用户可用如下命令:

           #grep "^mysql: " /etc/passwd  -i

    如果没有,则需要创建该用户:

           #useradd  mysql  /opt/mysql

    下载MySQL-community-5.0.45-0.rhel5.src.rpm

     安装:#rpm -ivh MySQL-community-5.0.45-0.rhel5.src.rpm

    在/usr/src/redhat/SOURCES/目录中,找到mysql-5.0.45a.tar.gz,然后解包:

           #tar -zxvf mysql-5.0.45.tar.gz

        解开该压缩包,生成mysql-5.0.45目录,在该目录下能够看到bin和scripts子目录。bin目录包含客户程序和服务器,scripts目录

        包含mysql_install_db脚本,用于初始化服务器的存取权限。
    将MySQL安装到/opt/mysql目录下:

            #./configure  --prefix  /opt/mysql

    最后,执行以下命令编译并安装MySQL:

            #make

            #make  check

            #su  mysql

            #make  install

            #cd  scripts

            #./mysql_install_db

     测试安装是否成功可以用以下命令,看到mysql>提示符后,则表明MySQLP安装成功。

            #/opt/mysql/bin/mysql_safe  &

            #/opt/mysql/bin/mysql  -u  root

      用命令行方式启动停止MySQL服务

        在RHEL5中,MySQL可能是系统自带的,也可能是用户根据需要编译安装的,因此,在通过命令行方式启动和停止MySQL服务时,

        使用的命令也有所不同。

        1如果是RHEL5自带的MySQL,则使用如下命令:

            #service mysqld start     =#/etc/init.d/mysqld start     //启动MySQL服务;

            #service mysqld stop     =#/etc/init.d/mysqld stop     //停止MySQL服务;

            #service mysqld restart   =/etc/init.d/mysqld restart   //重新启动MySQL服务;

            #mysqladmin status                                    //检查MySQL服务状态;

       2如果不是系统自带的MySQL服务,则使用如下方法:

         在默认的情况下,没有设置为系统服务的形式,需要通过以下方式启动,&表示后台运行:

            #/opt/mysql/bin/mysqld_safe  &

         类似地,停止MySQL服务时应使用如下命令:

            #/opt/mysql  /bin/mysqladmin  shutdown

      自动启动MySQL服务

        1对于系统自带的MySQL服务:

            #ntsysv

        2对于手工安装的MySQL服务

            通过在/etc/rc.local文件的尾部追加启动MySQL的命令来实现自动启动。

        3图形界面下-系统-管理-服务器设置-服务-服务配置-mysqld-选中复选框,同样可以实现系统启动自运行mysqld。

     <附:mysql编码问题>http://tdcq.javaeye.com/blog/363955

    4.memcached安装:下载libevent和memcached

    http://www.monkey.org/~provos/libevent/

    http://memcached.org/
    解包
    cd /usr/local
    tar -xzvf libevent-1.4.tar.gz
    tar -xzvf memcached-1.2.5.tar.gz

    处理libevent
    cd /usr/local/libevent-1.2/
    ./configure --prefix=/usr/local/libevent
    make
    make install

    处理memcached
    cd /usr/local/memcached-1.2.5/
    ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
    make
    make install

    32位机
    ln -s /usr/local/libevent/lib/libevent-1.4.so.1 /usr/lib
    ln -s /usr/local/libevent/lib/libevent-1.4.so.2 /usr/lib


    64位机
    ln -s /usr/local/libevent/lib/libevent-1.2.so.1 /usr/lib64

    启动命令:memcached -p 11211 -d -u root -m 512 -c 1024 -vvv

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/li610925548/archive/2010/09/02/5859108.aspx
  • 01_Memcached学习笔记——windows上初步使用

    2011-04-14 23:17:15

    http://navylee.iteye.com/blog/753234

    此页有程序下载

     

    最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。

        Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

        上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应用。先从memcached上进行说明,memcached的最新版是采用c语言进行开发和设计的,据说旧版的是采用perl语言开发的,而且它是一个应用软件来的,是作为缓存服务器的服务器端运行在服务器上的,需要使用特定的语言编写客户端与其进行通信来进行数据的缓存和获取。通常我们是把memcached安装运行在web服务器上,然后通过对需要的数据进行缓存,据我目前所知,所有数据的缓存设置和存取操作,以及数据的更新后替换操作全部需要程序来进行,而不是自动进行的(自动不知道能不能成功,呵呵)。下面从一个实际的例子来应用memcached。

       首先到http://danga.com/memcached/下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后即可!首先是安装运行memcached服务器,我们将memcached-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令:

    c:>memcached.exe -d install
    c:>memcached.exe -l 127.0.0.1 -m 32 -d start

        第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!第一行是启动memcached的,作为测试我们就简单的只分配32M内存了,然后监听本机端口和以守护进行运行。执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。好了,我们的服务器已经正常运行了, 下面我们就来写java的客户端连接程序。

        我们将java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文件复制到java项目的lib目录下,然后我们来编写代码,比如我提供的一个应用类如下:

    package utils.cache;

    import java.util.Date;

    import com.danga.MemCached.MemCachedClient;
    import com.danga.MemCached.SockIOPool;


    /**
    * 使用memcached的缓存实用类.
    *
    *
    @author 铁木箱子
    *
    */
    public class MemCached
    {
       
    // 创建全局的唯一实例
        protected static MemCachedClient mcc = new MemCachedClient();
       
       
    protected static MemCached memCached = new MemCached();
       
       
    // 设置与缓存服务器的连接池
        static {
           
    // 服务器列表和其权重
            String[] servers = {"127.0.0.1:11211"};
            Integer[] weights
    = {3};

           
    // 获取socke连接池的实例对象
            SockIOPool pool = SockIOPool.getInstance();

           
    // 设置服务器信息
            pool.setServers( servers );
            pool.setWeights( weights );

           
    // 设置初始连接数、最小和最大连接数以及最大处理时间
            pool.setInitConn( 5 );
            pool.setMinConn(
    5 );
            pool.setMaxConn(
    250 );
            pool.setMaxIdle(
    1000 * 60 * 60 * 6 );

           
    // 设置主线程的睡眠时间
            pool.setMaintSleep( 30 );

           
    // 设置TCP的参数,连接超时等
            pool.setNagle( false );
            pool.setSocketTO(
    3000 );
            pool.setSocketConnectTO(
    0 );

           
    // 初始化连接池
            pool.initialize();

           
    // 压缩设置,超过指定大小(单位为K)的数据都会被压缩
            mcc.setCompressEnable( true );
            mcc.setCompressThreshold(
    64 * 1024 );
        }
       
       
    /**
         * 保护型构造方法,不允许实例化!
         *
        
    */
       
    protected MemCached()
        {
           
        }
       
       
    /**
         * 获取唯一实例.
         *
    @return
        
    */
       
    public static MemCached getInstance()
        {
           
    return memCached;
        }
       
       
    /**
         * 添加一个指定的值到缓存中.
         *
    @param key
         *
    @param value
         *
    @return
        
    */
       
    public boolean add(String key, Object value)
        {
           
    return mcc.add(key, value);
        }
       
       
    public boolean add(String key, Object value, Date expiry)
        {
           
    return mcc.add(key, value, expiry);
        }
       
       
    public boolean replace(String key, Object value)
        {
           
    return mcc.replace(key, value);
        }
       
       
    public boolean replace(String key, Object value, Date expiry)
        {
           
    return mcc.replace(key, value, expiry);
        }
       
       
    /**
         * 根据指定的关键字获取对象.
         *
    @param key
         *
    @return
        
    */
       
    public Object get(String key)
        {
           
    return mcc.get(key);
        }
       
       
    public static void main(String[] args)
        {
            MemCached cache
    = MemCached.getInstance();
            cache.add(
    "hello", 234);
            System.out.print(
    "get value : " + cache.get("hello"));
        }
    }

        那么我们就可以通过简单的像main方法中操作的一样存入一个变量,然后再取出进行查看,我们可以看到先调用了add,然后再进行get,我们运行一次后,234这个值已经被我们存入了memcached的缓存中的了,我们将main方法中红色的那一行注释掉后,我们再运行还是可以看到get到的value也是234,即缓存中我们已经存在了数据了。

        对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的。比如我们写一个简单的测试Bean如下:

    class TBean implements java.io.Serializable
    {
       
    private static final long serialVersionUID = 1945562032261336919L;
       
       
    private String name;

       
    public String getName()
        {
           
    return name;
        }

       
    public void setName(String name)
        {
           
    this.name = name;
        }
    }

        然后我们在main方法中加入如下几行代码:

    TBean tb = new TBean();
    tb.setName(
    "铁木箱子");
    cache.add(
    "bean", tb);
    TBean tb1
    = (TBean)cache.get("bean");
    System.out.print(
    "name=" + tb1.getName());
    tb1.setName(
    "铁木箱子_修改的");
    tb1
    = (TBean)cache.get("bean");
    System.out.print(
    "name=" + tb1.getName());

        我们首先把TBean的一个实例放入缓存中,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生类的无意修改导致缓存数据失效了,呵呵~~看来我也是多此一想啊。所以这表明从缓存中获取的对象是存入对象的一个副本,对获取对象的修改并不能真正的修改缓存中的数据,而应该使用其提供的replace等方法来进行修改。

        以上是我在windows下对memcached的一点小学习和实践,在以后的项目开发过程中将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用~~ 微笑 



    原址:

    http://j2ee.blog.sohu.com/70343632.html

    或者:

    http://sailinglee.iteye.com/blog/752847

  • 超级实用且不花哨的js代码大全

    2011-04-14 16:27:10

     

    事件源对象
    event.srcElement.tagName
    event.srcElement.type
    捕获释放
    event.srcElement.setCapture();
    event.srcElement.releaseCapture(); 
    事件按键
    event.keyCode
    event.shiftKey
    event.altKey
    event.ctrlKey
    事件返回值
    event.returnValue
    鼠标位置
    event.x
    event.y
    窗体活动元素
    document.activeElement
    绑定事件
    document.captureEvents(Event.KEYDOWN);
    访问窗体元素
    document.all("txt").focus();
    document.all("txt").select();
    窗体命令
    document.execCommand
    窗体COOKIE
    document.cookie
    菜单事件
    document.oncontextmenu
    创建元素
    document.createElement("SPAN"); 
    根据鼠标获得元素:
    document.elementFromPoint(event.x,event.y).tagName=="TD
    document.elementFromPoint(event.x,event.y).appendChild(ms) 
    窗体图片
    document.images[索引]
    窗体事件绑定
    document.onmousedown=scrollwindow;
    元素
    document.窗体.elements[索引]
    对象绑定事件
    document.all.xxx.detachEvent('onclick',a);
    插件数目
    navigator.plugins
    取变量类型
    typeof($js_libpath) == "undefined"
    下拉框
    下拉框.options[索引]
    下拉框.options.length
    查找对象
    document.getElementsByName("r1");
    document.getElementById(id);
    定时
    timer=setInterval('scrollwindow()',delay);
    clearInterval(timer);
    UNCODE编码
    escape() ,unescape
    父对象
    obj.parentElement(dhtml)
    obj.parentNode(dom)
    交换表的行
    TableID.moveRow(2,1)
    替换CSS
    document.all.csss.href = "a.css";
    并排显示
    display:inline
    隐藏焦点
    hidefocus=true
    根据宽度换行
    style="word-break:break-all"
    自动刷新
    <meta. HTTP-EQUIV="refresh" C>
    简单邮件
    <a  href="[email=aaa@bbb.com?subject=ccc&body=xxxyyy]mailto:aaa@bbb.com?subject=ccc&body=xxxyyy[/email]"> 
    快速转到位置
    obj.scrollIntoView(true)

    <a name="first">
    <a href="#first">anchors</a>
    网页传递参数
    location.search();
    可编辑
    obj.contenteditable=true
    执行菜单命令
    obj.execCommand
    双字节字符
    /[^\x00-\xff]/
    汉字
    /[\u4e00-\u9fa5]/
    让英文字符串超出表格宽度自动换行
    word-wrap: break-word; word-break: break-all;
    透明背景
    <IFRAME. src="1.htm" width=300 height=180 allowtransparency></iframe>
    获得style内容
    obj.style.cssText
    HTML标签
    document.documentElement.innerHTML
    第一个style标签
    document.styleSheets[0]
    style标签里的第一个样式
    document.styleSheets[0].rules[0]
    防止点击空链接时,页面往往重置到页首端。
    <a href="javascript.:function()">word</a>
    上一网页源
    asp:
    request.servervariables("HTTP_REFERER")
    javascript.
    document.referrer
    释放内存
    CollectGarbage();
    禁止右键
    document.oncontextmenu = function() { return false;}
    禁止保存
    <noscript><iframe. src="*.htm"></iframe></noscript>
    禁止选取<body      Shortcut Icon" href="favicon.ico">
    favicon.ico 名字最好不变16*16的16色,放虚拟目录根目录下
    收藏栏图标
    <link rel="Bookmark" href="favicon.ico">
    查看源码
    <input type=button value=查看网页源代码 >
    关闭输入法
    <input style="ime-mode:disabled">
    自动全选
    <input type=text name=text1 value="123" >
    ENTER键可以让光标移到下一个输入框
    <input >
    文本框的默认值
    <input type=text value="123" >
    title换行
    obj.title = "123 sdfs "
    获得时间所代表的微秒
    var n1 = new Date("2004-10-10".replace(/-/g, "\/")).getTime()
    窗口是否关闭
    win.closed

    checkbox扁平
    <input type=checkbox style="position: absolute; clip:rect(5px 15px 15px 5px)"><br>
    获取选中内容
    document.selection.createRange().duplicate().text
    自动完成功能
    <input  type=text  autocomplete=on>打开该功能
    <input  type=text  autocomplete=off>关闭该功能
    关闭窗口
    window.close();
    返回
    history.back();
    无关闭按钮IE window.open("aa.htm", "meizz", "fullscreen=7");
    统一编码/解码 alert(decodeURIComponent(encodeURIComponent("http://你好.com?as= hehe")))
    encodeURIComponent对":"、"/"、";" 和 "?"也编码
    高级应用(一)

    页面跳转:
      window.location.href('地址')
      window.open('地址', '_self')
    打开新窗口:
      window.open('地址', '_blank')
      只显示地址栏:window.open('地址', 'title', 'location=1, height=200, width=500')
      只显示状态栏:window.open('地址', 'title', 'status=1')
      只显示工具栏:window.open('地址', 'title', 'toolbar=1')
      只显示菜单栏:window.open('地址', 'title', 'menubar=1')
      一个不少:window.open('地址', 'title)
      光棍但可以调整大小:window.open('地址', 'title', 'resizable=1')
    去掉所有空格:
      Object.replace(/^\s+|\s+$/g, "")
    屏蔽鼠标:
      oncontextmenu="window.event.returnValue=false"
    取消选取:
      onselectstart="return false"
    不允许粘贴:
      onpaste="return false"
    关闭输入法:
      <input style="ime-mode:disabled">
    不允许另存为:
      <noscript><iframe. src=*.html></iframe></noscript>
    得到上一页来源:
      document.referrer
    弹出窗口总在最上:
      <body >
    弹出确认对话框:
      comfirm('文本')"
      <script>if(confirm('文本')){//确定}else{//取消}
    回车转换Tab键:
      if(window.event.keyCode==13){event.keyCode=9}
    返回上一页:
      history.go(-1)
    重新加载页面:
      window.location.reload()
    子页面中调父页面中的方法:
      window.opener.function()
    子页面中访问父页面中名为name的控件值:
      window.opener.name.value
    子页面中访问父页面中表单中名为name的控件值:
      window.opener.formName.nam.value
    得到控件的绝对位置:
      function getIE() {
        var t = e.offsetTop;
        var l = e.offsetLeft;
        while (e = e.offsetParent) {
          t += e.offsetTop;
          l += e.offsetLeft;
        }
        alert("top=" + t + " and left=" + l);
      }
    光标停在文本框文字的最后:
      function toEnd() {
        var e = event.srcElement;
        var r = e.createTextRange();
        r.moveStart("character", e.value.length);
        r.collapse(true);
        r.select();
      }
      <input type="text" value="end" >
    屏蔽功能键(Shift, Alt, Ctrl)
      function testKey() {
        if (event.shiftKey) {  // altKey; ctrlKey
          alert("Shift");
        }
      }
    不要滚动条:
      <body scroll="no">
    让竖条没有:
      <body style="overflow:scroll; overflow-y: hidden">
    让横条没有:
      <body style="overflow:scroll; overflow-x: hidden">
    去掉图片链接点击后图片周围的虚线:
      <a href="#" ><img src="test.jpg"></a>
    在子窗体中刷新父窗体:
      window.opener.location.reload()
    设置打开窗口的大小:
      <body 100)">
    设置打开窗口的位置:
      <body 100)">
    得到窗体大小:
      document.body.clientWidth;
      document.body.clientHeight;
    TEXTAREA自适应文字行数:
      <textarea rows="1" cols="17" npropertychange="this.style.posHeight=this.scrollHeight></textarea>
    屏蔽脚本错误:
      function killErrors() {
        return true;
      }
      window.onerror=killErrors();
    判断是否是字符:
      if (/[^/x00-/xff]/g.test(str)) {
        alert("有汉字");
      } else {
        alert("全是字符");
      }
     
    screen.属性:
      availHeight 获取系统屏幕的工作区域高度,排除 Microsoft&reg; Windows&reg; 任务栏。
      availWidth 获取系统屏幕的工作区域宽度,排除 Windows 任务栏。
      bufferDepth 设置或获取用于画面外位图缓冲颜色的每像素位数。
      colorDepth 获取用于目标设置或缓冲区的颜色每像素位数。
      deviceXDPI 设置或获取系统屏幕水平每英寸点数(DPI)的数值。
      deviceYDPI 设置或获取系统屏幕垂直每英寸点数(DPI)的数值。
      fontSmoothingEnabled 获取用户是否在控制面板的显示设置中启用了圆整屏幕字体边角的选项。
      height 获取屏幕的垂直分辨率。
      logicalXDPI 获取系统屏幕水平每英寸点数(DPI)的常规数值。
      logicalYDPI 获取系统屏幕垂直每英寸点数(DPI)的常规数值。
      updateInterval 设置或获取屏幕的更新间隔。
      width 获取屏幕的垂直分辨率。
     
    得到div的height值:
      div.offsetHeight(带滚动条的完整高度)
      div.clientHeight(内容的高度)

    //各种尺寸

    s  +=  "\r\n网页可见区域宽:"+  document.body.clientWidth; 
    s  +=  "\r\n网页可见区域高:"+  document.body.clientHeight; 
    s  +=  "\r\n网页可见区域高:"+  document.body.offsetWeight  +"  (包括边线的宽)"; 
    s  +=  "\r\n网页可见区域高:"+  document.body.offsetHeight  +"  (包括边线的宽)"; 
    s  +=  "\r\n网页正文全文宽:"+  document.body.scrollWidth; 
    s  +=  "\r\n网页正文全文高:"+  document.body.scrollHeight; 
    s  +=  "\r\n网页被卷去的高:"+  document.body.scrollTop; 
    s  +=  "\r\n网页被卷去的左:"+  document.body.scrollLeft; 
    s  +=  "\r\n网页正文部分上:"+  window.screenTop; 
    s  +=  "\r\n网页正文部分左:"+  window.screenLeft; 
    s  +=  "\r\n屏幕分辨率的高:"+  window.screen.height; 
    s  +=  "\r\n屏幕分辨率的宽:"+  window.screen.width; 
    s  +=  "\r\n屏幕可用工作区高度:"+  window.screen.availHeight; 
    s  +=  "\r\n屏幕可用工作区宽度:"+  window.screen.availWidth; 

     

    //过滤数字

    <input type=text nkeypress="return event.keyCode>=48&&event.keyCode<=57||(this.value.indexOf('.')<0?event.keyCode==46:false)" npaste="return !clipboardData.getData('text').match(/\D/)" ndragenter="return false">


    //特殊用途

    <input type=button value=导入收藏夹 nclick="window.external.ImportExportFavorites(true,'http://localhost');">
    <input type=button value=导出收藏夹 nclick="window.external.ImportExportFavorites(false,'http://localhost');">
    <input type=button value=整理收藏夹 nclick="window.external.ShowBrowserUI('OrganizeFavorites', null)">
    <input type=button value=语言设置   nclick="window.external.ShowBrowserUI('LanguageDialog', null)">
    <input type=button value=加入收藏夹 nclick="window.external.AddFavorite('http://www.google.com/', 'google')">
    <input type=button value=加入到频道 nclick="window.external.addChannel('http://www.google.com/')">
    <input type=button value=加入到频道 nclick="window.external.showBrowserUI('PrivacySettings',null)">


    //不缓存

    <META. HTTP-EQUIV="pragma" CONTENT="no-cache">
    <META. HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
    <META. HTTP-EQUIV="expires" CONTENT="0">


    //正则匹配

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]
    匹配双字节字符(包括汉字在内):[^\x00-\xff]
    匹配空行的正则表达式:\n[\s| ]*\r
    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
    匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数)
    匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
    以下是例子:
    利用正则表达式限制网页表单里的文本框输入内容:
    用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" nbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
    1.用正则表达式限制只能输入全角字符: nkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" nbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
    2.用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
    3.用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


    //消除图像工具栏

    <IMG SRC="mypicture.jpg" HEIGHT="100px" WIDTH="100px" GALLERYIMG="false">
    or
    <head>
    <meta. http-equiv="imagetoolbar" content="no">
    </head>


    //无提示关闭

    function Close()
    {
    var ua=navigator.userAgent
    var ie=navigator.appName=="Microsoft Internet Explorer"?true:false
    if(ie)
    {
          var IEversion=parseFloat(ua.substring(ua.indexOf("MSIE ")+5,ua.indexOf(";",ua.indexOf("MSIE "))))
      if(IEversion< 5.5)
      {
       var str  = '<object id=noTipClose classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">'
           str += '<param name="Command" value="Close"></object>';
           document.body.insertAdjacentHTML("beforeEnd", str);
           document.all.noTipClose.Click();
      }
          else
      {
           window.opener =null;
           window.close();
          }
       }
    else
    {
      window.close()
       }
    }

     

    //取得控件得绝对位置(1)

    <script. language="javascript">
    function getoffset(e)
    {
    var t=e.offsetTop;
    var l=e.offsetLeft;
    while(e=e.offsetParent)
    {
      t+=e.offsetTop;
      l+=e.offsetLeft;
    }
    var rec = new Array(1);
    rec[0]  = t;
    rec[1] = l;
    return rec
    }
    </script>

     

    //获得控件的绝对位置(2)

    oRect = obj.getBoundingClientRect();
    oRect.left
    oRect.


    //最小化,最大化,关闭

    <object id=min classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Minimize"></object>
    <object id=max classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Maximize"></object>
    <OBJECT id=close classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <PARAM NAME="Command" value="Close"></OBJECT>
    <input type=button value=最小化 nclick=min.Click()>
    <input type=button value=最大化 nclick=max.Click()>
    <input type=button value=关闭 nclick=close.Click()>


    //光标停在文字最后


    <script. language="javascript">
    function cc()
    {
    var e = event.srcElement;
    var r =e.createTextRange();
    r.moveStart('character',e.value.length);
    r.collapse(true);
    r.select();
    }
    </script>
    <input type=text name=text1 value="123" nfocus="cc()">

    //页面进入和退出的特效

    进入页面<meta. http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
    推出页面<meta. http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">
    这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使
    用哪种特效,取值为1-23:
      0 矩形缩小
      1 矩形扩大
      2 圆形缩小
      3 圆形扩大
      4 下到上刷新
      5 上到下刷新
      6 左到右刷新
      7 右到左刷新
      8 竖百叶窗
      9 横百叶窗
      10 错位横百叶窗
      11 错位竖百叶窗
      12 点扩散
      13 左右到中间刷新
      14 中间到左右刷新
      15 中间到上下
      16 上下到中间
      17 右下到左上
      18 右上到左下
      19 左上到右下
      20 左下到右上
      21 横条
      22 竖条
      23


    //网页是否被检索 <meta. name="ROBOTS" content="属性值">
      其中属性值有以下一些:
      属性值为"all": 文件将被检索,且页上链接可被查询;
      属性值为"none": 文件不被检索,而且不查询页上的链接;
      属性值为"index": 文件将被检索;
      属性值为"follow": 查询页上的链接;
      属性值为"noindex": 文件不检索,但可被查询链接;
      属性值为"nofollow":


    //打印分页 <p  style="page-break-after:always">page1</p> 
    <p  style="page-break-after:always">page2</p> 

     

    //设置打印

    <object id="factory" style="display:none" viewastext
      classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
      codebase="http://www.meadroid.com/scriptx/ScriptX.cab#Version=5,60,0,360"
    ></object>
    <input type=button value=页面设置 nclick="factory.printing.PageSetup()">
    <input type=button value=打印预览 nclick="factory.printing.Preview()">
     
    <script. language=javascript>
    function window.onload()
    {
       // -- advanced features
       factory.printing.SetMarginMeasure(2) // measure margins in inches
       factory.printing.SetPageRange(false, 1, 3) // need pages from 1 to 3
       factory.printing.printer = "HP DeskJet 870C"
       factory.printing.copies = 2
       factory.printing.collate = true
       factory.printing.paperSize = "A4"
       factory.printing.paperSource = "Manual feed"
       // -- basic features
       factory.printing.header = "居左显示&b居中显示&b居右显示页码,第&p页/共&P页"
       factory.printing.footer = "(自定义页脚)"
       factory.printing.portrait = false
       factory.printing.leftMargin = 0.75
       factory.printing.topMargin = 1.5
       factory.printing.rightMargin = 0.75
       factory.printing.bottomMargin = 1.5
    }
    function Print(frame) {
      factory.printing.Print(true, frame) // print with prompt
    }
    </script>
    <input type=button value="打印本页" nclick="factory.printing.Print(false)">
    <input type=button value="页面设置" nclick="factory.printing.PageSetup()">
    <input type=button value="打印预览" nclick="factory.printing.Preview()"><br>
    <a href="http://www.meadroid.com/scriptx/docs/printdoc.htm?static"  target=_blank>具体使用手册,更多信息,点这里</a>


    //自带的打印预览
    WebBrowser.ExecWB(1,1) 打开
    Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
    Web.ExecWB(4,1) 保存网页
    Web.ExecWB(6,1) 打印
    Web.ExecWB(7,1) 打印预览
    Web.ExecWB(8,1) 打印页面设置
    Web.ExecWB(10,1) 查看页面属性
    Web.ExecWB(15,1) 好像是撤销,有待确认
    Web.ExecWB(17,1) 全选
    Web.ExecWB(22,1) 刷新
    Web.ExecWB(45,1) 关闭窗体无提示
    <style. media=print>
    .Noprint{display:none;}<!--用本样式在打印时隐藏非打印项目-->
    .PageNext{page-break-after: always;}<!--控制分页-->
    </style>
    <object  id="WebBrowser"  width=0  height=0  classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2">   
    </object>   
     
    <center class="Noprint" >
    <input type=button value=打印 nclick=document.all.WebBrowser.ExecWB(6,1)>
    <input type=button value=直接打印 nclick=document.all.WebBrowser.ExecWB(6,6)>
    <input type=button value=页面设置 nclick=document.all.WebBrowser.ExecWB(8,1)>
    </p>
    <p> <input type=button value=打印预览 nclick=document.all.WebBrowser.ExecWB(7,1)>
    </center>

     

    //去掉打印时的页眉页脚

    <script  language="JavaScript"> 
    var HKEY_Root,HKEY_Path,HKEY_Key;
    HKEY_Root="HKEY_CURRENT_USER";
    HKEY_Path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
    //设置网页打印的页眉页脚为空
    function PageSetup_Null()
    {
    try
    {
      var Wsh=new ActiveXObject("WScript.Shell");
      HKEY_Key="header";
      Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
      HKEY_Key="footer";
      Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
    }
    catch(e){}
    }
    //设置网页打印的页眉页脚为默认值
    function  PageSetup_Default()

    try
    {
      var Wsh=new ActiveXObject("WScript.Shell");
      HKEY_Key="header";
      Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&w&b页码,&p/&P");
      HKEY_Key="footer";
      Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&u&b&d");
    }
    catch(e){}
    }
    </script>
    <input type="button" value="清空页码" nclick=PageSetup_Null()>
    <input type="button" value="恢复页码" nclick=PageSetup_Default()>


    //浏览器验证

    function checkBrowser()
    {
       this.ver=navigator.appVersion
       this.dom=document.getElementById?1:0
       this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
       this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
       this.ie4=(document.all && !this.dom)?1:0;
       this.ns5=(this.dom && parseInt(this.ver) >= 5) ?1:0;
       this.ns4=(document.layers && !this.dom)?1:0;
       this.mac=(this.ver.indexOf('Mac') > -1) ?1:0;
       this.ope=(navigator.userAgent.indexOf('Opera')>-1);
       this.ie=(this.ie6 || this.ie5 || this.ie4)
       this.ns=(this.ns4 || this.ns5)
       this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns5 || this.ns4 || this.mac || this.ope)
       this.nbw=(!this.bw)
       return this;
    }


    //计算内容宽和高

    <SCRIPT  language="javascript"> 
    function  test(obj) 

           var  range  =  obj.createTextRange(); 
           alert("内容区宽度:  "  +  range.boundingWidth
                 +  "px\r\n内容区高度:  "  +  range.boundingHeight  +  "px"); 

    </SCRIPT> 
    <BODY> 
    <Textarea id="txt" height="150">sdf</textarea><INPUT  type="button"  value="计算内容宽度"  nClick="test(txt)"> 
    </BODY>

     

    //无模式的提示框 function modelessAlert(Msg)
    {
       window.showModelessDialog("javascript.:alert(\""+escape(Msg)+"\");window.close();","","status:no;resizable:no;help:no;dialogHeight:height:30px;dialogHeight:40px;");
    }

     

    //屏蔽按键
    <html>
    <head>
      <meta. http-equiv="Content-Type" content="text/html; charset=gb2312">
      <noscript><meta. http-equiv="refresh" content="0;url=about:noscript"></noscript>
      <title>屏蔽鼠标右键、Ctrl+N、Shift+F10、Alt+F4、F11、F5刷新、退格键</title>
    </head>
    <body>
    <script. language="Javascript"><!--
      //屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键
      //Author: meizz(梅花雨) 2002-6-18
    function document.oncontextmenu(){event.returnValue=false;}//屏蔽鼠标右键
    function window.onhelp(){return false} //屏蔽F1帮助
    function document.onkeydown()
    {
      if ((window.event.altKey)&&
          ((window.event.keyCode==37)||   //屏蔽 Alt+ 方向键 ←
           (window.event.keyCode==39)))   //屏蔽 Alt+ 方向键 →
      {
         alert("不准你使用ALT+方向键前进或后退网页!");
         event.returnValue=false;
      }
         /* 注:这还不是真正地屏蔽 Alt+ 方向键,
         因为 Alt+ 方向键弹出警告框时,按住 Alt 键不放,
         用鼠标点掉警告框,这种屏蔽方法就失效了。以后若
         有哪位高手有真正屏蔽 Alt 键的方法,请告知。*/
      if ((event.keyCode==8)  ||                 //屏蔽退格删除键
          (event.keyCode==116)||                 //屏蔽 F5 刷新键
          (event.ctrlKey && event.keyCode==82)){ //Ctrl + R
         event.keyCode=0;
         event.returnValue=false;
         }
      if (event.keyCode==122){event.keyCode=0;event.returnValue=false;}  //屏蔽F11
      if (event.ctrlKey && event.keyCode==78) event.returnValue=false;   //屏蔽 Ctrl+n
      if (event.shiftKey && event.keyCode==121)event.returnValue=false;  //屏蔽 shift+F10
      if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
          window.event.returnValue = false;             //屏蔽 shift 加鼠标左键新开一网页
      if ((window.event.altKey)&&(window.event.keyCode==115))             //屏蔽Alt+F4
      {
          window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
          return false;
      }
    }
    </script>
    屏蔽鼠标右键、Ctrl+N、Shift+F10、Alt+F4、F11、F5刷新、退格键
    </body>
    </html>


    //屏蔽打印
    <style>
    @media print{
    * {display:none}
    }
    </style>


    //移动的图层,拖动

    1.<span style='position:absolute;width:200;height:200;background:red' nmousedown=MouseDown(this) nmousemove=MouseMove() nmouseup=MouseUp()>meizz</span>
    <script. language=javascript>
    var Obj;
    function MouseDown(obj)
    {
      bj=obj;
      Obj.setCapture();
      Obj.l=event.x-Obj.style.pixelLeft;
      Obj.t=event.y-Obj.style.pixelTop;
    }
    function MouseMove()
    {
      if(Obj!=null)
      {
        Obj.style.left = event.x-Obj.l;
        Obj.style.top = event.y-Obj.t;
      }
    }
    function MouseUp()
    {
      if(Obj!=null)
      {
        Obj.releaseCapture();
        bj=null;
      }
    }
    </script>
    2.
    <div id="myDiv" src="logo.gif" ndrag="doDrag();" nmouseover="this.style.cursor='hand'" style="position:absolute;left=100;top=100;" nmousedown="doMouseDown();">
    <a href="#" nclick="return false"><h1>wlecome</h1></a>
    </div>
    <script. language="JavaScript" type="text/javascript">
    var orgMouseX;
    var orgMouseY;
    var orgObjX;
    var orgObjY;
    function doDrag()
    {
    var myObject=document.all.myDiv;

    var x=event.clientX;
    var y=event.clientY;
    myObject.style.left=x-(orgMouseX-orgObjX);
    myObject.style.top=y-(orgMouseY-orgObjY);
     
    }
    function doMouseDown()
    {
    orgMouseX=event.clientX;
    orgMouseY=event.clientY;
    orgObjX=parseInt(document.all.myDiv.style.left);
    orgObjY=parseInt(document.all.myDiv.style.top);
    }

    </script>
     
    //文档状态改变

    <iframe. src="a.html" id="f" name="f" scrolling="no" frameborder=0 marginwidth=0 marginheight=0></iframe>
    <script>
    var doc=window.frames["f"].document;
    function s(){
    if (doc.readyState=="complete"){
      document.all.f.style.height=doc.body.scrollHeight
      document.all.f.style.width=doc.body.scrollWidth
    }
    }
    doc.onreadystatechange=s
    </script>


    //刷新后不变的文本框 <HTML>
    <HEAD>
    <META. NAME="save" CONTENT="history">
    <STYLE>
       .sHistory {behavior.:url(#default#savehistory);}
    </STYLE>
    </HEAD>
    <BODY>
    <INPUT class=sHistory type=text id=oPersistInput>
    </BODY>
    </HTML>

    //访问剪贴板

    event.dataTransfer.setData("URL", oImage.src);
    sImageURL = event.dataTransfer.getData("URL")
    (2)普通访问
    window.clipboardData.setData("Text",oSource.innerText);
    window.clipboardData.getData("Text");


    //操作COOKIE

    function SetCookie(sName, sValue)
    {
    document.cookie = sName + "=" + escape(sValue) + "; ";
    }
    function GetCookie(sName)
    {
    var aCookie = document.cookie.split("; ");
    for (var i=0; i < aCookie.length; i++)
    {
     
      var aCrumb = aCookie.split("=");
      if (sName == aCrumb[0])
      return unescape(aCrumb[1]);
    }
     
    }
    function DelCookie(sName)
    {
    document.cookie = sName + "=" + escape(sValue) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
    }


    //setTimeout增加参数

    <script>
    var _st = window.setTimeout;
    window.setTimeout = function(fRef, mDelay) {
    if(typeof fRef == 'function'){
      var argu = Array.prototype.slice.call(arguments,2);
      var f = (function(){ fRef.apply(null, argu); });
      return _st(f, mDelay);
    }
    return _st(fRef,mDelay);
    }
    function test(x){
    alert(x);
    }
    window.setTimeout(test,1000,'fason');
    </script>


    //自定义的apply,call

    Function.prototype.apply = function (obj, argu) {
    if (obj) obj.constructor.prototype._caller = this;
    var argus = new Array();
    for (var i=0;i<argu.length;i++)
      argus = "argu[" + i + "]";
    var r;
    eval("r = " + (obj ? ("obj._caller(" + argus.join(",") + ");") : ("this(" + argus.join(",") + ");")));
    return r;
    };
    Function.prototype.call = function (obj) {
    var argu = new Array();
    for (var i=1;i<arguments.length;i++)
      argu[i-1] = arguments;
    return this.apply(obj, argu);
    };      

    //下载文件

    function DownURL(strRemoteURL,strLocalURL)
    {
    try
    {
      var xmlHTTP=new ActiveXObject("Microsoft.XMLHTTP");
      xmlHTTP.open("Get",strRemoteURL,false);
      xmlHTTP.send();
      var adodbStream=new ActiveXObject("ADODB.Stream");
      adodbStream.Type=1;//1=adTypeBinary
      adodbStream.Open();
      adodbStream.write(xmlHTTP.responseBody);
      adodbStream.SaveToFile(strLocalURL,2);
      adodbStream.Close();
      adodbStream=null;
      xmlHTTP=null;
     
    }
    catch(e)
    {
      window.confirm("下载URL出错!");
    }
    //window.confirm("下载完成.");
    }

    //检验连接是否有效

    function getXML(URL)
    {
    var xmlhttp = new ActiveXObject("microsoft.xmlhttp");
    xmlhttp.Open("GET",URL, false);
    try
    {
      xmlhttp.Send();
    }
    catch(e){}
    finally
    {
      var result = xmlhttp.responseText;
      if(result)
      {
       if(xmlhttp.Status==200)
       {
        return(true);
       }
       else
       {
        return(false);
       }
      }
      else
      {
       return(false);
      }
    }
    }

     

    //POST代替FORM.

    <SCRIPT. language="VBScript">
    Function URLEncoding(vstrIn)
        strReturn = ""
        For i = 1 To Len(vstrIn)
            ThisChr = Mid(vStrIn,i,1)
            If Abs(Asc(ThisChr)) < &HFF Then
                strReturn = strReturn & ThisChr
            Else
                innerCode = Asc(ThisChr)
                If innerCode < 0 Then
                    innerCode = innerCode + &H10000
                End If
                Hight8 = (innerCode  And &HFF00)\ &HFF
                Low8 = innerCode And &HFF
                strReturn = strReturn & "%" & Hex(Hight8) &  "%" & Hex(Low8)
            End If
        Next
        URLEncoding = strReturn
    End Function
    Function bytes2BSTR(vIn)
        strReturn = ""
        For i = 1 To LenB(vIn)
            ThisCharCode = AscB(MidB(vIn,i,1))
            If ThisCharCode < &H80 Then
                strReturn = strReturn & Chr(ThisCharCode)
            Else
                NextCharCode = AscB(MidB(vIn,i+1,1))
                strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
                i = i + 1
            End If
        Next
        bytes2BSTR = strReturn
    End Function
    dim strA,oReq
    strA = URLEncoding("submit1=Submit&text1=中文")
    set Req = CreateObject("MSXML2.XMLHTTP")
    oReq.open "POST","http://ServerName/VDir/TstResult.asp",false
    oReq.setRequestHeader "Content-Length",Len(strA)
    oReq.setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
    oReq.send strA
    msgbox bytes2BSTR(oReq.responseBody)
    </SCRIPT>

    //readyState是xmlhttp返回数据的进度,0=载入中,1=未初始化,2=已载入,3=运行中,4=完成


    高级应用(二)


    //组件是否安装

    isComponentInstalled("{6B053A4B-A7EC-4D3D-4567-B8FF8A1A5739}", "componentID"))

     

    //检查网页是否存在

    function CheckURL(URL)
    {
      var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      xmlhttp.Open("GET",URL, false);
      try
      {
        xmlhttp.Send();
        var result = xmlhttp.status;
      }
      catch(e) {return(false); }
      if(result==200)
      {
        return true;
      }
      xmlhttp = null;
      return false;
    }


    //连接数据库

    <script. language="javascript">
      //用 JavaScript. 写服务器端连接数据库的代码示例
      var conn = new ActiveXObject("ADODB.Connection");
      conn.Open("Provider=SQLOLEDB.1; Data Source=localhost; User ID=sa; "
        +"Password=; Initial Catalog=pubs");
      var rs = new ActiveXObject("ADODB.Recordset");
      var sql="select * from authors";
      rs.open(sql, conn);
    shtml = "<table width='100%' border=1>";
    shtml +="<tr bgcolor='#f4f4f4'><td>au_id</td><td>au_lname</td><td>au_fname</td><td>phone</td><td>address</td><td> city</td><td>state</td><td>zip</td></tr>";
      while(!rs.EOF)
      {
    shtml += "<tr><td>" + rs("au_id") + "</td><td>" + rs("au_lname") + "</td><td>" + rs("au_fname") + "</td><td>" + rs("phone") + "</td><td>" + rs("address") + "</td><td>" + rs("city") + "</td><td>" + rs("state") + "</td><td>" + rs("zip") + "</td></tr>";
    rs.moveNext;
      }
      shtml += "</table>";
      document.write(shtml);
      rs.close();
      rs = null;
      conn.close();
      conn = null;
    </script>


    //使用数据岛

    <html>
    <body>
    srno:<input type=text datasrc=#xmldate DataFLD=srno size="76"><BR>
    times:<input type=text datasrc=#xmldate DataFLD=times size="76"><BR>
    <input id="first" TYPE=button value="<< 第一条记录" nclick="xmldate.recordset.moveFirst()">
    <input id="prev" TYPE=button value="<上一条记录" nclick="xmldate.recordset.movePrevious()"> 
    <input id="next" TYPE=button value="下一条记录>" nclick="xmldate.recordset.moveNext()"> 
    <input id="last" TYPE=button value="最后一条记录>>" nclick="xmldate.recordset.moveLast()">  
    <input id="Add" TYPE=button value="添加新记录" nclick="xmldate.recordset.addNew()"> 

    <XML ID="xmldate">
    <infolist>
    <info ><srno>20041025-01</srno><times>null</times></info>
    <info ><srno>20041101-09</srno><times>2004年10月1日2点22分0秒</times></info>
    </infolist>
    </XML>
    </body>
    </html>


    //获得参数

    <body>
    <a href="javascript.:location.href=location.href + '?a=1&b=2'">search</a>
    <script. language="JavaScript">
    <!--
    var a = location.search.substr(1);
    if(a.length>0)
    {
    var re = /([^&]*?)\=([^&]*)/g
    var s = a.match(re);
    for(var i= 0;i<s.length;i++)
    {
      alert(s);
      alert(s.split("=")[1]);
    }
    }
    //-->
    </script>
    </body>

     

    //可编辑SELECT

    <input type=text name=re_name style="width:100px;height:21px;font-size:10pt;"><span style="width:18px;border:0px solid red;"><select name="r00" style="margin-left:-100px;width:118px; background-color:#FFEEEE;" nChange="document.all.re_name.value=this.value;">
                    <option value="1">11111111<option>
                    <option value="2">222222</option>
                    <option value="3">333333</option>
                  </select>
                  </span>

     

    //设置光标位置

    function getCaret(textbox)
    {
    var control = document.activeElement;
    textbox.focus();
    var rang = document.selection.createRange();
      rang.setEndPoint("StartToStart",textbox.createTextRange())
    control.focus();
    return rang.text.length;
    }
    function setCaret(textbox,pos)
    {
    try
    {
      var r =textbox.createTextRange();
       r.moveStart('character',pos);
       r.collapse(true);
       r.select();
    }
    catch(e)
    {}
    }
    function selectLength(textbox,start,len)
    {
    try
    {
      var r =textbox.createTextRange();
     
      r.moveEnd('character',len-(textbox.value.length-start));
      r.moveStart('character',start);
     
      r.select();
    }
    catch(e)
    {//alert(e.description)}
    }
    function insertAtCaret(textbox,text)
    {
    textbox.focus();
    document.selection.createRange().text = text;
    }

    //页内查找

    function findInPage(str)
    {
    var txt, i, found,n = 0;
    if (str == "")
    {
      return false;
    }
    txt = document.body.createTextRange();
    for (i = 0; i <= n && (found = txt.findText(str)) != false; i++)
    {
      txt.moveStart("character", 1);
      txt.moveEnd("textedit");
    }
    if (found)
    {
      txt.moveStart("character", -1);
      txt.findText(str);
      txt.select();
      txt.scrollIntoView();
      n++; 
    }
    else
    {
      if (n > 0)
      {
       n = 0;
       findInPage(str);
      }
      else
      {
       alert(str + "...  您要找的文字不存在。\n \n请试着输入页面中的关键字再次查找!");
      }
    }
    return false;
    }

     


    //操作EXECL

    <script. language="javascript">
    function jStartExcel() {
    var xls = new ActiveXObject ( "Excel.Application" );
    xls.visible = true;
    var newBook = xls.Workbooks.Add;
    newBook.Worksheets.Add;
    newBook.Worksheets(1).Activate;
    xls.ActiveWorkBook.ActiveSheet.PageSetup.Orientation = 2;
    xls.ActiveWorkBook.ActiveSheet.PageSetup.PaperSize = 5;
    newBook.Worksheets(1).Columns("A").columnwidth=50;
    newBook.Worksheets(1).Columns("A").WrapText = true;
    newBook.Worksheets(1).Columns("B").columnwidth=50;
    newBook.Worksheets(1).Columns("B").WrapText = true;
    newBook.Worksheets(1).Range("A1:B1000").NumberFormat = "0";
    newBook.Worksheets(1).Range("A1:B1000").HorizontalAlignment = -4131;
    newBook.Worksheets(1).Cells(1,1).Interior.ColorIndex="15";
    newBook.Worksheets(1).Cells(1,1).value="First Column, First Cell";
    newBook.Worksheets(1).Cells(2,1).value="First Column, Second Cell";
    newBook.Worksheets(1).Cells(1,2).value="Second Column, First Cell";
    newBook.Worksheets(1).Cells(2,2).value="Second Column, Second Cell";
    newBook.Worksheets(1).Name="My First WorkSheet";
    }
    </script>


    //自定义提示条

    <a href="#" title="这是提示">tip</a>
    <script. Language="JavaScript">
    //***********默认设置定义.*********************
    tPopWait=50;//停留tWait豪秒后显示提示。
    tPopShow=5000;//显示tShow豪秒后关闭提示
    showPopStep=20;
    popOpacity=99;
    //***************内部变量定义*****************
    sPop=null;
    curShow=null;
    tFadeOut=null;
    tFadeIn=null;
    tFadeWaiting=null;
    document.write("<style. type='text/css'id='defaultPopStyle'>");
    document.write(".cPopText {  background-color: #F8F8F5;color:#000000; border: 1px #000000 solid;font-color: font-size: 12px; padding-right: 4px; padding-left: 4px; height: 20px; padding-top: 2px; padding-bottom: 2px; filter: Alpha(Opacity=0)}");
    document.write("</style>");
    document.write("<div id='dypopLayer' style='position:absolute;z-index:1000;' class='cPopText'></div>");

    function showPopupText(){
    var o=event.srcElement;
    MouseX=event.x;
    MouseY=event.y;
    if(o.alt!=null && o.alt!=""){o.dypop=o.alt;o.alt=""};
            if(o.title!=null && o.title!=""){o.dypop=o.title;o.title=""};
    if(o.dypop!=sPop) {
    sPop=o.dypop;
    clearTimeout(curShow);
    clearTimeout(tFadeOut);
    clearTimeout(tFadeIn);
    clearTimeout(tFadeWaiting);
    if(sPop==null || sPop=="") {
    dypopLayer.innerHTML="";
    dypopLayer.style.filter="Alpha()";
    dypopLayer.filters.Alpha.opacity=0;
    }
    else {
    if(o.dyclass!=null) popStyle=o.dyclass
    else popStyle="cPopText";
    curShow=setTimeout("showIt()",tPopWait);
    }
    }
    }
    function showIt(){
    dypopLayer.className=popStyle;
    dypopLayer.innerHTML=sPop;
    popWidth=dypopLayer.clientWidth;
    popHeight=dypopLayer.clientHeight;
    if(MouseX+12+popWidth>document.body.clientWidth) popLeftAdjust=-popWidth-24
    else popLeftAdjust=0;
    if(MouseY+12+popHeight>document.body.clientHeight) popTopAdjust=-popHeight-24
    else popTopAdjust=0;
    dypopLayer.style.left=MouseX+12+document.body.scrollLeft+popLeftAdjust;
    dypopLayer.style.top=MouseY+12+document.body.scrollTop+popTopAdjust;
    dypopLayer.style.filter="Alpha(Opacity=0)";
    fadeOut();
    }
    function fadeOut(){
    if(dypopLayer.filters.Alpha.opacity<popOpacity) {
    dypopLayer.filters.Alpha.opacity+=showPopStep;
    tFadeOut=setTimeout("fadeOut()",1);
    }
    else {
    dypopLayer.filters.Alpha.opacity=popOpacity;
    tFadeWaiting=setTimeout("fadeIn()",tPopShow);
    }
    }
    function fadeIn(){
    if(dypopLayer.filters.Alpha.opacity>0) {
    dypopLayer.filters.Alpha.opacity-=1;
    tFadeIn=setTimeout("fadeIn()",1);
    }
    }
    document.onmouseover=showPopupText;
    </script>


    //插入文字

    document.onclick =function(){
    var Source = window.event.srcElement;
    if(oSource.tagName!="DIV")
    return false;
    var sel = document.selection;
    if (sel!=null) {
    var rng = sel.createRange();
    if (rng!=null)
    rng.pasteHTML("<font color=red>插入文字</font>");
    }
    }

     

    //netscapte下操作xml

    doc = new ActiveXObject("Msxml2.DOMDocument");
    doc = new ActiveXObject("Microsoft.XMLDOM")
    ->>
    doc = (new DOMParser()).parseFromString(sXML,'text/xml')


    //禁止FSO

    1.注销组件
    regsvr32 /u scrrun.dll
    2.修改PROGID
    HKEY_CLASSES_ROOT\Scripting.FileSystemObject
    Scripting.FileSystemObject
    3.对于使用object的用户,修改HKEY_CLASSES_ROOT\Scripting.


    //省略号

    <DIV STYLE="width: 120px; height: 50px; border: 1px solid blue;
                overflow: hidden; text-overflow:ellipsis">
    <NOBR>就是比如有一行文字,很长,表格内一行显示不下.</NOBR>
    </DIV>


    //判断键值

    <html>
    <meta. http-equiv="Content-Type" content="text/html; charset=gb2312">
    <head>
    <script. language="javascript">
    var ie  =navigator.appName=="Microsoft Internet Explorer"?true:false;
     
    function keyDown(e)
    {
    if(!ie)
    {
      var nkey=e.which;
      var iekey='现在是ns浏览器';
      var realkey=String.fromCharCode(e.which);
    }
    if(ie)
    {
      var iekey=event.keyCode;
      var nkey='现在是ie浏览器';
      var realkey=String.fromCharCode(event.keyCode);
      if(event.keyCode==32){realkey='\' 空格\''}
      if(event.keyCode==13){realkey='\' 回车\''}
      if(event.keyCode==27){realkey='\' Esc\''}
      if(event.keyCode==16){realkey='\' Shift\''}
      if(event.keyCode==17){realkey='\' Ctrl\''}
      if(event.keyCode==18){realkey='\' Alt\''}
    }
    alert('ns浏览器中键值:'+nkey+'\n'+'ie浏览器中键值:'+iekey+'\n'+'实际键为'+realkey);
    }
    document.onkeydown = keyDown;
    </script>
    </head>
    <body>
    //Javascript. Document.
    <hr>
    <center>
    <h3>请按任意一个键。。。。</h3>
    </center>
    </body>
    </html>

     

    //检测media play版本

    <IE:clientCaps ID="oClientCaps" style="{behavior.:url(#default#clientcaps)}" />
    <SCRIPT>
    var flash="";
        WMPVersion= oClientCaps.getComponentVersion("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}","ComponentID");
        if (WMPVersion != "") {
        flash = "";
        var version = WMPVersion.split(",");
        var i;
        for (i = 0; i < version.length; i++) {
          if (i != 0)
        flash += ".";
          flash += version;
        }
         document.write("您的Windows Media Player 版本是:"+flash+"<p>");
      }
    </SCRIPT>

     

    //图象按比例

    <script. language="JavaScript">
    <!--
    //图片按比例缩放
    var flag=false;
    function DrawImage(ImgD){
    var image=new Image();
    var iwidth = 80;  //定义允许图片宽度
    var iheight = 80;  //定义允许图片高度
    image.src=ImgD.src;
    if(image.width>0 && image.height>0){
    flag=true;
    if(image.width/image.height>= iwidth/iheight){
      if(image.width>iwidth){ 
      ImgD.width=iwidth;
      ImgD.height=(image.height*iwidth)/image.width;
      }else{
      ImgD.width=image.width; 
      ImgD.height=image.height;
      }
      ImgD.alt=image.width+"×"+image.height;
      }
    else{
      if(image.height>iheight){ 
      ImgD.height=iheight;
      ImgD.width=(image.width*iheight)/image.height; 
      }else{
      ImgD.width=image.width; 
      ImgD.height=image.height;
      }
      ImgD.alt=image.width+"×"+image.height;
      }
    }
    }
    //-->
    </script>
    <img src=".." nload = "DrawImage(this)">

     

    //细线SELECT

    <span style="border:1px solid #000000; position:absolute; overflow:hidden;" >
    <select style="margin:-2px;">
    <option>1111</option>
    <option>11111111111111</option>
    <option>111111111</option>
    </select></span>


    //Import

    function Import() {
    for( var i=0; i<arguments.length; i++ ) {
      var file = arguments;
      if ( file.match(/\.js$/i))
       document.write('<script. type=\"text/javascript\" src=\"' + file + '\"></sc' + 'ript>');
      else
       document.write('<style. type=\"text/css\">@import \"' + file + '\" ;</style>');
    }
    };


    //js枚举

    function getComputerName()
    {
    var bjWMIService = GetObject("Winmgmts:root\cimv2");
    for(e = new Enumerator(objWMIService) ; !e.atEnd() ; e.moveNext())
    {
        var getComputer = e.item();
        return getComputer.Name;
    }
    }


    //条件编译

    <script. language=javascript>
    /*@cc_on @*/
    /*@if (@_win32 && @_jscript_version>5)
    function window.confirm(str)
    {
        execScript("n = msgbox('"+ str +"', 257)", "vbscript");
        return(n == 1);
    }
    @end @*/
    </script>


    //取得innerText


    <SCRIPT. LANGUAGE="JavaScript">
    <!--
    var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
    var currNode;
    xmlDoc.async = false;
    xmlDoc.async = false;
    xmlDoc.loadXML("<TABLENAME>      你好你阿三    大法     司法等四              </TABLENAME>");
    currNode = xmlDoc.documentElement;
      
      var s = currNode.xml;
      var r = /\<([^\>\s]*?)[^\>]*?\>([^\<]*?)\<\/\1\>/
      var b = s.replace(r,"$2");
      alert(b);
    //-->
    </SCRIPT>


    //mergeAttributes 复制所有读/写标签属性到指定元素。

    <SCRIPT>
    function fnMerge(){
    oSource.children[1].mergeAttributes(oSource.children[0]);
    }
    </SCRIPT>
    <SPAN ID=oSource>
    <DIV
    ID="oDiv"
    ATTRIBUTE1="true"
    ATTRIBUTE2="true"
    onclick="alert('click');"
    onmouseover="this.style.color='#0000FF';"
    onmouseout="this.style.color='#000000';"
    >
    This is a sample <B>DIV</B> element.
    </DIV>
    <DIV ID="oDiv2">
    This is another sample <B>DIV</B> element.
    </DIV>
    </SPAN>
    <INPUT
    TYPE="button"
    VALUE="Merge Attributes"
    onclick="fnMerge()"
    >


    JavaScript[对象.属性]集锦
    SCRIPT. 标记

    用于包含javascript代码.

    语法

    属性

    LANGUAGE 定义脚本语言

    SRC 定义一个URL用以指定以.JS结尾的文件


    windows对象

    每个HTML文档的顶层对象.

    属性

    frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.

    feames.length 子桢个数.

    self 当前窗口.

    parent 父窗口(当前窗口是中一个子窗口).

    top 顶层窗口(是所有可见窗口的父窗口).

    status 浏览器状态窗口上的消息.

    defaultStatus 当status无效时,出现在浏览器状态窗口上的缺省消息.

    name 内部名,为由window.open()方法打开的窗口定义的名字.

    方法

    alert("message") 显示含有给定消息的"javascript. Alert"对话框.

    confirm("message") 显示含有给定消息的"Confirm"对话框(有一个OK按钮和一个Cancel按钮).如果用户单击OK返回true,否则返回false.

    prompt("message") 显示一个"prompt"对话框,要求用户根据显示消息给予相应输入.

    open("URL","name") 打开一个新窗口,给予一个指定的名字.

    close() 关闭当前窗口.


    frame对象

    它是整个浏览器窗口的子窗口,除了status,defaultStatus,name属性外,它拥有window对象的全部属性.

    location对象

    含有当前URL的信息.

    属性

    href 整个URL字符串.

    protocol 含有URL第一部分的字符串,如http:

    host 包含有URL中主机名:端口号部分的字符串.如//www.cenpok.net/server/

    hostname 包含URL中主机名的字符串.如http://www.cenpok.net

    port 包含URL中可能存在的端口号字符串.

    pathname URL中"/"以后的部分.如~list/index.htm

    hash "#"号(CGI参数)之后的字符串.

    search "?"号(CGI参数)之后的字符串.


    document对象

    含有当前文档信息的对象.

    属性

    title 当前文档标题,如果未定义,则包含"Untitled".

    location 文档的全URL.

    lastModified 含有文档最后修改日期.

    referrer 调用者URL,即用户是从哪个URL链接到当前页面的.

    bgColor 背景色(#xxxxxx)

    fgColor 前景文本颜色.

    linkColor 超链接颜色.

    vlinkColor 访问过的超链颜色.

    alinkColor 激活链颜色(鼠标按住未放时).

    forms[] 文档中form对象的数组,按定义次序存储.

    forms.length 文档中的form对象数目.

    links[] 与文档中所有HREF链对应的数组对象,按次序定义存储.

    links.length 文档中HREF链的数目.

    anchors[] 锚(...)数组,按次序定义存储.

    anchors.length 文档中锚的数目.

    方法

    write("string") 将字符串突出给当前窗口.(字符串可以含有HTML标记)

    writeln("string") 与write()类似,在结尾追加回车符,只在预定格式文本中(...或...)生效.

    clear() 清当前窗口.

    close() 关闭当前窗口.


    form对象

    属性

    name

    中的NAME属性的字符串值.

    method 中METHOD属性的类值,"0"="GET" ,"1"="POST" .

    action 中ACTION属性的字符串值.

    target 表格数据提交的目标,与标记中相应属性一致.

    elements[index] elements属性包含form中的各个元素.

    length 表格中的元素个数.

    方法

    submit() 提交表格.

    事件处理器onSubmit() 用户单击一个定义好的按钮提交form时运行的代码.

    text和textarea对象

    属性

    name NAME属性的字符串值.

    value 域内容的字符串值.

    defaultValue 域内容的初始字符串值.

    方法

    focus() 设置对象输入焦点.

    blur() 从对象上移走输入焦点.

    select() 选定对象的输入区域.

    事件处理器

    onFocus 当输入焦点进入时执行.

    onBlur 当域失去焦点时执行.

    onSelect 当域中有部分文本被选定时执行.

    onChange 当域失去焦点且域值相对于onFocus执行有所改变时执行.

    复选框(checkbox)对象

    属性
    name NAME属性的字符串值.

    value 复选框内容的字符串值.如果设置了,则为"on",否则为"off".

    checked 复选框内容的布尔值.如果设置了,则为true,否则为false .

    defaultChecked 反映(CHECKED)属性的布尔值(缺省状态).

    方法

    click() 选定复选框,并使之状态为"on".

    事件处理器

    onClick 当用户单击Checkbox时执行.


    单选按钮(radio)对象

    属性

    name NAME属性的字符串值.

    length radio对象中单选按钮的个数.

    value VALUE属性的字符串值.

    checked 布尔值,按下为true,否则为false .

    defaultChecked 反映CHECKED属性值的布尔值.

    方法

    click() 选定单选按钮.

    事件处理器

    onClick 当单选按钮被选定时执行.


    select对象

    属性

    length select对象中对象的个数.

    name 由NAME=属性定义的select对象的内部名.

    selectedIndex select对象中当前被选option的下标.

    options 该属性对应于在HTML中定义select对象时标记中的内容,它有如下属性:

    text 标记后的文本串.

    value VALUE属性的值,当Submit按钮被按下时,该值被提交.

    defaultSelected 反映标记的SELECTED属性的布尔值.

    selected 反映option的当前选择状态的布尔值.

    事件处理器

    onFocus 当输入焦点进入域时执行.

    onBlur 当域失去输入焦点时执行.

    onChange 当域失去焦点且如果域的值相对于onFocus执行时有所改变,则执行onChange.


    Button对象

    表格中有三种类型按钮,由标记中的TYPE属性定义:

    .submit (type="SUBMIT")
    .reset (type="RESET")
    .custom (type="BUTTON")

    所有按钮对象都有如下成分:
    属性

    value VALUE属性的字符串值.

    name NAME属性的字符串值.
    方法

    click() 选定按钮

    事件处理器

    onClick 当按钮被单击时执行.


    submit和reset对象

    属性

    value VALUE=属性的内容.

    name NAME=属性的内容.

    方法

    click() 选定按钮

    事件处理器

    onClick 当按钮被单击时执行.


    password对象

    属性

    defaultValue VALUE=属性的内容.

    name NAME=属性的内容.

    value 目前输入password域的数据.

    方法

    focus() 将焦点带入password域.

    blur 将焦点从password域移出.

    select() 选定password域中的当前数据,以备修改.


    navigator对象
    该对象用于确定用户访问时使用的Navigator版本.

    属性

    appCodeName 相对于用户浏览器的"codename"

    appName 相对于用户浏览器的实际名字.

    appVersion 相对于用户浏览器的版本号.

    userAgent 该属性反映用户浏览器的全部信息.


    string对象

    string对象为操作字符串的内容提供了很多方法.

    属性

    length 字符串的长度,即字符串中字符的个数.

    方法

    big(),blink(),bold(),fixed(),italics(),small(),sub(),strike(),sup(),fontColor(color),fontSize(size)

    以上方法为字符串增加相应的HTML标记.

    charAt(index) 返回字符串中index处的字符.

    indexOf(searchValue,[fromIndex]) 该方法在字符串中寻找第一次出现的searchValue.如果给定了fromIndex,则从 字符串内该位置开始搜索,当searchValue找到后,返回该串第一个字符的位置.

    lastIndexOf(searchValue,[fromIndex]) 从字符串的尾部向前搜索searchValue,并报告找到的第一个实例.

    substring(indexA,indexB) 获取自indexA到indexB的子串.

    toLowerCase(),toUpperCase() 将字符串中所有字符全部转换成大写,小写.


    Date对象

    要使用Date对象,必须先生成一个Date实例:

    变量名=new Date();

    方法
    getDay(),getDate(),getHours(),getMinutes(),getMonth(),getSeconds(),getTime(),
    getTimeZoneOffset(),getYear()

    还有setDay... ...

    toGMTString() 用GMT格式返回当前时间. (Sun,12 Feb 1999 14:19:22 GMT)

    toLocaleString 用locale格式返回当前时间. (03/11/99 14:19:22)

    parse(date) 将普通date字符串转换成豪秒形式,从而给setTime()做参数.


    Math对象

    属性

    LN10 (10的自然对数)

    PI (3.1415926...)

    SQRT1_2 (1/2的平方根)

    方法

    abs(x) 返回x的绝对值
    acos(x) 返回x的arc cosine值
    asin(x) 返回x的arc sin值
    atan(x) 返回x的arc tangent值
    ceil(x) 返回大于等于x的最小整数
    cos(x) 返回x的cosine值
    exp(x) 返回e的x次方
    floor(x) 返回小于等于x的最大整数
    log(x) 返回x的
    max(x,y) 返回x,y中的大值
    min(x,y) 返回x,y中的小值
    pow(x,y) 返回x的y次方
    round(x) 舍入到最近整数,(小于或等于0.5小数舍去)
    sin(x) 返回x的sin值
    sqrt(x) 返回x的平方根
    tan(x) 返回x的tangent值


    弹窗代码汇总
    【0、超完美弹窗代码 】
    功能:5小时弹一次+背后弹出+自动适应不同分辩率+准全屏显示

    代码:
    <script>
    function openwin(){
    window.open(http://www.6882.com,"pop1","width="+(window.screen.width-15)+",height="+(window.screen.height-170)+",left=0,top=0,toolbar=yes,menubar=yes,scrollbars=yes,resizable=yes,location=yes,status=yes")
    setTimeout("focus();",5);
    }
    function get_cookie(Name) {
    var search = Name + "="
    var return&#118alue = "";
    if (documents&#46cookie.length > 0) {
    offset = documents&#46cookie.indexOf(search)
    if (offset != -1) {
    offset += search.length
    end = documents&#46cookie.indexOf(";", offset);
    if (end == -1)
    end = documents&#46cookie.length;
    return&#118alue=unescape(documents&#46cookie.substring(offset, end))
    }
    }
    return return&#118alue;
    }
    function Set()
    {
      var Then = new Date()    
      Then.setTime(Then.getTime() + 5*60*60*1000 )
      documents&#46cookie = "popped1=yes;expires="+ Then.toGMTString()
    }

    function loadpopup(){
    if (get_cookie('popped1')=='')
    {
    openwin()
    Set()
    }
    }
    setTimeout("loadpopup()",5);

    </script>


    【1、最基本的弹出窗口代码】

    其实代码非常简单:

    <script. language="&#106avascript">
    <!--
    window.open ('page.html')
    -->
    </script>
    因为着是一段&#106avascripts代码,所以它们应该放在<script. language="&#106avascript">标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。
    window.open ('page.html') 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以,只是不要混用。
    这一段代码可以加入html的任意位置,<head>和</head>之间可以,<body>间</body>也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。


    【2、经过设置后的弹出窗口】

    下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。
    我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。
    <script. language="&#106avascript">
    <!--
    window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
    //写成一行
    -->
    </script>
    参数解释:
    <script. language="&#106avascript"> js脚本开始;
    window.open 弹出新窗口的命令;
    'page.html' 弹出窗口的文件名;
    'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替;
    height=100 窗口高度;
    width=400 窗口宽度;
    top=0 窗口距离屏幕上方的象素值;
    left=0 窗口距离屏幕左侧的象素值;
    toolbar=no 是否显示工具栏,yes为显示;
    menubar,scrollbars 表示菜单栏和滚动栏。
    resizable=no 是否允许改变窗口大小,yes为允许;
    location=no 是否显示地址栏,yes为允许;
    status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
    </script> js脚本结束


    【3、用函数控制弹出窗口】

    下面是一个完整的代码。
    <html>
    <head>
    <sc

  • Facebook后台技术探秘

    2011-04-14 11:29:44

    Facebook后台技术探秘

          每月570000000000页面浏览量,每个月超过30亿的图片上传,5亿的用户数量,Facebook的后台是用哪些技术保障网站的流畅运行呢?      

          在今年举行的Facebook F8开发者大会上,51CTO带您了解了其最新的开放图战略和语义搜索。今天我们一起来了解Facebook背后的软件,看看作为当今世界上访问量最大的网站之一,Facebook是如何保证5亿用户的系统一直稳定可靠的运行。

          Facebook的扩展性挑战

          在我们讨论细节之前,这里有一些Facebook已经做的软件规模:

          ◆Facebook有570000000000每月页面浏览量 (据Google Ad Planner)

          ◆Facebook的照片量比其他所有图片网站加起来还多(包括Flickr等网站)

          ◆每个月超过30亿张照片被上传

          ◆Facebook的系统服务每秒处理120万张照片,这不包括CDN服务中处理的照片

          ◆每月超过25亿条的内容 (状态更新,评论等)被共享

          ◆Facebook有超过30,000服务器(这个数字是去年的)

          Facebook扩展所依赖的软件

          Facebook是在某些程度上说仍然是LAMP的站点,但它比普通的LAMP大得多,以纳入其他元素和很多服务,并修改现行的做法。

          例如:

          ◆Facebook仍使用PHP,但它已经为它建立一个编译器,以便它可以分为本地代码打开了Web服务器,从而提高性能。

          ◆Facebook使用Linux,但他特别为网络吞吐量做了优化。

          ◆Facebook使用MySQL,但主要是作为一个Key-value的持久性存储,Jions和服务器逻辑操作在Web服务器上操作。因为在那里更容易执行。

          还有是自编写的系统,如Haystack,一个高度可扩展的对象存储,用来存储Facebook的照片。还有Scribe,一个日志系统,可以运行在Facebook的巨大规模上的日志系统。

          现在我们介绍一下全球最大的社会网络网站的所使用的软件吧。

          Memcached

          memcached的是现在互联网最有名的软件之一了。 这是一个分布式内存缓存系统,用来作为Web服务器和MySQL服务器之间的缓存层(因为数据库访问比较慢)。 多年以来,Facebook已经提出了一些优化Memcached和一些周边软件的办法。如压缩network stack。

          Facebook的每时每刻都有数10TB的数据缓存在Memcached的数千台服务器上。 它可能是世界上最大的Memcached的集群了。

          HipHop for PHP

          PHP作为一种脚本语言,和本地程序相比是运行缓慢的。 HipHop可以将PHP转换成C + +代码,然后再进行编译,可以获得更好的性能。 因为Facebook严重依赖PHP,这使得其可以让Web服务器运行的更有效率。

          一个工程师小团队在Facebook(一开始只有三人)花了18个月时间开发HipHop,现在已经是可用状态。

          Haystack

          Haystack是Facebook的高性能照片存储/检索系统(严格来说,是一个对象存储,因此它并不一定要存储照片)。 它有许多工作要做;有超过20亿张上传的照片,并且每一个被保存在四个不同的分辨率,因此有超过800亿张照片。

          它不仅是对能够处理的上亿的照片,运行表现也是至关重要的。 正如我们前面提到的,Facebook的服务约120万张照片每秒 ,这个数字不包括CDN上的。 这是一个惊人的数字。关于Facebook的图片存储请参考51CTO之前的报道《Facebook图片存储架构技术全解析》。

          BigPipe

          BigPipe是Facebook开发的一个动态的网页服务系统。 Facebook使用它来按section(称为“pagelets”)处理每个网页,以获取最佳性能。

          例如,在聊天窗口是分开的,新闻Feed也是分开的,等等。 这些pagelets可以在一个页面表现的时候同时使用,这是该页面表现的时候获取进来的。即使某些工程的一部分关闭或中端,用户也可以获得一部分网页。

          Cassandra

          Cassandra是一个不会单点失败的分布式存储系统。 这是为NoSQL运动的一个重要组成部分,并已公开的源代码(它甚至成为一个Apache项目)。Facebook在搜索功能中使用它。

          除了Facebook,还有一些人也用它,例如Digg的。 不过最近Twitter放弃了Cassandra。关于Cassandra的更多介绍可以参考51CTO的专题《奔向自由?Cassandra数据库应用指南》。

          Scribe

          Scribe是一个灵活的日志系统,Facebook在他的内部大量使用。 它的能够处理在Facebook的大规模日志记录,并自动处理新的日志记录类别,Facebook有数百个日志类别(categories)。
          

          Hadoop and Hive

          Hadoop的是一个开源的map-reduce实现,使得它可以在进行大数据上进行运算。 Facebook的使用这个进行数据分析(而我们都知道,Facebook已经大量的数据)。 Hive就是发源于Facebook,使得对于Hadoop使用的SQL查询成为可能,从而是其更容易对非程序员使用。

          Hadoop和Hive是开源的(Apache项目),有为数众多的追随者,例如雅虎和Twitter。

          Thrift

          Facebook使用的几种不同的语言和不同的services。 PHP是最终用于前端,Erlang是用于聊天,Java和C ++也使用于多种场所,也许还有其他语言。Thrift是一个内部开发的跨语言的框架,联系语言,使他们可以在一起合作,从而使他们之间可以交互。 这使得Facebook可以更容易为继续保持其跨语言的发展。

          Facebook已经让Thrift开源。更多的语言支持已被添加到Thrift。

          Varnish

          Varnish是一个HTTP加速器,可以作为一个负载平衡器,并缓存的内容,然后可以以闪电般的速度送达。

          Facebook使用的arnish来处理照片和个人资料图片,处理每天数十亿的要求。 和其他的东西一样,Varnish是开源的。

          保持Facebook 顺畅运行的其他东西

          我们已经提到的软件,组成了Facebook的系统,并帮助运行在大规模上。 但是,处理这么大的系统是一个复杂的任务,因此我们将列出一些其他的东西,他们保持了Facebook的平稳运行。

          渐进发布和暗启动

          Facebook有一个他们所谓的守门人制度(Gatekeeper),允许他们可以给不同的用户运行两套不同的系统。 这让Facebook渐进的发布新的功能,A / B测试,只为Facebook雇员发布等的某些特性。

          Gatekeeper也可以让Facebook实现“暗启动”,这是在用户使用一些功能之前,就激活某些功能(因为用户没有察觉,所以称之为暗启动)。 这将作为一个现实世界的压力测试,在正式启动前,帮助揭露一些功能障碍和其他问题。 暗启动通常是在正式启动前两个星期。

          Profiling的直播系统

          Facebook的仔细监控其系统,有趣的是它也负责监察每一个PHP函数在生产环境的性能。 检测各个PHP的环境的配置运行情况。使用开源工具,XHProf 。

          渐进的利用关闭功能来提升性能

          如果Facebook运行时出现性能问题,有一个办法,就是逐步禁用不太重要的功能,以增强Facebook的大量核心功能表现。

          我们没有提及的事情

          我们没有提到硬件相关的事情,但这也是提高可伸缩性的重要一环。例如,就像其他大型站点,Facebook利用CDN来处理静态内容。Facebook还有一个the huge data center,可以帮助他扩展更多的服务。

          Facebook的开源情节

          不仅是Facebook使用(和帮助),如Linux,Memcached的,MySQL和Hadoop的开源软件,以及许多其他情况下,也贡献许多了其内部开发的软件。

          Facebook亦开源了Tornado,一个高性能的网络服务器框架,由FriendFeed团队开发。关于开放源码软件清单,可以在Facebook’s Open Source page.找到。
           ( 本文转载自 颜开的博客 ,原文: Facebook背后的软件 。)
  • 专访人人网黄晶:SNS网站后台架构探秘

    2011-04-14 11:27:51

     人人网作为国内大型SNS站点的代表,其目前已经拥有真实注册用户超过7000万、PV达到了4亿、日登录2200万人次。面对如此庞大的访问量,人人网的后台架构是怎样的一番景象呢?关于此,51CTO独家专访了现任人人网产品技术高级总监黄晶老师。

    51CTO:作为国内大型SNS站点的代表,我们知道人人网后台主要采用Java语言编写,同其他形式的站点相比,SNS站点在网站架构方面有什么样的特点?

    黄晶老师:SNS网站用户数据量庞大且关系复杂,对实时性要求非常高,因此要求SNS网站架构要有很强的水平扩展性。

    51CTO:在后台语言的选择上,有其他大型SNS站点使用PHP,人人网则选择了Java,使用Java的优势在体现哪些方面?

    黄晶老师:Java的优势体现在当项目日渐复杂的时候,可以通过Java良好的OO特性,保持非常好的模块性,在进行网站重构的时候比较方便,在代码量增大的时候也可保持良好的可管理性。

    51CTO:现在很多大型网站的后台都使用了大量的开源软件,人人网是否也是如此呢?咱们的开发团队是否也在开发自己的框架呢?

    黄晶老师:人人网也使用了大量开源软件,比如MySQL、Memcached、ICE、Hadoop等,同时我们也根据业务需要研发了自己的框架,比如MVC框架,分布式KV存储系统。

    51CTO:一个网站在发展过程中,后台都会经历不断的重构,从初期的校内网、到现在的人人网,网站架构最大的变化在哪?

    黄晶老师:从初期的校内网到现在人人网,最大的变化是:很多底层服务都从利用已有开源软件的搭建,变成了根据业务需要,由我们自己开发专门的服务所代替,这样能够提高资源利用程度,提高整个系统的可用性。

    51CTO:我们知道人人网的用户量非常庞大,在数据库方面,人人网采用了哪种数据库?除了高性能、可扩展性外,人人网对数据库的需求还有哪些?在整个后台系统架构中,往往数据库的性能也会出现瓶颈,从早期的校内网到现在,我们对数据库性能的优化方面都做了哪些大的改变?

    黄晶老师:我们采用的数据库是MySQL,在需求方面,我们也非常关注高可用性。早期校内从单数据库,到主从接口,发展到后来垂直拆分,然后水平拆分,然后在每个节点上实现主-主提高可用性,到异地备份容灾。目前我们的数据库已经有非常强的水平扩展能力和非常高的可用性。

    关于MySQL,51CTO推荐专题:MySQL数据库入门与精通教程

    51CTO:数据缓存在后台架构中同样非常重要,在数据库服务器、Web服务器以及两者之间,人人网都采用了哪些缓存手段?

    黄晶老师:我们的数据库用到了部分自身缓存机制,比如尽可能利用innodb的pool和MySQL的 Query Cache。在中间用到Memcached,以及基于ICE通讯框架由我们自己编写的包含业务逻辑处理能力的缓存服务,在我们自行开发的分布式KV系统中也会充分利用内存Cache加速。

    推荐阅读:分布式缓存系统memcached简介与实践

    51CTO:目前国内外也有很多大型站点在使用NoSQL,从功能上来将,其非常适合应用在SNS、微博等站点,人人网是否在考虑使用NoSQL呢?

    黄晶老师:对于NoSQL,我们已经考虑并在逐步试用自行开发的Nuclear分布式KV存储系统。

    关于NoSQL,51CTO推荐专题:NoSQL:关系型数据库终结者?

    51CTO:上传照片或者图片是SNS网站用户很常用的一个功能,对于Web服务器来讲,图片是非常消耗资源的,那么目前人人网每天大概有要处理多少张图片?相比较其他数据而言,图片会占用大量存储空间,给服务器带来不小的压力,我们知道Facebook有着一套自己的图片存储架构,咱们人人网在这方面是怎么做的呢?

    黄晶老师:现在人人网每天要处理千万张级别的照片数量。我们使用由C++专门编写的Web服务来处理照片上传和压缩工作。存储是用一套分布式文件存储系统,在小文件很多的情况下,也会采用把小文件聚合为大文件的方式提高性能,这样的做法也便于大量小文件的备份。

    51CTO:目前SNS站点都有很强的实时性,用户能够第一时间看到好友都在做什么,像人人网以及Facebook等,还有即时聊天功能,我们是通过什么样的手段来最大限度的优化每一个页面,从而尽可能的减少服务器的请求时间,提高用户体验的呢?

    黄晶老师:我们的做法是尽可能把数据放在内存中,提高数据存取速度。另外,复杂的页面采用并发机制,多线程同时从多个后台源取数据拼成页面。

    51CTO:最后,还想请黄晶老师谈一谈SNS网站后台技术的发展趋势,以及从事SNS后台开发的开发者需要关注那几方面?

    黄晶老师:鉴于SNS网站的一些业务特点,在后台技术中,我们最关注的仍然是高性能,可扩展性,高可用性。并且 SNS所提供的服务也在变化中,对于业务的多变,架构要有灵活适应的能力,否则需要提供新服务的时候重构之前的系统工作量很大。类似Google的 GFS/Bigtable/MapReduce一系列通用的分布式系统非常优秀,可以支撑很多Google的业务需要。所以在SNS网站架构中也需要一个能灵活应对业务变化的一套健壮的分布式系统。

    【51CTO独家特稿,转载请注明原文出处及作者!】

    转自: http://my.oschina.net/laotao020/blog/10973

  • loadrunner_LR中错误代号为27796的一个解决方法(转载)

    2011-04-13 19:56:02

    原文见:http://blog.csdn.net/zeeslo

    问题:

    曾经遇到过一个问题,在一次性能测试过程中,使用http协议的多用户服务器发送请求。设置了持续时间,出现错误为:27796, Failed to connect to server 'hostname';port_ld': 'reason'.10048.(凭记忆写的,不知道写错了没有)

    分析:

    因为负载生成器的性能太好,发数据包特别快,服务器也响应特别快,从而导致负载生成器的机器的端口在没有timeout之前就全部占满了。在全部占满后,就会出现上面的错误。执行netstat –na命令,可以看到打开了很多端口。所以就调整TCP的time out。即在最后一个端口还没有用到时,前面已经有端口在释放了。

    官方的troubleshooting:
    查看工具的troubleshooting,如下:
    1. Message Code 27796
    2. Failed to connect to server 'hostname';port_ld': 'reason'.
    3. Unable to connect to the specified server and port.
    4. Troubleshooting
    5. o      Try to address the reason provided for the connection failure.
    6. o      Try to access the application with a browser from the injector machine and from another machine (such as the recording machine).
    7. o      Check that you accurately specified the correct host name and port.
    8. o      Ping the host/port.
    9. o      Check if the server application you are trying to access is running.
    10. o      If you used a hostname, check if it was resolved to the correct address.
    11. o      Check if the server application is listening to the right port.
    复制代码

    均不是解决之道。

    成功的解决方法:

    在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里,有如下两个键值:
    TcpTimedWaitDelay
    MaxUserPort
    1,这里的TcpTimedWaitDelay默认值应该中是30s,所以这里,把这个值调小为5s(按需要调整)。
    2,也可以把MaxUserPort调大 --> 65534 (如果这个值不是最大值的话)。

    反复验证,问题解决。

     

    看图片:

     

     

     

     

    真实太谢谢zee了,这种无私贴最喜欢了

    我在网上又查了点信息,大家一起提高下
    TcpTimedWaitDelay 值決定了 TCP/IP 必須經過多久,才能釋出已關閉的連線及重複使用它的資源。這個關閉和釋出的間隔稱為 TIME_WAIT 狀態,或是區段生命期限上限 (2MSL) 狀態的兩倍。在這段時間內,通往用戶端和伺服器的連線重新開啟的成本,比建立新的連線低。藉由縮減這個項目的值,TCP/IP 可以更快釋出已關閉的連線,提供更多資源給新的連線。如果執行中的應用程式需要快速釋出、建立新連線,或多個連線在 TIME_WAIT 狀態中造成通訊量太低,因而需要進行調整的話,請調整這個參數。

    預設值是 0xF0,它會將等待時間設為 240 秒(4 分鐘)。

    最小的建議值是 0x1E,它會將等待時間設為 30 秒。請利用這個程序來檢視或自訂您的值。

    啟動 regedit 指令,瀏覽至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters 登錄次機碼,建立名稱為 TcpTimedWaitDelay 的新 REG_DWORD 值。
    將值設為十進位 30,也就是十六進位的 0x0000001e。這個值會將等待時間設為 30 秒。
    關閉登錄編輯器。
    停止並重新啟動系統。
    MaxUserPort
    MaxUserPort 值決定了當應用程式向系統要求可用的使用者埠時,TCP/IP 所能指派的最高埠號。如果您的系統報告建立 Socket 時,發生錯誤異常狀況,可能是匿名(短期)埠的數量不當所造成,當系統開啟大量的埠來建立 Web 服務、資料庫或其他遠端資源的連線時,尤其如此。

    ===============================================================================

    loadrunner error 27792 27796 转
    2010-07-09 10:01

    xp系统问题


    error -27792,-27796等问题,都是和xp系统的tcp连接数有限制导致,默认是10,修改下这个默认值为150或者250,基本上就可以解决了。
    修改tcp连接数,网上有很多方法,我用的是最偷懒的方法,就是装一个bit精灵,里面有“tcp连接数破解补丁”,设置下就好了

    =====================================================================================

    TcpTimedWaitDelay和MaxUserPort设置
    描述:确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。 停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。 建议值:最小值为 0x1E,它将等待时间设置为 30 秒。 MaxUserPort 描述:确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。 停止并重新启动系统。 缺省值:无 建议值:至少十进制 32768。 注:当在 Windows NT 或 Windows 2000 操作系统上
    调整 WebSphere Application Server 时,同时使用这两个参数。希望本站的知识能给您的工作、学习和生活带来方便和乐趣!  

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tuwen/archive/2008/03/17/2191742.aspx

     
    其他相关文章:
     
     
    关于Windows频繁打开关闭端口时出现的问题
     
     

    最近事情很多,人也懒,东西看了不少,也想到过一些东西,但就是懒得写。现在记录一下前两个星期做一个压力测试时出现的现象,希望重开一个好头。简单地说,这是个从Windows Server连接Linux下的MongoDB服务时出现的问题。MongoDB使用的是自定义的二进制协议,客户端使用普通的TCP连接进行连接后再读写数据。在以前的测试中,我使用的都是建立少量连接,每个连接进行多次操作,而这次则是对“应用程序”进行压力测试,因此需要不断地开启及关闭连接——频率大约是每秒4、500次吧。

    我使用的环境是Windows Web Server 2008 R2,MongoDB部署在Cent OS上,双方都是64位操作系统。压力测试刚开启时一切顺利,性能也比较令人满意,但是不久后便会抛出这样的异常:

    由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。

    一开始我以为是程序里有哪个地方没有释放连接,于是检查了程序代码,觉得没有问题;后来又直接使用mongodb-csharp进行频繁连接关闭,结果还是出现了同样的错误,于是我又怀疑是驱动本身的问题,但是看了看讨论组中似乎又没有人汇报过这个问题;于是我又换了个思路,使用了Java平台上的驱动写了个简单的测试程序,居然还是得到了这个错误。由此我确定了两点:

    • 这很可能不是mongodb-csharp这个驱动程序的问题。当然,要确定这一点还需要更多测试,例如在mono上使用这个驱动。
    • 这是操作系统方面的问题,因为.NET和Java都给出了同样的错误信息,甚至和当前程序的语言文化设置无关。

    还有一个细节:在直接使用驱动进行插入操作的时候,发现无论使用多少线程同时进行,最终永远是在插入了16370-16380条记录之后停止,这意味着每次都是打开关闭了确定次数之后出现的错误,这很有可能是一个操作系统限制所致的结果。因此,我使用这段错误信息在网上寻找解决方案,原因有很多,大都不是我需要的。顺便一提,只有中文的错误信息真是很难找到合适的结果,因此我不得不通过几个关键字,再连蒙带猜地得到了错误的标准英文翻译:

    An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

    有了这段信息,找起答案来就简单多了,例如KB上找到了这样一条记录,说是在Windows Vista及2008中,Tcp/IP动态端口的范围调整到49152至65535,做一个简单的减法可以发现我们可以使用16384个接口,和我们之前看到的记录数量大致相同,基本可以确定是频繁地打开关闭操作造成客户端的动态端口用尽的问题。KB上也给出了解决方法,只要使用netsh命令便可以进行设置。

    不过有意思的是,我在此之前还找到了另一条记录,说是在HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下面可以增加一个MaxUserPort参数,指定程序可以使用的端口范围,它的默认值是5000,也就是端口范围是1025至5000,这也是上一条记录中说Windows之前的端口策略,它的“适用范围”已经不包括2008系统,但我鬼使神差地将MaxUserPort设置为65534(十进制)之后,原本只能插入16000多条记录的程序已经能够插入数万条,这意味着修改的确生效了。

    当然,这么做还是没有解决问题,总不见得插入这么多条记录之后还是失败吧。其实第二条记录里还写到,有一个TcpTimedWaitDelay参数,表示一个关闭后的端口等待多久之后可以重新使用,顺着这个信息我找到了《TCP/IP Registry Values for Windows Server 2008》这样一篇文章,描述Vista与2008系统中各种TCP/IP相关的参数,其中自然包括了TcpTimedWaitDelay,它的默认值为120,表示端口关闭后120秒才能重新使用。

    于是我们来算一下,假设有60000个端口可用,如果在120秒内消耗完毕,则每秒最多使用500个端口,这远远低于MongoDB的性能瓶颈,甚至接近了一个Web应用程序的需求——根据压力测试,我们单台Web服务器每秒可以处理接近200个动态请求,这意味着平均每个请求只能使用2.5个连接。根据文档,我将TcpTimedWaitDelay设成最短的30秒,这意味着我们可以每秒开启关闭2000个端口,平均每个请求使用10个连接。够了。

    这个问题就这样解决了,说实话很简单,也就是个“知道就能解决”的配置问题。当然现在这个方式并不算太理想,更好的方式应该是利用连接池,这样便不会开启/关闭大量的TCP/IP连接,默认的端口数量也已经足够了,更重要的是这也可以省下很大的开销——因为经过测试,即使是最复杂的ASP.NET页面,只要不涉及MongoDB,每秒也能处理6500多个请求,而目前每秒200个动态请求,从数字上看也远低于MongoDB的能力,我们有理由相信目前的性能似乎是卡在连接的打开/关闭上了。

    只可惜目前mongodb-csharp的连接池实现有bug,用于清理连接的维护进程居然会让造成明显的中断,甚至在频繁使用十几分钟后还抛出了异常。有机会的话我再看看吧,但我总觉得它目前的实现过于复杂了,我估计都可以说是面向对象的“经典”使用案例了。

    最后再来一提,话说我目前使用的是64位的Windows Web Server 2008 R2系统,功能强大,价格便宜授权宽松,最多允许使用到32GB内存,作为Web服务器我很满意。

     
     
  • apache ab压力测试

    2011-04-13 19:42:23

     

    apache ab压力测试

    相同并发下,用ab测试与用loadrunner测试结果有出入,tps偏小

    以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了。就是APACHE自带的测试工具AB(apache benchmark).在APACHE的bin目录下。
    格式: ./ab [options] [http://]hostname[:port]/path
    参数:
        -n requests     Number of requests to perform
        //在测试会话中所执行的请求个数。默认时,仅执行一个请求
        -c concurrency Number of multiple requests to make
        //一次产生的请求个数。默认是一次一个。
        -t timelimit    Seconds to max. wait for responses
        //测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
        -p postfile     File containing data to POST
        //包含了需要POST的数据的文件.
        -T content-type Content-type header for POSTing
        //POST数据所使用的Content-type头信息。
        -v verbosity    How much troubleshooting info to print
        //设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。
        -w              Print out results in HTML tables
        //以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
        -i              Use HEAD instead of GET
       // 执行HEAD请求,而不是GET。
        -x attributes   String to insert as table attributes
        //
        -y attributes   String to insert as tr attributes
        //
        -z attributes   String to insert as td or th attributes
        //
        -C attribute    Add cookie, eg. 'Apache=1234. (repeatable)
        //-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。
        -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
                        Inserted after all normal header lines. (repeatable)
        -A attribute    Add Basic WWW Authentication, the attributes
                        are a colon separated username and password.
        -P attribute    Add Basic Proxy Authentication, the attributes
                        are a colon separated username and password.
        //-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
        -X proxy:port   Proxyserver and port number to use
        -V              Print version number and exit
        -k              Use HTTP KeepAlive feature
        -d              Do not show percentiles served table.
        -S              Do not show confidence estimators and warnings.
        -g filename     Output collected data to gnuplot format file.
        -e filename     Output CSV file with percentages served
        -h              Display usage information (this message)
        //-attributes 设置 属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现HTTP/1.x; 仅接受某些'预想'的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。

    参数很多,一般我们用 -c 和 -n 参数就可以了. 例如:

    ./ab -c 1000 -n 1000 http://127.0.0.1/index.php

    这个表示同时处理1000个请求并运行1000次index.php文件.
    #/usr/local/xiaobai/apache2054/bin/ab -c 1000 -n 1000 http://127.0.0.1/index.html.zh-cn.gb2312
    This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
    Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

    Benchmarking 127.0.0.1 (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Finished 1000 requests


    Server Software:        Apache/2.0.54
    //平台apache 版本2.0.54
    Server Hostname:        127.0.0.1
    //服务器主机名
    Server Port:            80
    //服务器端口

    Document Path:          /index.html.zh-cn.gb2312
    //测试的页面文档
    Document Length:        1018 bytes
    //文档大小

    Concurrency Level:      1000
    //并发数
    Time taken for tests:   8.188731 seconds
    //整个测试持续的时间
    Complete requests:      1000
    //完成的请求数量
    Failed requests:        0
    //失败的请求数量
    Write errors:           0

    Total transferred:      1361581 bytes
    //整个场景中的网络传输量
    HTML transferred:       1055666 bytes
    //整个场景中的HTML内容传输量
    Requests per second:    122.12 [#/sec] (mean)
    //大家最关心的指标之一,相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值
    Time per request:       8188.731 [ms] (mean)
    //大家最关心的指标之二,相当于 LR 中的 平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值
    Time per request:       8.189 [ms] (mean, across all concurrent requests)
    //每个请求实际运行时间的平均值
    Transfer rate:          162.30 [Kbytes/sec] received
    //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

    Connection Times (ms)
                  min mean[+/-sd] median   max
    Connect:        4 646 1078.7     89    3291
    Processing:   165 992 493.1    938    4712
    Waiting:      118 934 480.6    882    4554
    Total:        813 1638 1338.9   1093    7785
    //网络上消耗的时间的分解,各项数据的具体算法还不是很清楚

    Percentage of the requests served within a certain time (ms)
    50%   1093
    66%   1247
    75%   1373
    80%   1493
    90%   4061
    95%   4398
    98%   5608
    99%   7368
    100%   7785 (longest request)
    //整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于1093 毫秒,60% 的用户响应时间小于1247 毫秒,最大的响应时间小于7785 毫秒

          由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数

    更多信息

    ab 不像 LR 那么强大,但是它足够轻便,如果只是在开发过程中想检查一下某个模块的响应情况,或者做一些场景比较简单的测试,ab 还是一个不错的选择——至少不用花费很多时间去学习 LR 那些复杂的功能,就更别说那 License 的价格了。

    下面是 ab 的详细参数解释,大家有兴趣的可以研究一下,最近没有足够多的时间研究,如果哪位朋友有兴趣希望可以帮忙翻译一下每个参数的含义,有问题讨论也欢迎在这里回帖 ^_^

    ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value ] [ -d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [ -k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:password ] [ -q ] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z <td>-attributes ] [http://]hostname[:port]/path

     

    -A auth-username:password

    Supply BASIC Authentication credentials to the server. The username and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the server needs it (i.e., has sent an 401 authentication needed).

    -c concurrency

    Number of multiple requests to perform. at a time. Default is one request at a time.

    -C cookie-name=value

    Add a Cookie: line to the request. The argument is typically in the form. of a name=value pair. This field is repeatable.

    -d

    Do not display the "percentage served within XX [ms] table". (legacy support).

    -e csv-file

    Write a Comma separated value (CSV) file which contains for each percentage (from 1% to 100%) the time (in milliseconds) it took to serve that percentage of the requests. This is usually more useful than the 'gnuplot' file; as the results are already 'binned'.

    -g gnuplot-file

    Write all measured values out as a 'gnuplot' or TSV (Tab separate values) file. This file can easily be imported into packages like Gnuplot, IDL, Mathematica, Igor or even Excel. The labels are on the first line of the file.

    -h

    Display usage information.

    -H custom-header

    Append extra headers to the request. The argument is typically in the form. of a valid header line, containing a colon-separated field-value pair (i.e., "Accept-Encoding: zip/zop;8bit").

    -i

    Do HEAD requests instead of GET.

    -k

    Enable the HTTP KeepAlive feature, i.e., perform. multiple requests within one HTTP session. Default is no KeepAlive.

    -n requests

    Number of requests to perform. for the benchmarking session. The default is to just perform. a single request which usually leads to non-representative benchmarking results.

    -p POST-file

    File containing data to POST.

    -P proxy-auth-username:password

    Supply BASIC Authentication credentials to a proxy en-route. The username and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the proxy needs it (i.e., has sent an 407 proxy authentication needed).

    -q

    When processing more than 150 requests, ab outputs a progress count on stderr every 10% or 100 requests or so. The -q flag will suppress these messages.

    -s

    When compiled in (ab -h will show you) use the SSL protected https rather than the http protocol. This feature is experimental and very rudimentary. You probably do not want to use it.

    -S

    Do not display the median and standard deviation values, nor display the warning/error messages when the average and median are more than one or two times the standard deviation apart. And default to the min/avg/max values. (legacy support).

    -t timelimit

    Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally. Use this to benchmark the server within a fixed total amount of time. Per default there is no timelimit.

    -T content-type

    Content-type header to use for POST data.

    -v verbosity

    Set verbosity level - 4 and above prints information on headers, 3 and above prints response codes (404, 200, etc.), 2 and above prints warnings and info.

    -V

    Display version number and exit.

    -w

    Print out results in HTML tables. Default table is two columns wide, with a white background.

    -x <table>-attributes

    String to use as attributes for <table>. Attributes are inserted <table here >.

    -X proxy[:port]

    Use a proxy server for the requests.

    -y <tr>-attributes

    String to use as attributes for <tr>.

    -z <td>-attributes

    String to use as attributes for <td>.

     

    相关链接

    ab 是 Apache 的一个安装组件,所以需要下载 Apache 安装后才能使用,可以访问 Apache 的项目主页来下载 http://httpd.apache.org/download.cgi

    ab 的更多信息可以参加 Apache 主页上的描述

    http://httpd.apache.org/docs/2.0/programs/ab.html

     
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jollyant/archive/2010/11/14/6008212.aspx

     

  • Windows Server 2003不同版本对内存的支持

    2011-04-11 14:46:58

     

    Windows Server 2003 Web Edition 32位元版最大能支援2G的RAM,
    Windows Server 2003 Standard Edition 32位元版最大能支援4G的RAM,
    Windows Server 2003 Enterprise Edition 32位元版最大能支援32G的RAM,
    Windows Server 2003 Datacenter Edition 32位元版最大能支援512G的RAM,
    此时需要打开PAE,打开方式如下:
    找到C:\Boot.ini文件,在ARC路径中添加 /PAE
    multi(0)disk(0)rdisk(0)partition(2)\%systemroot%=”Windows Server 2003, XXXX Edition” /PAE

    XXXX为实际安装的系统版本
  • mysql中文乱码

    2011-04-08 11:43:10

    mysql_query("set names gbk;"); 
  • extjs grid 基本练习代码

    2011-04-07 18:58:37

    grid.js

    Ext.onReady(function(){
     //数据格式1:二维数组形式的数据:
     var data=[[1,'EasyJWeb','EaseJF','www.baidu.com'],
            [2,'jfox','huihoo','www.jb31.com'],
            [3,'jdon','jdon','www.test.net'],
            [4,'springside','springside','tool.jb51.net']
       ] ;
     var store= new Ext.data.SimpleStore({data:data,fields:['id','name','organization','homepage']}) ;
     
     //数据格式2:一维数组,数组中的每一个元素是一个对象 --->  json串形式:
    // var data=[{id:1,
    //    name:'EasyJWeb',
    //    organization:'EasyJF',
    //    homepage:'www.baidu.com'},
    //   {id:2,
    //    name:'jfox',
    //    organization:'huihoo',
    //    homepage:'www.jb51.net'},
    //   {id:3,
    //    name:'jdon',
    //    organization:'jdon',
    //    homepage:'s.jb51.net'},
    //   {id:4,
    //    name:'springside',
    //    organization: 'springside',
    //    homepage:'tools.jb51.net'}
    //   ];
    //   var store=new Ext.data.JsonStore({data:data,fields:["id","name","organization","homepage"]});

        //数据格式3:xml格式的数据  --- xml文件为  grid1.xml
    //    var store=new Ext.data.Store({
    //  url:"hello.xml",    // 指定xml文件名
    //  reader:new Ext.data.XmlReader({
    //  record:"row"},      // 指定取数据的标签
    //  ["id","name","organization","homepage"])     // 指定标签,取值
    //  });

      //ColumnModel grid的列配置模板,替代columns配置项
     var cm = new Ext.grid.ColumnModel([{header:'项目名称',dataIndex:'name',sortable:true},
         {header:'开发团队',dataIndex:'organization',sortable:true},
         {header:'网址',dataIndex:'homepage'}]) ;
        
     //  GridPanel 创建表格  
     var grid = new Ext.grid.GridPanel({
      renderTo:'grid1',
      title:'中国java开源产品团队',
      height:150,
      width:600,
    //  columns:[{header:'项目名称',dataIndex:'name',sortable:true},
    //     {header:'开发团队',dataIndex:'organization'},
    //     {header:'网址',dataIndex:'homepage'}],
      // columns(列的定义数组)配置项被替换为cm(ColumnModel)配置项,来配置列的定义
      cm:cm,
      store:store,
      autoExpandColumn:2
     
     });
     
     
     
     
     //store.load();  是用来加载数据

     
     
     
     
    });

     

     

    <body> <div id="grid1"></div>  </body>

     

    D:\myeclipseworkspace\extjsTest\WebRoot\example\grid1.html

    参考文档:

    http://www.jb51.net/article/23625.htm

    参考资料附件: grid.rar(629 KB)

     

     

  • java中产生随机汉字(推荐)

    2011-04-01 18:53:32

     

    4e00-9fa5编码范围,这个范围里应该都是中文。。。

     

    引用楼主 hyb2008dxy 的帖子:
    java中如何产生一个随机的汉字,不用预存在数组的方式来做的话,有没有其他方法?

    答:参考代码如下:

    Java code
    //在0x4e00---0x9fa5之间产生一个随机的字符 public static char getRandomChar() { return (char)(0x4e00+(int)(Math.random()*(0x9fa5-0x4e00+1))); }

     

     

     

    方法二:

    给LZ写了一个,不晓得要得不?
    import java.util.Date;
    import java.util.Random;

    public class Chinese {
    public String getChinese(long seed) throws Exception {
    String str = null;
    int highPos, lowPos;
    seed = new Date().getTime();
    Random random = new Random(seed);
    highPos = (176 + Math.abs(random.nextInt(39)));
    lowPos = 161 + Math.abs(random.nextInt(93));
    byte[] b = new byte[2];
    b[0] = (new Integer(highPos)).byteValue();
    b[1] = (new Integer(lowPos)).byteValue();
    str = new String(b, "GB2312");
    return str;
    }

    public static String get300Chinese() throws Exception {
    Chinese ch = new Chinese();
    String str = "";
    for (int i = 300; i > 0; i--) {
    str = str + ch.getChinese(i);

    }
    System.out.println(str);
    return str;
    }

    public static void main(String[] args) throws Exception {

    get300Chinese();
    }
    }

     

    方法三:

    Java code
    public class Test1 { public static void main(String[] args) { RandomHan han = new RandomHan(); System.out.println(han.getRandomHan()); } } class RandomHan { private Random ran = new Random(); private final static int delta = 0x9fa5 - 0x4e00 + 1; public char getRandomHan() { return (char)(0x4e00 + ran.nextInt(delta)); } }

     

    方法四:

    import java.util.Date;
    import java.util.Random;

    public class Chinese {
    public String getChinese(long seed) throws Exception {
    String str = null;
    int highPos, lowPos;
    seed = new Date().getTime();
    Random random = new Random(seed);
    highPos = (176 + Math.abs(random.nextInt(39)));
    lowPos = 161 + Math.abs(random.nextInt(93));
    byte[] b = new byte[2];
    b[0] = (new Integer(highPos)).byteValue();
    b[1] = (new Integer(lowPos)).byteValue();
    str = new String(b, "GB2312");
    return str;
    }

    public static String get300Chinese() throws Exception {
    Chinese ch = new Chinese();
    String str = "";
    for (int i = 300; i > 0; i--) {
    str = str + ch.getChinese(i);

    }
    System.out.println(str);
    return str;
    }

    public static void main(String[] args) throws Exception {

    get300Chinese();
    }
    }

     

     

     

     

     

    转自: http://topic.csdn.net/u/20080507/14/09d90a22-7f46-44ba-9484-d5ca3d3093a4.html

     

    java 随机字母输出到txt文档
    2007年03月15日 星期四 16:36

    import java.io.FileWriter;

    public class create {

    public static void main(String[] args) {
       char s;
       char k[] = new char[1000];
       double m;
       try{
        for(int i=0;i<1000;i++){
         m = Math.random()*26+97;
         s = (char)m;
         System.out.print(s);
         k[i] = s;
        }
        FileWriter FW = new FileWriter("c:/123.txt");
        FW.write(k);
        FW.close();
       }
       catch(Exception e){
       }
    }
    }

     

     

     

     

     

     

     

     

     

     

     

Open Toolbar