一、groovy是什么

简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中。

作为跑在JVM中的另一种语言,groovy语法与 Java 语言的语法很相似。同时,Groovy 抛弃了java烦琐的文法。同样的语句,使用groovy能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音。

二、开发环境

1、  jdk 1.5以上

2、  eclipse+groovy plugin(支持Groovy 1.5.7)

打开eclipse,通过Software Updates > Find and Install...菜单,使用“Search for new features to install” 下载并安装groovy插件。New一个远程站点,url可使用http://dist.codehaus.org/groovy/distributions/update/,插件名:Groovy plug-in。根据需要你可以同时选择groovy和grails(后续会学习到):

三、创建groovy项目
1、新建一个groovy项目
File--> New Project..创建一个java项目。为了方便管理,建议在source中建两个source文件夹java和groovy,
分别用于存储java源文件和groovy源文件:
2、添加 Groovy 特性
在项目上右击,Groovy  Add Groovy Nature,这样会在项目中添加 Groovy Libraries。
3、添加 Groovy 类
在项目groovy源文件下右键,New  Other Groovy Groovy Class

自动生成的源代码如下:
public class HelloWorld{
    public static void main(def args){
       // TODO Auto-generated method stub
    } 
}
我们在main方法中加一句打印语句:
println "Hello World"

4、编译运行groovy类
在源文件上右键,Compile Groovy File,然后右键,Run As à Groovy ,在控制台中查看运行结果。
实际上 groovy 语法的简练还体现在,就算整个文件中只有println "Hello World"这一句代码(把除这一句以外的语句删除掉吧),程序也照样能够运行。
当然,为了说明groovy 其实就是java,你也可以完全按照java 语法来编写HelloWorld类。

四、Groovy语法简介
1、没有类型的java
作为动态语言,groovy中所有的变量都是对象(类似于.net framework,所有对象继承自java.lang.Object),在声明一个变量时,groovy不要求强制类型声明,仅仅要求变量名前使用关键字def(从groovy jsr 1开始,在以前的版本中,甚至连def都不需要)。
修改main 方法中的代码:
def var="hello world"
println var
println var.class
你可以看到程序最后输出了var的实际类型为:java.lang.String
作为例外,方法参数和循环变量的声明不需要def。

2、  不需要的public

你可以把main方法前面的public去掉,实际上,groovy中默认的修饰符就是public,所以public修饰符你根本就不需要写,这点跟java不一样。

3、  不需要的语句结束符

Groovy中没有语句结束符,当然为了与java保持一致性,你也可以使用;号作为语句结束符。在前面的每一句代码后面加上;号结束,程序同样正常运行(为了接受java程序员的顽固习惯)。

4、  字符串连接符

跟java一样,如果你需要把一个字符串写在多行里,可以使用+号连接字符串。代码可以这样写:

def var="hello "+

"world"+

",groovy!"

当然更groovy的写法是:

def var="""hello

world

groovy!"""

三个”号之间不在需要+号进行连接(不过字符串中的格式符都会被保留,包括回车和tab)。

5、一切皆对象

听起来象是“众生平等”的味道,事实上groovy对于对象是什么类型并不关心,一个变量的类型在运行中随时可以改变,一切根据需要而定。如果你赋给它boolean ,那么不管它原来是什么类型,它接受boolean值之后就会自动把类型转变为boolean值。看下面的代码:

def var="hello "+

"world"+

",groovy!"

println var;

println var.class;

var=1001

println var.class

输出结果:

hello world,groovy!

class java.lang.String

class java.lang.Integer

 

var这个变量在程序运行中,类型在改变。一开始给它赋值String,它的类型就是String,后面给它赋值Integer,它又转变为Integer。

6、循环

删除整个源文件内容,用以下代码替代:

def var="hello "+

"world"+

",groovy!"

def repeat(val){

for(i = 0; i < 5; i++){

println val

}

}

repeat(var)

输出:

hello world,groovy!

hello world,groovy!

hello world,groovy!

hello world,groovy!

hello world,groovy!

注意循环变量i前面没有def。当然也没有java中常见的int,但如果你非要加上int也不会有错,因为从Groovy1.1beta2之后开始(不包括1.1beta2),groovy开始支持java经典的for循环写法。

此外,上面的for语句还可以写成:

for(i in 0..5)

这样的结果是一样的。

7、String 和 Gstring

除了标准的java.lang.String以外(用’号括住),groovy还支持Gstring字符串类型(用“号括住)。把上面的for循环中的语句改成:

println "This is ${i}:${val}"

运行一下,你就会明白什么是Gstring。

def name="Tom"
println "Myname is ${"John"+name}"

输出:

Myname is JohnTom

def name="Tom"
println "Myname is ${"Tom"==name}"

输出:

Myname is true

8、范围

这个跟pascal中的“子界”是一样的。在前面的for循环介绍中我们已经使用过的for(i in 0..5)这样的用法,其中的0..5就是一个范围。

范围 是一系列的值。例如 “0..4” 表明包含 整数 0、1、2、3、4。Groovy 还支持排除范围,“0..<4” 表示 0、1、2、3。还可以创建字符范围:“a..e” 相当于 a、b、c、d、e。“a..<e” 包括小于 e 的所有值。

范围主要在for循环中使用。

9、默认参数值

可以为方法指定默认参数值。我们修改repeat方法的定义:

def repeat(val,repeat=3){

for(i in 0..<repeat){

println "This is ${i}:${val}"

}

}

可以看到,repeat方法增加了一个参数repeat(并且给了一个默认值3),用于指定循环次数。

当我们不指定第2个参数调用repeat方法时,repeat参数取默认值3。

10、集合
Groovy支持最常见的两个java集合:java.util.Collection和java.util.Map。
前面所说的范围实际也是集合的一种(java.util.List)。
(1)Collection

d={println "Size:${it.size}.Last Element:${it[-1]},Last Second Element:${it[-2]}"}
c=["idx0","idx1","idx2"]
d c
//使用add往集合中添加元素
c.add(1)
println c
d c
//使用<<往集合中添加元素
c<<"come on"
println c
d c println c
//使用+往集合中添加元素
c=c+5
println c
d c
//在集合中减去元素idx1
c=c-'idx1'
println c
//把集合中的前3个元素去掉
c=c-c[0..2]
println c

Output:

groovy> d={println "Size:${it.size}.Last Element:${it[-1]},Last Second Element:${it[-2]}"}
groovy> c=["idx0","idx1","idx2"]
groovy> d c
groovy> //使用add往集合中添加元素
groovy> c.add(1)
groovy> println c
groovy> d c
groovy> //使用<<往集合中添加元素
groovy> c<<"come on"
groovy> println c
groovy> d c
groovy> println c
groovy> //使用+往集合中添加元素
groovy> c=c+5
groovy> println c
groovy> d c
groovy> //在集合中减去元素idx1
groovy> c=c-'idx1'
groovy> println c
groovy> //把集合中的前3个元素去掉
groovy> c=c-c[0..2]
groovy> println c Size:3.Last Element:idx2,Last Second Element:idx1
[idx0, idx1, idx2, 1]
Size:4.Last Element:1,Last Second Element:idx2
[idx0, idx1, idx2, 1, come on]
Size:5.Last Element:come on,Last Second Element:1
[idx0, idx1, idx2, 1, come on]
[idx0, idx1, idx2, 1, come on, 5]
Size:6.Last Element:5,Last Second Element:come on
[idx0, idx2, 1, come on, 5]
[come on, 5]

(2) Map

Map是“键-值”对的集合,在groovy中,键不一定是String,可以是任何对象(实际上Groovy中的Map就是java.util.LinkedHashMap)。

如此可以定义一个Map:

def map=['name':'john','age':14,'sex':'boy']

添加项:

map=map+['weight':25]       //添加john的体重

map.put('length',1.27)      //添加john的身高

map.father='Keller'         //添加john的父亲

可以用两种方式检索值:

println map['father']       //通过key作为下标索引

println map.length          //通过key作为成员名索引

11、闭包(Closure)
闭包是Groovy中非常重要的一个数据类型或者说一种概念。
闭包是一种数据类型,它代表了一段可执行的代码。

简而言之,Closure的定义格式是:
(1)有参数:
def 闭包名={

parameters->code

}
(2)无参数(不需要->符号)
def 闭包名={code}
如果闭包没有定义参数的话,则隐含有一个参数,这个参数名字叫it,和this的作用类似。it代表闭包的参数
def 闭包名={
it->code
}
某种意义上,从C/C++语言的角度看,闭包和函数指针很像。闭包定义好后,要调用它的方法就是:
(1)闭包名.call(参数)
(2)闭包名(参数)

闭包是用{符号括起来的代码块,它可以被单独运行或调用,也可以被命名。类似‘匿名类’或内联函数的概念。

闭包中最常见的应用是对集合进行迭代,下面定义了3个闭包对map进行了迭代:

map.each({key,value->    //key,value两个参数用于接受每个元素的键/值

println "$key:$value"})

map.each{println it}     //it是一个关键字,代表map集合的每个元素

map.each({ println it.getKey()+"-->"+it.getValue()})

除了用于迭代之外,闭包也可以单独定义:

def say={word->
         println "Hi,$word!"
 }

调用:

say('groovy')
say.call('groovy&grails')

输出:

Hi,groovy!

Hi,groovy&grails!

看起来,闭包类似于方法,需要定义参数和要执行的语句,它也可以通过名称被调用。然而闭包对象(不要奇怪,闭包也是对象)可以作为参数传递(比如前面的闭包作为参数传递给了map的each方法)。而在java中,要做到这一点并不容易(也许C++中的函数指针可以,但不要忘记java中没有指针)。其次,闭包也可以不命名(当然作为代价,只能在定义闭包时执行一次),而方法不可以。

12、类
Groovy类和java类一样,你完全可以用标准java bean的语法定义一个groovy 类。
但作为另一种语言,我们可以使用更groovy的方式定义和使用类,这样的好处是,你可以少写一半以上的javabean代码:
(1)不需要public修饰符
如前面所言,groovy的默认访问修饰符就是public,如果你的groovy类成员需要public修饰,则你根本不用写它。
(2)不需要类型说明
同样前面也说过,groovy也不关心变量和方法参数的具体类型。
(3)不需要getter/setter方法
不要奇怪,在很多ide(如eclipse)早就可以为序员自动产生getter/setter方法了。在groovy中,则彻底不需要getter/setter方法——所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果你一定要通过get/set方法访问成员属性,groovy也提供了它们)。
(4)不需要构造函数
不在需要程序员声明任何构造函数,因为groovy自动提供了足够你使用的构造函数。不用担心构造函数不够多,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数—由于是map类型,通过这个参数你可以在构造对象时任意初始化它的成员变量)。
(5)不需要return
Groovy中,方法不需要return来返回值吗?这个似乎很难理解。看后面的代码吧。
因此,groovy风格的类是这样的:
(6)不需要()号
Groovy中方法调用可以省略()号(构造函数除外),也就是说下面两句是等同的:
person1.setName 'kk'person1.setName('kk')
下面看一个完整类定义的例子:

class Person {

def name

def age

String toString(){//注意方法的类型String,因为我们要覆盖的方法为String类型

"$name,$age"

}

如果你使用javabean风格来做同样的事,起码代码量要增加1倍以上。

我们可以使用默认构造方法实例化Person类:

def person1=new Person()

person1.name='kk'

person1.age=20

println person1

也可以用groovy的风格做同样的事:

def person2=new Person(['name':'gg','age':22]) //[]号可以省略

println person2

这样需要注意我们覆盖了Object的toString方法,因为我们想通过println person1这样的方法简单地打印对象的属性值。
然而toString 方法中并没有return 一个String,但不用担心,Groovy 默认返回方法的最后一行的值。
13、?运算符
在java中,有时候为了避免出现空指针异常,我们通常需要这样的技巧:
if(rs!=null){
       rs.next()
       … …
}

在groovy中,可以使用?操作符达到同样的目的:

rs?.next()

?在这里是一个条件运算符,如果?前面的对象非null,执行后面的方法,否则什么也不做。

14、可变参数

等同于java 5中的变长参数。首先我们定义一个变长参数的方法sum:

int sum(int... var) {

def total = 0

for (i in var)

total += i

return total

}

我们可以在调用sum时使用任意个数的参数(1个,2个,3个……):

println sum(1)

println sum(1,2)

println sum(1,2,3)

15、枚举

定义一个enum:

enum Day {

SUNDAY, MONDAY, TUESDAY, WEDNESDAY,

THURSDAY, FRIDAY, SATURDAY

}

然后我们在switch语句中使用他:

def today = Day.SATURDAY

switch (today) {

//Saturday or Sunday

case [Day.SATURDAY, Day.SUNDAY]:

println "Weekends are cool"

break

//a day between Monday and Friday

case Day.MONDAY..Day.FRIDAY:

println "Boring work day"

break

default:

println "Are you sure this is a valid day?"

}

注意,switch和case中可以使用任何对象,尤其是可以在case中使用List和范围,从而使分支满足多个条件(这点跟delphi有点象)。

同java5一样,groovy支持带构造器、属性和方法的enum:

enum Planet {

MERCURY(3.303e+23, 2.4397e6),

VENUS(4.869e+24, 6.0518e6),

EARTH(5.976e+24, 6.37814e6),

MARS(6.421e+23, 3.3972e6),

JUPITER(1.9e+27,7.1492e7),

SATURN(5.688e+26, 6.0268e7),

URANUS(8.686e+25, 2.5559e7),

NEPTUNE(1.024e+26, 2.4746e7)

double mass

double radius

Planet(double mass, double radius) {

this.mass = mass;

this.radius = radius;

}

void printMe() {

println "${name()} has a mass of ${mass} " +

"and a radius of ${radius}"

}

}

Planet.EARTH.printMe()

16、Elvis操作符

这是三目运算符“?:”的简单形式,三目运算符通常以这种形式出现:

String displayName = name != null ? name : "Unknown";

在groovy中,也可以简化为(因为null在groovy中可以转化为布尔值false):

String displayName = name ? name : "Unknown";

基于“不重复”的原则,可以使用elvis操作符再次简化为:

String displayName = name ?: "Unknown"

17、动态性

Groovy所有的对象都有一个元类metaClass,我们可以通过metaClass属性访问该元类。通过元类,可以为这个对象增加方法(在java中不可想象)!见下面的代码,msg是一个String,通过元类,我们为msg增加了一个String 类中所没有的方法up:

def msg = "Hello!"

println msg.metaClass

String.metaClass.up = {  delegate.toUpperCase() }

println msg.up()

通过元类,我们还可以检索对象所拥有的方法和属性(就象反射):

msg.metaClass.methods.each { println it.name }

msg.metaClass.properties.each { println it.name }

甚至我们可以看到我们刚才添加的up方法。

我们可以通过元类判断有没有一个叫up的方法,然后再调用它:

if (msg.metaClass.respondsTo(msg, 'up')) {

println msg.toUpperCase()

}

当然,也可以推断它有没有一个叫bytes的属性:

if (msg.metaClass.hasProperty(msg, 'bytes')) {

println msg.bytes.encodeBase64()

}

18、Groovy swing

到现在为止,我们的groovy一直都在控制台窗口下工作。如果你还不满足,当然也可以使用swingbuilder来构建程序:

import groovy.swing.SwingBuilder

import java.awt.BorderLayout

import groovy.swing.SwingBuilder

import java.awt.BorderLayout as BL

def swing = new SwingBuilder()

count = 0

def textlabel

def frame = swing.frame(title:'Frame', size:[300,300]) {

borderLayout()

textlabel = label(text:"Clicked ${count} time(s).",

constraints: BL.NORTH)

button(text:'Click Me',

actionPerformed: {count++; textlabel.text =

"Clicked ${count} time(s)."; println "clicked"},

constraints:BorderLayout.SOUTH)

}

frame.pack()

frame.show()

怎么样?是不是跟java 中写swing程序很象?

五、单元测试

1、添加junit
使用 Build Path-->Libraries-->Add Library-->JUnit 把junit添加到项目中。
2、新建测试 使用 New a Junit Test Case
新建测试例程: PersonTest,
在Class under test右边的Browser按钮,选择要进行测试的groovy类Person。
下面编写测试用例代码(我使用了Junit4):

import org.junit.*;
public class TestPerson {       
@Test       
public void testToString(){              
            Person p=new Person(); //注意因为groovy编译Person时默认所有属性为private              
            p.setName("ddd");       //所以用set方法设置name属性而不用p.name=”ddd”              
            p.setAge(18);              
            Assert.assertEquals("ddd-18", p.toString());       
      }
}
运行Run As-->Junit Test,发现testToString通过测试。

3、使用groovy书写测试用例
除了使用Java来书写测试用例以外,我们也可以使用groovy书写。
写一个类GroovyTestPerson:
import org.junit.*;
class GroovyTestPerson {
    @Test
     void testToString(){
       Person p=new Person("name":"ddd","age":18)
       Assert.assertEquals("ddd-18", p.toString())
    }
}

可以看到,这里使用的完全是Groovy风格的书写方式:不需要public,使用map参数构造对象。然而当你Run AsàJunit Test的时候,结果跟用java编写的测试用例没有什么两样。

这也充分说明了,groovy和java,除了语法不一样,本质上没有什么区别(对比.net framework中的C#和VB.net,它们除了语法不同外,本质上它们都使用CLR)。

http://blog.csdn.net/kmyhy/article/details/4200563

collect和each的区别:

c=[,,,,,]

println c.collect {print " ${it*it} "}
println c.collect {"result:${it*it}"}
println "================="
println c.each {print " ${it*it} " } p={k,v->println k+"="+v}
c=["r":"red","b":"blue","y":"yellow"]
e=c.each(p)
println "================="
assert e==c
d=c.collect p
println "================="
assert d==[null,null,null]
assert d==[null,null,"g"]

Output:

groovy> c=[,,,,,]
groovy> println c.collect {print " ${it*it} "}
groovy> println c.collect {"result:${it*it}"}
groovy> println "================="
groovy> println c.each {print " ${it*it} " }
groovy> p={k,v->println k+"="+v}
groovy> c=["r":"red","b":"blue","y":"yellow"]
groovy> e=c.each(p)
groovy> println "================="
groovy> assert e==c
groovy> d=c.collect p
groovy> println "================="
groovy> assert d==[null,null,null]
groovy> assert d==[null,null,"g"] [null, null, null, null, null, null]
[result:, result:, result:, result:, result:, result:]
=================
[, , , , , ]
r=red
b=blue
y=yellow
=================
r=red
b=blue
y=yellow
=================
Exception thrown Assertion failed: assert d==[null,null,"g"]
||
|false
[null, null, null] at ConsoleScript1.run(ConsoleScript1:)
class Main {

    static void main(def args) {

        /**
* NPE operator ?.
*/
def people = [null, new Person(name: "Gweneth")]
for (Person person : people) {
println "Valid person:${person?.name}"
} /**
* ==,equals,is
*/
Integer x = new Integer(2)
Integer y = new Integer(2)
Integer z = null
if (x == y)
println "x==y:${x == y}"
if (!x.is(y))
println("x is not y:${x.is(y)}")
if (z.is(null))
println "z is null:${z.is(null)}"
if (z == null)
println "z is null:${z == null}" /**
* Process List Construct
*/
def jvmLanguages = ["Java", "Groovy", "Scala", "Clojure"]
println "Output List:$jvmLanguages"
println "Output index 0:${jvmLanguages[0]}"
println(jvmLanguages.size())
println "Output list with range:${jvmLanguages[0..2]}"
println "Output list with -1 index:${jvmLanguages[-1]}"
jvmLanguages = []
println(jvmLanguages) /**
* Process map construct
*/
def languageRatings = [Java: 100, Groovy: 99, Clojure: "N/A"]
println "Output map construct with key:${languageRatings["Java"]}"
println "Output with .:${languageRatings.Clojure}"
languageRatings["Clojure"] = 75
println "Output new value:${languageRatings["Clojure"]}"
languageRatings.Java = "100Java"
println "Output new value:${languageRatings["Java"]}"
languageRatings = [:]
println languageRatings /**
* For Number process
*/
println 3 + 0.2 /**
* Process xml
*/
def writer = new StringWriter();
def xml = new groovy.xml.MarkupBuilder(writer);
xml.person(id: 2) {
name 'Gweneth'
age 1
}
println writer.toString() /**
* for Hello
*/
println "Hello!" /**
* lamba
*/
def sayHello = {
name ->
if (name == "Tom")
println "Hello author:$name"
else
println "Hello reader:$name"
}
println "Lamba:${sayHello("Tom")}"
println "Lamba:${sayHello("Jack")}" /**
* Lamba used by Collection
*/
def movieTitles=["Seven","SnowWhite","Die Hard"]
movieTitles.each {movieTitle->println movieTitle}
movieTitles.each {movieTitle->println "Seven"==movieTitle }
movieTitles.each {movieTitle->println "Result:${"Seven"==movieTitle}" } movieTitles.each {println it }
movieTitles.each {println "Seven"==it }
movieTitles.each {println "Result:${"Seven"==it}" } /**
* regex
*/ def pattern=/1010/
def input="1010"
def matcher=input=~pattern
if (input==~pattern){
input=matcher.replaceFirst("0101")
println input
} ("Hazel 1"=~/(\w+) (\d+)/).each {full,name,age->println "$name is $age years old"} }
} class Person{
def name;
}

Output:

Valid person:null
Valid person:Gweneth
x==y:true
x is not y:false
z is null:true
z is null:true
Output List:[Java, Groovy, Scala, Clojure]
Output index 0:Java
4
Output list with range:[Java, Groovy, Scala]
Output list with -1 index:Clojure
[]
Output map construct with key:100
Output with .:N/A
Output new value:75
Output new value:100Java
[:]
3.2
<person id='2'>
<name>Gweneth</name>
<age>1</age>
</person>
Hello!
Hello author:Tom
Lamba:null
Hello reader:Jack
Lamba:null
Seven
SnowWhite
Die Hard
true
false
false
Result:true
Result:false
Result:false
Seven
SnowWhite
Die Hard
true
false
false
Result:true
Result:false
Result:false
0101
Hazel is 1 years old
xml_content=
"""
<langs type="current">
<language>Java</language>
<language>Groovy</language>
<language>JavaScript</language>
</langs>
"""
xml=new XmlParser().parseText(xml_content)
xml.language.eachWithIndex {
it,idx->
println "$idx: ${it.text()}"
}

Output:

groovy> xml_content=
groovy> """
groovy> <langs type="current">
groovy> <language>Java</language>
groovy> <language>Groovy</language>
groovy> <language>JavaScript</language>
groovy> </langs>
groovy> """
groovy> xml=new XmlParser().parseText(xml_content)
groovy> xml.language.eachWithIndex {
groovy> it,idx->
groovy> println "$idx: ${it.text()}"
groovy> } 0: Java
1: Groovy
2: JavaScript
Result: [language[attributes={}; value=[Java]], language[attributes={}; value=[Groovy]], language[attributes={}; value=[JavaScript]]]

http://kldn.iteye.com/blog/1279540

Groovy常见语法汇总的更多相关文章

  1. Groovy常用语法汇总

    基本语法 1.Grovvy的注释分为//和/**/和java的一样. 2.Grovvy语法可以不已分号结尾. 3.单引号,里面的内容严格的对应java中的String,不对$符号进行转义. def s ...

  2. ggplot常见语法汇总查询

    主图 散点图 柱状图 折线图 小提琴图 点图 进化树 圈图 Alluvial图 Sankey Diagram plot(getSankey(colData(muraro)$cell_type1, mu ...

  3. groovy常用语法及实战

    groovy语言简介 一种基于JVM的敏捷开发语言,作为编程语言可编译成java字节码,也可以作为脚本语言解释执行. 结合了Python.Ruby和Smalltalk的许多强大的特性 支持面向对象编程 ...

  4. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  5. ORACLE| ORACLE基础语法汇总

    创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库]   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  6. Go语言语法汇总(转)

    Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法   目录(?)[+]   最近看了看GoLang,把Go语言的语法 ...

  7. 李洪强iOS开发之OC常见错误汇总

    // //  main.m //  16 - 常见错误汇总 // //  Created by vic fan on 16/7/13. //  Copyright © 2016年 李洪强. All r ...

  8. freemarker(FTL)常见语法大全

    [转载]freemarker(FTL)常见语法大全 FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}  ${boo ...

  9. PHP. 01. C/S架构、B/S架构、服务器类型、服务器软件、HTTP协议/服务器、数据库、服务器web开发、PHP简介/常见语法、PHPheader()、 PHP_POST/GET数据获取和错误处理

    C/S架构 Client/Server 指客户端,服务器 架构的意思 优点:性能性高:可将一部分的计算工作放在客户端上,服务器只需处理出局即可   洁面炫酷,可使用更多系统提供的效果 缺点:更新软件需 ...

随机推荐

  1. 深入浅出OpenStack云计算平台管理(nova-compute/network)

    一.本课程是怎么样的一门课程(全面介绍)          1.1. 课程的背景           OpenStack是 一个由Rackspace发起.全球开发者共同参与的开源项目,旨在打造易于部署 ...

  2. uvc摄像头代码解析7

    13.uvc视频初始化 13.1 uvc数据流控制 struct uvc_streaming_control { __u16 bmHint; __u8 bFormatIndex; //视频格式索引 _ ...

  3. C# LDAP认证登录

    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据需要定制.与X ...

  4. javascript中apply和eval结合的强大用法

        eval是一个函数,可以接受一个参数,这个参数可以作为js语句被解释性的执行,利用这个特性,eval和apply结合起来,可以大大简化代码  如下例子 <a class="cl ...

  5. 谈谈Ext JS的组件——布局的用法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回忆到了使用Foxpro开发的时候,哪时候的界面布局就是这样.通过设置控件的左上角坐标(x.y)和宽度来进行的,由于 ...

  6. 插件 - 提示窗体(ArtDialog)

    效果: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  7. TControlStyle.csParentBackground的作用(附Delphi里的所有例子,待续)

    Only applicable when Themes are enabled in applications on Windows XP. Causes the parent to draw its ...

  8. “聊天剽窃手”--ptrace进程注入型病毒

    近日,百度安全实验室发现了一款"聊天剽窃手"病毒.该病毒可以通过ptrace方式注入恶意代码至QQ.微信程序进程.恶意代码可以实时监控手机QQ.微信的聊天内容及联系人信息. 该病毒 ...

  9. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  10. Zxing中文乱码解决方法

    Zxing中文乱码解决方法总结 尝试过非常多方法  最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的測试  除开一张图之外  其余都能扫描出结果 假设大家有更好的解决方法 ...