Grails框架之GSP标签

gsp

GSP存在于Grails的grails-app/views目录中,他们通常会自动渲染(通过规约),或者像这样通过render方法:

render(view:"index")

一个GPS通常拥有一个"model",它是变量集被用于视图渲染。通过一个控制器model被传递到GSP视图。例如,考虑下列控制器的操作:

def show = {
    [book: Book.get(params.id)]
}

这个操作将查找一个Book 实体,并创建一个包含关键字为book的model,这个关键字可在随后的GSP视图中应用

<%=book.title%>

<g:findAll in="${books}" expr="it.author == 'Stephen King'">
     <p>Title: ${it.title}</p>
</g:findAll>
  • 使用gsp简单语法
<g:example attr="${new Date()}" attr2="[one:'one', two:'two']">
   Hello world
</g:example>

变量和作用域作用域

变量可以在GSP中使用set标签来定义:

<g:set var="now" value="${new Date()}" />

<g:set var="myHTML">
   Some re-usable code on: ${new Date()}
</g:set>

变量同样可以被放置于下列的范围内:

  • page - 当前页面范围 (默认)
  • request - 当前请求范围
  • flash - flash作用域,因此它可以在下一次请求中有效
  • session - 用户session范围
  • application - 全局范围.
<g:set var="now" value="${new Date()}" scope="request" />

逻辑和迭代

  • GSP同样支持迭代逻辑标签,逻辑上通过使用if, else 和 elseif来支持典型的分支情形。
<g:if test="${session.role == 'admin'}">
   <%-- show administrative functions --%>
</g:if>
<g:else>
   <%-- show basic functions --%>
</g:else>
  • GSP用each和while 标签来处理迭代:
<g:each in="${[1,2,3]}" var="num">
   <p>Number ${num}</p>
</g:each>
<g:set var="num" value="${1}" />
<g:while test="${num < 5 }">
    <p>Number ${num++}</p>
</g:while>

搜索和过滤

  • 假如你拥有对象集合,你经常需要使用一些方法来排序和过滤他们。GSP支持findAll 和 grep来做这些工作。
<g:findAll in="${books}" expr="it.author == 'Stephen King'">
     <p>Title: ${it.title}</p>
</g:findAll>
  • expr属性包含了一个Groovy表达式,它可以被当作一个过滤器来使用。谈到过滤器,grep标签通过类来完成与过滤器类似的工作:
<g:grep in="${books}" filter="NonFictionBooks.class">
     <p>Title: ${it.title}</p>
</g:grep>
  • 或者使用一个正则表达式:
<g:grep in="${books.title}" filter="~/.*?Groovy.*?/">
     <p>Title: ${it}</p>
</g:grep>

链接和资源

GSP还拥有特有的标签来帮助你管理连接到控制器和操作.link标签允许你指定控制器和操作配对的名字,并基于URL映射来自动完成连接。即使你去改变!一些 link的示例如下:

<g:link action="show" id="1">Book 1</g:link>
<g:link action="show" id="${currentBook.id}">${currentBook.name}</g:link>
<g:link controller="book">Book Home</g:link>
<g:link controller="book" action="list">Book List</g:link>
<g:link url="[action:'list',controller:'book']">Book List</g:link>
<g:link action="list" params="[sort:'title',order:'asc',author:currentBook.author]">
     Book List
</g:link
  • createLinkTo的用法
g:createLinkTo dir="css" file="main.css" /> == /shop/css/main.css
<g:createLinkTo dir="css" file="main.css" absolute="true"/> == http://portal.mygreatsite.com/css/main.css
<g:createLinkTo dir="css" file="main.css" base="http://admin.mygreatsite.com"/> == http://admin.mygreatsite.com/css/main.css
<link type="text/css" href="${createLinkTo(dir:'css',file:'main.css')}" />

表单和字段

表单基础

  • GSP支持许多不同标签来帮助处理HTML表单和字段,最基础的是form标签,form标签是一个控制器/操作所理解的正规的HTML表单标签版本。 url属性允许你指定映射到哪个控制器和操作:
<g:form name="myForm" url="[controller:'book',action:'list']">...</g:form>

我们创建个名为myForm的表单,它被提交到BookController的list操作。除此之外,适用于所有不同的HTML属性。

表单字段
同构造简单的表单一样,GSP支持如下不同字段类型的定制:

  • textField - 'text'类型输入字段
  • checkBox - 'checkbox'类型输入字段
  • radio - 'radio'类型输入字段
  • hiddenField - 'hidden'类型输入字段
  • select - 处理 HTML 选择框
    上面的每一个都允许GSP表达式作为值:
<g:textField name="myField" value="${myValue}" />

GSP同样包含上面标签的扩张助手版本,比如radioGroup (创建一组radio 标签), localeSelect, currencySelect 和timeZoneSelect (选择各自的地区区域, 货币 和时间区域).

多样的提交按钮

  • 处理多样的提交按钮这样由来已久的问题,同样可以通过Grails的actionSubmit标签优雅的处理。它就像一个正规提交,但是,允许你指定一个可选的操作来提交。
<g:actionSubmit value="Some update label" action="update" />
<g:actionSubmit value="Update" />
<!--'Update' is action, label is 'Some update label'-->
<g:actionSubmit value="Some update label" action="Update" /> 
<!--label derived from message bundle-->
<g:actionSubmit value="${message(code:'label.update')}" action="Update" /> 
<g:actionSubmit value="Delete" />
<g:actionSubmit value="DeleteAll" onclick="return confirm('Are you sure???')" />

视图和模板

和视图一样,Grails有模板的概念。模板有利于分隔出你的视图在可维护的块中,并与Layouts结合提供一个高度可重用机制来构建视图

模板基础
Grails使用在一个视图名字前放置一个下划线来标识为一个模板的规约。例如,你可能有个位于grails-app/views/book/_bookTemplate.gsp的模板处理渲染Books :

<div class="book" id="${book?.id}">
   <div>Title: ${book?.title}</div>
   <div>Author: ${book?.author?.name}</div>
</div>

为了渲染来自grails-app/views/book 视图中的一个模板,你可以使用render标签:

<g:render template="bookTemplate" model="[book:myBook]" />

注意,我们是怎么样使用render标签的model属性来使用传入的一个model(就是对应domain)。假如,你有多个Book实体,你同样可以使用render标签为每个Book渲染模板

<g:render template="bookTemplate" var="book" collection="${bookList}" />

共享模板

在早先的示例中,我们有一个特定于BookController模板,它的视图位于 grails-app/views/book。然而,你可能想横跨你的应用来共享模板。

  • 既然这样,你可以把他们放置于grails-app/views视图根目录或者位于这个位置的任何子目录,然后在模板属性在模板名字之前使用一个 /来指明相对模板路径
<g:render template="/shared/mySharedTemplate" />
  • 你也可以使用这个技术从任何视图或控制器(Controllers)来引用任何目录下的模板:
<g:render template="/book/bookTemplate" model="[book:myBook]" />

在控制器和标签库中的模板

你同样可以使用控制器render方法渲染模板控制器中,它对Ajax引用很有用。

def show = {
    de b = Book.get(params.id)
    render(template:"bookTemplate", model:[book:b])
}

在控制器中的render方法最普通的行为是直接写入响应。假如,你需要获得模板作为一个String的结果作为替代,你可以使用render标签:

def show = {
    de b = Book.get(params.id)
    String content = g.render(template:"bookTemplate", model:[book:b])
    render content
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容