ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久久久久久久下田,天堂电影在线,国产精品三级在线http://www.aygfsteel.com/carob/category/534.html…â€?…â€?所å­?所å†?所æƒ?所å?所悟…â€?…â€?zh-cnWed, 28 Feb 2007 20:13:55 GMTWed, 28 Feb 2007 20:13:55 GMT60Groovlets http://www.aygfsteel.com/carob/archive/2005/02/28/1564.htmlcarobcarobMon, 28 Feb 2005 03:18:00 GMThttp://www.aygfsteel.com/carob/archive/2005/02/28/1564.htmlhttp://www.aygfsteel.com/carob/comments/1564.htmlhttp://www.aygfsteel.com/carob/archive/2005/02/28/1564.html#Feedback0http://www.aygfsteel.com/carob/comments/commentRss/1564.htmlhttp://www.aygfsteel.com/carob/services/trackbacks/1564.html你能在Groovy里面写普通的Java Servletã€?BR>存在一ä¸?STRONG>GroovyServletåQŒè‡ªåŠ¨ç¼–è¯?groovyæ–‡äšgåQŒè{变成字节码,装蝲¾c»ï¼Œòq¶ç¼“存它们,直到修改了源文äšgã€?BR>˜q™å„¿æœ‰ä¸€ä¸ªç®€å•的例子来向你说明这事:
(注意讉K—®session,output,request的隐式变量的用法)

import java.util.Date

if (session.counter == null{
  session.counter 
= 1
}


println 
"""
<html>
    
<head>
        
<title>Groovy Servlet</title>
    
</head>
    
<body>
Hello, $
{request.remoteHost}: ${session.counter}! ${new Date()}
    
</body>
</html>
"""
session.counter = session.counter + 1
或者,用MarkupBuilder完成相同的功�BR>
import java.util.Date
import groovy.xml.MarkupBuilder

if (session.counter == null{
      session.counter 
= 1
}


html.html 
{    // html is implicitly bound to new MarkupBuilder(out)
  head {
      title(
"Groovy Servlet")
  }

  body 
{
    p(
"Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}")
  }

}

session.counter 
= session.counter + 1

隐式变量

o_implicit variables.jpg

* ˜q™äº›å˜é‡åœ¨groovylet里面不能被再‹Æ¡èµ‹å€¹{€‚他们在½W¬ä¸€‹Æ¡è®¿é—®æ—¶è¢«ç»‘定,允许诸如在用"out"之前调用对象"response"的方法ã€?BR>
建立Groovylet

ž®†ä¸‹é¢æ”¾å…¥web.xmlä¸?BR>
<servlet>
<servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Groovy</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>

然后åQŒæ‰€æœ‰groovy jaræ–‡äšg攑ֈ°WEB/lib目录ä¸?只需攑օ¥groovy.jarå’Œasm.jar卛_¯)

æŠ?groovyæ–‡äšg攑օ¥æ ¹ç›®å½?放htmlæ–‡äšg的地æ–?中,groovy servletž®†ä¼šç…§ç®¡˜q™äº›.groovyæ–‡äšg

ž®Þp¿™ä¸ªä¾‹å­ä‹É用tomcat来说åQŒè¦¾~–辑tomcat/conf/server.xml åQŒç±»ä¼égºŽä¸‹é¢˜q™æ ·

<Context path="/groovy" docBase="c:/groovy-servlet"/>




carob 2005-02-28 11:18 发表评论
]]>
GSQLhttp://www.aygfsteel.com/carob/archive/2005/02/28/1565.htmlcarobcarobMon, 28 Feb 2005 02:26:00 GMThttp://www.aygfsteel.com/carob/archive/2005/02/28/1565.htmlhttp://www.aygfsteel.com/carob/comments/1565.htmlhttp://www.aygfsteel.com/carob/archive/2005/02/28/1565.html#Feedback0http://www.aygfsteel.com/carob/comments/commentRss/1565.htmlhttp://www.aygfsteel.com/carob/services/trackbacks/1565.html举例åQ?BR>
/**
 * Test to verify valid construction of default DDL
 * 
 * @author <a href="mailto:jeremy.rayner@bigfoot.com">Jeremy Rayner</a>
 * @version $Revision: 1.2 $
 
*/

package org.javanicus.gsql

import java.io.
*

class SqlGeneratorTest extends GroovyTestCase {
    property database
    property sqlGenerator
              
    
void setUp() {
        typeMap 
= new TypeMap()          
        build 
= new RelationalBuilder(typeMap)
        sqlGenerator 
= new SqlGenerator(typeMap,System.getProperty( "line.separator""\n" ))
                  
        database 
= build.database(name:'genealogy'{
          table(name:
'event'{
              column(name:
'event_id', type:'integer', size:10, primaryKey:true, required:true)
              column(name:
'description', type:'varchar', size:30)          
          }

          table(name:
'individual'{
            column(name:
'individual_id', type:'integer', size:10, required:true, primaryKey:true, autoIncrement:true)
            column(name:
'surname', type:'varchar', size:15, required:true)
            column(name:
'event_id', type:'integer', size:10)
            foreignKey(foreignTable:
'event'{
                reference(local:
'event_id',foreign:'event_id')
            }

            index(name:
'surname_index'{
                indexColumn(name:
'surname')
            }

          }

        }

    }

    
    
void testGenerateDDL() {
        testWriter 
= new PrintWriter(new FileOutputStream("SqlGeneratorTest.sql"))
        sqlGenerator.writer 
= testWriter
        sqlGenerator.createDatabase(database,
true)
        testWriter.flush()
   }


}


carob 2005-02-28 10:26 发表评论
]]>
COM Scriptinghttp://www.aygfsteel.com/carob/archive/2005/02/24/1566.htmlcarobcarobThu, 24 Feb 2005 09:53:00 GMThttp://www.aygfsteel.com/carob/archive/2005/02/24/1566.htmlhttp://www.aygfsteel.com/carob/comments/1566.htmlhttp://www.aygfsteel.com/carob/archive/2005/02/24/1566.html#Feedback0http://www.aygfsteel.com/carob/comments/commentRss/1566.htmlhttp://www.aygfsteel.com/carob/services/trackbacks/1566.htmlIntroduction

Scriptom是由Guillaume     Laforge开发的一个可选Groovy模块。一旦在的Groovy环境中安装上åQŒä½ ž®Þpƒ½å¤Ÿåœ¨Groovyä¸­åº”ç”¨ä¸€ä¸ªåŒ…è£…å™¨æ¥äØ“ä»ÖM½•ActiveX或者COM¾l„äšg写脚本。当然了åQŒè¿™ä¸ªæ¨¡å—只能在Windows下用ã€?/P>

Installation

安装Scripttom的最½Ž€å•方式是ž®†è¿™ä¸ªZIP包解压到你的GROOVY_HOME目录下ã€?BR>˜q™ä¸ªåŒ…内含了jacob.jar、jacob.dllå’Œscriptom.jar.  DLLæ–‡äšg要放在bin目录下,亦或是你的java.libray.path下,以备jacob.jar调用装蝲ã€?/P>

Building from sources

如果你èƒöå¤Ÿå‹‡æ•¢åÆˆå€‘Ö‘于从CVS Head中获取最新版本,那么你可以从源代码构建。检å‡?/scriptom 模块òq¶ç”¨Maven自动完成安装ã€?/P>

如果你的GROOVY_HOME正指向你的groovy-core的源代码安装目录åQŒä»…键入åQ?/P>

maven

另外åQŒè‹¥å·²å°†Groovy安装在了一个不同的目录åQŒä½ æœ‰ä¸¤¿Ué€‰æ‹©åQŒåœ¨æ–‡äšgproject.properties里将属性groovy.install.staging.dest指向你的GROOVY_HOME目录åQŒåƈ˜qè¡ŒMavenåQŒæˆ–者键入:

maven -Dgroovy.install.staging.dest=%GROOVY_HOME%

Usage

让我们看一下如何针对IE‹¹è§ˆå™¨å†™è„šæœ¬ã€‚é¦–å…ˆï¼Œæˆ‘ä»¬å½“ç„¶æ˜¯è¦ž®†ActiveX代理¾cÕd¼•入进来ã€?BR>然后åQŒæˆ‘们将创徏一个jacob中ActiveXComponent¾cȝš„GroovyObjectSupport包装器。现在,我们卛_°†åº”用(调用)˜q™ä¸ª¾l„äšg的属性或者是æ–ÒŽ³•ã€?/P>

import org.codehaus.groovy.scriptom.ActiveXProxy

// instanciate Internet Explorer
explorer = new ActiveXProxy("InternetExplorer.Application")

// set its properties
explorer.Visible = true
explorer.AddressBar 
= true

// navigate to a site by calling the Navigate() method
explorer.Navigate("http://glaforge.free.fr/weblog")


注意explorer.Visible˜q”回的是一个代理,如果你想获取属性的真正的å€û|¼Œä½ è¦ç”¨è¿™æ ïLš„表达式:explorer.Visible.value 或explorer.Visible.getValue().

Limitations


目前åQŒScriptom处于beta阶段åQŒæ•…你在应用ActiveX或COM¾l„äšg时可能会遇到一些bug和限åˆÓž¼Œä¸è¦çйèõUåQŒè¯·ž®†bug发表到JIRA或是邮äšg列表上ã€?/P>

½W¬ä¸€ä¸ªç‰ˆæœ¬æœ€å¤§çš„一个不­‘?å±€é™?是仍然还不能订阅你正在应用组件的事äšg。在下一个版本中åQŒæˆ‘希望能够让你能用闭包来定义自å·Þqš„事äšg捕捉。象下面˜q™æ ·åQ?BR>

import org.codehaus.groovy.scriptom.ActiveXProxy

explorer 
= new ActiveXProxy("InternetExplorer.Application")
explorer.events.OnQuit 
= { println "Quit" }
explorer.events.listen()

但是现在仍然不支持事件回调。在目前的CVS里有一个实验性的参考实现。它不能通过Groovy命ä×o执行åQŒä½†æ˜¯å¯ä»¥åœ¨Java½E‹åºé‡Œé€è¿‡GroovyShell对象来运行ã€?/P>

Samples

如果你检å‡ÞZº†Scriptom的源代码åQŒä½ ä¼šåœ¨src/script目录下发现几个例子ã€?BR>我将下面的几个小节中向你展示一些例子ã€?/P>

Scripting Internet Explorer

import org.codehaus.groovy.scriptom.ActiveXProxy

// instanciate Internet Explorer
explorer = new ActiveXProxy("InternetExplorer.Application")

// set its properties
explorer.Visible = true
explorer.AddressBar 
= true

// navigate to a site
explorer.Navigate("http://glaforge.free.fr/weblog")
Thread.sleep(
1000)
explorer.StatusText 
= "Guillaume Laforge's weblog"
Thread.sleep(
2000)

// quit Internet Explorer
explorer.Quit()

Scripting Excel

import org.codehaus.groovy.scriptom.ActiveXProxy

// create a proxy for Excel
xls = new ActiveXProxy("Excel.Application")
xls.Visible 
= true

Thread.sleep(
1000)

// get the workbooks object
workbooks = xls.Workbooks
// add a new workbook
workbook  = workbooks.Add()

// select the active sheet
sheet = workbook.ActiveSheet

// get a handle on two cells
a1 = sheet.Range('A1')
a2 
= sheet.Range('A2')

// sets a value for A1
a1.Value   = 123.456
// defines a formula in A2
a2.Formula = '=A1*2'

println 
"a1: ${a1.Value.value}"
println 
"a2: ${a2.Value.getValue()}"

// close the workbook without asking for saving the file
workbook.Close(falsenullfalse)
// quits excel
xls.Quit()

警告åQšåœ¨æˆ‘的机器(WinXP Home)åQŒä»ç„¶ä¼šæœ‰ä¸€ä¸ªExcel.exe˜q›ç¨‹åœ¨è¿è¡Œï¼Œæˆ‘对此仍无线索。:(

Mixing VBScript or JScript with Groovy

import org.codehaus.groovy.scriptom.ActiveXProxy

// invoke some VBScript from Groovy and get the results!
sc = new ActiveXProxy("ScriptControl")
sc.Language 
= "VBScript"
println sc.Eval(
"1 + 1").value

Scripting the Windows Shell object

import org.codehaus.groovy.scriptom.ActiveXProxy

// showing the current directory
cmd = new ActiveXProxy("Scripting.FileSystemObject")
println cmd.GetAbsolutePathName(
".").value

sh 
= new ActiveXProxy("Shell.Application")

// minimizing all opened windows
sh.MinimizeAll()

// opens an Explorer at the current location
sh.Explore(cmd.GetAbsolutePathName(".").value)

// choosing a folder from a native windows directory chooser
folder = sh.BrowseForFolder(0"Choose a folder"0)
println folder.Items().Item().Path.value

wshell 
= new ActiveXProxy("WScript.Shell")
// create a popup
wshell.popup("Groovy popup")

// show some key from the registry
key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\User Agent"
println wshell.RegRead(key).value

net 
= new ActiveXProxy("WScript.Network")
// prints the computer name
println net.ComputerName.value


Scripting Windows Media Player

import org.codehaus.groovy.scriptom.ActiveXProxy
import java.io.File

// create a proxy for the Shell object
sh = new ActiveXProxy("Shell.Application")

// use a Windows standard folder chooser
folder = sh.BrowseForFolder(0"Choose a folder with wav files"0)

// get the folder chosen
folderName = folder.Items().Item().Path.value
println 
"Playing Wav files from: ${folderName}"

// create a Windows Media Player (from its Class ID)
player = new ActiveXProxy("clsid:{6BF52A52-394A-11D3-B153-00C04F79FAA6}")

// for each file in the folder
new File(folderName).eachFile|file|
    
if (file.name.endsWith("wav")) {
        println file
        player.URL 
= file.absolutePath
        
// play the wav for one second
        control = player.controls.play()
        Thread.sleep(
1000)
    }

}


// close the player
player.close()

当事件回调被支持后,你就能够订阅player.statusChange事äšgåQŒä»¥ä¾¿ä½ èƒ½å¤Ÿå®Œæ•´åœ°æ’­æ”¾wavã€?/P>

Converting a Word document into HTML

˜q™ä¸ª½E‹åºž®†ä¸€ä¸ªwordæ–‡äšgä½œäØ“½W¬ä¸€ä¸ªå‚敎ͼŒòq¶ä¸”生成一个同名的HTMLæ–‡äšgåQŒåªæ˜¯æ‰©å±•名ä¸?.html"

import org.codehaus.groovy.scriptom.ActiveXProxy
import java.io.File

word 
= new ActiveXProxy("Word.Application")

word.Documents.Open(
new File(args[0]).canonicalPath)
word.ActiveDocument.SaveAs(
new File(args[0- ".doc" + ".html").canonicalPath, 8)
word.Quit()

注意里面的参æ•?8åQ?/STRONG>˜q™å°±æ˜¯è{换后的HTMLæ–‡äšg格式åQŒå…·ä½“䨓
0: wdFormatDocument (no conversion) 
1: wdFormatTemplate 
2: wdFormatText 
3: wdFormatTextLineBreaks 
4: wdFormatDOSText 
5: wdFormatDOSTextLineBreaks 
6: wdFormatRTF 
7: wdFormatUnicodeText 
8: wdFormatHTML 


]]>
Groovy Beans http://www.aygfsteel.com/carob/archive/2005/02/24/1567.htmlcarobcarobThu, 24 Feb 2005 01:49:00 GMThttp://www.aygfsteel.com/carob/archive/2005/02/24/1567.htmlhttp://www.aygfsteel.com/carob/comments/1567.htmlhttp://www.aygfsteel.com/carob/archive/2005/02/24/1567.html#Feedback0http://www.aygfsteel.com/carob/comments/commentRss/1567.htmlhttp://www.aygfsteel.com/carob/services/trackbacks/1567.htmlGroovy Beans æ˜?JavaBeans ,但是用了一¿Uæ›´ä¸ºç®€å•的语法.
    
     如下½CÞZ¾‹:

import java.util.Date

class Customer {
    
// properties
    Integer id
    String name
    Date dob
    
    
// sample code
    static void main(args) {
        customer 
= new Customer(id:1, name:"Gromit", dob:new Date())
        println(
"Hello ${customer.name}")
    }

}

¾l“æžœ:

Hello Gromit    

注意,那些properties看è“v来就象是public fields. 在Groovy里你也可以把properties  攑օ¥Bean的构造方法中.在Groovyä¸?fieldså’Œpropertieså·²ç»åˆåÆˆæ•…ä»–ä»¬ç”¨èµäh¥òq¶æ— ä¸åŒ.  å› æ­¤,上面的Groovy代码和下面的Java代码是相同的:

import java.util.Date;

public class Customer {
    
// properties
    private Integer id;
    
private String name;
    
private Date dob;
    
    
public Integer getId() {
        
return this.id;
    }

    
    
public String getName() {
        
return this.name;
    }

    
    
public Date getDob() {
        
return this.dob;
    }

    
    
public void setId(Integer id) {
        
this.id = id;
    }

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

    
    
public void setDob(Date dob) {
        
this.dob = dob;
    }

    
    
// sample code
    public static void main(String[] args) {
        Customer customer 
= new Customer();
        customer.setId(
1);
        customer.setName(
"Gromit");
        customer.setDob(
new Date());
       
        println(
"Hello " + customer.getName());
    }

}


Property和field规则    
当Groovy½E‹åºè¢«ç¼–译成字节ç ?下面的规则将被遵å¾?    
     
* 如果property是privateçš?那么ž®Þq”¨ä¸€ä¸ªJava field来表½C?    
* 如果声明了一个public或者protectedçš„property(properties¾~ºçœæ˜¯publicçš?,   那么一个public或者protectedçš„getterå’Œsetter与相应的privateçš„Java field一同被创徏出来.    
* å¦‚æžœä½ æ²¡æœ‰äØ“public或者protecedçš„properties昄¡¤ºåœ°å£°æ˜Žgetter与setter,他们一样会在字节码一¾U§è¢«è‡ªåŠ¨åˆ›å¾.    
* 如果你创å»ÞZº†ä¸€ä¸ªpublic或者protectedçš„property,那么你可以重载那些被自动创徏的方æ³? 举一个例å­?你能够创å»ÞZ¸€ä¸ªåªè¯Èš„property或者一个带有protected setter的   Â?public read-only property,如下:

class Foo {
    
// read only property
    private String name
    
public String getName() { return name }
    
    
// read only property with protected setter
    Integer amount
    
protected void setAmount(Integer amount) { this.amount = amount }
    
    
// dynamically typed property
    cheese
}



]]>
Groovy features http://www.aygfsteel.com/carob/archive/2005/02/24/1568.htmlcarobcarobThu, 24 Feb 2005 01:45:00 GMThttp://www.aygfsteel.com/carob/archive/2005/02/24/1568.htmlhttp://www.aygfsteel.com/carob/comments/1568.htmlhttp://www.aygfsteel.com/carob/archive/2005/02/24/1568.html#Feedback0http://www.aygfsteel.com/carob/comments/commentRss/1568.htmlhttp://www.aygfsteel.com/carob/services/trackbacks/1568.html* Closure support
* Native syntax for Lists and Maps
* Groovy Markup
* Groovy Path expression language
* Groovlets for implementing Servlets easily in simple Groovy scripts
* Groovy SQL for making SQL more Groovy
* Groovy Beans for simpler syntax for working with beans
* Groovy Template Engines which are pluggable, simple to use, integrate GPath and compile to bytecode
* Ant Scripting
* Regex syntax for neater scripting with regular expressions
* Operator Overloading to simplify working with datatypes Collections and Maps
* Polymorphic iteration and autoboxing
* Compiles straight to Java bytecode
* Works cleanly with all existing Java objects and libraries



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÌìµÈÏØ| Î×ÏªÏØ| ÏÌÑôÊÐ| Î÷°²ÊÐ| °Ý³ÇÏØ| Ô¶°²ÏØ| ÊÖ»ú| ÈýºÓÊÐ| ÂÐÆ½ÏØ| ÓñÊ÷ÏØ| ËïÎâÏØ| ¶«°¢ÏØ| ˳²ýÏØ| ÌÒÔ°ÊÐ| ÇìÑôÊÐ| ¿ªÔ¶ÊÐ| ÖÜ¿ÚÊÐ| ÃÏÖÝÊÐ| ÁúȪÊÐ| ÔÀÆÕºþÏØ| ɳÌïÇø| ¼àÀûÏØ| ¼ªÁÖÊ¡| ¶þÊÖ·¿| ³ÎÂõÏØ| ²ªÀûÏØ| ¹ãººÊÐ| ¼ÎÐËÊÐ| ¸ö¾ÉÊÐ| ÁèÔ´ÊÐ| µ¾³ÇÏØ| Ôª½­| ÎÌÅ£ÌØÆì| å§ÑôÏØ| ÎåָɽÊÐ| ÕżҿÚÊÐ| ÑγÇÊÐ| ¼ÃÑôÏØ| ¶«ÏçÏØ| ½¨ÑôÊÐ| ÂåÑôÊÐ|