在學(xué)習(xí)任何東西之前,最重要的是培養(yǎng)興趣,Groovy世界最耀眼的技術(shù)之一--Grails相信大家早已耳聞,我將通過(guò)Grails實(shí)戰(zhàn)系列文章向您展現(xiàn)Grails的迷人風(fēng)采,使您感受到Grails的魅力,以至瘋狂地愛(ài)上Grails,并墜入Groovy的愛(ài)河。學(xué)Groovy,Grails與學(xué)Java一樣,在實(shí)戰(zhàn)之前需要搭建開發(fā)環(huán)境,您可以在 Groovy輕松入門--搭建Groovy開發(fā)環(huán)境 學(xué)習(xí)到如何搭建Groovy環(huán)境,之后我會(huì)講一下如何搭建Grails環(huán)境,然后手把手地寫個(gè)Demo程序告終,我還會(huì)抽空寫篇“Groovy輕松入門--Grails實(shí)戰(zhàn)之進(jìn)階篇”
一,搭建Grails環(huán)境
0,下載Grails( http://dist.codehaus.org/grails/grails-bin-0.4.2.zip ,請(qǐng)留意朝花夕拾——Groovy & Grails中的“最新版本”提示)并解壓到自己指定位置(我的位置是D:DMY_DEVgrails)
1,設(shè)置環(huán)境變量GRAILS_HOME(注意大寫),過(guò)程與“設(shè)置環(huán)境變量GROOVY_HOME”相似。
2,將%GRAILS_HOME%bin添加到環(huán)境變量path中,過(guò)程與“將GROOVY_HOME目錄下的bin追加到環(huán)境變量path中”相似。
(如果只想進(jìn)行Grails開發(fā),可以不設(shè)GROOVY_HOME)
二,創(chuàng)建Grails Demo程序
0,打開“命令行”,選擇當(dāng)前目錄(我的為D:Tempgrails_apps),在黑底白字的窗口中輸入“grails create-app demo”,不包括雙引號(hào)“”,在您的屏幕中可以看到類似下面的輸出結(jié)果:
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>
|
通過(guò)“grails create-app”這個(gè)命令,Grails自動(dòng)幫我們創(chuàng)建了開發(fā)所需的工程環(huán)境。其實(shí)您現(xiàn)在就已經(jīng)擁有了一個(gè)可運(yùn)行的Web應(yīng)用程序,然后進(jìn)入demo目錄(“cd demo”),輸入“grails run-app”,回車,啟動(dòng)這個(gè)‘五臟俱全’的程序雛形,打開瀏覽器,輸入 http://localhost:8080/demo ,回車,看到了吧 :) 讓我們繼續(xù)吧,請(qǐng)停止這個(gè)程序(Ctrl + C)
1,進(jìn)入demo目錄,在“命令行”中輸入“cd demo”,回車,然后再輸入“grails create-domain-class User”創(chuàng)建domain class即類似于pojo的pogo,它對(duì)應(yīng)MVC中的Model,不過(guò)由Grails自動(dòng)創(chuàng)建的pogo是空的,需要自己添加屬性,約束(constraints)等。輸出結(jié)果如下所示:
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,進(jìn)入D:Tempgrails_appsdemograils-appdomain(這個(gè)目錄中存放著所有的domain class),打開User.groovy,修改為如下內(nèi)容:
class User {
String name
String password
String toString() {
" $name : $password "
}
static constraints = {
name(blank: false )
password(blank: false , size: 6 .. 16 )
}
|
contraints這個(gè)類變量是定義一些約束的,比如name不能為空白,password不能為空白而且長(zhǎng)度在6到16之間(包括6和16)
3,在“命令行”中輸入“grails generate-all User”,為User產(chǎn)生所有CRUD操作需要的代碼(如控制器UserController.groovy)和頁(yè)面(如list.gsp),輸出結(jié)果如下所示:
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”,創(chuàng)建登陸(login)的控制器LoginController,它對(duì)應(yīng)MVC中的Controller,讓它負(fù)責(zé)登陸相關(guān)業(yè)務(wù),輸出如下:
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的內(nèi)容為:
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這個(gè)類,我將在后面演示創(chuàng)建它,這個(gè)LoginService類封裝了所有登陸相關(guān)的業(yè)務(wù)邏輯,Grails自動(dòng)將其注入到LoginController中。
6,在“命令行”中,輸入“grails create-service Login”,創(chuàng)建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的內(nèi)容為:
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,將一個(gè)User實(shí)例保存到數(shù)據(jù)庫(kù)(grails自帶hsqldb和jetty)中,內(nèi)容如下:
class ApplicationBootStrap {
def init = { servletContext ->
new User(name: "demo", password: "123456").save()
}
def destroy = {
}
}
|
10,在“命令行”中,輸入“grails run-app”,運(yùn)行我們的Web應(yīng)用,輸出如下:
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,點(diǎn)擊‘Login’,跳轉(zhuǎn)到成功頁(yè)面:
Welcome demo
demo : 123456
|
查看本文來(lái)源