在學習任何東西之前,最重要的是培養興趣,Groovy世界最耀眼的技術之一--Grails相信大家早已耳聞,我將通過Grails實戰系列文章向您展現Grails的迷人風采,使您感受到Grails的魅力,以至瘋狂地愛上Grails,并墜入Groovy的愛河。學Groovy,Grails與學Java一樣,在實戰之前需要搭建開發環境,您可以在 Groovy輕松入門--搭建Groovy開發環境 學習到如何搭建Groovy環境,之后我會講一下如何搭建Grails環境,然后手把手地寫個Demo程序告終,我還會抽空寫篇“Groovy輕松入門--Grails實戰之進階篇”
一,搭建Grails環境
0,下載Grails( http://dist.codehaus.org/grails/grails-bin-0.4.2.zip ,請留意朝花夕拾——Groovy & Grails中的“最新版本”提示)并解壓到自己指定位置(我的位置是D:DMY_DEVgrails)
1,設置環境變量GRAILS_HOME(注意大寫),過程與“設置環境變量GROOVY_HOME”相似。
2,將%GRAILS_HOME%bin添加到環境變量path中,過程與“將GROOVY_HOME目錄下的bin追加到環境變量path中”相似。
(如果只想進行Grails開發,可以不設GROOVY_HOME)
二,創建Grails Demo程序
0,打開“命令行”,選擇當前目錄(我的為D:Tempgrails_apps),在黑底白字的窗口中輸入“grails create-app demo”,不包括雙引號“”,在您的屏幕中可以看到類似下面的輸出結果:
D:Tempgrails_apps>grails create-app demo Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_apps Environment set to production Note: No plugin scripts found Running script D:DMY_DEVgrailsscriptsCreateApp.groovy [mkdir] Created dir: D:Tempgrails_appsdemosrc [mkdir] Created dir: D:Tempgrails_appsdemosrcjava [mkdir] Created dir: D:Tempgrails_appsdemosrcgroovy [mkdir] Created dir: D:Tempgrails_appsdemosrctest [mkdir] Created dir: D:Tempgrails_appsdemograils-app [mkdir] Created dir: D:Tempgrails_appsdemograils-appcontrollers [mkdir] Created dir: D:Tempgrails_appsdemograils-appservices [mkdir] Created dir: D:Tempgrails_appsdemograils-appdomain [mkdir] Created dir: D:Tempgrails_appsdemograils-apptaglib [mkdir] Created dir: D:Tempgrails_appsdemograils-apputils [mkdir] Created dir: D:Tempgrails_appsdemograils-appviews [mkdir] Created dir: D:Tempgrails_appsdemograils-appviewslayouts [mkdir] Created dir: D:Tempgrails_appsdemograils-appi18n [mkdir] Created dir: D:Tempgrails_appsdemograils-appconf [mkdir] Created dir: D:Tempgrails_appsdemograils-tests [mkdir] Created dir: D:Tempgrails_appsdemoscripts [mkdir] Created dir: D:Tempgrails_appsdemoweb-app [mkdir] Created dir: D:Tempgrails_appsdemoweb-appjs [mkdir] Created dir: D:Tempgrails_appsdemoweb-appcss [mkdir] Created dir: D:Tempgrails_appsdemoweb-appimages [mkdir] Created dir: D:Tempgrails_appsdemoweb-appWEB-INFclasses [mkdir] Created dir: D:Tempgrails_appsdemoweb-appMETA-INF [mkdir] Created dir: D:Tempgrails_appsdemolib [mkdir] Created dir: D:Tempgrails_appsdemospring [mkdir] Created dir: D:Tempgrails_appsdemohibernate [copy] Copying 2 files to D:Tempgrails_appsdemo [copy] Copying 2 files to D:Tempgrails_appsdemoweb-appWEB-INF [copy] Copying 1 file to D:Tempgrails_appsdemoweb-appWEB-INF [copy] Copying 1 file to D:Tempgrails_appsdemoweb-appWEB-INF [copy] Copying 5 files to D:Tempgrails_appsdemoweb-appWEB-INFtld [copy] Copying 119 files to D:Tempgrails_appsdemoweb-app [copy] Copying 1 file to D:Tempgrails_appsdemograils-appconf [copy] Copying 1 file to D:Tempgrails_appsdemograils-appconf [copy] Copying 1 file to D:Tempgrails_appsdemograils-appconf [copy] Copying 7 files to D:Tempgrails_appsdemograils-app [mkdir] Created dir: D:Tempgrails_appsdemopluginscoregrails-apptaglib [mkdir] Created dir: D:Tempgrails_appsdemopluginscoregrails-apputils [copy] Copying 7 files to D:Tempgrails_appsdemopluginscoregrails-app taglib [copy] Copying 3 files to D:Tempgrails_appsdemopluginscoregrails-app utils [copy] Copying 1 file to D:Tempgrails_appsdemospring [copy] Copying 1 file to D:Tempgrails_appsdemo [copy] Copying 1 file to D:Tempgrails_appsdemo [copy] Copying 1 file to D:Tempgrails_appsdemo Created Grails Application at D:Tempgrails_apps/demo D:Tempgrails_apps> |
通過“grails create-app”這個命令,Grails自動幫我們創建了開發所需的工程環境。其實您現在就已經擁有了一個可運行的Web應用程序,然后進入demo目錄(“cd demo”),輸入“grails run-app”,回車,啟動這個‘五臟俱全’的程序雛形,打開瀏覽器,輸入 http://localhost:8080/demo ,回車,看到了吧 :) 讓我們繼續吧,請停止這個程序(Ctrl + C)
1,進入demo目錄,在“命令行”中輸入“cd demo”,回車,然后再輸入“grails create-domain-class User”創建domain class即類似于pojo的pogo,它對應MVC中的Model,不過由Grails自動創建的pogo是空的,需要自己添加屬性,約束(constraints)等。輸出結果如下所示:
D:Tempgrails_appsdemo>grails create-domain-class User Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_appsdemo Environment set to production Running script D:DMY_DEVgrailsscriptsCreateDomainClass.groovy [copy] Copying 1 file to D:Tempgrails_appsdemograils-appdomain Created at D:Tempgrails_appsdemo/grails-app/domain/User.groovy [copy] Copying 1 file to D:Tempgrails_appsdemograils-tests Created Tests at D:Tempgrails_appsdemo/grails-tests/UserTests.groovy D:Tempgrails_appsdemo> |
2,進入D:Tempgrails_appsdemograils-appdomain(這個目錄中存放著所有的domain class),打開User.groovy,修改為如下內容:
class User { String name String password String toString() { " $name : $password " } static constraints = { name(blank: false ) password(blank: false , size: 6 .. 16 ) } |
3,在“命令行”中輸入“grails generate-all User”,為User產生所有CRUD操作需要的代碼(如控制器UserController.groovy)和頁面(如list.gsp),輸出結果如下所示:
D:Tempgrails_appsdemo>grails generate-all User Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_appsdemo Environment set to production Running script D:DMY_DEVgrailsscriptsGenerateAll.groovy Compiling sources [delete] Deleting directory D:Tempgrails_appsdemoweb-appWEB-INFgrails-a pp [mkdir] Created dir: D:Tempgrails_appsdemoweb-appWEB-INFgrails-appvie ws [mkdir] Created dir: D:Tempgrails_appsdemoweb-appWEB-INFgrails-appi18 n [copy] Copying 2 files to D:Tempgrails_appsdemoweb-appWEB-INFgrails-a ppviews [copy] Copied 2 empty directories to 1 empty directory under D:Tempgrails _appsdemoweb-appWEB-INFgrails-appviews [native2ascii] Converting 1 file from D:Tempgrails_appsdemograils-appi18n t o D:Tempgrails_appsdemoweb-appWEB-INFgrails-appi18n Attempting to load [13] core plugins Grails plug-in [i18n] with version [0.4.2] loaded successfully Grails plug-in [quartz] with version [0.4.2] loaded successfully Grails plug-in [core] with version [0.4.2] loaded successfully Grails plug-in [domainClass] with version [0.4.2] loaded successfully Grails plug-in [controllers] with version [0.4.2] loaded successfully Attempting to load [0] user defined plugins Grails plug-in [dataSource] with version [0.4.2] loaded successfully Grails plug-in [codecs] with version [0.4.2] loaded successfully Grails plug-in [hibernate] with version [0.4.2] loaded successfully Grails plug-in [services] with version [0.4.2] loaded successfully Grails plug-in [scaffolding] with version [0.4.2] loaded successfully Generating views for domain class [User] Generating list view for domain class [User] list view generated at D:Tempgrails_appsdemo.grails-appviewsuserlist.gsp Generating show view for domain class [User] Show view generated at D:Tempgrails_appsdemo.grails-appviewsusershow.gsp Generating edit view for domain class [User] Edit view generated at D:Tempgrails_appsdemo.grails-appviewsuseredit.gsp Generating create view for domain class [User] Create view generated at D:Tempgrails_appsdemo.grails-appviewsusercreate .gsp Generating controller for domain class [User] Controller generated at .grails-appcontrollersUserController.groovy D:Tempgrails_appsdemo> |
4,在“命令行”中,輸入“grails create-controller Login”,創建登陸(login)的控制器LoginController,它對應MVC中的Controller,讓它負責登陸相關業務,輸出如下:
D:Tempgrails_appsdemo>grails create-controller Login Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_appsdemo Environment set to production Running script D:DMY_DEVgrailsscriptsCreateController.groovy [mkdir] Created dir: D:Tempgrails_appsdemograils-appviewslogin [copy] Copying 1 file to D:Tempgrails_appsdemograils-appcontrollers Created Controller at D:Tempgrails_appsdemo/grails-app/controllers/LoginContr oller.groovy [copy] Copying 1 file to D:Tempgrails_appsdemograils-tests Created ControllerTests at D:Tempgrails_appsdemo/grails-tests/LoginController Tests.groovy D:Tempgrails_appsdemo> |
5,修改demograils-appcontrollersLoginController.groovy的內容為:
class LoginController { def loginService def index = { } def login = { User u = new User() u.properties = params if (params.name && params.password) { def user = loginService.check(u) if (user) { flash.message = "Welcome $" render(view: "ok", model: [user: user]) } else { flash.error = "Invalid $ with $" render(view: "login", model: [user: u]) } } else { render(view: "login", model: [user: u]) } } } |
大家或許也看到了LoginService這個類,我將在后面演示創建它,這個LoginService類封裝了所有登陸相關的業務邏輯,Grails自動將其注入到LoginController中。
6,在“命令行”中,輸入“grails create-service Login”,創建LoginService.groovy,輸出:
D:Tempgrails_appsdemo>grails create-service Login Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_appsdemo Environment set to production Running script D:DMY_DEVgrailsscriptsCreateService.groovy [copy] Copying 1 file to D:Tempgrails_appsdemograils-appservices Created Service at D:Tempgrails_appsdemo/grails-app/services/LoginService.gro ovy [copy] Copying 1 file to D:Tempgrails_appsdemograils-tests Created ServiceTests at D:Tempgrails_appsdemo/grails-tests/LoginServiceTests. groovy D:Tempgrails_appsdemo> |
7,修改demograils-appservicesLoginService.groovy的內容為:
class LoginService { boolean transactional = true def check(User u) { def user = User.findWhere(name: u.name, password: u.password) return user } def serviceMethod() { // TODO } } |
ok.gsp:
9,修改demograils-appconfApplicationBootStrap.groovy,將一個User實例保存到數據庫(grails自帶hsqldb和jetty)中,內容如下:
class ApplicationBootStrap { def init = { servletContext -> new User(name: "demo", password: "123456").save() } def destroy = { } } |
10,在“命令行”中,輸入“grails run-app”,運行我們的Web應用,輸出如下:
D:Tempgrails_appsdemo>grails run-app Welcome to Grails 0.4.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: D:DMY_DEVgrails Base Directory: D:Tempgrails_appsdemo Environment set to development Running script D:DMY_DEVgrailsscriptsRunApp.groovy Compiling sources [delete] Deleting directory D:Tempgrails_appsdemoweb-appWEB-INFgrails-a pp [mkdir] Created dir: D:Tempgrails_appsdemoweb-appWEB-INFgrails-appvie ws [mkdir] Created dir: D:Tempgrails_appsdemoweb-appWEB-INFgrails-appi18 n [copy] Copying 8 files to D:Tempgrails_appsdemoweb-appWEB-INFgrails-a ppviews [native2ascii] Converting 1 file from D:Tempgrails_appsdemograils-appi18n t o D:Tempgrails_appsdemoweb-appWEB-INFgrails-appi18n Attempting to load [13] core plugins Grails plug-in [i18n] with version [0.4.2] loaded successfully Grails plug-in [quartz] with version [0.4.2] loaded successfully Grails plug-in [core] with version [0.4.2] loaded successfully Grails plug-in [domainClass] with version [0.4.2] loaded successfully Grails plug-in [controllers] with version [0.4.2] loaded successfully Attempting to load [0] user defined plugins Grails plug-in [dataSource] with version [0.4.2] loaded successfully Grails plug-in [codecs] with version [0.4.2] loaded successfully Grails plug-in [hibernate] with version [0.4.2] loaded successfully Grails plug-in [services] with version [0.4.2] loaded successfully Grails plug-in [scaffolding] with version [0.4.2] loaded successfully [RuntimeConfiguration] Configuring for environment: Development Building new Hibernate SessionFactory Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping 64 beans defined in application context [org.codehaus.groovy.grails.commons.spri ng.GrailsWebApplicationContext;hashCode=6971605] Using MessageSource [org.springframework.context.support.ReloadableResourceBundl eMessageSource: basenames=[WEB-INF/grails-app/i18n/messages]] Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticas ter': using default [org.springframework.context.event.SimpleApplicationEventMul ticaster@181d405] [copy] Copying 8 files to D:Tempgrails_appsdemoweb-appWEB-INFgrails-a ppviews [GrailsContextLoader] Grails application loaded. Initializing filter 'grailsWebRequest' Filter 'grailsWebRequest' configured successfully Initializing filter 'reloadFilter' Filter 'reloadFilter' configured successfully Initializing servlet 'grails' FrameworkServlet 'grails': initialization started Using context class [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicat ionContext] for servlet 'grails' Using MultipartResolver [org.springframework.web.multipart.commons.CommonsMultip artResolver@1945696] Using LocaleResolver [org.springframework.web.servlet.i18n.CookieLocaleResolver@ 1c0bec5] Unable to locate ThemeResolver with name 'themeResolver': using default [org.spr ingframework.web.servlet.theme.FixedThemeResolver@1984161] No HandlerAdapters found in servlet 'grails': using default Unable to locate RequestToViewNameTranslator with name 'viewNameTranslator': usi ng default [org.springframework.web.servlet.view.DefaultRequestToViewNameTransla tor@688d6f] FrameworkServlet 'grails': initialization completed in 187 ms Servlet 'grails' configured successfully |
11,打開瀏覽器,輸入:http://localhost:8080/demo/login/login ,在Name處輸入demo,Password處輸入123456,點擊‘Login’,跳轉到成功頁面:
Welcome demo demo : 123456 |